Mathematica矩阵对角化

时间:2012-01-14 00:52:49

标签: math wolfram-mathematica

我正在考虑矩阵A,使A = PDP ^ -1。

我使用Mathematica解决这个问题的方法是:

a={{0, -1}, {-1, 0}}
d = DiagonalMatrix[Eigenvalues[a]]
{{-1,0}, {0,1}}
p = Transpose[Eigenvectors[a]]

p.d.Inverse[p]
{{0, -1}, {-1, 0}}

哪个是正确的。

问题是,P矩阵不是我预期的那样。 Mathematica生成的矩阵是

p={{1, -1}, {1, 1}}

但我正在寻找

p2={{1/Sqrt[2], 1/Sqrt[2]}, {1/Sqrt[2], -(1/Sqrt[2])}}
p2.d.Inverse[p2]
{{0,-1}, {-1,0}}

这也解决了这个问题。有没有办法迫使Mathematica在执行Transpose [Eigenvectors [a]]时向我显示不同的答案?

4 个答案:

答案 0 :(得分:9)

您需要做的是规范化您得到的答案。有一个名为Normalize的函数,可以像这样使用:

Normalize /@ {{1, -1}, {1, 1}}

Mathematica graphics

答案 1 :(得分:5)

您可以规范化您的特征向量:

a = {{0, -1}, {-1, 0}};
d = DiagonalMatrix[Eigenvalues[a]];
p = Transpose[Normalize /@ Eigenvectors[a]];

所以p就是你想要的:

{{1/Sqrt[2], -(1/Sqrt[2])}, {1/Sqrt[2], 1/Sqrt[2]}}

答案 2 :(得分:3)

特征向量可以通过常量自由重新缩放,这意味着有无数个可能的特征向量。当然,Mathematica不能也不会向您展示所有这些内容。所以你需要以某种方式规范化特征向量。

一种选择是使用N将矩阵转换为数字形式。 Mathematica返回数值矩阵的归一化特征向量。

p2 = Transpose[Eigenvectors[N[a]]]

这是有风险的,因为由于各种数值误差,计算数值矩阵的逆矩阵通常会失败。

另一个更好的选择是使用Normalize手动标准化特征向量。您必须将它应用于Eigenvectors函数返回的列表中的每个特征向量:

p2 = Transpose[Normalize/@Eigenvectors[a]]

答案 3 :(得分:1)

也许你应该考虑一个内置的矩阵分解工具?当然,有许多矩阵因子分解,其中许多是内置于Mathematica。最可能与您的情况最相符的是JordanDecomposition。这是在行动

SeedRandom[1];
a = RandomReal[{-2, 2}, {4, 4}];
{s, j} = JordanDecomposition[a];
Column[MatrixForm /@ {s, j}]

enter image description here

Chop[s.j.Inverse[s] - a]

enter image description here

当然,很多矩阵都不是可对角化的,但如果是,那么Jordan分解会给你你想要的东西。向量的归一化方式与Eigen函数规范化它们的方式相同,但我不明白为什么这是一个问题。