【发布时间】:2013-10-14 13:34:32
【问题描述】:
我有以下问题。
我的任务是为数据拟合多项式。我想使用 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
你认为这么大的错误会是计算错误造成的吗?我真的很绝望,因为我似乎有两个相同的线性方程组,并且解决方案不同。
【问题讨论】:
-
会不会是您的分解与非方形矩阵作斗争?如果我在the example from the Wikipedia entry 上运行你的代码,我会得到正确的结果。那是一个
3x3矩阵。但是,在您的情况下,size(A)给出了100x15。 -
MatLab 计算这样的线性方程组系统更加“困难”。但是我仍然不知道为什么 MatLabs Q,R 矩阵给出了正确的解决方案,而我的矩阵 Q,R(尽管它们或多或少与以前的相同)给出了损坏的系数。我只是不清楚。