我正在考虑矩阵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]]时向我显示不同的答案?
答案 0 :(得分:9)
答案 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}]
Chop[s.j.Inverse[s] - a]
当然,很多矩阵都不是可对角化的,但如果是,那么Jordan分解会给你你想要的东西。向量的归一化方式与Eigen
函数规范化它们的方式相同,但我不明白为什么这是一个问题。