Vous êtes sur la page 1sur 18

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

Travaux pratiques Scilab N◦ 0


Familiarisation avec Scilab

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.

Exercice 1 On note u, v et w les vecteurs suivants


u = (1, −1, 2)T , v = (10, −1, 3)T , w = (5, −1, 4)T .
1. Calculer 3u, kuk2 , 2u − v + 5w, k2u − v + 5wk1 , kw − 4vk∞ .
2. Déterminer l’angle formé par les vecteurs v et w.

Exercice 2 On note u et v les nombres complexes


u = 11 − 7i, v = −1 + 3i.
1. Calculer les modules de u et de v, les produits uv̄ et vū, la partie réelle et la partie
imaginaire de u3 + v 2 .
2. On pose  
u v
A= .
ū v̄
Calculer AA∗ et A∗ A.

Exercice 3 On définit les vecteurs u1 , u2 , u3 et u4 de R5 par


       
1 0 2 3
 −3  1  −5   4 
       
u1 =  3  , u2 =  2  , u3 =  −1  , u4 = 
     
 5 .

 5  4  −6   −2 
4 3 1 0
Soit A la matrice dont les colonnes sont formées des vecteurs u1 , . . . , u4 . Quel est le rang de
A ? Même question si on remplace u4 par le vecteur (−3, 11, 4, 13, 4)T . Déterminer le noyau
de A.

Exercice 4 On note A, B et C les matrices suivantes


 
1 3 2    
 −5
A=
3 1   , B = 1 −2 5 , C = 10 −5 .
 −10 0 3  6 1 −1 3 1
1 0 −2

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

Que font les instructions suivantes

3*A; A.*B; A./B; A.^B; cos(A); exp(B); C=[A B]; D=[A,B]; E=[A;B];

Exercice 6 Pour chacune des matrices


   
1 2 3 .75 0. .25
A1 =  3 2 1  , A2 =  0. 1. 0.  ,
4 2 1 .25 0. .75
   
.375 0 −.125 −.25 0. −.75
A3 =  0 .5 0  , A4 =  0. 1. 0.  ,
−.125 0 .375 −.75 0. −.25
calculer Ani , pour n = 1, 2, 3 . . . Que vaut lim An ?
n→+∞

Exercice 7 Soient A et B les matrices


 
1 3 2  
 −5 5 1  1 −2 5 7
A=  −10 0 3  , B = 6 1 −1 3 .
  
1 −3 4 2
1 1 −2

1. On note u la deuxième colonne de A et v la dernière ligne de B, déterminer la matrice


uv.
2. On note C la matrice obtenue à partir de la matrice A en remplacant u par −u,
déterminer C.
3. On pose C = AB. Que font les instructions suivantes
x=A(3); y=B(4); x*y
C(2:3,1:3)
C(:)
4. Que font les instructions suivantes

2
E=A(2:3,1:3)
find(E>0)
if find(E>0) then s=1 end;

Exercice 8 Que font les instructions suivantes

for i=1:3:11, i, end;


u=[1,4,7,10];
for i=u, i, end;
v=1:3:11;
for i=v, i, 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

Que font les instructions suivantes

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

Corrigé des travaux pratiques N◦ 0

Corrigé 1 On commence par définir les vecteurs u, v et w

-->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. !

Corrigé 3 On définit les vecteurs u1, u2, u3 et u4 par

-->u1=[1; -3; 3; 5; 4];


-->u2=[0; 1; 2; 4; 3];
-->u3=[2; -5; -1; -6; 1];
-->u4=[3; 4; 5; -2; 0];

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.

Corrigé 4 On définit les trois matrices A, B et C

-->A=[1, 3, 2; -5, 3, 1; -10, 0, 3; 1, 0, -2];


-->B=[1,-2, 5; 6, 1, -1];
-->C=[10, -5 ; 3, 1];

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. !

2. La fonction eye(n,m) (ou eye(A)) renvoie une matrice de taille n × m (dimensions de


A) ayant des 1 sur sa diagonale et 0 ailleurs. eye(n,n) désigne donc la matrice unité
In .
-->D=eye(2,2)-2*B*B’
D =
! - 59. 2. !
! 2. - 75. !
3. Les matrices A et B ne sont pas carrées, les matrices C et D sont inversibles et la
matrice AAT est singulière puisque
-->det(C)
ans =
25.
-->det(D)
ans =
4421.
-->det(A*A’)
ans =
9.451E-12
4. Les matrices C et D sont donc inversibles, leur inverse est calculée par la fonction inv.
Ce qui surprend, c’est que Scilab définit l’inverse de la matrice AAT qui pourtant
est une matrice singulière.
-->inv(C)
ans =
! .04 .2 !
! - .12 .4 !
-->inv(D)
ans =
! - .0169645 - .0004524 !
! - .0004524 - .0133454 !
-->inv(A*A’)
ans =
1.0E+14 *
! 2.7520981 - 2.7520981 2.1045456 4.5328675 !
! - 2.7520981 2.7520981 - 2.1045456 - 4.5328675 !
! 2.1045456 - 2.1045456 1.6093584 3.4663104 !
! 4.5328675 - 4.5328675 3.4663104 7.4658993 !
Si on effectue le produit des matrices A*A’ et inv(A*A’), on n’obtient pas la matrice
identité. À méditer.
-->inv(A*A’)*A*A’

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. !

La matrice C est obtenue par concaténation des matrices A et B : la première ‘colonne’ de


C est égale à A et la deuxième ‘colonne’ de C est égale à B. Les matrices C et D sont les
mêmes. La matrice E est aussi obtenue par concaténation des matrices A et B : la première
‘ligne’ de E est égale à A et la deuxième ‘ligne’ de E est égale à B.

Corrigé 6 Pour la matrice A1

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. !

Un moyen compact d’écrire la boucle

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’])

Comparons les différents appels de la fonction sodipr

-->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’])

L’appel de cette fonction se fait comme suit

-->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.

Noter que pour une matrice X de taille n × m la commande size(X,1) renvoie n et la


commande size(X,2) renvoie m.

Corrigé 11 Autre exemple de fonction ‘in-line’

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. !

On peut écrire la fonction tronque de façon plus concise

deff(’[A]=tronque(A)’,[’u=find(A>0)’,’A(u)=0’])

Encore plus concis !

deff(’[A]=tronque(A)’,[’A(find(A>0))=0’])

Corrigé 12 On va modifier la fonction indices en

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

function [args1,...,argsn] = toto(arge1,...,argen)

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