2012-11-28 52 views
4

我有一堆未知常數的矩陣,如下面的一個:當矩陣的所有條目都是變量時,如何計算出matlab中矩陣的特徵值?

a*b  -c  -d  0 
    -c  e  -a -b-d 
    -d  -a  d -e 
    0  -b-d -e  a 

正如你可能知道它是關於對角線因此,對角線值都是正對稱。所有常數大於0.

我想解決這個問題在MATLAB中的特徵值。我會如何去做這件事?我不知道數值a,b,c,d和e。我想這樣做:

d = eig(@getMatrix) 

但eig函數不接受函數句柄。

+1

我認爲你需要這個符號數學工具箱。如果你有它,那麼'eig'函數可以很好地用符號矩陣作爲輸入。見文檔[here](http://www.mathworks.com.au/help/symbolic/eig.html) –

+1

是的,這是一個象徵性的問題,MATLAB是一個數值工具。你需要的是一個計算機代數系統。 – user57368

+1

您應該在Maxima等計算機代數系統中執行此操作。 Matlab不是符號操作的最佳工具。 – carandraug

回答

3

在MATLAB中沒有問題。

>> syms a b c d e 
>> M = [a*b  -c  -d  0 
    -c  e  -a -b-d 
    -d  -a  d -e 
    0  -b-d -e  a]; 

>> eig(M) 
ans = 
a/4 + d/4 + e/4 + (a*b)/4 - ((51*a*d^3)/16 - (117*a^4*b)/16 + (27*a^3*d)/16 + (27*a*e^3)/16 + (57*b*d^3)/2 + (27*a^3*e)/16 + (27*d*e^3)/16 + (51*d^3*e)/16 + 6*((4*(2*b*d - (a*e)/4 - (a*d)/4 - (d*e)/4 - (a^2*b)/4 + (11*a^2)/8 + b^2 + c^2 + (19*d^2)/8 + (11*e^2)/8 + (3*a^2*b^2)/8 - (a*b*d)/4 - (a*b*e)/4)*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + 
... 

(a*b*c^2*e)/8 + (3*a*b*d*e^2)/64 + (11*a*b*d^2*e)/64 + (a*b^2*d*e)/4 - (33*a^2*b*d*e)/32 - (5*a^2*b^2*d*e)/64 + (a*b*d*e)/4 + (a*c*d*e)/2 - 2*b*c*d*e) - 256*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + (15*d^2*e^2)/1... 

Output truncated. Text exceeds maximum line length of 25,000 characters for Command Window display. 

我在那裏刪除了很多。無可否認,它相當混亂和冗長,但你真的可以期待更好嗎?

編輯:我應該評論說,這樣一個很長的擴展公式在計算精度方面可能是危險的。我已經看到人們一味地使用這樣一個表達式,在Fortran或MATLAB中對其進行評估。他們認爲,因爲它是「符號的」,它也是確切的。數值計算完成後,這是完全錯誤的。

在這些條件下,很可能會有巨大的消減性消除,由於浮點計算的動態範圍有限,巨大的正數和負數幾乎相互抵消,留下的微小結果基本上毫無價值。謹防。至少,比較使用相同表達式完成的單精度和雙精度計算。如果它們差異很大,請嘗試擴展精度版本以確認雙打沒有問題。如果你還沒有測試過這樣一個表達式並進行了廣泛的驗證,不要相信它。