LSQquadQR.m
Contents
Overview
Illustrates the use of the QR decomposition for the computation of a polynomial least squares fit
Example 1: Solving the least squares problem using QR decomposition
Data comes from the quadratic polynomial (no noise)
clear all close all x = [10:0.2:11]'; disp('Clean Data') y = [0:0.2:1]'.^2/10; m = length(x); hold on plot(x, y, 'bo', 'LineWidth',2) xlim([9.9 11.1]) ylim([0 0.1]) %pause disp('Solving least squares problem with QR decomposition') A = [x.^2 x ones(m,1)] % Compute the QR decomposition of A [Q R] = qr(A) Rhat = R(1:3,1:3) z = Q(:,1:3)'*y; c = Rhat\z xx = linspace(9.9,11.1,50); yy = c(1)*xx.^2+c(2)*xx+c(3); plot(xx, yy, 'g-', 'LineWidth', 2) title('Clean Data') disp('Fitting with quadratic polynomial') disp(sprintf('p(x) = %3.2fx^2 + %3.2fx + %3.2f',c)) hold off
Clean Data Solving least squares problem with QR decomposition A = 100.0000 10.0000 1.0000 104.0400 10.2000 1.0000 108.1600 10.4000 1.0000 112.3600 10.6000 1.0000 116.6400 10.8000 1.0000 121.0000 11.0000 1.0000 Q = 0.3691 0.6074 0.5623 -0.1881 -0.0850 -0.3687 0.3840 0.3872 -0.0987 0.5732 0.3351 0.5020 0.3992 0.1579 -0.4326 -0.6543 -0.2266 0.3861 0.4147 -0.0806 -0.4392 0.4051 -0.4804 -0.4834 0.4305 -0.3282 -0.1187 -0.1994 0.7254 -0.3561 0.4466 -0.5848 0.5291 0.0635 -0.2685 0.3201 R = 270.9125 25.7197 2.4443 0 0.8335 0.1589 0 0 0.0022 0 0 0 0 0 0 0 0 0 Rhat = 270.9125 25.7197 2.4443 0 0.8335 0.1589 0 0 0.0022 c = 0.1000 -2.0000 10.0000 Fitting with quadratic polynomial p(x) = 0.10x^2 + -2.00x + 10.00
Example 2: Fit "noisy" data using a quadratic polynomial
Note that we do not need to re-compute the QR decomposition of the matrix for this part since the matrix is still the same. Only the data vector has changed!
%pause disp('Noisy Data') % Add 10% noise to the data y = y + 0.1*max(y)*rand(size(y)); figure hold on plot(x, y, 'bo', 'LineWidth',2) xlim([9.9 11.1]) ylim([0 0.1]) %pause disp('Solving noisy least squares problem with QR decomposition') % No need to re-compute the QR decomposition of A since A is the same, only % y has changed! z = Q(:,1:3)'*y; c = Rhat\z xx = linspace(9.9,11.1,50); yy = c(1)*xx.^2+c(2)*xx+c(3); plot(xx, yy, 'g-', 'LineWidth', 2) title('Noisy Data') disp('Fitting with quadratic polynomial') disp(sprintf('p(x) = %3.2fx^2 + %3.2fx + %3.2f',c)) hold off
Noisy Data Solving noisy least squares problem with QR decomposition c = 0.1109 -2.2306 11.2219 Fitting with quadratic polynomial p(x) = 0.11x^2 + -2.23x + 11.22