Professional Documents
Culture Documents
Note : l’objet de cette première séance de TP (numéro 0) est de vous familiariser avec le
logiciel Scilab. Il n’y a pas beaucoup d’intérêt à faire les calculs proposés à la main. Ceux
qui connaissent déja le logiciel Scilab (ou Matlab ou Octave) peuvent passer directement
à la feuille de TP numéro 1.
1
1. Calculer les matrices AB, BA et AB T .
2. Calculer les matrices D = I2 − BB T .
3. Calculer les déterminants des matrices A, B, C, D et E = AAT .
4. Calculer les inverses des matrices A, B, C, D et E = AAT .
5. Calculer les valeurs propres de la matrice E. Quel est le rayon spectral de E ?
6. Déterminer les vecteurs propres de la matrice E.
Exercice 5 On pose
1 −1 7 3 −2 −1
A = −4 2 11 , B = 7 8 6 .
8 0 3 5 1 3
3*A; A.*B; A./B; A.^B; cos(A); exp(B); C=[A B]; D=[A,B]; E=[A;B];
2
E=A(2:3,1:3)
find(E>0)
if find(E>0) then s=1 end;
Exercice 9 On pose
1 −1 7 3 −2 −1
A = −4 2 11 , B = −7 8 6 .
8 0 3 −5 1 3
v=[1, 2, 4, 7];
A(v)=A(v) + 0.01;
B(v)=abs(B(v));
Exercice 10 Ecrire une fonction qui, étant donnés un entier k et une matrice X, calcule
les entiers i et j tels que X(i, j) = X(k).
Exercice 11 Ecrire une fonction qui remplace les coefficients ai,j strictement positif d’une
matrice par 0 et laisse inchangés les autres.
Exercice 12 1. Ecrire une fonction qui renvoie les indices i et j des éléments Xi,j d’une
matrice X de taille n × m, qui sont plus grands qu’une valeur donnée a.
2. Ecrire une fonction qui renvoie les indices i et j des éléments Xi,j qui sont compris
entre une valeur a et une valeur b.
Exercice 13 Les programmes suivants doivent être écrits dans un fichier et exécutés à
partir de ‘fenêtre’ Scilab.
1. Ecrire une fonction qui renvoie un réel a = |ai,j | tel que |ai,j | = max |al,k |. Les nombres
l,k
complexes al,k sont les composantes d’une matrice A de taille m × n envoyée en argu-
ment d’entrée de la fonction.
2. Ecrire une fonction qui renvoie des indices i et j correspondants au a précédent.
3
4
Université Pierre et Marie Curie Bases des méthodes numériques
Master de Sciences & Technologies MM006
Mention Mathématiques & Applications Cours : E. Godlewski et E. Trélat
Année universitaire 2011–2012 Travaux dirigés et télé-enseignement : C. Audiard
-->u=[1;-1; 2]
u =
! 1. !
! - 1. !
! 2. !
-->v=[10;-1; 3];
-->w=[5;-1; 4];
Noter que le résultat d’une instruction terminée par ; n’est pas affiché à l’ecran.
1. Noter que norm(u) et norm(u,2) renvoient la même valeur kuk2
-->3*u
ans =
! 3. !
! - 3. !
! 6. !
-->norm(u)
ans =
2.4494897
-->2*u-v+5*w
ans =
! 17. !
! - 6. !
! 21. !
-->norm(ans,1)
ans =
44.
-->norm(w-4*v,’inf’)
ans =
35.
< v, w >
2. Rappelons que cos(v, w) = . La matrice tranposée d’une matrice A est ob-
kvk2 kwk2
d
tenue par A.’, la matrice adjointe (conjuguée, transposée) est notée A’. Le produit
scalaire < v, w > des deux vecteurs est donc égal à (w’*v),
-->(w’*v)/norm(v)/norm(w)
ans =
.9268716
5
La fonction réciproque de cos est notée acos. L’angle recherché vaut donc (en radians)
-->acos(ans)
ans =
.3848052
Soit, en degrés,
-->ans*180/3.14
ans =
22.058897
Corrigé 2 On définit les deux nombres u et v. Se servir de l’aide de Scilab pour apprendre
a noter un nombre complexe.
-->u=11-7*%i;v=-1+3*%i;
1. Le module d’un nombre complexe est donné par la fonction norm (ou la fonction abs),
la fonction conj renvoie le nombre complexe conjugué. Les fonctions imag et real
renvoient respectivement les parties réelles et imaginaires.
-->norm(u)
ans =
13.038405
-->norm(v)
ans =
3.1622777
-->u*conj(u)
ans =
170.
-->u*conj(v)
ans =
- 32. - 26.i
-->v*conj(u)
ans =
- 32. + 26.i
-->real(u^3+v^2)
ans =
- 294.
-->imag(u^3+v^2)
ans =
- 2204.
2. A=[u,v;conj(u),conj(v)]
A =
! 11. - 7.i - 1. + 3.i !
! 11. + 7.i - 1. - 3.i !
-->A*A’
ans =
!180. 64. - 160.i!
6
!64. + 160.i 180. !
-->A’*A
ans =
! 340. - 64. !
! - 64. 20. !
La matrice A peut être définie par l’instruction A=[u1,u2,u3,u4] qui ‘concatene’ les quatre
matrices. Les fonctions rank(X) renvoie le rang de la matrice X, c’est-à-dire la dimension de
l’image de X, vue comme application linéaire. On obtient les résultats suivants.
-->rank(A)
ans =
4.
-->u4=[-3; 11 ;4 ;13 ;4];
-->A=[u1,u2,u3,u4]
A =
! 1. 0. 2. - 3. !
! - 3. 1. - 5. 11. !
! 3. 2. - 1. 4. !
! 5. 4. - 6. 13. !
! 4. 3. 1. 4. !
-->rank(A)
ans =
3.
1. -->A*B
!--error 10
inconsistent multiplication
-->B*A
!--error 10
inconsistent multiplication
-->A*B’
ans =
! 5. 7. !
7
! - 6. - 28. !
! 5. - 63. !
! - 9. 8. !
8
ans =
! .9375 1.6875 .375 .28125 !
! .1875 .46875 1.78125 - .65625 !
! .0625 1.34375 1.40625 .125 !
! .375 2. - 1.375 1.625 !
5. La fonction spec(X) renvoie un vecteur dont les composantes sont formées des valeur
propres de la matrice X.
-->spec(A*A’)
ans =
! 0. !
! 5.2695581 !
! 18.824461 !
! 138.90598 !
Le rayon spectral de la matrice X peut être calculé par norm(spec(X),’inf’)
-->norm(ans,’inf’)
ans =
138.90598
6. Pour une matrice diagonalisable X, l’instruction [D,P]=bdiag(X) renvoie une matrice
diagonale D qui contient les valeurs propres de la matrice X et une matrice P contenant
les vecteurs propres de X, on a X = P DP −1 . On traitera, dans un autre exemple, des
matrices qui ne sont pas diagonalisables.
-->[D,P]=bdiag(E)
P =
! .8469760 .4344715 - .3063600 - .0031121 !
! .4525418 - .4344715 .6303149 .4573221 !
! - .2502810 .3322429 - .229698 .8798937 !
! - .1232760 .7156002 .675341 - .1289727 !
D =
! 18.824461 0. 0. 0. !
! 0. 0. 0. 0. !
! 0. 0. 5.2695581 0. !
! 0. 0. 0. 138.90598 !
Corrigé 5
A=[1, -1, 7; -4, 2, 11; 8, 0, 3];
B=[3, -2, -1; 7, 8, 6; 5, 1, 3];
-->3*A
ans =
! 3. - 3. 21. !
! - 12. 6. 33. !
! 24. 0. 9. !
-->A.*B
ans =
! 3. 2. - 7. !
9
! - 28. 16. 66. !
! 40. 0. 9. !
-->A./B
ans =
! .3333333 .5 - 7. !
! - .5714286 .25 1.8333333 !
! 1.6 0. 1. !
-->cos(A)
ans =
! .5403023 .5403023 .7539023 !
! - .6536436 - .4161468 .0044257 !
! - .1455000 1. - .9899925 !
-->exp(B)
ans =
! 20.085537 .1353353 .3678794 !
! 1096.6332 2980.958 403.42879 !
! 148.41316 2.7182818 20.085537 !
A.*B est une matrice dont l’élement d’indices (i,j) est égal à Ai,j Bi,j . Attention à ne pas
confonde avec la multiplication uselle des matrices A*B. De même A./B (resp. A.^B) est
B
une matrice dont l’élement d’indices (i,j) est égal à Ai,j /Bi,j (resp. Ai,ji,j ). La notation
cos(A) (resp. exp(B)) désigne une matrice dont les éléments sont les cosinus (resp. les
exponentielles) des éléments de la matrice A (resp. B). Il s’agit de notations propres à
Scilab, à ne pas confondre avec les notations mathématiques. Plus généralement, si f est
une fonction définie dans Scilab, l’instruction f(X) où X est une matrice, définit une
matrice dont les composantes sont obtenues en appliquant f aux composantes de X
(f (X))i,j = f (Xi,j ).
Noter enfin que fonction exponentielle d’une matrice X, qui est défini mathématiquement
+∞
X Xk
par eX = est notée par Scilab expm(X).
k=0
k!
-->C=[A B]
C =
! 1. - 1. 7. 3. - 2. - 1. !
! - 4. 2. 11. 7. 8. 6. !
! 8. 0. 3. 5. 1. 3. !
10
A1=[1,2,3;3,2,1;4,2,1];
A1*A1
A1*ans
A1*ans
la limite est (semble être !) une matrice dont tous les coefficients tendent vers +∞. On peut
aussi utiliser la fonction puissance, par exemple calculer A1^100.
Pour la matrice A2 on obtient
A2=[.75,0,.25;0,1,0;.25,0,.75]
A2*A2
A2*ans
A2*ans
et la limite est la matrice
! .5 0. .5 !
! 0. 1. 0. !
! .5 0. .5 !
Pour la matrice A3 on obtient
A3=[.375,0,-.125;0,.5,0;-.125,0,.375]
A3*A3
A3*ans
A3*ans
la limite étant la matrice nulle.
Pour la matrice A4 , la ‘limite’ alterne entre la matrice
ans =
! - .5 0. - .5 !
! 0. 1. 0. !
! - .5 0. - .5 !
et la matrice
-->A4*ans
ans =
! .5 0. .5 !
! 0. 1. 0. !
! .5 0. .5 !
Remarque : chacune des matrices Ai est diagonalisable et s’écrit Ai = Pi Di Pi−1 . Les puis-
sances de Ai sont donc égales à
k
λi,1 0
Aki = Pi Dik Pi−1 = Pi 0 λki,2 0 Pi−1 .
0 0 λki,3
Le comportement, à l’infini, des puissances des quatre matrices s’explique en étudiant les
valeurs propres de ces matrices :
11
– Le rayon spectral de la matrice A1 est > 1, il existe donc une valeur propre λ1,j de module
> 1 et |λk1,j | tend vers +∞.
– Le rayon spectral de la matrice A3 est lui < 1. Pour tout j, |λk2,j | tend vers 0, il en est de
même de Ak3 .
– Les valeurs propres de A2 sont 1/2, 1 et 1, on en déduit que D2k tend vers la matrice
diagonale diag(0, 1, 1).
– Les valeurs propres de A4 sont −1, 1/2 et 1. La présence de la valeur propre −1 explique
les ‘oscillations’ de la matrice Ak .
Corrigé 7
A=[1, 3, 2; -5, 5, 1; -10, 0, 3; 1, 1, -2] B=[1, -2, 5, 7; 6, 1, -1, 3;
1, -3, 4, 2]
1. u=A(:,2)
v=B(3,:)
-->u*v
ans =
! 3. - 9. 12. 6. !
! 5. - 15. 20. 10. !
! 0. 0. 0. 0. !
! 1. - 3. 4. 2. !
2. C=A
C(:,2)=-u
3. On peut accéder à un élément de la matrice X en désignant ses deux indices, comme
dans X(i,j) ou un seul indice comme dans X(k), la matrice X est alors parcourue
colonne par colonne. On a donc si X est une matrice de taille n × m, k = i + (j − 1)n.
-->x=A(3)
x =
- 10.
-->y=B(4)
y =
- 2.
-->x*y
ans =
20.
X(i1:i2,j1:j2) renvoie une matrice dont les éléments sont les éléments de la matrice
X dont l’indice de ligne est compris entre i1 et i2 et l’indice de colonne est compris
entre j1 et j2. La commande X(:,j1:j2) renvoie les colonnes de j1 à j2. De même,
la commande X(i1:i2,:) renvoie les lignes de i1 à i2.
-->C=A*B
C =
! 21. - 5. 10. 20. !
! 26. 12. - 26. - 18. !
! - 7. 11. - 38. - 64. !
! 5. 5. - 4. 6. !
12
-->C(2:3,1:3)
ans =
! 26. 12. - 26. !
! - 7. 11. - 38. !
-->C(:)
ans =
! 21. !
! 26. !
! - 7. !
! 5. !
! - 5. !
! 12. !
! 11. !
! 5. !
! 10. !
! - 26. !
! - 38. !
! - 4. !
! 20. !
! - 18. !
! - 64. !
! 6. !
4. E=A(2:3,1:3)
find(X>a) renvoie l’indice des éléments de la matrice X qui sont plus grands que a.
find(E>0)
if find(E>0) then s=1, end;
Corrigé 8 Il s’agit de trois manières d’effectuer une boucle for. Toutes produisent le résultat
suivant
i =
1.
i =
4.
i =
7.
i =
10.
Corrigé 9
-->A=[1, -1, 7; -4, 2, 11; 8, 0, 3]
A =
! 1. - 1. 7. ! ! - 4. 2. 11. ! ! 8. 0. 3. !
-->B=[3, -2, -1; -7, 8, 6; -5, 1, 3]
B =
13
! 3. - 2. - 1. !
! - 7. 8. 6. !
! - 5. 1. 3. !
-->v=[1, 2, 4, 7]
v =
! 1. 2. 4. 7. !
La commande A(v)=A(v) + 0.01 est équivalente à la boucle
for i=v,
A(i)=A(i)+0.01
end
-->A(v)=A(v) + 0.01
A =
! 1.01 - .99 7.01 !
! - 3.99 2. 11. !
! 8. 0. 3. !
for i=v,
B(i)=abs(B(i))
end
est
-->B(v)=abs(B(v))
B =
! 3. 2. 1. !
! 7. 8. 6. !
! - 5. 1. 3. !
Corrigé 10 On peut définir une fonction ‘in-line’, la syntaxe est alors la suivante
deff(’[args1,...,argsm]=toto(arge1,...,argen)’,[’instr1;...;instrp’])
où
toto est le nom de la fonction,
arge1,...,argen sont les n arguments d’entrée,
args1,...,argsm sont les m arguments de sortie,
instr1,...,instrp sont les différentes instructions.
Voici l’exemple d’une fonction qui calcule les somme, produit et difference de deux scalaires
deff(’[s,d,p]=sodipr(a,b)’,[’s=a+b’,’d=a-b’,’p=a*b’])
-->x=3;y=5;
-->[c,d,e]=sodipr(x,y);
-->c,d,e
c =
14
8.
d =
- 2.
e =
15.
-->[f,g]=sodipr(x,y);
-->c,d
c =
8.
d =
- 2.
-->h=sodipr(x,y)
h =
8.
-->sodipr(x,y)
ans =
8.
Le premier appel affecte respectivement à c,d,e le contenu des arguments de sortie s,d,p.
Le deuxième (resp. troisième) appel n’affecte que les deux premiers (resp. premier) argu-
ments. Quant au dernier appel il affecte la valeur de l’argument s à la variable ans.
Retour à l’exercice 10 : Comme (voir corrigé précédent) k=i +(j-1)n, on détermine j-1
comme reste de la division euclidienne de k-1 par n, puis i par i=k-(j-1)n. La fonction
indices definie ci-dessous calcule i et j connaissant k et n. Noter que la fonction int(a)
renvoie la partie entière du réel a si celui-ci est positif. Que fait int(a) pour a<0 ?
deff(’[i,j]=indices(k,A)’,[’n=size(A,1)’,’j= int((k-1)/n)+1’,’i=k-(j-1)*n’])
-->A=[2,-1,3;5,7,0;-3,-5,8;6,2,1]
A =
! 2. - 1. 3. !
! 5. 7. 0. !
! - 3. - 5. 8. !
! 6. 2. 1. !
-->k=5;
-->[i0 j0]=indices(k,A)
j0 =
2.
i0 =
1.
15
deff(’[A]=tronque(A)’,[’u=find(A>0)’,’for i=u, A(i)=0;end;’])
-->A=[1, 3, 2; -5, 5, 1;
-->-10, 0, 3; 1, 1, -2]
A =
! 1. 3. 2. !
! - 5. 5. 1. !
! - 10. 0. 3. !
! 1. 1. - 2. !
-->A=tronque(A)
A =
! 0. 0. 0. !
! - 5. 0. 0. !
! - 10. 0. 0. !
! 0. 0. - 2. !
deff(’[A]=tronque(A)’,[’u=find(A>0)’,’A(u)=0’])
deff(’[A]=tronque(A)’,[’A(find(A>0))=0’])
deff(’[i,j]=indices(k,A)’,[’n=size(A,1)’,’j= int((k-1)/n)+1’,’i=k-(j-1)*n’])
1. La fonction suivante
deff(’[ui,uj]=pgrands(X,a)’,[’v=find(X>a)’, ’[ui,uj]=indices(v,X)’])
retourne deux vecteurs contenant l’un les indices i, l’autre les indices j recherchés.
Exemple
-->A=[2,-1,3;5,7,0;-3,-5,8;6,2,1]
A =
! 2. - 1. 3. !
! 5. 7. 0. !
! - 3. - 5. 8. !
! 6. 2. 1. !
-->a=2.5;
-->[u v]= pgrands(A,a);
-->[u;v]
ans =
! 2. 4. 2. 1. 3. !
! 1. 1. 2. 3. 3. !
2. Suffit dans la définition de pgrands de remplacer find(X>a) par find((X>a)&(X<ba)).
Noter l’opérateur logique &, qui signifie bien sûr ‘et’ (l’opérateur logique ‘ou’ se note
|).
16
Corrigé 13 On va donc écrire les programmes demandés dans un fichier. La syntaxe d’un
tel programme est
Si le fichier contenant la fonction toto s’appelle toto.sci, la fonction toto doit être chargée
(loaded) dans l’environnement de travail par la commande getf(’toto.sci’). Attention :
il est nécessaire de préciser le chemin pour accéder au fichier toto.sci. Dans cet exemple le
fichier en question se trouve dans le même répertoire que Scilab.
1. Voici le contenu du fichier ‘pgm1.sci’
function a = pgrandecompo(A) // note: l’instruction
a=norm(A(1)); // a=max(abs(A))
for i=2:length(A) // suffit pour repondre
if a < norm(A(i)) then // a la question
a= norm(A(i));
end
end
Noter l’utilisation de la commande length, pour une matrice on a
length(A)=size(A,1)*size(A,2). L’appel se fait par
-->A=[2+%i,-1-3*%i,3;5,7-2*%i,0;-3,-5,-8*%i;6,2,1]
A =
! 2. + i - 1. - 3.i 3. !
! 5. 7. - 2.i 0 !
! - 3. - 5. - 8.i !
! 6. 2. 1. !
-->getf(’pgm1.sci’)
-->pgrandecompo(A)
ans =
8.
2. Il suffit de rajouter au fichier ‘pgm1.sci’ (à la suite de la définition de la fonction
pgrandecompo) les deux autres fonctions. pgrandecomoI et indices. Voici le nouveau
contenu du fichier ‘pgm1.sci’
function [a] = pgrandecompo(A)
a=norm(A(1));
for i=2:size(A,1)*size(A,2)
if a < norm(A(i)) then
a= norm(A(i));
end
end
function [i,j]=indices(k,A)
n=size(A,1);
j= int((k-1)/n)+1;
i=k-(j-1)*n;
17
function [a,i,j] = pgrandecompoI(A)
a=norm(A(1));
p=1;
for k=2:size(A,1)*size(A,2)
if a < norm(A(k)) then
a= norm(A(k));
p=k;
end
end
[i,j]=indices(p,A);
Exemple d’appel
-->A=[2+%i,-1-3*%i,3;5,7-2*%i,0;-3,-5,-8*%i;6,2-9*%i,1]
A =
! 2. + i - 1. - 3.i 3. !
! 5. 7. - 2.i 0 !
! - 3. - 5. - 8.i !
! 6. 2. - 9.i 1. !
-->getf(’pgm1.sci’)
-->[a,i,j] =pgrandecompoI(A)
j =
2.
i =
4.
a =
9.2195445
18