Vous êtes sur la page 1sur 20

Exemples TPs

P a g e 37 | 57
TP 1. Résolution d’équation de second ordre 𝒂𝒙𝟐 + 𝒃𝒙 + 𝒄 = 𝟎
Sol 1. On définit la fonction qui renvoi la ou les solutions réelles, et les deux
racines complexes dans le cas où ∆< 0 , on traite aussi s’il existe une
équation à résoudre :
8. function [x1,x2]=equ2deg(a,b,c)
9. if a==0
10. if b==0
11. disp('Pas d''équation à résoudre !!')
12. x1=NaN;
13. x2=NaN;
14. else
15. disp('L''équation est du 1er derg')
16. x1=-c/b;
17. x2=NaN;
18. end
19. else
20. if (b^2-4*a*c)>=0
21. disp('Solutions réels')
22. else
23. disp('Solutions complexes')
24. end
25. x1=(-b+sqrt(b^2-4*a*c))/(2*a);
26. x2=(-b-sqrt(b^2-4*a*c))/(2*a);
27. end
28. end

TP 2. Calcul d’une matrice tri-diagonale


L’objectif est de calculer la matrice A sous la forme tri-diagonale suivante :
2 -1 0 ⋯ 0
-
2 ⋱ ⋱ ⋮
1
0 ⋱ ⋱ ⋱ 0
-
⋮ ⋱ ⋱ 2
1
0 ⋯ 0 -1 2
Sol 2. On peut la définir par une seule commande combinée :
» A=2*eye(n)+diag(-ones(1,n-1),1)+diag(-ones(1,n-1),-1)
Où 𝑛 représente la dimension de la matrice 𝐴
TP 3. Calcul d’une matrice par bloc
1 1 1 1 0 1 1 0 0 0 0
1 1 1 0 1 1 1 0 0 0 0
-2 0 0 1 0 0 0 1 0 0 0
0 -2 0 0 1 0 0 0 2 1 1
0 0 -2 0 0 0 0 0 1 2 1
0 0 0 0 1 2
P a g e 38 | 57
Sol 3. La première variante, dans le cas où la matrice est définie sous forme des
blocs de différentes tailles, on doit déclarer chaque bloc à part, et on
applique la concaténation ligne par ligne
» A1=ones(2,3); A2=eye(2); A3=-2*eye(3); A4=eye(3,2);
» M = [A1 , A2 ; A3 ; A4]
La deuxième variante on utilise la commande “blkdiag” où la matrice A
est diagonale par bloc
» blkdiag(ones(2) , eye(1) , eye(3)+ones(3))

TP 4. Écrire une fonction avec un paramètre entier n et construit la matrice ci-


dessous. (Ne pas utiliser de boucles for et while)

Sol 4. On définit la fonction matriceA avec le paramètre d’entré 𝑛


1. function [A]=matriceA(n)
2. v=1:n;

3. v1=v./n;

4. v2=v.^2;

5. A=diag(v1,-1)+diag(v2,1);

6. end

Avec une seule instruction on peut déclarer la matrice 𝐴


» A = diag ( [ 1 : n ] . / n , - 1 ) + diag ( [ 1 : n ] . ^ 2 , 1 )
ou
» A = diag ( [ 1 / n : 1 / n : 1 ] , - 1 ) + diag ( [ 1 : n ] . ^ 2 , 1 )

TP 5. Fonction factoriel (n !)
Sol 5. On peut donner plusieurs variantes.
On déclare une fonction récursive : n ! = factN(n) = n x (n-1)! = n*factN(n-1)
7.function fn =factN(n)
8. % factoriel de n avec fonction récursive.
9. if n==0
fn=1;
10. else
11. fn= n*factN(n-1);
12. end
13. end

P a g e 39 | 57
La solution rapide avec des opérations vectoriel on donne l’instruction
» Fn=prod (1 : n)
✓ On a vu dans la section des fonctions prédéfinies en Matlab la fonction « factorial »
qu’on peut la comparer avec nos solutions proposées.
TP 6. Suite numérique :
Le but de ce TP est de calculer une série de nombres (suite récurrente : 𝑢𝑛+1 =
𝑓 (𝑢𝑛 ) ou en fonction de 𝑛 ∶ 𝑢𝑛 = 𝑓 (𝑛)) pour qu’on s’en servir dans le calcul
numérique (méthodes et résultats numérique),
𝑛−1
▪ Calculer les 𝑛 termes de la suite numérique du terme général 𝑢𝑛 = .
𝑛+1
▪ Tracer les valeurs de (𝑢𝑘 )𝑘=1:𝑛̅̅̅̅̅ dans le même repère que sa limite l = 1.
▪ On veut représenter la convergence de (𝑢𝑛 ) géométriquement en traçant une
courbe d’erreur Er donné par 𝐸𝑟 = |𝑢𝑛 − 𝑢𝑛−1 | , utiliser la commande
« subplot ».
Sol 6. On déclare la fonction qui calcul les 𝑛 termes de la suite 𝑢𝑛 utilisant les
opérations vectorielles :
1. function [un]=suiteNER(n)
2. k=1:n;
3. un=(k-1)./(k+1);
4. subplot(2,1,1)
5. %% Graphe
6. plot(un,'ro')
7. hold on
8. plot(k,ones(size(k)),'b-','LineWidth',2)
9. title(['\fontsize{16}Les termes à
u_{',num2str(n),'}'])
10. axis([0 n min(un) 1+0.1])
11. hold off
12. %% Erreur
13. Er=abs(un(2:n)-un(1:n-1));
14. subplot(2,1,2)
15. plot(Er,'b*-')
16. title('Erreur')
17. end
Les termes à u 20
1

0.5

0
0 2 4 6 8 10 12 14 16 18 20

Erreur
0.4

0.3

0.2

0.1

0
0 2 4 6 8 10 12 14 16 18 20

P a g e 40 | 57
Autre solution : On peut aussi utiliser les boucles (avec ou sans contrainte)
1. function [un,Er]=suiteNER2(n,tol)
2. un(1)=0;
3. un(2)=1/3;
4. Er(1)=abs(un(2)-un(1));
5. k=2;
6. while (Er(k-1)>tol)&&(k<n)
7. k=k+1;
8. un(k)=(k-1)/(k+1);
9. Er(k-1)=abs(un(k)-un(k-1));
10. end
11. N=1:k;
12. hold on
13. plot(N,un,'ro',N,ones(size(un)),'g-')
14. axis([0 k min(un) 1+0.1])
15. plot(Er,'b*-')
16. title(['\fontsize{16}Les termes à u_{',...
17. num2str(k),'} et
Err_{',num2str(length(Er)),...
18. '} avec ',num2str(tol),' prés'])
19. legend('U_{n}','Limite','Erreur')
20. hold off
21. end
Les termes à u 30 et Err29 avec 0.001 prés

0.8 Un
Limite
Erreur
0.6

0.4

0.2

0
0 5 10 15 20 25 30

TP 7. Calcul d’un déterminant par la méthode des mineurs


Sol 7. Il suffit de voire que le calcul du déterminant se fait d’une manière
récursive :
1 4 2
2 1 3 1 3 2
Soit 𝐴 = (3 2 1) ⟹ 𝑑𝑒𝑡(𝐴) = +1 | | − 4| | + 2| | = −35
−1 3 1 3 1 −1
1 −1 3

P a g e 41 | 57
1. function Dt=determinantM(A)
2. if size(A,1)==2
3. Dt=A(1,1)*A(2,2)-A(2,1)*A(1,2);
4. else
5. Dt=0;
6. for i=1:size(A,1)
7. Amod=A;
8. Amod(1,:)=[];
9. Amod(:,i)=[];
10. Dt=Dt+((-
1)^(i+1))*A(1,i)*determinantM(Amod);
11. end
12. end
13. end
✓ La command « det » nous permet de vérifier le résultat.
TP 8. Changement de base et matrice de passage
Sol 8. L’algèbre linéaire nous fournit les propriétés suivantes :
On a 𝐴′ = 𝑃−1 𝐴𝑃 et 𝑣 = 𝑃𝑣 ′ ⟹ 𝑣 ′ = 𝑃−1 𝑣, tel que 𝑃 est la matrice de
passage dont les colonnes sont les vecteurs de la nouvelle (𝑒𝑖′ ) base écrite dans
l’ancienne base (𝑒𝑗 ), on aura :
𝑃 = (𝑒1′ 𝑒2′ ⋯ 𝑒𝑛′ ) ⇝ {𝑒1 𝑒2 ⋯ 𝑒𝑛 }
(1) (1) (1)
𝑒1′ = 𝜆1 𝑒1 + 𝜆2 𝑒2 + ⋯ + 𝜆𝑛 𝑒𝑛 ⟺ 𝐸𝜆(1) = 𝑒1′
(1)
𝜆 = 𝐸 −1 𝑒1′
Donc chaque colonne 𝑘 de la matrice 𝑃 est la solution du système linéaire
𝜆(𝑘) = 𝑒𝑘′ , tel que 𝐸 construite par les vecteurs de l’antienne base (vecteurs
propres de A)
1. function [ P ] = matricepassage( A,Bp )
2. %% la base B=Vect.propre
3. [B,D]=eig(A);
4. for i=1:size(A,1)
5. P(:,i)=Bp(:,i)'/B;
6. end
7. end

TP 9. Méthode de Gauss pour la résolution de système linéaire


Sol 9. L’objectif est de transformer la matrice 𝐴 sous forme triangulaire
supérieure (ou inférieure), pour qu’on puisse appliquer un calcul ascendant (ou
descendant) pour la résolution du système linéaire 𝐴𝑥 = 𝑏.
L’algorithme est basé sur l’élimination par ligne :
𝑎𝑖𝑘
𝑙𝑖 ← 𝑙𝑖 − 𝑙
𝑎𝑘𝑘 𝑘

P a g e 42 | 57
tel que 𝑎𝑘𝑘 ≠ 0 , 𝑘 = 1, … , 𝑛 − 1 et 𝑖 = 𝑘 + 1, … , 𝑛, on obtient une matrice
triangulaire supérieure
1. function [Ap,bp]=EGauss(A,b)
2. n=size(A,1);
3. Am=[A,b];
4. for j=1:n-1
5. for i=j+1:n
6. Am(i,:)=Am(i,:)-
Am(j,:)*Am(i,j)/Am(j,j);
7. end
8. end
9. Ap=Am(:,1:n);
10. bp=Am(:,n+1);
11. end

Et pour la résolution du système linéaire ascendant on utilise la fonction :


1. function x=solAss(A,b)
2. n=length(b);
3. x(n)=b(n)/A(n,n);
4. for k=n-1:-1:1
5. sm=0;
6. for i=k+1:n
7. sm=sm+A(k,i)*x(i);
8. end
9. x(k)=(b(k)-sm)/A(k,k);
10. end

❖ Triangulaire inférieure – Descendant


1. function [Ap,bp]=EGaussInf(A,b)
2. n=size(A,1);
3. Am=[A,b];
4. for j=n:-1:2
5. for i=1:j-1
6. Am(i,:)=Am(i,:)-
Am(j,:)*Am(i,j)/Am(j,j);
7. end
8. end
9. Ap=Am(:,1:n);
10. bp=Am(:,n+1);
11. end

P a g e 43 | 57
avec
1. function x=solDesc(A,b)
2. n=length(b);
3. x(1)=b(1)/A(1,1);
4. for k=2:n
5. sm=0;
6. for i=1:k-1
7. sm=sm+A(k,i)*x(i);
8. end
9. x(k)=(b(k)-sm)/A(k,k);
10. end

Remarque :
▪ Il est possible d’avoir un élément nul dans la diagonale. pour cela on
applique l’élimination de Gauss avec pivot (partiel ou total), i.e. on
cherche la composante non nulle dans la colonne du pivot (ou la plus
grande en valeur absolue) et on applique une permutation entre lignes.
▪ Avec l’application de la méthode de Gauss on peut calculer la matrice
inverse (Algèbre Linéaire).

TP 10. Décomposition LU
Résolution des systèmes linéaires avec la méthode de Doolittle (Factorisation
LU) : 𝐴 = 𝐿𝑈, où 𝐿 est la matrice triangulaire inférieure et 𝑈 est la matrice
triangulaire supérieure,
Sol 10. On veut traduire l’Algorithme de Doolittle suivant :
Entrer : 𝐴 : définie positive
𝐿 ← 𝐼𝑛𝑛
𝑈 ← 0𝑛𝑛
Pour 𝑖 = 1, … 𝑛 − 1 faire
Pour 𝑖 = 𝑖, … 𝑛 faire
𝑖−1
| 𝑢𝑖𝑗 ← 𝑎𝑖𝑗 − ∑ 𝑙𝑖𝑘 𝑢𝑘𝑗
𝑘=1
Fin
Pour 𝑗 = 𝑖 + 1, … 𝑛 faire
1 𝑖−1
| 𝑙𝑗𝑖 ← (𝑎𝑗𝑖 − ∑ 𝑙𝑗𝑘 𝑢𝑘𝑖 )
𝑢𝑖𝑖 𝑘=1
Fin
Fin
𝑛−1
𝑢𝑛𝑛 ← 𝑎𝑛𝑛 − ∑ 𝑙𝑛𝑘 𝑢𝑘𝑛
𝑘=1
Sorties : 𝐿 , 𝑈.

P a g e 44 | 57
1. function [L,U]=decLU(A)
2. n=size(A,1);
3. L=eye(n);
4. U=zeros(n);
5. for i=1:n-1
6. for j=i:n
7. sm=L(i,1:i-1)*U(1:i-1,j);
8. %sm=0;
9. %for k=1:i-1
10. % sm=sm+L(i,k)*U(k,j);
11. %end
12. U(i,j)=A(i,j)-sm;
13. end
14. for j=i+1:n
15. sm=L(j,1:i-1)*U(1:i-1,i);
16. %sm=0;
17. %for k=1:i-1
18. % sm=sm+L(j,k)*U(k,i);
19. %end
20. L(j,i)=(1/U(i,i))*(A(j,i)-sm);
21. end
22. end
23. sm=L(n,1:n-1)*U(1:n-1,n);
24. %sm=0;
25. %for k=1:n-1
26. % sm=sm+L(n,k)*U(k,n);
27. %end
28. U(n,n)=A(n,n)-sm;
29. end
Remarque : On a vue dans la section des fonctions prédéfinies sur Matlab, la
commande « lu » qui nous donne directement les matrices 𝐿 et 𝑈 utilisant :
» [L,U] = lu(A)
TP 11. Factorisation de Cholesky A = R* R , tel que 𝑅 est une matrice triangulaire
supérieur
Pour 𝑖 = 1, 𝑛
Calculer : 𝑟𝑖𝑖 = √𝑎𝑖𝑖 − ∑𝑖−1
𝑘=1|𝑟𝑘𝑖 |
2

Pour 𝑗 = 𝑖 + 1, 𝑛
𝑖−1
1
𝑟𝑖𝑗 = (𝑎𝑖𝑗 − ∑ 𝑟̅𝑘𝑖 𝑟𝑘𝑗 )
𝑟𝑖𝑖
𝑘=1

P a g e 45 | 57
Fin de la boucle sur 𝑗
Fin de la boucle sur 𝑖
NB : dans le cas réel, 𝑅 ∗ = 𝑅𝑇 , A est hermitienne définie positive
1. function R=MCholesky(A)
2. %exemple : A=[1 1 1;1 2 2;1 2 3]
3. % A : hermitienne et définie positive
4. % A= R' * R
5. n=length(A);
6. for i=1:n
7. S=0;
8. for k=1:i-1
9. S=S+(R(k,i))^2;
10. end
11. R(i,i)=sqrt(A(i,i)-S);
12. for j=i+1:n
13. S=0;
14. for k=1:i-1
15. S=S+R(k,i)*R(k,j);
16. end
17. R(i,j)=(A(i,j)-S)/R(i,i);
18. end
19. end
20. end

TP 12. Résolution d’un systèmes linéaires utilisant des méthodes itératives


▪ Méthode générale :
Toutes les méthodes itératives se base sur la décomposition de la matrice
𝐴 : 𝐴 = 𝑀 – 𝑁 , tel que 𝑀 est inversible, et on a
𝐴𝑥 = 𝑏 ⟹ 𝑀𝑥 − 𝑁𝑥 = 𝑏
⟹ 𝑥 = 𝑀−1 𝑁𝑥 + 𝑀−1 𝑏
⟹ 𝑥𝑘+1 = 𝑀 −1 𝑁𝑥𝑘 + 𝑀−1 𝑏
D’où l’itération 𝑥𝑘+1 = 𝑓(𝑥𝑘 ) qu’on a vue déjà dans le TP des suites.
▪ Méthode de Jacobi (A = D – F – E) :
La matrice diagonale 𝐷 est formée par la diagonal de 𝐴 ; – 𝐸 et – 𝐹
représentent les parties sous et sur-diagonale de 𝐴 ⟹ 𝐷𝑥 = (𝐸 + 𝐹 )𝑥 + 𝑏
Poser 𝑥 (0) = 𝑥0 , 𝑒 (0) = 2𝜀 et 𝑘 = 0
Tant que 𝑒 (𝑘) ≥ 𝜀
Calculer 𝑥 (𝑘+1) = 𝐷−1 ((𝐸 + 𝐹)𝑥 (𝑘) + 𝑏)
Calculer un résidu qui doit être proche de zéro lorsque 𝑥 (𝑘+1)
approche la solution 𝑥 = 𝐴−1 𝑏 :
𝑒 (𝑘+1) = ‖𝐴𝑥 (𝑘+1) − 𝑏‖
Itérer 𝑘 ⟵ 𝑘 + 1
Fin de tant que.

Remarque : Si la matrice à diagonale strictement dominant, la méthode de


Jacobi et Gauss-Seidel convergent
P a g e 46 | 57
1. function x=MJacobi(A,b,x0,n,tol)
2. %% affichage de la solution exacte et x0
3. subplot(2,1,1)
4. hold on
5. plot(A\b,'b')
6. plot(x0,'g--','LineWidth',2)
7. %%------------------------------
8. D=diag(diag(A));
9. EF=D-A;
10. for i=1:n
11. x=(inv(D)*EF)*x0+inv(D)*b;
12. subplot(2,1,1)
13. hold on
14. plot(x,'-.r')
15. subplot(2,1,2)
16. hold on
17. plot(i,norm(x-x0),'ob')
18. if norm(x-x0)<tol
19. disp(['Nbr. itr = ',num2str(i)])
20. break
21. else
22. x0=x;
23. end
24. end

Exécution :
» A=2*eye(n)+diag(-ones(1,n-1),1)+diag(-ones(1,n-1),-1)
» b=randi(5,n,1)
» x0=zeros(size(b))
» x0=randi(4,size(b))
» x=MJacobi(A,b,zeros(size(b)),120,10^-3)
» x=MJacobi(A,b,x0,120,10^-3)
» x=MJacobi(A,b,x,120,10^-3)

▪ Gauss-Seidel : la même décomposition de 𝐴, on a (𝐷 − 𝐸 )𝑥 = 𝐹𝑥 + 𝑏


Poser 𝑥 (0) = 𝑥0 , 𝑒 (0) = 2𝜀 et 𝑘 = 0
Tant que 𝑒 (𝑘) ≥ 𝜀
Pour 𝑘 ≥ 0 Calculer 𝒙(𝒌+𝟏) = (𝑫 − 𝑬)−𝟏 (𝑭𝒙(𝒌) + 𝒃)
par l’algorithme de descente
Calculer un résidu qui doit être proche de zéro lorsque
𝑥 (𝑘+1) tend vers la solution 𝑥 = 𝐴−1 𝑏 :
𝑒 (𝑘+1) = ‖𝐴𝑥 (𝑘+1) − 𝑏‖
P a g e 47 | 57
Itérer 𝑘 ⟵ 𝑘 + 1
Fin de tant que.

1. function x=MGaussSeiled(A,b,x0,n,tol)
2. D=diag(diag(A));
3. E=-tril(A)+D;
4. F=-triu(A)+D;
5. %% affichage de la solution exacte et x0
6. subplot(2,1,1)
7. hold on
8. plot(A\b,'b','LineWidth',2)
9. plot(x0,'g--','LineWidth',2)
10. %%---------------------------------
11. for i=1:n
12. x=inv(D-E)*F*x0+inv(D-E)*b;
13. subplot(2,1,1)
14. hold on
15. plot(x,'-.r')
16. subplot(2,1,2)
17. hold on
18. plot(i,norm(A*x-b),'ob')
19. if norm(A*x-b)<tol
20. %if norm(x-x0)<tol
21. disp(['Nbr. itr = ',num2str(i)])
22. break
23. else
24. x0=x;
25. end
26. end
Exécution : la même exécution que la méthode de Jacobi
» A=2*eye(n)+diag(-ones(1,n-1),1)+diag(-ones(1,n-1),-1)
» b=randi(5,n,1)
» x0=zeros(size(b))
Ou: x0=randi(4,size(b))
» x=MGaussSeiled(A,b,zeros(size(b)),120,10^-3)
» x=MGaussSeiled(A,b,x0,120,10^-3)
» x=MGaussSeiled(A,b,x,120,10^-3)

▪ Méthode itérative de Richardson : 𝐴 = 𝑀 − 𝑁, 𝑀 = 𝐼𝑛 , 𝑁 = 𝐼𝑛 − 𝐴.


𝑥 (𝑘+1) = (𝐼𝑛 − 𝐴)𝑥 (𝑘) + 𝑏 = 𝑥 (𝑘) − (𝐴𝑥 (𝑘) − 𝑏).
On peut la faire de la même manière que les deux méthodes précédentes.

P a g e 48 | 57
➢ On peut résumer les méthodes itératives sous forme du tableau suivant

Nom de la
M N
méthode
Jacobi 𝐷 𝐸 + 𝐹
sur-relaxation 1 1−𝜔
𝐷 𝐷 + 𝐸 + 𝐹
simultanée 𝜔 𝜔
Gauss–Seidel 𝐷 −𝐸 𝐹
sur-relaxation 1 1−𝜔
𝐷−𝐸 𝐷+𝐹
successive 𝜔 𝜔
sur-relax. 1 1
succes. (𝐷 − 𝜔𝐸)𝐷−1 (𝐷 − 𝜔𝐹) ((1 − 𝜔)𝐷 + 𝜔𝐸)𝐷−1 ((1 − 𝜔)𝐷 + 𝜔𝐹)
𝜔(2 − 𝜔) 𝜔(2 − 𝜔)
symétrique
Richardson 1 1
𝐼 𝐼 −𝐴
stationnaire 𝛼 𝑛 𝛼 𝑛

TP 13. Résolution des équations non linéaires


La recherche des racines d’une fonction (ou solution d’une équation) 𝑓 (𝑥) = 0,
se fait par plusieurs méthodes numériques, tel que :
▪ Méthode de Dichotomie ou bissection
▪ Théorème du point fixe
▪ Méthode de la sécante
▪ Méthode de la corde (Lagrange)
▪ Méthode de Newton
Sol 13. Les fonctions associées à chaque méthode : (Dichotomie, point fixe
et Newton)
❖ Méthode de Dichotomie
1. function xr=Mdichotomie(f,a,b,tol,n)
2. % il faut déclarer la fonction dans Commande
Windows
3. % f=inline('x^2-2')
4. %%
5. for i=1:n
6. if f(a)*f((a+b)/2)<0
7. b=(a+b)/2;
8. xr=b;
9. else
10. a=(a+b)/2;
11. xr=a;
12. end
13. if (b-a)<tol
14. disp(['nombre d''itération=',num2str(i)])

P a g e 49 | 57
15. break
16. end
17. end
18. end
f(x)=x 2-2
2

1.5

0.5

-0.5

-1

-1.5

-2
-1 -0.5 0 0.5 1 1.5 2

Ou bien
1. function [alpha,t]=Mdecotomi(a,b,tol,f)
2. %% le graphe de f sur [a,b]
3. hold on
4. fplot(f,[a,b])
5. plot([a,b],[0,0],'or-')
6. plot([a,b],[f(a),f(b)],'*k')
7. %% --------------------------
8. if f(b)*f(a)<=0
9. disp('Existe une solution')
10. t=0;
11. while abs(b-a)>=tol
12. c=(b+a)/2;
13. if f(a)*f(c)<0
14. b=c;
15. else
16. a=c;
17. end
18. t=t+1;
19. %% affichage des itérations
20. plot(c,0,'or')
21. plot(c,f(c),'*k')
22. end
23. alpha=c;

P a g e 50 | 57
24. else
25. disp('pas de solution')
26. end
27. end
x 2-x-2

10

-2

1.5 2 2.5 3 3.5 4


x

❖ Méthode de Newton
1. function xr=MNewton(f,fp,x0,n,tol)
2. % il faut déclarer les fonctions dans Commande
Windows
3. % f=inline('x^2-x-2')
4. % fp=inline('2*x-1')
5. %% Calcul des racines
6. x(1)=x0;
7. for i=1:n
8. x(i+1)=x(i)-(f(x(i))/fp(x(i)));
9. if abs(x(i+1)-x(i))<tol
10. disp(['nombre d''itération =',num2str(i)])
11. break
12. end
13. end
14. xr=x(i+1);
15. hold on%% Tracer Ox
16. %plot(x,zeros(size(x)),'ko-') % marquer les
itérations
17. plot([min(x)-1 max(x)+1],zeros(1,2),'k')
18. %% Tracer les tangentes D = f'(x0)(x-x0)+f(x0)
19. for i=1:length(x)

P a g e 51 | 57
20. D=inline([num2str(fp(x(i))),'*(t-',
num2str(x(i)), ')+',num2str(f(x(i)))]);
21. plot(x(i)*ones(1,2),linspace(0,f(x(i)),2),'ro-
-') % la projection
22. g=ezplot(D,[min(x)-1 max(x)+1]);
23.

set(g,'Color','m','linestyle',':','linewidth',1.2)
24. % affecter la couleur, type et épaisseur de la
courbe
25. end
26. %% Tracer la fonction
27. %ezplot(f,[-max(x)-1 max(x)+1])
28. FF=ezplot(f,[min(x)-1 max(x)+1]);
29. set(FF,'Color','b','linestyle','-
','linewidth',2.5)
30. grid
31. axis xy
32. hold off
33. end

❖ Méthode de Point Fixe


1. function xr=MPointFix(f,x0,n,tol)
2. %f=inline('exp(x)-2');
3. %f=inline('log(x+2)');
4. %f=inline('x^2');
5. y=inline('x');
6. x(1)=x0;
7. for k=1:n
8. x(k+1)=f(x(k));
9. if abs(x(k+1)-x(k))<tol
10. disp(['Nb itr =',num2str(k)])
11. break
12. end
13. end
14. xr=x(length(x));
15. hold on
16. for i=1:length(x)-1
17.

plot([x(i),x(i),x(i+1)],[x(i),x(i+1),x(i+1)],'bo-
-')
18. end

P a g e 52 | 57
19. gy=ezplot(y,[min(x)-0.5 max(x)+0.5]);
20. set(gy,'Color','k','linestyle','-
.','linewidth',1.5)
21. gf=ezplot(f,[min(x)-2 max(x)+2]);
22. set(gf,'Color','r','linestyle','-
','linewidth',1.5)
23. grid
24. axis xy
25. hold off
26. end

log(x+2)

1.8

1.6

1.4

1.2

0.8

0.6

0.4

0.2

-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4


x

P a g e 53 | 57
TP 14. Intégration numérique (série de Riemann, Trapèze, Simpson, …)
Sol 14.
 Calcul d’intégrale utilisant la série de Riemann
1. function If=SmRiemann(f,a,b,n)
2. % f=inline('x^2-x+2')
3. x=linspace(a,b,n+1);
4. If=0;
5. h=(b-a)/n;
6. for i=1:n
7. If=If+h*f(x(i));
8. end
9. I=subs(int(sym('x^2-x+2'),0,1));
10. disp(['L''integral exact = ',num2str(I)])
11. disp(['L''integral de Riemann =
',num2str(If)])
12. end

 La méthode de Trapèze
1. function [Intf]=IntTrapez(f,I,n)
2. % f=inline('log(x)/(x^2+1)');
3. % I=[1,3]
4. x=linspace(I(1),I(2),n);
5. h=((I(2)-I(1))/(n-1));
6. Intf=0;
7. for i=1:n-1
8. Intf=Intf+(h/2)*(f(x(i))+f(x(i+1)));
9. end

On peut déclarer une seule fonction qui calcule l’intégral approché par la
méthode de Trapèze et la série de Riemann au même temps :
1. function [ItR,ItT]=IntegApp(f,a,b,n)
2. h=(b-a)/(n-1);

3. ItR=0;ItT=0;

4. for i=1:n

5. ItR=ItR+(h*f(a+i*h));
6. ItT=ItT+(h/2)*(f(a+(i+1)*h)+f(a+i*h));
7. end

On propose deux méthodes de comparaison


1. %% Méthode 1
2. figure(1)
3. for n=[5,10,15,20,50,100,200,500]

P a g e 54 | 57
4. [R,T]=IntegApp(f,1,3,n);
5. subplot(2,1,1)
6. hold on
7. plot(n,R,'b*-')
8. plot(n,T,'ro-')
9. legend('Trapèze','Riemann')
10. title('Integral approché')
11. hold off
12. subplot(2,1,2)
13. hold on
14. plot(n,abs(R-T),'d')
15. legend('Er=| I_{Trapèze}-I_{Riemann} |')
16. title('Erreur')
17. hold off
18. end

1. %% Méthode 2
2. i=1;
3. N=[5,10,15,20,50,100,200,500];
4. a=1;b=3;
5. f=inline('log(x)/(1+x^2)');
6. for n=N
7. [ItR(i),ItT(i)]=IntegApp(f,a,b,n);
8. Er(i)=abs(ItR(i)-ItT(i));
9. i=i+1;
10. end
11. figure(2)
12. subplot(2,1,1)
13. hold on
14. plot(N,ItT,'ro-')
15. plot(N,ItR,'b*-')
16. legend('Trapèze','Riemann')
17. title('Integral approché')
18. hold off
19. subplot(2,1,2)
20. plot(N,Er,'ob-')
21. legend('Er=| I_{Trapèze}-I_{Riemann} |')
22. title('Erreur')

P a g e 55 | 57
La comparaison avec l’intégral exact nécessite un rappel sur le calcul
symbolique, pour cela on donne juste les commandes avec lesquelles on
𝑙𝑛(𝑥)
calcule l’intégral de la fonction 𝑓(𝑥) = sur l’intervalle [1,3] :
𝑥2
» syms x
» f=log(x)/x^2;
» int(f,1,3)
2/3 - log(3)/3
» subs(ans)
0.3005

On peut calculer l’intégral approché par la méthode de Trapèze utilisant la


commande prédéfinie sur Matlab
» t=1:0.1:3;
» trapz(t,subs(f,t))
0.2996

P a g e 56 | 57

Vous aimerez peut-être aussi