NumPy和MATLAB之间特征向量存在微小差异

3
我有刚度矩阵和质量矩阵。我想要计算结构的振动形态和周期(特征值/向量),所以我正在使用NumPy。特征值与MATLAB给出的相同,但是当我将特征向量与MATLAB给出的进行比较时,我发现存在一些小的差异(小于1E-10)。
为什么会这样,我应该如何让这两个结果相等?
我尝试增加NumPy的精度,但没有成功。
import numpy as np

#S Stiffness Matrix
#M Mass Matrix

w, f = np.linalg.eig(np.linalg.inv(M)@S)

这是我的结果

从NumPy得到的第一个特征向量:

0.0
0.0
0.0
0.631781280460724
-1.4298382510485397e-09
-8.755329688057342e-26
0.7392387400169079
7.709528714838357e-10
1.3560471632542145e-24 # Different sign here
0.23319197867341496
1.88087901696399e-09
-4.7286506166123194e-17 # Different sign here

来自MATLAB的第一个特征向量:

0
0
0
6.317812804607240e-01
-1.429838251048596e-09
-8.755233867348009e-26
7.392387400169076e-01
7.709528714837307e-10
-2.624482888541565e-24 % Different sign here
2.331919786734153e-01
1.880879016947830e-09
8.178753965460107e-17 % Different sign here

你确定有问题吗? - visibleman
是的,你说得对,它们太接近了,但它们的符号不同 :/ - Onur Altay
相关问题:https://dev59.com/i5Tfa4cB1Zd3GeqPMSB-,https://dev59.com/Z3fZa4cB1Zd3GeqPMQF2,https://dev59.com/UmbWa4cB1Zd3GeqPYp84,https://stackoverflow.com/questions/51465229/eigenvalue-and-eigenvectors-in-python-vs-matlab - Cris Luengo
1个回答

7

MATLAB与Python不同,因此它们实现算法的方式也不同。MATLAB版本是封闭源代码,除The MathWorks公司的员工外,其他人无法确定其具体实现方法。

此外,这两个向量非常接近,它们在机器精度范围内(差别约为4e-24,而MATLAB的eps值为1e-16)。因此,在实际应用中,这两个矩阵可以被认为是相等的。如果需要更高的精度,则很可能需要一些符号或vpa()求解器。

NumPy np.linalg.eig()文档的最后一个示例为:

Be careful about round-off error!

a = np.array([[1 + 1e-9, 0], [0, 1 - 1e-9]])
# Theor. e-values are 1 +/- 1e-9
w, v = LA.eig(a)
w; v
array([ 1.,  1.])
array([[ 1.,  0.],
      [ 0.,  1.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接