MatLab中的QR分解

时间:2013-10-14 13:34:33

标签: matlab qr-decomposition

我有以下问题。

我的任务是将多项式拟合到数据中。我想使用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

您是否认为计算错误会导致如此大的错误?我真的很绝望,因为我似乎有两个相同的线性方程组,解决方案是不同的。

1 个答案:

答案 0 :(得分:0)

您实施的格式中的Gram-Schmidt流程为numerically unstable。事实上,你的Matlab计算的Q和Qm是不一样的。此外你的矩阵是病态的,它的条件数是> 10 ^ 10。

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