0

我有以下问题。

我的任务是为数据拟合多项式。我想使用 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 与在 MatLab 函数中实现的这些 Q,R 几乎相同。唯一的区别是符号。如果我用 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

你认为这么大的错误会是计算错误造成的吗?我真的很绝望,因为我似乎有两个相同的线性方程组并且解决方案不同。

4

1 回答 1

1

您实现的形式的 Gram-Schmidt 过程在数值上是不稳定的。事实上,你用Matlab计算的Q和Qm是不一样的。而且你的矩阵是病态的,它的条件数是> 10 ^ 10。

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

于 2013-11-29T14:35:41.593 回答