Universit´e de Pau et des Pays de l’Adour Master 1 MMS, 2015-2016 D´epartement de Math´ematiques Analyse Num´erique Fondamentale
TP 2 - Quelques ´el´ements de programmation - Illustrations
Jusqu’`a pr´esent, nous savons cr´eer des scripts, qui sont une suite d’instructions qui s’ex´ecutent s´equen- tiellement. Il arrive souvent qu’une mˆeme suite d’instructions doive ˆetre ex´ecut´ee de mani`ere r´ep´et´ee : il convient alors de regrouper ces instructions dans un fichier et d’en faire unefonction. Syntaxiquement, ce qui diff´erencie une fonction d’un script est que la premi`ere ligne d’une fonction s’´ecrit toujours sous la forme
function [resultat1, ..., resultatN] = nomfonc(donnee1, ..., donneeP)
Il faut nommer ce fichiernomfonc.m(la fonction et le fichier la contenant doivent avoir le mˆeme nom).
Remarques:
• Une fonction peut elle-mˆeme appeler une fonction.
• Le nombre des arguments d’entr´ee (donneei) et de sortie (resultati) peut ˆetre r´eduit `a 0.
• Les arguments d’entr´ee sont prot´eg´es, c’est `a dire que toute modification reste locale `a la fonction.
• Lorsqu’on lance Matlab, on dispose d’une zone de m´emoire appel´ee espace de travail (workspace) g´er´ee automatiquement par Matlab pour y stocker les variables. Tous les scripts et les commandes interactives utilisent cet espace de travail (cf commandewhos). Par contre, au cours de son ex´ecution, chaque fonction poss`ede son propre espace de travail, qui ne communique avec celui de l’appelant que par l’interm´ediaire des arguments (ou grˆace `a l’instruction global).
Utilisation
Il est possible d’appeler la fonction en ´ecrivant :
nomfonc(d1, ..., dP);
mais dans ce cas, seule la valeur de resultat1 est transmise et r´ecup´er´ee par l’appelant dans la variable ans; les autres r´esultats sont inaccessibles.
Pour obtenir tous les r´esultats, laseulefa¸con de proc´eder est d’appeler la fonction selon la syntaxe compl`ete : [R1, ..., RN] = nomfonc(d1, ..., dP);
Apr`es l’ex´ecution de cette instruction, les variablesRiauront ´et´e cr´e´ees (ou modifi´ees) dans l’espace m´emoire associ´e `a la fonction (ou au script) qui appelle la fonctionnomfonc.
Exercice 1.
Dans le fichierp3.m, ´ecrire une fonctionp3qui r´ealise l’applicationp3:t7→t3+ 2t2+t+ 2. L’en-tˆete de cette fonction sera : function y=p3(t). Utiliser des commandes vectorielles de fa¸con que la fonction transforme une matrice en une matrice de mˆeme taille en agissant ´el´ement par ´el´ement.
Test : taper>> sum(p3(-1:1)). Quel est le r´esultat ? Tracer la fonction en ex´ecutant les commandes :
>> x = -4:0.03:4; y = p3(x); plot(x,y) Taper ensuite : >> grid
A - M´ethode de dichotomie
La fonctionp3s’annule entre -4 et 4. Nous allons d´eterminer la racine par la m´ethode de dichotomie dont on rappelle ici le principe:
Soitf une fonction continue d’un intervalle [a, b] dansRtelle que
f(a)f(b)<0 etf ne s’annule qu’une fois dans l’intervalle [a, b].
On notexla solution de l’´equationf(x) = 0 dans [a, b].
1
L’algorithme est le suivant : on note a0 = a et b0 = b et on construit les suites (an)n≥1 et (bn)n≥1 comme suit : on calculexn−1=an−1+bn−1
2 ,
−sif(an−1)f(xn−1)<0, alors an=an−1,bn=xn−1,
−sif(an−1)f(xn−1)>0, alors an=xn−1,bn =bn−1,
−sinon la solution est atteinte.
On s’arrˆete d`es que|bn−an|< ε(εest une pr´ecision fix´ee au d´epart) ou qu’un nombre maximum d’it´erations ont ´et´e effectu´ees. La valeur approch´ee dexest alors le milieu du segment [an, bn].
Exercice 2.
a. Impl´ementation de la m´ethode avec Matlab.
Ecrire une fonction´ dicho.mqui met en œuvre la m´ethode de dichotomie. L’en-tˆete de cette fonction sera :
function [x,niter] = dicho(f,a,b,epsil,niterx)
% Methode de dichotomie
% Arguments d’entree :
% f : chaine de caracteres qui fait r´ef´erence au nom de la fonction
% dont on cherche la racine
% a : borne inferieure de l’intervalle
% b : borne superieure de l’intervalle
% epsil : precision pour le test d’arret
% niterx : nombre maximum d’iterations a realiser
% Arguments de sortie :
% x : valeur approchee de la racine
% niter : nombre d’iterations realisees, si une racine a ete trouvee On pourra utiliser une bouclewhileainsi que la commandereturnsi la solution est atteinte.
Nota : f est ici une chaˆıne de caract`eres qui fait r´ef´erence au nom du fichier contenant la fonction test (qui doit ˆetre le mˆeme que le nom de la fonction). Si ce fichier s’appelle fonc.m, l’appel sera alors [x,niter]=dicho(@fonc,a,b,epsil,niterx); et dans la fonction dicho, le calcul de f(x), o`u x peut d´esigner un vecteur, s’effectuera par l’instruction feval(f,x).
Tester cette fonction avecf(x) =p3(x) etε= 10−5, pour a=−3 etb= 3 puisa=−4 etb= 4.
b. Retrouver ce r´esultat en utilisant les commandes Matlab ad´equates. Rechercher ces commandes grˆace `a l’aide en ligne : commandeshelpoulookfor(en anglais, racine se dit root).
Exercice 3.
Dans le fichierFonc1.m, ´ecrire une fonctionFonc1qui r´ealise l’applicationt7→ t2+t−2
t3+ 2t2+t+ 2. Utiliser des commandes vectorielles de fa¸con que la fonction transforme une matrice en une matrice de mˆeme taille en agissant ´el´ement par ´el´ement.
Test : taper>> sum(Fonc1(0:3))et donner le r´esultat.
Tracer la fonction. Essayer avecx=-4:0.02:4. Expliquer.
Utiliser la fonctiondicho pour calculer la racine de cette fonction. Tester plusieurs intervalles et plusieurs pr´ecisions. −→voir le paragrapheOutils graphiquesen derni`ere page.
B - Estimation num´erique d’une vitesse de convergence
Le probl`eme est le suivant : on connaˆıt une estimation th´eorique d’erreur et on d´esire identifier un ordre ou un taux de convergence.
A l’aide d’une s´` erie de tests num´eriques, on dispose d’un ´echantillon (N, E) o`u N = (n1, . . . , nk) et E = (e1, . . . , ek) tels queej est l’erreur correspondant `anj. Notre probl`eme consiste `a d´eterminer la relation qui lieE `aN ; il s’agit d’un probl`eme de r´egression.
2
Pour parvenir `a notre but, on se ram`ene au cas de la r´egression lin´eaire :
- si la loi th´eorique est de la forme e ∼ Cn−p, on trace lnE en fonction de lnN (−p est le coefficient directeur de la droite) ;
- si la loi th´eorique est de la formee∼Cρn, on trace lnE en fonction de n, le coefficient directeur de la droite est lnρ;
- etc.
Exercice 4.
Dans la m´ethode de dichotomie, il est facile de montrer que|xn−x|6 b−a
2n . Illustrer ce r´esultat, avec la fonctionf(t) =et−2. Tracer ln(|xn−x|) en fonction de net interpr´eter le graphe.
Remarques:
• Il sera n´ecessaire de modifier la fonctiondicho en ajoutant un argument de sortie qui contiendra tous les it´er´esxn.
• Seule la partie `a peu pr`es rectiligne du graphe est exploitable. Pour ´evaluer la pente de cette partie, on peut tirer parti du graphe en choisissant convenablement deux points permettant de calculer ∆y/∆x mais on peut aussi utiliserpolyfit.
Exercice 5.
On sait que la suite un = 1 + 1
2 +· · ·+ 1
n −ln(n) converge vers la constante d’Euler γ dont une valeur approch´ee est 0.577 215 664 901 532.
De plus, sivn=un− 1
2n et wn =un− 1 2n+ 1
12n2, on a quandn−→ ∞
un−γ∼ 1 2n vn−γ∼ − 1
12n2 wn−γ=o
1
n3
Retrouver exp´erimentalement ces r´esultats. Pour chacune de ces suites : a. Evaluer l’ordre de convergencep. On pourra utiliser une bouclefor.
b. Evaluer la constanteC.
Ceci permet de pr´eciser exp´erimentalement le comportement dewn.
C - M´ethode de Newton
On reprend les notations du paragrapheA,f est une fonction num´erique d´efinie sur [a, b]. On suppose que xest l’unique solution de l’´equationf(u) = 0 et quef0 ne s’annule pas sur [a, b]. L’algorithme de lam´ethode de Newtons’´ecrit :
x0donn´e dans[a, b]
Sif0(x0) = 0−→Stop Sinon
On approche la fonction par sa tangentef0(x)au point(x0, f(x0)) et on r´esoutf0(x) = 0−→x1=x0−f(x0)/f0(x0)
On recommence l’op´eration pourx1`a la place dex0et ce jusqu’`a ce que le test d’arrˆet soit positif ou que le nombre maximum d’it´erations soit atteint.
Test d’arrˆet : L’it´eration s’arrˆete si|f(r)| < eps, pr´ecision donn´ee.
3
Exercice 6.
Ecrire une fonction´ newton.mqui met en œuvre la m´ethode de Newton. L’en-tˆete de cette fonction sera : function [r,k]=newton(f,fp,x0,eps,Nmax)
% M´ethode de Newton
% Arguments d’entr´ee :
% f : chaine de caract`eres qui fait r´ef´erence au nom de la fonction
% dont on cherche la racine (d’en-tete y = f(x))
% fp : chaine de caract`eres qui fait r´ef´erence au nom de sa d´eriv´ee
% x0 : valeur initiale
% eps : precision pour le test d’arret
% Nmax : nombre maximum d’iterations a realiser
% Arguments de sortie :
% r : valeur approchee de la racine (derni`ere it´er´ee)
% k : nombre d’it´erations r´ealisees
Faire les calculs pourf(x) =x4−3x2,eps = 1e−10,Nmax= 20 et montrer les r´esultats pour les 7 valeurs initialesx0 = 0.9 : 0.1 : 1.5 .
Outils graphiques
De puissants outils graphiques sont fournis par Matlab ; on en donne ici quelques exemples.
Graphes de fonctions
>> x=linspace(0,4,100);
>> y=sin(x);z=cos(x);
>> plot(x,y)
>> plot(x,z)
>> hold on
>> plot(x,y)
>> clf
>> plot(x,y,x,z)
>> clf
>> plot(x,y,’r’,x,z,’b--’)
>> loglog(x,abs(y))
Textes et l´egendes
>> legend(’sinus’,’cosinus’)
>> xlabel(’x’)
>> ylabel(’f(x)’)
>> title(’Graphes trigonometriques’)
Gestion des axes
>> axis off
>> axis on
>> axis equal
>> grid on
Partitionnement de la fenˆetre
>> figure(2)
>> subplot(1,3,1)
>> plot(x,y)
>> subplot(1,3,2)
>> plot(x,y,’r--’)
>> subplot(1,3,3)
>> plot(x,y,’go’)
Impression dans un fichier
>> print -f1 -deps fic
>> print -f2 -djpeg fic
4