2013-10-14 144 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。

这会导致小错误被放大,并可以解释您看到的效果。