我有刚度矩阵和质量矩阵。我想计算我的结构振动形状和周期(特征值/矢量),所以我为此使用了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
答案 0 :(得分:6)
MATLAB不是Python,因此它们对算法的实现会有所不同。由于MATLAB的版本是封闭源代码,因此除了The MathWorks的员工外,无法确切地说出具体做法。
此外,这两个向量非常接近,以至于它们属于机器精度范围。 (差异大约为4e-24
,而MATLAB的eps
为1e-16
)。因此,出于所有实际目的,这两个矩阵可以被认为是相等的。如果需要更高的精度,则很可能需要某种符号或vpa()
求解器。
NumPy np.linalg.eig()
文档的最后一个示例是:
请注意舍入错误!
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.]])