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.

Это приводит к увеличению мелких ошибок и может объяснить эффекты, которые вы видите.

Другие вопросы по тегам