UE Transversale 1XM02 Mathematica — 2014 UPMC—L1 MIPI TP no 2 : Éléments de langage Mathematica Table des matières 1 Préparations pour ce TP 1.1 Deux types d’exercices . . . . . 1.2 Séparer deux notebooks . . . . 1.3 Raccourcis clavier . . . . . . . . 1.4 Exemples de code Mathematica . . . . 2 2 2 2 2 2 Langage naturel et Step-by-step 2.1 Langage naturel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Step-by-step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 Définition et utilisation de 3.1 Introduction . . . . . . . 3.2 = ou := . . . . . . . . . 3.3 == . . . . . . . . . . . . 3.4 Substitution avec règles . 3.4.1 ReplaceRepeated 3.5 Expressions . . . . . . . . . . . . . 4 4 5 6 6 7 7 . . . . 7 7 9 9 9 . . . . . . . . variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ou . . . . . . . . . . . . 4 Définition et utilisation de fonctions 4.1 Introduction . . . . . . . . . . . . . . 4.2 = ou := . . . . . . . . . . . . . . . . 4.3 Notation fonctionnelle, Postfix, Prefix 4.4 Fonctions anonymes ou pures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d’expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . et Infix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . en . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Listes 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . 5.2 Adressage d’un élément d’une liste . . . . . . . . . 5.3 Fonctions qui génèrent des listes . . . . . . . . . . . 5.4 Appliquer une fonction à chaque élément d’une liste 5.5 Sélectionner dans une liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 10 11 11 12 6 Plot 6.1 Introduction . . . . . . . 6.2 Plot . . . . . . . . . . . 6.2.1 Introduction . . . 6.2.2 Options de Plot . 6.2.3 Utiliser Plot pour 6.3 Manipulate . . . . . . . 6.4 ListPlot . . . . . . . . . 6.5 ParametricPlot . . . . . 6.6 ContourPlot . . . . . . . 6.7 RegionPlot . . . . . . . . 6.8 PolarPlot . . . . . . . . . . . . . . . . . . . . . . . . . . . . équation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 12 13 13 13 14 14 14 15 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . estimer les solutions d’une . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . 1 Préparations pour ce TP 1.1 Deux types d’exercices Ce TP comporte deux types d’exercices : 1. Exercices numérotés : A rendre à la fin de la séance en tant que compte rendu. 2. Exercices non numérotés : A garder pour vous-même, mais pas à rendre avec le compte rendu, car il s’y agit uniquement de copier&coller les exemples de l’énoncé pour voir les résultats dans Mathematica. Pour bien séparer les deux types d’exercices, il faut de créer (Ctrl+N, puis Ctrl+S) deux notebooks différents, un pour chaque type d’exercice. Le notebook qui répond aux exercices numérotés doit être envoyé via email à l’enseignant à la fin de la séance. Ce sera le compte rendu de la séance. 1.2 Séparer deux notebooks Par défaut, les expressions (variables, fonctions, ...) définies dans un notebook sont aussi connues dans un autre notebook. Pour bien séparer deux notebooks on peut changer cette option avec le Options Inspector : 1. Ouvrir le Options Inspector via (Ctrl + Maj + O) ou sous Mac OS X : (Cmd + Maj + O) 2. Dans le Options Inspector choisir tout en haut dans la liste nommée Show option values, choisir Global Preferences 3. Chercher CellContext dans la case Lookup en dessous 4. Changer la valeur de CellContext en cliquant sur la flèche à droite de la valeur de CellContext, puis choisir Notebook à la place de “Global”. 5. Pour finir appuyer sur le button Apply, puis fermer le Options Inspector. 1.3 Raccourcis clavier A part ces préparatifs, n’oubliez pas le feuille avec les raccourcis clavier et essayez d’utiliser la souris le moins possible. Un raccourci clavier qui n’est pas encore dans la liste et qui est utile quand on a plusieurs fenêtres dans une même application (comme Mathematica) est Ctrl+F6 (sous Mac OS X : ? ?). Ce raccourci clavier change de fenêtre à l’intérieur d’une application. Pour fermer une fenêtre à partir du clavier : Ctrl+F4. 1.4 Exemples de code Mathematica Tous les exemples de code Mathematica montrés dans l’énoncé ne contiennent que des cellules de type Input. C’est pour cela que c’est indispensable de tester ces exemples soi-même avec Mathematica. Chaque ligne d’un exemple est une nouvelle cellule de type Input et doit être évaluée dans l’ordre. Les exemples peuvent être copié&collé (Ctrl+C puis Ctrl+V) dans Mathematica depuis la version PDF de l’énoncé présent, mais attention de séparer la commande Quit dans une cellule à part. 2 2 2.1 Langage naturel et Step-by-step Langage naturel Depuis l’introduction de Wolfram Alpha (www.wolframalpha.com), Mathematica peut aussi être utilisé en langage naturel, c’est-à-dire des instructions écrites avec des phrases en anglais. Voir la feuille raccourcis clavier pour des exemples. Si on ne se rappelle plus de la syntaxe d’une fonction en Mathematica, on peut soit chercher dans l’aide (F1), soit essayer de décrire ce qu’on veut faire en anglais après un signe = (voir raccourcis clavier) depuis Mathematica. Avec un peu de chance Wolfram Alpha comprend votre demande et ne donne non seulement la solution, mais aussi la traduction de votre demande en syntaxe Mathematica. 2.2 Step-by-step Wolfram Alpha Pro (la version payante de Wolfram Alpha) a introduit une nouvelle fonctionnalité : le step-by-step : http ://www.wolframalpha.com/pro/step-by-step-math-solver.html Le step-by-step permet d’obtenir une déduction mathématique avec toutes les étapes intermédiaires de presque n’importe quel problème, comme par exemple : . Résolution d’un système d’équations . Calcul d’une dérivée ou d’une primitive . Transformations algébriques et trigonométriques (moins évident, à tester) Ceci est une petite révolution, car Mathematica ne permettait jusqu’ici que d’avoir le résultat final, sans donner automatiquement les étapes intermédiaires. Grâce à l’intégration de Wolfram Alpha dans Mathematica, on peut avoir ces étapes intermédiaires directement dans un notebook et ceci sans payer un abonnement pour la version Pro de Wolfram Alpha ! Pour cela on peut faire appel à la fonction WolframAlpha avec une petite fonction ShowSteps qui filtre les résultats step-by-step : ShowSteps[exp_] := WolframAlpha[ToString@HoldForm@InputForm@exp, TimeConstraint -> Infinity, IncludePods -> {"Input", "Indefinite Integral", "Root", "Result"}, PodStates -> {"Step-by-step solution", "Show all steps"}] SetAttributes[ShowSteps, HoldAll] Ceci est une version améliorée de la fonction ShowSteps trouvée ici : http ://mathematica.stackexchange.com/questions/148/get-a-step-by-step-evaluationin-mathematica Sans rentrer dans les détails de cette fonction, il suffit de soit copier&coller cette fonction dans son notebook puis l’évaluer avec Maj+Entrée, soit l’importer avec : << showsteps.m Le fichier showsteps.m est sur SAKAI, il suffit de le copier dans le dossier où se trouve le notebook actuel (choisir le dossier lors de la première sauvegarde avec Ctrl+S). 1. On peut vérifier, si la fonction ShowSteps est bien définie avec la commande ?ShowSteps, puis en la testant avec par exemple : D[Sin[x^2], x] // ShowSteps 3 3 3.1 Définition et utilisation de variables ou d’expressions en général Introduction En Mathematica le nom d’une variable doit respecter à peu près les mêmes règles que dans d’autres langages de programmation, comme ne pas commencer avec un chiffre (ex : 2x) et ne pas contenir des caractères spéciaux (ex : %, #, {, [) ni des accents. Un nom de variable ne peut pas contenir des espaces. En Mathematica il ne peut non plus contenir des underscores (tiret bas) (ex : x_point), car ce symbole est réservé. Toutes les expressions (variables, fonctions, ...) qu’on définit soi-même doivent commencer avec une minuscule pour éviter une confusion avec les expressions déjà définies de Mathematica, qui commencent toutes avec un majuscule, par contre on peut mettre des majuscules ailleurs qu’au début (ex : xPoint). Mais attention ’xPoint’ est différent de ’xpoint’. Le signe = permet d’affecter une valeur à une variable. Tester ces exemples et observer le changement de couleur des variables. Qu’est-ce qu’indique la couleur noir ? et la couleur bleue ? x=3 y=4 x^2 + y^2 Sqrt[x^2 + y^2] Ouvrir un nouveau notebook (Ctrl+N) et tester si les préparatifs du TP fonctionnent bien, c’est-à-dire les variables x et y ne devrait pas être connues dans le nouveau notebook. On peut tester cela tout simplement en évaluant le nom de la variable : x y Si l’évaluation de ces deux inputs renvoie le nom de chaque variable, alors les préparatifs du TP ont bien été pris en compte, car ces deux variables sont alors encore non-définies dans le nouveau notebook. Si jamais on obtient une valeur, il faut refaire les préparatifs du TP décrits en haut. Pour ne pas devoir ouvrir un nouveau notebook avec chaque nouveau exemple, il est fortement conseillé de commencer tout nouveau exemple avec la commande Quit. La commande Quit permet de redémarrer le Kernel et donc d’effacer toute la mémoire sur les variables déjà définies dans tous les notebooks. Si on ne veut pas que le résultat de l’évaluation d’une cellule Input soit affiché ou encore si on veut mettre plusieurs instructions sur une même ligne, on utilise le point-virgule. Tester ceci : Quit x x=3; y=4; x y L’ordre des évaluations des cellules est très important. L’ordre est indiqué par les numéros après In et Out. Essayer cet exemple : 4 Quit x^2 + y^2 x=3; y=4; Dans cet exemple, la cellule x^2 + y^2 doit être évaluée en dernier, autant la placer en dessous des autres cellules. D’une manière générale il est préférable de placer les cellules dans l’ordre de l’évaluation, au moins après avoir terminé les essais et erreurs dans un notebook. 3.2 = ou := En plus du signe = pour l’affectation immédiate, il existe aussi le signe :=. Tester ces deux exemples pour comprendre la différence entre = et := (attention à bien respecter l’ordre des évaluations d’en haut en bas, ligne par ligne) : Quit x=5; y=x+2; y x=10 y ?y Changer le y=x+2 en y:=x+2 donne un autre comportement : Quit x=5; y:=x+2; y x=10 y ?y Qu’est-ce qui a changé ? On voit bien ici que le signe = affecte la valeur de x+2 à y, tandis que le signe := définie la règle comment on obtient y avec n’importe quelle valeur de x. Les deux opérateurs, = et :=, ont une direction : du côté droit vers le côté gauche (left hand side (lhs) et right hand side (rhs) en anglais), par exemple on ne peut pas écrire 5=x. La différence entre = et := est à quel moment donné rhs est évalué : . lhs = rhs rhs est évalué immédiatement et le résultat est copié à lhs . lhs := rhs rhs est évalué à chaque fois que lhs est utilisé Comme dans le premier exemple la valeur de x est déjà connue au moment de l’affectation y=x+2, le rhs x+2 est évalué et donne 7. C’est cette valeur qui sera copié sur y et non x+2. Le fait de changer x après coup ne change rien à y qui est toujours égale à 7. La commande ?y à la fin donne plus d’information sur la définition de y. Si on veut que y dépende de x tout le temps, on peut utiliser le signe :=. Mais il est possible aussi d’avoir cette dépendance avec le signe =, comme montré dans cet exemple : Quit y=x+2 x=5 y x=10 y ?y 5 On voit ici que y est égale à x+2 et non à une valeur, car au moment de l’affectation x n’a pas encore de valeur, donc l’évaluation de x+2 donne x+2. Du coup à chaque fois que la valeur de x change, on obtient une autre valeur pour y. Un autre exemple qui illustre la différence entre = et :=. Pour savoir ce que fait la fonction Random[], placer le curseur sur Random[] puis appuyer sur F1. Quit x=Random[] x x x:=Random[] x x x Ces exemples ont seulement un but pédagogique ici. S’il y a une dépendance entre deux variables, il est préférable d’indiquer la dépendance d’une variable sur une autre en écrivant une fonction (voir en bas). 3.3 == Comme le signe = est déjà utilisé pour l’affection, on teste avec un double signe égal == l’égalité entre deux expressions. Par exemple : Quit x=3 x==6 x==3 Le résultat du teste d’égalité est donné en valeur booléenne, soit True (Vrai), soit False (Faux). 3.4 Substitution avec règles Au lieu de définir des variables globalement pour tout le notebook on peut aussi remplacer localement une variable par une valeur sans jamais faire une affectation du type x=2. Ce remplacement est effectué avec une règle qui s’écrit : x -> 2. Il suffit d’appliquer cette règle à l’expression souhaité avec l’opérateur /. (qui correspond à la fonction ReplaceAll) : Quit x + y /. x -> 2 x Comme on voit dans cet exemple, x est remplacé dans l’expression x + y par la valeur 2, sans affecter réellement une valeur à x. Si on veut remplacer plusieurs variables à la fois, on utilise une liste de règles : Quit x + y /. {x -> a, y -> b} 6 La fonction Solve permet de résoudre des équations et fournit les solutions sous forme d’une liste de règles. Pour convertir cette liste de règles en liste de valeurs, il suffit de l’appliquer à la variable des règles, ici à x : Quit solutions = Solve[x^3 - 2*x + 1 == 0] x /. solutions 3.4.1 ReplaceRepeated L’opérateur /. ou la fonction correspondante ReplaceAll applique les règles qu’une seule fois à l’expression. Ceci peut être observé avec cet exemple, car il reste un y après l’application des règles : Quit x + 2*y /. {x -> y, y -> a} Si on veut que les règles soient appliquées plusieurs fois, jusqu’à ce qu’aucun remplacement n’est plus possible, on utilise la fonction ReplaceRepeated ou encore l’opérateur //. Essayer l’opérateur //. sur l’exemple au dessus pour voir l’effet. ReplaceRepeated permet aussi de limiter le nombre d’itérations de remplacement, ce qui peut être pratique pour construire certains types de fonctions, comme par exemple : ReplaceRepeated[1/(1+x), x -> 1/(1+x), MaxIterations -> 4] On peut ajouter la fonction Quiet pour éviter l’affichage de messages : Quiet[ReplaceRepeated[1/(1+x), x -> 1/(1+x), MaxIterations -> 4]] 3.5 Expressions Tout objet en Mathematica (valeur, formule, graphique, ...) peut être mis en mémoire dans une variable en utilisant l’affectation = 3 2 −x−2 Exemple : fraction= xx3 +2x +x2 −4x−4 Si on veut évaluer cette fraction pour une valeur de x donnée (par exemple 4), on peut appliquer la règle x -> 4 à la variable fraction : Quit fraction = (x^3 + 2*x^2 - x - 2) / (x^3 + x^2 - 4*x - 4) fraction /. x -> 4 4 4.1 Définition et utilisation de fonctions Introduction On avait utilisé en haut l’exemple y:=x+2, qui définit une dépendance de y par rapport à x. Pour indiquer une dépendance clairement, on utilise plutôt des fonctions avec des arguments. Pour cet exemple on écrit : Quit f[x_] := x+2 7 On remarque le même signe := pour la définition, c’est-à-dire la fonction est seulement définie à ce moment sans être évaluée pour une valeur donnée. C’est pour cela qu’on n’obtient pas de cellule Out ici. Pour l’évaluer, on fait appel à la fonction en lui donnant une valeur pour x_ : f[2] Dans la définition de la fonction, il faut faire attention à quatre particularités de syntaxe : 1. Utiliser := de préférence. Même si = peut fonctionner aussi, il y a des cas où uniquement := est adapté. Voir section 4.2 pour plus de détail. 2. La séquence des arguments est entourée avec des crochets [ ] 3. Chaque nom d’argument doit être terminé avec un tiret bas x_ dans la séquence des arguments. Ce tiret bas indique que l’argument peut prendre n’importe quel nom d’objet et n’importe quel type d’objet. Mathematica indique avec la couleur verte qu’il s’agit d’un argument d’une fonction. On dit aussi que c’est une variable muette. 4. Le nom de la fonction doit être conforme aux mêmes règles que pour les variables (voir en haut), notamment commencer avec une lettre minuscule pour éviter des confusions avec les fonctions intégrées dans Mathematica. Voici un exemple d’une fonction avec deux arguments : Quit f[x_, y_] := Sqrt[x^2 + y^2] f[1, 1] Il est très simple en Mathematica de faire des fonctions composées : Quit f[x_] := x^2 + 2 g[x_] := Sin[x] + Cos[x] f[f[x]] f[g[x]] g[f[x]] 2. Définir f (x) = √ 1 + x dans Mathematica et montrer que : r f (f (f (x))) = 3. 1+ q 1+ √ 1+x En utilisant la fonction Simplify[] et une fonction composée, montrer avec Mathematica que 3 + 2x 1 = 1 5 + 3x 1 + 1+ 1 1 1+ 1+x 8 4.2 = ou := Comme avec les variables, on peut définir une fonction soit avec =, soit avec := Pour les variables on avait déjà vu que : . lhs = rhs rhs est évalué immédiatement et le résultat est copié à lhs . lhs := rhs rhs est évalué à chaque fois que lhs est utilisé Pour bien choisir entre les deux, voici quelques règles générales pour les fonctions : . Choisir lhs = rhs si lhs est la “valeur finale” de rhs (exemple : f[x_]=1-x^2) . Choisir lhs := rhs si rhs donne une “commande” ou un “programme” à exécuter à chaque fois qu’on demande la valeur de lhs (exemple : f[x_]:=Expand[1-x^2]) . Choisir lhs := rhs si f[x] ne peut pas être évalué tant que x n’a pas une valeur particulière, comme pour les fonctions récursives ou les fonctions définies par morceau. . Choisir lhs := rhs si lhs = rhs donne des messages d’erreur. . Choisir lhs := rhs en cas de doute. Voici un exemple pour illustrer la différence entre = et := Quit ex[x_]:=Expand[(1+x)^2] ?ex iex[x_]=Expand[(1+x)^2] ?iex ex[y+2] iex[y+2] Plus d’information sur le sujet dans l’aide de Mathematica sous : tutorial/ImmediateAndDelayedDefinitions 4.3 Notation fonctionnelle, Postfix, Prefix et Infix On peut appeler/utiliser une fonction avec quatre notations différentes : f[x] notation fonctionnelle standard f@x notation Prefix x//f notation Postfix x~f~y notation Infix Exemples : Quit f@x+y f@(x+y) x+y//f (x+y)//f 4/6//N {a,b,c}~Join~{d,e} 4.4 Fonctions anonymes ou pures Il peut être parfois utile de définir une fonction uniquement localement dans une expression. Ceci est possible en Mathematica avec les fonctions anonymes ou pures. Ces fonctions n’ont pas de nom, mais on définit uniquement le corps de la fonction. La syntaxe est un peu particulière. Par exemple la fonction pure équivalent à f (x) = x2 + 4 s’écrit : 9 (#^2 + 4)& L’argument de la fonction pure est noté # et la fin de la définition de la fonction pure est marquée avec &. Pour une meilleure lecture, il est préférable d’entourer une fonction pure avec des parenthèses. On peut appliquer cette fonction à n’importe quelle donnée en utilisant les crochets après le signe & : (#^2 + 4)&[3] 4. Réécrire ces fonctions pures en fonction classique avec nom et crochets : PrimeQ[#! + 1] &@4 18//2^#+#& Si on a plus qu’un seul argument dans √ une fonction pure, on adresse ces arguments avec #1, #2, ..., exemple pour f (x, y) = x2 + y 2 : Sqrt[#1^2 + #2^2]&[3,4] 5 Listes 5.1 Introduction Une liste en Mathematica est une collection ordonnée d’objets. Les objets dans une liste peuvent être de n’importe quel type et n’ont pas besoin d’être du même type, comme c’est souvent le cas dans d’autres langages de programmation. Un exemple d’une liste (accolades sur le clavier : AltGr + 4 ou AltGr + +) : {4/6, x^2+2, bonjour, 1.01} La syntaxe est la même que pour un ensemble mathématique, mais les listes se distinguent des ensembles par deux différences majeures : 1. L’ordre des éléments d’une liste est important, tester par exemple : {1, 2} == {2, 1} 2. Le même objet peut être contenu plusieurs fois dans une liste, tester par exemple : {1, 2, 1} == {1, 2} 5.2 Adressage d’un élément d’une liste Pour accéder à un élément d’une liste on ne peut pas utiliser les simples crochets, comme dans le langage C, car ils sont déjà réservés pour la séquence des arguments d’une fonction. Mais la syntaxe est très similaire : on utilise des doubles crochets. 5. Tester ces exemples et répondre aux questions suivantes : a) Quel est le premier indice d’une liste ? b) Qu’est-ce que signifie un indice négatif ? c) Comment est-ce qu’on accède à un élément d’une liste qui est elle-même dans une liste ? d) Comment est-ce qu’on obtient d’une liste plusieurs éléments à la fois ? 10 Quit liste = {4/6, x^2+2, bonjour, {a, b, c}, 1.01} liste[[1]] liste[[5]] liste[[-1]] liste[[4,1]] liste[[4,2]] liste[[{-2,2}]] liste[[4,{2,3}]] Pour plus d’informations sur les listes, entrer ceci dans la barre de recherche de l’aide de Mathematica : tutorial/ListsOverview 5.3 Fonctions qui génèrent des listes Regarder l’aide de Mathematica (F1) sur la fonction Range pour comprendre ces exemples : Range[10] Range[3, 11] Range[2, 17, 4] Une fonction très utilisée pour générer une liste est la fonction Table, elle prend deux arguments : 1. Une fonction 2. Une recette similaire à la fonction Range pour générer une suite d’arguments pour la fonction donnée en premier argument Exemples : Quit Table[2*n+1, {n, 1, 13}] Table[x^i + y^i, {i, 2, 17, 4}] 6. La fonction Fibonacci[i] donne le i-ème nombre de Fibonacci. Générer une liste avec les 30 premier nombres de Fibonacci en utilisant la fonction Table et Fibonacci. 5.4 Appliquer une fonction à chaque élément d’une liste On peut vouloir appliquer une fonction f à chaque élément d’une liste {a,b,c} pour obtenir ceci : {f[a],f[b],f[c]}. La plupart des fonctions Mathematica sont listable, c’est-à-dire on peut appliquer la fonction directement sur une liste, comme par exemple : Sqrt[{a,b,c}]. Toutes les fonctions arithmétiques sont listable : 1 + 3 * {a, 1 / 7. {a, b, c} {a, b, c} b, c} ^ 3 {a, b, c} En utilisant les fonctions Table et Sqrt, démontrer que n(n + 1)(n + 2)(n + 3) + 1 est toujours un nombre carré pour n entier et positif. On peut se limiter ici pour 1 ≤ n ≤ 10. Pas toutes les fonctions sont listable, mais on peut toujours appliquer la fonction à chacun des éléments d’une liste avec la fonction Map : 11 Quit f[{a, b, c}] Map[f, {a, b, c}] f /@ {a, b, c} Comme l’exemple montre, on peut écrire Map avec une notation Infix raccourcie : /@ 5.5 Sélectionner dans une liste On utilise ici la fonction Select pour sélectionner des éléments d’une liste qui satisfont certains critères. La fonction Select[list,f] retourne tous les éléments xi d’une liste pour lesquelles f[xi ] donne True. f doit alors être une fonction booléenne, qui retourne soit True, soit False. Exemples : Quit Select[{1,2,3,4,5,6}, EvenQ] Select[{1,2,3,4,5,6}, (# > 2)&] On voit dans le deuxième exemple l’intérêt des fonctions pures (voir en haut) : définir une fonction localement pour un usage unique. 8. En utilisant les fonctions Select, PrimeQ, Length, Table essayer de résoudre le problème suivant : Combien de nombres de la forme 3n5 + 11 sont des nombres premiers pour a) 1 ≤ n ≤ 20 b) 1 ≤ n ≤ 2000 9. En utilisant une fonction pure et les fonctions Select, PrimeQ, Range essayer de répondre à la question suivante : Pour quels n entre 1 et 1000 la formule 2n + 1 produit un nombre premier ? 6 Plot 6.1 Introduction On introduit ici quelques fonctions de base pour tracer des graphes avec Mathematica. On se limite dans ce TP au cas 2D, sachant que la plupart des fonctions traitées ont leur équivalent en 3D en Mathematica. Voici un tableau qui regroupe différents types de fonctions ou questions et les fonctions “Plot” adapté : Fonction/Question Exemple Commande f (x) sin (x) /x Plot x = f (t), y = g(t) x = sin(3t), y = cos(4t) ParametricPlot f (x, y) = 0 x4 − (x2 − y 2 ) = 0 ContourPlot 4 2 f (x, y) ≥ 0 x + (x − 2y ) > 0 RegionPlot r = f (θ) r = 3 cos(5θ) PolarPlot 6.2 6.2.1 Plot Introduction Quand on cherche l’aide (F1) sur Plot, on obtient la séquence des ses arguments : Plot[f, {x, xmin , xmax }] Plot[{f1 , f2 , ...}, {x, xmin , xmax }] 12 1. En premier argument une fonction f ou plusieurs fonctions dans une liste 2. En deuxième argument il faut lui donner l’intervalle en x Essayer ces exemples : Quit Plot[Sin[x], {x, 0, 2*Pi}] Plot[Tan[x], {x, -3, 3}] Plot[Tan[x], {x, -3, 3}, Exclusions -> Cos[x] == 0] Plot[Tan[x], {x, -3, 3}, Exclusions -> Automatic] Plot[Tan[x], {x, -3, 3}, Exclusions -> None] Plot[{Sin[x], Sin[2*x]}, {x, 0, 2*Pi}] 6.2.2 Options de Plot En plus des deux arguments montrés en haut, on peut changer des options dans Plot avec une séquence de règles : Plot[f, {x, xmin , xmax }, option1->value, option2->value, ...] Regarder le tutoriel de Mathematica sur le sujet en ouvrant le documentation center (F1) puis dans la barre de recherche : tutorial/Options 10. Qu’est-ce que fait l’option Exclusions dans l’exemple en haut ? Tracer f (x) = 1/ sin(x) sans les discontinuités. Ajouter l’option ExclusionsStyle -> Dotted 11. (a) Sur le plot de la question précédente, ajouter des labels sur les axes. (b) Refaire un deuxième plot, mais avec un cadre (Frame) et une grille (Grid). Ici, il faut changer l’option AxesLabel en FrameLabel. (c) Ajouter AspectRatio -> 1. 6.2.3 Utiliser Plot pour estimer les solutions d’une équation 12. Montrer avec Plot qu’il y a 11 solutions à l’équation 2 cos2 (2 ∗ x) − sin(x/2) = 1 dans l’intervalle [0, 3π]. Adapter l’intervalle si nécessaire. 13. Chercher les solutions de cosh (πx) cos (πx) = −1. Tester différents intervalles pour x et utiliser après l’option PlotRange pour adapter l’intervalle des valeurs en y. 6.3 Manipulate Manipulate permet de créer des graphiques ou interfaces interactives. Sa syntaxe est très similaire à la fonction Table, tester ces deux commandes : Table[n, {n, 1, 20}] Manipulate[n, {n, 1, 20}] Comme avec Table on peut mettre n’importe quel fonction en premier argument, comme par exemple Plot : Manipulate[Plot[Sin[n*x], {x, 0, 2*Pi}], {n, 1, 20}] On peut aussi créer un Manipulate avec plusieurs paramètres à changer : Manipulate[Plot[Sin[n1*x] + Sin[n2*x], {x, 0, 2*Pi}, PlotRange -> 2], {n1, 1, 20}, {n2, 1, 20}] 14. Étudier le comportement du graphe de sin(x) − cos(nx) entre 0 et π quand n change entre 1 à 100. 13 6.4 ListPlot Quand on veut tracer des données numériques et non une fonction analytique, on peut utiliser ListPlot ou ListLinePlot : t = Table[i^2, {i,10}] ListPlot[t] ListLinePlot[t] ListPlot[{t, 2*t}] Si on a une liste de points (x,y), on peut utiliser ListPlot sans modification : t = Table[{i^2, i^3}, {i, 10}] ListPlot[t] On peut utiliser ListPlot pour illustrer la différence entre = et := x=Random[]; ListPlot[Table[x,{200}]] y:=Random[] ListPlot[Table[y,{200}]] 6.5 ParametricPlot Plot trace y en fonction x. Dans un graphe paramétrique chaque point (x,y) dépend d’un paramètre t par exemple. En regardant sur tutorial/ParametricPlots on obtient la syntaxe de ParametricPlot : ParametricPlot[{fx , fy }, {t, tmin , tmax }] Tester un exemple avec x = sin(t), y = sin(2t) : ParametricPlot[{Sin[t], Sin[2*t]}, {t, 0, 2*Pi}] Dessiner la courbe du “papillon” , découvert par Temple H. Fay : x[t_] := Sin[t] (E^Cos[t] - 2 Cos[4*t] - Sin[t/12]^5) y[t_] := Cos[t] (E^Cos[t] - 2 Cos[4*t] - Sin[t/12]^5) ParametricPlot[{x[t], y[t]}, {t, -50, 50}] 6.6 ContourPlot Pour trouver tous les points (x,y) qui satisfont l’équation x4 − (x2 − y 2 ) = 0 on peut utiliser ContourPlot : ContourPlot[x^4 - (x^2 - y^2) == 0, {x, -1, 1}, {y, -1, 1}] ContourPlot ou DensityPlot sont utilisées surtout pour afficher des données 3D sur un plan 2D, comme les lignes de hauteur sur une carte. Essayer ces exemples sur la fonction f (x, y) = sin(x) sin(y) : ContourPlot[Sin[x]*Sin[y], {x, -2, 2}, {y, -2, ColorFunction -> ColorData["Rainbow"], Plot3D[Sin[x]*Sin[y], {x, -2, 2}, {y, -2, 2}, ColorFunction -> ColorData["Rainbow"], DensityPlot[Sin[x]*Sin[y], {x, -2, 2}, {y, -2, ColorFunction -> ColorData["Rainbow"], 14 2}, PlotLegends -> Automatic] PlotLegends -> Automatic] 2}, PlotLegends -> Automatic] 6.7 RegionPlot Pour marquer la région sur le plan 2D où les points (x,y) satisfont une inégalité, comme x + (x − 2y 2 ) > 0, on peut utiliser RegionPlot : 4 RegionPlot[x^4 + (x - 2*y^2) >= 0, {x, -2, 2}, {y, -2, 2}] Ou encore : RegionPlot[x^2 + y^2 < 1, {x, -1, 1}, {y, -1, 1}, Mesh -> 10, MeshShading -> {{Automatic, None}, {None, Automatic}}, ColorFunction -> "DarkRainbow"] 6.8 PolarPlot Pour faire des graphes en coordonnées polaires, il existe la fonction PolarPlot. Exemple appliqué à r = 3 cos(6θ) : PolarPlot[3*Cos[6*t], {t, 0, 2*Pi}] 15
© Copyright 2024 ExpyDoc