Mathematica矩阵对角化

问题描述:

我正在考虑矩阵A,使得A = PDP^-1。Mathematica矩阵对角化

我解决这个使用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矩阵不是我所期望的那样。该数学产生的矩阵是

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]]时向我展示不同的答案?

你需要做的是规范你得到的答案。有一个叫Normalize功能,它可以这样使用:

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

Mathematica graphics

+0

太棒了!我仍然在学习如何使用Mathematica,有时我无法通过在谷歌搜索上找到我的问题的答案。非常感谢你! – CHM 2012-01-14 01:09:29

你可以正常化的特征向量:

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

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

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

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

这是有风险的,但是,因为计算数字矩阵可以经常失败壮观的逆由于各种数值误差。

另一种更好的选择是使用Normalize手动标准化特征向量。你必须把它应用到每一个特征向量由Eigenvectors函数返回的列表:

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

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

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

enter image description here

enter image description here

当然,许多矩阵不是对角化,但是,如果是,那么乔丹分解会给你想要的东西。向量被归一化,就像Eigen函数对它们进行归一化一样,但我不明白为什么这是一个问题。

+0

谢谢。我想要归一化的矢量,因为我正在模拟化学现象,归一化的矢量是我手工解决问题时得到的。 – CHM 2012-01-14 04:33:33