Vous êtes sur la page 1sur 6

Université de Nantes 2008/2009

Analyse Numérique: S22M030


T.P. MatLab: les scripts (procédures) et les fonctions
Un script est un programme, une suite d’instructions écrites dans un fichier
.m, si le fichier s’appelle test1.m, en tapant test1, puis retour chariot, fait que
toutes les instructions contenues dans test1.m sont executées comme si elles
étaient tapées à la main.
Copier le texte ci-dessous dans un fichier à sauver sous le nom Ecriture1.m

%Petit script d’exemple d’criture


fich=fopen(’data1.txt’,’w’); %le w c’est pour pouvoir y crire
x=[-2:0.1:2];
y=[x;exp(-x.^2)];
fprintf(fich,’%1.4f %1.8f\n’,y); %\n c’est passer la ligne aprs l’criture de chaque colo
fclose(fich);

Demander à Matlab d’exécuter ce script en rentrant: Ecriture1


Faites: who
Vous constatez que vous avez deux variables x et y. Si ces variables existaient
déjà, elles ont été modifiées.
Ouvrir le fichier fichier crée data1.txt et refermer le.
Pour re-utiliser ces valeurs, on peut utiliser le script ci-dessous (sous le nom
Lecture1.m par exemple), ou taper directement les commandes sur Matlab.

%Exemple de script lisant une matrice (2,n)


%
fich1=fopen(’data1.txt’);
A=fscanf(fich1,’%f %f’,[2,inf]); %Le inf c’est pour fin de fichier
fclose(fich);
size(A)
plot(A(1,:),A(2,:));
disp(’Taper une touche pour effacer la courbe’)
pause
clf

Pour un script ou une fonction, on utilise en général des boucles ou des


itérations.
for j=1:n; - - -; end
while - - -; - - -; if ..., break; - - -; - - -; end
if - - -; - - -; else - - -; end
if - - -; - - -; elseif - - -; - - -;elseif - - -; - - -; else - - -; end
if - - -; - - -; elseif - - -; - - -;elseif - - -, return; elseif - - -; - - -; else - - -; end
switch, case - - - ; case - - - ; - - -; otherwise - - -; end
try - - -; - - -; catch - - -; - - -; end
Reprénons par exemple les deux scripts précédents, et modifions les pour
avoir des fichiers textes et non binaires.
Pour l’écriture: Ecriture2.m

1
%Petit script d’exemple d’criture en mode texte
fich=fopen(’data2.txt’,’wt’); %le w c’est pour pouvoir y crire et t pour texte
x=[-2:0.1:2];
y=exp(-x.^2);
m=length(x);
fprintf(fich, ’[x(k) exp(-x^2(k))], pour k=1,...,%d\n’, m);
for k=1:m
fprintf(fich,’%1.4f %1.8f\n’,x(k),y(k) ); %\n c’est passer la ligne
end
fclose(fich);

Pour la lecture: Lecture2.m

%Exemple de script lisant une matrice (n,2)


fich1=fopen(’data2.txt’,’rt’);
mot=fgetl(fich1)
m=1;
m=input(’donner la longueur du vecteur x ’)
A=zeros(m,2);
for k=1:m
A(k,:)=str2num(fgetl(fich1)); %str2num transforme un mot en chifre
end
fclose(fich1);
plot(A(:,1),A(:,2));
disp(’Taper une touche pour effacer la courbe’)
pause
clf

Tester les!
Contrairement à un script, une fonction ne modifie pas vos variables et
détruit les variables qu’elle a crée après son exécution.
Une fonction doit être dans un fichier .m dont la première ligne commence
toujours par le mot
function
Un exemple: copier celle ci-dessous et sauver là sous le nom moncarre.m

function y=moncarre(x)
% Cette fonction est
% l’inverse de racine carree
x=(x+abs(x))/2;
disp(’Vos variables ne changent pas’)
y=x.*x;

En tapant moncarre([-2 2]) on trouve [0 4].


En tapant moncarre(2), on obtient 4.
Evidemment la commande v=moncarre(w) est valable, si w existe.

2
En tapant help moncarre,
les 2 lignes de commentaires, ici la 2 et la 3, sont affichées.
Tester celle-ci

function y=moncarreB(x)
% Cette fonction est
% l’inverse de racine carree
x=(x+abs(x))/2;
%disp(’Vos variables ne changent pas’);
y=x.*x;

En tapant M=moncarreB(A); M devient (A.*A+A.abs(A))/2)


On peut aussi définir une petite fonction ’en ligne’, (et non dan un fichier).

mafoncI=inline(’(x.^n)./(x.*x+1)’,’x’,’n’);

ou plus simple:

mafonc2I=inline(’(x.^2)./(x.*x+1)’);

Dans ce dernier cas simple, préferer la forme suivante:

f2I=@(x) (x.^2)./(x.*x+1);

En tapant
M=1+mafoncI(A); ou M=1+f2I(A); (M devient ones(A))
Pour récapituler, soit prog1.m est un programme et fonct.m une fonction.
prog1 (exécute prog1.m),
a=fonct(x,y,z) ;
(appelle la fonction fonct.m, la première ligne du programme de la fonction doit
être de la forme
function b=fonct(u,v,w), ou function [c]=fonct(s,t,d) )
[a1, a2]=fonct(x,y,z) ;
(appelle la fonction fonct.m, la première ligne du programme de la fonction doit
être de la forme
function [b, c]=fonct(u,v,w))
Quelques exemples.

function f=mafonc1(x,c,n)
% y=mafonc(x,c,n)
% y est de meme type que x
% c peut etre du meme type que x, ou un scalaire
% n est un entier
f=x;
for i=1:n,
f=f.^2+c;
end % pour for

3
La valeur donnée par la fonction est en general une matrice.
Une fonction peut donner plusiers valeurs.

function [f,m]=mafonc2(x,c,n)
% commentaires...
f=x;
for i=1:n,
f=moncarreB(f)+c;
end % pour for
m=1;
for i=1:n
m=round(m^2+c);
end % pour for

Une fonction peut appeler une autre fonction fichier. Pour celà, on peut
écrire la deuxieme après la première. Cette deuxième peut être déclarée inline
dans le corps de la fonction.

function [f,m]=mafonc3(a,b,n)
% [M,y]=mafonc3(a,b,n)
% M est l’integrale de g sur a,b (a<b), g dfini ci-bas
%par la methode des points milieux,
% et y l’erreur
if nargin != 3
error(’Cette fonction n’’ecessite 4 variables’);
return;
else
h=(b-a)/n;
f=h*g(a+h/2);
for i=1:(n-1),
f=f+h*g(a+i*h+h/2);
end % pour le for
end % pour if
y=quadv(@g,a,b);
m=abs(y-f);

%Deuxieme fonction appele par la premiere


function v=g(u)
v=1./(1+x.*x);

Exemples d’utisation:
[V,r]=mafonc3(0,1,100);
Autres exemples où la deuxieme fonction n’est pas dans un fichier

function [f,m]=mafonc3B(a,b,n)
% [M,y]=mafonc3B(a,b,n)
% M est l’integrale sur a,b (a<b), de la fonction g ci-dessous

4
% par la methode des points milieux,
% et y l’erreur
g=@(x) ((x+abs(x))/2).^2;
h=(b-a)/n;
f=h*g(a+h/2);
for i=1:(n-1),
f=f+h*g(a+i*h+h/2);
end % pour le for
y=quad(g,a,b);
m=abs(y-f);

function [f,m]=mafonc3C(a,b,n)
% [M,y]=mafonc3C(a,b,n)
% M est l’integrale sur a,b (a<b), de la fonction g ci-dessous
% par la methode des points milieux,
% et y l’erreur
g=inline(’((x+abs(x))/2).^2’);
h=(b-a)/n;
f=h*g(a+h/2);
for i=1:(n-1),
f=f+h*g(a+i*h+h/2);
end % pour le for
y=quad(g,a,b);
m=abs(y-f);

Une fonction peut avoir comme argument une autre le nom, (un mot),d’une
fonction.
Exemple

function f=mafonc4(g,a,b,n)
% Commentaires
h=(b-a)/n; f=h*feval(g,a+h/2);
for i=1:(n-1),
f=f+h*feval(g,a+i*h+h/2);
end % pour for

r=mafonc4(@sin,0,pi,100);
dans ce cas g(x)=sin(x). On peut faire aussi
r=mafonc4(’sin’,0,pi,100);
Dans le cas d’une fonction dans un fichier, comme moncarreB.m, on fait
r=mafonc4(’moncarreB’,0,1,10); dans ce cas g(x)=moncarreB(x), si moncar-
reB.m est une fonction à une variable, qui existe dans le répertoir courant.
La fonction précédente est équivalente à celle-ci

function f=mafonc4B(g,a,b,n)
% Commentaires
mot1=[g,’(’];

5
h=(b-a)/n; f=h*eval([mot1,’a+h/2)’]);
for i=1:(n-1),
f=f+h*eval([mot1,’a+i*h+h/2)’]);
end % pour for

Autres alternatives

function f=mafonc5(g,a,b,n))
% Commentaires
h=(b-a)/n;
try
f=h*feval(g,a+h/2);
for i=1:(n-1),
f=f+h*feval(g,a+i*h+h/2);
end % pour for
catch
f=h*feval(@g,a+h/2);
for i=1:(n-1),
f=f+h*feval(@g,a+i*h+h/2);
end % pour for
end % pour try

Quelques fonctions utiles.


x=input(’Entrer la valeur de x, x=? ’)
x=input(’Faire retour chariot pour continuer’)
disp(’hello’) (affichage à l’écran)
pause(n);
pause;
type program2; (affiche program2.m),
delete program2 (le détruit)
Pour terminer, un petit script de résolution numérique d’une équation différentielle.

%%Resolution numerique de
%%y"=-sin(y); y(0)=0 et y’(0)=0.5
F=inline(’[v(2);-sin(v(1))]’,’t’,’v’);
v0=[0;0.5];
[X,Y]=ode23(F,[0,10],v0);
plot(X,Y(:,1))

Vous aimerez peut-être aussi