2013-10-14 141 views
0

我有以下問題。QR分解在MatLab

我的任務是擬合一個多項式的數據。我想使用Gram-Schimdt正交化過程來實現QR算法。它是建立在這樣的功能:

function [ Q,R ] = QRDec(A) 
n = length(A(1,:)); 
for i=1:n 
    Q(:,i) = A(:,i); 
    for j=1:i-1 
     R(j,i) = (Q(:,j)')*Q(:,i); 
     Q(:,i) = Q(:,i)-R(j,i)*Q(:,j); 
    end 
    R(i,i) = norm(Q(:,i),2); 
    if R(i,i) == 0 
     break; 
    end 
    Q(:,i)=Q(:,i)/R(i,i); 
end 
end 

矩陣Q,R是幾乎相同的,因爲這些Q,R從在MATLAB函數實現時獲得。唯一的區別是符號。如果我用MatLab函數求解方程組R * x = Q * y,我可以得到精確的解。但是如果我使用我自己的矩陣Q和R,那麼我得到錯誤的結果。有人可以告訴我我的方法在哪裏?我也附上腳本的代碼。

% clear variables 
clear; clc; 
N = 100; 
p = ones(1,15); 
d = 14; 
x = linspace(0,1,N)'; 
y = polyval(p,x); 
A = zeros(N,d+1); 
for i = 1 : d+1 
    A(:,i) = x.^(i-1); 
end 
[Qm,Rm] = QRDec(A); 
[Q,R] = qr(A,0); 
a_qrm = Rm\(Qm'*y); 
a_qr = R\(Q'*y); 
end 

您是否認爲如此大的錯誤可能是由計算錯誤引起的?我真的很絕望,因爲我似乎有兩個相同的線性方程組,而且解決方案是不同的。

+0

難道是你的分解與非矩形的矩陣掙扎?如果我在[維基百科條目的示例]上運行代碼(http://en.wikipedia.org/wiki/QR_decomposition),我會得到正確的結果。這是一個3x3矩陣。但是,在你的情況下,「大小(A)」給出了「100x15」。 – Schorsch

+0

MatLab計算線性方程組的系統更「困難」。但我仍然不知道爲什麼MatLabs Q,R矩陣給出了正確的解決方案,而我的矩陣Q,R(儘管它們或多或少與先前的矩陣相同)給出損壞的係數。這只是我不清楚。 – chip

回答

0

您實施它的格式中的Gram-Schmidt流程是numerically unstable。事實上,由Matlab計算出的Q和Qm是不一樣的。此外,你的矩陣是病態的,它的條件數是> 10^10。

這會導致小錯誤被放大,並可以解釋您看到的效果。