【问题标题】:Small discrepancy in eigenvectors between NumPy and MATLAB [duplicate]NumPy 和 MATLAB 之间特征向量的微小差异 [重复]
【发布时间】:2019-07-07 01:22:38
【问题描述】:

我有刚度矩阵和质量矩阵。我想计算我的结构振动形状和周期(特征值/向量),所以我为此使用 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

【问题讨论】:

标签: python matlab numpy eigenvalue eigenvector


【解决方案1】:

MATLAB 不是 Python,因此它们的算法实现会有所不同。由于 MATLAB 的版本是封闭源代码,因此无法确切说明具体如何,除了 The MathWorks 的员工。

此外,这两个向量非常接近,以至于它们都在机器精度范围内。 (差异大约是4e-24,MATLAB 的eps1e-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.]])

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2016-05-15
    • 2013-09-02
    • 2011-07-21
    • 2019-09-24
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多