Cours Intégré de Maple

publicité
Université Louis Pasteur
L2 MPC/LPA
Cours Intégré de Maple
2007-2008
2
Table des matières
1 Une introduction et sa suite
1.1 Accès . . . . . . . . . . . . .
1.2 Instruction(s), exécution(s) et
1.3 Sauvegarde de fichier . . . . .
1.4 Aide . . . . . . . . . . . . . .
1.5 Quelques suites avec Maple .
.
.
.
.
.
5
5
5
7
7
7
.
.
.
.
.
.
.
.
9
9
11
11
11
12
12
13
14
.
.
.
.
.
.
15
15
15
16
16
17
17
4 Quelques compléments
4.1 Résolution d’équations différentielles . . . . . . . . . . . . . . . . . . . . . . .
4.2 Partiel janvier 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Partiel septembre 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
19
21
23
. . . . . .
résultat(s)
. . . . . .
. . . . . .
. . . . . .
2 Variables, fonctions, tableaux et
2.1 Les variables . . . . . . . . . .
2.2 Les fonctions . . . . . . . . . .
2.2.1 Fonctions et expressions
2.2.2 Procédures . . . . . . .
2.3 Les tableaux . . . . . . . . . .
2.3.1 La commande array . .
2.3.2 Les listes . . . . . . . .
2.4 Boucles et tests . . . . . . . . .
3 Graphiques
3.1 La commande plot . . . . . .
3.1.1 Des fonctions . . . . .
3.1.2 Un ensemble de points
3.1.3 Faire une animation .
3.2 Autres commandes . . . . . .
3.3 Exercices . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
boucles
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
TABLE DES MATIÈRES
Chapitre 1
Une introduction et sa suite
Maple est un logiciel de calcul formel : il peut traiter des données numériques (entier, réels,
complexes...) de précision arbitraire et aussi des données symboliques (polynômes,expressions...).
Ce logiciel est également doté de capacités graphiques.
1.1
Accès
Maple est un logiciel (payant). Il est installé sur un système (linux, mac, windows). Il y a
plusieurs versions ; actuellement la version 11 existe. Sur Univ-R (avez vous un compte ent ?),
il y a (normalement) 2 versions : 7 et 9.5. On préfèrera la version 7 qui est moins lourde. On
y accède en cliquant sur Application pédagogique puis Mathematiques et enfin Maple 7 (s’il y
a écrit Mapple 7, c’est une erreur d’orthographe : Maple vient du Canada et veut dire érable,
dont la feuille est d’ailleurs l’emblême de ce pays ; rien-à-voir avec une pomme, donc ; cliquez
quand même sur l’icône, mais ne faites pas la faute d’orthographe !).
1.2
Instruction(s), exécution(s) et résultat(s)
Après un certain temps, vous voyez apparaı̂tre une interface graphique avec un fichier
nommé Untitled(1) et un curseur qui attend que vous tapiez votre première instruction :
>2+2;
N’oubliez pas le ;, car il signifie la fin de l’instruction et que le résultat sera affiché. Ne rajouter
par l’invite de commande > : il est déjà écrit et correspond à un bloc d’instructions qui est
exécuté dès que l’on appuie sur la touche entree.
A la place du ;, on peut aussi utiliser le :. Dans ce cas l’instruction sera exécutée, mais non
affichée. Cela peut être pratique si l’on ne veut pas que l’ordinateur affiche plein de résultats
intermédiaires qui ne sont pas utiles.
Lorsque l’on appuie sur la touche shift entree, on va à la ligne sans exécuter. Cela permet
d’écrire un bloc d’instructions de manière plus claire et évite de devoir appuyer de nombreuses
fois sur la touche entree pour arriver au résultat final.
Le résultat de la dernière instruction est donné par % et celui de l’avant-dernier résultat est
donné par %% (on peut aussi avoir le résultat de l’avant-avant-dernière opération par %%%).
Pour bien comprendre comment les instructions sont exécutées, écrivez :
5
6
CHAPITRE 1. UNE INTRODUCTION ET SA SUITE
>1:1:
>%+%%;
Vous devez voir affiché 2. Revenez au deuxième bloc et réappuyez sur entree. 3 est alors
affiché. Recommencez un certain nombre de fois. Vous êtes en train d’afficher les nombres
successifs de la suite de Fibonacci définie par
u1 = 1, u2 = 1,
un+1 = un + un−1 ,
n = 2, . . .
Revenez maintenant au premier bloc, appuyez sur entree, puis allez au deuxième bloc et
appuyez sur entree. Quel est le résultat affiché, pourquoi ?
Pour éviter d’avoir à répétér les mêmes instructions, on peut utiliser une boucle
>1:1:for i to 10 do %+%%;od;
i est une variable qui va de 1 (valeur par défaut) à 10 ; tout ce qui est écrit entre le do et le
od va donc être exécuté 10 fois. A la sortie de la boucle (après le od), la variable i vaut 11.
C’est le ; après le od qui dicte s’il y a écriture ou non. Faites plusieurs essais, en changeant
les ; en : et vice-versa, pour bien comprendre.
Pour afficher seulement le 100 ième terme de la suite de Fibonacci, on peut donc écrire
>1:1:for i to 98 do %+%%;od:%;
Une des particularités de Maple est que ce logiciel utilise des valeurs exactes et non approchées.
Ainsi si l’on tape
>3/2;sqrt(2);Pi;
√
on n’obtient guère d’informations sur la valeur numérique de 3/2, 2 ou P i (pensez bien à
mettre une majuscule). Pour forcer à évaluer numériquement, on peut remplacer les entiers
utilisés par des réels. Cela se fait en écrivant par exemple 3. (avec un point) au lieu de 3
(sans le point). On peut aussi utiliser la fonction evalf.
>3./2;sqrt(2.);
ou alors
>evalf(3/2);evalf(sqrt(2));evalf(Pi);
Par défaut, MAPLE utilise 10 chiffres significatifs ; on peut changer cette valeur en écrivant
par exemple
>Digits:=20:
Cela veut dire que l’on a affecté 20 à Digits, la variable interne (i.e. définie dans Maple,
comme Pi), et cela se traduit par le fait que les calculs vont se faire avec une précision de 20
chiffres significatifs. Nous voyons donc que Maple nous permet de faire des calculs avec une
précision arbitraire, ce qui n’est pas le cas pour la plupart des langages de programmation
tels que C, Fortran, Scilab ou Matlab.
√
,
Exercice 1. Le nombre d’or est donné par 1+2 5 . Il est aussi donné comme la limite de uun+1
n
où (un ) est la suite de Fibonacci précédement décrite. Ecrivez des instructions pour observer
ce phénomène numériquement.
1.3. SAUVEGARDE DE FICHIER
1.3
7
Sauvegarde de fichier
Vous avez tapé quelques lignes de Maple et vous voulez garder la trace de ce que vous avez
fait. Vous voulez également rajouter des commentaires, i. e. du texte non exécuté par Maple.
Un commentaire s’écrit avec #. Ainsi toute la fin de ligne après ce symbole ne sera plus lue
par Maple. Votre feuille Maple peut se présenter ainsi de la manière suivante :
>#Suite de Fibonacci
1:1:for i to 100 do %+%%;od:%;
>#Nombre d’Or (exercice 1)
1.:1.:for i to 100 do %+%%;od:%/%%;(1+sqrt(5.))/2;
Sauvegarder alors le fichier sous la forme NOM.tp1.mws ou NOM.tp1.mw, suivant la version
de Maple utilisée (pour Maple7, c’est .mws). Utilisez toujours la meme version pour un meme
fichier ; ainsi si on passe de la version 7 à la version 9.5, il est possible que le fichier ne soit
plus lisible en version 7 par la suite.
Sous linux/mac, il est aussi possible d’utiliser Maple sans mode graphique : les commandes
Maple sont enregistrées dans un fichier (par exemple tp1.maple) et exécutées dans un terminal
par
maple -q tp1.maple
Un intérêt est que l’exécution est plus rapide, car en mode graphique, l’exécution peut être très
ralentie, notamment lors de l’ouverture de la session Maple. Par contre, on perd l’interactivité
qui peut être retrouvée en lançant maple et non xmaple depuis un terminal. Dans ce cas
néanmoins, on ne peut pas faire de sauvegardes. Enfin, en mode non graphique, il est plus
difficile d’obtenir des figures (qui sont affichées avec des caractères dans le terminal). On peut
parer à cet inconvénient en créant par exemple des fichiers jpg.
N’oubliez pas de sauvegarder régulièrement votre fichier.
1.4
Aide
Le logiciel Maple peut être vu comme une grosse calculatrice et offre de nombreuses
possibilités. N’hésitez pas à consulter l’aide (en anglais : cela ne doit pas vous rebuter !). On
peut obtenir de l’aide sur un mot, en tapant ? suivi du mot (tout attaché et sans ;). Par
exemple, pour tracer une fonction
?plot
1.5
Quelques suites avec Maple
Exercice 2. Une grenouille assoifée cherche une mare pour se désalterer. Son premier saut
la porte 1 mètre plus loin. Comme elle se fatigue à chaque saut, le suivant ne fait que 90%
de la longueur précédente. Sachant que la mare la plus proche est à 9 mètres de son point de
départ, arrivera-t-elle à l’atteindre ? si oui, en combien de sauts ?
Exercice 3. La fonction rand() renvoie un entier positif à 12 chiffres (au plus), choisi de
manière aléatoire. Pour N assez grand, calculer la moyenne obtenue de N appels de cette
fonction. Que remarque-t-on ?
8
CHAPITRE 1. UNE INTRODUCTION ET SA SUITE
Exercice 4. Les polynômes de Chebyshev sont définis par la formule de récurrence suivante :
T0 (x) = 1, T1 (x) = x,
Tn+1 (x) = 2xTn (x) − Tn−1 (x),
n ≥ 1.
La fonction simplify permet de simplifier des expressions algébriques. Ainsi, par exemple
> simplify(2*x*(2*x^2-1)-x);
donne pour résultat 4x3 − 3x. En utilisant la fonction simplify, calculer alors T9 . Vérifier
le résultat à l’aide de la commande
>orthopoly[T](9,x);
P
Exercice 5. Calculer N
k=0
exp(1).
1
k! ,
pour N = 5, 10, 20 et comparer avec une valeur approchée de
Exercice 6. La formule de Machin fut découverte en 1706 et relie le nombre π à la fonction
arctangente :
π
1
1
= 4 arctan − arctan
.
4
5
239
P
k x2k+1
D’autre part, on a arctan(x) = ∞
k=0 (−1) 2k+1 . En déduire un algorithme pour calculer une
valeur approchée de π, en n’utilisant que des opérations élémentaires (+, −, ∗, /), et comparer
avec une valeur numérique de P i. On pourra tester différentes valeurs de la variable Digits.
Chapitre 2
Variables, fonctions, tableaux et
boucles
Dans le chapitre précédent, nous avons vu que Maple nous permet de faire des calculs
numériques de précision arbitraire, en réglant la variable Digits convenablement. Nous avons
aussi aperçu que les calculs peuvent être faits sur des objets plus formels tels que les polynômes. Pour l’instant les calculs ont été faits dans la foulée grâce à l’utilisation des résultats
précédents obtenus par les symboles %,%% et %%%. Cela a déjà permis de faire de nombreux
calculs sur les suites, mais reste néanmoins limité, car pour faire un calcul on peut avoir
besoin d’autres valeurs que celles que l’on vient juste d’utiliser ! Nous allons maintenant donc
introduire d’autres notions qui vont permettre de faire des calculs plus évolués : les variables,
les fonctions, les tableaux et les boucles.
2.1
Les variables
Nous avons déjà rencontré quelques variables : Pi,Digits, l’indice de boucle i. Contrairement à d’autres langages de programmation, comme le C ou le Fortran, les variables ne sont
pas déclarées à l’avance et l’utilisateur n’a pas besoin de préciser le type (réel,entier,caractère,
pointeur...).
Il existe des variables prédéfinies :
>Pi,Digits,I;
I est le nombre complexe i (on a i2 = −1). Certaines de ces variables peuvent être modifiées
(comme Digits) et d’autres non (comme I et Pi).
Les autres variables sont définies à partir du moment où elles sont affectées. L’affectation d’une
variable se fait par l’instruction := (comme nous l’avons déjà vu pour la variable Digits).
>a:=1:a;
La valeur 1 est mise dans la variable a. Il peut parfois être intéressant de libérer une variable,
c’est-à-dire d’enlever la valeur qu’elle contenait. Cela se fait à l’aide de la fonction unassign.
>a:=1:a;unassign(’a’):a;
Ainsi, dans cet exemple, a redevient une variable formelle (on pourrait ainsi définir par
exemple des polynômes en fonction de a, comme cela avait été fait pour les polynômes de
9
10
CHAPITRE 2. VARIABLES, FONCTIONS, TABLEAUX ET BOUCLES
Chebychev).
Pour réinitialiser toutes les variables et tout ce qui a été fait auparavant, on utilise la commande
>restart;
Reprenons l’exemple de la suite de Fibonacci
>n:=10:u:=1:v:=1:
for i to n-2 do w:=u+v:u:=v:v:=w:od:w;
Remarquez qu’il a été nécessaire d’utiliser ici une variable temporaire w.
Lorsque l’on cherche à résoudre un problème, celui-ci va généralement dépendre de quelques
paramètres (paramètres physiques, de simulation,. . .), qu’il est important de bien identifier. Il
est conseillé de définir ces variables paramètres une fois pour toutes au début, pour la clarté
et afin de pouvoir les modifier facilement.
Exemple 1. On souhaite comparer l’erreur obtenue pour le calcul de
Z π
Z 1
sin(x)dx.
exp(x)dx,
0
0
par la méthode des rectangles et la méthode des trapèzes. L’intégrale exacte pour l’exponentielle
est donnée par
>int(exp(x),x=0..1):evalf(%);
La méthode des rectangles d’une fonction f sur un intervalle [a, b] est donnée par la formule
N −1
b−a
b−a X
),
f (a + k
N
N
k=0
tandis que la méthode des trapèzes est donnée par
N
−1
X
b−a b−a
) .
f (a) + f (b) + 2
f (a + k
2N
N
k=1
On peut écrire alors le code Maple suivant
>f:=exp:a:=0:b:=1: #cas1
#f:=sin:a:=0:b:=Pi:#cas2
N:=10:
int(f(x),x=a..b):Iexact:=evalf(%);
a:=evalf(a):b:=evalf(b):dx:=(b-a)/N:
#methode des rectangles
0.:a:for i to N do %%+f(%):%%+dx:od:
Irect:=%%*dx;Irect-Iexact;
#methode des trapezes
0.5*(f(a)+f(b)):a+dx:for i to N-1 do %%+f(%):%%+dx:od:
Itrap:=%%*dx;Itrap-Iexact;
Ainsi, en commentant/décommentant la deuxième ligne (i.e. en laissant ou en enlevant le
premier # de la deuxième ligne), on peut passer de la première à la deuxième intégrale.
2.2. LES FONCTIONS
2.2
2.2.1
11
Les fonctions
Fonctions et expressions
Supposons que l’on veuille définir la fonction f (x) = x2 + 1, afin de calculer par exemple
son intégrale, comme dans l’exemple précédent. Pour cela, il y a deux manières de faire : soit
on écrit
>f:=x->x^2+1:
et dans ce cas, pour évaluer la fonction en un point, par exemple pour x = 0.1, on écrit
>f(0.1):
soit, on considère l’expression
>f:=x^2+1:
et dans ce cas, pour évaluer l’expression en x = 0.1, on écrit
>subs(x=0.1,f);
Remarquons que l’on peut passer d’une forme à l’autre :
>f:=x^2+1:f:=unapply(f,x);
>f:=x->x^2+1:f:=f(x);
Notons que dans le cas d’une fonction la variable est muette ; on peut la changer sans changer la définition (on aurait pu écrire par exemple f :=y->y^ 2 ;). Ceci n’est pas vrai pour
une expression où il faut faire attention que la variable utilisée soit libre (on peut toujours
libérer une variable avec unassign, comme nous l’avons déjà vu). En général, on préfèrera les
expressions qui sont des objets plus simples.
Exercice 7. Modifier l’Exemple 1, pour pouvoir traiter le calcul de
Z 1
Z 1
1
exp(−x2 )dx.
dx,
2
1
+
x
−1
−1
On traitera le cas où l’on utilise des fonctions et le cas où l’on utilise des expressions.
2.2.2
Procédures
Lorsque l’on veut faire plusieurs calculs avec des paramètres différents, il peut être intéressant
d’englober le calcul dans une procédure. Cet objet se présente de la manière suivante :
>toto:=proc(f,N)
local i,tmp;
tmp=0.;
for i to N do tmp:=tmp+evalf(subs(x=i/N,f)):od:
tmp/N;
end proc:
> f:=x^2:N:=10:toto(f,N);N:=20:toto(f,N);f:=exp(-x^2):toto(f,N);N:=40:toto(f,N);
12
CHAPITRE 2. VARIABLES, FONCTIONS, TABLEAUX ET BOUCLES
Pour le premier >, on définit la fonction ; toto est le nom, f,N sont des variables paramètres
qui sont utilisées dans la procédure, i et tmp sont des variables locales c’est-à-dire qu’elles
n’existent qu’ à l’intérieur de la procédure. Le dernier résultat avant la fin de la procédure
(matérialisé par end proc :) est ce qui sera renvoyé par la procédure lors de l’appel.
Pour le deuxième >, on appelle la fonction avec différents paramètres.
Exercice 8. Ecrire une procédure rect(f,a,b,N) et trap(f,a,b,N) qui calcule l’intégrale
d’une fonction f sur un intervalle [a, b], avec respectivement la méthode des rectangles et des
trapèzes. La tester pour différents paramètres.
2.3
Les tableaux
On a vu que pour l’on pouvait calculer les termes d’une suite à l’aide de variables.
Considérons maintenant la suite définie de la manière suivante :
1
c1 = ,
7
k−1
k−1
X
1 X
5k + 9
jcj ck−j + −
cj ,
ck =
6
3
j=1
j=1
k ≥ 2.
Nous voyons que pour calculer le kième terme ck , nous avons besoin de tous les termes
précédents ck−1 , . . . , c1 . Nous avons donc besoin de stocker ces valeurs une fois qu’elles sont
calculées.
2.3.1
La commande array
Pour cela, nous pouvons utiliser un tableau par la commande
>N:=100:c:=array(1..N):
Cela veut dire que l’on a réservé des variables c1 , . . . , cN que l’on pourra affecter par la suite.
On peut écrire ainsi :
c[6]:=1:
Notons que les variables peuvent être de n’importe quel type ; en particulier, l’espace occupé
par les variables non encore affectées n’est pas alloué, mais sera alloué lors de l’affectation.
Remarque 1. Lorsque l’on connait la taille des objects, on peut parfois réserver à l’avance
la place mémoire. Cela peut augmenter les performances pour le temps d’accès au tableau.
Néanmoins, on ne connait pas toujours la place occupée par les variables (par exemple, certains entiers peuvent être très grands et nécessiteront donc beaucoup de stockage). Le lecteur
intéressé pourra consulter l’aide sur la commande rtable.
Un intérêt de la commande array est que l’on peut faire commencer et terminer les indices
où l’on souhaite. Ainsi, on peut écrire
>deb:=-10:fin:=15:c:=array(deb..fin):
On peut également indicer les tableaux en plusieurs dimensions
>N:=10:M:=12:L:=array(1..N,1..M):
2.3. LES TABLEAUX
13
L’accès se fait alors par L[i,j]. Pour calculer la suite précédente, on peut donc écrire.
N:=30:L:=array(1..N):L[1]:=1/7:
for k from 2 to N do
S:=add(L[j],j=1..k-1):T:=add(j*L[j]*L[k-j],j=1..k-1):
L[k]:=(6/(5*k+9))*(T-S+1/3);
od:evalf(%);
On a utilisé ici la commande add qui fait la somme des éléments de la liste (on aurait aussi
pu utiliser la commande for) et on a utilisé from, pour faire commencer k par 2 et non la
valeur 1 par défaut.
Pour afficher tous les éléments du tableau, on peut écrire
>eval(L);
2.3.2
Les listes
On peut aussi définir des tableaux par des listes de la manière suivante :
L:=[1,4,7];
Un intérêt est la déclaration qui est plus simple. On peut aussi accéder au nombre d’éléments
à l’aide de la commande nops
>nops(L);
La fonction nops compte le nombre d’opérandes de l’ objet L et les opérandes sont données
par la fonction op. L’affichage de toute la liste se fait tout simplement en écrivant
>L;
Attention, dans une liste, les indices commencent par 1 :
>L:=[3,6,7]:L[1];op(1,L);
La valeur 3 est ici affichée, puisque c’est le premier élément de la liste, qui est aussi la première
opérande de L.
Notons aussi qu’une liste est une séquence entre crochets et pour générer une séquence, il est
commode d’utiliser la commande seq
L:=[seq(i*i,i=1..5)];
Exercice 9. Calculer c200 lorsque c1 vaut 1/7 et 1./7, en mettant ces deux valeurs initiales
dans une liste et on souhaite avoir le résultat sous forme d’une liste.
De manière générale (aussi en voyant l’exercice précédent), on préferera utiliser array pour
des grands tableaux et des listes pour des petits tableaux (qui peuvent être une liste de
paramètres à tester, que l’on mettra de préférence au début du programme ).
Remarquons aussi la commande map qui applique une fonction à une liste (ou un array) :
>N:=10:L:=[seq(k/N,k=0..N)]:f:=x->exp(x):fL:=map(f,L):
14
2.4
CHAPITRE 2. VARIABLES, FONCTIONS, TABLEAUX ET BOUCLES
Boucles et tests
Pour diverses raisons, on peut avoir besoin d’exécuter une instruction que sous certaines
conditions.
Prenons l’exemple de la recherche dichotomique. On se donne une fonction continue sur
un intervalle [a, b] tel que f (a) > 0 et f (b) < 0. On sait alors qu’il existe une racine de
f sur l’intervalle [a, b], c’est-à-dire un nombre x ∈ [a, b] tel que f (x) = 0. La recherche
dichotomique permet alors de trouver une racine notée x dans cet intervalle. On regarde
le signe de f ((a + b)/2), afin de savoir si x ∈ [a, (a + b)/2] ou si x ∈ [(a + b)/2, b]. On
recommence ensuite ce procédé jusqu’à l’obtention d’un intervalle assez petit pour avoir une
bonne approximation de x. On peut alors définir la procédure suivante.
>dicho:=proc(aa,bb,eps,Nmax,f)
local fa,fb,err,i,c,a,b;a:=evalf(aa):b:=evalf(bb):
fa:=evalf(subs(x=a,f));fb:=evalf(subs(x=b,f));err:=fa;i:=0:
if(fa*fb>0) then error "Mauvais intervalle\n";end;
while((abs(err)>eps) and (i<Nmax)) do
c:=0.5*(a+b):err:=evalf(subs(x=c,f)):
if(err<0) then b:=c:fb:=err:else a:=c:fa:=err:fi:
i:=i+1:
od:
i,c,evalf(subs(x=c,f));
end proc:
On a ici utilisé l’instruction conditionnelle if, la boucle while. Notez la syntaxe :
if (..) then .. else .. fi:
while (..) do .. od:
On a aussi utilisé l’instruction error suivie d’une chaı̂ne de caractères qui est le message
d’erreur. Lorsque l’on est dans cette situation, le message d’erreur est renvoyé et le reste de la
procédure n’est pas exécuté (on sort de la procédure). Le symbole après ”intervalle” signifie
que l’on va à la ligne. On a aussi utilisé le signe logique and (et). Dans ce contexte, on pourra
aussi utiliser les symboles ou, différent, égal, négation :
or,<>,=,not
En particulier, on ne confondra pas le symbole = de test d’égalité entre deux objets avec le
symbole := qui est l’affectation d’une variable.
Exercice 10. Grâce à la fonction précédente, trouver une approximation de l’unique solution
de l’équation
tan(x) = x,
pour x ∈]π/2, 3π/2[. Modifier le code précédent pour pouvoir traiter le cas où f (a) < 0 et
tester sur un exemple. Comparer avec le résultat obtenu par fsolve.
Chapitre 3
Graphiques
Dans le chapitre précédent, nous avons vu les principales bases pour faire un calcul. Avec
certains paramètres d’entrée, on est capable de faire une suite d’instructions qui aboutit à
un résultat qui se présente généralement sous la forme d’un ou plusieurs nombres ou d’une
expression formelle (comme un polynôme). Pour répondre à un problème donné, le résultat
peut se présenter come une suite importante de nombres qu’il est alors commode de visualiser
à l’aide d’un outil graphique. Nous allons voir ici comment visualiser de résultats en 1D,
2D, 3D et comment faire des animations. Un autre point est de savoir comment stocker des
informations.
3.1
3.1.1
La commande plot
Des fonctions
On peut visualiser des fonctions par :
>f:=sin(4*x):plot(f,x=0..2*Pi);
>f:=x->sin(4*x):plot(f,0..2*Pi);
Dans le premier cas, on utilise la forme expression tandis que dans le deuxième cas, il s’agit
de la forme fonction. On peut aussi visualiser plusieurs graphiques en même temps ; cela peut
être extrêmement utile lorsque l’on veut faire une comparaison. Pour cela, on utilise
>plot([sin,cos],x=0..Pi,color=[red,blue],legend=["sin","cos"]);
Remarquez les options utilisées pour bien distinguer les courbes, grâce aux couleurs et à la
légende.
Exercice 11. A l’aide de la fonction plot, localiser le 5ième zéro strictement positif de la
fonction x − tan(x), à 10−2 près ; vérifier le résultat avec fsolve.
Un autre moyen de dessiner deux courbes en même temps est d’utilise la fonction display
qui fait partie de la libraire plots. Pour cela, on charge d’abord la librairie en écrivant
>with(plots):
Puis, on définit les deux graphiques de chaque courbe avant de créer la graphique qui contiendra les deux courbes.
>G1:=plot(sin,0..Pi,color=red,legend="sin"):G2:=plot(cos,0..Pi,color=blue,legend="cos"):
display(G1,G2);
15
16
CHAPITRE 3. GRAPHIQUES
3.1.2
Un ensemble de points
On peut aussi dessiner un ensemble de points, ce qui peut être utilisé si on connait la
fonction cherchée seulement en un nombre fini de points. Pour cela, la commande est la
suivante
>plot([[0,0.5],[1,0.2]]);
Ainsi les points (0, 0.5) et (1, 0.2) sont reliés par un segment (on peut ne tracer que les points
en rajoutant l’option style=point).
Exercice 12. Tracer sur un même graphique la fonction sin avec une résolution de 10 points
et de 20 points, avec une légende. Comparer avec
plot(sin,0..2*Pi,adaptive=false,numpoints=10);
On peut également tracer des courbes paramétrées de la forme (x(t), y(t)) ; par exemple,
pour dessiner le cercle de centre (0, 0) et de rayon 1, on écrit
plot([cos(t),sin(t),t=0..2*Pi],scaling=constrained);
L’option est mise pour que les axes soient les mêmes (sinon, on aurait une ellipse !).
3.1.3
Faire une animation
Il peut être intéressant de vouloir dessiner l’évolution d’un graphique ; cela s’obtient facilement avec la fonction display, en rajoutant l’option insequence=true : on définit tout
d’abord la liste d’images et on appelle ensuite la fonction display que l’on applique à cette
suite. En cliquant sur l’image, on voit ensuite apparaı̂tre des boutons play, pause,. . . qui permettent de contrôler l’animation.
Prenons l’exemple de la cycloide : il s’agit du mouvement d’un point fixé à un cercle qui roule
sans glisser sur une droite. Regardez ce que fait ce code et cherchez à comprendre toutes les
instructions.
n:=50:R:=5:nbt:=2:
t:=0:dt:=nbt*2*Pi/n:
G:=[seq(0,k=1..n)]:G0:=plot([[0,0],[nbt*2*Pi*R,0]],color=black):
for k to n do t:=t+dt:
G1:=plot([R*(cos(s)+t),R*(sin(s)+1),s=0..2*Pi],color=red):
G2:=plot([R*(s-sin(s)),R*(1-cos(s)),s=0..t],color=blue):
G3:=plot([[R*(t-sin(t)),R*(1-cos(t))]],thickness=2,style=point,color=red):
G[k]:=display([G0,G1,G2,G3]):
od:display(G,insequence=true,scaling=constrained,axes=none);
Exercice 13. Hypo/épicycloides
1. Tracez un cercle de rayon 1 et de centre (0, 0).
2. Soit R 6= 0 un nombre et t ∈ [0, 2π]. On considère le cercle de rayon |R| et de centre
((R + 1) cos(t), (R + 1) sin(t)). Que représente ce cercle par rapport au cercle de la question
1, suivant le signe de R ? Que se passe-t-il lorsque t varie ? Faites une animation.
3. On considère la courbe définie sur [0, t] par
x(s) = (1 + R) cos(s) − R cos((1/R + 1)s),
y(s) = (1 + R) sin(s) − R sin((1/R + 1)s).
17
3.2. AUTRES COMMANDES
Rajoutez cette courbe à l’animation précédente.
4. Comme dans le cas de la cycloide, rajoutez le point rouge.
Exercice 14. On cherche un nombre L > 0 vérifiant
L=
gT 2
2πd tanh
,
2π
L
avec g = 9.81, tandis que T et d sont des paramètres qui varient.
1. Pour un jeu de paramètres T, d, trouvez L à l’aide de la fonction dicho (que l’on pourra
légèrement modifier).
2. Calculez l’erreur maximale commise par rapport à la solution ”exacte” obtenue à l’aide de
fsolve.
3. Pour une valeur de T donnée, faı̂tes une représentation de L en fonction de d.
4. Pour une valeur de d donnée, faı̂tes une représentation de L en fonction de T .
5. Superposez plusieurs graphiques précédents pour des valeurs de T différentes.
3.2
Autres commandes
Il existe de nombreuses autres possibilités pour faire des graphiques : implicitplot,plot3d.
Il peut être utile également de sauvegarder des informations dans un fichier pour pouvoir les
utiliser plus tard, soit avec le même logiciel ou même avec d’autres logiciels.
Pour cela, on consultera la commande fprintf.
On peut aussi sauvegarder des graphiques en format eps ou jpg.
Voici quelques instructions qui peuvent être utiles si l’on veut par exemple utiliser Maple
sans mode graphique et avoir quand même la possibilité de visionner des graphiques (sans
animations néanmoins).
interface(plotdevice=ps,plotoutput=‘toto.ps‘);
with(plots):
plotsetup(ps);
plot(sin,x=0..2*Pi);
quitplotsetup():
system("xv toto.ps&"):
la dernière ligne permet de visualiser le fichier ps avec le logiciel xv (qui doit être installé).
3.3
Exercices
Exercice 15. Polynômes de Lagrange Etant donnés un intervalle I = [a, b], une fonction
f définie sur I et un ensemble de k + 1 points {xn }n=0...k avec xn ∈ I ∀n = 0 . . . k ; on définit
l’interpolée de Lagrange de f sur l’ensemble {xn }n=0...k comme l’unique fonction polynômiale
P de degré inférieur ou égal à k vérifiant
P (xn ) = f (xn )
∀n = 0 . . . k.
Le programme suivant calcule l’interpolation de Lagrange, grâce à la fonction interp.
18
CHAPITRE 3. GRAPHIQUES
>restart:with(plots):
>f:=exp(x):N:=3:a:=0:b:=1:#parametres
h:=(b-a)/N:L:=[seq(a+k*h,k=0..N)]:
g:=unapply(f,x):Pf:=interp(L,map(g,L),x):
seq(subs(x=L[k],Pf-f),k=1..N+1);
plot(f-Pf,x=a..b);
>G1:=plot(f,x=a..b,color=blue):G2:=plot(Pf,x=a..b,color=red):
display([G1,G2]);
Que représentent h, le premier et le deuxième graphique ? Essayer avec d’autres paramètres.
Modifier le programme pour pouvoir faire une animation suivant le nombre de points de
discrétisation.
Exercice 16. : La marche de l’ivrogne
Supposons qu’un ivrogne marche dans une rue droite et fait un pas à chaque seconde :
tantôt vers la gauche et tantôt vers la droite de manière aléatoire. On va aussi supposer qu’il
peut rester immobile. Les 100 premiers pas de l’ivrogne peuvent se modéliser ainsi :
> hasard:=rand(-1..1):
> positionivrogne:=0:
> for k from 1 to 100 do
a:=hasard():
positionivrogne:= positionivrogne + a:
enddo;
> positionivrogne;
Voir l’aide sur la fonction rand() si nécessaire. Modifions le programme précédent afin de
conserver en mémoire chacune des positions de l’ivrogne :
> hasard:=rand(-1..1):
> positionivrogne:=0:
> for k from 1 to 100 do
a:=hasard():
positionivrogne:= positionivrogne + a:
position[k]:=positionivrogne:
enddo;
> positionivrogne;
> l:=[seq([n,position[n]],n=1..100)]:
> plot(l,0..100);
Modéliser une marche aléatoire dans le plan. On stockera les positions successives de
l’ivrogne pour en tracer un graphique. Quelle est alors la distance parcourue par l’ivrogne ?
Quelle distance le sépare de son point d’origine ?
Chapitre 4
Quelques compléments
4.1
Résolution d’équations différentielles
On souhaite simuler le déplacement x(t) d’une masse accrochée à un ressort. Par application du théorème de Newton, on obtient l’équation différentielle :
d
d2
x(t) + α x(t) + kx(t) = 0
2
dt
dt
Maple possède différents outils permettant la résolution d’équations différentielles, comme la
commande dsolve ou encore la fonction odeplot pour la visualisation des solutions (voir
l’aide sur ces deux fonctionnalités).
Dans un premier temps, on définit l’équation différentielle. Il existe plusieurs manières de
définir une dérivée. On utilisera de préférence les commandes D ou diff. La dérivée d’une
fonction f(x) est alors : diff(f,x) ou D(f). La dérivée de f en x=0 est D(f)(0). La dérivée
seconde s’écrit par exemple diff(f(f,x,x) ou encore diff(f,x$2) (d’autres formulations
sont données dans l’aide).
L’équation différentielle est donnée ainsi :
m
ressort:={m*diff(x(t),t,t)+alpha*diff(x(t),t)+k*x(t)=0};
Puis les différents paramètres sont fixés : la masse m, le coefficient de frottement α et la
raideur du ressort k :
m:=2:alpha:=0.5:k:=5:
On définit également les conditions initiales. A l’instant initial, le ressort a une longueur l
(soit x(0) = l) et une vitesse nulle (soit dx(0)
dt = 0). De manière à changer plus facilement les
conditions initiales, on peut définir une fonction CI telle que :
CI:=(a,b)->{x(0)=a, D(x)(0)=b};
On constatera que l’équation différentielle et ses conditions initiales sont définies comme des
ensembles (entourés de {}), la commande dsolve nécessitant cette syntaxe.
Enfin on peut résoudre l’équation différentielle :
sol:=dsolve(ressort union CI(0.5,0), x(t), numeric);
19
20
CHAPITRE 4. QUELQUES COMPLÉMENTS
L’option numeric indique que la solution de l’équation est approchée par une méthode
numérique
Grâce à la commande odeplot, on peut représenter le mouvement du ressort dans le temps :
odeplot(sol, [t, x(t)], 0..10, numpoints=400);
et aussi modéliser l’état du système dans l’espace des phases :
odeplot(sol, [x(t), diff(x(t),t)], 0..10, numpoints=400);
Exercice 17 (Le pendule simple rigide). On souhaite simuler le mouvement d’un pendule
simple. On rappelle que l’équation différentielle régissant le mouvement est :
d
d2
θ(t) + 2f θ(t) + w02 sin(θ(t)) = 0
2
dt
dt
où w0 est la pulsation propre du pendule et f le coefficient de frottement (on donnera w0 = 1
et f = 0.1).
De plus on suppose qu’à l’instant initial, le pendule est forme un angle de 1.5rad avec l’axe
vertical et que la vitesse angulaire vaut 2.
Comme précédemment, résoudre l’équation différentielle et donner une représentation graphique de la trajectoire et de l’état du système dans l’espace des phases.
Exercice 18 (Attracteurs de Lorenz). On considère un fluide chauffé (par exemple, de l’air
au dessus d’un radiateur). L’air chaud étant moins dense que l’air froid, il monte. En montant, il se refroidit et redescend. Le mouvement du fluide s’organise autour de rouleaux dits
de convection. D’après le modèle de Lorenz, ces rouleaux sont parallèles et tournent en sens
inverse l’un de l’autre.
La position (x(t), y(t), z(t)) d’un élément du fluide est décrite par le système différentiel suivant :
d
dt x(t) = s(y(t) − x(t))
d
dt y(t) = rx(t) − y(t) − x(t)z(t)
d
dt z(t) = x(t)y(t) − bz(t)
où s, r et b dépendent du volume chauffé et du mode de chauffage (on choisit s = 10, r = 28,
b = 38 ).
On souhaite visualiser la trajectoire d’un élément. Pour ce faire :
1. Utiliser le package DEtools, qui offre plus de fonctionnalités quant à la manipulation
d’équations différentielles
2. Définir le système d’équations différentielles (comme une suite, et non plus comme un
ensemble, i. e., on ne met pas les accolades) et stocker cette suite dans la variable Lorenz
3. Définir les conditions initiales (également comme une suite) en posant x(0) = y(0) =
z(0) = 1 et stocker cette suite dans la variable CI
4. Utiliser la fonction DEplot3d pour représenter la trajectoire :
DEplot3d({Lorenz},[x(t), y(t), z(t)], t=0..100, stepsize=0.01, [[CI]],
orientation=[-35,75], linecolor=t, thickness=1);
21
4.2. PARTIEL JANVIER 2007
4.2
Partiel janvier 2007
c
Exercice 19. Réécrire les fonctions suivantes en MAPLE
:
- abs, la valeur absolue d’un réel.
- max, qui détermine le maximum entre deux réels.
- Heaviside, la fonction de Heaviside qui vaut 0 quand x < 0 et 1 quand x ≥ 0.
Ecrire une version
Pn simplifiée de sum qui prenne en argument une fonction f et un entier n
et qui retourne i=1 f (i).
c
Comment calculer en MAPLE
limx→0
sin x
x
?
Exercice 20. On donne la procédure
fact:=proc(n::nonnegint)
local resu,y;
y:=n;
while y>0 do
resu:=resu*y;
y:=y-1;
end do;
return resu;
end proc;
Pourquoi cette procédure ne retourne-t-elle pas n! (la factorielle de n) ? (justifier)
Modifier cette procédure pour que celle-ci retourne n! si n est pair et −n! si n est impair.
Donner une version de la factorielle en utilisant l’instruction for.
Exercice 21. On définit les polynômes de Chebyshev par la formule suivante pour n ≥ 0 :
Tn (x) = cos(n arccos(x)).
On démontre que ces polynômes vérifient la relation de récurrence suivante :
Tn (x) = 2xTn−1 (x) − Tn−2 (x).
En utilisant cette relation, écrire une procédure récursive qui permette de calculer Tn (x).
Exercice 22. Définissez à l’aide des commandes maple la fonction f suivante :
f (t) =
∞
X
2(−1)n+1 sin(nt)
n=1
n
Quelle ligne de commandes permet de tracer cette fonction sur l’intervalle [−π, π].
Exercice 23. Soit les trois fonctions de trois variables :
f [1](x[1], x[2], x[3]) = x[1] + 2x[2] + 5x[3] − 1
f [2](x[1], x[2], x[3]) = x[2]x[3]2 − 2
f [3](x[1], x[2], x[3]) = x[3]5 − 5
22
CHAPITRE 4. QUELQUES COMPLÉMENTS
On définit la matrice Jacobienne (MJ ) associée à ces trois fonctions par :
(MJ )i,j =
df [i]
dx[j]
et le système d’équations suivant :

 f [1](x, y, z) = 0
f [2](x, y, z) = 0

f [3](x, y, z) = 0
Le but de l’exercice est d’utiliser la méthode de Newton-Raphson pour résoudre ce système
d’équations.
La méthode de Newton-Raphson est une méthode itérative distinée à résoudre les systèmes
d’équations non-linéaire.
On décrit l’algorithme de la méthode de Newton-Raphson comme suit :
– Soient (x0 , y0 , z0 ) une donnée initiale.
t (X , Y , Z ) :
– Résoudre le système
matriciel
n n
n

(S) d’inconnues 

Xn
f [1](xn , yn , zn )
MJ (xn , yn , zn )  Yn  = −  f [2](xn , yn , zn ) ,
f [3](xn , yn , zn )
Zn
où MJ (xn , yn , zn ) désigne l’évaluation de la matrice Jacobienne MJ en (xn , yn , zn )
– (xn+1 , yn+1 , zn+1 ) = (xn , yn , zn ) + (Xn , Yn , Zn )
– arrêt de l’algorithme si |(xn+1 , yn+1 , zn+1 ) − (xn , yn , zn )| < ǫ,
où ǫ désigne un paramètre ayant pour vocation à être petit.
c
1. Définir en MAPLE
les trois fonctions f 1, f 2 et f 3 ;
2. Ecrire une procédure qui, prenant pour arguments ces trois fonctions, retourne la matrice Jacobienne MJ .
3. Ecrire une procédure qui, prenant pour arguments les trois fonctions , la matrice Jacobienne et un triplet (xn , yn , zn ), résoud le système S.
c
4. Ecrire finalement une succession de commandes MAPLE
, utilisant les procédures
préalablement définies, pour résoudre le système E par l’algorithme de la méthode de
Newton-Raphson.
23
4.3. PARTIEL SEPTEMBRE 2007
4.3
Partiel septembre 2007
Exercice 24.
1. Expliquez quelle est la différence entre les commandes suivantes :
(a) > P:=x^3-2*x^2+3*x;
(b) > solve(x^2-x-1,x);
2. Pourquoi les commandes suivantes renvoient-elles un message d’erreur ?
(a) > I:=matrix(3,3,[a,b,c,d,e,f,g,h,i]);
(b) > i:=matrix(3,3,[a,b,c,d,e,f,g,h,i]);
Exercice 25. Ecrire une boucle qui affiche à l’écran la somme
k
X
n=1
1 + 2 + ··· + n
1n + 2n + · · · + nn
pour les k paires de 1 à 100
Exercice 26. On considère la procédure suivante
>blob:=proc(S)
>global T:
>local i,n,temp:
>n:=nops(S):
>temp:=S[n]:
>for i from n to 2 by -1 do
>T[i]:=S[i-1]:
>end do:
>T[1]:=temp:
>return T:
>end proc;
Quels seront les résultats des commandes suivantes :
i. >T:=[1,2,3,4];
>blob(T);
ii. >T:=[1,2,3,4];
>blob(blob(T));
iii. >T:=[1,2,3,4];
>blob(T);
>blob(blob(T));
Exercice 27. Ecrire une procédure SecDeg(a, b, c) qui résout l’équation du second degré à
coefficients réels ax2 + bx + c = 0 en distinguant 3 cas selon le signe du discriminant.
Exercice 28. On définit des entiers truc(k, n), où n est un entier positif ou nul et k est un
entier quelconque, par la procédure récursive suivante :
>truc:=proc(k,n)
>option remember:
>local i,n,temp:
24
CHAPITRE 4. QUELQUES COMPLÉMENTS
>if (n=0) then
>return k;
>else
>truc(k,n-1)+truc(k-5,n-1);
>end if
>end proc;
Que vaut truc(2, 3).
Exercice 29.
On appelle suite récurrente d’ordre 2 toute suite définie de la manière suivante

 un = aun−1 + bun−2 , n ≥ 2
u = x0
 0
u1 = x1
où a, b, x0 et x1 sont des réels donnés (b 6= 0).
1. Ecrire une boucle qui permet de stocker dans une séquence les 101 premiers termes
d’une telle suite.
2. On appelle polynôme caractéristique associé à la suite le polynôme
X 2 − aX − b.
Si ce polynôme admet deux racines réelles distinctes r1 et r2 alors un est aussi determiné
explicitement sous la forme
un = λr1n + µr2n
où λ et µ sont deux réels à déterminer à partir des données initiales x0 et x1 ; plus
précisément λ et µ sont solutions du système
λ
+µ
= x0
.
λr1 +µr2 = x1
Donner une succession de commandes MAPLE qui permet :
(a) de déterminer les racines du polynôme caractéristique (la commande solve(eqn,var)
renvoie les solutions de l’equation eqn en fonction de la variable var sous la forme
d’une structure de liste),
(b) de déterminer λ et µ (pour assigner les solutions d’un système utiliser la commande
assign(S), où S désigne la solution du système),
(c) de vérifier si la suite définie de manière explicite est bien égale (pour les 101
premiers termes) à la suite définie par récurrence.
3. Déterminer à la main r1 , r2 , λ et µ pour la suite de Fibonacci et vérifier que les deux
formes (explicite et récurrente) correspondent sur u0 , u1 et u2 .
Téléchargement