2017-04-18 80 views
2

作爲一個實驗,我只想看看Cayley-Hamilton理論和MATLAB inv()函數之間的計算時間。由於矩陣產品的數量,我知道C-H在CPU上會更慢,但是我並沒有期待他們在N增加時給我不同的答案。爲什麼我得到兩個不同的反矩陣對於在N中增加的N * N矩陣?

對於小於30 * 30左右的矩形矩陣,逆矩陣大致相同。但在此之後,他們開始相當不同。到N = 100時,他們根本沒有共同之處。

這是一個數值計算問題,還是有其他事情發生在這裏? 也可以信任哪些東西?我假設inv()是高度優化和信任值得,但它會很高興有其他人的一些意見。

下面是代碼:

n = 100; 
A = randn(n); 

% MATLAB inv() 

tic; 
initime = cputime; 
time1 = clock; 
A_inv = inv(A); 
fintime = cputime; 
elapsed = toc; 
time2 = clock; 
fprintf('TIC TOC: %g\n', elapsed); 
fprintf('CPUTIME: %g\n', fintime - initime); 
fprintf('CLOCK: %g\n', etime(time2, time1)); 

% Cayley-Hamilton inversion 

tic; 
initime = cputime; 
time1 = clock; 
p_coeff = poly(A); 
A_inv_2 = 0; 
for ii = 1:n-1 
    A_inv_2 = A^(ii)*p_coeff(end-1-ii) + A_inv_2; 
end 
A_inv_2 = 1/-p_coeff(end) * (A_inv_2 + eye(n)*p_coeff(end-1));  

fintime = cputime; 
elapsed = toc; 
time2 = clock; 
fprintf('TIC TOC: %g\n', elapsed); 
fprintf('CPUTIME: %g\n', fintime - initime); 
fprintf('CLOCK: %g\n', etime(time2, time1)); 

謝謝你的人誰需要時間來回答。

+0

如果我沒記錯的話,以數字穩定的方式計算特徵多項式是棘手的。所以我懷疑poly()是一個負責任的人。但是,這只是一個猜測。我希望有人比我更有知識能夠回答這個問題。 – Ash

+0

我以數字問題作爲解釋下注。我記得諾布爾和丹尼爾的「應用線性代數」一書堅持認爲你不應該實現你自己的逆過程,因爲它們肯定會遇到數值問題。爲避免這些問題需要進行很多優化,而'inv'無疑具有這些優化。至於你可以信任的:當然是'inv'。在你的例子中比較'imagesc(A * A_inv)'和'imagesc(A * A_inv_2)' –

回答

1

Cayley-Hamilton方法是一種非常不穩定的計算逆方法,因爲它涉及到將矩陣提升到高次方。

考慮一個可以對角化爲A=inv(P)DP的矩陣,其中D是一個對角矩陣。當提升到100次方時,這變成A^100 = inv(P) D^100 P。 D中對角線條目之間的大小差異將被此操作炸燬。例如,考慮2^100和0.5^100之間的差異。

在Matlab程序中很容易看到它。打印出A * A_inv和A * A_inv_2。第一個非常接近身份,而第二個包含廢話:

A*A_inv_2 
ans = 1.0e10 * 
    0.2278 0.3500 -0.2564 ...