Você está na página 1de 4

Rapport de TP n8

Diallo Jrmy & Ruiz Ortiz Carlos


le 20 janvier 2016

Table des matires


1 Rsolution de lexemple par lsqlineq et lsqlin

2 Calcul de la distance dun point un sous-espace

3 Approximation-interpolation dun nuage de points

4 Code Matlab utilis


4.1 Fonction lsqlineq.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Script TP8.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
3
3

Rsolution de lexemple par lsqlineq et lsqlin


Ci-dessous le code utilis pour la fonction lsqlineq.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

function [x,Jval,residu,lambda,exit] = lsqlineq(C,d,Aeq,beq)


%Fonction qui rsoud le pb d'optimisation norm(Cx - d)^2
exit = 0;
[m] = size(C'*C);
[p,n] = size(Aeq);
Mat = [C'*C Aeq'; Aeq zeros(p)];
y = vertcat(C'*d, beq);
sol = Mat\y;
x = sol(1:m);
lambda = sol(m+1:end);
residu = C*x - d;
Jval = J(x, C, d);
if det(Mat) ~= 0
exit = 1;
end
end

La rsolution avec lsqlineq donne :

2
x = 1 ,
1

residu =

J(x) = 3.3592 104 ,

63.5
144
82.5
8
35
27

63.5
144
82.5
8
35
27

1
2

1
2

La rsoltion avec la fonction lsqlin de Matlab donne :

2
x = 1 ,
1

residu =

J(x) = 3.3592 10 ,

On obtient bien les mmes rsutats pour les deux fonctions.

Calcul de la distance dun point un sous-espace

On peut reformuler ce problme de calcul de distance en un problme doptimisation linaire sous contraintes
pour se ramener une rsolution avec multiplicateurs de Lagrange. On cherche en fait minimiser
J : x 7 kCx yk
avec C = In et dans lensemble des contraintes :

Aeq

K = {x R4 | Aeq x = beq }




0
0 1
1
1
=
, beq =
1 1
1 1
10

Finalement, on obtient par les deux mthodes la valeur de la distance suivante (il suffit de prendre la racine
de la valeur obtenue par la rsolution Matlab) :
= 5.0498

Approximation-interpolation dun nuage de points


Notons tout dabord (x6 , y6 ) = (3, 5), (x7 , y7 ) = (3, 2). Soit P le polynme de R3 [X] recherch :
(a, b, c, d) R4 | P (X) = aX 3 + bX 2 + cX + d

On veut que P soit la meilleur approximation des points xi , i J1, 5K au sens des moindres carrs, cest--dire
tel que la somme :
S=

5
X

|P (xi ) yi |2

i=1

soit minimale sous des contraintes dterminer. On peut rcrire cette somme sous la forme :
2

C=

x31
x32
x33
x34
x35

S = kCx yk

x21 x1 1
y1
y2
x22 x2 1

x23 x3 1
, y=
y3

y4
x24 x4 1
2
y5
x5 x5 1

Il ne reste qu ajouter les contraintes :


P (x6 ) = y6 , P (x7 ) = y7
que lon rcrit :


Aeq =

{v R4 | Aeq x = beq }



27 9 3 1
5
, beq =
27 9
3 11
2

Finalement, la rsolution Matlab nous permet dobtenir les valeurs de (a, b, c, d) qui identifient compltement
notre polynme. On trace sur un mme graphe les points (xi ), i J1, 7K et le polynme trouv.

Ce polynme semble raliser une bonne approximation des conditions imposes.

4
4.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

2
3
4
5
6
7
8
9
10
11
12
13
14

Fonction lsqlineq.m

function [x,Jval,residu,lambda,exit] = lsqlineq(C,d,Aeq,beq)


%Fonction qui rsoud le pb d'optimisation norm(Cx - d)^2
exit = 0;
[m] = size(C'*C);
[p,n] = size(Aeq);
Mat = [C'*C Aeq'; Aeq zeros(p)];
y = vertcat(C'*d, beq);
sol = Mat\y;
x = sol(1:m);
lambda = sol(m+1:end);
residu = C*x - d;
Jval = J(x, C, d);
if det(Mat) ~= 0
exit = 1;
end
end

4.2
1

Code Matlab utilis

Script TP8.m

% TP8 2015-2016 Moindres carrs avec contraintes linaires


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
disp('Resolution de problmes de moindres carrs avec contraintes linaires');
disp('1- exemple pour tester');
disp('2- calcul de la distance entre un point y et un sous-espace F');
disp('3- interpolation-approximation d''un nuage de point par une polynome');
choixpb = input('pb n : ');
disp('1- avec notre fonction lsqlineq');
disp('2- avec la fonction lsqlin de Matlab');
choixmeth = input('meth n : ');
switch choixpb
case 1,
C=[1 0 0;1 1 1; 1 2 4; 1 3 9; 1 4 16; 1 5 25];
d = [65.5;-142;82.5;-12;25;-45];

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

Aeq = [4 0 1;3 1 0];


beq =[7;7];
case 2,
d = [0;0;0;0];
C = eye(4);
Aeq = [0 -1 0 1; 1 -1 1 -1];
beq = [1;10];
case 3,
v = [-2; -1; 0; 1; 2];
Aeq = [-27 9 -3 1; 27 9 3 1];
beq = [5; 2];
d = [6; 4; 5; 3; 1];
vand = vander(v);
C = vand(:,2:5);
end
switch choixmeth
case 1,
[x,Jval,residu,lambda,exit] = lsqlineq(C,d,Aeq,beq);

33
34
35
36

case 2,
[x,resnorm,residu,exit,output, lambda] = lsqlin(C,d,[],[],Aeq,beq,[],[]);
Jval = J(x,C,d);

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

end
switch choixpb
case 2,
dist = sqrt(Jval);
disp('distance entre 0 et F = '); disp(dist);
case 3,
clf; hold on;
% trac des points d'interpolation
plot([-3 3], [5,2], '+');
% trac des points d'approximation
plot([-2, -1, 0, 1, 2],[6,4,5,3,1],'+');
% A COMPLETER
% graphe du polynme
fun = @(t) x(1)*t^3 + x(2)*t^2 + x(3)*t + x(4);
fplot(fun,[-3,3]);
end
if exit == 1 && choixpb == 1
disp('La rsolution a t possible et a donn le rsultat :');
x
residu
if choixmeth == 1
lambda
else
lambda = lambda.eqlin
end
Jval
elseif exit == 0 && choixpb == 1
disp('Rsolution du systme impossible !');
end

Você também pode gostar