QR-разложение в MatLab
У меня есть следующая проблема.
Моя задача - подогнать полином к данным. Я хочу имплантировать 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. Разница только в знаках. Если я решу свою систему уравнений R*x=Q*y с помощью функций MatLab, я получу точное решение. Но если я использую свои собственные матрицы 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 ответ
Процесс Грамма-Шмидта в той форме, в которой он реализован, численно нестабилен. На самом деле, ваши Q и Qm, вычисленные с помощью Matlab, не совпадают. Более того, ваша матрица плохо подготовлена, число ее условий>10^10.
Это приводит к увеличению мелких ошибок и может объяснить эффекты, которые вы видите.