2012-01-14 695 views
3

我正在考慮矩陣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]]時向我展示不同的答案?

回答

8

你需要做的是規範你得到的答案。有一個叫Normalize功能,它可以這樣使用:

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

Mathematica graphics

+0

太棒了!我仍然在學習如何使用Mathematica,有時我無法通過在谷歌搜索上找到我的問題的答案。非常感謝你! – CHM 2012-01-14 01:09:29

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

enter image description here

當然,許多矩陣不是對角化,但是,如果是,那麼喬丹分解會給你想要的東西。向量被歸一化,就像Eigen函數對它們進行歸一化一樣,但我不明白爲什麼這是一個問題。

+0

謝謝。我想要歸一化的矢量,因爲我正在模擬化學現象,歸一化的矢量是我手工解決問題時得到的。 – CHM 2012-01-14 04:33:33