Mathematica矩阵对角化

4

我正在考虑一个矩阵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个回答

10
你需要做的是规范化你得到的答案。有一个名为Normalize的函数,可以这样使用:
Normalize /@ {{1, -1}, {1, 1}}

Mathematica graphics


太好了!我还在学习如何使用Mathematica,有时候通过谷歌搜索也无法找到我的问题的答案。非常感谢! - CHM

4
您可以将特征向量归一化:

您可以将特征向量归一化:

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]}}

3

特征向量可以自由地通过一个常数进行缩放,这意味着可能存在无限多个可能的特征向量。自然地,Mathematica 不能并且也不会显示所有的特征向量。因此,您需要以某种方式对特征向量进行归一化。

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

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

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

另一种更好的选择是使用Normalize手动规范化特征向量。您将需要对Eigenvectors函数返回的列表中的每个特征向量应用它:

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

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分解将给您想要的结果。向量以与函数相同的方式归一化,但我看不出这是个问题。


谢谢。我想要归一化向量,因为我正在建模化学现象,而归一化向量是手动解决问题时得到的向量。 - CHM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接