2013-11-23 30 views
0

決定真正的代碼:matlab相等檢查出錯。在任意時刻

function[E] = eig_noshift(A) 
A_k = A; 
for(i=0:inf) 
    [Qk,Rk] = qr(A_k); 
    A_k1 = Rk*Qk; 

    diag(A_k1) 
    diag(A_k) 
    isequal(diag(A_k1),diag(A_k)) 
    if(isequal(diag(A_k1),diag(A_k))) 
     break 
    end 
    A_k = A_k1; 
end 

E = diag(A_k); 

我創建計算矩陣」特徵值與QR-算法的MATLAB方法。 (工作),我試圖打破for循環,如果對角下一個矩陣等於當前的對角線(算法收斂)

當執行算法我獲得以下的輸出:

>> eig_noshift(A0) 
Warning: FOR loop index is too large. Truncating to 281474976710655. 
> In eig_noshift at 3 

ans = 

    4.8419 
    1.2591 
    -0.0011 


ans = 

    -22.2000 
    -14.6000 
    42.9000 


ans = 

    0 


ans = 

    4.9434 
    1.0611 
    0.0954 


ans = 

    4.8419 
    1.2591 
    -0.0011 


ans = 

    0 


ans = 

    4.9881 
    1.
    0.0996 


ans = 

    4.9434 
    1.0611 
    0.0954 


ans = 

    0 


ans = 

    4.9976 
    1.0024 
    0.1000 


ans = 

    4.9881 
    1.
    0.0996 


ans = 

    0 


ans = 

    4.9995 
    1.0005 
    0.1000 


ans = 

    4.9976 
    1.0024 
    0.1000 


ans = 

    0 


ans = 

    4.9999 
    1.0001 
    0.1000 


ans = 

    4.9995 
    1.0005 
    0.1000 


ans = 

    0 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    4.9999 
    1.0001 
    0.1000 


ans = 

    0 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    0 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    0 

--- a few dozen more iterations that are the same --- 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    0 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    5.0000 
    1.0000 
    0.1000 


ans = 

    1 

的0/1值是你可以看到檢查前面2個輸出矢量之間相等性的真值。正如你所看到的,算法應該在很久以前收斂/停止,但是直到某個適當的時刻。我究竟做錯了什麼?

SOLUTION:

ofcourse我忘了MATLAB格式長,沒想到它直行。 (我不MATLAB使用所有的時候)反正解決方案,我有被添加精度邊界的方法,導致下面的代碼:當問及精度已達到

function[E] = eig_noshift(A, prec) 
A_k = A; 
v_prec = [prec;prec;prec]; 
for(i=0:inf) 
    [Qk,Rk] = qr(A_k); 
    A_k1 = Rk*Qk; 

    if(diag(A_k1) - diag(A_k) < v_prec) 
     break 
    end 
    A_k = A_k1; 
end 

E = diag(A_k); 

方法停止。乾杯!

回答

0

輸出不包含所有數字。打印差異代替:diag(A_k1)-diag(A_k)

+0

感謝提醒我使用格式長和精度參數。問題解決了 :) – nachtwezen