TP2 MATLAB :

Boucles, vectorisation, fonctions Matlab, graphes .... Pour vectoriser un problème,
il faut savoir créer des vecteurs (et des matrices). ... qu'on a écrit, mais c'est
indispensable au sein même d'un programme pour faire appel à des fonctions
dont ...

Part of the document

TP2 MATLAB :
Boucles, vectorisation, fonctions Matlab, graphes Contrairement à la premiére séance, on n'indiquera plus le début de ligne
par EDU>> O/-Entrées et sorties Il est toujours utile de pouvoir "communiquer"avec son ordinateur.
La "sortie" sur l'écran a déjà été vue:
a=3
L'ordinateur affiche (sort) la valeur de a. Ce cas est particulièrement
simple puisqu'il faut au contraire préciser à Matlab qu'on ne veut pas
afficher la réponse:
a=l;
disp(a)
disp est une autre instruction pour afficher une valeur, qui est
équivalente à l'instruction
a
L'entrée de données peut se faire grâce à l'instruction input
help input
n=input('Entrez un entier compris entre 3 et 28'); I/- Boucles Une boucle est une suite d'opérations identiques que l'on veut effectuer.
Quand on veut effectuer une suite d'opérations et qu'on connaît exactement
le NOMBRE d'opérations à effectuer, on peut utiliser la boucle "for". Mais
si on ne connaît pas a priori le nombre d'opérations à effectuer, il faut
utiliser une boucle "while", à condition d'être sûr qu'il y en a un nombre
FINI ! Sinon, l'ordinateur va planter. 1/ La boucle itérative "for" help for
for i=1:10;
y1(i)=i^2;
end;
y1
N'oubliez pas le ; et le end
for i= 1:3:25;
y2(i)=3*i+2;
end;
y2
Ecrivez encore quelques boucles pour entrer des suites que vous connaissez.
En général, les boucles "for" sont très pratiques pour effectuer une suite
d'opérations, mais avec Matlab, il existe une méthode souvent plus
efficace: la vectorisation. On l'étudiera plus en détail dans le II/.
help disp
for i=12:-2:1;disp(i),end; for i=12:-2:1;
disp(i);
if i==8, break;
end;
Comparez avec la suite d'instructions suivante:
for i=12:-2:1;
disp(i);
end;
if i==8, break;
Expliquez la différence.
La suite de Fibonacci est définie par récurrence à partir de ses deux
premiers termes u0 et u1 en posant u(n+2)=u(n+1)+u(n)
Effectuez, puis expliquez les lignes suivantes:
n=25;u(0)=1;u(1)=1;
for i=2:n
u(i)=u(i-1)+u(i-2);
end;
u(n) 2/ La boucle répétitive "while" help while
v(0)=1;v(1)=1;
i=1;
while v(i)0
y=y/x;
x=x-sin(x)^2;
n=n+1;
if n==1000, break;end;
end;
n,x
La syntaxe 'if ---, --- else --- end; ' est très souvent utile. Le'else'
est facultatif, maisn'oubliez pas le 'end;'
Dans de gros prgrammes, il est préférable de passer à la ligne pour rester
lisible; on écrit donc:
if taratata==1, turlututu=3 %Notez le premier '==', puis le '=',
expliquez la différence.
else
if taratata==-8, tralala=34
end; %c'est le 'end' du deuxième 'if'
end; % c'est le 'end' du premier 'if' n=5;k=1;
while n~=1
if mod(n,2)==0
n=n/2;k=k+1;
else n=3*n+1;k=k+1;
end;
end;
Cette suite s'appelle suite de Syracuse. Grâce à la programmation de cette
suite sur ordinateur on constate qu'elle converge. Essayez de le démontrer
... et si vous y arrivez ,... bravo! D'où l'intérêt de pouvoir calculer
rapidement les termes de la suite. II/- Création de vecteurs , vectorisation La vectorisation est un avantage de Matlab : quand on a une suite
d'opérations à effectuer, et qu'on connait le nombre d'opérations, on peut
effectuer une boucle « for', mais on peut aussi souvent faire des
opérations vectorielles ;
Comparez les instructions :
for i=1:10;
y1(i)=i^2;
end;y1
avec
i=1:10;
y1=i.^2
Vectorisez la boucle suivante:
for i= 1:3:25;
y2(i)=3*i+2;
end; y2
On peut retenir les deux règles suivantes:
-quand il est possible de vectoriser, alors c'est préférable.
-quand la suite d'opérations d'une boucle itérative ne dépend pas de
l'ordre dans lequel ces opérations sont effectuées, alors on peut (et on
doit) vectoriser le problème. Pour vectoriser un problème, il faut savoir créer des vecteurs (et des
matrices). Création -' :' Vous avez souvent rencontré cette instruction, elle permet de créer
des vecteurs en progression arithmétique
x=6 :-0,6 :3
y=1 :2 :9
z=-pi :pi/5:pi
-la fonction 'linspace'. Essayez help linspace
help logspace
- les fonctions prédéfinies pour rentrer des matrices
x=zeros(1,5)
y=ones(5,1)
z=rand(2,3)
clear ;
-les crochets pour rentrer des vecteurs et matrices de petite taille à la
main.
x=[1,2,8]
y=[4 6 1]
z=[3 ;-2 ;2]
t=[3 ;-1,2]
expliquez.
A=[x ;y'] Opérations On peut modifier des vecteurs par des opérations scalaires ou
matricielles :
x2=x.*y
x3=x2.+x
y'
b1=y'*x
b2=y*x'
b3=y'.*z
b4=x.^2
b5=x./y
b6=x.\y
A=2*eye(3,3)+rand(3,3)./100
t=A\x
u=A*t % Laligne précédente permet de résoudre l'équation matricielle At=x
c=diag(A)
B=diag(x)
Exercice : résoudre matriciellement
3x+2y=12 et x+y=5
help reshape
A=[2 4 1 4 ; 3 1 -3 6 ; 7 3 -1 2 ]
B=reshape(A,6,2)
C=reshape(A,4,3)
D=reshape(C',2,6)
Essayez sur d'autres exemples. Regardez l'aide pour 'max','min','sum' , 'prod', 'cumsum' puis essayez sur
les exemples précédents, en cherchant avant de taper lesinstructions de
quelle taille va être le résultat :
max(A)
a=sum(A)
a2=sum(A')
b,cumsum(b)
prod(C)
etc... III/- Création de fonctions
1/- Fichiers Matlab Pour diverses raisons il est important de savoir créer des fichiers Matlab.
Cela sert évidemment à sauver les programmes, ou scripts qu'on a écrit,
mais c'est indispensable au sein même d'un programme pour faire appel à des
fonctions dont on se sert souvent.
En haut de la fenêtre Matlab, en cliquant sur 'File' on peut créer un
nouveau fichier ('New') ou en ouvrir un ancien'Open'. Une nouvelle fenêtre
s'ouvre dans laquelle vous allez pouvoir taper puis sauver votre fichier.
Il faut toujours donner une extension '.m ' à vos fichiers, par exemple
toto.m et les sauver sur votre disquette (a:).
Créez un fichier s'appelant 'votrenom.m', tapez-y une suite d'instructions,
par exemple
for i= 1:3:25;
y2(i)=3*i+2;
end;
y2
Sauvez votre fichier , fermez-le, puis tapez son nom sur la ligne de
commande .
Matlab effectue alors les instructions contenues dans votre fichier. 2/-Création de fonctions. help function
Si on veut effectuer plusieurs fois la même opération, ou si on veut
écrire des programmes clairs dans lesquels les différentes étapes sont bien
délimitées, il faut créer des fonctions.
Matlab comporte déjà beaucoup de fonctions mathématiques prédéfinies. Tapez help elfun
Il y a deux méthodes pour créer des fonctions. Fonctions en ligne La première doit être évitée si possible, mais peut parfois être utile si
on veut aller vite:
Tapez: help inline
g1=inline('sin(t^2)+3')
g2=inline('x^2+cos(y-1)','x','y')
g1 est une fonction à une seule variable, il n'y a pas besoin de la
préciser, Matlab la reconnaît tout seul.
g2 est une fonction de deux variables x et y
g1(0), g2(0,1)
on peut également définir des fonctions dépendant de paramètres:
g3=inline('x^3-4y^2+5t', 'x','y')
Là, g3 est une fonction de deux variables x et y, et t est un paramètre qui
doit être connu au moment de l' appel de la fonction. Tapez
g3(1,0)
t=6;
g3(1,0) Fichiers .m La meilleure méthode pour créer des fonctions est de créer un fichier avec
extension .m pour chaque fonction utilisée.
Un exemple: créez un nouveau fichier qui s'appelle g2.m .
Tapez dans ce fichier les instructions suivantes:
function [z]=g2(x,y)
z= x^2+cos(y-1)
Sauvez votre fichier sur votre isquette et fermez le .
Sur votre ligne de commande, tapez maintenant
[z]=g2(2,3)
Pour des fonctions aussi simples, l'intérêt de créer des fichiers pour
chaque fonction n'est pas clair. Mais prenez l'habitude de créer
systématiquement des fonctions de cette manière, cela simplifiera la
programmation par la suite.
Attention: quand on déclare une fonction, il est indispensable de lui
donner le nom du fichier dans lequel elle est. Sinon, vous ne pourrez pas
l'appeler depuis la ligne de commande Matlab. Essayez pour vous en
convaincre:
Ouvrez un nouveau fichier tralala.m et tapez dedans ;
function [z]=g(x,y)
z= x^2+cos(y)
Sauvez le puis essayez de demander la valeur g(30) par exemple.
Plus généralement, une fonction Matlab peut avoir plusieurs (ou aucune)
variables à l'entrée : e1,e2,.. et plusieurs variables à la sortie:
s1,s2,..
Essayez help nargin
help nargout
Exercice: Créez un fichier eq1.m, et programmez une fonction function
[x,n]=eq1(a,b) qui résout l'équation du premier degré ax+b=0, avec n le
nombre de solutions et x la solution s'il y en a.
Vous pouvez utiliser les instructions if... ... else ... et nargin
Idée:
-s'il n'y a pas deux variables d'entrée, il n'y a pas de solution n=0
-s'il y en a deux, résoudre l'équation, et s'il y a une solution, donner sa
valeur à x et n=1
Exercice:
De même, créez un fichier eq2.m, et programmez une fonction'function
[x1,x2,n]=eq2(a,b,c) 'qui résout l'équation du second degré a.x^2+bx+c=0.
-S'il y a trois variables d'entrée
-si le discriminant est strictement positif, alors n=2, x1=...,x2=...
-si le discriminant est nul, alors...
-sinon, il n'y a pas de solution, alors...
-s'il y a deux variables d'entrée, on résout l'équation du premier degré...
-sinon,...
Exercice
créez une fonction syracuse qui pour une valeur (entière) de n donnée au
départ (en entrée), vous donne le nombre k d'itérations nécessaires avant
d'arriver à 1.
Remarque: Vous pouvez rentrer vos fonctions dans l'aide en ligne, à
condition d'avoir ajouté des explications. Cela peut être utile si vous
avez un gros programme avec de nombreuses fonctions f1, f2, f3, g1...
Ouvrez par exemple votre fichier eq2.m, ou n'importe quel autre que vous
avez écrit, et APRES la première ligne, tapez %suivi d'une explication de
votre choix sur votre fonction.
Sauvez et fermez votre fichier, puis tapez help 'nomdufichier'. IV/- Graphisme Dans toute la suite, pensez à créer (et sauvegarder) des fichiers .m pour
chaque courbe tracée. Pour faire tracer la courbe, tapez juste le nom de
votre fichier sur la ligne de commande. 1/ Graphisme en deux dimensions Il existe de nombreuses options qui permettent de tracer des courbes
variées.
Tapez help plot
Un exemple simple :
x=-pi :pi/100 :pi ;y=sin(x) ;
plot(x,y)
Retenez avec cet exemple que pour tracer une courb