Numpy特征系统求解器返回不正确的矩阵

eqzww0vc  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

我一直试图使用numpy.linalg.eigh的输出作为旋转矩阵,但它返回的特征向量形成的矩阵是不合适的;也就是说,它不是一个纯粹的旋转,而是一个旋转和反射的组合。你可以看到如下。

GG = np.array([[2.0, 0.146, 0.0064],
               [0.146, -1.0, 0.0003],
               [0.0064, 0.0003, -1.0]])
vals,vecs = np.linalg.eigh(GG)
np.linalg.det(vecs)

这将返回-0.9999999999。纯旋转将返回1.0。
我是不是错过了这个求解器的工作方式?如何让eigh或其他函数返回正确的旋转矩阵?也许这个矩阵是无痕的这一事实导致了问题?

fcwjkofz

fcwjkofz1#

考虑一个方阵A,假设v是一个特征向量,e是相应的特征值,即

A*v = e*v

现在考虑一下,如果我们用标量s来缩放v会发生什么,让我们设置w = v*s

A*w = A*(v*s) = (A*v)*s = (e*v) = e*(v*s) = e*w

原来w也是特征值e的特征向量!实际上,特征向量只定义为标量的倍数,所以惯例是我们将它们归一化为长度1。所以如果你用-1缩放一个特征向量,你仍然有一个有效的特征系统,这次是行列式+0.999...9
为什么是0.999...9而不是1?我们使用floating point arithmetic,这是不准确的。如果你正在尝试解决数值问题,我建议你熟悉浮点数,它们的问题和限制以及最佳实践。
显然

相关问题