Supposons que l’on veuille approximer un nuage de points avec un polynôme du second degré : \( y(x)=ax^2+bx+c \).
Le nuage de points est donné par un ensemble de \(n\) points ayant pour coordonnées \( {x_i,y_i} \). L'objectif est d'estimer \( \hat{a} \), \( \hat{b} \) et \( \hat{c} \) de façon à ce que le polynôme d’équation \( y(x)=\hat{a}x^2+\hat{b}x + \hat{c} \) approche au mieux le nuage de points. Pour chaque point \( x_i \) nous allons minimiser la différence entre \( y_i \) et \( y(x_i) \), c'est-à-dire que nous voulons minimiser \( \sum \limits_{i=1}^n{(y_i-y(x_i))^2} \).
La formulation matricielle du système est donnée par:
$$ \left[ \begin{matrix} {x_1}^2 & x_1 & 1 \\ {x_2}^2 & x_2 & 1 \\ ... & ... & ... \\ {x_n}^2 & x_n & 1 \\ \end{matrix} \right]. \left[ \begin{matrix} \hat{a} \\ \hat{b} \\ \hat{c} \end{matrix} \right] = \left[ \begin{matrix} y_1 \\ y_2 \\ ... \\ y_n \\ \end{matrix} \right] $$
Définissons \(A\), \(B\) et \(\hat{x}\) :
$$ \begin{matrix} A=\left[ \begin{matrix} {x_1}^2 & x_1 & 1 \\ {x_2}^2 & x_2 & 1 \\ ... & ... & ... \\ {x_n}^2 & x_n & 1 \\ \end{matrix} \right] & B=\left[ \begin{matrix} y_1 \\ y_2 \\... \\ y_n \\ \end{matrix} \right] & \hat{x}=\left[ \begin{matrix} \hat{a} \\ \hat{b} \\ \hat{c} \end{matrix} \right] \end{matrix} $$
Le système est maintenant donné par :
$$ A.\hat{x}=B $$
La solution optimale est :
$$ \hat{x}=A^{+}.B = A^{T}(A.A^{T})^{-1}.B $$
Où \( A^{+} \) est la pseudoinverse de \( A \). \( A^{+} \) peut être calculée avec la formule suivante :
$$ A^{+}=A^{T}(A.A^{T})^{-1} $$
Le code source MatLab ci-dessous a été utilisé pour générer la figure présentée plus haut :
%% Matlab script for least square linear approximation
%% This script shows the approximation with a second degree polynom
%% Written by Philippe Lucidarme
%% http://lucidar.me
close all;
clear all;
clc;
% Set the coefficients a, b and c (y=ax²+bx+c)
a=0.8;
b=-5;
c=-20;
Noise=10;
% Create a set of points with normal distribution
X=[-10:0.2:10];
Y=a*X.*X + b*X + c + Noise*randn(1,size(X,2));
% Prepare matrices
A=[ (X.*X)' , X' , ones(size(X,2),1) ];
B=Y';
% Least square approximation
x=pinv(A)*B;
% Display result
plot (X,Y,'.');
hold on;
plot (X,A*x,'g');
grid on;
xlabel ('x');
ylabel ('y');
legend ('Input data','Approximation');
title ('Least square approximation');
Les sources, scripts et codes Matlab Matlab (exemple de cette page) peuvent être téléchargés ici :