green arrow gif
Transcription
green arrow gif
16 - Représentations graphiques 2D MAPLE permet de tracer des représentations graphiques cartésiennes, polaires, paramétriques, etc. de fonctions, d'objets graphiques comme des polygones, des arcs d'ellipses, du texte, des formules, etc. ainsi que de créer des animations. On donnera à ces opérations le terme de "graphisme 2D" pour les distinguer des tracés en perspective dans l'espace (3D ; voir chapitre 17). Les dessins s'affichent par défaut sur la feuille de calcul (Inline), mais on peut aussi les afficher sur des fenêtres séparées (Window) avec le menu MAPLE 12/Préférences (Mac OS) ou Tools/Options (Windows/Linux) et l'onglet Display, option Plot display (voir Ch 1, § 8.3.7). Pour compléter cette information, voir le § 5.3 et la fonction plotsetup pour une modification ponctuelle. On peut également créer des fichiers de dessins, par exemple aux formats GIF ou postscript, pour un usage externe comme l'insertion dans un document de type Word ou LaTeX (voir le § 5). Ce chapitre répondra aussi à la requête fréquente : "J'ai un fichier et je voudrais..." (Annexe 2). Il existe d'assez nombreuses redondances dans les fonctions graphiques de MAPLE liées à l'évolution du logiciel. Par exemple pour tracer des courbes en coordonnées polaires on pourra utiliser plot avec l'option coords=polar ou la fonction polarplot de la librairie plots. On trouve parfois entre ces possibilités des variantes qui peuvent être utiles. On pourra se faire une idée de toutes les possibilités de tracés offertes par MAPLE avec la page d'aide illustrée O ?PlottingGuide 1 Tracés en mode interactif MAPLE offre la possibilité d'effectuer des tracés en mode interactif. Il suffit d'activer dans le menu général Tools de MAPLE l'option Assistants/Plot Builder... puis de se laisser guider en remplissant des champs appropriés. L'activation de ce menu écrit la commande suivante sur la feuille de calcul puis affiche la (ou les) représentation(s) graphique(s) demandée(s). O plots[interactive](); 4 2 K2 K2 K4 K6 1 2 3 La fonction interactive appartient à la librairie plots (voir le § 13) et on peut donner directement la commande sans passer par ce menu (plusieurs formes d'appel sont possibles, voir Ch. 1, § 8.3.5). L'expression suivante dépend des deux variables libres α et x. Aussi dans la fenêtre qui s'ouvrira on pourra trouver plusieurs possibilités comme un tracé 3D z(α,x) (Ch. 17), un tracé implicite (voir § 13.3), une animation (voir § 13.6), etc. On laisse au lecteur le soin d'explorer les diverses possibilités. Se reporter aussi au § 3.4 et § 4 pour les modifications interactives. O plots:-interactive(sin(alpha*x)*x); # Commande non exécutée 2 Tracés "à la volée" Supposons une expression affichée dont on veut tracer une représentation graphique O exp(-x)+sin(5*x); eKx C sin 5 x Avec un clic droit sur le résultat on fait apparaître un menu contextuel. En choisissant dans celui1 ci Plots/Plot Builder une fenêtre s'ouvre qui permet certains choix, comme par exemple celui de fixer l'intervalle de variation des abscisses (qui est par défaut [-10,+10]). L'application Plot Builder construit, affiche et exécute la commande de tracé appropriée. Ici encore on laisse au lecteur le soin d'explorer les diverses possibilités. On notera en particulier que l'application Plot Builder déduit du nombre de variables libres (ici une seule : x), la nature des tracés possibles (2D, 3D, Implicites, etc). O plot(exp(-x)+sin(5*x), x = -2 .. 3); 7 5 3 1 K2 K1 0 1 2 3 x 3 Fonction plot (utilisation élémentaire) 3.1 Tracé d'une expression Comme le montre la génération automatique de la commande précédente, pour tracer la représentation cartésienne d'une expression ne dépendant que d'une variable non assignée et d'une seule on utilise la fonction plot dont le premier argument est cette expression (voir § 3.2 pour les fonctions et les procédures). Le deuxième argument est une équation donnant le nom de cette variable considérée comme l'abscisse avec son intervalle de variation souhaité. On peut remarquer que l'axe des ordonnées s'adapte à la représentation graphique et n'est pas nécessairement orthonormé avec celui des abscisses. Le croisement des axes n'est pas non plus nécessairement situé sur le point de coordonnées (0,0) (voir § 7.5). O y:=2: # et l'expression ne dépend en réalité que de x plot(exp(-abs(x-1))+y,x=-2..3); 2,9 2,6 2,4 2,2 K2 K1 0 x 1 2 3 En raison de l'évaluation préalable des arguments d'une fonction, l'expression peut aussi être assignée à un nom et la commande précédente deviendrait par exemple O f:=exp(-abs(x-1))+y; plot(f,x=-2..3); # Graphique identique au précédent # et volontairement effacé. f := eKx K 1 C 2 ATTENTION : on notera bien que malgré un nom trompeur habituellement réservé aux fonctions, f est ici le nom d'une simple expression, pas d'une fonction ou d'une procédure (voir le paragraphe suivant). Ecrire f x ne générerait pas pour autant une erreur, mais il s'agit d'une tolérance syntaxique admise par plot ! Par contre utiliser un autre nom de variable que x 2 > plot(f(t),t=-2..4); engendrerait une erreur en renvoyant un graphique vide (voir § 6). On peut aussi tracer une expression définie par intervalles (voir en complément l'option de gestion des discontinuités discont au § 7.6). O p:=piecewise(x<=0,exp(2*x), x<3,1+(1-exp(-x))+0.2*sin(5*x)*exp(-0.1*x),1): plot(p,x=-2..4); 2,0 1,6 1,0 0,6 0,2 K2 K1 0 1 x 2 3 4 MAPLE peut réaliser des tracés plus sophistiqués. Ici l'intégrale n'a pas pu être calculée exactement... O It:=sin(x^2)-int(exp(-cos(t)),t=0..x); x It := sin x2 K eKcos t dt 0 ce qui n'empêche pas plot de donner une représentation graphique en évaluant numériquement l'intégrale de façon interne (attention cependant aux temps de calculs dans certains cas). O plot(It,x=0..3); 0 1 2 3 x K1 K2 K3 3.2 Tracé d'une fonction définie par un opérateur ou une procédure 3.2.1 Fonction définie par un opérateur On peut procéder de deux façons 1) En donnant l'expression de cette fonction sous la forme f x ou en utilisant tout autre nom de variable, ce qui nous ramène aux cas précédents. O f:=x->exp(-x^2)/sqrt(Pi): plot(f(t),t=-3..3); # Graphique effacé 2) En donnant seulement le nom de la fonction et en ne précisant pas de nom pour 3 l'abscisse mais seulement l'intervalle de variation. O plot(f,-3..3); 0,5 0,4 0,3 0,2 0,1 K3 K2 K1 0 1 2 3 Pour les fonctions de plusieurs variables, disons fp x, y, z on ne pourra utiliser que la forme 1) en précisant la ou les valeurs numériques des autres variables, par exemple O plot(fp(3.2,z,5/3),z=0..Pi); # Commande non exécutée 3.2.2 Fonction définie par une procédure On peut aussi utiliser deux syntaxes. 1) Comme précédemment en n'utilisant pas de nom de variable O G:=proc(x) if x<=0 then exp(-x^2) else sin(x)/x fi end: plot(G,-Pi..Pi); 1 0,8 0,6 0,4 0,2 K3 K2 K1 0 1 2 3 2) Comme pour le tracé d'une expression, mais en prenant bien soin de retarder son évaluation en utilisant '...'. On peut aussi utiliser la fonction evaln (evaluate as a name). En cas d'oubli le message d'erreur qui en résulterait peut de ne pas être très facile à interpréter... O plot('G(x)',x=-Pi..Pi); # Graphiques effacés plot(evaln(G(x)),x=-Pi..Pi); Pour une procédure à plusieurs variables, disons Gp x, y, z , on ne peut avoir qu'une seule variable indéterminée (la variable "abscisse") et la syntaxe donnée en 1) ne peut pas être employée. On ne pourra utiliser que les deux formes O plot('Gp(1/3,z,5)',z=0..Pi); # Commandes non exécutées plot(evaln(Gp(1/3,z,0.5)),z=0..Pi); La procédure peut être aussi une fonction de MAPLE. On pourra se reporter à l'exercice 6.8 pour un exemple. 3.3 Fonction plot et tracés multiples On obtient plusieurs tracés simultanés en demandant à plot de tracer la liste des expressions. Par défaut, une couleur est associée automatiquement à chaque courbe, mais on verra par la suite que l'on peut tout contrôler (voir par exemple § 7.3). On peut aussi donner l'ensemble des expressions, mais attention alors à la correspondance des options. O n:=0: 4 O plot([BesselJ(n,x),sin(x)/x],x=-3*Pi..3*Pi); 1 0,8 0,6 0,4 0,2 K8 K6 K4 K0,2 2 4 6 8 x K0,4 -------ATTENTION----On montrera dans les prochains paragraphes comment effectuer des tracés de fonctions en coordonnées polaires, de fonctions définies par une équation cartésienne, etc. Mais on ne peut pas toujours afficher avec une commande unique sur un même graphique, des représentations de natures différentes. On utilisera pour cela la fonction display de la bibliothèque plots (voir le § 14.1) ------------------------------ 3.4 Fonctions plot et Explore La fonction Explore n'est pas spécifique aux tracés (Ch. 1, § 8.4.8.1), mais permet de faire varier "à la souris" des paramètres dans une expression et d'en observer les effets de façon immédiate (l'application est du type de celle décrite au Ch. 1, § 8.4.8.4-3a). Dans l'exemple suivant que l'on pourra reproduire, Explore va déterminer que les seuls paramètres libres sont a et x_max. O Explore(plot(exp(-a*x)*cos(Pi*x),x=0..x_max)); Cette fonction est aussi accessible par un clic droit quand la commande est écrite en mode "Math", par exemple : plot exp Ka$x $cos p$x , x = 0 ..x_max Exercice : pourquoi aucune des cases "skip" qui apparaissent dans cette application ne doivent être cochées quand on utilise la combinaison Explore-plot. 4 Modifications interactives des dessins ATTENTION : Lors d'une prévisualisation, création d'un pdf, impression sur papier, les illustrations des graphiques peuvent être modifiées et même altérées. Si cette opération est envisagée, il est prudent de se reporter au § 8.4.6 du Ch. 1 pour pallier cette difficulté. 4.1 Taille et proportion Longueur/Largeur Quand on clique sur un dessin, celui-ci apparaît entouré d'un cadre qui permet par le glissement des petits "carrés" avec la souris de modifier la taille et la proportion du dessin. En maintenant la touche "Shift" enfoncée on modifie la taille en conservant la proportion. 4.2 Modifications interactives MAPLE permet de modifier, illustrer, sauvegarder un graphique simplement par menus et/ou au clavier. A partir du dessin précédent (§ 3.3) on peut obtenir celui qui suit et l'Annexe 1 en fin de chapitre décrit les diverses possibilités de MAPLE. Mais il faut savoir que la plupart des actions que l'on réalise "à la main" peuvent aussi être définies par des options de commandes telles scaling, color, title, etc (§ 7). Ceci est extrêmement utile, voire indispensable, quand on 5 veut automatiser ces actions. Même les écritures de formules peuvent être automatisées. La suite de ce chapitre en montrera des exemples. Comparaison entre la fonction de Bessel J0 et le Sinus Cardinal y Fonction de Bessel Sinus cardinal 1 J0 x 1 2 Sinc x = CN KN 1 p J0 x dx = 1 0,5 CN sin x x Sinc x dx = 1 KN x K10 0 K5 5 10 K0,5 5 Enregistrement d'un graphique dans un fichier Il est souvent nécessaire de sauvegarder une représentation graphique dans un fichier afin de l'inclure ensuite dans un autre fichier (types Word, PowerPoint, LaTeX, etc.). On peut opérer de trois manières: 5.1 Copier-coller Il est possible d'importer un graphique MAPLE dans certains logiciels d'édition par un simple copier-coller, mais généralement la qualité sera moyenne. 5.2 Enregistrement interactif On utilise le menu général Plot/Export de MAPLE. Ce menu n'est actif (non grisé) que lorsque l'on a cliqué sur le dessin. On pourra aussi utiliser l'item Export du menu contextuel apparaissant avec un clic "droit" sur le dessin. Selon la plateforme utilisée, un certain nombre de formats sont proposés qu'il suffit de sélectionner. Une fenêtre s'ouvrira pour demander de préciser le nom et l'emplacement du fichier créé. Les fichiers au format postscript encapsulé (eps) ainsi créés sont directement utilisables sous LaTeX où l'environnement \usepackage {graphicx} permet le redimensionnement d'une figure, par exemple : \includegraphics[width= 8cm]{Gauss.eps}. Le format eps crée des graphiques de qualité, mais beaucoup de logiciels d'édition ne reconnaissent pas ce format (parce que sa génération est libre de droit, mais son 6 interprétation ne l'est pas). Cependant si l'on dispose d'un logiciel de conversion de format, une exportation par MAPLE en eps suivie d'une conversion (par exemple au format TIFF) donne en général de très bons résultats. Une exportation-importation directement au format GIF donne aussi de bons résultats. Le contenu de ce fichier peut, si besoin (?), être inséré et affiché dans une feuille MAPLE sauf au format eps et pour la raison donnée ci-dessus (voir Ch. 1, § 8.4.8.4-5). Les séquences animées (voir § 13.6 et § 14.3) seront enregistrées dans des fichiers au format GIF (Graphics Interchange Format). 5.3 Enregistrement par commande La sauvegarde interactive est pratique pour un ou quelques dessins isolés. Mais si l'on doit automatiser la tâche, on peut à l'aide de la fonction plotsetup, modifier la façon dont MAPLE va renvoyer son graphique. Il est possible de lui demander de ne ne pas l'afficher sur l'écran mais de l'écrire directement dans un fichier. Dans ce cas toutes les finitions du dessin (titre, légendes, textes, etc.) doivent être contenues dans la ou les commandes qui créent le dessin (ou faites a posteriori avec un autre logiciel). On doit préciser - Le nom du "pilote" qui va fixer le format du fichier, ici gif. - Le nom du fichier avec l'option plotoutput="nom_du_fichier". Le nom_du_fichier est une chaîne de caractères pouvant contenir le chemin d'accès complet au répertoire (voir des explications plus complètes au chapitre 20, Lecture, écriture et fichiers). Ici on écrit le fichier Gauss.gif sur le Bureau d'un Mac ou Linux O G:=exp(-t^2): plotsetup(gif, plotoutput=cat(kernelopts(homedir), "/Desktop/Gauss.gif")): plot(G,t=-3..3); Sous Windows on utilisera la même syntaxe bien que le caractère standard séparateur de répertoires soit "\" (voir chapitre 18). MAPLE ré-interprètera la chaîne correctement. Ces commandes vont construire un fichier de type graphique (son contenu peut, si besoin (?), être inséré et affiché dans une feuille MAPLE sauf au format eps ; voir § 5.2 et le Ch. 1 § 8.4.8.4-5). On revient à un affichage à l'écran dans la feuille de calcul (ou dans une fenêtre séparée suivant l'option choisie par défaut ; voir l'introduction du chapitre) avec O plotsetup(default); Remarque : l'option window force, indépendamment de l'option par défaut, l'affichage du graphique sur une fenêtre séparée. De même il existe inline qui, au contraire, forcera l'affichage sur la feuille de calcul. O plotsetup(window): plot(G,t=-3..3); plotsetup(inline); On trouvera des informations sur les nombreux pilotes avec la commande suivante. L'aide contient un hyperlien spécifique pour le pilote postscript. O ?plot/device Créons maintenant un fichier de type postscript encapsulé (eps). Avec plotoptions on a fixé - la taille du dessin avec width (largeur) et height (hauteur). Préciser l'unité (pt, cm, in; pt par défaut où pt vaut 1/72 d'in). On notera que les options sont quotées par "..." ou par `...` et non par '...' - l'orientation de la feuille de papier en mode portrait. L'option par défaut est landscape (paysage). - la suppression du cadre avec l'option noborder. - la marge à gauche avec leftmargin et en bas avec bottommargin (préciser ici aussi les unités). 7 Il existe d'autres options (voir > ?plot/ps). O plotsetup(eps,plotoutput=cat( kernelopts(homedir),"/Desktop/Gauss.eps"), plotoptions="width=10cm,height=10cm,portrait,noborder, leftmargin=8cm,bottommargin=17cm"): plot(G,t=-3..3); On rappelle que LaTeX autorise le redimensionnement d'une figure au format eps (voir § 5.2). 6 Quelques erreurs classiques avec l'utilisation de plot On recense ici quelques erreurs classiques que l'on peut rencontrer lors de l'utilisation de cette fonction. 1) On lance une commande plot et aucun dessin ne s'affiche, mais aucun message d'erreur n'est renvoyé ? O plot(sin(x),x=-Pi..Pi); Soit on a terminé la commande par ":", soit on a oublié, comme ici, de demander à MAPLE de revenir à l'affichage par défaut (voir la fin du § 5.3). On a détruit dans ce cas le contenu du fichier "Gauss.eps" en le remplaçant par cette représentation du sinus car les options précédentes de plotsetup sont toujours actives. On corrige avec (voir § 5.3) O plotsetup(default); 2) On demande le tracé d'une expression, mais un message d'erreur du type suivant revient O E:=exp(-sin(y)): plot(E,y=-3..3); Error, (in plot) unexpected option: 2 = -3 .. 3 La raison est que 2 est assigné à y (voir § 3.1) et l'évaluation préalable des arguments remplace y=−3..3 par 2=−3..3 O y; 2 3) Le graphique est celui d'une constante. L'utilisation de la forme désassignée (on devrait dire plus exactement "évaluation retardée") de y permet de contruire le graphique précédent, mais ne change pas le fait que E est une constante puisque y vaut 2 (E = exp Ksin 2 ). Déassigner y (> y:='y':) avant de lancer la commande ne changera rien puisque E a été construite avec y assigné (voir Ch. 2). O E; evalf(E); plot(E,'y'=-3..3); eKsin 2 0.4028071261 0,6 0,5 0,4 0,3 K3 K2 K1 8 0 y 1 2 3 Un exemple très classique... O S:=[seq(k*sin(2*Pi*y/k^2),k=1..10)]: y:='y':plot(S,y=-1..1); 2,5 2 1,5 1 0,5 K1 K0,5 0 0,5 y 1 4) Le dessin est "écrasé" et illisible en raison d'un axe des ordonnées trop étendu. Il ne s'agit pas véritablement d'une erreur : voir le remède au § 7.5-e. O plot(x+1/(x-1),x=-0.5..b); K0,5 0 K1000 0,5 1 1,5 2 x K2000 K3000 K4000 5) Le graphique s'affiche vide. a) O plot(G,x=-3..3); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct 10 5 K3 K2 K1 0 1 2 3 x K5 K10 La raison vient de la définition de l'expression G qui dépend de t et non de x (voir § 5.3). Il suffit donc de remplacer x=-3..3 par t=-3..3 dans la commande précédente. O G; 2 eKt Les graphiques vides des exemples suivants on été effacés. 9 b) On a un résultat strictement identique avec un nom erroné mais non assigné pour désigner l'expression. L'interprétation est un peu différente car plot "voit" maintenant une expression parfaitement correcte qui se résume à la seule nouvelle variable libre Gx. Par exemple > plot(Gx,Gx=-3..3); serait correct et tracerait une droite. O plot(Gx,x=-3..3); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct c) Ou bien on pense que le nom est associé à une fonction alors qu'il ne s'agit que d'une expression. La fonction plot admettrait néanmoins dans ce cas que l'on écrive > plot(Z(t),t=-3..3) O Z:=sin(t)/t-t: plot(Z(x),x=-3..3); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct d) Autre possibilité : on a oublié de fixer le nom de la variable en donnant l'intervalle. O plot(x*exp(-x),-3..3); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct e) Il se peut aussi que l'intervalle de tracé soit réduit à un point. En effet on a t=0..0 puisque n vaut 0 (voir § 3.3). Aucun message d'avertissement n'apparaît dans ce cas. O plot(G,t=0..n); f) L'exemple suivant, lié au domaine de définition de la fonction, relève du cas 6). O plot(ln(x-3),x=1..2); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct g) L'expression dépend de plus d'une variable libre : ici n et x. Evidemment, aucun tracé n'est possible. O n:='n': plot(BesselJ(n,x),x=0..10); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct Attention : ce diagnostic n'est pas toujours immédiat ! On sait (voir § 3.1) que y vaut 2 et il ne devrait pas y avoir de souci... O plot(BesselJ(y,x),x=0..10); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct Mais il y a "ce que l'on croit savoir" et "ce qui est"... Examiner attentivement au cas 3) "Un exemple très cassique..." (et sans compter le fait qu'une commande peut avoir été exécutée puis effacée...) Exercice : par contre... Expliquer. O plot([seq(BesselJ(n,x),n=0..3)],x=0..10); 1 0,8 0,6 0,4 0,2 0 K0,2 K0,4 2 4 6 x 10 8 10 6) Le graphique ne s'affiche que partiellement. Seule la représentation de la première fonction s'affiche car l'image de 1 K x K 4 2 n'est pas définie dans ℝ pour aucune valeur (sauf une) des abscisses contenues dans l'intervalle choisi pour le tracé (voir la fonction complexplot § 13.5). O plot([sin(-x^2+3),sqrt(1-(x-4)^2)],x=1..3); 1 0,5 0 1,5 K0,5 2 x 2,5 3 K1 Mais il suffit d'un sous intervalle correct pour que plot soit satisfait... Si aucune fonction n'est calculable dans ℝ avec aucune valeur de l'intervalle des abscisses, le graphique revient vide avec un message d'avertissement. O plot([sin(-x^2+3),sqrt(1-(x-4)^2)],x=1..4); 1 0,5 0 2 3 4 x K0,5 K1 7) La syntaxe pour une fonction ou une procédure est incorrecte (voir § 3.2). O f:=x->x*exp(-x); plot(f,t=-3..3); f := x/x eKx Error, (in plot) expected a range but received t = -3 .. 3 Maintenant f(t) est bien une expression (celle de f quand la variable vaut t) et on est ramené à un des cas de graphiques vides. Voir le cas d) dans 5) ci-dessus. O plot(f(t),-3..3); Warning, unable to evaluate the function to numeric values in the region; see the plotting command's help page to ensure the calling sequence is correct Pour une procédure (plus compliquée que celle-ci) le message d'erreur qui en résulte n'est pas forcément très clair... O F:=proc(x,y) if x<=0 then exp(-x^2+y) else y+sin(x)/x fi end: plot(F(x,2),x=-Pi..Pi); Error, (in F) cannot determine if this expression is true or false: x <= 0 11 7 Exemples de quelques options de plot ------Important-----Les options sont décrites ici sous forme de commandes, mais sont pour la plupart accessibles par le menu général Plot de MAPLE. Ce menu n'est actif (non grisé) qu'après avoir cliqué sur un dessin (voir l'Annexe 1 en fin de chapitre). On peut aussi accéder à ces options par un "clic droit" sur le graphique qui fait apparaître un menu contextuel. Bien que ponctuellement très pratique, cette méthode de gestion par menu pourrait s'avérer rapidement fastidieuse et celle par commandes plus avantageuse en fonction du contexte de travail. -------------------------On n'a pas voulu donner ici le catalogue exhaustif des options. Seules les principales sont classées par paragraphe, certaines autres apparaîtront au fur et à mesure des exemples. On pourra toujours les explorer avec l'aide en ligne. O ?plot/options Les options color (§ 7.3), scaling et view (§ 7.5) sont les plus fréquemment utilisées. Une autre option importante, style, sera décrite au § 9.2. Quand une option doit s'appliquer sur plusieurs tracés avec différentes valeurs on utilise une liste qui s'applique par correspondance. Si une option s'applique à toutes les courbes avec la même valeur, il est inutile de former une liste (voir ci-dessous des exemples avec les options de couleur et de style). On peut remplacer dans plot la liste [...] des expressions à tracer par un ensemble {...}, mais l'association par correspondance n'est plus garantie. 7.1 Options permanentes Lorque l'on doit faire un nombre important de dessins avec les mêmes options (scaling, color ou autres) il peut être intéressant de définir ces options de façon permanente pour la durée de la session ou entre deux ordres restart avec la fonction setoptions de la librairie plots (§ 13). Par exemple plots:-setoptions(scaling=constrained,color=["Black","Blue"]): Une option spécifiée dans une commande annule et remplace une option permanente juste pour cette commande. 7.2 Légendes des courbes Les légendes sont de petits encadrés automatiques obtenus avec l'option legend et qui permettent de repérer chaque courbe (voir le second exemple au § 13.5.1 et l'annexe 1 § A1- 3 à la fin de ce chapitre). Une option du menu Tools/Options (Windows/Linux) ou MAPLE 12/Préférences (Mac) onglet Display permet de rendre automatique ou non l'apparition des légendes (voir Ch. 1, § 8.3.7). 7.3 Les couleurs, les styles et les épaisseurs des tracés des courbes - On peut imposer les couleurs des courbes avec l'option color="Nom_couleur" (toutes les courbes prennent la même couleur) ou color=["Nom_couleur_1","Nom_couleur_2", ...] (une couleur est associée à chaque courbe par correspondance de listes ; voir aussi la fonction setcolors de la bibliothèque plots). Les couleurs pré-nommées sont au nombre de 142 et on les trouvera dans l'aide en ligne O ?plot/colornames On peut définir ses propres couleurs (voir exercice 6.10) et également utiliser d'autres modes plus sophistiqués avec des fonctions de couleurs. On notera avec l'exemple suivant qu'une seule couleur est affectée à color imposant ainsi aux deux courbes de prendre la même couleur. - On peut également imposer divers styles de tracés avec l'option linestyle. Les possibilités sont solid, dot, dash, dashdot, longdash, spacedash, spacedot qui peuvent être désignées par leurs noms ou par le numéro d'ordre de cette liste (2 ⇒ dot). 12 Attention : l'option linestyle est différente de l'option style qui sera définie au § 9.2. - L'épaisseur est fixée par l'option thickness qui prend des valeurs entières 0, 1, 2, ... Contrairement à ce que dit l'aide en ligne, la valeur par défaut est 1 et non 0. O restart: plot([exp(sin(-x^2)/x),BesselK(0,x)],x=1/2..3, color="Blue", linestyle=[solid,2],thickness=[0,3]); 1,4 1,2 1,0 0,8 0,6 0,4 0,2 0,5 1 1,5 x 2 2,5 3 On veut tracer sur [−1,+1] les polynômes de Tchébycheff Tn x pour n allant de 1 à 6, colorier T1 x en bleu, T6 x en rouge et tous les autres en noir. Noter l'utilisation de l'opérateur seq pour construire la liste des polynômes ainsi que de l'opérateur $ qui évite une écriture répétitive pour construire la liste des couleurs (x$n ⇒ x,x,x,... n fois). O plot([seq(ChebyshevT(n,x),n=1..6)],x=-1..1, color=["Blue","Black"$4,"Red"]); 1 0,5 K1 K0,5 0 K0,5 0,5 x 1 K1 7.4 Titres, légendes, formules, flèches ou polygones, fonction typeset L'option title permet de rajouter un titre (au dessus) et l'option caption une légende (en dessous). Elles peuvent prendre diverses formes: 1) title="Texte a écrire" où "..." est une chaîne de caractères (voir chapitre 18). 2) title=un symbole assigné ou non assigné. S'il est assigné il sera évalué et substitué. Ci2 dessous title=G donnerait e Kt comme titre. 3) title="Texte" ou symbole et titlefont=[Police,Style,Taille] . Pour les polices et leurs styles, voir l'aide en ligne et les divers exemples. 4) title=["Texte" ou symbole , font=[Police,Style,Taille]] où Police, style et taille sont chacun optionnel (voir ci-dessous). 5) Tout est identique pour caption, sauf pour titlefont. Seules les formes 1), 2) et 4) sont utilisables. 13 7.4.1 La fonction typeset Les "Textes" peuvent être écrits avec la fonction typeset qui permet de composer des chaînes avec des formules. Tout ce qui n'est pas mis entre deux " sera évalué et si on remplace Int (G,...) par int(G,...) dans l'exemple ci-dessous, caption écrira p = p car l'intégrale sera évaluée (voir le chapitre Intégration à propos de l'opérateur inerte Int). On notera le caractère "\n" (dans "\nNormalisation...") qui permet de forcer un retour sur une nouvelle ligne (voir une autre façon de faire avec le second exemple du § 13.7). Les polices de texte suivent la spécification de l'option associée mais les symboles mathématiques s'adapteront à la norme conforme à l'usage (police grecque, italique, etc.). O G:=exp(-t^2): plot(G,t=-3..3, title="Courbe de Gauss",titlefont=[HELVETICA,italic,12], caption=[typeset("La fonction est définie par : ", f(t)= G,"\nNormalisation : ", Int(G,t=-infinity..infinity)=sqrt(pi)), font=[12]], labels=["",""]); # voir § 7.5 "La gestion des axes" Courbe de Gauss 1 0,8 0,6 0,4 0,2 K3 K2 K1 0 1 2 3 La fonction est définie par : f t = eKt2 N Normalisation : eKt2 dt = p KN L'affichage, par commandes, de formules de flèches ou de polygones sur le dessin lui-même nécessite l'utilisation de la librairie plots avec les fonctions textplot, arrow, polygonplot et display (voir § 14.2). 7.5 La gestion des axes a) Il existe un grand nombre d'options et sous-options permettant de contrôler finement la construction des axes, leurs écritures associées, les tracés de grilles, etc. On notera aussi la possibilité de construire une représentation avec deux axes différents pour les ordonnées (voir § 13.7). On ne donnera ici à titre d'illustration qu'un exemple rassemblant quelques unes des options, mais le lecteur devra se référer à l'aide en ligne pour une information complète. O ?plot/options - Pour l'option labels on a écrit N='A'... pour éviter que A ne soit remplacé par sa valeur 1.2. Pour supprimer les labels par défaut on écrira labels=["",""] (voir l'exemple précédent). L'option axesfont s'adresse à l'écriture des valeurs sur les axes, alors que labelfont d'adresse à leurs légendes. Les polices de texte suivent la spécification de l'option associée mais les 14 symboles mathématiques s'adapteront à la norme conforme à l'usage (police grecque, italique, etc.). On pourra aussi utiliser typeset (voir § 7.4.1). - L'option tickmarks=n n'est qu'une indication que plot adapte à la situation (pour l'axe des abscisses axis[1]=[tickmarks=[10,...]] pour x=0..1.6 ne donne que 9 "ticks" pour tomber sur des valeurs affichées "raisonnables" telles 0,2 ... 0,8 ...). L'option subticks=n affiche n "subticks" et divise donc l'intervalle entre deux "ticks" en n+1 sous-intervalles (par conséquent... éviter subticks= 5 ou 10 et utiliser plutôt subticks= 4 ou 9 !). - Les options color, thickness, etc. de gridlines sont les mêmes que pour les courbes. - Il existe également une option générale gridlines=true qui s'applique aux deux axes. Le dessin des axes peut aussi être contrôlé par le menu Plot/Axes/Properties,etc. (accessible également par un clic droit sur le dessin). Attention : une axe logarithmique pour les abscisses (option axis[1]=[mode=log]) peut engendrer un échantillonage insuffisant. On trouvera une solution pour pallier cette difficulté au § 13.4). O A:=1.2: plot([A*exp(-1.1*x),A*exp(-0.55*x^4)],x=0..1.6, color=["Red","Green"], axesfont=[TIMES,bolditalic,8], labelfont=[HELVETICA,10], labels=[t,N='A'*exp(-lambda*t)], labeldirections=[horizontal,vertical], axis[1]=[tickmarks=[10,subticks=3]], axis[2]=[color="DarkBlue",mode=log, gridlines=[10,thickness=1, linestyle=dot,color="DarkGrey"]] ); 1 0,8 0,6 N = A eKl t 0,4 0,2 0,1 0,08 0,06 0,04 0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 t b) On trouve aussi quatre possibliliés pour présenter les axes avec l'option axes. Les valeurs de axes sont aussi accessibles par le menu apparaissant après avoir cliqué sur le graphique (voir ). En anticipant un peu sur l'utilisation de la fonction display (voir § 14) de la bibliothèque plots, on montre comment tracer un tableau (Array) de graphiques. On rappelle que les éléments d'un tableau à deux dimensions sont donnés sous la forme d'une liste de listes de la forme [ [A,B,...],[X,Y,...] ] (voir chapitre 5). Une présentation similaire pourrait être obtenue avec une table (voir § 8.4.8.4-7, Chapitre 1). Attention : l'option axes est différente de l'option axis (voir pour axis l'exemple ci-dessus ainsi que § 13.4). 15 O plots:-display(Array([ [ plot(exp(cos(x^2)),x=-Pi..Pi/2,axes=normal, title="axes = normal (defaut)"), plot(exp(cos(x^2)),x=-Pi..Pi/2,axes=boxed, title="axes = boxed") ], [ plot(exp(cos(x^2)),x=-Pi..Pi/2,axes=frame, title="axes = frame"), plot(exp(cos(x^2)),x=-Pi..Pi/2,axes=none, title="axes = none")] ])); axes = normal (defaut) 2,5 2 1,5 1 K3 K2 K1 x 0 axes = boxed 2,5 2 1,5 1 0,5 1 K3 K2 axes = frame K1 x 0 1 axes = none 2 1 K3 K2 K1 x 0 1 c) La fonction plot adapte l'échelle du dessin en fonction de l'amplitude des valeurs prises par les ordonnées pour donner une représentation graphique apparaissant dans un rectangle aux dimensions standard. Les axes sont alors seulement orthogonaux. On peut imposer que les axes soient aussi orthonormés avec l'option scaling=constrained. Elle est aussi accessible en cliquant sur le graphique puis avec l'item Scaling Constrained du menu principal Plot ou avec le menu contextuel (clic droit sur le graphique) ou encore en appuyant sur le bouton-icône 1:1 dans le menu graphique. On peut dans certains cas être amené à utiliser l'option contraire scaling=unconstrained (voir § 8). O plots:-display(Array([ plot(sqrt(1-x^2),x=0..1.2,color="Black"), plot(sqrt(1-x^2),x=0..1.2,color="Black", scaling=constrained) ])); 1,0 0,7 0,4 0,1 1,0 0,7 0,4 0,1 0 0,2 0,4 0,6 0,8 x 1 1,2 16 0 0,6 1 x d) Si on précise un intervalle de tracé infini (de la forme a ..N ou KN ..b ou KN ..N), on obtient un graphique pour lequel les abscisses et les ordonnées reçoivent une transformation ananorphique par un arctan. Ceci permet de se faire une idée du comportement général de la fonction. O plot(x^3-4*x^2+4*3*sin(x)/x,x=-infinity..infinity, color="DarkGreen"); N 0 KN N x KN e) Lorsque plot rencontre une discontinuité avec branches asymptotiques l'axe des ordonnées calculé est trop grand et "écrase" le dessin en le rendant illisible. - On peut forcer, par un troisième argument l'intervalle des valeurs de cet axe. Si on lui donne la forme nom=a..b, par exemple y=-8..10, alors nom sera affiché sur le graphique (label automatique). Il faut remarquer que l'argument est optionnel, mais n'est pas une option ?! Il est optionnel puisqu'il n'est pas obligatoire, mais ce n'est pas vraiment une option car il doit être placé obligatoirement en troisième argument et ne possède pas de mot clé associé. - L'option view (qui elle, est une véritable option) permet de définir les intervalles des valeurs pour les deux axes, et notamment pour l'axe des abscisses ([-1..1.5]) de façon indépendante de l'intervalle des valeurs fixées pour les calculs ([-0.5..2]). Voir par exemple l'exercice 2.1 du fascicule. O Array([ plot(x+1/(x-1),x=-0.5..2,color="Red"), plot(x+1/(x-1),x=-0.5..2,-8..10,color="Purple"), plot(x+1/(x-1),x=-0.5..2,color="Maroon", view=[-1..1.5,-8..10]) ]): plots[display](%); 0 0,5 1 1,5 2 x K1000 K2000 K3000 K4000 10 10 6 6 2 2 0,5 1 1,5 2 x K2 K8 K1 K2 0,5 1 1,5 x K8 7.6 Traitement des discontinuités La droite "verticale" des trois représentations précédentes n'est pas une asymptote. Pour tracer une représentation graphique la fonction plot calcule un ensemble de points qu'elle interpole par des segments de droites. On peut visualiser ces points en cliquant sur le graphique et en 17 sélectionnant la sinusoïde en pointillés rouges ( ) qui apparaît dans le menu . Le trait "vertical" précédent n'est que celui qui joint les deux points extrêmes calculés pour les deux branches asymptotiques de la fonction. On peut demander à plot (d'essayer) de traiter les discontinuités d'une fonction avec l'option discont = true. O plot(x+1/(x-1),x=-0.5..2,discont=true, color="Blue",view=[-1..1.5,-8..10]); 10 6 2 K1 K2 0,5 x 1 1,5 K8 Voir aussi l'exercice 2.3 du fascicule. 7.7 Précision du tracé La fonction plot adapte le nombre de points calculés pour définir le tracé de façon à représenter au mieux la courbe (option adaptive=true par défaut). On peut aussi fixer le nombre n minimal de points utilisés (50 par défaut) avec l'option numpoints=n. 7.8 Echantillonnage On peut imposer un échantillonnage en abscisse pour l'évaluation du tracé avec l'option sample= x1 , x2 ,..., xN . Si l'on pose aussi adaptive=false, la fonction plot (et fonctions assimilées) utilisera strictement cette grille en abscisse pour le tracé. Sinon, avec adaptive=true (le défaut), le tracé sera adapté avec cette grille pour base de calcul (voir un exemple d'application au § 13.4 à propos des tracés logarithmiques). 8 Création d'une fonction graphique Les images d'une fonction de MAPLE créée par l'utilisateur peuvent être de nature quelconque (Chapitre 7). En particulier, une image (au sens mathématique) peut être une représentation graphique. On veut dessiner des ellipses de couleur c, de demi grands axes a et b ayant pour "centre" un point de coordonnées (x,y) dans un système d'axes orthonormés que l'on ne veut pas tracer. Une représentation paramétrique sera bien adaptée. On peut définir pour cela une fonction E: O restart: E:=(a,b,x,y,c)->plot([x+a*cos(theta),y+b*sin(theta), theta=0..2*Pi],scaling=constrained, axes=none,color=c): On pourra alors écrire (on notera l'option de display (voir § 14), scaling=unconstrained qui annule l'option donnée dans la définition de la fonction E) O plots:-display(Array([ E(2,1.5,1,3,"Blue"), plots:-display(E(2,1,1,3,"Red"), E(1,1,0,0,"DarkMagenta"), E(1,3,1,1,"NavyBlue"), axes=normal,scaling=unconstrained)])); 18 4 1 K1 K1 1 2 3 Exercice: créer une fonction qui dessine un carré dont le côté a une longueur a et dont les diagonales se coupent en (x, y) (voir aussi § 16.1). 9 Tracés de coordonnées discrètes On peut obtenir le tracé d'une fonction à partir d'une série de valeurs des coordonnées. Il existe plusieurs syntaxes pour introduire ces coordonnées dans la fonction plot (pour importer des données contenue dans un fichier, voir annexe 2 en fin de chapitre). 9.1 Syntaxes d'introduction des coordonnées dans plot 1) Les coordonnées en abscisses et ordonnées sont sous la forme de deux listes séparées O restart: X:=[0.6,0.7,1,1.3,1.5,2,2.5,2.7]: Y:=[3.1,2.4,2,2.2,2.5,3,3.0,2.9]: On peut utiliser de même des vecteurs (X:=<0.6,0.7,...> ; voir chapitre 4) ou des tableaux (X:= Array([0.6,0.7,...], voir chapitre 5). Pour une très grande quantité de données on préférera une structure de tableau. On écrira simplement: O plot(X,Y); # ou bien sûr > plot(X,Y,options...) 3 2,8 2,6 2,4 2,2 2 1 1,5 2 2,5 2) Les coordonnées en abscisses et ordonnées sont sous la forme d'une liste de listes construite ainsi : (x1 , y1 ), (x2 , y2 ),.. ⇒ x1 , y1 , x2 , y2 ,... O XY:=[[0.6,3.1],[0.7,2.4],[1,2],[1.3,2.2], [1.5,2.5],[2,3],[2.5, 3.0],[2.7,2.9]]: On écrira alors O plot(XY); # ou bien sûr > plot(XY,options...) # Graphique identique au précédent et effacé ------ REMARQUES IMPORTANTES -----a) La syntaxe donnée en 1) est pratique, mais incompatible avec une commande simple pour tracés multiples. En effet on ne peut pas écrire plot([X , Y , f(x)] , ...) qui provoquerait logiquement une erreur (de même pour plusieurs jeux de données X1 , Y1 , X2 , Y2 ,... ; voir § 19 9.2). Ce n'est pas le cas avec 2) où la forme plot([XY_1 , XY_2 , f(x)] , ...) est correcte. b) Il est très fréquent que les abscisses et les ordonnées soient rangées dans deux listes séparées. Voici comment obtenir simplement une liste de listes adaptée pour un tracé (voir la fonction zip à la fin du chapitre 7, Fonctions). O XY:=zip((x,y)->[x,y],X,Y); XY := 0.6, 3.1 , 0.7, 2.4 , 1, 2 , 1.3, 2.2 , 1.5, 2.5 , 2, 3 , 2.5, 3.0 , 2.7, 2.9 c) Si X et Y sont tous deux des Vecteurs (Vector) ou des Tableaux a une dimension (Array) la fonction zip construit un vecteur ou un tableau qui sont aussi acceptés par plot pour un tracé simple. Toutefois, pour certains tracés combinés (points + courbes) plot refuse le tracé (?). On complétera donc la transformation par une conversion en liste si X ou Y sont des vecteurs ou des tableaux. > XY:=convert(zip((x,y)->[x,y],X,Y),list): -----------------------------------------------------3) Si on veut tracer des ordonnées contenues dans une liste simple en fonction d'un numéro d'ordre, ce qui revient à tracer (voir 2) la liste de listes 1, y1 , 2, y2 ,... n, yn , on pourra utiliser la fonction listplot de la bibliothèque plots (voir § 13). O plots:-listplot(Y); # Graphique effacé Exercice : Créer à l'aide des fonctions plot et seq (et éventuellement zip) une commande équivalente à listplot. 9.2 Tracés par points non interpolés Souvent on souhaite supprimer l'interpolation linéaire (présente par défaut) entre les données et représenter celles-ci par des marqueurs. Ceci s'obtient avec - L'option style=point. L'autre valeur (par défaut) de style est line (ne pas confondre avec l'option linestyle ; voir § 7.3). Comme pour toutes les options, on donnera une liste de styles pour plusieurs jeux de données, par exemple : style=[point,line]. Dans l'exemple suivant le style unique s'applique aux deux jeux de données. - L'option symbol qui permet de fixer la forme des marqueurs. On peut ainsi distinguer plusieurs jeux de données tracés simultanément en associant à cette option une liste de marqueurs (et/ou de couleurs) différents. Les formes disponibles des marqueurs sont : asterisk, box, circle, cross, diagonalcross, diamond, point, solidbox, solidcircle et soliddiamond. L'option symbol est ignorée lors d'un tracé interpolé. - L'option symbolsize qui fixe (en unités de points par pouce) la taille des marqueurs (qui s'adapte proportionnellement lors d'une réduction du dessin). - Pour afficher simultanément symboles et interpolation il faut superposer deux tracés en donnant deux fois le même jeu de données. O XY_bis:=[[0.5,1.6],[1,1.35],[1.5,1.2], [1.85,1.15],[2.3,1.2]]: plot([XY,XY_bis],style=point, symbol=[solidcircle,asterisk],symbolsize=20, color= ["Blue","Green"],view=[0..3,0..4]); 4 3 2 1 0 0 1 20 2 3 9.3 Tracés mixtes On donne, en rappelant quelques options, un exemple de tracé simultané de points et de courbes d'interpolation par un polynôme (en rouge) et par une spline (en bleu). On rappelle qu'aussi bien Spline que PolynomialInterpolation acceptent les coordonnées sous la forme de listes séparées (ou de vecteurs ou de tableaux à une dimension) ou d'une liste de listes à la façon décrite au § 9.2-2 (voir le chapitre 7, Fonctions). O Spl:=CurveFitting[Spline](X,Y,x): Pol:=CurveFitting[PolynomialInterpolation](XY,x): Spl et Pol sont deux expressions qui dépendent de x et il nécessaire de fixer un intervalle de calcul tel x=0.5..3 quelque soient les abscisses de XY. L'option view de son coté fixe les intervalles des coordonnées du graphique. On notera que l'option style fixe le mode de chacun des trois tracés, "line$2" remplaçant à l'aide de l'opérateur de répétition $ la suite "line,line". O plot([XY, Spl, Pol], x=0.5..3, style=[point,line$2],symbol=circle,symbolsize=20, color=["Black","Blue","Red"], axes=boxed,axis=[tickmarks=[10,subticks=4]], view=[0..3.5,0..5], gridlines, title="Interpolation", titlefont=[Times,bolditalic,15], caption="Spline en bleu et polynôme en rouge"); Interpolation 5 4,5 4 3,5 3 2,5 2 1,5 1 0,5 0 0 0,5 1 1,5 2 2,5 x Spline en bleu et polynôme en rouge 3 3,5 10 Tracés de données importées Le tracé (et le traitement) de données contenues dans des fichiers externes à MAPLE est un point très important. Afin de ne pas encombrer la lecture, il fait l'objet d'une annexe autonome à la fin de ce chapitre (Annexe 2). 11 Courbes paramétriques MAPLE permet de tracer simplement des courbes en coordonnées paramétriques toujours à l'aide de la fonction plot. Il suffit de remplacer l'expression et les variations de la variable par une liste de la forme x t , y t , t = a ..b où x t est l'expression décrivant les variations de l'abscisse et y t celles de l'ordonnées. Il est souvent utile, principalement en raison de la présence de branches asymptotiques qui "écrasent" la partie utile du dessin (à gauche), d'imposer les intervalles de variation des abscisses et des ordonnées avec l'option view. 21 O plots:-display(Array([ plot([(t^3+1)/(t^2-1),t-1/t,t=-3..5]), plot([(t^3+1)/(t^2-1),t-1/t,t=-3..5], view=[-4..6,-5..5]), plot([(t^3+1)/(t^2-1),t-1/t,t=-3..5], view=[-4..6,-5..5],discont=true) ]) ); 400 300 200 4 4 2 2 100 K100 K200 K300 100 300 600 K4 K2 0 2 4 K4 K2 0 6 K2 K2 K4 K4 2 4 6 On peut tracer plusieurs représentations paramétriques en créant une liste [...]. Les tracés 2 paramétriques sont compatibles avec les tracés cartésiens de la forme y = f x , ici 1 C 4e Kx . Pour tracer cette dernière, la donnée de l'intervalle en abscisse reste nécessaire (x = K3 ..4). O plot([ 1+4*exp(-x^2),[(t^3+1)/(t^2-1),t-1/t,t=-3..5], [2*cos(t),sin(t),t=0..2*Pi] ],x=-3..4, view=[-6..6,-6..5],discont=true, color=["Red","Blue","Black"]); 4 2 K6 K4 K2 0 K2 2 x 4 6 K4 K6 12 Coordonnées polaires, elliptiques,... Option coords (2D) Les courbes en coordonnées polaires sont introduites dans plot comme des courbes paramétriques mais pour que plot interprète les deux premiers termes de la liste, non comme une abscisse et une ordonnée, mais comme un rayon r t , et un angle q t exprimés tous deux en fonction d'un paramètre t, on ajoute l'option coords = polar. Définissons deux fonctions O rho:=t->sin(t): theta:=t->exp(t/10): · En coordonnées paramétriques sans l'option coords ; r donne l'abscisse et q l'ordonnée. · En coordonnées polaires avec l'option coords=polar qui transforme la première donnée de la liste en rayon et la seconde en angle. Il existe 15 possibilités de représentations : bipolar, cardioid, cassinian, cartesian, elliptic, hyperbolic, invcassinian, invelliptic, logarithmic, logcosh, maxwell, parabolic, polar, rose et tangent, dont on trouvera les définitions dans l'aide en ligne (qui contient aussi les représentations 3D listées en premier dans la page d'aide). 22 O ?coords · Si q t = t la syntaxe peut se simplifier par omission sous la forme plot(ρ(t), t=a..b, coords=...). O plots:-display(Array([ plot([rho(t),theta(t),t=0..8*Pi],axes=boxed, title="Coordonnées paramétriques"), plot([rho(t),theta(t),t=0..8*Pi],axes=boxed, coords=polar,title="Coordonnées polaires"), plot( rho(t),t=0..2*Pi,axes=boxed, coords=polar, title=typeset(''rho(theta)''=rho(theta), " avec ",''theta(t)=t'', "\n(le cercle n'est pas centré sur l'origine !)"))]), scaling=constrained ); Coordonnées paramétriques Coordonnées polaires r q = sin q avec q t = t (le cercle n'est pas centré sur l'origine !) 1 0,8 10 6 2 0,6 0 1 K0,6 K0,6 0 0 0,8 0 0,4 On comprend donc qu'en raison de la syntaxe des commandes, les courbes en polaires ou dans une autre de ces représentations, soient incompatibles avec des représentations cartésiennes et/ou paramétriques (voir au § 14 la fonction display de plots pour résoudre ce problème). Par contre on peut tracer plusieurs courbes de même nature en en faisant la liste ([..]). L'option axiscoordinates=polar permet de remplacer le système de cordonnées cartésiennes par un système polaire. L'option scaling est alors inopérante et vaudra toujours constrained. Pour les autres systèmes de coordonnées (elliptiques, etc.) voir § 13.8. O plot([ [sin(t)*cos(t),t,t=0..2*Pi],[1/2,t,t=0..2*Pi] ], coords=polar,axiscoordinates=polar, color=["Red","Blue"]); p 2 3p 4 p 0 0,1 5p 4 3p 2 23 p 4 0,4 7p 4 0 On peut aussi obtenir des représentations polaires avec la fonction polarplot de la bibliothèque plots (voir § 13). Cette fonction permet aussi le tracé du système de coordonnées polaires, mais possède en plus de nombreuses options (version 12 de MAPLE). L'option scaling est inopérante et vaudra toujours constrained. O plots:-polarplot([ [theta/(2*Pi),theta,theta=-2*Pi..2*Pi], [sin(t),cos(t),t=0..Pi] ], color=["Red","Blue"], axis[angular]=[color="Green", tickmarks=[16,subticks=2], gridlines=[16,color="Magenta"]], axis[radial]=[gridlines=[color="Black"]]); p 2 5p 8 3p 8 7p 8 p 0 0,2 p 4 0,8 p 8 0 15 p 8 5p 4 11 p 8 3p 2 13 p 8 L'option angularunit=degrees de polarplot permet de travailler avec des angles en degrés. On devra alors être attentif à opérer les transformation appropriées. Dans l'exemple précédent l'angle balayé pour la courbe bleue est défini par cos t , t 2 [0,π], c'est-à-dire de +1 rad à -1 rad (tangentes à l'origine à la courbe). On devra donc remplacer [sin(t),cos(t),t=0..π] par [sin(π*t/180),180/π*cos(p*t/180),t=0..180] pour obtenir le même résultat. On pourra compléter ces possibilités avec la fonction coordplot (voir § 13.8). 13 La bibliothèque plots (2D) Cette bibliothèque contient un nombre total de 57 fonctions. Certaines complètent la fonction plot, mais d'autres concernent les tracés en 3 dimensions (surfaces ; voir chapitre 17). Attention au s de plots. O restart: ?plots On rappelle que l'on peut appeler les fonctions de plots de plusieurs façons (voir Ch 1, § 8.3.5): 1) > with(plots): et toutes les fonctions sont accessibles de façon permanente. 2) > with(plots,f,g); et seules les fonctions f et g sont accessibles de façon permanente. 3) > plots[f](...); ou indifféremment > plots:-f(...); et on utilise la fonction f directement, mais elle n'est pas accessible de façon permanente. Pour éviter d'avoir à donner à chacun des appels des fonctions de plots le préfixe plots:-, on donne accès à toute la bibliothèque avec with. Terminer cette commande par ; donne la liste des fonctions. O with(plots): On ne donnera que quelques exemples dans ce paragraphe et dans les suivants des fonctions de 24 plots et on laisse au lecteur le soin d'explorer l'aide en ligne... La fonction interactive de cette blibliothèque a été sommairement présentée au début du chapitre (§ 1). On a déjà aussi utilisé la fonction display pour afficher des tableaux de représentations graphiques et listplot pour tracer une liste d'ordonnées (§ 9.1-3). Attention : les informations ne sont pas nécessairement complètes et on visitera l'aide en ligne. 13.1 Représentations graphiques multiples, fonction display La librairie plots contient la fonction display qui permet d'afficher plusieurs représentations qui ne peuvent pas être tracées sur un même graphique avec une même commande plot (paramétrique et polaire par exemple). On l'utilise aussi, comme sur des exemples précédents, pour afficher plusieurs graphiques sous forme de tableau. Elle permet également d'afficher simultanément plusieurs animations créées par animate. L'option insequence de display fournit encore un autre mode pour les tracés animés. En raison de l'importance de la fonction display, un paragraphe séparé lui est consacré (§ 14). On y examinera aussi sommairement la notion de sructure PLOT. 13.2 Affichage de formules, de flèches et de polygones La bibliothèque plots contient les fonctions qui permettent d'écrire du texte avec des formules, des flèches ou des polygones sur un dessin. Ces opérations sont aussi décrites au § 14.2. 13.3 Courbes définies de façon implicite par des équations cartésiennes: fonction implicitplot La fonction implicitplot permet de tracer des courbes définies de façon implicite, c'est-à-dire par des équations cartésiennes (ou des inéquations) de la forme f x, y = g x, y (ou, ce qui revient au même, h x, y = Cte). L'équation (ou la liste d'équations) sera le premier argument et sera mise par implicitplot sous la forme F(x,y)=0. Les deuxième et troisième arguments sont obligatoires et donnent les intervalles de variations autorisés pour les deux variables. On notera que - Si le premier argument est une simple expression F, implicitplot supposera F=0. Bien entendu, F ne doit dépendre que de deux et exactement deux variables libres. On peut aussi donner des inégalités. - La fonction implicitplot se comporte comme plot pour ce qui concerne la syntaxe des arguments introduisant des opérateurs ou des procédures. On se reportera au § 3.2, mais bien sûr en tenant compte du fait que l'on doit avoir deux variables libres ( f:=x->... devient F:=(x,y)->..., etc.). - On peut donner plusieurs courbes à tracer en donnant une liste d'équations ou d'expressions. O implicitplot([x^2+y^2-2*x-3*y = 0, y^2=4*sin(2*x)], x=-2..2,y=-1.5..4,color=["DarkBlue","Red"]); 3 y 2 1 K2 K1 0 K1 1 x 2 Attention : toutes les options d'implicitplot de ne seront pas décrites. 25 L'option rangeasview vaut false par défaut et recadre automatiquement le domaine du dessin en le restreignant autour de la ou les courbes détectées (dessin de gauche). Si on veut conserver les intervalles originaux de recherche du tracé pour définir l'espace du dessin (ici [−1.2,1.2]× [−1.2,1.2]) on doit poser rangeasview=true (ou simplement rangeasview). La notion d'abscisse et d'ordonnée n'a avec impliciplot que le sens que l'on veut bien lui donner. C'est l'ordre des arguments qui détermine l'orientation de la représentation. O F:=x^2+5*y^2=1: F; display(Array([ implicitplot(F,x=-1.2..1.2,y=-1.2..1.2), implicitplot(F,x=-1.2..1.2,y=-1.2..1.2,rangeasview), implicitplot(F,y=-1.2..1.2,x=-1.2..1.2,rangeasview)]), scaling=constrained); x2 C 5 y2 = 1 1 y y 0,4 K0,8 K0,2 0,2 x x 0,5 K1 K0,5 0 K0,5 0,8 1 0,5 x 0,5 K1 K0,5 0 K0,5 1 K1 0,5 y 1 K1 Pour comprendre certaines options il est indispensable de connaître le principe du tracé. Pour trouver les courbes associées à F x, y = 0, la fonction implicitplot calcule les quantités Fi, j = F xi , yj pour chaque point d'une grille 26#26 (par défaut) dans le rectangle défini par les intervalles donnés pour x et y (en notation simplifiée Fi, j 0 F1 , F2 , ... sur le dessin ci-dessous représentant une portion de la grille). Si par exemple le produit F1 F2 ! 0 , alors implicitplot calcule une valeur approchée de F x, y = 0 (point A) sur le segment qui relie les deux points de la grille et ainsi de suite pour tous les couples adjacents. On notera par parenthèse que la condition F1 F2 ! 0 ne garantit pas l'unicité de la solution, mais seulement un nombre impair de celles-ci et, de même F1 F2 O 0 signifie soit une absence soit un nombre pair de solutions. La fonction relie ensuite les points A, B, C... par des segments de droites. F1 T F4 A F2 ? B U F5 F3 C F6 On peut modifier le nombre de points de la grille (la taille des mailles) avec l'option grid = [n,m]. Si des courbes associées à une même expression deviennent "proches", on peut trouver des points T ou U voisins de A (voir le dessin). L'algorithme risque alors de faire le mauvais choix en reliant A à T ou à U. On suspecte que la première des trois représentations suivantes 26 n'est pas correcte. L'interpolation se fait mal car les mailles de la grille sont trop larges. On augmente la résolution avec grid (deuxième dessin) et tout rentre dans l'ordre. Attention cependant au temps de calcul. L'option gridrefine=n (troisième dessin) conserve la grille standard (ou celle définie par grid si cette option est présente) et autorise n subdivisions des seules cellules de la grille traversées par une ou plusieurs courbes. Cette méthode est beaucoup plus avantageuse en terme de temps de calcul, mais seulement si la grille de départ est suffisamment dense pour détecter toutes les courbes solution (voir l'exemple suivant). O F:=sin(x^2+6*y^2)=0: F; display(Array([ implicitplot(F,x=0..Pi,y=0..Pi,color="DarkBlue"), implicitplot(F,x=0..Pi,y=0..Pi,grid=[75,100], color="DarkBlue"), implicitplot(F,x=0..Pi,y=0..Pi,gridrefine=1, color="DarkBlue") ]) ,scaling=constrained ); sin x2 C 6 y2 = 0 3 y 3 2 y 1 0 3 2 y 1 0 1 2 0 3 2 1 0 1 x 2 0 3 x 0 1 2 3 x Voici un autre exemple illustrant diverses options de implicitplot et notamment la différence entre les rôles joués par grid et gridrefine. On recherche dans [0,2]×[0,2] les pics dont les positions sont supposées inconnues, d'une fonction émergeant d'un plan z = z_min. Ces pics sont simulés ici par deux gaussiennes bidimentionnelles. O x[1]:=1: y[1]:=1: sigma[1]:=0.06: x[2]:=0.5: y[2]:=0.5: sigma[2]:=0.06: z_min:=1: G:=(x,y,x0,y0,s)->2*exp(-(((x-x0)/s)^2+((y-y0)/s)^2)): Pics:=G(x,y,x[1],y[1],sigma[1])+ G(x,y,x[2],y[2],sigma[2]): En projection sur l'axe x ceci donne O plot([[[0,z_min],[2,z_min]], G(x,y[1],x[1],y[1],sigma[1])+ G(x,y[2],x[2],y[2],sigma[2])], x=0..2,z,color="Black",linestyle=[dot,solid]); 2 1,5 z 1 0,5 0 z = z_min 0 0,5 1 x 1,5 2 On fera les remarques suivantes à propos des résultats ci-dessous : - sur le dessin de gauche on ne voit que la trace d'un seul pic car, par malchance, la courbe associée au deuxième est complètement contenue dans une cellule de la grille de calcul et n'en 27 coupe pas (ou pas suffisamment) de bords. - sur le deuxième dessin on a posé gridrefine=5, mais on peut constater que l'on a toujours qu'un seul pic détecté pour la même raison que précédemment. Par contre la subdivision a eu lieu dans la ou les cellules qui ont détecté le pic et on pourrait constater une nette amélioration du tracé sur un dessin plus grand. L'option filledregions est posée égale à true. Ceci entraîne la coloration de la partie du plan correspondant à Pics-z_min > 0. On choisit les couleurs des deux régions (<0 et >0) avec coloring. La couleur de la courbe solution est donnée par color. - Sur le troisième dessin la taille de la maille de la grille a été diminuée en augmentant les valeurs de grid et le deuxième pic est détecté. O display(Array([ implicitplot(Pics=z_min,x=0..2,y=0..2, rangeasview), implicitplot(Pics=z_min,x=0..2,y=0..2, rangeasview,gridrefine=5, filledregions=true, coloring=["White","Cyan"], color="DarkBlue"), implicitplot(Pics=z_min,x=0..2,y=0..2, rangeasview,grid=[50,50],gridrefine=5, filledregions=true,coloring=["Pink","Cyan"], color="DarkBlue")]), scaling=constrained); 2 1,5 y 1 0,5 0 0 0,5 1 1,5 2 x L'option crossingrefine=n améliore la méthode d'interpolation, linéaire par défaut (n=1), sans changer les paramètres de la grille. L'augmentation globale de la résolution de la grille avec l'option grid n'est pas la solution la plus économique en temps de calcul pour améliorer un tracé et doit être évitée dès lors que toutes les courbes sont détectées. Comme expliqué plus haut la fonction implicitplot calcule F(x,y) pour chaque point de la grille afin de localiser par interpolation les points tels que F=0. Cette opération peut être coûteuse en temps de calcul si F est longue à calculer. L'augmentation de la résolution de toute la grille aggrave les choses. Si on sait qu'il n'y aura pas de problème de détection des parties de courbe(s) comme avec l'exemple précédent, on aura même intérêt à diminuer le nombre de points de la grille (voir l'exemple ci-dessous avec la courbe algébrique S dite strophoïde ; la motivation n'est pas ici de réduire le temps de calcul (!), mais de trouver un exemple parlant). D'une grille 25×25 par défaut on passe à 6×6 et on joue avec les autres options. La petite taille du dessin ne le montre pas clairement, mais le tracé de la dernière courbe est un peu meilleur. Remarque : il existe une fonction de tracé spécifique pour les courbes algébriques (voir la fonction plot_real_curve de la bibliothèque algcurves), mais la méthode de construction du tracé est radicalement différente. O grille:=[6,6]; grille := 6, 6 28 O S d x3 C x y2 K x2 C y2 = 0 : display(Array([ [implicitplot(S,x=-1..1,y=-1..1,grid=grille), implicitplot(S,x=-1..1,y=-1..1,grid=grille, crossingrefine=2) ], [implicitplot(S,x=-1..1,y=-1..1,grid=grille, gridrefine=2), implicitplot(S,x=-1..1,y=-1..1,grid=grille, gridrefine=2,crossingrefine=2) ] ]), scaling=constrained,title="Strophoïde"); Strophoïde 1 y Strophoïde 1 0,5 y 0 0,2 0,4 0,6 0,8 x K0,4 K0,4 K0,5 0 0,2 0,4 0,6 0,8 x K0,5 K0,5 K1 K1 Strophoïde 1 y 0,5 Strophoïde 1 0,5 0 y 0,5 x 1 K0,5 0,5 0 K0,5 K0,5 K1 K1 0,5 x 1 Il est clair que l'équation suivante n'a pas de solution. Néanmoins un cercle apparaît dont l'équation est donnée par le dénominateur. Par défaut la fonction implicitplot trace la courbe associée au changement de signe de la fonction qui correspond dans ce cas à un lieu de singularités. L'interpolation linéaire utilisée par défaut est dans ce cas mauvaise en dépit de la présence de l'option gridrefine. On utilisera alors l'option rational=true. On peut supprimer ce tracé avec signchange=false. 29 O F := 1 =0: x C y2 K 1 display(Array([ implicitplot(F,x=-1.1..1.1,y=-1.1..1.1,gridrefine=2, rangeasview), implicitplot(F,x=-1.1..1.1,y=-1.1..1.1,gridrefine=2, rangeasview,rational=true), implicitplot(F,x=-1.1..1.1,y=-1.1..1.1,gridrefine=2, rangeasview,signchange=false)]), scaling=constrained); 2 1 y 1 y 0,5 K1 K0,5 0 K0,5 0,5 x 1 y 0,5 K1 K0,5 0 K0,5 1 K1 0,5 x 1 0,5 K1 K0,5 0 K0,5 K1 0,5 x 1 K1 Exercice : pas d'interprétation hâtive ! Expliquer ces deux figures tirées de la même équation. O F := 2 xCy K xKy 2 =0: x2 C y K 1 display(Array([ implicitplot(F,x=-1.1..1.1,y=-1.1..1.1,gridrefine=2, rangeasview,rational=true), implicitplot(F,x=-1.1..1.1,y=-1.1..1.1,gridrefine=2, rangeasview,signchange=false,axes=boxed)]), scaling=constrained); 1 y 1 0,5 0,5 y K1 K0,5 0 K0,5 0,5 x 1 0 K0,5 K1 K1 K0,5 K1 30 0 x 0,5 1 13.4 Tracés logarithmiques La librairie plots contient trois fonctions relatives aux tracés logarithmiques : logplot, semilogplot, et loglogplot (visiter l'aide en ligne). Par exemple O f := x/ xK3 : 106 X:=[0.01,0.2,0.7,1,2,5]: Lxy:=[seq([x,f(x)],x in X)]: display(Array([ logplot([Lxy,f(x)],x=0.01..6,style=[point,line], symbol=diamond,symbolsize=20, color=["Red","DarkBlue"],title="logplot"), semilogplot([Lxy,f(x)],x=0.01..6,style=[point,line], symbol=diamond,symbolsize=20, color=["Red","DarkBlue"],title="semilogplot"), loglogplot([Lxy,f(x)],x=0.01..6,style=[point,line], symbol=diamond,symbolsize=20, color=["Red","DarkBlue"],title="loglogplot") ]) ); logplot semilogplot 10 0 10 - 2 10 - 4 10 - 6 10 - 8 1 2 3 4 5 6 x loglogplot 10 0 1 0,8 0,6 0,4 0,2 0 10 - 2 10 - 4 10 - 6 10 - 8 0,1 x 1 5 0,1 x 1 5 On peut également obtenir de tels tracés avec l'option axis[n]=[mode=log,...] de plot (voir un exemple au § 7.5). O ?plot,axis Attention : que ce soit avec l'option axis[1]=[mode=log] de plot ou avec les fonctions loglogplot ou semilogplot de plots qui portent les abscisses sur un axe logarithmique, on peut se trouver confronté à une difficulté due à un sous-échantillonage de la fonction. Par exemple on veut tracer l'expression y=sin(1/x) avec ce mode sur l'intervalle 10K2 , 3 p . Le dessin de gauche ci-dessous fait clairement apparaître le problème. On peut tenter d'augmenter le nombre de points de calcul avec l'option numpoints=M, mais cela n'améliore pas la situation de façon satisfaisante. Construire une liste de listes de la forme XY:= x1 , y1 , x2 , y2 ,... xM, yM (voir § 9.1-2) avec des xi adaptés ne résout pas d'avantage le problème (voir l'explication ci-dessous). Pour contourner cette difficulté on propose d'utiliser l'option sample déjà mentionnée au § 7.8. On transforme l'intervalle de tracé a, b en un intervalle log10 a , log10 b que l'on divise en N intervalles égaux de longueur dx a d 10K2 : b d 3 p : N d 50 : log10 b Klog10 a dx d evalf N 0.05948542255 31 On construit ensuite une liste d'abscisses sur l'axe linéaire telles qu'elles soient régulièrement espacées sur l'axe logarithmique log10 a C k $d x Lx d seq 10 , k = 0 ..N : et on utilise ensuite l'option sample=Lx dans plot O display(Array([ plot(sin(1/x),x=a..b,axis[1]=[mode=log],color="Red"), plot(sin(1/x),x=a..b,axis[1]=[mode=log],color="Blue", sample=Lx) ])); 0,8 0,6 0,4 0,2 0 K0,2 K0,4 K0,6 K0,8 1 0,5 0,1 0,5 1 5 x 0 0,1 0,5 1 5 x K0,5 K1 Pour bien comprendre la signification des options sample et adaptive il faut noter le point suivant : comme indiqué au § 7.8 la courbe bleue ci-dessus est correctement tracée car plot utilise pour base de calcul l'échantillonnage calculé dans Lx. Ceci signifie que le tracé utilise en réalité plus de points que n'en contient la liste car l'option adaptive vaut true par défaut. Poser adaptive=false forcerait plot à utiliser strictement les valeurs imposées par Lx, ce qui reviendrait à effectuer un tracé avec la liste de listes XY. 1 XY d seq x, sin , x in Lx : x O display(Array([ plot(XY,x=a..b,axis[1]=[mode=log],color="Red"), plot(sin(1/x),x=a..b,axis[1]=[mode=log],color="Blue", sample=Lx, adaptive=false) ])); 0,8 0,6 0,4 0,2 0 K0,2 K0,4 K0,6 K0,8 0,1 0,5 1 5 x 32 0,8 0,6 0,4 0,2 0 K0,2 K0,4 K0,6 K0,8 0,1 0,5 1 x 5 On peut résumer ces calculs dans une procédure plot_xlog (voir Ch. 19) plot_xlog :=proc(E::algebraic,itv::name=range(realcons), couleur::string,N::posint) local log_a,delta,Lx; log_a:=evalf(log10(op(1,rhs(itv)))): delta:=(evalf(log10(op(2,rhs(itv))))-log_a)/N: Lx:=[seq(10^(log_a+k*delta),k=0..N)]: plot(E,itv,color=couleur,sample=Lx,axis[1]=[mode=log]): end proc: O plot_xlog(sin(1/x),x=1e-2..3*Pi,"Blue",50); 1 0,5 0 0,05 0,1 0,5 1 5 x K0,5 K1 On montre maintenant comment tracer deux courbes obtenues avec cette procédure sur un même graphique en utilisant à nouveau display (la figure de gauche est incorrecte). O f,g:=(1-exp(-sqrt(1e6*x)))/sqrt(1e6*x), 1-exp(-sqrt(1e6*x)); f, g := 0.001 1 K eK1000. x x , 1 K eK1000. x O display(Array([ plot([f,g],x=1e-10..1e-2,0..1, axis[1]=[mode=log],color=["Blue","Red"]), display( plot_xlog(f,x=1e-10..1e-2,"Blue",50), plot_xlog(g,x=1e-10..1e-2,"Red" ,50)) ])); 1 1,0 0,8 0,7 0,6 0,5 0,4 0,3 0,2 0 0,1 10 - 9 10 - 7 10 - 5 10 - 2 x 33 10 - 10 10 - 8 10 - 6 x 10 - 4 10 - 2 13.5 Tracés dans le plan complexe 13.5.1 Fonction complexplot La fonction complexplot de plots permet d'obtenir la représentation dans le plan complexe des valeurs d'une fonction à valeurs complexes. - Le tracé de x sur [−1,+1] est instructif. Pour x 2 K1, 0 , x = i x , ce qui correspond au segment "vertical" sur l'axe imaginaire. De même pour x 2 0,C 1 , x est réel et correspond au segment "horizontal" sur l'axe réel. - Les valeurs de la variable doivent être réelles (par exemple x=−1..1 et non x=−i..+i ; voir sinon la fonction conformal de plots ci-dessous). Les fonctions du second graphique sont explicitement définies comme complexes. - Quand l'objet à tracer est une liste de nombres complexes ou réels Z1 , Z2 ,..., Zi ,... , complexplot trace par défaut une ligne polygonale reliant les affixes R Zi , I Zi . L'option style=point, permet de tracer ces affixes sous forme de marqueurs. Attention : comme pour plot on peut donner simultanément plusieurs courbes à tracer dans une liste (deuxième graphique), mais on ne peut pas donner à la fois une liste de points et une courbe. Plusieurs listes de points peuvent être données mais seulement sous la forme [op (L1),op(L2),...] pour former une liste unique. Voir le remède à ces difficultés avec la fonction display au §14. On notera que scaling et ici une option de display et s'applique aux trois représentations. O P:=add((-1)^i*x^i,i=0..11); L:=[solve(P,x)]: display(Array([ complexplot(sqrt(x),x=-1..1, axes=boxed,view=[-1.1..1.1,-1.1..1.1], color="Blue", title=typeset(sqrt(x)," , ",x in [-1,+1])), complexplot([1+I+exp(2*I*t),(1/8)*sin(t^2+I*t)], t=0..Pi,color=["Blue","Red"], title=typeset(1+i+exp(2*i*theta)," (bleu) ,\n", (1/8)*sin(theta^2+i*theta)," (rouge) , ", theta in [0,Pi])), complexplot(L,style=point,symbol=cross,symbolsize=20, color="Red",axesfont=[Times,8], title=typeset("Racines de ",''P(x)'')) ]), scaling=constrained); P := 1 K x C x2 K x3 C x4 K x5 C x6 K x7 C x8 K x9 C x10 K x11 x , x 2 K1, 1 1 1 2 sin q C i q (rouge) 8 , q 2 0, p 2 1 0 K1 1 C i C e2 i q (bleu) , 0 0,5 1 0 0,5 1 1,5 2 K1 34 Racines de P x 1 0,5 K0,8 K0,4 0 0,2 K0,5 K1 0,8 1 La variable de complexplot doit prendre des valeurs réelles, mais rien n'empêche de construire par exemple les tracés de cos(z) et sin(z) pour z = e i q avec q ∈ [0,π]. On a utilisé l'opérateur de composition de fonctions @ (f @ g, la syntaxe habituelle étant f o g), mais on aurait pu aussi écrire > complexplot([sin(exp(I*theta)),cos(exp(I*theta))], theta=0..Pi,... Voir aussi l'exercice 7.6. On notera les options legend et legendstyle. Les textes des légendes peuvent être composés avec typeset (voir § 7.4.1) et/ou édités manuellement. Les options de legendstyle sont font=[Nom_police,taille] et location=[top/bottom/right/left] O s:=t->exp(I*t): complexplot([sin@s,cos@s],0..Pi, color=["Red","Blue"], title=typeset(z=e^(i*theta)," , ",theta in [0,Pi]), legend=[sin(z),cos(z)], legendstyle=[location=top,font=[TIMES,12]], scaling=constrained); z = ei q , q 2 sin z 0, p cos z 1 0,5 0 K0,5 0,5 1 1,5 K0,5 13.5.2 Fonction conformal La fonction conformal de plots permet donner une représentation d'une fonction à valeurs complexes (et une seule à la fois, mais on peut utiliser display ; voir § 14.1) de la façon suivante : on définit un rectangle dans le plan complexe d'une variable u en donnant deux affixes (dans cet exemple on a pris 1/4+i / 2 et 1+i) et en utilisant une syntaxe d'intervalle, u= 1/4+I/2..1+I. Avec grid=[n,m] on définit n segments à parties réelles constantes (rouge) et m segments à parties imaginaires constantes (bleu) qui seront 35 considérés comme régulièrement espacés (en l'absence de cette option les valeurs par défaut sont n=m=11). La fonction calcule ensuite les valeurs complexes de la fonction quand la variable suit chacun des segments, dessinant ainsi dans le plan complexe image un réseau de courbes. Un troisième argument (facultatif) donne, avec ici aussi une syntaxe d'intervalle, le domaine du plan complexe dans lequel on souhaite représenter ce réseau de courbes. C'est en quelque sorte l'équivalent de l'option view qui d'ailleurs pourrait remplacer "l'intervalle" 0. .1.5+1.2*I en écrivant view=[0..1.5,0..1.2]. On peut également modifier le nombre de points utilisés pour tracer les courbes avec l'option numxy=[N,M], c'est-à-dire N points pour chaque segment parallèle à l'axe réel et M dans la direction imaginaire. On peut utiliser l'option coord pour cette fonction (par exemple en polaire, les segments deviendraient des cercle et des rayons). Pour mériter son qualificatif de "transformation conforme" (i.e. qui conserve les angles : les droites du plan de la variable se "coupent à angles droits", alors les courbes images aussi) il est impératif d'introduire l'option scaling=constrained. La fonction conformal possède son équivalent en 3D sur une sphère de Riemann. i I u z z i 2 R u (z 1 4 1 O conformal(sin(u),u=1/4+I/2..1+I,0..1.5+1.2*I, grid=[5,4],color=["Red","Blue"], title=sin(u),titlefont=[TIMES,12], scaling=constrained); sin u 1,2 1 0,8 0,6 0,4 0,2 0 0 0,5 1 1,5 13.6 Représentations animées La fonction animate permet de construire un graphique animé d'une représentation cartésienne, polaire ou autres et dépendante d'un paramètre qui sera associé au temps. - Le premier argument est le nom d'une fonction de tracé : plot, implicitplot, etc. 36 - Il ne peut y avoir qu'une seule courbe animée. On peut cependant, à l'aide de la fonction display, animer simultanément plusieurs courbes (voir § 14.3). - Le deuxième argument est la liste de tous les paramètres et options de construction propres à la fonction de tracé choisie (et non à animate). Le paramètre d'animation (ici t) peut apparaître dans chacun des éléments de cette liste (ici dans l'expression et dans l'intervalle de tracé). - Le troisième argument fixe l'intervalle de variation du paramètre d'animation. Il peut être suivi d'options propres à animate (voir l'exemple suivant). - Par défaut, animate va contruire 25 images (frames) qui seront affichées successivement. - On peut voir défiler (en haut du dessin) les valeurs du paramètre d'animation t associées à chaque image qui s'affiche. On peut effacer cette information avec l'option paraminfo=false. - L'option trace=n laisserait n traces fixes de l'animation également réparties sur l'intervalle d'animation. Attention : La représentation qui s'affiche initialement correspond à la première image qui peut être vide, ce qui ne signifie pas qu'il y ait une erreur... Supposons que l'on pose t = −1..3. Alors l'intervalle de construction de la première courbe serait x = −1..−1 et la première image serait vide. O animate(plot,[t*x^3/10-5*sin(x)^2+t,x=-1..t, color="Blue"], t=0..3); t = 2.6250 10 8 6 4 2 K1 0 1 2 3 x K2 Il suffit ensuite de cliquer sur le graphique et lancer l'animation ( ) à l'aide du nouveau menu qui apparaît ... ... MAPLE va afficher successivement les 25 représentations graphiques (frames) donnant l'illusion d'une animation. L'option FPS (Frame Per Second) permet de régler la vitesse du défilement. Noter aussi le menu contenant qui permet la répétition sans interruption de la séquence. Si la séquence est périodique et si la dernière image est construite, comme dans l'exemple suivant, identique à la première (ou l'équivalent de sa précédente) on verra un mouvement ininterrompu et sans saccade. Le menu permet de jouer la séquence à l'endroit ou à l'envers et l'item rend l'animation "oscillante". Le menu contextuel (clic droit 37 sur le graphique, item Animation) permet aussi d'accéder à ces options. Le défilement peut aussi être obtenu en manipulant le curseur avec la souris. Avec ce nouvel exemple animate va mémoriser les représentations graphiques d'une rosace décrite en coordonnées polaires par l'angle q appartenant à 0, 2 p . Le paramètre d'animation sera le déphasage f variant dans [0 , π/4] pour 50 valeurs (50 images) fixées par l'option frames (25 par défaut). On impose avec numpoints que chacune des 50 représentations soit définie avec 100 points. - On peut créer une image de fond fixe que l'on associe avec l'option background (pour la fonction implicitplot, voir le paragraphe correspondant). ATTENTION : rien n'interdit de créer une image de fond animée, mais mieux vaut savoir ce que l'on fait ! La fonction animate risque de créer un "objet" énorme en terme de taille mémoire et de taille de fichier de sauvegarde (parce que n images pour le fond et m images pour l'animation donnent n#m images et non n+m). D'autant que le résultat risque de ne pas être celui attendu... Voir plutôt le paragraphe de la fonction display de plots. O Fond:=implicitplot(x^2+y^2-1/4=0, x=-1.2..1.2, y=-1.2..1.2, filledregions=true,coloring=["DarkBlue","SkyBlue"], color="DarkBlue"): O animate(plot,[[cos(4*(theta+phi)),theta,theta=0..2*Pi], coords=polar],phi=0..Pi/4,numpoints=100,frames=50, background=Fond,paraminfo=false,axes=none, thickness=3); ENREGISTREMENT : on peut enregistrer une séquence animée dans un fichier au format GIF (Graphics Interchange Format). Voir § 5.2. Exercice: animez la courbe définie paramétriquement par x t = cos t et y t = sin a t C f où le déphasage f sera le paramètre d'animation variant de 0 à 2 p. On prendra a = 3, t dans 0, 2 p , 80 points pour définir chaque courbe et 100 images pour l'animation. Comment appelle-t-on ce type de courbes ? 13.7 Axes duaux pour les ordonnées La fonction dualaxisplot de plots permet de tracer deux axes différents pour les ordonnées sur une même représentation. On peut utiliser deux formes d'appel 38 - plots:-dualaxisplot(f(x),g(x),x=a..b,options); - plots:-dualaxisplot(P1,P2); où P1 et P2 sont des structures PLOT qui peuvent être pré-établies (par exemple X ; voir § 14.1 pour les structures PLOT) ou introduites directement (plot). Par exemple O X:=plot(exp(-sin(x)),x=1..3.5, axis[2]=[color="Red"],view=[1..3.5,0.2..0.9]): dualaxisplot(X, plot(1/t^3*abs(cos(Pi*t)),t=1..3, color="Blue", axis[2]=[mode=log,color="Blue"], numpoints=1000,view=[1..4,1e-5..1])); 10 0 0,9 0,8 10 - 1 0,7 0,6 10 - 2 0,5 10 - 3 0,4 10 - 4 0,3 0,2 1 1,5 2 2,5 3 3,5 x Avec le dessin suivant on veut tracer un axe secondaire qui permette une lecture directe des ordonnées en degrés Fahrenheit pour les mesures en degrés Celsius suivantes: O Mesures:=[[5,20.06],[12.,20.17],[24.,20.27],[36.,20.34], [42.,20.38],[48.,20.43],[54.,20.5],[60.,20.59]]: On établit la correspondance entre échelles pour les valeurs extrêmes choisies pour les axes des ordonnées (Celsius →Fahrenheit). O convert(20, temperature,Celsius,Fahrenheit), convert(20.7,temperature,Celsius,Fahrenheit); 68, 69.2600000 Dans la commande suivante le deuxième tracé a été rendu volontairement absent en prenant 0 comme valeur constante et donc hors des valeurs choisies pour les ordonnées. Il ne sert qu'à tracer l'axe secondaire. On notera également qu'un retour à la ligne dans un texte (voir le titre) peut aussi (voir § 7.4.1) être obtenu par un retour à la ligne (Shift-Return) dans la chaîne de caractères de la commande. O dualaxisplot(plot(Mesures, style=point,symbol=solidcircle, symbolsize=15,view=[0..70,20..20.7], labels=["Temps [s]","Température [C]"], labeldirections=[horizontal,vertical], title="Evolution de la température en fonction du temps", titlefont=[TIMES,12]), plot(0,0..1,labels=["","Température [F]"], labeldirections=[horizontal,vertical], axis[2]=[color="Blue"],view=[0..70,68..69.26])); 39 Evolution de la température en fonction du temps 20,7 69,2 69 20,5 68,8 20,4 68,6 20,3 68,4 20,2 68,2 20,1 20 Température [F] Température [C] 20,6 0 10 20 30 40 50 Temps [s] 60 70 68 13.8 Autres fonctions de plots On n'a pas tout épuisé... Il existe encore des possibilités offertes par la bibliothèque plots comme les tracés de champs de vecteurs gradplot, fieldplot , les tracés de polygones (voir § 14.2), la programmation linéaire avec inequal (voir aussi la bibliothèque simplex), etc. O ?plots O display(Array([ densityplot(abs(cos(x+I*y)),x=-Pi..Pi,y=-1..1, colorstyle=HUE,style=PATCHNOGRID), contourplot(abs(cos(x+I*y)),x=-Pi..Pi,y=-1..1, contours=10,grid=[75,75], filledregion,coloring=["Red","Green"])])); On notera aussi l'existence de la fonction coordplot qui permet de tracer un des systèmes de coordonnées (2D) décrits dans O ?coords 40 et déjà mentionnés au § 12. On peut ainsi associer à un tracé son système de coordonnées avec display (§ 14). La fonction coordplot possède de nombreuses options que l'on ne décrira pas. O P:=[cos(t),sin(t),t=0..Pi]: display(Array([ display(coordplot(polar),plot(P,coords=polar, color="DarkGreen", title=typeset("Coordonnées polaires\n",P))), display(coordplot(elliptic),plot(P,coords=elliptic, color="DarkGreen", title=typeset("Coordonnées elliptiques\n",P))) ]), scaling=constrained); Coordonnées polaires cos t , sin t , t = 0 ..p Coordonnées elliptiques cos t , sin t , t = 0 ..p Attention : la courbe verte à droite ressemble de très près à un cercle, mais n'en est pas un ! 14 Fonction display de plots 14.1 Affichages combinés. Notion de structures PLOT On peut se trouver dans l'impossibilité d'afficher des courbes issues de représentations différentes, soit parce que les options sont incompatibles dans une même commande (cartésiennes et polaires par exemple), soit parce qu'elles sont issues de fonctions graphiques différentes comme plot et implicitplot. Nous allons voir comment pallier cette difficulté. Lorsqu'on lance une commande de tracé, on déclenche deux étapes: 1) La construction d'une structure de données PLOT. Elle n'est pas la description d'un graphique mais contient simplement les informations définissant sa nature et les données numériques nécessaires à sa construction. 2) La construction et l'affichage du graphique. On peut cependant éviter la deuxième étape et conserver la structure créée en 1) en l'assignant à un nom. On reprend un des exemples précédents (§ 13.5) où P est un polynôme de degré 11 et L la liste de ses racines. L'option view, inutile ici, a été introduite à dessein pour illuster la deuxième étape. O P:=add((-1)^i*x^i,i=0..11): L:=[solve(P,x)]: A:=complexplot(L,style=point,symbol=cross,symbolsize=20, color="Red",axesfont=[Times,8], view=[-1.2..1.2,-1..1]); A := PLOT ... Le contenu de la structure PLOT peut être détaillé en écrivant > op(A); Ceci montrerait en particulier les couples de valeurs calculées pour construire le graphique, mais l'affichage est en 41 général assez lourd. Dans les exemples des paragraphes précédents, les structures n'étaient pas assignées à des noms et n'avaient d'existence que pendant la durée du tracé. Pour afficher le graphique correspondant on écrira simplement (on passe maintenant à l'étape 2) O A; 1 0,5 K1 0 K0,5 0,5 1 K0,5 K1 On veut maintenant réunir avec cette figure le cercle unité du plan complexe. La difficulté vient de ce que complexplot ne sait pas construire avec une même commande, deux représentations, l'une de type "marqueurs" et l'autre de type "courbe". On doit les construire séparément et les réunir ensuite avec display. Pour ce qui concerne la représentation graphique, on se moque de savoir que l'on superpose le plan ℝ2 avec le plan complexe. On peut donc construire ce cercle soit avec complexplot ( e i q ), soit en paramétrique ( cos q , sin q , q = 0 ..2 p ) ou encore en polaire: O B:=plot(1,theta=0..2*Pi,coords=polar, color="Blue",title="Cercle unité du plan complexe", view=[-1.1..1.1,-1.5..1.5]): que l'on peut afficher avec O B; Cercle unité du plan complexe 1,5 1 0,5 K1 K0,5 K0,5 K1 K1,5 0,5 1 On réunit maintenant ces graphiques avec la fonction display de la bibliothèque plots en indiquant les deux structures A et B que l'on a pris soin de mémoriser. On remarquera les points suivants: - Le titre "Racines de..." remplace le titre "Cercle unité..." donné pour B. - L'option axes=boxed a changé la façon de représenter les axes. - L'option scaling=constrained peut être donnée dans display. - Les longeurs des axes résultent d'une combinaison optimale des deux tracés précédents (dans ce cas des deux options view). On peut ainsi fixer dans display certaines spécifications d'affichage à condition qu'elles ne modifient pas la nature des représentations. O display(A,B,title=typeset("Racines de ",P), 42 O scaling=constrained,axes=boxed); Racines de 1 K x C x2 K x3 C x4 K x5 C x6 K x7 1,5 C x8 K x9 C x10 K x11 1 0,5 0 K0,5 K1 K1,5 K1 K0,5 0 0,5 1 On n'est pas obligé d'assigner les structures PLOT à des noms et on peut donner directement les commandes graphiques en arguments de display. Les 3 courbes suivantes ont des modes de construction différents et incompatibles pour être tracées par un même ordre plot (f(x), polaire et implicite). Au même titre que toute fonction gaphique 2D, display crée une structure PLOT que l'on peut assigner à un nom en écrivant : > X:=display(...):. Noter que les options title, titlefont, scaling et axes sont ici des arguments de display et s'appliquent donc aux trois représentations. O display( plot(exp(-x^2),x=-3..3,color="Blue"), plot([3*sin(t)+2*cos(t),t,t=0..Pi],coords=polar, color="Black"), implicitplot((x/y)^2-abs(x*y)=0,x=-3..3,y=-3..3, gridrefine=5), title="Mélange", titlefont=[TIMES,12],scaling=constrained,axes=boxed); Mélange 3 2 1 0 K1 K2 K3 K2 K1 0 x 1 2 3 14.2 Affichage de textes, de formules, de flèches et de polygones Ces objets sont construit séparément et rassemblés ensuite avec display de plots. On rappelle que toutes ces opérations "cosmétiques" peuvent se faire "à la main" si elles n'ont pas besoin d'être automatisées (voir l'Annexe 1 en fin de ce chapitre). Pour illustrer ce paragraphe on va 43 construire un exemple. 1) Si le document doit être imprimé on rappelle qu'un formatage préalable à l'écran de la feuille de calcul peut être nécessaire pour éviter les mauvaises surprises (voir Ch. 1, § 8.4.6). 2) Généralement on construit d'abord la représentation graphique et on voit ainsi l'espace dont on dispose. On notera comment on a effacé avec l'option labels les noms automatiques mal placés des axes (dans ce cas, seul celui des abscisses existait) et comment on peut les écrire exactement là où on le souhaite avec textplot (voir aussi 3). On notera dans la création du titre l'utilisation d'un double "\n" (saut à la ligne) permettant de laisser un espace entre le titre et le dessin. O P:=plot([AiryAi(x),AiryBi(x)],x=-10.1..4,-1/2..1.3, color=["Red","Blue"], title="Fonctions d'Airy\n\n",titlefont=[Times,15], numpoints=100,labels=["",""]): X:=textplot([3.75,0.1,x]): display(P,X): # ou bien directement display(P,textplot([3.75,0.1,x])); Fonctions d'Airy 1,2 1 0,8 0,6 0,4 0,2 K10 K8 K6 K4 K0,2 K0,4 x 2 4 3) On écrit du texte et des formules au point (x , y) avec textplot et on mémorise les structures PLOT (ici T1 et T2). La syntaxe est une liste de listes (ou une liste simple) composée comme [x, y, Texte, Position par rapport à (x, y)] où Position... est une sous-option align qui peut valoir right (droite), left (gauche), above (dessus) ou below (dessous). On peut donner une combinaison de deux de ces options. Le Texte peut être composé avec typeset comme montré au § 7.4.1. En regardant le dessin final, on examinera soigneusement les arguments de typeset et leurs évaluations. O T1:=textplot([[-10,1.1,typeset("Ai(0) = ", AiryAi(0)=evalf[4](AiryAi(0)),"..."), align=right], [-10,0.7,typeset("Bi(0) = ", AiryBi(0)=evalf[4](AiryBi(0)),"..."), align=[above,right]]], font=[Times,10]): T2:=textplot([[3,0.9,"Bi",color="Blue"], [3,0.4,"Ai",color="Red"]],font=[Times,10]): 4) On trace des flèches avec la fonction arrow de plots. On examinera l'aide en ligne pour compléter ces informations sur les options. On pourra aussi utiliser arrow de plottools (§ 16.1). - Les coordonnées (en 2D) sont indiquées sous la forme de deux vecteurs <x1 , y1 > et <x2 , y2 >. La flèche commence en <x1 , y1 > et se termine en <x1 + x2 , y1 + y2 >. Avec l'option difference la flèche se termine en <x2 , y2 >. L'utilisation de cette notation plutôt que de listes est 44 très pratique en algèbre linéaire pour la représentation géométrique des vecteurs. - Le profil d'une tête de flèche est donné par l'option shape qui peut prendre les valeurs symboliques harpoon, arrow, double_arrow (cylindrical_arrow uniquement pour le graphisme 3D). - Les options width et head_length définissent la largeur et la longueur de la tête de flèche. Si elles sont écrites par exemple par width=x, x sera la longueur absolue calculée dans les unités de l'un ou de l'autre des axes suivant les orientations des traits tracés. Ceci peut donner un aspect dissymétrique à la flèche quand elle a le profil shape=arrow ou double_arrow. La symétrie n'est alors préservée qu'avec l'option scaling=constrained. Ces options peuvent aussi s'écrire par exemple head_length=[x,relative] qui dit que la longueur de la tête est relative à la longueur totale de flèche par un facteur x. - Comme pour les courbes, l'option thickness définit l'épaisseur. - Un segment ne se trace pas avec arrow, mais avec, par exemple (voir § 9.1): plot([[x1,y1],[x2,y2]],...); O F:=arrow([[<2.5,0.9>,<0.85,0.9>],[<2.5,0.4>,<0.8,0.25>]], difference,color="Black",shape=arrow, width=[0.02,relative],head_length=[0.2,relative], thickness=2): 5) On trace un rectangle avec la fonction polygonplot de plots pour faire ressortir les deux formules. L'option transparency prend des valeurs comprises entre 0 (couleur de fond totalement opaque) et 1 (couleur de fond totalement transparente). O Cadre:=polygonplot( [[-10,0.6],[-2.5,0.6],[-2.5,1.3],[-10,1.3]], color="DarkBlue",transparency=0.8): On rassemble le tout sans se soucier de l'ordre... O display(P,T1,T2,Cadre,F,X); Fonctions d'Airy 1 Ai(0) = 3 3 1/ 3 2 G 3 1 3 5/ 6 Bi(0) = 3 2 G 3 1,2 = 0.3550... 1 Bi = 0.6149... 0,8 0,6 Ai 0,4 0,2 x K10 K8 K6 K4 0 K2 K0,2 K0,4 Attention : "... sans se soucier de l'ordre"... pas toujours ! 45 2 4 O a:=1: b:=3/4: C1:=polygonplot([[a,0],[0,a],[-a,0],[0,-a]],color="Red"): C2:=polygonplot([[b,b],[-b,b],[-b,-b],[b,-b]], color="Blue"): display(Array([ display(C1,C2), display(C2,C1) ]), scaling=constrained,axes=none); 14.3 Animations avec la fonction display Enregistrement : on peut enregistrer une séquence animée dans un fichier au format GIF (Graphics Interchange Format). Voir § 5.2. 14.3.1 Combinaison de fonctions animate La fonction animate n'anime qu'une fonction à la fois (§ 13.6). On peut cependant, avec display, afficher plusieurs animations et les faire jouer simultanément. On notera avec l'exemple ci-dessous que - Les trois représentations sont de natures différentes: cartésienne (A), polaire (B ; § 12) et implicite (C ; § 13.3). - Les paramètres d'animation n'ont pas besoin ni de porter le même nom ni d'explorer le même domaine (t=0..Pi alors que phi=0..2*Pi , ...). - Le nombre d'images (frames) n'est pas nécessairement le même pour chaque animation (A est construit avec 50 images et B et C avec 25 par défaut). Les 25 premières images seront affichées ensemble pour A, B et C puis B et C disparaîtront et seules les 25 restantes de A seront affichées. O A:=animate(plot,[sin(3*x),x=0..t],t=0..Pi,frames=50): B:=animate(plot,[[sin(theta),cos(3*theta), theta=0..phi], coords=polar,color="Blue"],phi=0..2*Pi): C:=animate(implicitplot,[sin(x^2+u)-cos(x+y)=0, x=0..Pi,y=-1..Pi, filledregions=true, coloring=["White","LightBlue"], gridrefine=2,crossingrefine=2, color="DarkBlue"],u=0..2*Pi): display(A,B,C,scaling=constrained); 46 14.3.2 Option insequence Il existe une autre possibilité avec l'option insequence de la fontion display. Elle permet d'afficher successivement une série de graphiques fixes pouvant provenir de méthodes de construction diverses. On va construire un exemple d'animation avec une courbe générée par un point d'un cercle roulant sans glisser sur une autre cercle. Si le cercle roule à l'extérieur de l'autre (k=+1) on parle d'épicycloïde et sinon d'hypocycloïde (k=-1). La figure sera périodique si le rapport des rayons est un rationnel. Le point dessinant la courbe n'est pas nécessairement sur le cercle roulant et peut être à une distance ρ de son centre (ρ≠r). On parle alors d'épitrochoïde et d'hypotrochoïde. Ces courbes peuvent être représentées par les équations paramétriques suivantes O restart: with(plots): x:=(R,r,k,rho,t)->(R+k*r)*cos(t)k*rho*cos((R+k*r)/r*t); y:=(R,r,k,rho,t)->(R+k*r)*sin(t)rho*sin((R+k*r)/r*t); RCk r t x := R, r, k, r, t / R C k r cos t K k r cos r RCk r t y := R, r, k, r, t / R C k r sin t K r sin r Si R / r = 1, ρ=r et k = 1 on parle de cardioïde (épicycloïde). Pour R / r = 4, ρ=r et k = −1 on parle d'astroïde (hypocycloïde). O display(Array([ plot([x(1,1,1,1,theta),y(1,1,1,1,theta),theta=0..2*Pi], title="Cardioïde (Epicycloïde)"), plot([x(3,1,1,1,theta),y(3,1,1,1,theta),theta=0..2*Pi], title="Epicycloïde"), plot([x(3,1,1,1/2,theta),y(3,1,1,1/2,theta), theta=0..2*Pi], title=typeset("Epitrochoïde , ",rho < r)), plot([x(4,1,-1,1,theta),y(4,1,-1,1,theta), theta=0..2*Pi], title="Astroïde (Hypocycloïde)")] ), scaling=constrained); Cardioïde (Epicycloïde) 2 1 K3 K2 K1 K2 1 Epicycloïde Epitrochoïde , r!r 4 4 4 1 1 K4 K2 12 34 K3 K1 1 2 3 K4 Astroïde (Hypocycloïde) K3 K1 1 2 3 4 K4 La fonction seq(...,n=0..N) construit N+1 images que l'on va afficher successivement avec display(... , insequence=true). Si cette option n'était pas précisée, les N+1 images seraient affichées simultanément en un seul dessin fixe. Chacune de ces images est construite en rassembant avec une autre fonction display le cercle central fixe C, la portion d'épitrochoïde tracée, le cercle roulant et les deux flèches. Le paramètre d'animation est n*delta. 47 O R:=3: r:=2: rho:=3*r/2 : k:=1: N:=100: delta:=4*Pi/N: C:=plot(R,theta=0..4*Pi,coords=polar,color="Black"): display(seq( display(C, plot([x(R,r,k,rho,phi),y(R,r,k,rho,phi), phi=0..n*delta],color="DarkBlue"), plot([(R+k*r)*cos(n*delta)+r*cos(theta), (R+k*r)*sin(n*delta)+r*sin(theta), theta=0..2*Pi]), arrow([[<0,0>,<(R+k*r)*cos(n*delta), (R+k*r)*sin(n*delta)>], [<(R+k*r)*cos(n*delta), (R+k*r)*sin(n*delta)>, <x(R,r,k,rho,n*delta), y(R,r,k,rho,n*delta)>]],difference, color="DarkGreen",shape=arrow, width=[abs((R+k*r))/20], head_length=[abs((R+k*r))/10], thickness=2)) ,n=0..N), insequence=true,scaling=constrained,axes=none); Exercice : animer le cas R=2, r=1, ρ=r et k=−1. Le résultat est connu sous le nom de théorème de La Hire (ou mouche de la Hire ; Philippe de la Hire, 1640-1718). Retrouver analytiquement ce résultat et donner l'équation du mouvement. 15 Représentations des solutions d'équations différentielles On présente ici la fonction DEplot de la bibliothèque DEtools. Cet outil est surtout utile pour les équations qui doivent être intégrées numériquement, mais pas seulement. On peut obtenir d'autres méthodes de tracés avec dsolve(...,numeric) et odeplot de plots (voir chapitre 15, Equations différentielles). Mais il existe encore d'autres possibilités comme phaseportrait, dfieldplot, poincare, etc. On pourra aussi se reporter à l'exercice 6.3 et sa correction pour des compléments d'information. On ne donnera ici qu'un exemple avec la fonction DEplot de la bibliothèque DEtools et avec l'aide d'un grand classique. Soit l'équation différentielle du pendule pesant simple et amorti (y est l'angle de déviation par rapport à la verticale et t le temps ; l'amortissement est proportionnel à la vitesse angulaire y' ) 48 O restart: eqd:=diff(y(t),t$2)+alpha*diff(y(t),t)+omega*sin(y(t))=0: eqd; d2 d y t Ca y t C w sin y t = 0 2 dt dt La fonction dsolve exprime bien une solution formelle, mais son intérêt pratique est assez limité... O sol:=dsolve(eqd,y(t)); d sol := y t = _a &where _b _a _b _a C a _b _a C w sin _a = 0 , _a d_a = y t , _b _a = d y t , t= dt 1 _b _a d_a C _C1, y t = _a On rappelle à ceux qui s'étonneraient de ce résultat "négatif" qu'une solution exacte (du point de vue mathématique, pas physique !) n'est obtenue qu'en faisant l'approximation dite "des petits angles" qui consiste à poser sin y t x y t tant que y reste petit, autrement dit tant que le pendule ne s'éloigne pas trop de la verticale. Exercice : résoudre exactement cette équation simplifiée et en déduire la relation entre α et ω qui sépare deux régimes physiques qualitativement distincts du comportement du pendule. En donner une interprétation physique. 15.1 Représentation de la solution Une solution exacte de l'équation non simplifiée ne pouvant être explicitée, on va utiliser la fonction DEplot pour intégrer numériquement l'équation différentielle et tracer la solution. a) Les trois premiers arguments sont - L'équation différentielle pour laquelle tous les paramètres tels α ou ω doivent avoir des valeurs numériques fixées. - Le nom de la fonction solution, ici y t , est donné soit comme y(t) soit comme [y(t)] . - L'intervalle d'intégration, ici t=0..10 b) Les conditions initiales - Elles doivent aussi être complétement définies numériquement (1+(nK1) conditions où n est l'ordre de l'équation). On peut en donner plusieurs correspondant à des situations physiques initiales différentes et on les écrit sous la forme d'une liste de listes, par exemple [[y(0)=0,D(y)(0)=2],[y(2)=1/2,D(y)(2)=0]] On rappelle que D(y)(0)=2 signifie y' 0 = 2 (voir le chapitre 8, Dérivation). La fonction DEplot tracera autant de courbes que de condions (Attention cependant: voir l'option obsrange à la fin du paragraphe). Attention : si on ne donne qu'une seule condition initiale on devra quand même l'écrire sous la forme d'une liste d'une liste: [[la_condition_initiale]]. - Une condition initiale doit être définie au même temps t (par exemple y t = 0 = 0 et y' t = 0 = 2), ce qui ne signifie pas que toutes les conditions initiales doivent être données au même temps (ici t = 0 pour l'une et t = 2 pour l'autre). c) La méthode La méthode d'intégration numérique par défaut est rkf45 (méthode de Runge-Kutta-Fehlberg). Elle peut être changée avec l'option method=... O ?dsolve,numeric d) Le pas de calcul et/ou de tracé Pour comprendre les options associées, il faut distinguer le pas d'intégration et le pas du tracé des courbes. - Si L est la longueur de l'intervalle d'intégration total, sans spécification particulière le pas de calcul pour intégrer l'équation vaut |L| / 48 (ici (10−0)/48). On peut modifier ce pas avec l'option numsteps=m où m est le nombre de pas (m=48 par défaut). On peut aussi fixer le pas d'intégration avec stepsize=longueur_du_pas. 49 - Sans spécification la courbe est tracée avec 49 points. On peut modifier cette valeur avec numpoints=k, par exemple si le nombre de pas d'intégration est très grand. Le tracé de la courbe est alors surdéfini ce qui l'alourdit (suivant la nature de l'équation et la méthode choisie on peut avoir besoin d'un pas d'intégration petit sans pour autant avoir besoin de beaucoup de points de tracé). e) La couleur et l'épaisseur des tracés Elle est définie par linecolor et non color (voir l'exemple suivant pour l'option color). La fonction DEplot ne reconnaît pas les nouveaux noms de couleur tels "Black", "Red", etc. et on doit utiliser les anciens: black, red, etc. Mais on peut utiliser aussi des structures COLOR. L'épaisseur vaut 3 par défaut et se modifie avec thickness (voir les options de plot). Contrairement à linecolor, cette option ne peut prendre qu'une valeur commune à toutes les courbes (?). f) Représentation L'option scene=[t , y(t)] ou scene=[y(t) , t] permet de fixer l'orientation du dessin (surtout utile dans le second exemple). On peut également imposer l'intervalle des ordonnées avec par exemple y=-1..1. g) Animation En posant animatecurves=true il est possible d'animer l'évolution de la ou des courbe en fonction de l'évolution de la variable indépendante dans l'intervalle d'integration (ici t). Le nombre d'images (25 par défaut) peut être modifié par numframes (l'équivalent de frames dans animate de plots). On peut recevoir un message d'avertissement indiquant une correction automatique de numpoints pour l'adapter à la valeur imposée par numframes. La bibliothèque DEtools n'est pas (encore) une bibliothèque de modules et la syntaxe DEtools:-DEplot ne peut pas être utilisée. Certaines options comme labelsdirections=[horizontal,vertical], caption="...", ne sont pas reconnues ainsi que les nouveaux noms de couleur. L'option thickness n'admet qu'une valeur commune pour toutes les courbes, etc. La fonction DEplot fonctionne très bien mais une petite mise à jour semble nécessaire... O alpha:=0.5: omega:=10: DEtools[DEplot](eqd,y(t),t=0..10, [[y(0)=0,D(y)(0)=2],[y(2)=1/2,D(y)(2)=0]],y=-1..1, stepsize=0.05,linecolor=[blue,green],thickness=1, title=typeset("Pendule amorti :\n",eqd)); Pendule amorti : d y t C 0.5 y t C 10 sin y t 2 dt dt 1 d2 y(t) =0 0,5 0 2 4 K0,5 K1 50 t 6 8 10 15.2 Portrait de phase, champ de directions Il est en général très instructif, de découpler une équation du second ordre en un système (une liste ou un ensemble) de deux équations du premier ordre en posant z t = y' t (voir aussi la fonction convertsys de DEtools). O alpha:='alpha': omega:='omega': sys:={diff(y(t),t)=z(t), diff(z(t),t)+alpha*z(t)+omega*sin(y(t))=0}; d d sys := z t C a z t C w sin y t = 0, y t =z t dt dt Ceci permet de construire le "champ de direction" et le portrait de phase de l'équation en dressant une représentation paramétrique y t , z t (pour une représentation de y t, x t on utilisera DEplot3d) a) Les trois premiers arguments sont - Le système d'équations différentielles pour lesquelles tous les paramètres tels α ou ω doivent avoir des valeurs numériques fixées. Les équations peuvent être d'ordre et en nombre quelconque. - Les noms des fonctions solutions, ici x t et y t , donnés sous la forme d'une liste. - L'intervalle d'intégration, ici t=0..15 b) La représentation - Par défaut la section de plan est définie pour contenir le tracé des courbes, mais on peut fixer les intervalles sous la forme y(t)=-3..10 ,z(t)=-6..10 (ou simplement y=-3..10 , z=-6..10). Attention: voir plus loin l'option obsrange (e). - L'option scene=[X,Z] où X et Y sont les noms de deux des fonctions solutions des équations. Elle permettra de choisir de représenter X t (en abscisses) et Y t (en ordonnées) avec scene=[X(t), Y(t)] ou inversement. Ceci permet aussi de choisir les deux fonctions à représenter quand il y a plus de deux équations. - L'option linecolor fixe le couleur de courbes solution. c) Les conditions initiales : Voir l'exemple précédent. d) Le champ de directions : Il est représenté à l'aide de petites flèches et ne peut être tracé que pour un couple d'équations autonomes du premier ordre ou une équation du premier ordre. - La forme des flèches est modifiable avec l'option arrows. Si elle est absente des flèches ordinaires seront tracées, sinon les valeurs possibles sont small (défaut), smalltwo, medium, mediumfill, large, curve, comet, line et none cette dernière valeur supprimant le tracé du champ. - L'option color fixe la couleur des flèches. - L'option size fixe la taille des flèches et peut prendre la valeur magnitude ou une valeur numérique (1.0 par défaut). - L'option dirfield permet de définir la grille où doivent être tracé les flèches. Elle peut prendre 3 formes - dirfield=[n,m] répartit les flèches sur n colonnes de m lignes. - dirfield=[[x1 , y1 ] , [x2 , y2 ] , ...] permet d'imposer la position des flèches par leurs coordonnées. - dirfield=m trace m flèches aléatoirement réparties dans le plan. On notera la construction du titre (l'option caption n'est pas reconnue). Le petit cercle rouge (voir exercice suivant) a été dessiné avec le menu "Drawing" (voir Annexe A-1.4). O alpha:=0.5: omega:=10: DEtools[DEplot](sys,[y(t),z(t)],t=0..15, y=-3..10,z=-6..10, scene=[y(t),z(t)], [[y(0)=Pi/4,z(0)=0],[y(0)=-Pi/2,z(0)=9]], arrows=comet,color=black, linecolor=[green,blue],thickness=2, stepsize=0.05, 51 title=typeset("Portrait de phase du pendule amorti\n", sys[2]," , ",sys[1])); Portrait de phase du pendule amorti d d y t =z t , z t C 0.5 z t C 10 sin y t dt dt 10 =0 8 z(t) K2 6 4 2 2 K2 K4 4 6 8 10 y(t) K6 Exercice : donner l'interprétation du champ de directions et des courbes en termes physiques (et notamment la courbe en bleu). A quelle situation physique particulière correspond le point entouré d'un petit cercle rouge. En déduire ses coordonnées exactes sur le plan de phase. Exercice : constuire le système d'équations différentielles dans l'approximation des petits angles et tracer le champ de directions ainsi que les solutions associées aux mêmes conditions initiales que précédemment. Donner un interprétation de cette représentation graphique. Un champ de direction apparaît aussi pour une équation du premier ordre (autonome ou non) et permet d'identifier divers comportement des solutions. Cette équation de Riccati peut être intégrée exactement par dsolve (combinaison de fonctions d'Airy et de leurs dérivées premières), mais le comportement des solutions en fonction des conditions initiales n'est pas une évidence quand on regarde les solutions symboliques d'un premier coup d'oeil... Le champ de direction suivant, au contraire, indique clairement les différents régimes de solutions en fonction de y(0). O eqd:=diff(y(t),t)=1-t*y(t)^2: DEtools[DEplot](eqd,y(t),t=-1.8..3,y=-2..3.1, stepsize=0.05, [[y(0)=1],[y(0)=-1],[y(0)=-1.5],[y(0)=3]], linecolor=[blue,red,green,magenta],thickness=2, color=black,title=eqd); d y t = 1Kt y t dt 3 y(t) 2 2 1 K1 0 1 2 t K1 K2 52 3 e) L'option obsrange L'intégration numérique s'effectue avec un accroissement positif de la variable indépendante et si l'une des fonctions prend une valeur qui n'est plus contenue dans l'un des intervalles spécifiés, l'intégration s'arrête par défaut pour cette fonction (courbe violette, représentation en haut à gauche). Si la condition initiale est donnée en dehors du champ (y(0)=3), la courbe peut même disparaître totalement (courbe verte absente en haut à gauche). Si l'on veut que l'intégration se poursuive ou même se fasse on doit poser obsrange=false. O plots:-display(Array([ [ DEtools[DEplot](eqd,y(t),t=-2..3,stepsize=0.05, y=-1/2..2,[[y(0)=1],[y(-1.5)=0],[y(0)=3]], linecolor=[blue,magenta,green], thickness=2,color=black), DEtools[DEplot](eqd,y(t),t=-2..3,stepsize=0.05, y=-1/2..2,[[y(0)=1],[y(-1.5)=0],[y(0)=3]], obsrange=false,linecolor=[blue,magenta,green], thickness=2,color=black) ], [ DEtools[DEplot](sys,[y(t),z(t)],t=0..15, y=0..10,z=0..10, stepsize=0.05,scene=[y(t),z(t)], [[y(0)=0,z(0)=9]],arrows=comet,color=black, linecolor=blue,thickness=2), DEtools[DEplot](sys,[y(t),z(t)],t=0..15, y=0..10,z=0..10, scene=[y(t),z(t)],[[y(0)=0,z(0)=9]], arrows=comet,color=black,obsrange=false, linecolor=blue,thickness=2,stepsize=0.05)] ])); y(t) 2 2 1,5 1,5 y(t) 1 0,5 K2 z(t) 0,5 0 K1 K0,5 1 2 3 K2 t 0 K1 K0,5 10 10 8 8 6 z(t) 4 2 2 0 2 4 6 y(t) 8 10 53 1 2 3 t 6 4 0 1 0 0 2 4 6 y(t) 8 10 16 Divers 16.1 La bibliothèque plottools Elle permet de créer et manipuler des objets géométriques standard (en 2D et en 3D). Ceux-ci peuvent être associés avec display avec des objets graphiques divers tels ceux créés par plot, implicitplot, etc. Avec le menu décrit en annexe A1-2 on peut contrôler individuellement les tracés des contours des objets (mais pas de tous ? , pieslice par exemple). O restart: with(plottools): Carre:=rectangle([-1,-1],[1,1],color="SkyBlue"): plots:-display( plot(x^3-2*x,x=-1.6..1.8,color="DarkBlue"), rotate(Carre,Pi/3), translate(ellipticArc([0,0],1,1/4,3*Pi/4..2*Pi, filled=true, color="LightGreen"),1,1), circle([0,0],2,color="Red"), arc([0,0],3/2,Pi/4..Pi,color="DarkGreen"), pieslice([0,0],3/2,0..Pi/6,color="Red"), scaling=constrained,axes=none); 16.2 La bibliothèque geometry Elle permet de traiter la géométrie euclidienne dans le plan (voir l'exercice 8.1, question 8.1.2 pour quelques compléments d'information). O with(geometry): triangle(T, [point(A,1,0),point(B,4,1),point(C,2,4)]): incircle(C_ins,T): bisector(bA,A,T): bisector(bB,B,T): bisector(bC,C,T): O AreConcurrent(bA,bB,bC); true O draw([C_ins,T,bA,bB,bC],color=black); 4 3 2 1 0 1 2 3 4 On rappelle l'existence d'une page d'aide illustrée qui résume les diverses possibilités de tracés de MAPLE 12. O ?PlottingGuide 54 ANNEXE 1 - Modifications interactives des dessins Le but de cette annexe est de donner l'essentiel des éléments permettant de modifier et d'illustrer un graphique simplement par menus et/ou au clavier. On va construire un exemple à partir du dessin "brut" suivant: O restart: plot([BesselJ(0,x),sin(x)/x],x=-3*Pi..3*Pi); 1 0,8 0,6 0,4 0,2 K8 K6 K4 K2 0 2 4 K0,2 x 6 8 K0,4 Bessel J0 x Sinc x = sin x x On note la présence des légendes des coubes (voir ci-dessous, § A1-3). Important Il ne faut pas oublier que la plupart des actions que l'on réalise "à la main" peuvent être définies par des options de commandes telles scaling, color, title, etc. Ceci est extrêmement utile, voire indispensable, quand on veut automatiser ces actions. Même les écritures de formules peuvent être automatisées et les différents paragraphes de ce chapitre en donne des exemples. Lors d'une prévisualisation, d'une création d'un pdf ou une impression sur papier, les illustrations des graphiques peuvent être modifiées et même altérées. Si une de ces opérations est envisagée, il est prudent de se reporter au § 8.4.6 du Chapitre I pour pallier cette difficulté. Pour l'enregistrement dans un fichier voir § 5. ------------Les actions décrites ne peuvent être exécutées que si l'on a cliqué sur le graphique. A partir du dessin précédent on peut obtenir le graphique suivant uniquement au clavier et manipulation de menus. 55 Comparaison entre la fonction de Bessel J0 et le Sinus Cardinal Fonction de Bessel y Sinus cardinal 1 J0 x 1 2 Sinc x = CN KN J0 x dx = 1 0,5 1 p CN sin x x Sinc x dx = 1 KN x K10 K5 0 5 10 K0,5 A1-1 Taille et proportion Longueur/Largeur Quand on clique sur le dessin celui-ci s'entoure d'un cadre et un menu apparaît. Par glissement des petits "carrés" on peut modifier la taille et la proportion du dessin. En maintenant la touche "Shift" enfoncée pendant cette oération on modifie la taille en conservant la proportion. On notera le "label" x automatiquement généré par plot sur la première représentation, mais que l'on peut trouver mal placé. On reviendra sur ce détail en montrant comment le corriger (sousparagraphes consacrés aux menus "Plot" et "Drawing"). Conseils : n'aborder la finition du dessin que lorsque que la proportion Longueur/Largeur est fixée et que toutes les courbes sont tracées. Tenir compte de la remarque dans l'encadré de l'introduction de cette annexe. Si l'on doit utiliser un système d'axes orthonormés, le définir avant toute manipulation, soit avec l'item du menu qui apparaît en mode quand on clique sur le dessin, soit avec l'option de commande scaling=constrained,soit avec le menu général Plot/Scaling Constrained. A1-2 La palette Ce "bouton" fait apparaître la palette d'outils suivante L'utilisateur n'aura aucune difficulté à comprendre par une simple expérimentation les actions associées aux différents items de ces menus. On notera cependant - Le menu associé à qui permet différentes options de tracés qui sont : 56 - le tracé de toutes les courbes avec un trait continu (ou seulement la courbe sélectionnée en cliquant dessus avec l'outil ). le tracé de toutes les courbes (ou seulement la courbe sélectionnée) avec uniquement les points que plot a calculés. On remarque que l'algorithme choisit (par défaut) des points non équidistants en tenant compte des variations des courbes. La représentation en trait continu n'est qu'une interpolation de ces points par des segments de droites. et , dits respectivement "Patch" (le défaut) et "Patchnogrid", ne concernent que les représentations de figures, telles des polygones, qui seraient inclus dans le graphique (voir l'aide en ligne de plottools[polygon] ou § 16.1). En l'absence, comme ici, de tels objets ces deux options sont équivalentes à . Ce ne sont pas les seules options de tracé possibles (voir le menu A1-3) - L'icône qui permet d'obtenir par un simple clic un système d'axes orthonormés. A1-3 Le menu Plot de la barre des menus MAPLE On rapelle que ce menu n'est actif (non grisé) que si on a cliqué sur le graphique. Plutôt complet, il permet un grand nombre de manipulations que l'on explorera sans difficulté. Il apparaît également comme menu contextuel avec un "clic droit" sur le graphique. On ne citera ici que les quelques actions effectuées sur le dessin précédent. - Les légendes automatiques des courbes qui apparaissent sur le premier dessin de l'annexe sont introduites (ou supprimées) avec l'item Legend/Show Legend. Elles sont directement éditables à l'aide d'un double clic (voir ci-dessous). Elles peuvent aussi être introduites par commandes avec l'option legend=["Texte_1",...], l'association avec chaque courbe se faisant par correspondance de liste (voir les exemples A2-2.3.2 et A2-2.3.3 ou l'avant-dernier exemple du § 13.5). Une option du menu Tools/Options (Windows/Linux) ou MAPLE 12/Préférences (MacOS), onglet Display permet de rendre automatique ou non l'apparition des légendes. - Par défaut les extentions des axes sont définies par les intervalles de variations imposés (abscisses) et calculés (ordonnées). Avec Plot/Axes/Properties... on a fixé les intervalles de tracé des axes sans modifier les intervalles de calcul : ([-9.41..+9.41] et [-0.4..1] sont devenus [-10..10] et [-0.5..1.1]). - Pour enlever le "label" automatique x mal placé, on a utilisé Plot/Axes/Labels/Remove horizontal. On l'a remplacé avec l'outil d'écriture du menu "Drawing" décrit ci-après. - La courbe du Sinus cardinal originellement verte a été sélectionnée en cliquant dessus avec l'outil . Avec Plot/Color on a alors changé sa couleur en bleu (on peut de même changer le style de trait avec Plot/Line). - Avec Plot/Title/Add Title on a rajouté un titre (voir les modes d'écriture ci-après). A1-4 La palette Ce "bouton" fait apparaître la palette d'outils suivante L'usage des outils apparaîtra familier aux utilisateurs de logiciels de dessin qui y retrouveront les grands classiques de ce type de manipulations. - Chaque outil est sélectionable soit avec la souris, soit au clavier : "S" ou "s" pour "Selection Tool", "P" pour "Pencil", etc. (La mnémonique apparaît quand on pointe l'outil). Lorsqu'un outil est selectionné il prend une couleur bleue. Quand l'action de dessin associée est terminée (voir ci dessous) la "main est rendue" à l'outil "Selection" . Mais si on "double clique" sur les outils , ils se colorent en jaune et "gardent la main" quand l'action est terminée, 57 permettant d'enchaîner plusieurs actions de même nature sans être obligé de re-sélectionner l'outil. - L'outil permet de sélectionner un "objet" (texte, formule, dessin...), de le déplacer ou de contrôler la taille de sa zone d'affichage. Cliquer une fois sur l'objet (pour un figure comme un rectangle, cliquer sur son contour) pour faire apparaître les limites. Par exemple Vous pouvez alors déplacer le texte (pointer dans le rectangle et glisser) ou modifier la zone d'affichage avec la souris (pointer et glisser un des petits carrés). - L'outil de "Trait" permet de tracer des lignes polygonales qui peuvent bien sûr se réduire à un segment unique. Les clics successifs définissent le début et la fin de chaque segments, un double clic termine le dessin. Si la touche "Shift" est maintenue enfoncée les traits sont tracés comme "horizontaux", "verticaux" ou "à 45°". - L'utilisation des outils va de soi. Si la touche "Shift" est maintenue enfoncée avant de commencer on définira strictement des cercles ou des carrés. Pour un tracé déjà existant, ceci permet de préserver le rapport Longueur/Largeur lors d'une modification de taille (sélection puis glissement des "petits carrés"). - Les outils , et permettent de modifier les propriétés des rectangles et ellipses (intérieur et bordure), traits ou flèches, etc. Il est possible avec l'option "browse..." de de remplir une figure avec une image. ----------ATTENTION : le remplissage avec des images photographiques haute résolution peut s'avèrer prohibitif en terme de temps de sauvegarde et taille de fichier. ----------L'outil de permet de sélectionner une couleur n'importe où dans la fenêtre MAPLE. - Les outils permettent d'effectuer des alignement de plusieurs objets que l'on devra au préalable sélectionner avec et soit par clic et glissement entourant les objet, soit par clics successifs sur les objets, mais en maintenant la touche "Shift" enfoncée. - Le mode "Texte" . Un fois l'outil sélectionné, cliquer dans le cadre du graphique à la position voulue (sachant que l'on pourra toujours déplacer le texte ultérieurement). Un cadre "double trait grisé" apparaît, définissant la zone d'insertion. Si des "retours lignes" apparaissent inopinément on pourra tout corriger en modifiant ensuite la taille ou la forme de la zone d'affichage (voir ci-dessus). Noter que ce cadre n'est ni déplaçable ni de taille modifiable directement. Pour ce faire on reviendra à la sélection décrite précédemment après avoir terminé l'insertion du texte. L'insertion de texte peut se faire avec le mode et/ou le mode qui apparaissent dans le menu associé. Ces deux modes peuvent alterner dans une même phrase (voir l'insertion de J0 dans le titre). Pour le mode on utilisera la frappe directe au clavier ainsi que la palette située à gauche de la fenêtre MAPLE, ou d'autres palettes pour insérer des lettres grecques, des symboles, des flèches, etc. Pour écrire des "indices" ou des "puissances" en mode on pourra utiliser la syntaxe LaTeX avec un "_" ou un "^" (exemple : J02 (x) ⇒ J_0 / [flèche à droite pour quitter le mode "indice"] ^ 2 / [flèche à droite pour quitter le mode "puissance"] (x)). Pour faire de même en mode on utilisera le menu général de Maple 58 Format/Character/Subscript ou Superscript. Si l'outil est sélectionné, un double clic sur un texte permet d'accéder directement au mode "écriture" permettant la modification du texte. ----------Remarque : l'utilisation de la variable x dans la commande plot affiche automatiquement le nom de l'axe des abscisses, mais ce dernier n'est pas nécessairement bien placé. Pour le supprimer on utilisera le menu général Plot/Axes/Labels/Remove horizontal (voir ci-dessus). On pourra ensuite utiliser le mode pour écrire ce nom où l'on veut (ce que l'on a fait pour x et y sur le graphique précédent) ----------- 59 ANNEXE 2 - Tracés (et/ou traitements) de données importées "J'ai un fichier et je voudrais..." A2-1 Importation des données Avant de pouvoir traiter et tracer des données il faut les importer dans MAPLE. Cette opération effectuée par lectures de fichiers, que ce soit avec MAPLE ou un autre logiciel, est souvent une source de problèmes potentiels en raison de la variété des formats. Dans les cas les plus classiques cependant, elle ne présentera pas de difficulté. Cette opération est décrite au chapitre 20 dont on reprend quelques éléments avec deux exemples simples, l'importation d'un tableau Excel et celle d'un tableau ASCII rangé en colonnes. On peut aussi importer sans difficulté des fichiers de type Matrix Market, MATLAB, Image (jpeg, bmp et tiff), et Audio (PCM Wave et ADPCM Wave). MAPLE contient des librairies spécialisées pour le traitement des images (ImageTools) et des fichiers audio (AudioTools) et on sera bien inspiré d'en explorer les aides en ligne si besoin. On peut utiliser des lectures plus sophistiquées pour certains fichiers ASCII dont on présente quelques éléments au chapitre 20 de ce manuel. ATTENTION Lorsque l'on demande de sauvegarder la feuille de calcul après avoir importé de tels fichiers (en fait dès que l'on crée de gros tableaux ou de grosses matrices), MAPLE interroge l'utilisateur dans une fenêtre pour savoir s'il souhaite enregistrer leurs contenus. Dans la mesure ou l'on pourra relire ultérieurement ces fichiers et/ou on pourra refaire les calculs en des temps raisonnables, on ne demandera pas cette sauvegarde avec celle de la feuille de calcul. On s'expose sinon à des sauvegardes longues et des fichiers MAPLE très gros. O restart: A2-1.1 Fichiers Excel On dispose d'un fichier Excel au format .xls dont voici l'image des premières lignes (pour le format .csv, voir la dernière remarque du § A2-1.2). On peut construire la commande d'importation suivante, ExcelTools:-Import(...), avec le menu Tools/Assistants/Import Data... (ou bien directement au clavier avec un peu d'habitude). On devra sélectionner dans la fenêtre qui s'ouvre 1) Le format : Select a format => Excel 2) Le nom du fichier (et éventuellement le nom de son répertoire) : ici Helmert.xls sur le Bureau (Desktop) d'un Mac (voir chapitre 20), puis Next 3) Le fichier peut contenir plusieurs feuilles de calcul. Dans la nouvelle fenêtre on choisira celle désirée avec Sheet : ici THEO_NXYZ_1406_2007 4) Avec Named Range on sélectionne la partie de la feuille que l'on souhaite lire : C1:F2 sur le deuxième exemple donné plus bas (la syntaxe est propre à Excel ; voir l'aide en ligne ? ExcelTools/Import). Si on ne mentionne rien, tout la feuille est lue. 5) Done On notera par parenthèses que si Import existe dans la librairie ExcelTools, Export existe aussi ! Les données sont importées sous la forme d'un tableau (Array). Le Data Type du tableau 60 construit étant anything, tout ce qui n'est pas compris comme un nombre est mis sous la forme d'une chaîne de caractères. Les cellules vides des colonnes incomplètes sont remplacées par des 0. On rappelle que quand un tableau contient plus de 10 lignes et/ou 10 colonnes, l'affichage par défaut se fait de façon résumée. Un double-clic sur ce tableau symbolique permet de visualiser les éléments sans les écrire sur la feuille avec un afficheur spécialisé (voir Chapitre 4, § Affichage des grosses matrices). O ExcelTools:-Import("/Users/Jean/Desktop/Helmert.xls", "THEO_NXYZ_1406_2007"); 1..58 x 1..8 Array Data Type: anything Storage: rectangular Order: Fortran_order On donne un nom à ce tableau. On peut aussi corriger la commande précédente quand elle est construite automatiquement avec Tools... en écrivant M:=ExcelTools(...), avant de la relancer. O M:=%: Les indices d'un tableau ne commencent pas nécessairement à 1 (-2, -1, 0, 1, 2, 3 seraient par exemple des indices valables pour un tableau). C'est la raison pour laquelle ils sont données en général sous la forme d'intervalles n..m (-2..3 par exemple) O ArrayDims(M); # ou bien op(2,M); 1 ..58, 1 ..6 1 ..58, 1 ..6 Il existe plusieurs façons de récupérer le nombre de lignes et de colonnes (voir chapitre 2) O nl:=op([2,1,2],M); nl:=op(2,ArrayDims(M)[1]): nc:=op([2,2,2],M); nl := 58 nc := 6 ou, tout simplement si on n'a pas besoin d'automatiser O nl,nc:=58,6; nl, nc := 58, 6 On ne refera pas ici le chapitre 5 sur l'accès aux éléments d'un tableau... On rappelle juste la syntaxe sur deux exemples. Elle est la même que pour les matrices, sauf pour des indices négatifs. On pourra toujours transformer ce tableau en matrice avec > M:=convert(M,Matrix);. On se reportera au § A2-2 et pour des exemples de traitements et de tracés. O M[1,3]; M[1..2,nc-1]; 13.184 3.16433938 105 3.16360535 105 Remarques : - Le type des éléments du tableau est anything, c'est à dire que les éléments du tableau peuvent être de nature quelconque (entiers, réels, chaînes de caractères, etc.). - On peut sélectionner la lecture d'une partie de la feuille : ici les contenus des cellules d'un sous tableau allant de C1 à F2 (voir l'image de la feuille Excel en introduction de A2-1.1). O ExcelTools:-Import("/Users/Jean/Desktop/Helmert.xls", "THEO_NXYZ_1406_2007","C1:F2"); 61 13.184 3.05 3.16433938 105 "0 de référence" 146.95 K4.749 3.16360535 105 "Toulon piquet 3" Noublions pas que les constructions de fonctions permettent des combinaisons infinies et on peut élaborer des commandes sophistiquées. Par exemple, supposons que i et j soient des variables entières dont les valeurs sont déterminées au cours d'un calcul (dans une procédure par exemple) et que l'on veuille, sans intervenir, sélectionner et lire les éléments d'un sous tableau de la feuille Excel allant de Ci à Fj. On pourra écrire (voir la fonction cat de concaténation de caractères au chapitre 18) O i:=3: # Simulations de valeurs j:=4: # calculées ou lues ExcelTools:-Import("/Users/Jean/Desktop/Helmert.xls", "THEO_NXYZ_1406_2007",cat("C",i,":","F",j)); 151.43 K9.964 3.16236321 105 "vector_01EPOC_ref" 27.598 K9.177 3.16292396 105 "LEGI_ref_ADVP" A2-1.2 Fichiers ASCII Notes : pour les fichiers Excel enregistrés au format .csv, voir la dernière des remarques cidessous. MAPLE sait aussi importer directement les fichiers aux formats Matlab ou Matrix Market (voir ci-dessous l'option Select a format). On dispose d'un fichier de type ASCII structuré en colonnes dont les éléments sont séparés par un ou des "espaces" et dont voici les premières lignes On construit la commande suivante d'importation, ImportMatrix(...), avec le menu Tools/Assistants/Import Data... (ou bien directement au clavier avec un peu d'habitude). On devra sélectionner diverses options dans la fenêtre qui s'ouvre. 1) Les éléments de ce type de fichiers sont délimités par un séparateur qui sont ici des espaces (au moins un) : Select a format ⇒ Delimited 2) Le nom du fichier (et éventuellement le nom de son répertoire) : ici Mesures.dat sur le Bureau (Desktop) d'un Mac (voir chapitre 20), puis Next 3) La nouvelle fenêtre donne un apperçu du début du fichier et propose des options. Laisser Data Type à anything (les nombres peuvent être entiers, réels, voire même symboliques) et Source Form à Rectangular. 4) Dans le cas de ce fichier, on doit sauter les 4 premières lignes (compter la ligne vide ; 30 représente le nombre de lignes qui suivent et que l'on n'a pas besoin de lire). On posera donc Skip Lines à 4. 5) Généralement on ne demande pas la transposition du tableau (les colonnes deviendraient les lignes et réciproquement). 62 6) On sélectionne Separator qui définit la nature du séparateur entre les éléments d'une ligne : on choisira ici (Space Separated) 7) Done Remarques : il faut éviter certains pièges, du moins avec ImportMatrix (sinon voir Ch 20): - Tous les séparateurs doivent être identiques (pas d'espaces et de tabulations mélangés par exemple, ce qui n'est pas toujours immédiatement visible). Avec Word par exemple, afficher les marques avec le bouton ¶ (dit "pied de mouche") et vérifier. - La présence de chaînes de caractères dans la partie lue peut être source d'échecs (par exemple des commentaires) sans générer nécessairement de message d'erreur. - Attention aux lignes vides au milieu ou en fin de fichier ainsi qu'aux lignes ou colonnes incomplètes (sauf fichier .csv ; voir ci-dessous). On aura le message d'erreur : Error, (in ImportMatrix) end of input encountered while reading Matrix. Word peut générer tout seul de telles lignes en fin de fichier : afficher les marques avec le bouton ¶ et vérifier ou bien déplacer le pointeur et vérifier qu'il ne peut pas aller au delà de la dernière ligne. - Avec Word ou tout autre traitement de texte, prendre soin de faire un enregistrement en mode texte, c'est-à-dire sans mise en forme (pas de formats de type .doc ou .rtf). - Les fichiers Excel enregistrés au format .csv seront lus avec les options Select a format ⇒ Delimited, Data Type ⇒ anything, Separator ⇒ ; (Semicolon Separated). On prendra soin de supprimer les cellules de commentaires avant de procéder à l'enregistrement sous Excel au format .csv. Les éléments vides des lignes ou colonnes incomplètes auront la valeur NULL (voir ce concept au Chapitre 2). En cas de problèmes, se reporter aux fonctions décrites au chapitre 20. Les données sont importées sous la forme d'une matrice et non plus d'un tableau comme pour un fichier Excel. On rappelle que quand une matrice contient plus de 10 lignes et/ou 10 colonnes, l'affichage se fait par défaut de façon résumée. Un double-clic sur cette matrice symbolique permet de visualiser les éléments sans les écrire sur la feuille avec un afficheur spécialisé (voir Chapitre 4, § Affichage des grosses matrices). O restart: ImportMatrix("/Users/Jean/Desktop/Mesures.dat", source=delimited,delimiter=" ",format=rectangular, datatype=anything,transpose=false,skiplines=4); 30 x 5 Matrix Data Type: anything Storage: rectangular Order: Fortran_order On donne un nom à cette matrice. On peut aussi corriger la commande précédente après l'avoir construite automatiquement avec Tools... en écrivant M:=ImportMatrix(...), puis en la relançant. O M:=%: A2-2 Lecture, manipulations et tracés des éléments La lecture des données s'écrira en utilisant la syntaxe réservée aux matrices. Par exemple il existe plusieurs façons de récupérer le nombre de lignes et de colonnes de M (voir chapitre 4). O nl:=LinearAlgebra:-RowDimension(M); nl:=op(1,M)[1]: nl:=op([1,1],M): nc:=LinearAlgebra:-ColumnDimension(M); nc:=op([1,2],M): 63 nl := 30 nc := 5 ou, tout simplement si on n'a pas besoin d'automatiser... O nl,nc:=30,5; nl, nc := 30, 5 On ne refera pas ici le chapitre 4 sur l'accès aux éléments d'une matrice. On rappelle juste la syntaxe sur deux exemples. Le terme −1 désigne la dernière colonne (=nc), −2 l'avant dernière, etc. Ceci n'a pas la même signification avec un tableau et si on a obtenu, avec l'importation Excel par exemple, un tableau M (Array) au lieu d'une matrice (Matrix), on pourra toujours opérer une conversion avec (attention au M majuscule de Matrix) > M:=convert(M,Matrix): O M[2,3]; M[1..2,2..-1]; 2.88 0.0828 3.12 0.220 0.0866 0.144 2.88 0.441 0.406 MAPLE 12 reconnaît aussi une syntaxe par défaut "..n" signifiant des éléments de 1 à n, "m.." signifiant de l'élément m au dernier et "..", tous les éléments. O M[..2,..]; # Lignes 1 à 2 de toutes les colonnes 1 0.0828 3.12 0.220 0.0866 2 0.144 2.88 0.441 0.406 Généralement le traitement des données se fait par lignes ou colonnes entières et il est pratique de construire quelques fonctions de lecture pour simplifier la syntaxe des commandes. A2-2.1 Un seul fichier est importé On va supposer que les données sont importées dans une matrice à laquelle on a donné le nom M. Ici C(k) ou L(k) extraient respectivement la colonne et la ligne k de M. L'extraction d'une ligne ou d'une colonne d'une matrice tel qu'écrit ci-dessus produit respectivement des objets de type "Vecteur ligne" et "Vecteur colonne" (voir Chapitre 4). Ceci devrait suffire pour beaucoup de traitements, mais en raison de la restriction indiquée au § 9.1-2c, on transformera systématiquement ces objets en listes. O C:=k->convert(M[1..-1,k],list); L:=k->convert(M[k,1..-1],list); C := k/convert M1 ..K1, k, list L := k/convert Mk, 1 ..K1 , list Alors, pour extraire la ligne 2 ou les deux premiers éléments de la colonne 3 on écrira O L(2), C(3)[..2]; 2, 0.144, 2.88, 0.441, 0.406 , 3.12, 2.88 Pour tracer la colonne 3 en fonction de la colonne 2 il suffira donc d'écrire (voir § 9.1-1) O plot(C(2),C(3),style=point); 64 3 2,5 2 1,5 1 0,5 0,20,40,6 0,81,0 1,21,41,6 1,82,0 mais on a vu au § 9.1-2a/b qu'il était préférable de construire des listes entrelacées des abscisses et ordonnées. On construira donc la fonction O S:=(x,y)->zip((u,v)->[u,v],C(x),C(y)); S := x, y /zip u, v / u, v , C x , C y La commande du tracé précédent devient O plot(S(2,3),style=point); # graphique identique et effacé A2-2.2 Plusieurs fichiers sont importés Si plusieurs fichiers sont importés on assignera les données à des matrices ayant des noms différents. Pour pouvoir les distinguer il faut modifier un peu les fonctions précédentes en introduisant le nom F de la matrice en argument. O C_F:=(F,k)->convert(F[1..-1,k],list); L_F:=(F,k)->convert(F[k,1..-1],list); S_F:=(F,x,y)->zip((u,v)->[u,v],C_F(F,x),C_F(F,y)); C_F := F, k /convert F1 ..K1, k, list L_F := F, k /convert Fk, 1 ..K1 , list S_F := F, x, y /zip u, v / u, v , C_F F, x , C_F F, y O L_F(M,2); 2, 0.144, 2.88, 0.441, 0.406 O plot(S_F(M,2,3),style=point); # graphique effacé A2-2.3 Quelques exemples de traitement simples On se place dans le cas A2-2.1, les modifications pour le cas avec plusieurs importations étant évidentes. A2-2.3.1 Fonctions de traitement On peut aisément construire des outils de calcul. Ici µ(k) calcule la moyenne de la colonne k alors que Trp(x,y) calcule, par la méthode des trapèzes, l'intégrale des ordonnées de la colonne n° y sachant que les abscisses correspondantes (supposées croissantes) sont dans la colonne n° x (voir un exemple en A2-2.3.2). O mu:=i->evalf(add(C(i)[k],k=1..nl)/nl); Trp:=(x,y)->1/2*add((C(x)[i+1]C(x)[i])*(C(y)[i]+C(y)[i+1]), i=1..nl-1); 65 add C i k, k = 1 ..nl µ := i/evalf Trp := x, y / 1 add 2 C x nl iC1 KC x i C y iCC y iC1 , i = 1 ..nl K 1 O mu(2); 1.039126667 Dès lors que les données sont devenues accessibles, tout l'attirail de MAPLE est à disposition (interpolation, lissage, convolution, filtrage, transformations de Fourier rapides, ondelettes, etc). Comme indiqué dans l'introduction on noubliera pas les bibliothèques spécialisées telles ImagesTools ou AudioTools. A2-2.3.2 Lissage linéaire ou exponentiel par moindres carrés On veut lisser ces données par moindres carrés. MAPLE dispose de nombreux outils statistiques dans sa bibliothèque Statistics. Pour quelques détails sur le lissage et les outils de Statistics, on renvoie le lecteur aux corrections des exercices 6.9 et 8.1. On trouve en particulier un lissage par un modèle du type Ae lt , dit ExponentialFit et que l'on pense adapté dans ce cas. Mais on veut aussi essayer un modèle parabolique que l'on obtiendra avec LinearFit (attention : linéaire ne signifie pas nécessairement lissage par une droite ! voir l'hyperlien dans l'introduction de la correction de l'exercice 6.9). O f[e]:=Statistics:-ExponentialFit(C(2),C(3),t); f[p]:=Statistics:-LinearFit([1,t,t^2],C(2),C(3),t); fe := 3.45188578307415 eK1.28817036644000970 t fp := 3.24934648421344185 K 3.16272371236901994 t C 0.859629734717129444 t2 On peut réduire la précision des constantes si on la trouve inutile (précision due à des calculs faits automatiquement en mode evalhf). Pour la fonction fnormal voir Chapitre 1 § 7.3. O f[e]:=fnormal(f[e],4); f[p]:=fnormal(f[p],4); fe := 3.452 eK1.288 t fp := 3.249 K 3.163 t C 0.8596 t2 On compare l'intégrale par la méthode des trapèzes et l'intégrale des fonctions de lissage par les modèles exponentiel et polynomial O Int(Colonne[3],t=Colonne[2]..``) = fnormal(Trp(2,3),4); Int(f[e],t=C(2)[1]..C(2)[-1]): % = fnormal(value(%),4); Int(f[p],t=C(2)[1]..C(2)[-1]): % = fnormal(value(%),4); Colonne 2.01 Colonne3 dt = 2.212 2 3.452 eK1.288 t dt = 2.208 0.0828 2.01 3.249 K 3.163 t C 0.8596 t2 dt = 2.210 0.0828 Exercice : on calcule les estimateurs des deux écarts type. Expliquer. On aura noté que fe et fp ne sont pas des fonctions mais des expressions, d'où l'utilisation de eval... Proposer une autre écriture en transformant fe et fp en fonctions. Pourquoi utilise-t-on (nlK2) dans un cas et (nlK3) dans l'autre ? (cette dernière question ne concerne pas MAPLE mais les propriétés statistiques du lissage...). 66 O sigma[e]=sqrt(add((M[i,3]-eval(f[e],t=M[i,2]))^2, i=1..nl)/(nl-2)), sigma[p]=sqrt(add((M[i,3]-eval(f[p],t=M[i,2]))^2, i=1..nl)/(nl-3)); se = 0.03295297968, sp = 0.06377963613 On veut tracer maintenant les points de mesures et ces lissages sur une même représentation. On notera que l'on a choisi d'utiliser M[1,2] et M[-1,2] pour désigner les abscisses extrêmes qui vont servir aux calculs de f[e] et f[p] (la première et la dernière composante de la colonne 2 puisqu'elles sont supposées croissantes), mais on aurait pu aussi bien écrire par exemple t=0..3. On rappelle que f[e] et f[p] sont des expressions qui dépendent de la seule variable t (voir § 3.1 et § 9.3). On donne brièvement les définitions des options utilisées (voir § 7) : - L'option style fixe par une liste les trois modes de tracé par correspondance (la syntaxe x$n permet d'éviter une écriture répétitive et crée x,x,x,... n fois). - L'option linestyle donne la forme du tracé des courbes, mais pour établir la correspondance on doit donner trois valeurs. La première (solid) sera donc inutilisée puisque s'appliquant au style de tracé point. - On améliore la présentation des axes avec view et on leur donne des noms avec labels. On ajoute un titre avec title et typeset qui permet une combinaison de texte et d'écriture mathématique. Les options legend et legendstyle permettent d'associer automatiquement un texte à chaque tracé. Attention : la commande > plot(C(2),C(3),f[e],...) provoquerait une erreur dans plot (voir § 9.1.2a). D'où la nécessité ici de construire la fonction S (voir A2-2.2) O plot([S(2,3),f[e],f[p]],t=M[1,2]..M[-1,2], style=[point,line$2],linestyle=[solid$2,dash], labels=[t,N],color=["Black","Blue","Red"], thickness=[1,1,2],symbol=circle,symbolsize=15, title=typeset(N[e]=N[0]*exp(-lambda*t)," et ", N[P]=alpha*t^2+beta*t+N[1]), legend=["Données",N[e],N[P]], legendstyle=[location=bottom], view=[0..2.1,0..3.5]); Ne = N0 eKl t et NP = a t2 C b t C N1 3 N 2 1 0 0 0,5 1 Données 1,5 t Ne 2 NP On rappelle que le graphique peut être modifié, complété et sauvegardé par manipulation au clavier et à la souris (voir l'Annexe 1). 67 A2-2.3.3 Lissage non linéaire par moindres carrés On s'intéresse maintenant aux données des colonnes 4 (abscisses) et 5 (ordonnées). On pense qu'elles pourraient être représentées par le modèle F ci-dessous dont on cherche à déterminer les paramètres A, B, α, β, ω et φ. Un lissage par moindres carrés est dans ce cas non linéaire et se calcule par un processus itératif qui nécessite la connaissance approchée de ces paramètres (voir l'exercice 6.9). On estime (par exemple visuellement sur un tracé des données et en s'adressant à son bon sens...) ces valeurs que l'on range dans une liste d'équations (Ve) dont l'ordre est sans importance. O F:=A*(1-exp(-alpha*t))+ B*exp(-beta*t)*cos(omega*Pi*t+phi); Ve:=[A=1.2,B=0.5,alpha=1,beta=0.5,omega=1,phi=0]; F := A 1 K eKa t C B eKb t cos w p t C f Ve := A = 1.2, B = 0.5, a = 1, b = 0.5, w = 1, f = 0 Noter que F est une expression (pas une fonction) et noter comment les valeurs contenues dans Ve (liste d'égalités) sont subtituées avec subs dans F pour pouvoir effectuer son tracé (nécessité de fixer des valeurs numériques pour les paramètres de F, voir § 3.1). O plot([S(4,5),subs(Ve,F)],t=0..6,style=[point,line], symbol=solidcircle,symbolsize=10, color=["Black","Red"]); 1,4 1,2 1,0 0,8 0,6 0,4 0,2 0 1 2 3 t 4 5 6 Le tracé précédent montre que les valeurs estimées des paramètres sont très médiocres, mais on pourra peut-être s'en contenter quitte à recommencer si le processus de calcul ne converge pas. Le traitement se fait avec NonlinearFit de la librairie Statistics (voir l'exercice 6.9). Les valeurs initiales sont introduites avec l'option initialvalues. Elles peuvent aussi être données sous la forme d'une liste d'intervalles de valeurs autorisées (initialvalues=[A=a..b , B=c..d , . ..]). La fonction fnormal (voir Ch 1, § 7.3) n'est utilisée que pour réduire le nombre de chiffres significatifs des constantes. O Fnl:=fnormal(Statistics:-NonlinearFit( F,C(4),C(5),t,initialvalues=Ve),4); Fnl := 1.306 K 1.306 eK1.209 t K 0.2781 eK0.2894 t cos 2.108 p t K 1.911 Attention : une bonne concordance graphique entre le lissage et les données ou une estimation de l'écart type conforme aux erreurs de mesures n'est en aucun cas le gage d'une détermination robuste des paramètres !!! Cette remarque est inhérente au problème du lissage et sans rapport avec MAPLE. On trouvera un exemple avec l'hyperlien "SVD" 68 dans l'introduction 8.1.1-b de la correction de l'exercice 8.1. On y trouvera aussi la façon de tracer des barres d'erreur. O plot([S(4,5),Fnl],t=0..6,style=[point,line], symbol=solidcircle, symbolsize=10,color=["Black","Blue"], title="Lissage non linéaire", titlefont=[TIMES,15], legend=["Valeurs expérimentales",Fnl], legendstyle=[location=bottom], view=[0..6.5,0..1.5]); Lissage non linéaire 1,5 1 0,5 0 0 1 2 3 4 5 6 t Valeurs expérimentales K1.209 t 1.306 K 1.306 e K0.2894 t K 0.2781 e cos 2.108 p t K 1.911 On rappelle une fois encore que le graphique peut être modifié, complété et sauvegardé par manipulation au clavier et à la souris (voir l'Annexe 1). 69 70