Intro-Maple 210211
Intro-Maple 210211
Intro-Maple 210211
⃝M.W.
c 2009/2010 révisé en septembre 2010.
1
2
π
Maple permet également la manipulation des nombres complexes. Le nombre
dont le carré est −1 est codé par I et l’on dispose des outils pour calculer les
parties réelles et imaginaires (Re et Im), le modules et un argument (abs et
argument). Le logiciel effectue aussi les calculs algébriques usuels dans C.
> is(a,complex);
true
> z:= 2+3*I;
z := 2 + 3 i
> Re(z); Im(z);
2
3
> 1/z;
2/13 − 3/13 I
> abs(z);
√
13
> conjugate(z); argument(z);
2 − 3I
arctan (3/2)
> restart;
> is(A,real);
false
A priori, une lettre non affectée n’est pas considérée comme un nombre.
Mais il est possible de le supposer pour faire certains calculs. On utilise alors
la fonction assume. (Le verbe anglais to assume se traduit par supposer en
français.)
Lorsqu’on fait une supposition sur une lettre, celle-ci sera suivie d’un tilde
pour rappeler ce fait. On peut supprimer les tildes ainsi :
> interface(showassumed=0);
> A;
A
ou les remplacer par une phrase de rappel ainsi :
> interface(showassumed=2);
> A;
A
with assumptions on A
En soit les séquences sont d’un usage réduit. Pour manipuler des listes ou
des ensembles (dans le sens du langage mathématique) d’objets, on utilise
les listes et les ensembles (dans le sens de Maple).
Une liste est une séquence entre crochets. Les objets d’une liste sont or-
donnés et numérotés. On peut ainsi disposer de chaque élément de la liste.
La numérotation commence à 1.
> lst:= [sequ];
lst := [x, 1, a, b, 17, a, 2, 4]
> lst[1];
x
> lst[3];
a
Un ensemble est une séquence entre accolades. Il permet de coder les en-
sembles mathématiques. Les objets ne sont pas répétés.
> ens:={sequ};
ens := {1, 2, 4, 17, x, a, b}
On peut encore disposer de chaque élément à l’aide de la grammaire ens[1].
Néanmoins il faut faire attention car l’ordre de l’ensemble que l’on construit
peut être changé par le logiciel comme c’est le cas dans l’exemple.
> ens[1];
1
Pour revenir à une séquence à partir d’un ensemble ou d’une liste, on peut uti-
liser la fonction op alors que la fonction nops donne le nombre d’éléments de
la liste ou de l’ensemble. Cette dernière ne fonctionne pas pour les séquences.
> op(lst);
x, 1, a, b, 17, a, 2, 4
> op(ens);
1, 2, 4, 17, x, a, b
> nops(lst);
8
> nops(ens);
7
> nops(sequ);
Error, wrong number (or type) of parameters in function nops
7
f := p 7→ (p + 2) (p − 1) + p2 + 4 p + 4
> simplify(f);
f
Pour dériver une expression, on utilisera diff (il faut préciser la variable).
Pour dériver une fonction, on utilisera D. Dans le premier cas, la sortie sera
une expression, dans le second, une fonction :
> da:= diff(a,x);
da := 4 x + 5
> df:=D(f);
df := p 7→ 5 + 4 p
0
-1 -0,5 0 0,5 1
x
on constate que Maple n’a pas remplacé n par 7 dans l’expression. Pour
faire cela, il faut soit écrire u[7]:= subs(n=7,u[n]), soit définir la suite
comme une fonction v de variable n :
> v:= n->n^2/ 2; v(7);
v := n 7→ 1/2 n2
49
2
> u[0]:= 0;
u0 := 0
> for i from 0 to 5 do u[i+1]:= u[i]-1/( u[i]^2+ 1) ; od;
u1 := −1
u2 := −3/2
u3 := − 47
26
u4 := − 153171
75010
u5 := − 2181880029128410
4877459662937311
u6 := − 149639572447262363959913985640787693255463671331
62293140063181551861741205054931715130644004610
Il est possible d’introduire un test d’arrêt qui fera achever les calculs avant
la dernière valeur de l’itération. La grammaire est alors :
for l’indice from la première valeur de l’indice to sa dernière valeur
while un test qui s’il est vérifié fait continuer la boucle do la ou les com-
mandes à itérer od;
Par exemple, pour la suite précédente, si l’on souhaite calculer les premiers
termes tant qu’ils sont supérieurs à −2, on modifiera la boucle ainsi :
> for i from 0 to 5 while u[i]> -2 do
> u[i+1]:= u[i]-1/(u[i]^2+1); od;
u1 := −1
u2 := −3/2
u3 := − 47
26
u4 := − 153171
75010
> y[0]:= 1;
y0 := 1
> for i from 0 to 5 do if y[i] < 3 then y[i+1]:=y[i]^2+3;
> else y[i+1]:=y[i]-1; fi; od;
> seq( y[i], i=0..6);
1, 4, 3, 2, 7, 6, 5
Fonction solve. L’une des fonctions de Maple la plus usitée est solve
qui permet de résoudre des équations et parfois des inéquations. Elle prend
en arguments l’équation à résoudre sous forme d’une égalité d’expressions (ou
d’un expression, dans quel cas =0 est sous-entendu) et de la variable pour
laquelle on demande de résoudre. Quand l’expression ne comporte qu’une
inconnue il est superflu de la préciser. Les trois commandes suivantes donnent
le même résultat.
Procédures. Une procédure n’est rien d’autre qu’une fonction qui nécessite
plusieurs lignes de commandes. Sa grammaire est la suivante :
nom:= proc( la ou les variables )
local les variables locales;
global les variables globales;
Les commandes successives en fonction des variables
end;
La dernière commande constitue la sortie de la procédure. Par exemple la
procédure suivante n’est rien d’autre que la fonction f déjà définie plus haut :
> f:= proc(x) x^2 + 2 end;
f := proc(x) x2 + 2 end proc;
La procédure suite suivante calcule les n + 1 premiers termes de la suite
(yn ) définie ci-dessus.
> suite:= proc(n)
> local i,y;
> y[0]:= 1;
> for i from 0 to n do
> if y[i] < 3 then y[i+1]:=y[i]^2+3; else y[i+1]:=y[i]-1; fi;
> od;
> [seq( y[i], i=0..n)];
> end;
f := proc(n)local i, y; y[0] := 1; for i from 0 to n do if y[i] < 3
then y[i1] := y[i]2 + 3 else y[i1] := y[i] − 1 end if; end do;
[seq(y[i], i = 0..n)]end proc;
14
Pour calculer les six premiers termes, il suffit d’appliquer la fonction suite
à 5 :
> suite(5);
[1, 4, 3, 2, 7, 6]
Expliquons maintenant la différence entre les variables locales et les variables
globales. Une procédure peut utiliser un certain nombre de variables auxi-
liaires qui servent à effectuer les calculs. Il faut déclarer toutes les variables
que l’on utilise en début de procédure. Si l’on les déclare avec local, les noms
utilisés le seront uniquement ≪ à l’intérieur ≫ de la procédure et cela n’affec-
tera pas les mêmes noms éventuellement utilisés avant et après l’utilisation
de la fonction définie par la procédure. En revanche, quand on les déclare en
global, les noms de variables utilisés seront affectés également dans le reste
de la feuille de calcul. Donnons un exemple. La procédure suivante calcule les
premiers termes de la suite définie par u0 = 1 et un+1 = u2n + u1n . Il est bien
√
connu que cette suite tend vers 2. La procédure d’argument√ε calculera les
termes de la suite jusqu’au premier terme un vérifiant |un − 2| < ε.
> restart;
> racine:= proc(epsilon) local i,u,k;
> u[0]:=1;
> for k from 0 to 10
> while abs( evalf(u[k]-sqrt(2)) ) > epsilon
> do u[k+1]:= u[k]/2+1/u[k]; od;
> [seq(u[i], i=0..k)];
> end;
racine :=proc(ϵ) local i, u, k; u[0] := 1; for k from 0 to 10 while
ϵ < abs(evalf (u[k] − sqrt(2))) do u[k1] := 1/2 ∗ u[k] + u[k]−1 end do;
[seq(u[i], i = 0..k)] end proc;
> racine(1/100000);
[1, 3/2, 17 577
12 , 408 ]
0,5
0
-1 -0,5 0 0,5 1
-0,5
-1
16
0,9
0,8
y
0,7
0,6
0,5
-1 -0,5 0 0,5 1
x
Pour tracer les graphes de deux fonctions sur le même dessin, on remplace
l’expression de la fonction à tracer par un ensemble d’expressions :
> plot({x^2, x^3}, x=-1..1);
0,5
0
-1 -0,5 0 0,5 1
x
-0,5
-1
Une autre possibilité, pratique lorsque les domaines de définition sont différents,
consiste à utiliser display de la bibliothèque plots. Il faut dans ce cas rem-
placer ; par : à la fin de l’assignation de la sortie du graphique pour éviter
une pollution de l’écran par les données numériques du tracé.
> with(plots):
> A:=plot( x^2 , x=-1..1, color=red):
> B:= plot( x^3 , x=-1/2..1/2, color=blue): display(A,B);
0,8
0,6
0,4
0,2
0
-1 -0,5 0 0,5 1
x
0,5
0
-1 -0,5 0 0,5 1
-0,5
-1
1 2 3
A :=
4 5 6
7 8 9
On peut aussi donner en argument la dimension de la matrice et la liste des
coefficients dans l’ordre de lecture de l’écriture latine :
> A:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
1 2 3
A :=
4 5 6
7 8 9
Lorsqu’on remplace la liste des coefficients par une fonction à deux variables
f , on obtient :
> A:= matrix(3,3,f);
f (1, 1) f (1, 2) f (1, 3)
f (2, 1) f (2, 2) f (2, 3)
f (3, 1) f (3, 2) f (3, 3)
Cela a son intérêt lorsque les coeffients ai,j de la matrice sont donnés en
fonction des indices i et j. Dans notre cas, nous pouvons définir une fonction
à deux variables h :
> h:=(i,j)->3*(i-1)+j;
h := (i, j) 7→ 3i − 3 + j
La fonction h est définie pour donner :
> A:= matrix(3,3,h);
1 2 3
A :=
4 5 6
7 8 9
Enfin, la fonction diag permet de construire une matrice diagonale (même
diagonale par blocs) à partir de la séquence de ses éléments diagonaux. C’est
par exemple très utile pour définir la matrice identité !
> J:=diag(1,2,3);
1 0 0
J := 0 2 0
0 0 3
19
> evalm(V);
[1, 2, 3]
La commande matrix permet également de définir une ≪ matrice incon-
nue ≫ de dimension fixée :
> M:=matrix(3,3);
M := array(1..3, 1..3, [])
> evalm(M);
M1,1 M1,2 M1,3
M2,1 M2,2 M2,3
M3,1 M3,2 M3,3
A2
A−1
Evidemment, il faut évaluer et que la matrice soit inversible pour les puis-
sances négatives :
> evalm(A^2);
30 36 42
66 81 96
102 126 150
> evalm(A^(-1));
Error, (in inverse) singular matrix
> evalm(B^(-1));
1 −1 1
2 4 4
3 −5
2 1
4 4
3 −1 −3
2 4 4
La multiplication des matrices s’effectue à l’aide du symbole &* :
> evalm(A&*B);
17 10 −15
41 25 −36
65 40 −57
Les règles usuelles de calcul dans l’anneau des matrices sont comprises par
le logiciel :
> evalm(A^2- 2*(A-B)&*B );
4 24 64
−10 47 154
−22 54 258
Nous citons encore les commandes multiply et inverse qui permettent
également de multiplier et d’inverser sans avoir à évaluer en plus.
> multiply(A,B);
17 10 −15
41 25 −36
65 40 −57
> inverse(A);
Error, (in inverse) singular matrix
22
> inverse(B);
1 −1 1
2 4 4
3 −5
2 1
4 4
3 −1 −3
2 4 4
Les noms des trois commandes utilisées ci-après parlent d’eux-mêmes.
> transpose(A);
1 4 7
2 5 8
3 6 9
> det(A);
0
> trace(A);
15
> rank(A);
2
Le noyau de la matrice est calculé à l’aide de la fonction kernel. Celle-
ci rend un ensemble de vecteurs constituant une base du noyau. Ici, le
nombre de vecteurs est bien 1, la dimension attendue après le calcul du
rang.
> kernel(A);
{[1, −2, 1]}
L’image de l’application associée à la matrice est l’espace engendré par
ses colonnes. La commande colspace en donne une base :
> colspace(A);
{[1, 0, −1], [0, 1, 2]}
De même rowspace donne une base de l’espace engendré par les lignes
de la matrice :
> rowspace(A);
{[1, 0, −1], [0, 1, 2]}
La matrice B est de déterminant non nul et donc son noyau sera réduit
à {0} et son image égale à l’espace R3 . Jugez de la cohérence des calculs
suivant :
> det(B);
−4
> kernel(B); colspace(B);
{}
{[1, 0, 0], [0, 1, 0], [0, 0, 1]}
Diagonalisation
Nous disposons de tous les outils pour étudier les éléments propres de la
matrice A. Par exemple pour calculer ses valeurs propres il suffit de construire
la matrice identité I et de calculer les racines de det(A − xI).
> Id:=diag(1,1,1);
1 0 0
Id := 0 1 0
0 0 1
24
> eigenvectors(A);
[ √ { √ √ }]
[0, 1, {[1, −2, 1]}], 15
2
+ 3
2
33, 1, [−1/2 + 3
22
33, 1/4 + 3
44
33, 1] ,
[ 15 3 √ { 1 √ √ ]}
2
− 2 33, 1, [− 2 − 22 33, 4 − 44 33, 1 ]
3 1 3
On remarque, que lorsque la matrice est ≪ trop grosse ≫ pour être affichée
sous forme de tableau, le logiciel l’écrit sous forme de liste de lignes. On peut
vérifier que cette formule est valable pour n = 1 :
> simplify(subs(n=1,evalm(M)) );
1 2 3
4 5 6
7 8 9
> eigenvalues(B);
−1, 2, 2
26