尝试使用 scipy 的 linalg.eig 来解决广义特征值问题。然后我检查我得到的解决方案,它似乎没有返回正确的特征向量。此外,文档表明返回的向量已归一化,但事实并非如此(尽管这并没有那么困扰我)。
这里是示例矩阵:
>>> a
array([[ 2.05630374e-01, 8.89584493e-10, -1.46171715e-06],
[ 8.89584493e-10, 2.38374743e-02, 9.43440334e-06],
[ -1.46171715e-06, 9.43440334e-06, 1.39685787e-02]])
>>> b
array([[ 0.22501692, -0.07509864, -0.05774453],
[-0.07509864, 0.02569336, 0.01976284],
[-0.05774453, 0.01976284, 0.01524993]])
运行 eig 我得到:
>>> w,v = linalg.eig(a,b)
>>> w
array([ 3.08431414e-01+0.j, 5.31170281e+01+0.j, 6.06298605e+02+0.j])
>>> v
array([[-0.26014092, -0.46277857, -0.0224057 ],
[ 0.76112351, -0.59384527, -0.83594841],
[ 1. , -1. , 1. ]])
然后测试结果:
>>> a*v[:,0]
array([[ -5.34928750e-02, 6.77083674e-10, -1.46171715e-06],
[ -2.31417329e-10, 1.81432622e-02, 9.43440334e-06],
[ 3.80252446e-07, 7.18074620e-06, 1.39685787e-02]])
>>> w[0]*b*v[:,0]
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j],
[ 0.00602559-0.j, 0.00603163+0.j, 0.00609548+0.j],
[ 0.00463317-0.j, 0.00463941+0.j, 0.00470356+0.j]])
我认为这两个将是相等的,但它们不是......我也尝试使用 eigh 代替但没有成功。非常感谢任何帮助,我显然遗漏了一些东西。
最佳答案
您可以通过查看输出的形状来了解发生了什么。你的 a*v[:,0]
应该给出一个向量,那么你为什么要得到一个 3x3 数组?答案:因为您没有进行矩阵乘法,所以您进行的是分量数组乘法。
哇,你做到了
>>> a * v[:,0]
array([[ -5.34928759e-02, 6.77083679e-10, -1.46171715e-06],
[ -2.31417334e-10, 1.81432623e-02, 9.43440334e-06],
[ 3.80252453e-07, 7.18074626e-06, 1.39685787e-02]])
>>> w[0] * b * v[:,0]
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j],
[ 0.00602559-0.j, 0.00603163+0.j, 0.00609548+0.j],
[ 0.00463317-0.j, 0.00463941+0.j, 0.00470356+0.j]])
当你真正想要的时候
>>> a.dot(v[:,0])
array([-0.05349434, 0.0181527 , 0.01397614])
>>> w[0] * b.dot(v[:,0])
array([-0.05349434+0.j, 0.01815270+0.j, 0.01397614+0.j])
或
>>> matrix(a)*matrix(v[:,0]).T
matrix([[-0.05349434],
[ 0.0181527 ],
[ 0.01397614]])
>>> w[0]*matrix(b)*matrix(v[:,0]).T
matrix([[-0.05349434+0.j],
[ 0.01815270+0.j],
[ 0.01397614+0.j]])
关于广义特征值的 Python eig 不返回正确的特征向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11779633/