我想求 A 的二次形式,但是我从 $P^TAP$ 得到的不是二次形式:
A = Matrix([[4,4,0,-3], [4,4,3,0], [0,3,4,4], [-3,0,4,4]])
eigen_data = A.eigenvects()
eigenvectors = [vec.transpose() for val, mult, vecs in eigen_data for vec in vecs]
P = Matrix(eigenvectors).transpose()
这里的列不是单位向量。注意到所有列都有范数 $ rac{5/sqrt{2}}{3}$,我这样做了:
PU = P/5/sqrt(2)*3
但是这不仅仅是对角线条目,所以这是出了问题......:
PU.transpose()*A*PU
听起来你正在寻找矩阵的对角化:
In [22]: A = Matrix([[4,4,0,-3], [4,4,3,0], [0,3,4,4], [-3,0,4,4]])
In [23]: A
Out[23]:
⎡4 4 0 -3⎤
⎢ ⎥
⎢4 4 3 0 ⎥
⎢ ⎥
⎢0 3 4 4 ⎥
⎢ ⎥
⎣-3 0 4 4 ⎦
In [24]: A.diagonalize()
Out[24]:
⎛⎡4 5 4 -5⎤ ⎡-1 0 0 0⎤⎞
⎜⎢ ⎥ ⎢ ⎥⎟
⎜⎢-5 -4 5 -4⎥ ⎢0 -1 0 0⎥⎟
⎜⎢ ⎥, ⎢ ⎥⎟
⎜⎢3 0 3 0 ⎥ ⎢0 0 9 0⎥⎟
⎜⎢ ⎥ ⎢ ⎥⎟
⎝⎣0 3 0 3 ⎦ ⎣0 0 0 9⎦⎠
您可以用它来表达
V*D*V^-1 = A
或 V^-1*A*V = D
:
In [25]: V, D = A.diagonalize()
In [26]: Eq(MatMul(V, D, V.inv()), V*D*V.inv())
Out[26]:
⎡4 5 4 -5⎤ ⎡-1 0 0 0⎤ ⎡ 0 -1/10 1/6 -2/15⎤ ⎡4 4 0 -3⎤
⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎢-5 -4 5 -4⎥ ⎢0 -1 0 0⎥ ⎢1/10 0 -2/15 1/6 ⎥ ⎢4 4 3 0 ⎥
⎢ ⎥⋅⎢ ⎥⋅⎢ ⎥ = ⎢ ⎥
⎢3 0 3 0 ⎥ ⎢0 0 9 0⎥ ⎢ 0 1/10 1/6 2/15 ⎥ ⎢0 3 4 4 ⎥
⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎣0 3 0 3 ⎦ ⎣0 0 0 9⎦ ⎣-1/10 0 2/15 1/6 ⎦ ⎣-3 0 4 4 ⎦
In [27]: V*D*V.inv() == A
Out[27]: True
In [28]: Eq(MatMul(V.inv(), A, V), V.inv()*A*V)
Out[28]:
⎡ 0 -1/10 1/6 -2/15⎤ ⎡4 4 0 -3⎤ ⎡4 5 4 -5⎤ ⎡-1 0 0 0⎤
⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎢1/10 0 -2/15 1/6 ⎥ ⎢4 4 3 0 ⎥ ⎢-5 -4 5 -4⎥ ⎢0 -1 0 0⎥
⎢ ⎥⋅⎢ ⎥⋅⎢ ⎥ = ⎢ ⎥
⎢ 0 1/10 1/6 2/15 ⎥ ⎢0 3 4 4 ⎥ ⎢3 0 3 0 ⎥ ⎢0 0 9 0⎥
⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎣-1/10 0 2/15 1/6 ⎦ ⎣-3 0 4 4 ⎦ ⎣0 3 0 3 ⎦ ⎣0 0 0 9⎦
In [29]: A.eigenvals(multiple=True)
Out[29]: [-1, -1, 9, 9]
我使用逆而不是转置,因为
V
中的特征向量不是单位特征向量。从计算角度来看,它们最好不要是单位向量,这样所有的数字都是有理数(因为该矩阵具有有理特征值)。