比较特征向量,Mathematica 与 Matlab

计算科学 线性代数 matlab 本征系统 特征值 数学
2021-12-03 02:01:32

我正在尝试在 Mathematica 和 Matlab 中创建相同的输出,但是在将特征向量与特征值对齐时遇到了麻烦,我认为 Matlab 做的事情比我预期的稍微复杂一些(排序/排序)。

使用 Mathwork 网站上的示例,对于[V,D] = eig(A). http://www.mathworks.co.uk/help/matlab/ref/eig.html#btifddh-2

TestMatrix = {{1, 2, 3}, {3, 1, 2}, {2, 3, 1}}

[V,D] = eig(A)

V =

-0.5774 + 0.0000i,   0.2887 - 0.5000i,   0.2887 + 0.5000i,

  -0.5774 + 0.0000i,  -0.5774 + 0.0000i,  -0.5774 + 0.0000i,

  -0.5774 + 0.0000i,   0.2887 + 0.5000i,   0.2887 - 0.5000i,


D =

   6.0000 + 0.0000i,   0.0000 + 0.0000i,   0.0000 + 0.0000i,

   0.0000 + 0.0000i,  -1.5000 + 0.8660i,   0.0000 + 0.0000i,

   0.0000 + 0.0000i,   0.0000 + 0.0000i,  -1.5000 - 0.8660i,

但是在 Mathematica 中运行它,我收到以下特征向量

m = N[Eigensystem[TestMatrix]]

DV = DiagonalMatrix[m[[1]]]

Vec=N[Eigenvectors[TestMatrix]]

Vec={

{1., 1., 1.}, 

{-0.5 - 0.866025 I, -0.5 + 0.866025 I, 1.},

 {-0.5 + 0.866025 I, -0.5 - 0.866025 I, 1.}}

这是完全可以接受的,我现在只想将两个向量变成相同的形式。注意对角矩阵匹配,但是我似乎无法重新创建 V。

通过阅读 Matwork 示例,V 是右特征向量。在这种情况下,形式 [V,D] = eig(A) 返回矩阵 V,其列是 A 的右特征向量,使得 A V = V D。 & V 中的特征向量被归一化,使得每个的 2 范数是 1。

试图标准化 Vec,现在在数学中,我无法重新创建在 Matlab 中获得的结果。显然我做错了什么,这是我有点迷失的地方。我已经尝试了 Matlab 中描述的 '2-norm' 函数,以及 Normalize 函数,后者似乎好一点,但与 matlab 示例中的结果相比仍然不正确。

有人可以解释我在哪里出错了,或者只是如何在数学中重新创建相同的结果。

这是我的(......我假设......)不正确的尝试。

首先使用标准化。

TestMatrix = {{1, 2, 3}, {3, 1, 2}, {2, 3, 1}}

vec = N[Eigenvectors[TestMatrix]]

Table[Normalize[vec[[i]]], {i, 1, Length[vec]}]

{{0.57735, 0.57735, 0.57735}, 

{-0.288675 - 0.5 I, -0.288675 + 0.5 I,  0.57735 + 0. I}, 

{-0.288675 + 0.5 I, -0.288675 - 0.5 I,  0.57735 + 0. I}}

这与 Matlab 输出 V 非常接近,除了矩阵似乎已被转置,时间为负数,以及第二个和第三个特征值如何切换(比较特征值和向量列)显然出了点问题,我可能不应该使用 Normalise。
但是,我使用 Norm(p,2) 的尝试与最终结果相去甚远。

我看到另一个涉及该主题但并没有真正帮助的线程。 https://stackoverflow.com/questions/5648975/matlab-vs-mathematica-eigenvectors

有谁能解释一下吗?

1个回答

MATLAB 始终使用 LAPACK 库来计算适用于双精度浮点数的特征向量 - MATLAB 的默认数据类型。Mathematica 的方法取决于其输入类型。例如,当你这样做

TestMatrix = {{1, 2, 3}, {3, 1, 2}, {2, 3, 1}}
Eigenvectors[TestMatrix]

你会得到一个涉及 Sqrt[3] 等的准确答案。Mathematica 使用它的精确算术方法来得到这个,它们与 LAPACK 不同。当你这样做时,N[Eigenvectors[TestMatrix]]你会得到这些精确的结果并将它们近似为浮点数。

现在,如果你使用

TestMatrix = {{1., 2., 3.}, {3., 1., 2.}, {2., 3., 1.}}
Eigenvectors[TestMatrix]

注意每个数字后面的小数点,它告诉 Mathematica 不要将它们解释为精确的整数而是浮点数。由于您要求 Mathematica 计算双精度浮点矩阵的特征向量,因此它使用与 MATLAB 相同的库 - 即 LAPACK。

这就是你得到的——匹配 MATLAB

{{-0.5773502691896255 + 0. I, -0.577350269189626 + 
   0. I, -0.5773502691896258 + 0. I}, {0.5773502691896261 + 
   0. I, -0.28867513459481314 - 
   0.4999999999999996 I, -0.2886751345948132 + 
   0.4999999999999998 I}, {0.5773502691896261 + 
   0. I, -0.28867513459481314 + 
   0.4999999999999996 I, -0.2886751345948132 - 0.4999999999999998 I}}