Introduction à Maple UE4 Master Recherche Mathématiques Jean-Pol Guillement Département de Mathématiques Nantes 2009/2010 2 Table des matières Introduction 5 1 Prise de contact 1.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Exemples de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 2 Environnement : relation avec le système 2.1 Personnalisation du système . . . . . . . . 2.2 Chargement d’un fichier . . . . . . . . . . 2.3 Commandes système . . . . . . . . . . . . 2.4 Historique des commandes . . . . . . . . . 2.5 Chargement des bibliothèques . . . . . . . 2.6 Visualisation du code d’une fonction . . . 2.7 Exécution en mode batch . . . . . . . . . 2.8 Débugage . . . . . . . . . . . . . . . . . . 2.9 Aide en ligne . . . . . . . . . . . . . . . . . . . . . . . . . 21 21 21 22 22 22 22 22 22 23 . . . . . . 25 25 25 26 26 26 26 . . . . . . . . . . . . 29 29 29 29 30 31 32 32 32 32 32 33 33 expressions booléennes Le symbole ”=” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le prédicat ”=” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le prédicat ”<” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 35 35 35 3 Éléments complémentaires de syntaxe 3.1 Les branchements conditionnels . . . . 3.1.1 Le si . . . . . . . . . . . . . . . 3.1.2 Le choix multiple . . . . . . . . 3.2 Les répétitions . . . . . . . . . . . . . 3.2.1 La boucle pour . . . . . . . . . 3.2.2 La boucle tant que . . . . . . . . . . . . . . . . . . . d’exploitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Les structures de base 4.1 Les objets Maple . . . . . . . . . . . . . . . . . . . 4.1.1 Les objets atomiques . . . . . . . . . . . . . 4.1.2 Les structures de base . . . . . . . . . . . . 4.1.3 Les structures composites . . . . . . . . . . 4.1.4 Création explicite de structures composites 4.2 Manipulations des objets de base . . . . . . . . . . 4.2.1 Extraction . . . . . . . . . . . . . . . . . . . 4.2.2 Sélection . . . . . . . . . . . . . . . . . . . 4.2.3 Nombre d’éléments . . . . . . . . . . . . . . 4.2.4 Constitution de suites et de listes . . . . . . 4.2.5 Test de la suite ou de la liste vide . . . . . 4.2.6 La fonction map . . . . . . . . . . . . . . . 5 Les 5.1 5.2 5.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 TABLE DES MATIÈRES 6 Les évaluations 6.1 Règles d’évaluation . . . . . . . . . . . . . . . . . . 6.2 Illustration des règles . . . . . . . . . . . . . . . . . 6.2.1 Niveau d’évaluation et affectations . . . . . 6.2.2 Affectations . . . . . . . . . . . . . . . . . . 6.2.3 Quotage . . . . . . . . . . . . . . . . . . . . 6.2.4 Quelques différences difficilement prévisibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 37 37 37 39 39 40 7 Les 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 41 41 41 42 42 43 43 44 fonctions Définition des fonctions . . . . . . . . Comment voir le contenu des fonctions Fonctions anonymes . . . . . . . . . . Variables locales, variables globales . . Valeur retournée . . . . . . . . . . . . Options . . . . . . . . . . . . . . . . . Contrôle des paramètres . . . . . . . . Passage des paramètres . . . . . . . . Fonctions locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Les modules 47 9 Les entrées-sorties 9.1 Les fonctions d’entrée-sortie . . . . 9.1.1 Fonctions de lecture . . . . 9.1.2 Analyse d’une chaı̂ne . . . . 9.1.3 Fonctions d’écriture . . . . 9.2 Les redirections . . . . . . . . . . . 9.3 Lecture de données dans un fichier 9.4 Écriture de données dans un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 49 49 49 49 49 50 50 10 Manipulation des expressions 10.1 Diverses fonctions de manipulation 10.1.1 Assign . . . . . . . . . . . . 10.1.2 Unapply . . . . . . . . . . . 10.1.3 Sort . . . . . . . . . . . . . 10.1.4 Subsop . . . . . . . . . . . 10.1.5 Parse . . . . . . . . . . . . 10.1.6 Solve/identity . . . . . . . . 10.1.7 Allvalues . . . . . . . . . . 10.1.8 Value . . . . . . . . . . . . 10.2 Réécriture . . . . . . . . . . . . . . 10.2.1 Expand . . . . . . . . . . . 10.2.2 Simplify . . . . . . . . . . . 10.2.3 Factor . . . . . . . . . . . . 10.2.4 Collect . . . . . . . . . . . . 10.2.5 Combine . . . . . . . . . . . 10.2.6 Normal . . . . . . . . . . . 10.2.7 Rationalize . . . . . . . . . 10.2.8 Convert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 53 53 54 54 55 55 55 56 56 57 57 57 57 58 59 59 59 60 Bibliographie 61 Index 65 Introduction Maple est avant tout un logiciel de calcul formel, symbolique, c’est-à-dire qui travaille sur les expressions à la différence du calcul numérique qui calcule sur les nombres. Il intègre des possibilités de calcul numérique qui sont au fil des nouvelles versions de plus en plus performantes. Mais le calcul numérique n’est pas son objectif. Maple est un logiciel généraliste qui convient très bien par exemple pour les calculs usuels genre Terminale-Deug. Il touche à toutes les branches des mathématiques sur lesquelles on peut calculer. Il n’est pas spécialisé et de ce fait, ne prétend pas rivaliser avec les logiciels spécifiques comme : - Matlab pour le numérique, - pari, (Mathematica ?), ... pour l’algèbre. C’est de très loin le logiciel le plus utilisé (5 millions de licences en 2003). Il est commercialisé par la société Maplesoft qui a pratiqué une politique commerciale astucieuse. Quelques dates : 1960 Les premiers logiciels de calcul formel, Macsyma, Reduce, à base de Lisp, nécessitent de gros ordinateurs et offrent des possibilités limitées. 1980 Projet d’écrire d’un logiciel qui puisse tourner sur des machines plus modestes (anticipation de l’émergence des ordinateurs individuels) : petit programme, efficace, noyau réduit, écrit en C. 1983 1er cours avec Maple, 1ers articles, 50 installations dans le monde. 1984 Contrat avec la société Watcom pour la commercialisation. 1985 Début de la commercialisation. 1987 300 installations. 1987 Contrat avec la société Waterloo Maple Software (Université de Waterloo). 1988 2000 installations. 2003 Société Maplesoft, 5 millions de licences. Il y a différents niveaux d’utilisation de Maple : - Le mode commande réduit aux fonctions les plus basiques comme - plot, - int, - diff ... Ce type d’utilisation ne nécessite pas de suivre un cours. Il y a de nombreux tutoriels bien faits sur le Web. Par exemple [13]. - Le mode commande avec résolution - d’équations générales, - de systèmes linéaires, - d’équations différentielles. Ce niveau d’utilisation nécessite de connaı̂tre les structures de base de Maple. - Le mode de programmation qui permet par exemple la résolution de problèmes du genre TerminaleDeug. Il faut savoir enchaı̂ner les calculs, faire passer les résultats d’une commande à une autre, utiliser des fonctions. 6 Introduction - La programmation de méthodes de calcul formel, c’est-à-dire l’enrichissement du système. Avant d’étudier Maple il est nécessaire de bien faire la distinction entre les 4 types de calcul mathématique : - Le calcul mathématique habituel, sur feuille de papier, celui auquel on est le plus habitué, difficile à définir, tout le monde voit de quoi on parle. - Le calcul numérique (scientifique). C’est l’art de réduire les calculs à un nombre fini d’opérations arithmétiques élémentaires portant sur des nombres représentés par un ensemble fini de symboles (les chiffres). Le calcul numérique fait nécessairement apparaı̂tre deux types d’approximation et d’erreur : l’approximation des nombres par les flottants, (Pi, 1/10 en base 2, ...) et la discrétisation incontournable. On met en œuvre les calculs numériques à l’aide des langages de programmation comme le Fortran, le C, le Pascal, ... et aussi à l’aide de logiciels numériques comme Matlab. - Le calcul formel qui opère sur les expressions mathématiques, mécaniquement, automatiquement, par programmation. √ Par exemple le calcul de l’intégrale de exp(−x2 ) sur ]−∞, ∞[ peut se réaliser de façon formelle (= π) et de façon numérique, approchée, (≈ 1.772453851). La même intégrale, mais sur [0..1] ne peut se calculer de façon formelle, sauf en répondant à l’aide d’une fonction spéciale c’est-à-dire en retournant la question posée. - Le calcul analogique comme par exemple celui que l’on peut faire avec une règle à calcul. Comme nous l’avons déjà noté, Maple est conçu pour le calcul formel, même s’il intègre de plus en plus, (pour des nécessités commerciales sans doutes), de bons outils permettant le calcul numérique. Pour ma part, je constate qu’il n’est pas du tout approprié aux calculs volumineux qui caractérisent la plupart des calculs scientifiques. Par ailleurs il n’est pas très facile de savoir lui imposer une démarche complètement numérique et il n’est pas facile de savoir quand il travaille en formel et quand il abandonne le formel pour s’orienter vers le numérique. Chapitre 1 Prise de contact 1.1 Généralités Maple est un interprète en attente d’une expression à évaluer (ou d’une instruction à exécuter). L’attente est signalée par un prompt, ”>”. On appelle Toplevel cet état. Le ” ;” et le ” :” marquent la fin de l’expression à évaluer. (Le ”Return” est ignoré, ce n’est pas une marque de fin d’expression). Les expressions à évaluer sont des symboles, des expressions mathématiques ”correctement parenthèses”. (Une définition précise ne peut être donnée sans recours à la grammaire sous-jacente à Maple). Si l’expression est terminée par ” ;”, Maple affiche à l’écran la représentation de la valeur du dernier résultat. Ce n’est pas le cas quand l’expression est terminée par ” :”. On ferme le logiciel avec ”quit”. On peut travailler en mode Texte interactif ou batch, et en mode Graphique interactif (sous Unix commande maple -x ou xmaple). Note : Il y a des différences entre les versions. En 2007 c’est la version 11 qui est commercialisée. En gros, les versions 2 et 3 assez semblables diffèrent de la version 4. Les versions 6 . . . 11 respectent la même syntaxe, très voisine de celle de la version 5. 1.2 Exemples de commandes |\^/| ._|\| |/|_. \ MAPLE / <____ ____> | Maple 9 (IBM INTEL LINUX) Copyright (c) Maplesoft, a division of Waterloo Maple Inc. 2003 All rights reserved. Maple is a trademark of Waterloo Maple Inc. Type ? for help. true # Debut avec maple # Sept 2000, J-P Guillement > > printf("\tExecute sur %s\tle %s\n",ssystem("hostname")[2],ssystem("date")[2]); Execute sur Quad le Wed Sep 12 09:58:55 CEST 2007 > # # # > # # # pour demarrer maple en mode texte interactif sur unix taper "maple" sur la ligne de commande. pour quitter maple taper "quit" pour evaluer entierement ce texte en mode interactif taper (sous maple) read("nomdufichier"); et taper RETURN apres chaque message RETURN 8 Prise de contact > # pour evaluer la totalite du fichier en mode batch sous Unix # maple [-exec] nomdufichier # ou maple [-exec] nomdufichier > resultats # ou maple < nomdufichier > resultats # (sous Windows, utiliser la comande "cmaple"). > # pour avoir de l’aide sur l’aide taper "??" # pour avoir de l’aide sur la commande solve par exemple # en Version 3 et Version 6 taper "?so". En Version 4 taper "?solve" # En Version 4, pour avoir la liste des fonctions disponibles # taper "?index[function]" # > # Pour reprendre des calculs, utiliser parfois x:=’x’: # ou evaln(x) ou unassign(’x’) pour faire un nettoyage > ################################################# # Prise de contact avec Maple # ################################################# > 5; 5 > 2+5*3; 17 > sin(0); 0 > print(x); x > x:=2; x := 2 > x; 2 > print(x); 2 > y:=x; y := 2 > y; 2 > toto; toto > toto:=y; toto := 2 > toto; 2 > y:="bonjour"; y := "bonjour" 1.2 Exemples de commandes 9 > toto; 2 > > sin(1); sin(1) > evalf(sin(1)); 0.8414709848 > evalf(sin(1),30); 0.841470984807896506652502321630 > sin(1.0); 0.8414709848 > evalf(sin(1.0)); 0.8414709848 > evalhf(sin(1.0)); 0.841470984807896505 > evalhf(sin(1)); 0.841470984807896505 > tmp:=Digits; tmp := 10 > Digits:=50; Digits := 50 > evalf(4*arctan(1)); 3.1415926535897932384626433832795028841971693993751 > Digits:=tmp; Digits := 10 > # petite programmation de fonction # selon version, V3 = true or false > V3:=evalb(SearchText("3",interface(version),15..20) > 0); V3 := true # ou V3:= evalb(evalf(E-exp(1)) =0); > V5:=evalb(SearchText("5",interface(version),15..20) > 0); V5 := false > V6:=evalb(SearchText("6",interface(version),15..20) > 0); V6 := false > V7:=evalb(SearchText("7",interface(version),15..20) > 0); V7 := false > V5:= V5 or V6 or V7; V5 := false > if (V3) then > ret := ()-> readline(terminal): > elif (V5) then 10 Prise de contact > ret:=proc() printf("\n");readline(default):end; > else > ret := readline: > fi: > # Mathematiques > printf("Maintenant Arithmetique et Calcul polynomial, RETURN "); Maintenant Arithmetique et Calcul polynomial, RETURN > ret(): > ifactor(100); 2 (2) 2 (5) > isprime(101); true > 1/3 mod 7; 5 > > factor(x^5+1); 33 > x:=’x’; x := x > factor(x^5+1); 4 3 2 (x + 1) (x - x + x - x + 1) > p:=1+expand((x-1)*(x-3)*(x-5)); 3 2 p := -14 + x - 9 x + 23 x > s:=solve(p=1,x); s := 1, 3, 5 # s := 1, 3, 5 > s[2]; # l’ordre peut varier 3 > y:=’y’; y := y > solve({x+y=2,x-y=1}); {y = 1/2, x = 3/2} > x; x > assign(%%); > x; 3/2 # trigonometrie > printf("Maintenant trigonometrie, RETURN "); Maintenant trigonometrie, RETURN > ret(): > x:=’x’; 1.2 Exemples de commandes 11 x := x > cos(x)^2+sin(x)^2; 2 cos(x) 2 + sin(x) > simplify(cos(x)^2+sin(x)^2); 1 > combine(cos(x)^2+sin(x)^2,trig); 1 > e:=expand(cos(5*x)); 5 e := 16 cos(x) 3 - 20 cos(x) + 5 cos(x) > combine(e,trig); cos(5 x) > sin(n*Pi); sin(n Pi) > assume(n,integer); sin(n*Pi); 0 # 0 en version 4 et sin(n~ Pi) en version 3 # > solve(sin(x),x); 0 > _EnvAllSolutions := true: solve(sin(x)); Pi _Z1~ # attention retourne 0 en version 3 si la requete solve(sin(x)); # a ete faite prealablement a l’affectation de _EnvAllSolutions ! > # algebre lineaire > with(linalg): # noter le : pour discretion Warning, the protected names norm and trace have been redefined and unprotected > printf("Maintenant algebre lineaire, RETURN "); Maintenant algebre lineaire, RETURN > ret(): # petit calculs sur les matrices de Hilbert > h4:=matrix(4,4,[seq(seq(1/(i+j),i=1..4),j=1..4)]); [1/2 1/3 1/4 1/5] [ ] [1/3 1/4 1/5 1/6] h4 := [ ] [1/4 1/5 1/6 1/7] [ ] [1/5 1/6 1/7 1/8] > det(h4); evalf(%); 1/423360000 -8 0.2362055933 10 > h:=n->matrix(n,n,[seq(seq(1/(i+j),i=1..n),j=1..n)]): 12 Prise de contact > deth:=n->det(h(n)); deth := n -> det(h(n)) > d6:=deth(6); d6 := 1/172153600393420800000 > h6:=h(6): > norm(h6); 223 --140 > n2:=norm(h6,2); 1/2 6 5 n2 := 1/210 5 RootOf(62953620111360000 _Z - 700749536346021888000 _Z 4 + 62512217960687222169600 _Z 3 - 14491862768764210106880 _Z 2 1/2 + 3301345200565172560 _Z - 236492379085 _Z + 1, index = 6) > n2f:=evalf(n2); n2f := 1.118858688 > p:=charpoly(h6 &* h6,x): > p:=p/subs(x=0,p); 6 p := 29636862128417614224539925872640000000000 x 5 - 37402940357699778471770869963161600000000 x 4 + 378302532523400164964886734340096000000 x 3 2 - 9943286845929810115968744099840000 x + 256819566380446129856544000 x - 2085862783529700 x + 1 > vph6h6:=eigenvals(h6 &* h6); vph6h6 := 1/8820 RootOf(%1, index = 1), 1/8820 RootOf(%1, index = 2), 1/8820 RootOf(%1, index = 3), 1/8820 RootOf(%1, index = 4), 1/8820 RootOf(%1, index = 5), 1/8820 RootOf(%1, index = 6) 6 %1 := 62953620111360000 _Z 5 - 700749536346021888000 _Z 4 + 62512217960687222169600 _Z 3 - 14491862768764210106880 _Z 2 + 3301345200565172560 _Z - 236492379085 _Z + 1 > > norm(h6,infinity); 1.2 Exemples de commandes 13 223 --140 > cond(h6); 91073646 > vp:=evalf(Eigenvals(h6)); [ -7 -5 vp := [0.2203114976 10 , 0.2850438197 10 , 0.0001607660527, 0.005130954614, ] 0.1008467195, 1.118858688] > printf("det h%a = %a, prod vp = %a\n",6,evalf(d6),‘*‘(op(convert(vp,list)))); det h6 = .5808766112e-20, prod vp = .5844916720e-20 > printf("norme2 h%a = %a, plus gde vp = %a\n\n\n",6,n2f,max(op(convert(vp,list)))); norme2 h6 = 1.118858688, plus gde vp = 1.118858688 # # calcul diff et integral > printf("Maintenant calcul diff, RETURN "); Maintenant calcul diff, RETURN > ret(): > diff(exp(cos(x)),x); -sin(x) exp(cos(x)) > subs(x=0,%); simplify(%); -sin(0) exp(cos(0)) 0 > diff(sin(x),x,x); diff(sin(x),x$2);D(sin);(D@@3)(sin); -sin(x) -sin(x) cos -cos > taylor(exp(cos(x)), x=0, 4 ); 2 4 exp(1) - 1/2 exp(1) x + O(x ) > int(x^2,x=0..1); 1/3 > int(x*exp(x),x); x exp(x) - exp(x) > fx:=sin(x)/x; sin(x) fx := -----x > > int(fx,x=0..infinity); 14 Prise de contact Pi ---2 > y:=’y’; y := y > int(int(exp(-x^2-2*y^2-3*y),x=-infinity..infinity),y=-infinity..infinity); 1/2 1/2 exp(9/8) Pi 2 # > n:=’n’: e2:=sum(k^2,k=1..n); 3 2 (n + 1) (n + 1) e2 := -------- - -------- + n/6 + 1/6 3 2 > factor(e2); n (n + 1) (2 n + 1) ------------------6 > s:=Sum(a(n)*sin(n*x),n=0..infinity); infinity ----\ s := ) a(n) sin(n x) / ----n = 0 > s0:=subs(x=0,s); infinity ----\ s0 := ) a(n) sin(0) / ----n = 0 > simplify(s0); 0 # avec versions précédentes simplify(s0); -> # infinity # ----# \ # ) 0 # / # ----# n = 0 > evalf(s0); 0. > value(s0); 0 > 1.2 Exemples de commandes 15 > pi2s6:=sum(1/k^2,k=1..infinity); 2 Pi pi2s6 := --6 > k:=’k’:sn2:=sum(1/k^2,k=1..n); 2 Pi sn2 := -Psi(1, n + 1) + --6 > asympt(sn2,n); 2 Pi 1 1 1 1 --- - 1/n + ---- - ---- + ----- + O(----) 6 2 3 5 6 2 n 6 n 30 n n > > y:=’y’: > s:=dsolve(diff(y(x),x$2) + y(x), y(x)); s := y(x) = _C1 sin(x) + _C2 cos(x) # attention l’ordre de sin(x) et de cos(x) peut changer # > y(x); y(x) > assign(s); > y(x); _C1 sin(x) + _C2 cos(x) > y(0); y(0) > simplify(y(0)); y(0) > subs(x=0,y(x)); _C1 sin(0) + _C2 cos(0) > simplify(%); _C2 > coeff(y(x),sin(x)); _C1 > print(y); proc() option remember; ’procname(args)’ end proc > print(y(x)); _C1 sin(x) + _C2 cos(x) > print(y(t)); y(t) > whattype(y); symbol 16 Prise de contact > whattype(y(x)); + > whattype(y(t)); function > has(y(x),sin(x)); true > select(has,y(x),sin(x)); _C1 sin(x) > > > > # suites recurrentes > printf("Maintenant suites recurrentes, RETURN "); Maintenant suites recurrentes, RETURN > ret(): n:=’n’: p:=’p’: up:=rsolve(u(n+2)=u(n+1)+u(n),u(p)); > restart: # rsolve est tres capricieux > V3:= evalb(evalf(E-exp(1)) =0); V3 := false > n:=’n’: p:=’p’: up:=rsolve(u(n+2)=u(n+1)+u(n),u(p)); / 1/2 \p 1/2 1/2 | 5 | up := (1/2 u(0) + 1/10 u(0) 5 - 1/5 u(1) 5 ) |- ---- + 1/2| \ 2 / / 1/2 \p 1/2 1/2 |5 | + (1/2 u(0) - 1/10 u(0) 5 + 1/5 u(1) 5 ) |---- + 1/2| \ 2 / > u(0):=1: u(1):=1: > u5:=subs(p=5,up); / 1/2\ | 5 | u5 := |1/2 - ----| \ 10 / / 1/2 \5 / 1/2\ | 5 | | 5 | |- ---- + 1/2| + |1/2 + ----| \ 2 / \ 10 / > evalf(u5); 7.999999983 > if (V3) then readlib(rationalize): fi: > rationalize(u5); 8 > > u:=n->u(n-1)+u(n-2): # u(5); # Error, (in u) too many levels of recursion > u(0):=1:u(1):=1: u(5); 8 > > n:=’n’:u:=evaln(u); / 1/2 \5 |5 | |---- + 1/2| \ 2 / 1.2 Exemples de commandes 17 u := u # pb avec version 7, reponse correcte apres restart ??? > > rsolve(u(n)=2*u(n/2)+n,u(n)); n (u(1) ln(2) + ln(n)) ---------------------ln(2) > # calcul sur les groupes > printf("Maintenant calcul sur les groupes, RETURN "); Maintenant calcul sur les groupes, RETURN > ret(): > > with(group): > g:=permgroup(5,{[[1,2]],[[1,2,3,4,5]]}); g := permgroup(5, {[[1, 2]], [[1, 2, 3, 4, 5]]}) > grouporder(g); 120 > isabelian(g); false > > > # Transformation de Fourier > printf("Maintenant transformation de Fourier, RETURN "); Maintenant transformation de Fourier, RETURN > ret(): > > if (V3) then readlib(fourier): else with(inttrans) fi: > > y:=’y’: fo:=fourier(exp(-Pi*t^2/2),t,y); 2 y 1/2 fo := exp(- ----) 2 2 Pi > > > > > > > > > > > > > > > > > > > > 18 Prise de contact > # plots > printf("Maintenant dessins, RETURN "); Maintenant dessins, RETURN > ret(): > > plot(sin(x),x=-10..10); AAA 1+ AAAA AAA A AA + AA A AA AA AA A + A A AA AA A A + AA AA A A A A + A A AA A A A A 0.5+ AA A A A A A A + A A A A A A AA +AA A A A A A A +A A A A A A A +A A AA AA ++*++-++-++-++*++-++-++-++*++-++-++-+**+-++-++-++*++-++-++-++*++-++-++-++*++ AA AA A * A A A -10 A -8 A-6 -4 A -2 * 2 A 4 6 8 10 A A A A+ A A A A A A A+ A AA A A A A -0.5+ A A A AA AA A A + A A A A AA AA + A A AA AA A A + A AA AA AA A AA + AA A AAA AAAA -1+ AAA > > plot(sin(x)+0.08*cos(40*x),x=-10..10); AA + AAA AAA AAAA 1+ AAAA AAAAA AAA AA + AAAAAA AA AA AA AA + AA AA AA AA AA AA + AA AA AA AA A A AA 0.5+ A AA AA AA AA AA AA + A AA AA AA A A AA + A A AA AA AA AA A +A AA A A A AA AA *A A AA A ++*++-++-++-++*++-++-++-+**++-++-++-+**+-++-++-++*++-++-++-++*++-++-++-++*++ AA AA A * AA AA A -10AA -8 A-6 -4 A -2 A* 2 A 4 6A 8 10 A A A A* AA AA AA A AA A A+ A A AA AA A A -0.5+ AA A A AA A AA A + AA AA AA AA A AA + AA AA AAA AA AA AAA + AAAAAAA AAAAA AAAAA-1+ AAAAA AAA AA + AAA > > > > with(plots): Warning, the name changecoords has been redefined 1.2 Exemples de commandes > plotsetup(ps,plotoutput=‘tore.ps‘): > n:=10; n := 10 > tubeplot({[10*cos(t),10*sin(t),0, > t=0..2*Pi,radius=2,numpoints=10*n,tubepoints=2*n], > [cos(t)*(10+4*sin(9*t)),sin(t)*(10+4*sin(9*t)),4*cos(9*t), > t=0..2*Pi,radius=1,numpoints=trunc(37.5*n),tubepoints=n]}, > scaling = CONSTRAINED , orientation = [76,40]); > 19 20 Prise de contact Chapitre 2 Environnement : relation avec le système d’exploitation L’utilisation de Maple dépend de 3 choses : - De l’interface choisie, Texte ou Graphique, - Du système d’exploitation, Unix, Windows, Macintosh, - De la version utilisée. Les nouvelles versions de Maple offrent des possibilités importantes pour exporter les calculs, en documents latex, html ...Ces possibilités nécessitent l’usage de Maple en mode Graphique et la création de ce que Maple appelle feuilles de calcul. Il n’est pas question ici de regarder ces fonctionnalités. On s’intéresse principalement au mode Texte, plus rustique, qui présente par ailleurs le grand avantage d’être beaucoup plus portable. Bien que générales, les explications qui suivent concernent le mode Texte sous Unix. 2.1 Personnalisation du système Le fichier .mapleinit, s’il existe dans le répertoire personnel (home directory) est exécuté en début de toute session Maple. On peut donc y mettre les instructions dont on souhaite systématiquement l’exécution. Par exemple plotsetup(X11) ; kernelopts(printbytes=false) ; 2.2 Chargement d’un fichier Il est fondamental de passer par l’intermédiaire de fichiers pour solliciter Maple. En mode Texte ces fichiers sont des fichiers ordinaires (Texte, Ascii) que l’on écrit avec n’importe quel traitement de texte (qui ne doit rien ajouter d’autre que ce que l’on a écrit). Ils contiennent des requêtes Maple, complètement identiques à celles que l’on tape au Toplevel. Pour faire connaı̂tre leur contenu il faut utiliser la commande read(). (Les copiés-collés ne peuvent être utilisés que pour quelques lignes). La syntaxe d’utilisation de read est read(nom_de_fichier); nom de fichier est une chaı̂ne de caractère qui doit désigner correctement le fichier à solliciter, avec chemin d’accès si nécessaire. En principe (version ≥ 4) les chaı̂nes de caractères sont à mettre entre guillemets (”). Si nom de fichier ne contient pas de signe Maple (−, /, \, ..) les guillemets peuvent être omis. On reviendra plus loin sur la façon dont Maple évalue les objets. Par exemple la commande read("/tmp/prog1.txt"); demande à Maple d’ouvrir le fichier /tmp/prog1.txt et d’exécuter toutes les requêtes qui s’y trouvent, exactement comme si elles étaient tapées au Toplevel. Note : Les fichiers provenant des feuilles de calcul, (extension ”.mws”) ne peuvent pas être lues en mode Texte. Il est nécessaire de passer en mode Graphique, et d’utiliser read ou le menu Fichier-Ouvrir. 22 Environnement : relation avec le système d’exploitation 2.3 Commandes système Comme avec tous les langages et tous les interprètes, Maple offre la possibilité de lancer des commandes systèmes depuis l’intérieur d’une session. Il y a pour cela la fonction system() et le macro caractère ” !”. system("ls") system("pwd") !ne prog1.txt 2.4 # liste le répertoire courant # affiche le nom du répertoire courant # édite (si éditeur ne existe) prog1.txt Historique des commandes En mode Texte (pas en mode Graphique), on peut rééditer les commandes avec les flèches ↑ et ↓. C’est très commode. On peut aussi afficher les 3 derniers résultats avec %; %%; %%%; # dernier résultat # avant dernier # avant avant dernier On peut aussi indexer les résultats en utilisant au préalable la fonction history() ; 2.5 Chargement des bibliothèques Afin que le système démarre rapidement et n’occupe que peu de mémoire, Maple ne charge en début de session, que le minimum, le noyau. De ce fait c’est à l’utilisateur de réclamer le chargement des bibliothèques nécessaires. Il n’a pas à connaı̂tre leur localisation. Il y a deux fonctions de chargement, with() et readlib(). with(linalg); # charge toutes les fonctions # de la bibliothèque d’algèbre # linéaire linalg readlib(ancienne_bibliotheque); 2.6 Visualisation du code d’une fonction On dispose du code de toutes les fonctions des bibliothèques écrites en Maple. Ce n’est pas très facile, mais c’est instructif de pouvoir les regarder. interface(verboseproc=2); print(sin); # affiche le code de la fonction # sinus # ou showstat(sin); 2.7 Exécution en mode batch En dehors de Maple, sous le système d’exploitation, il est possible de lancer Maple pour l’exécution d’un unique fichier. Et éventuellement de récupérer les résultats dans un autre fichier. maple nom_de_fichier > fichier_resultats 2.8 Débugage Rechercher les erreurs dans un programme est une chose courante. Ce n’est guère possible de programmer juste du premier coup. En général on ajoute des affichages supplémentaires pour contrôler les calculs. Maple fournit diverses possibilités supplémentaires. La valeur de la variable printlevel peut être modifiée. Plus la valeur est grande (7,15,255,..), plus Maple donne d’information sur les calculs effectués et sur les paramètres passés aux différentes fonctions. Il y a aussi les fonctions trace() et stopat() qui permettent le pas à pas. (Consulter l’aide en ligne). 2.9 Aide en ligne 2.9 Aide en ligne L’aide en ligne est très complète et plutôt bien faite. La consultation est beaucoup plus commode en mode Graphique grâce au système hypertexte. En mode Texte, on utilise le macro-caractère ” ?” ou la fonction help(). L’aide est retournée par un affichage page par page (programme more très archaı̈que). ”Return” fait avancer d’une ligne, ”espace” d’une page, ”q” fait sortir. 23 24 Environnement : relation avec le système d’exploitation Chapitre 3 Éléments complémentaires de syntaxe Les requêtes Maple sont réalisées par l’intermédiaire d’un langage de programmation qui est un mélange de langage fonctionnel et de langage procédural (impératif). Les requêtes sont aussi bien des demandes d’évaluation de fonction (comme en Lisp) que des demandes d’exécution d’instruction. On a déjà vu dans les chapitres précédents certain éléments de la syntaxe. Complétons par 3.1 3.1.1 Les branchements conditionnels Le si Le si peut être utilisé sous deux formes, instruction et fonction : l’instruction if Voici un exemple d’utilisation qui présente un certain mélange : x:=1; if (x=7) then 5; else print(10*x); fi; Exécutée au Toplevel, cette requête provoque l’affichage de ”10”, et retourne ce que la fonction print retourne, c’est-à-dire NULL. x:=7; if (x=7) then 5; else print(5*x); fi; # -> 5 la fonction if x:=1; x:=7; %; x:=1; y; x:=9; y; ‘if‘(x=7,5,55); ‘if‘(x=7,5,55); # -> 55 # -> 5 # -> 5 y:=‘if‘(x=7,5,55); y:=‘if‘(x=7,5,print(10*x)); # -> 55 # affiche 90 # -> suite vide (NULL) 26 Éléments complémentaires de syntaxe 3.1.2 Le choix multiple x:=1; if (x=7) then 100; elif (x=8) then 200; else 300; fi; 3.2 Les répétitions 3.2.1 La boucle pour # -> 300 Il y a plusieurs façon de faire circuler les indices : la forme courante for i from 1 to 10 do print(10*i); od; %; s:=0; for i from 1 to 3 do s:=s+i^2; od; # parcours d’une suite d’indices # affiche les nombres 10,20,.. # -> true (résultat déroutant) %,s,i; # au Toplevel affiche les valeurs # intermédiaires de s # -> 14,14,4 # calcul équivalent s:=add(i^2,i=1..3);s; # -> 14 parcours des éléments d’une structure l:=[3,2,1]; s:=0; for i in l do s:=s+i^2; od; %,s,i; q:=sin(x)+2*x*y*ln(x+y); for u in q do print(u); od; # -> 14,14,1 # # # # affiche sin(x) et 2 x y ln(x + y) qui correspondent aux fils de niveau 1 de l’arbre syntaxique de l’expression q Note : il n’y a pas de forme fonctionnelle pour for. 3.2.2 La boucle tant que while seul i:=1; while (i<10) do print(i); i:=i+1; od; # affiche 1,2,.. 3.2 Les répétitions 27 en association avec for l:=[3,2,1,100]; for i in l while (i^2 > 1) do print(i); od; # affiche 3,2 28 Éléments complémentaires de syntaxe Chapitre 4 Les structures de base 4.1 Les objets Maple C’est un peu confus (pour moi). D’une certaine manière l’utilisateur ne voit pas les structures informatiques. Il y a mélange entre structures informatiques et mathématiques. 4.1.1 Les objets atomiques (ou scalaires). On peut distinguer - les symboles (ex toto), - les entiers, - les flottants, - les nombres en précision arbitraire, - les booléens (true,false,FAIL), - les chaı̂nes de caractères (ex "toto"). Le codage de ces types et leur étendu ne sont pas (ou sont peu) documentés. Les fonctions whattype() ; et type() ; permettent d’obtenir de l’information. Cette information est principalement de nature mathématique. 4.1.2 x:=5: y:=5/2: y2:=5.0/2: z:=’z’: u:= 2*z+5*x: t:=’t’: whattype(x); whattype(y); whattype(y2); whattype(z); whattype(u); type(x,rational); type(y,rational); type(y2,rational); type(z,rational); type(u,rational); # # # # # # # # # # assume(t,integer): type(t,integer); # -> false, t a pour valeur le symbole t -> -> -> -> -> -> -> -> -> -> integer fraction float symbol + true true false false false Les structures de base Maple manipule efficacement - les suites. Elles sont représentées extérieurement comme 2,1,0,1,2, - les listes. Elles sont représentées extérieurement comme [2,1,0,1,2], - les ensembles. Ils sont représentés extérieurement comme {0,1,2}. La fonction seq() et le macro caractère $ permettent de définir les suites. Les crochets [] et les accolades {} permettent de définir les listes (list) et les ensembles (set). Les fonctions union() , intersect() , minus() , member() sont associées aux ensembles. 30 Les structures de base 4.1.3 Les structures composites Ces structures, plus riches et plus complètes que les structures de base, ne se comportent pas comme les premières. On y reviendra ultérieurement. On distingue les - les tables (table), - les tables-procédures, - les tableaux (array), - les vecteurs et les matrices (vector, matrix (linalg)), - les fonctions. Les exemples qui suivent, un peu laborieux mais incontournables, montrent des différences déroutantes de comportement entre les structures de base et les structures composites. Les structures de base s’utilisent de façon plus intuitive. Ces exemples montrent aussi qu’il vaut mieux éviter de créer implicitement, sans les contrôler, des objets composites. On reviendra plus complètement sur les évaluations. # comportement des listes l:=[1,5,7] # # # # # # # # # l est un symbole dont la valeur est une liste -> [1,5,7] -> list -> list -> 1,5,7 -> 1 -> erreur -> erreur # # # # # # # # # # # création d’une table -> a, pas d’évaluation au plus profond niveau -> table([2 = 5]) -> 5 -> a[1] -> symbol -> table -> table([2 = 5]) -> [2 = 5] -> list op(eval(g)); whattype(op(eval(g))); # # # # # # # # # # # # création d’une table-procédure -> g -> proc() option remember; ’procname(args)’ end proc -> 5 -> g(1) -> symbol -> procedure -> proc() option remember; ’procname(args)’ end proc -> remember, table([2 = 5]) -> exprseq # les fonctions f:= n -> n^2; f; eval(f); # création d’une fonction # -> f # -> n -> n^2 l; whattype(l); whattype(eval(l)); op(l); l[1]; l[4]; l[4]:=8; # comportement des tables a:=’a’: a[2]:=5; a; eval(a); a[2]; a[1]; whattype(a); whattype(eval(a)); op(a); op(eval(a)); whattype(op(eval(a))); # les tables-procédures g:=’g’: g(2):=5; g; eval(g); g(2); g(1); whattype(g); whattype(eval(g)); op(g); 4.1 Les objets Maple f(toto); whattype(f); whattype(eval(f)); op(f); op(eval(f)); # # # # # -> -> -> -> -> h:= proc(n) n^2; end; # # # # # # # création d’une fonction petite différence avec f -> proc(n) n^2 end -> symbol -> procedure -> proc(n) n^2 end -> n eval(h); whattype(h); whattype(eval(h)); op(h); op(eval(h)); 4.1.4 31 toto^2 symbol procedure n -> n^2 n, operator, arrow Création explicite de structures composites tables d:=table(); d[titi]; d[titi]:=cos(xx); d[titi]; # création d’une table sans instanciation # -> d[titi] # -> cos(xx) # création explicite dd:=table([(2) = 100, (toto) = 3*xx^2]); dd[toto]; # -> 3 * xx^2 dd[tata] := 24; dd[tata]; # -> 24 tableaux v:=array(-2..2,[4,1,0,1,4]); v; eval(v); print(v); lv:=convert(v,list); lv; v[-2]; lv[1]; v[3]; v[3]:=1000; # # # # intervalle des indices = -2 .. 2 -> v -> array(-2..2, [(-2)=4, ...]) -> array(-2..2, [(-2)=4, ...]) # # # # # -> -> -> -> -> [4,1,0,1,4] 4 4 erreur erreur vecteurs et matrices Les types vector et matrix font en principe partie de la bibliothèque linalg. Mais ils sont visibles sans son chargement. l:=[1$4]; v:=vector(4,l); v; eval(v); print(v); evalb(l=v); evalb(l=eval(v)); evalb(l=convert(v,list)); m:=matrix(2,4,[l,2*l]); # # # # # # # # # # -> -> -> -> -> -> -> [1 [ [2 v [1,1,1,1] vu comme la liste sous-jacente [1,1,1,1] false false true 1 1 2 2 1] ] 2] 32 Les structures de base compatibilité entre les tableaux et les matrices Il y a compatiblité si les intervalles des indices sont de la forme [1..n]. On s’y perd un peu. l:=[1$4]; b:=array(1..2,[l,2*l]); c:=array(1..2,1..4,[l,2*l]); m:=matrix(2,4,[l,2*l]); evalb(b=m); evalb(c=m); type(b,matrix); type(c,matrix); eval(b); eval(c); 4.2 4.2.1 # # # # # # # # # -> -> -> -> -> -> [1 [ [2 false false false true [[1, 1, 1, 1], [2, 2, 2, 2]] 1 1 2 2 1] ] 2] Manipulations des objets de base Extraction op extrait les composantes d’une expression ou d’une structure. Il retourne une suite. op([1,4,2]); op(1,4,2); op({1,4,2,1}); op(1+2+3); op(x+y-z); op(x/y/z); 4.2.2 # # # # # # -> -> -> -> -> -> 1,4,2 (c’est une suite) erreur 1,2,4 6 x,y,-z x,1/y,1/z Sélection op permet également d’extraire un seul élément. op(2,[x,y,z]); l:=[4,5,6,7,8]: l[2]; l[1..3]; l[2..-1]; l[2..-2]; op(2,x+y*z-8); 4.2.3 # # # # # -> -> -> -> -> 5 [4,5,6] [5,6,7,8] [5,6,7] y*z Nombre d’éléments l:=[4,5,6,7,8]: nops(l); 4.2.4 # -> y # -> 5 Constitution de suites et de listes Les listes sont plus faciles à manipuler que les suites qui se confondent souvent avec les paramètres passés aux fonctions. s:=NULL; l:=[NULL]; ll:=[]; evalb(l=ll); l:=[4,5,6]; l:=[seq(i^2,i=2..6)]; l:=[2$4]; m:=[x,y,z]; # # # # suite vide liste vide liste vide -> true 4.2 Manipulations des objets de base 33 n:=[100,op(l)]; o:=[op(l),op(m)]; 4.2.5 # -> [100,2,2,2,2] # -> [2,2,2,2,x,y,z] Test de la suite ou de la liste vide if (nops(l) = 0) then ... # ou if (s = NULL) then ... # ou if (l = [NULL]) then ... # ou if (op(l) = NULL) then ... 4.2.6 La fonction map la fonction map prend en entrée une structure et une fonction, elle retourne la structure dont les éléments sont les images des éléments de la structure source. l:=[1,2,3]; map(t->t^2,l); e:=x^2+25*y+Pi/2; map(sin,e); # -> [1,4,9] 2 # -> sin(x ) + sin(25 y) + 1 34 Les structures de base Chapitre 5 Les expressions booléennes Il y a trois booléens, true, false, FAIL. Par FAIL Maple signifie qu’il ne sait pas. FAIL se comporte comme false dans les tests. La fonction evalb() est dédiée à l’évaluation des expressions booléennes. 5.1 Le symbole ”=” a deux sens. Dans un test genre if (x = 8) then ... il se comporte comme un prédicat. Dans cette construction, (x = 8) est une expression booléenne. Par contre dans l’expression e:=(x=y); il sert à définir un objet de type équation. e:=((x-1)*(x-2) = (x-1)); e; whattype(e); solve(e); evalb(e); evalb(subs(x=3,e)); 5.2 # # # # # -> -> -> -> -> (x - 1) (x - 2) = x - 1 = 3,1 false true Le prédicat ”=” est universel. Il peut s’appliquer à tous les objets. a:={5,4,2,1,0,3}; b:={seq(abs(i),i=-5..5)}; evalb(a=b); # -> true Mais attention aux tests du genre evalb(sin(x)^2 + cos(x)^2 = 1); # -> false evalb(simplify(sin(x)^2+cos(x)^2) = 1); # -> true dont la réponse est imprévisible. 5.3 Le prédicat ”<” A la différence du prédicat "=" qui est universel, les prédicats "<" et ">" ne s’appliquent qu’aux nombres. Ceci est la raison de nombreuses erreurs dans l’exécution de fonctions contenant des tests d’inégalité lorsque les expressions à comparer comportent des variables n’ayant pas de valeur numérique. 36 Les expressions booléennes if (x < 3) then ... f:=x-> if (x < 0) then 0 else 1; fi; f(-2); plot(f(x),x=-5..5); # -> erreur quand x n’a pas de # valeur numérique # -> 0 # -> erreur cannot ... Pour contourner le problème de la comparaison impossible lors d’un plot, il y a plusieurs solutions : 1. f:=x-> if (x < 0) then 0 else 1; fi; plot(f(x),x=-5..5); plot(’f(x)’,x=-5..5); # -> erreur cannot ... # ok 2. f:=x-> if (type(x,numeric)) then if (x < 0) then 0 else 1; fi; else ’f(x)’; fi; plot(f(x),x=-5..5); # ok Note : Ce problème ne se produit ni avec la fonction piecewise() ni avec la fonction ‘if‘(). f:=x->piecewise(x<0,0,1); plot(f(x),x=-5..5); # ok f:=x->‘if‘(x<0,0,1); plot(f(x),x=-5..5); # ok Attention aussi aux tests dont Maple ne connaı̂t pas la réponse : x := -int(t*cos(exp(t)),t=0..1); evalf(x); is(x>0); evalb(x>0); if (x>0) then print("x > 0"); else print("x <= 0"); fi; if (is(x>0)) then print("x > 0"); else print("x <= 0"); fi; if (evalf(x) > 0) then print("x > 0"); else print("x <= 0"); fi; # # # # -> -> -> -> -int(...) 0.1897747668 FAIL int(...) < 0 # -> error ... # -> "x <= 0" # -> "x > 0" Chapitre 6 Les évaluations Le fonctionnement des évaluations est un peu délicat, car il diffère selon les objets à évaluer (scalaires, objets basiques, objets composites) et suivant le contexte (Toplevel, intérieur des fonctions). On doit retenir les règles suivantes : 6.1 Règles d’évaluation 1. Au Toplevel, Maple évalue au plus profond niveau et retourne le résultat de la dernière évaluation. Sauf pour les objets composites (table, array, vector, matrix, function . . .) qu’il évalue jusqu’au ”dernier nom”. (last name evaluation, cf exemples ci-dessous). 2. A l’intérieur des fonctions (ou procédures), Maple n’évalue qu’au premier niveau. 3. On dispose de fonctions spécifiques pour forcer l’évaluation : fonctions eval evalf, evalhf evalb evalm evalc evala evalr type d’utilisation universel flottants, booléens, algèbre linéaire, nombres complexes, nombres algébriques, calcul par intervalles value évaluation des fonctions inertes. syntaxe eval(x), eval(x,n), eval(sin(x),x=0) 4. La fonction evaln() et le dispositif de quotage ’x’ permettent de retarder l’évaluation. 5. Au Toplevel, lors des affectations (x := y), il y a recopie de la valeur au plus profond niveau du membre de droite. Sauf lorsque celui-ci est de type composite, auquel cas il y a pointage. 6.2 6.2.1 Illustration des règles Niveau d’évaluation et affectations au Toplevel x:=’x’: y:= ’y’: z:=’z’: x:=y; y:=z; z:=1; x; z:=4; x; # # # # -> 1. Evaluation au plus profond niveau x pointe sur y qui pointe sur z dont la valeur est 1 # -> 4 38 Les évaluations x:=5; z; t:=y; t; y:=55; t; # -> 4, x ne pointe plus sur y # # # # t prend la valeur au plus profond niveau de y, c’est-a-dire 4. t n’a plus de relation avec y et z -> 4 # -> 4 dans une fonction essai:=proc() local x,y,z; x:=y; y:=z; z:=1; print(x,y,z); print(eval(x,2)); end; essai(); # la procédure affiche y,z,1 et z # elle retourne NULL (print) essai2:=proc() local x,y,z; x:=y; y:=z; z:=1; print(x,y,z); eval(x,2); end; essai2(); a:=essai2(); a; eval(a,1); # la procédure affiche y,z,1 # et retourne z # # # # # # # -> 1 -> z a a pour valeur z qui a pour valeur 1 (ce qui n’est pas très normal puisque z vient d’une variable locale de essai2) # # # # # # -> m -> [a b] [ ] [c d] idem avec eval(m), print(m), eval(m,1) last name evaluation m:=matrix(2,2,[a,b,c,d]); m; evalm(m); m1:=m; m2:=m1; m3:=m2; m,m1,m2,m3; eval(m1,1),eval(m2,1),eval(m3,1); # -> m,m,m,m # -> m,m,m m5:=m4; m4:=m3; m4,m5; eval(m4,1), eval(m5,1); # -> m,m # -> m,m4 6.2 Illustration des règles print(m5); f:= 2*b+c; b:= 1; f; b:= 10; f; eval(m); map(eval,m); 6.2.2 39 # -> [a # [ # [c b] ] d] # -> 2 + c # # # # # # -> 20 + c -> [a b] [ ] [c d] b n’est pas vu de la m^ eme façon dans f et dans m # -> [a # [ # [c 10] ] d] Affectations cas des listes l1:=[2,3,4]; l2:=l1; l2[2]:=33; l1; l2; # # # # # -> [2,3,4] -> [2,33,4] il y a eu recopie de la valeur de l1 et distinction totale entre l1 et l2 # # # # # # # -> v1 [2,333,4] il n’y a pas eu recopie de la valeur au plus profond niveau de v1, v2 pointe sur v1, une modification de v2 entra^ ıne une modification de v1 cas des tables Attention danger ! v1:=vector(3,l1); v2:=v1; v2[2]:=333; v1; eval(v1); v3:=copy(v1); v3[3]:=444; eval(v1); 6.2.3 # recopie # [2,333,4] Quotage La fonction evaln() et le dispositif de quotage retardent l’évaluation. y:=’y’: x:=y; y:=1; 40 Les évaluations x; eval(x,1); eval(’x’,1); eval(’x’,2); eval(’x’,3); eval(’’x’’,3); eval(’2*x’,1); eval(’x+5’,2); x:=evaln(x); x; 6.2.4 # # # # # # # # # # -> 1 -> y -> x -> y -> 1 -> y, (deux fois signe quote) -> 2 x -> y+5 meme effet que ’x’ -> x Quelques différences difficilement prévisibles Les variables d’indice des fonctions seq, add, sum, int ,... n’ont pas le même comportement selon les versions de Maple et selon que les fonctions font partie du noyau (built-in functions, codées en binaire) ou au contraire font partie des fonctions écrites en Maple. Voici quelques exemples, tous provenant d’une exécution en version 7. i:=’i’; sum(i,i=1..3); i; i:=5; sum(i,i=1..3); i:=5; add(i,i=1..3); i:=5; seq(i,i=1..3); i; i:=5; sum(i,’i’=1..3); i:=5; sum(’i’,’i’=1..3); i; # # # # # # # # # # # # -> 6 -> i erreur -> 6 -> 1,2,3 -> 5 add et seq sont des fonctions de bas niveau contrairement à sum -> 15 (3x5) -> 6 -> 5 Chapitre 7 Les fonctions 7.1 Définition des fonctions On peut définir les fonctions avec l’opérateur → ou en utilisant proc(). Voir les exemples dans les chapitres précédents. 7.2 Comment voir le contenu des fonctions showstat(sum); # ou interface(verboseproc=2); print(sum); # # # # # 7.3 affiche le programme de la fonction sum. Cette fonction comporte de nombreuses méthodes qu’il convient de suivre. (laborieux) Fonctions anonymes Il est possible d’utiliser des fonctions sans leur donner de nom. ((x,y) -> x * y) (2,20); map(t->t^2, [1,2,3]); 7.4 # -> 40 # -> [1,4,9] Variables locales, variables globales On peut choisir le statut des variables utilisées dans la définition des fonctions avec les déclarations local ou global. Par défaut Maple émet un avertissement et déclare local les variables qui ne sont pas déclarées et qui n’existent pas par ailleurs. Mais je déconseille de profiter de cette disposition, je recommande de procéder systématiquement aux déclarations. f:=proc() global a,b; local x,y; a:=1; b:=10; x:=100; y:=1000; end; a:=-1; b:=’b’; 42 Les fonctions x:=-100; y:=’y’; f(); a,b,x,y; 7.5 # # # # # # -> 1000. Les variables x et y n’ont d’existence que lors de l’exécution de f(). Par contre, le statut de a et b est modifié après l’exécution. -> 1, 10, -100, y Valeur retournée La valeur retournée par une fonction est celle de la dernière évaluation ou la valeur explicitement spécifiée par RETURN. Il me semble plus clair d’utiliser systématiquement RETURN(). On peut cependant utiliser les deux formes de retour dans la même fonction. f:=proc(n) if (n<2) then RETURN(1);fi; n*f(n-1); end; # fonction n! Attention à la commande plot dans une fonction : il faut savoir que la commande plot n’est pas une instruction d’affichage. Elle retourne en fait une structure informatique. Cette structure, exactement comme toutes les autres, n’est affichée à l’écran (ou imprimée, ou mise en fichier) que - si elle est soumise à la commande print, - ou si son évaluation s’est réalisée en dernier et si une demande implicite d’affichage (” ;” en fin d’expression) a été faite. On est toujours très surpris de ne pas voir les requêtes plot apparaı̂tre à l’écran. f1:=proc(a,b) local x; plot(sin(x),x=a..b); end; f1(0,10); # sortie écran ok f2:=proc(a,b) local x; plot(sin(x),x=a..b); b-a; end; f2(0,10); # -> 10 # pas d’affichage f3:=proc(a,b) local x; print(plot(sin(x),x=a..b)); b-a; end; f3(0,10); 7.6 # -> 10 # dessin ok Options On peut attacher aux fonctions plusieurs options. (Voir l’aide sur options). L’option remember est intéressante quand une fonction doit être évaluée plusieurs fois sur les mêmes paramètres. C’est notamment le cas pour les fonctions récursives d’ordre supérieur à 1. Quand une fonction est définie avec 7.7 Contrôle des paramètres 43 l’option remember, Maple attache une table à cette fonction, la table de remember. Lors de chaque évaluation, la table est consultée. Si l’évaluation a déjà été faite, le résultat y est puisé. Sinon les calculs sont réalisés et la table est enrichie. (L’aide en ligne sur ce sujet est bien faite). f:=proc(n) option remember; if (n<2) then RETURN(1);fi; n*f(n-1); end; f(5); f(7); 7.7 # 5 appels de la fonction # 2 appels seulement, f(5) pris dans la table Contrôle des paramètres On nomme paramètres formels les paramètres qui figurent dans la définition des fonctions, et paramètres effectifs ceux qui sont passés lors d’un appel. Le programmeur dispose des variables prédéfinies suivantes : - nargs contient le nombre des paramètres effectifs. Ce nombre peut être différent de celui des paramètres formels. - args est une variable qui contient la suite des paramètres effectifs. - procname est une variable qui contient le nom de la fonction. typage : Il est possible de ”typer” certains paramètres. Quand un paramètre est typé, Maple ajoute automatiquement au code de la fonction un test du paramètre effectif et retourne éventuellement un message d’erreur approprié. f:=proc(l::list) l[1]; end; f([2,3]); f([2,3],5); f(5,[2,3]); f(5); f(); 7.8 # # # # # -> -> -> -> -> 2 2 erreur erreur erreur Passage des paramètres Les paramètres sont passés aux fonctions par valeur. Cela veut dire que si x est une variable dont la valeur est 5, l’appel f (x) envoie 5 à la fonction f et non la variable x. Si l est une liste de valeur [1, 2, 3], l’appel g(l) envoie à g une copie de la liste [1, 2, 3]. Par contre si v est le vecteur [1, 2, 3], l’appel h(v) envoie à h la valeur de v telle qu’elle apparaı̂t lors de l’évaluation de v, c’est-à-dire, comme on l’a vu au chapitre 6 Les évaluations, la variable elle-même, et non une copie. Ce mode de passage a deux conséquences : - Les paramètres de type scalaire ou objet de base, ne peuvent être modifiés à l’intérieur des fonctions. f:=proc(x) x:=x+1; end; y:=5; f(y); # -> erreur, 5 := 6 impossible - Pour obtenir une modification d’une variable passée en paramètre, c’est-à-dire pour effectuer un passage par référence, il y a au moins deux solutions : 44 Les fonctions f1:=proc(x) x:=eval(x)+1; 10; end; y:=5; f(’y’); y; f2:=proc(x::evaln) x:=eval(x)+1; 10; end; y:=5; f(y); y; # -> 10, passage de y # -> 6 # déclaration de passage par référence # -> 10, passage de y # -> 6 Pour les objets composites, il n’y a rien à prévoir pour effectuer un passage par référence. Au contraire, si la fonction modifie un objet dont on désire conserver la valeur initiale (par exemple la matrice d’un système linéaire résolu par une méthode qui transforme le système), il peut s’avérer nécessaire d’en passer une copie avec la fonction copy(). f:=proc(x) x[1]:=x[1]+1000; end; v:=vector(3,[1$3]); f(v); v; eval(v); l:=[1$3]; f(l); f(’l’); l; # -> 1001 # -> v # -> [1001,1,1] # -> erreur # -> 1001 # -> [1001,1,1] Exemple Soit à programmer la fonction deuclide() qui retourne quotient et reste de la division euclidienne. On souhaite que deuclide(7,2) retourne 3, et que deuclide(7,2,r) retourne 3 et affecte r par le reste 1. (Comme la fonction Maple iquo()). deuclide:=proc(a,b,r::evaln) local q; q:=trunc(a/b); if (nargs > 2) then r:=a-b*q; fi; q; end; deuclide(7,2); z:=sin(x); deuclide(7,2,z); z; 7.9 # -> 3 # -> 3 # -> 1 Fonctions locales Il est possible de définir des fonctions locales à une fonction donnée. 7.9 Fonctions locales p4:=proc(x) local f; 45 # fonction x -> x^4 f:=proc(x) x^2; end; RETURN(f(f(x))); end; p4(2); # -> 16 Note : Avant la version 5, il était très difficile de faire passer à une fonction locale un paramètre de la fonction principale. C’est maintenant aisé. g:=proc(x,n) local f; f:= t->sin(n*t); RETURN(f(x)); end; g(Pi/2,3); # -> -1 46 Les fonctions Chapitre 8 Les modules Depuis la version 6, Maple offre la possibilité d’utiliser des modules. Les modules permettent - de créer des objets complexes, comme les enregistrements du Pascal (RECORD) et les structures du C (struct), avec la notion de champs associés aux objets. - de faire de la programmation orientée objet, offrant la possibilité d’attacher aux objets à la fois des structures de données et des fonctions (les méthodes), permettant l’héritage : on peut définir un type particulier dans un type déjà défini (classe) et profiter pour ce type particulier de tout ce qui existe pour le type père. On peut enrichir les méthodes. Consulter l’aide en ligne sur module, use ou help(" :-") ; (Version 7). 48 Les modules Chapitre 9 Les entrées-sorties Indiquons quelques fonctions impliquées dans la communication entre Maple et l’extérieur, c’est-à-dire l’écran, le clavier, les fichiers sur disque. 9.1 Les fonctions d’entrée-sortie 9.1.1 Fonctions de lecture Le périphérique d’entrée par défaut est le clavier. - readstat() est la fonction que l’interprète utilise pour acquérir les commandes. Elle est utilisable par les programmeurs. Elle procède à la saisie et à l’interprétation de la chaı̂ne lue. Elle retourne un objet Maple. (Les saisies sont terminées avec ” ;”). - readline() retourne une chaı̂ne de caractères. - scanf() permet la lecture formatée. 9.1.2 Analyse d’une chaı̂ne Les fonctions suivantes peuvent être utilisées pour analyser ou fouiller une chaı̂ne. parse(), sscanf(), substring(), convert(.,byte) 9.1.3 Fonctions d’écriture - print() est la fonction d’affichage de haut niveau. La syntaxe print("x" = x) est parfois intéressante. - lprint() permet un affichage basique, non centré. - printf() est une fonction d’affichage formaté. Exemple de syntaxe : printf("f(%3a) = %.5a\n",i,f(i)); la chaı̂ne contient des caractères qui sont affichés (f,(,), ,=), et des directives de formatage : %3a indique que la valeur de i doit être affichée sur 3 colonnes, %.5a indique que la valeur de f(i) doit l’être avec 5 chiffres après la virgule, \n est un ordre de retour à la ligne. Voir l’aide en ligne sur printf() pour les différents formats (réels, chaı̂nes, caractères, ...). 9.2 Les redirections Il est possible d’annuler l’affichage à l’écran et d’ordonner que les sorties se fassent dans un fichier. writeto(nom_de_fichier); # ou append(nom_de_fichier); Pour revenir à l’affichage initial à l’écran utiliser writeto(terminal); 50 Les entrées-sorties C’est la fonction read() déjà indiquée qui permet de rediriger les entrées. On peut exécuter les calculs en mode batch . Cela veut dire, qu’étant sous le système d’exploitation, en laçant la commande maple [options] fichier_source > fichier_resultat on ouvre une session Maple non interactive, qui cesse dès que les calculs présents dans fichier source sont achevés. Les résultats se trouvant dans fichier resultat. 9.3 Lecture de données dans un fichier Pour la lecture de données numériques écrites ”en clair” dans un fichier Texte (Ascii), la fonction readdata() convient bien. Si le fichier contient du texte et des valeurs numériques, readline() et parse() peuvent être intéressantes. Le fonction fscanf() permet de réaliser des lectures formatées et la fonction readbytes() permet de lire des données binaires. Exemple d’une fonction réalisant la lecture d’une image en nuances de gris au format PGM (sans commentaire). Les images PGM sont constituées de deux types de données : D’abord quelques lignes codées en caractères Ascii (mode texte) indiquant le type du fichier (P5 par exemple), contenant éventuellement des commentaires (# CREATOR ... par exemple), indiquant les dimensions de l’image (900 600 par ex) et le nombre de nuances de gris (255). Ensuite figurent les pixels (les 900 x 600 pixels) codés en binaire sur 1 octet. # la fonction loadpgm prend en entrée un nom de fichier f et retourne # une liste formée des dimensions de l’image et de la matrice des pixels. loadpgm:=proc(f) # f = nom_de_fichier local lg,haut,larg,dims,l; lg:=readline(f); # lg:=readline(f); while (substring(lg,1..1) = "#") do # les lg:=readline(f); od; dims:=sscanf(lg,"%d %d"); # haut:=dims[2]; larg:=dims[1]; lg:=readline(f); # l:=readbytes(f,infinity); # RETURN([haut,larg,matrix(haut,larg,l)]); end; 9.4 marque P5 commentaires les dimensions le nombre de nuances les pixels Écriture de données dans un fichier La fonction fprintf() permet l’écriture formatée et la fonction writebytes() l’écriture en binaire. Exemple d’une fonction réalisant l’écriture d’une image au format PGM : # la fonction sauvegm prend en entrée une image im (cf ci-dessus) et un # nom de fichier f. Elle écrit cette image au format PGM dans le fichier f sauvepgm:=proc(im,f) local canal,haut,m,i; haut:=im[1]; m:=im[3]; canal:=fopen(f,WRITE); fprintf(canal,"P5\n%d %d\n255\n",im[2],haut); for i from 1 to haut do writebytes(canal,convert(row(eval(m),i),list)); 9.4 Écriture de données dans un fichier od; fclose(canal); end; 51 52 Les entrées-sorties Chapitre 10 Manipulation des expressions 10.1 Diverses fonctions de manipulation 10.1.1 Assign Cette fonction permet l’affectation des membres gauches des équations résultant de l’utilisation de fonctions comme solve() ou dsolve(). Elle doit être utilisée modérément. Il est souvent préférable d’utiliser la fonction rhs() ou la fonction select/has() pour récupérer les expressions apparaissant dans les membres droits. > s:=solve({2*a+b=4,a+2*b=5},{a,b}); s := {b = 2, a = 1} > whattype(s); set > assign(s); > a,b; 1, 2 > y:=’y’: > s:=dsolve(diff(y(t),t) = 2* y(t),y(t)); s := y(t) = _C1 exp(2 t) > whattype(s); = > assign(s); > y(t); _C1 exp(2 t) > equat:=diff(x(t),t$2) - 4*x(t); / 2 \ |d | equat := |--- x(t)| - 4 x(t) | 2 | \dt / > init:={x(0)=1, D(x)(0)=10}; init := {D(x)(0) = 10, x(0) = 1} > sol:=dsolve({equat,op(init)}); sol := x(t) = 3 exp(2 t) - 2 exp(-2 t) > xt:=rhs(sol); xt := 3 exp(2 t) - 2 exp(-2 t) 54 Manipulation des expressions > equat:={v(t)=diff(x(t),t),diff(v(t),t) = - 10 - 2*v(t)}; d d equat := {v(t) = -- x(t), -- v(t) = -10 - 2 v(t)} dt dt > inits:={x(0)=20,v(0)=0}; inits := {v(0) = 0, x(0) = 20} > sol:=dsolve(equat union inits,{x(t),v(t)}); sol := {v(t) = -5 + 5 exp(-2 t), x(t) = -5 t - 5/2 exp(-2 t) + 45/2} > xt:=rhs(op(select(has,sol,x))); # = rhs(op(select(e->has(e,x),sol))) xt := -5 t - 5/2 exp(-2 t) + 45/2 10.1.2 Unapply Unapply permet de créer une fonction à partir d’une variable dont la valeur est une expression, ce qui ne peut se faire directement. > q := x^2 + y^3 + 1; 2 3 q := x + y + 1 > g:=x->q; g := x -> q > g(0); 2 3 x + y + 1 > f := unapply(q,x); 2 3 f := x -> x + y + 1 > f(0); 3 1 + y > diff(f(t),t); 2 t 10.1.3 Sort La fonction sort() permet de trier différents types d’objets. Elle a pour particularité de modifier les expressions passées en argument (ne modifie ni les suites ni les listes). > p:=x+5*x^2+8*x+1+x; 2 p := 10 x + 5 x + 1 > sort(p); 2 5 x + 10 x + 1 > p; 10.1 Diverses fonctions de manipulation 55 2 5 x + 10 x + 1 > l:=[5,4,15]; l := [5, 4, 15] > sort(l); [4, 5, 15] > l; [5, 4, 15] 10.1.4 Subsop Cette fonction permet de changer un opérande dans une expression. Elle permet des combinaisons sophistiquées, pas très aisées, par exemple dans les intégrales. > p := x^7+8*x^6+x^2-9; 7 6 2 p := x + 8 x + x - 9 > op(2,p); 6 8 x > y:=’y’: > subsop( 2=y^55, p ); 7 55 2 x + y + x - 9 > sort(%); 7 2 x + x + y - 9 10.1.5 Parse Parse est la fonction d’analyse et d’interprètation des chaı̂nes de caractères. Elle retourne un objet Maple. > x:=1: > "x+2"; "x+2" > parse("x+2"); x + 2 > eval(parse("x+2")); 3 10.1.6 Solve/identity La méthode identity attachée à la fonction solve() permet la résolution d’équations selon la méthode des coefficients indéterminés. > x:=’x’: a:=’a’: b:=’b’: > p:=a*x^3+(a+b+1)*x+(a-b-1); 3 p := a x + (a + b + 1) x + a - b - 1 56 Manipulation des expressions > solve(identity(p,x),{a,b}); {a = 0, b = -1} > p:=a*sin(2*x)+(a+b+1)*sin(x)+(a-b-1)*cos(x); p := a sin(2 x) + (a + b + 1) sin(x) + (a - b - 1) cos(x) > solve(identity(p,x),{a,b}); {a = 0, b = -1} 10.1.7 Allvalues Cette fonction travaille en association avec la fonction RootOf() pour obtenir toutes les solutions d’une équation. Mais elle est trop dépendante de la version Maple. Il est nécessaire de consulter l’aide en ligne de la version utilisée. 10.1.8 Value Cette fonction permet l’évaluation des expressions contenant des fonctions inertes. > F := Int(x, x); / | | x dx | F := / > F - 1/2 * x^2; / | 2 | x dx - 1/2 x | / > diff(F,x); x > value(F - 1/2 * x^2); 0 > i:=Int(1/x,x=1..infinity); infinity / | i := | 1/x dx | / 1 > j:=Int(1/(1+x),x=1..infinity); infinity / | 1 j := | ----- dx | 1 + x / 1 10.2 Réécriture 57 > d:=combine(i-j); infinity / | d := | | / 1 1 1/x - ----- dx 1 + x > value(d); ln(2) 10.2 Réécriture Voici quelques exemples de commandes permettant d’effectuer diverses transformations sur les expressions. 10.2.1 Expand > expand(tan(a+b)); tan(a) + tan(b) ----------------1 - tan(a) tan(b) 10.2.2 Simplify > subs(x=0,ln(exp(x))); ln(exp(0)) > simplify(%); 0 10.2.3 Factor > p:=cos(t)*sin(3*x) + ln(y)*sin(3*x); p := cos(t) sin(3 x) + ln(y) sin(3 x) > factor(p); sin(3 x) (cos(t) + ln(y)) L’utilisation de factor() permet parfois des simplifications difficiles : Soit à calculer la transformée √ de Hilbert de f 0 := 1 − t2 χ[−1,1] . La transformation de Hilbert est l’opérateur qui à une fonction f fait correspondre la fonction Z 1 ∞ f (t) H(p) = dt. π −∞ p − t La fonction Maple hilbert() du package inttrans est capable de faire ce calcul, mais elle échoue pour f 0 (version 7). Cependant le calcul est faisable directement. p Le résultat à trouver estpp pour −1 < p < 1, l’intégrale étant une valeur principale de Cauchy, p − p2 − 1 pour p > 1, et p + p2 − 1 pour p < 1. > with(inttrans): > f :=sqrt(1-t^2); 2 1/2 f := (1 - t ) 58 Manipulation des expressions > f0:=piecewise(t<=-1,0,t>=1,0,f); { 0 { f0 := { 0 { { 2 1/2 { (1 - t ) t <= -1 1 <= t otherwise > hilbert(f0,t,p); # echec t <= -1 { 0 { hilbert({ 0 { { 2 1/2 { (1 - t ) 1 <= t , t, p) otherwise > assume(-1<p,p<1); > h1:=int(f/(p-t),t=-1..1,’CauchyPrincipalValue’)/Pi; h1 := p~ > assume(p>1); > h2:=int(f/(p-t),t=-1..1)/Pi; 2 2 1/2 -p~ + p~ (p~ - 1) + 1 h2 := -------------------------2 1/2 (p~ - 1) Ce n’est pas facile de mettre h2 sous la forme simplifiée attendue. L’utilisation de factor() n’est pas la seule possibilité de simplification, mais ici elle est très pratique. > factor(h2,denom(h2)); 2 p~ - (p~ 10.2.4 1/2 - 1) Collect > p:=cos(t)*sin(3*x) + ln(y)*sin(3*x) + 5; p := cos(t) sin(3 x) + ln(y) sin(3 x) + 5 > collect(p,sin(3*x)); (cos(t) + ln(y)) sin(3 x) + 5 > f:=(2*a*x+4+6*b*x)/(8+8*c*x+4+6*x); 2 a x + 4 + 6 b x f := ----------------12 + 8 c x + 6 x > fc:=collect(f,x); (2 a + 6 b) x + 4 fc := ----------------(8 c + 6) x + 12 > simplify(fc); a x + 2 + 3 b x --------------6 + 4 c x + 3 x 10.2 Réécriture 59 > collect(simplify(fc),x); (a + 3 b) x + 2 --------------(4 c + 3) x + 6 10.2.5 Combine C’est souvent difficile de trouver les bonnes combinaisons à appliquer. > combine(4*sin(x)^3,trig); -sin(3 x) + 3 sin(x) > combine(Int(x,x=a..b)-Int(x^2,x=a..b)); b / | 2 | x - x dx | / a > combine(exp(x)^2*exp(y),exp); exp(2 x + y) > combine(ln(x+1)+ln(x-1)); ln(x + 1) + ln(x - 1) > combine(ln(x+1)+ln(x-1),ln); ln(x + 1) + ln(x - 1) > combine(ln(x+1)+ln(x-1),ln,symbolic); ln((x + 1) (x - 1)) # dans le m^ eme ordre d’idées > simplify(sqrt((x*y)^2,assume = positive); x y 10.2.6 Normal > p:=(x^2 - y^2)/(x-y) - (x+y); 2 2 x - y p := ------- - x - y x - y > normal(p); 0 10.2.7 Rationalize > f:=2/(2-sqrt(2)); 2 f := -------1/2 2 - 2 60 Manipulation des expressions > rationalize(f); 1/2 2 + 2 10.2.8 Convert Cette fonction a un champ d’utilisation très vaste. Voici quelques exemples : > t:=taylor(sin(x),x=0,4); 3 4 t := x - 1/6 x + O(x ) > convert(t,polynom); 3 x - 1/6 x > convert(exp(I*3*x),trig); cos(3 x) + I sin(3 x) > r:=(x^2+x+1)/(x^2+1); 2 x + x + 1 r := ---------2 x + 1 > rf:=convert(r,parfrac,x); x rf := 1 + -----2 x + 1 > rr:=(x^3+x+1)/expand((x+I)*(x-I)); 3 x + x + 1 rr := ---------2 x + 1 > convert(rr,parfrac,x,complex); # (Maple 7) .5000000000 I .5000000000 I x + ----------------- - ------------x + 1.000000000 I x - 1. I > convert(rr,fullparfrac,x); / ----\ | \ / _alpha \| x + | ) |- 1/2 ----------|| | / \ x - _alpha/| | ----| \_alpha = %1 / 2 %1 := RootOf(_Z # Ecriture en base autre que 10 > c:=convert(10,base,2); + 1) 10.2 Réécriture 61 c := [0, 1, 0, 1] # Ecriture en base 12 > b:=12: chiffres:=convert([$48..48+9,$65..65+max(0,b-1-10)],bytes); chiffres := "0123456789AB" > x:=23: StringTools[Reverse](cat(op(map(t->substring(chiffres,t+1),convert(x,base,b))))); "1B" > # ou > envers:=proc(l) local i; [seq(l[-i],i=1..nops(l))];end: > x:=23: cat(op(map(t->substring(chiffres,t+1),envers(convert(x,base,b))))); "1B" # Pas facile d’obtenir 0 partir de l’expression suivante (version >= 4) > s:=sum(exp(2*I*Pi*k/7),k=0..6); s := 1 + exp(2/7 I Pi) + exp(4/7 I Pi) + exp(6/7 I Pi) + exp(-6/7 I Pi) + exp(-4/7 I Pi) + exp(-2/7 I Pi) > convert(s,polar); polar(0, 1/2 Pi) > evalc(convert(s,polar)); 0 > u:=sin(Pi/10); u := sin(1/10 Pi) > convert(u,radical); 1/2 1/4 5 - 1/4 62 Manipulation des expressions Bibliographie [1] Waterloo Maple. Maple V, Learning Guide (fourni avec le logiciel). Springer. [2] Waterloo Maple. Maple V, Programming Guide (fourni avec le logiciel). Springer. [3] P. Dumas, X. Gourdon. Maple. Son bon usage en mathématiques. Springer, 1997. [4] C.Gomez B.Salvy, P.Zimmermann. Calcul formel. Mode d’emploi. Exemples en Maple. Masson, 1995. [5] A. Heck. - Introduction to Maple. Springer Verlag New York 1993. [6] P. Saux Picart. - Cours de calcul formel. Ellipses fr Paris 1999. [7] P. Douillet. - Maths avec Maple t1 et t2. Ellipses fr Paris 1995. [8] W. Gander, J. Hrbicek. - Solving problems in scientific computing using Maple and Matlab. Springer Berlin Heidelberg 1994. [9] J.Davenport, Y. Siret, E. Tournier. - Calcul formel. Systèmes et algorithmes de manipulations algébriques. Masson, 1987. [10] G. Articolo. - Partial differential equations and boundary value problems with Maple V. Academic Press us San Diego, CA 1998. [11] Zimmermann. Bibliographie en ligne. http ://www.loria.fr/%7Ezimmerma/maple/. [12] Université de Lille. Bibliographie en ligne. http ://www.grappa.univ-lille3.fr/polys/maple1999/index34.html. [13] Université de Laval (Canada). Cours en ligne. http ://www.mat.ulaval.ca/mating/Maple. 64 BIBLIOGRAPHIE Index ’, 39 :-, 47 : :, 43 :=, 37 ?, 23 [], 29 %, 22 !, 22 $, 29, 31 {}, 29 add, 40 aide, 23 allvalues, 56 anonyme, 41 append, 49 args, 43 array, 30 assign, 53 base, 60 batch, 22, 50 binaire, 50 booléens, 35 bytes, 60 collect, 58 combine, 59 exp, 59 ln, 59 symbolic, 59 trig, 59 convert, 49, 60 base, 60 bytes, 60 fullparfrac, 60 parfrac, 60 polar, 60 polynom, 60 radical, 60 trig, 60 copy, 44 débugage, 22 dsolve, 53 ensemble, 29 eval, 37 evala, 37 evalb, 37 evalc, 37, 60 evalf, 37 evalhf, 37 evalm, 37 evaln, 37, 39, 43 evalr, 37 expand, 57 factor, 57 FAIL, 35, 36 fclose, 50 fopen, 50 for, 26 in, 26 while, 26 fprintf, 50 fscanf, 50 fullparfrac, 60 global, 41 help, 23 history, 22 if, 25, 36 fonction, 25 instruction, 25 in, 26 inerte, 56 Int, 56 interprète, 7 intersect, 29 iquo, 44 kernelopts, 21 last, 38 liste, 29 local, 41 lprint, 49 map, 33 maple -x, 7 mapleinit, 21 matrix, 30 member, 29 minus, 29 modules, 47 name, 38 nargs, 43 nombre, 32 nops, 32 66 INDEX normal, 59 NULL, 32 numeric, 36 typage, 43 type, 29 numeric, 36 op, 32 options, 42 unapply, 54 union, 29 use, 47 par référence, 43 par valeur, 43 paramètres, 43 parfrac, 60 parse, 49, 50, 55 pgm, 50 piecewise, 36 plot, 36, 42 plotsetup, 21 polar, 60 prédicat, 35 print, 42, 49 printbytes, 21 printf, 49 printlevel, 22 procname, 43 quit, 7 quotage, 39 rationalize, 59 read, 21 readbytes, 50 readdata, 50 readlib, 22 readline, 49, 50 readstat, 49 remember, 42 RETURN, 42 rhs, 53 scanf, 49 select/has, 53 seq, 29, 40 showstat, 22, 41 simplify, 57 solve, 53 solve/identity, 55 sort, 54 sscanf, 49 stopat, 22 subsop, 55 substring, 49, 50 suite, 29 sum, 40, 60 system, 22 table, 30 table-procédure, 30 tableaux, 30 toplevel, 37 trace, 22 true, 35 value, 37, 56 vector, 30 verboseproc, 22, 41 vide, 32 whattype, 29 while, 26 with, 22 writebytes, 50 writeto, 49 xmaple, 7