Document de la séance II

publicité
É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
Téléchargement