Vous êtes sur la page 1sur 10

TP2: Résolution des systèmes linéaires

Abdelkader FASSI FIHRI


February 10, 2021

1 Objectifs
En utilisant Matlab, résoudre un système d’équations linéaires par les méthodes directes et les
méthodes itératives\

1.1 Méthodes Directes


1. On considère le système (1) suivant:

 x + 2y − z = 3
−y + 5z = 2 (1)

3z = 3

Écrire une fonction matlab qui résout par remontée triangulaire un système linéaire U x =
b où U est une matrice triangulaire supérieure selon le prototype suivant: function
[x]=remontee(U,b)

[38]: type remontee.m

function x=remontee(A,b)
x=zeros(size(b));
n=length(b);
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
s=0;
for k=i+1:n
s=s+A(i,k)*x(k);
end
x(i)=(b(i)-s)/A(i,i);
end
end
Donner la solution du système (1) et comparer la à la solution donnée en utilisant l’opérateur de
matlab.

[39]: A=[1 2 -1;0 -1 5;0 0 3];


b=[3;2;3];
x=remontee(A,b)
x=A\b

1
x =

-2
3
1

x =

-2
3
1

2. On considère le système (2) suivant:



 2x = 4
−5x + 3y = 5 (2)

2x + 2y − z = 3

Écrire une fonction matlab qui résout par descente triangulaire un système linéaire
Lx = b où L est une matrice triangulaire inférieure selon le prototype suivant function
[x]=descente(L,b)

[40]: type descente.m

function x=descente(A,b)
x=zeros(size(b));
n=length(b);
x(1)=b(1)/A(1,1);
for i=2:n
s=0;
for k=1:i-1
s=s+A(i,k)*x(k);
end
x(i)=(b(i)-s)/A(i,i);
end
end
Donner la solution du système (2) et comparer la à la solution donnée en utilisant l’opérateur de
matlab.

[41]: A=[2 1 0;-5 3 0;2 2 -1];


b=[4;5;3];
x=descente(A,b)
x=A\b

x =

2
2
5
11

x =

0.6364
2.7273
3.7273

On considère le système (3) suivant:



 4x − y + z = 7
4x − 8y + z = −21 (3)

−2x + y + 5z = 15

Écrire une fonction matlab qui résout un système linéaire Ax = b par la méthode de Gauss selon
le prototype suivant: function [x]=gauss(A,b)
On pourra utiliser les fonctions déjà créées dans les questions précédentes.

[42]: type gauss.m

function x=gauss(A,b)
x=zeros(size(b));
n=length(b);
M=[A b];
for j=1:n
if M(j,j) == 0
iligne=j+1;
while M(iligne,j) == 0
iligne=iligne+1;
end
tmp=M(j,:);
M(j,:)=M(iligne,:);
M(iligne,:)=tmp;
end
pivot=M(j,j);
for i=j+1:n
M(i,:)=M(i,:)-(M(i,j)/pivot)*M(j,:);
end
end
x=remontee(M(:,1:n),M(:,n+1));
end
Donner la solution du système (3) et comparer la à la solution donnée en utilisant l’opérateur de
matlab.

3
[43]: A=[4 -1 1;4 -8 1;-2 1 5];
b=[7;-21;15];
x=gauss(A,b)
x=A\b

x =

2
4
3

x =

2
4
3

3. Ecrire une fonction matlab qui résout un système linéaire Ax = b par la méthode de décom-
position LU (crout) selon le prototype suivant: function [L,U,x]=crout(A,b)

[44]: type crout.m

function [L,U,x]=crout(A,b)
n=length(b);
x=zeros(n,1);
L=zeros(n);
U=zeros(n);
L(:,1)=A(:,1);
U(1,2:n)=A(1,2:n)/L(1,1);
for i=2:n-1
s=0;
for k=1:i-1
s=s+L(i,k)*U(k,i);
end
L(i,i)=A(i,i)-s;
for j=i+1:n
s=0;
for k=1:i-1
s=s+L(j,k)*U(k,i);
end
L(j,i)=A(j,i)-s;
s=0;
for k=1:i-1
s=s+L(i,k)*U(k,j);
end

4
U(i,j)=(A(i,j)-s)/L(i,i);
end
end
s=0;
for k=1:n-1
s=s+L(n,k)*U(k,n);
end
L(n,n)=A(n,n)-s;
y=descente(L,b);
U=U+eye(n);
x=remontee(U,y);
end
Donner la solution du système (3) et comparer le résulat à celui obtenu en utilisant la fonction {lu}
de matlab.

[45]: A=[4 -1 1;4 -8 1;-2 1 5];


b=[7;-21;15];
[L,U,x]=crout(A,b)
x=A\b

L =

4.0000 0 0
4.0000 -7.0000 0
-2.0000 0.5000 5.5000

U =

1.0000 -0.2500 0.2500


0 1.0000 0
0 0 1.0000

x =

2
4
3

x =

2
4
3

5
1.2 Méthodes itératives
1. On reprend le système (3) précédent:

 4x − y + z = 7
4x − 8y + z = −21 (4)

−2x + y + 5z = 15

Écrire une fonction matlab qui résout un système linéaire Ax = b par


la méthode de Jacobi selon le prototype suivant: function [X,niter] =
jacobi(A,b,X0,nmax,tol)
avec comme paramètres d’entrée la matrice A, le second membre b, le vecteur
initial X0, le nombre maximal nmax d’itérations et l’erreur tolérée tol.

[46]: type jacobi.m

function [X,niter]=jacobi(A,b,X0,nmax,tol)
M=diag(diag(A));
N=M-A;
CJ=M\N;
dJ=M\b;
X=X0;
niter=0;
while (norm(A*X-b) > tol) & (niter <= nmax)
X=CJ*X+dJ;
niter=niter+1;
end
end
2. Donner la solution approchée du système (3) et comparer le nombre d’itérations
et l’erreur de cette méthode en variant les tests d’arrêt.

[47]: A=[4 -1 1;4 -8 1;-2 1 5];


b=[7;-21;15];
X0=[0;0;0];
nmax=100;
tol=1.e-6;
[X,niter]=jacobi(A,b,X0,nmax,tol)
A\b

X =

2.0000
4.0000
3.0000

niter =

6
16

ans =

2
4
3

3. reprendre la question précédente en utilisant la méthode de Gauss-Seidel selon


le prototype suivant:
function [X,niter] = gseidel(A,b,X0,nmax,tol)

[48]: type gseidel.m

function [X,niter]=gseidel(A,b,X0,nmax,tol)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
M=D-L;
N=U;
CGS=M\N;
dGS=M\b;
X=X0;
niter=0;
while (norm(A*X-b) > tol) & (niter <= nmax)
X=CGS*X+dGS;
niter=niter+1;
end
end

[49]: A=[4 -1 1;4 -8 1;-2 1 5];


b=[7;-21;15];
X0=[0;0;0];
nmax=100;
tol=1.e-6;
[X,niter]=gseidel(A,b,X0,nmax,tol)
A\b

X =

2.0000
4.0000
3.0000

7
niter =

ans =

2
4
3

4. reprendre la question précédente en utilisant la méthode de relaxation selon le


prototype suivant:
function [X,niter] = relaxation(A,b,X0,w,nmax,tol)
où w désigne le paramètre de relaxation.

[50]: type relaxation.m

function [X,niter]=relaxation(A,b,X0,omega,nmax,tol)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
M=D/omega-L;
N=(1-omega)*D/omega+U;
CR=M\N;
dR=M\b;
X=X0;
niter=0;
while (norm(A*X-b) > tol) & (niter <= nmax)
X=CR*X+dR;
niter=niter+1;
end
end

[51]: A=[4 -1 1;4 -8 1;-2 1 5];


b=[7;-21;15];
X0=[0;0;0];
nmax=100;
tol=1.e-6;
omega=1.2;
[X,niter]=relaxation(A,b,X0,omega,nmax,tol)
A\b

X =

8
2.0000
4.0000
3.0000

niter =

15

ans =

2
4
3

5. Tracer le nombre d’itérations en fonction du paramètre de relaxation w ∈ [0, 2]


avec un test d’arrêt fixé.

[52]: A=[4 -1 1;4 -8 1;-2 1 5];


b=[7;-21;15];
X0=[0;0;0];
nmax=100;
tol=1.e-6;
iter=[];
for omega=0.1:0.1:2
[X,niter]=relaxation(A,b,X0,omega,nmax,tol);
iter=[iter niter];
end
plot(0.1:0.1:2,iter)

9
10

Vous aimerez peut-être aussi