Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
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
3. v1=v./n;
4. v2=v.^2;
5. A=diag(v1,-1)+diag(v2,1);
6. end
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
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
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
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
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)
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)
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 𝛼 𝑛 𝛼 𝑛
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
❖ 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
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
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
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
P a g e 56 | 57