Accordez-moi une faveur, prenez quelques instants pour découvrir mon dernier projet.

Merci, Lulu

Moindres carrés : approximation avec un polynôme du second degré

Hypothèses

Supposons que l’on veuille approximer un nuage de points avec un polynôme du second degré : \( y(x)=ax^2+bx+c \).

Approximation avec un polynôme du second degré

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} \).

Système matriciel

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 $$

Résolution du système

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} $$

Code source

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://www.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');

Téléchargement

Les sources, scripts et codes Matlab Matlab (exemple de cette page) peuvent être téléchargés ici :

second-degree-approximation.m

Voir aussi


Dernière mise à jour : 13/04/2019