École des Mines de Nancy Denis Villemonais, [email protected] Année 2015-2016 FI-MGP 1A – Mathématiques Initiation à Matlab II 1 Expressions symboliques Nous avons appris à définir et manipuler des fonctions symboliques à l’aide de matlab. Nous avons notamment vu comment calculer des dérivées, des intégrales et résoudre des équations différentielles. Nous allons voir à présent comment faire du calcul symbolique sur les matrices. Activité 1. Travailler avec des expressions symboliques. Matlab peut, à condition de le lui demander, effectuer des calculs explicites, comme le calcul de déterminant et d’inverse par exemple. Code : >> >> >> >> >> >> >> A=[1/2, 2;1/3,4] B=sym(A) det(A) det(B) A^(-1) B^(-1) B(2,1)=1/4 Commentaires : — A est une matrice numérique, — B est une matrice symbolique obtenue à partir de A, — Matlab effectuera les calculs de manière numérique sur A et de manière symbolique sur B , — Il est possible de modifier les coordonnées de B une à une. One peut également exploiter le calcul symbolique pour effectuer des calculs trigonométriques. Code : >> p=sym(pi) >> sin(p/3) >> exp(i*2*p/3) Commentaires : — On commence ici par définir la variable p comme la version symbolique de π. Remarque 1. Matlab possède des fonctions de calcul formel très avancées, dont l’étendue dépasse le cadre de ce cours. Vous pouvez rechercher de la documentation dans l’aide ou en ligne à ce sujet. Remarquez que vous trouverez parfois la mention ’Use only in the MuPAD Notebook Interface’, sachez alors que l’outil MuPAD Notebook est accessible via l’onglet APPS en haut de la fenêtre Matlab. Activité 2. Passer d’une expression symbolique à une expression numérique. Nous avons appris à définir et manipuler des expressions symboliques à l’aide de Matlab. Nous avons notamment vu comment calculer des dérivées, des intégrales et résoudre des équations différentielles. A l’aide de la fonction vpa, il est possible d’obtenir l’estimation numérique d’une expression symbolique ou de la valeur d’une fonction en un point donné. 1 Code : >> >> >> >> >> >> >> >> syms x f(x)=sin(5*x) f(0.43) vpa(f(0.43)) vpa(f(0.43),4) h(x)=int(f(x)^(1/2),x) h(3.5) vpa(h(3.5)) Notons qu’il est préférable d’utiliser la fonction vpa lorsque Matlab ne permet pas de trouver des solutions exactes à des équations ordinaires. Dans l’exemple ci-dessous, Matlab semble renvoyer un résultat exact, or il ne s’agit que d’une approximation écrite sous la forme de fraction. Dans ce cas, il est préférable d’en obtenir une écriture décimale ou de forcer Matlab à faire un calcul symbolique (cela ne fonctionne pas toujours). Code : >> >> >> >> >> syms x y = solve(x^2 - x + sin(1) == 0, x) vpa(y) a=sym(1) y = solve(x^2 - x + sin(a) == 0, x) 2 Les fonctions Matlab La méthode présentée ci-dessus a ses limites. Par exemple, si Matlab ne peut calculer une primitive, alors il refusera d’estimer sa valeur à l’aide de la méthode vpa (ce qui nous aurait permis par exemple de calculer l’intégrale de la fonction). Dans ces cas, il faudra demander explicitement à Matlab de calculer numériquement l’intégrale d’une fonction, sans passer par l’identification d’une primitive. Mais pour cela, nous allons devoir utiliser les fonctions Matlab. Ce sont des fonctions définies par l’utilisateur et que le logiciel va traîter de manière numérique. La contrepartie étant alors la perte des possibilités de calcul symbolique de Matlab. Nous allons voir trois méthodes pour définir des fonctions Matlab. Activité 3. Définition d’une fonction simple. On peut définir des fonctions Matlab en une ligne à l’aide de @(x) expression(x). L’idée est de dire à Matlab que la fonction associe à x (qui correspond au @(x)) 2 l’expression en x qui suit. Par exemple, le code suivant permet de définir la fonction f (x) = e −x (ln x)2 . Code : >> f = @(x) exp(-x^2)*log(x)^2 >> f(2) Activité 4. Définition d’une fonction simple à partir d’une fonction symbolique. Si nous avons une fonction symbolique (obtenue par exemple comme solution d’une équation différentielle), alors il est possible de la convertir en fonction Matlab à l’aide de la méthode matlabFunction. 2 Code : >> >> >> >> syms x, y g(x, y)=exp(-x^2)*log(y)^2 h = matlabFunction(g) h(2,3) Activité 5. Définition d’une fonction plus complexe à l’aide de l’éditeur. Dans des cas plus complexes, il n’est pas possible de créer des fonctions en une seule ligne. Dans cette activité, nous allons créer la fonction si x < −1, 0 k(x) = ln(2 + x) si − 1 ≤ x ≤ 1, sin(x) si 1 < x. Pour cela, ouvrir l’éditeur de Matlab (en cliquant sur le bouton New Script en haut à gauche de la fenêtre). Tapez le code suivant puis enregistrez votre fichier avec le même nom que la fonction (ici k.m). Code : Commentaires : B N’oubliez pas les ’ ;’ ! sinon Matlab affichera le s calculs intermédiaires lorsque vous appellerez la fonction k... function y=k(x) if x < -1 y=0; elseif (-1 <= x) & (x<=1) y=log(2+x); else y=sin(x); end end Remarque 2. Il est possible de créer des fonctions dans l’éditeur qui ne renvoient aucun argument, qui en renvoient plusieurs, qui créent des graphes, etc... Il est également possible d’utiliser des boucles for et des portes conditionnelles du type while. Comme leur apprentissage sort du cadre de ce cours de mathématiques, nous n’en étudierons pas l’usage. Cependant, vous pouvez vous reporter à l’aide ou aux nombreuses documentations en ligne pour découvrir ces fonctionnalités. La fonction k ainsi définie, même si elle renvoie un argument, n’a pas le même statut que celle définie par @(x) .... Pour obtenir une fonction Matlab, que nous appellerons k 0 , on peut procéder de la façon suivante. Code : >> k0=@(x) k(x). Activité 6. Pour aller un peu plus loin... Il peut être utile, étant donnée une fonction à plusieurs variables, de la transformer en une fonction à une variable. Dans l’exemple suivant, on considère la fonction à deux variables f (x, y) = x y et on veut construire les fonctions f 1 (x) = x, f 2 (x) = x 2 et f 3 (x) = x 3 . 3 Code : >> >> >> >> f=@(x,y) x^y f1=@(x) f(x,1) f2=@(x) f(x,2) f3=@(x) f(x,3) 3 Calcul numérique d’intégrale et problème de vectorisation Activité 7. Calcul numérique de l’intégrale d’une fonction simple. Une fois donnée une fonction Matlab, il est possible d’en calculer numériquement l’intégrale à l’aide de la méthode integral. Code : >> >> >> >> Commentaires : — La ligne de commande integral(f,a,b) calf=@(x) exp(x)./(1+x.^2) cule l’intégrale de f entre a et b, integral(f,-1,1) integral(f,-Inf,0) — Nous utilisons ici les opération ./ et .^ car il integral(f,0,Inf) est nécessaire de pouvoir appliquer, terme à terme, la fonction f à une matrice. Voir l’activité suivante pour plus d’informations sur le sujet. Attention ! Il ne s’agit que d’une approximation, comme le montre l’exemple suivant... Code : >> >> >> >> >> >> >> h=@(x) log(x) integral(h,0,1) format long integral(h,0,1) syms x H(x)=int(log(x)) H(1)-H(0) Activité 8. Vectorisation d’une fonction. En général, Matlab demande de travailler avec des fonctions qu’il peut appliquer terme à terme à des matrices. Par exemple, si on définit la fonction f=@(x) x^2, alors la commande f(A) renverra une erreur si la matrice A n’est pas carrée et A 2 sinon. Or, pour pouvoir calculer l’intégrale de la fonction x 2 avec la méthode integral, il faudrait que f(A) renvoie une matrice de la même taille que A, dont chaque coefficient est mis au carré. Pour arriver à ce comportement, on posera f=@(x) x.^2. On dit alors que la fonction est vectorisée (les fonctions usuelles de matlab sont vectorisées). 4 Code : >> >> >> >> >> >> >> >> >> >> >> f=@(x) x^2 A=[1,1;1,1] B=[1,2] f(A) f(B) integral(f,0,1) clear f f=@(x) x.^2 f(A) f(B) integral(f,0,1) Il peut être parfois difficile de vectoriser une fonction. Par exemple, la fonction k définie plus haut n’est pas vectorisée par défaut et c’est un travail difficile de la vectoriser. Afin de pallier cette difficulté, Matlab propose la méthode arrayfun(f,A) qui applique la fonction f à chaque élément de la matrice A. Code : >> >> >> >> >> >> >> >> >> f=@(x) x^2 A=[1,1;1,1] B=[1,2] arrayfun(f,A) arrayfun(f,B) fv=@(x) arrayfun(f,x) fv(A) fv(B) integral(fv,0,1) Terminons cette activité en essayant de vectoriser la fonction k définie plus haut. Code : >> >> >> >> >> >> >> >> >> >> >> >> >> k([-2,-1,1]) [k(-2),k(-1),k(1)] integral(k,-2,1) k0=@(x) k(x) k0([-2,-1,1]) [k0(-2),k0(-1),k0(1)] integral(k0,-2,1) k1=@(x) arrayfun(k,x) k1([-2,-1,1]) kv=@(x) arrayfun(k0,x) kv([-2,-1,1]) [kv(-2),kv(-1),kv(1)] integral(kv,-2,1) Commentaires : — On observe que k n’est pas vectorisée, — De plus, comme nous l’avons mentionné, k n’a pas un statut de fonction Matlab, ce qui provoque des erreurs. — La fonction k0=@(x) k(x) n’est pas vectorisée non plus, — En revanche, Matlab ne revoie pas d’erreur... — C’est un piège, car integral(k0,-1,1) ne renvoie pas le bon résultat ! Comme on le vérifie par la suite. B Seules les fonctions Matlab peuvent être vectorisées, donc il faut passer par k0 pour définir kv. 4 Les graphes de fonction Activité 9. Tracé d’une fonction à une variable. Pour tracer une fonction, on peut utiliser la méthode ezplot. Attention ! La fonction doit être vectorisée, sinon cela peut poser des difficultés... 5 Code : >> >> >> >> >> >> >> >> f=@(x) sin(x) ezplot(f,[-pi,2*pi]) syms x g(x)=sin(x)/x ezplot(g,[0,10]) ezplot(k,[-2,2]) ezplot(k0,[-2,2]) ezplot(kv,[-2,2]) Commentaires : — ezplot(f,[-pi,2*pi]) trace la fonction f sur l’intervalle [−π, 2π]. — La méthode ezplot permet de tracer des fonctions symboliques, sans passer par la méthode functionMatlab. — On ne peut pas tracer directement les fonctions construites à la main. B Si la fonction n’est pas vectorisée, alors Matlab ne renvoie pas le résultat attendu... Activité 10. Tracé d’une fonction à 2 variables. Matlab permet également de tracer des fonctions à deux variables, à l’aide de la méthode ezsurf par exemple. Dans ce cas, il n’est pas nécessaire de fournir une fonction vectorisée à Matlab (vous obtiendrez simplement un ’Warning !’). Code : >> f=@(x,y) sin(x)+sin(y) >> ezsurf(f,[-pi,2*pi,0,pi]) Commentaires : — ezsurf(f,[-pi,2*pi,0,pi]) trace la fonction f sur l’ensemble [−π, 2π] × [0, π]. Activité 11. Tracé d’un chemin en 2 et 3 dimensions. Matlab permet également de tracer des chemins en deux et trois dimensions. Pour mieux vous représenter la trajectoire, vous disposez de l’option ’animate’ et des outils de caméra (menu ’View → Camera Tool Bar’ dans la fenêtre de la figure). Code : >> >> >> >> >> >> >> >> >> >> xt=@(t) 2*cos(t) yt=@(t) sin(t) ezplot(xt,yt,[0,2*pi]) clear xt yt xt=@(t) sin(t)*cos(t) yt=@(t) sin(t) zt=@(t) sin(t/2) ezplot3(xt,yt,zt,[0,4*pi]) ezplot3(xt,yt,zt,[0,8*pi],’animate’) Activité 12. Tracé d’un champ de vecteurs. Enfin, Matlab permet de tracer un champ de vecteurs. Il faut pour cela lui préciser les abscisses et les ordonnées des points de départ, ainsi que les abscisses et ordonnées des vecteurs à tracer. Attention ! Les fonctions P et Q ci-dessous sont vectorisées... Code : >> >> >> >> >> P=@(x,y) sin(x).*y Q=@(x,y) cos(x).*y+0.5 x=[-1,0,1] y=[-1,0,1] quiver(x,y,P(x,y),Q(x,y)) Comme il peut être pénible de définir à la main tous les points en lesquels on veut tracer le champ de vecteurs, Matlab propose l’outil meshgrid. 6 Code : >> >> >> >> P=@(x,y) sin(y) Q=@(x,y) sin(x) [x,y]=meshgrid(0:0.1:pi,-pi:0.1:0); quiver(x,y,P(x,y),Q(x,y)) 5 Problèmes à résoudre à l’aide de Matlab Vous devez résoudre les problèmes suivants en vous appuyant sur vos connaissances en mathématiques et en utilisant Matlab pour effectuer certains calculs et tracés. Vous devrez rendre un rapport exliquant votre démarche, détaillant les lignes de commandes utilisées et reproduisant les différents tracés. Bon courage ! 5.1 Problème 1. Diagonalisation de matrices On considère les matrices suivantes. −2 0 2 1 2 0 A = 0 2 0 , B = 0 3 1 , −8 0 8 0 1 2 1 cos(π/3) sin(3π/2) 3 π C = cos(π/3) sin(3π/2) π 2 1. En utilisant Matlab, déterminer, de manière exacte, le déterminant, l’inverse (quand il existe), le polynôme cacractéristique, les valeurs propres et les vecteurs propres des matrices ci-dessus 1 . 2. En utilisant cette fois-ci des valeurs numériques, écrire chacune des matrices ci-dessus sous la forme P DP −1 , où P est une matrice inversible et D une matrice diagonale. 5.2 Problème 2. Résolution d’une équation différentielle Résoudre les exercices suivants à l’aide de Matlab. Exercice 1. Résoudre le problème de Cauchy suivant. ( (C ) y 0 − x1 y = x 3 sur I =]0, +∞[ y(1) = 2. Tracer la solution obtenue. Exercice 2. Résoudre l’équation différentielle (E ) y 00 − 4y 0 + 3y = (x 5 − 2x)e x sur I =] − ∞, +∞[. Exercice 3. Résoudre le problème de Cauchy suivant. ( (C ) y 00 − 4y 0 + 3y = (x + 2)e 2x sur I =] − ∞, +∞[, y(0) = 0, y 0 (0) = 1. Tracer la solution obtenue. 1. vous pourrez consulter http://fr.mathworks.com/help/symbolic/solve-a-system-of-linear-equations.html pour résoudre de manière exacte un système linéaire donné 7 5.3 Problème 3. Recherche de minimum et calcul d’intégrales curvilignes Soient h ∈ R, k > 0 et f : [0, π] × [−1, 1] → R la fonction définie par f (x, y) = h ∗ sin(x)2 + (cosh(k ∗ y) + 2). Répondre aux questions suivantes à l’aid de Matlab. 1. Tracer la nappe z = f (x, y) pour (h, k) = (1, 2), (h, k) = (−1, 1) et (h, k) = (1, 1). 2. Étudier les extremums locaux et globaux de la fonction f pour (h, k) = (1, 2) (on gardera ces paramètre dans la suite). 3. Donner un paramétrage ψ : [0, 1] → R2 du segment [(0, 0), (π, π)]. 4. Calculer l’intégrale curviligne Z f (v) d v. [(0,0),(π,π)] 5. Donner un paramétrage ϕ : [0, 1] → R3 de Γ, défini comme l’image par f du segment [(0, 0), (π, π)], puis tracer ce chemin. 6. Calculer numériquement la longueur du chemin Γ. 5.4 Problème 4. Formes différentielles On considère les formes différentielles suivantes. x 2 + sin(x + y) x y + cos(x + y) dx + dy 3 (2 + cos(x ∗ y)) (2 + cos(x ∗ y))2 ³ ´ 2 2 ω2 (x, y) = e −x −y (1 − 2x 2 )d x − 2x yd y ω1 (x, y) = Répondre aux questions suivantes en utilisant Matlab. 1. Tracer les champs de vecteurs correspondant à ω1 , puis ω2 avec la grille meshgrid(-2:0.2:2). 2. La forme différentielle ω1 est-elle exacte ? 3. Montrer que la forme différentielle ω2 est exacte . 4. Déterminer une fonction f telle que ω2 = d f . 5. Tracer la fonction f . 6. Calculer numériquement l’intégrale de ω2 le long du demi-cercle de centre 0 et de rayon 2. 8