使用python/sympy求矩阵的二次形式

问题描述 投票:0回答:1

我想求 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
python sympy linear-algebra
1个回答
0
投票

听起来你正在寻找矩阵的对角化:

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
中的特征向量不是单位特征向量。从计算角度来看,它们最好不要是单位向量,这样所有的数字都是有理数(因为该矩阵具有有理特征值)。

© www.soinside.com 2019 - 2024. All rights reserved.