a la matlab pour le calcul scienti que -...
TRANSCRIPT
Logiciels “a la matlab” pour le calcul scientifiqueExemples avec Scilab
Bruno Pincon
Institut Elie Cartan LorraineUniversite de Lorraine
Telecom Nancy
La Bolle, Ecole de calcul scientifiqueSeptembre 2014
1/84
Plan
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
2/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
3/84
Logiciels “a la matlab” quid ? #1
A la fin des annees 70, Cleve Moler (prof. d’analysenumerique et developpeur de LINPACK et EISPACK)ecrit un interprete (en fortran) dedie au calcul numerique.
C’est une revolution (pour les “numericiens”...)
le langage permet de manipuler matrices et vecteurs demaniere tres intuitive et compacte ;
l’interprete matlab utilise BLAS, LINPACK et EISPACK ;
assez bonnes performances pour les operations vectoriellesmais performances mediocres pour les operations scalaires(facteur 100) ;
tres grande facilite pour tester de nouveaux algorithmesnumeriques.
4/84
Logiciels “a la matlab” quid ? #2
Quelques “concurrents” :en 82, une equipe de l’INRIA a l’idee “d’augmenter” Matlabpour l’automatique (blaise, basile, puis scilab) ;
en 93, John Eaton sort la premiere version d’octave (devientun projet GNU) ;
par la suite : tela, FreeMat, Yorick, nsp, julia, ...
Autres logiciels :S (plutot dedie statistique) et son equivalent libre R (unprojet GNU) ;
python + numpy + scipy + matplotlib + ... + Spyder ;
Sage (calcul formel et calcul numerique).
5/84
Matlab aujourd’hui :
langage simple (et pas de compilation, ...)
un environnement complet de programmation (editeur integreintelligent, editeur graphique, visualisation des variables,GUI,... ) ;
possibilites graphiques etendues ;
interfacage possible avec d’autres langages (C, fortran,...) ;
tres nombreuses boıtes a outils (toolboxes) ;
un site d’echange pour les toolboxes gratuites ;
standard de facto pour les chercheurs en analyse numerique,en traitement du signal et en automatique ;
integration des meilleurs codes numeriques actuels (Sparsesuite, CGAL, ...) ;
fourni avec un BLAS optimise pour chaque plateforme ;
utilise les possibilites multi-coeurs de maniere transparente ;
compilation a la volee en assembleur dans certains cas (JIT).
6/84
Scilab aujourd’hui :
Logiciel libre (CeCILL), similaire a Matlab (mais pas tout a faitcompatible...) :
nombreuses primitives de calcul en algebre lineaire (matricespleines et creuses), pour resoudre des equations differentielles,pour l’optimisation, etc...assez bonnes possibilites graphiques ;environnement utilisateur d’assez bon niveau ;utilisation tres restreinte des multi-coeurs, pas de JIT ;possibilite d’utiliser MPI en recompilant ;systeme de toolboxes “officielles” avec installationautomatisee (ATOMS).
L’histoire de Scilab :commence en 1982 a l’INRIA;organisation en consortium depuis 2003 et jusqu’a Juin 2012;depuis developpement par une entreprise privee : ScilabEnterprises.
7/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
8/84
Buts du TP
decouvrir ce type de langage et un certain nombre defonctionnalites a travers plusieurs exemples et exercicesprecedes d’explications succinctes ;
decouvrir les limites du logiciel ;
exemples et/ou exercices imposes (bases sur la notationvectorielle, la programmation et le graphique) puis differentschoix possibles... (correction de tous les exercices integree).
C’est parti : lancer scilab svp ;-)
9/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
10/84
L’environnement scilab #1
Beaucoup de fenetres ! (pour les allergiques scilab -nw)
11/84
L’environnement scilab #2
Un principe :Toutes lignes de code scilab entrees directement dans lafenetre de commande ⇐⇒ ecrire ces lignes dans unfichier avec l’aide de l’editeur SciNotes (ou autre...) et“d’executer/charger” ce fichier dans scilab.
Executer/charger un fichier (de commandes) dans scilab :
en utilisant le menu de SciNotes ou directement en cliquantsur l’icone B
en entrant la commande “exec nom du fichier” dans lafenetre de commande.
12/84
L’environnement scilab #3
Interactions basiques avec le systeme :
pwd // repertoire positionne par scilab
ls // fichiers de ce repertoire
cd // vers le repertoire de base (HOME)
mkdir("Exos_scilab") // creation repertoire pour le TP
cd Exos_scilab // ou bien cd("Exos_scilab")
Verifions que le graphique fonctionne :
x = linspace(-%pi,%pi,11); // maillage de [-pi,pi] a 11 pts.
y = cos(x)./(1+x.^2); // (%pi est une constante scilab)
clf() // nettoie la fenetre graphique (courante)
plot(x,y,’b’)
13/84
L’environnement scilab #4
Pour obtenir de l’aide :
soit directement dans la fenetre du Help (cliquer sur ? si ellen’est pas presente)
ou encore en entrant help motcle dans la fenetre decommande.
Exercice 1
1 Recopier les lignes precedentes dans un fichier avec Scinote(ou autre editeur) ; la tradition est de suffixer les scripts en.sce.
2 Executer le fichier dans scilab ;
3 Modifier le script en jouant avec le nombre de points, lalongueur de l’intervalle et/ou la couleur du dessin (’b’, ’g’,’r’, ’k’, ’c’, ’m’ pour bleu, vert, rouge, noir, cyan etmagenta).
14/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
15/84
Definir des vecteurs et des matrices I
Les objets de base de scilab sont les vecteurs et les matrices deflottants.
les scalaires sont en fait des matrices 1x1
les vecteurs sont des matrices avec une ligne ou une colonne.
Definir une matrice a partir de ses coefficients
A = [1, 2, 3; 4, 5, 6] // ";" introduit une nouvelle ligne
x = [0 ; 1; 0] // un vecteur colonne
y = [exp(%pi), sin(%e)] // un vecteur ligne
Remarques:
si la definition est terminee par un point virgule pas d’affichage
les coefficients peuvent etre donnes par des expressions.
16/84
Definir des vecteurs et des matrices II
Definir une matrice a partir d’autres matrices
La meme syntaxe fonctionne si les scalaires sont remplaces par desmatrices ou des vecteurs :
la virgule (ou le blanc) introduit une concatenation a droiteavec une matrice ayant le meme nombre de lignes
le point-virgule introduit une concatenation en dessous avecune matrice ayant le meme nombre de colonnes.
Testez :
B = [A ; y , 1]
C = [B, x] // C peut etre construite directement avec [[A ; y, 1],x]
17/84
Definir des vecteurs et des matrices III
Quelques constructeurs de vecteurs et matrices
1 linspace(a,b,n) cree un maillage uniforme de [a, b] avec npoints
2 zeros(m,n) et ones(m,n) creent de matrices m× n de 0 etde 1.
3 eye(m,n) retourne une matrice “identite” m× n.
4 A*B est le produit matriciel de A par B (ou entre un scalaireet un vecteur ou une matrice).
5 A’ correspond a la transposition de la matrice A.
6 rand(m,n) matrice de nombres aleatoires (loi uniforme dans[0,1[).
7 Si la matrice A est carree et inversible on peut resoudre lesysteme lineaire Ax = b avec x = A\b.
18/84
Definir des vecteurs et des matrices IV
8 Si x est un vecteur A=diag(x,k) construit une matrice“diagonale” (carree) constituee de 0 avec le vecteur x commediagonale k.
(1,1)
(2,1)
(3,1)
(4,1)
(1,2)
(2,2)
(3,2)
(4,2)
(1,3)
(2,3)
(3,3)
(4,3)
(1,4)
(2,4)
(3,4)
(4,4)
(1,5)
(2,5)
(3,5)
(4,5)
k=2k=1
k=0
k=−1
k=−2
lower
upperk=3
9 si A est une matrice (mais pas un vecteur) diag(A,k) extraitla diagonale k comme un vecteur colonne.
10 la fct size permet de recuperer les dimensions d’un tableau :[m,n] = size(A), m = size(A,1), n = size(A,2), mn =
size(A,’*’).
19/84
Definir des vecteurs et des matrices V
Une construction essentielle, testez :
I = 1:5
J = 1:2:6 // essayez aussi J = 1:2:7
K = 10:-1:5
II = 1:0 // on obtient une matrice vide
La syntaxe est val int:inc:lim. On obtient un vecteur ligneavec val init comme premier coefficient, les autres composantesetant obtenues en ajoutant successivement inc tant que lim n’estpas “depassee”. Remarques :
si l’increment inc n’est pas donne, il est egal a 1 ;
quand inc est positif et val_init > lim ou quand inc estnegatif et val_init < lim on obtient une matrice vide.
Tres utile pour extraire/assigner sous-vecteurs et sous-matrices etpour piloter les boucles for.
20/84
Exercice recapitulatif I
Exercice 2 Ecrire un script scilab exercice2.sce qui:
1 donne une valeur a la variable n puis definit la matrice n× n :
A =
2 −1 0 · · · 0
−1. . .
. . .. . .
...
0. . .
. . .. . . 0
.... . .
. . .. . . −1
0 · · · 0 −1 2
fonctions utiles : ones, diag, (eye).
2 definit un vecteur b ∈ Rn avec rand(n,1), calcule la solutionde Ax = b, on pourra :
mesurer le temps avec : tic(); x = A\b; tc = toc();
afficher avecprintf("\n n = %d; temps calcul : tc = %g\n",n,tc)
puis calcule le residu relatif ‖Ax− b‖/‖b‖ (utiliser norm).
21/84
Exercice recapitulatif II
3 calcule la quantite E = 12x>Ax− b>x ; (definir un autre
vecteur y ∈ Rn avec rand, calculer F = 12y>Ay − b>y et
verifier que E < F ).
4 les limites de scilab : tester avec des valeurs de n de plus enplus grande (n = 10, 100, 500, 1000, 2000, ...) ca craqued’abord avec la memoire ! Vers n = 2000 on a un messaged’erreur... Remede : stacksize(20e6) ou encorestacksize(’max’). Neanmoins ici on pourrait allerbeaucoup plus loin en utilisant la structure creuse de lamatrice.
22/84
exercice 2: solution
n = 500;
v = -ones(1,n-1);
A = diag(v,-1) + 2*eye(n,n) + diag(v,1);
// autre solution
// A = diag(v,-1) + diag(2*ones(1,n)) + diag(v,1)
b = rand(n,1);
tic(); x = A\b; tc = toc();
printf("\n n = %d; temps calcul : tc = %g\n",n,tc)
res = norm(A*x-b)/norm(b)
E = 0.5*x’*A*x - b’*x
y = rand(n,1);
F = 0.5*y’*A*y - b’*y
E < F
23/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
24/84
Assignations et extractions I
La syntaxe de base est :
nom var = expression
ou la variable nom var est cree (ou redefinie si elle existe deja)Rmq: sans partie gauche, cad avec :
expression
le resultat de expression est mis dans une variable par defautappelee ans.
Il est possible de changer juste une sous-partie d’une matrice.Attention l’indexation commence a 1 et pas a 0 :
le premier element d’un vecteur x est x(1) , pas x(0) nix[1].
25/84
Assignations et extractions II
Essayez :
A = rand(3,4) // creation d’une matrice
A(2,2) = -1 // modification du coef (2,2) de A
c = A(2,3) // extraction du coef (2,3) de A (mis dans c)
A(2,:) // extraction de la ligne 2 de A (mis dans ans)
A(2,:) = ones(1,4) // on change la ligne 2 de A
A(:,3) = 0 // on change la colonne 3 de A
B = A([1,3],[1 2]) // on extrait une sous-matrice (mise dans B)
A([1,3],[1 2]) = [-10,-20;-30,-40] // on modifie la meme sous-matrice
La syntaxe la plus complete est :A(row_ind,col_ind)= RHS // assignation
var = A(row_ind,col_ind) // extraction (et assignation a var)
dans laquelle on specifie dans chaque dimension un vecteurd’indices. Raccourcis utiles, le caractere : designe l’etenduecomplete d’une ligne ou d’une colonne, le caractere $ designe ledernier element (end en matlab).
26/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
27/84
L’algebre “element par element” et la fonction plot I
Les operateurs .*, ./ et .^ sont tres utiles :
1 Si x et y sont des matrices de memes dimensions:
z=x.*y est le produit element par element, cad zi,j = xi,jyi,jz=x./y est la division element par element, cadzi,j = xi,j/yi,j .Raccourci utile: si s est un scalaire, z=s./y donnezi,j = s/yi,j attention z=1./y ne fonctionne pas comme onpeut s’y attendre ! (utilisez z=1 ./y).
2 si x est une matrice et p un scalaire:
z=x.^p correspond a: zi,j = xpi,j .et =p.^x, donne zi,j = pxi,j .
La fonction plot permet de dessiner une ou plusieurs courbes :
plot(x1,y1[,style1],x2,y2[,style2], ....)
28/84
L’algebre “element par element” et la fonction plot II
ou style est une chaıne de caracteres optionnelle permettant dedefinir la couleur, le type de la ligne et/ou le symbole utilise pourdessiner (les chaınes scilab se delimitent avec ’toto’ ou "toto").
x = linspace(0,2*%pi,31);
y1 = sin(x); y2 = cos(x);
scf(0); // selectionne la fenetre 0 (comme fenetre graphique courante)
clf(); // efface la fenetre courante
plot(x,y1,"b-",x,y2,"r--"); // des lignes bleu et rouge
scf(1); // la fenetre 1 devient la fenetre courante
clf(); //
subplot(2,1,1); // decoupe la fenetre vert. en 2, on utilise le haut
plot(x,y1,"ro",x,y2,"bx"); // dessin avec symboles
subplot(2,1,2); // idem mais on utilise la partie basse
plot(x,y1,"r--o",x,y2,"g-x"); // dessin avec lignes et symboles
Rmq : les fonctions mathematiques usuelles sin, cos, exp, log,cosh, sinh, tan,... fonctionnent aussi vectoriellement.
29/84
L’algebre “element par element” et la fonction plot III
couleurs
k black c cyanb blue m magentar red y yellowg green w white
types de lignes
- solid-- dashed: dotted-. dashdot
symboles
+ + d ♦x × v Oo © s �* ∗ ^ 4
Comment jouer avec plusieurs fenetres graphiques :scf(num) selectionne num comme fenetre courante
show window() mise en avant de la fenetre courante
clf() efface la fenetre courante
xdel(num) detruit la fenetre num
Annotations graphiques :
titre : title(chaıne titre).
labels en x et y : xlabel(chaınes xlabel) etylabel(chaıne ylabel)
legende : legend(leg courbe1, leg courbe2,...)
notation latex possible en entourant les chaınes avec des $
30/84
algebre “element par element” et fct plot : exercice
Exercice 3
1 Dans la fenetre 0, dessiner la fonction f(x) = 11+x2
en bleu
pour x ∈ [−4, 4] et la fonction g(x) = cos(πx)e−|x| en rougepour x ∈ [−5, 5]. Aide : la valeur absolue est abs, utiliserlinspace pour la discretisation des intervalles. Exempled’utilisation de la notation latex pour la legende :
legend(’$\frac{1}{1+x^2}$’, ’$\cos(\pi x) e^{-|x|}$’);
hleg = gce(); hleg.font_size=4;
2 Dans la fenetre 1, tracer le cercle x2 + y2 = 1 et l’ellipse(x/2)2 + (y/0.9)2 = 1. Aide : utiliser les representationsparametriques usuelles x = cos(t), y = sin(t), t ∈ [0, 2π] pourle cercle et x = 2 cos(t), y = 0.9 sin(t), t ∈ [0, 2π] pourl’ellipse. Ajouter une legende. Pour obtenir une echelleisometrique :
haxes = gca(); // identificateur du systeme d’axes courant
haxes.isoview = "on"; // "off" par defaut
31/84
exercice 3 : solution I
// courbes 1 et 2 dans la fenetre 0
x1 = linspace(-4,4,101);
y1 = 1 ./(1+x1.^2);
x2 = linspace(-5,5,101);
y2 = cos(%pi*x2).*exp(-abs(x2));
scf(0);
clf();
plot(x1,y1,’b’,x2,y2,’r’);
legend(’$\frac{1}{1+x^2}$’, ’$\cos(\pi x) e^{-|x|}$’);
hleg = gce(); hleg.font_size=4;
title("Des courbes","FontSize",5);
32/84
exercice 3 : solution II
// cercle et ellipse dans la fenetre 1
theta = linspace(0,2*%pi,200);
x3 = cos(theta);
y3 = sin(theta);
x4 = 2*cos(theta);
y4 = 0.9*sin(theta);
scf(1);
clf();
plot(x3,y3,’b’,x4,y4,’r’)
legend(’circle’, ’ellipse’)
hleg = gce(); hleg.font_size=3;
haxes = gca();
haxes.isoview = "on";
33/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
34/84
Elements de programmation I
1 Les fonctionsUne fonction scilab est definie de la facon suivante :
function [y1,y2,...,yn] = nom_fonction(x1,x2,..xm)
// le corps de la fonction doit definir les arguments de sortie y1,...,yn
// a l’aide des arguments d’entree x1,...,xm
.............
endfunction
Une telle definition peut etre ecrite dans un script (avant lapartie du script qui l’utilise) ou dans un fichier independant(dont le nom est traditionnellement suffixe en .sci). On peutecrire autant de fonctions que l’on veut. Pour faire connaıtrela definition de ces fonctions il faut executer le fichier (commepour un script).
Rmq : difference importante avec matlab, octave,...
35/84
Elements de programmation II
Un exemple, ecrivez dans un fichier (par exemple quad.sci):
function [x1,x2] = resout_quad(a,b,c)
// solve a x^2 + b x + c = 0
delta = b^2 - 4*a*c
x1 = (-b + sqrt(delta))/(2*a);
x2 = (-b - sqrt(delta))/(2*a);
endfunction
Executez ce fichier puis essayez dans la fenetre de commande :
[r1,r2] = resout_quad(1,0,1) // scilab passe en arith. complexe
[r1,r2] = resout_quad(0,1,1) // pas une equation quadratique
resout_quad(1,0,-1) // ans retient le premier resultat
// mais la seconde racine est perdue !
[r1,r2] = resout_quad(1,0,-1) // la on recupere les 2 racines
36/84
Elements de programmation III
2 Les tests if
if expr_bool then
// bloc execute si expr_bool est vraie
.....
else
// bloc execute si expr_bool est fausse
.....
end
If en cascade :if expr_bool1 then
// bloc execute si expr_bool1 est vraie
.....
elseif expr_bool2 then
// bloc execute si expr_bool1 fausse et expr_bool2 vraie
.....
else
// bloc execute si expr_bool1 et expr_bool2 fausses
.....
end
37/84
Elements de programmation IV
3 Les boucles for . Une forme generale est :
for i = vect_ligne
// corps de la boucle
.....
end
le nombre d’iterations est egal au nb de composantes duvecteur lignea l’iteration k la variable de la boucle i est egale avect_ligne(k).Pour se ramener a des boucles “usuelles” on utilisefirst val:inc:lim comme vecteur ligne.
Essayez :
n = 5; fact_n = 1;
for i = 1:n, fact_n = i*fact_n, end
38/84
Elements de programmation V
On peut sortir prematurement d’un for avec un break :
for i = 1:n
.....
if expr_bool then, break, end
....
end
4 Les boucles while
while expr_bool
// corps de la boucle
....
end
Essayez :
x = 1;
while x < 1000, x = 2*x, end
On peut aussi sortir prematurement d’un while avec un break.
39/84
Elements de programmation VI
Problematique : comment ecrire des fonctions efficaces ?Si on ecrit un code scilab de maniere “classique”, c’est souventlent (car interprete). Et meme avec matlab la compilation a lavolee (JIT) impose des contraintes (pas d’appels a une autrefonction “utilisateur” dans un script ou une fonction).
Remede : il faut penser vectoriel, cad utiliser le plus possible desfonctions et operateurs qui pourront agir “globalement” sur unvecteur ou une matrice (cf exercices suivants).Rmq :
l’ecriture vectorielle est parfois naturelle, dans le cas contraireon peut obtenir des codes pas tres lisibles ;
ce n’est pas toujours possible ! D’ou l’ecriture d’une partie ducode en langage compile avec celle d’une interface (c’est unpeu lourd), d’ou le JIT de Matlab ou encore le developpementde Julia (base sur LLVM).
40/84
Un exemple de vectorisation I
On cherche a calculer la matrice suivante (appelee Vandermonde) :
A =
1 t1 t21 . . . tn11 t2 t22 . . . tn2...
......
......
1 tm t2m . . . tnm
Voici un premier code assez naturel :
function A=vandm1(t,n)
m=size(t,’*’)
for i = 1:m
for j = 1:n+1
A(i,j) = t(i)^(j-1)
end
end
endfunction
mais qui n’est pas optimal par rapport a la gestion de la memoire.
41/84
Un exemple de vectorisation II
exec exemple_vect1.sci; // fichier fourni
t = linspace(0,1,1000);
tic(); A = vandm1(t,1000); toc() // donne 3.5 s
Il faut reserver la taille de A (avec un zeros ou un ones) :
function A=vandm2(t,n)
m=size(t,’*’)
A = zeros(m,n+1) // declaration...
for i = 1:m
for j = 1:n+1
A(i,j) = t(i)^(j-1)
end
end
endfunction
tic(); A = vandm2(t,1000); toc() // donne 1.6 s
On peut continuer a optimiser ce code scalaire mais on ne gagnepas beaucoup ! La bonne methode est d’utiliser l’ecriturevectorielle.
42/84
Un exemple de vectorisation III
function A=vandm3(t,n)
m=size(t,’*’)
t = t(:) // t doit etre un vecteur colonne dans la suite
A=ones(m,n+1)
for i=1:n
A(:,i+1)=t.^i
end
endfunction
tic(); A = vandm3(t,1000); toc() // donne 0.058 s
et avec une optimisation sur le calcul des puissances :
function A=vandm4(t,n)
m=size(t,’*’)
t = t(:)
A=ones(m,n+1)
for i=1:n
A(:,i+1)=A(:,i).*t
end
endfunction
tic(); A = vandm4(t,1000); toc() // donne 0.030 s : on gagne un facteur 100 !
43/84
Un autre exemple de vectorisation I
Soit la fonction f(x) =
0 pour x ≤ −214(x+ 2)2 pour x ∈ [−2, 0]1 + sin(x) pour x ∈ [0, π]
e−(x−π) pour x ≥ π
que l’on veut ecrire “vectoriellement”. Un code naturel est :
function y=toto(x)
y = zeros(x)
for k = 1:size(x,"*")
xx = x(k)
if xx >= %pi then
y(k) = exp(-(xx-%pi))
elseif xx >= 0 then
y(k) = 1 + sin(xx)
elseif xx >= -2
y(k) = 0.25*(xx+2)^2
end
end
endfunction
44/84
Un autre exemple de vectorisation II
Cependant avec la boucle plus les tests, le code sera lent sur ungros vecteur... Pour diminuer le travail de l’interprete, on peututiliser la fonction find :
function y=totov(x)
y = zeros(x)
i1 = find(-2 < x & x <= 0)
i2 = find(0 < x & x <= %pi);
i3 = find(x > %pi)
y(i1) = 0.25*(x(i1)+2).^2
y(i2) = 1 + sin(x(i2))
y(i3) = exp(-(x(i3)-%pi))
endfunction
ce qui accelere le code (ici un facteur 25) :
exec exemple_vect2.sci // fichier fourni
x = linspace(-2.5,8,1e5); // un grand vecteur
tic(); y = toto(x); toc() // 0.44 s
tic(); y = totov(x); toc() // 0.017 s
45/84
Exercice de programmation et vectorisation I
Exercice 4 Interpolation de Lagrange.Soit x1, x2, . . . , xn, n reels distincts (les abscisses) et y1, . . . , yn nreels quelconques. On sait qu’il existe un unique polynome p dedegre ≤ n− 1 tel que p(xi) = yi, i = 1, . . . , n que l’on peutconstruire dans la base de Lagrange (associee aux abscisses xi) :
p(t) =
n∑i=1
yiLi(t), ou Li(t) =n∏j=1
j 6=i
t− xjxi − xj
1 Ecrire une fonction lagrange(t,x,y) qui calcule cepolynome en les abscisses tk du tableau t. La fonction doitretourner un tableau de meme dimension que t. Une premierepossibilite est la suivante (fichier exo4.sci) :
46/84
Exercice de programmation et vectorisation II
function p=lagrange1(t,x,y)
n=size(x,’*’); m = size(t,’*’); p = zeros(t)
for k = 1:m // calcul de p(k)
for i = 1:n
// calcul de Li(t(k))
Li = 1
for j = 1:n
if j ~= i then
Li = Li * ((t(k) - x(j))/(x(i) - x(j)))
end
end
p(k) = p(k) + y(i)*Li
end
end
endfunction
Le but de l’exercice d’essayer d’ecrire le code vectoriellementde maniere a se passer de la boucle externe sur lescomposantes de t (Aide : initialiser Li avec ones(t) etutiliser l’operateur .*).
47/84
Exercice de programmation et vectorisation III
2 Testez le gain obtenu avec la version vectorielle. Par exemple :
t = linspace(-2,2,200); // 200 abscisses d’evaluation
x = linspace(-2,2,30); y = rand(x); // 30 points d’interpolation
tic(); p = lagrange1(t,x,y); toc()
tic(); p = lagrange2(t,x,y); toc()
3 Ecrire une fonction scilab runge qui calcule la fonction deRunge x 7→ 1
1+x2“vectoriellement” (cela a deja ete fait dans
l’exercice 3).
4 Ecrire un script permettant de tester votre fonction sur lafonction sin sur [0, 2π] (ou [0, π/2]) et sur la fonction deRunge sur [−4, 4] avec n abscisses d’interpolation et mabscisses evaluation toutes equidistantes (linspace). Illustrergraphiquement (traces des courbes “exactes”, des polynomes,des points d’interpolation (symboles)) et tester votre scriptavec differentes valeurs de n (par exemple n = 7, 13, 20, ...).
48/84
Solution de l’exercice I
function p = lagrange2(t,x,y)
// t : abscisses d’evaluation du polynome d’interpolation
// x, y : points d’interpolation
p = zeros(t)
n = size(x,"*")
for i = 1:n
// calcul du i eme monome L_i(t) (on peut utiliser une autre fonction)
Li = ones(t)
for j = 1:n
if j ~= i then
Li = Li.*((t-x(j))./(x(i)-x(j)))
end
end
p = p + y(i)*Li
end
endfunction
function y=runge(t)
if isempty(t) then, y = t, else, y = 1 ./(1 + t.^2), end
endfunction
49/84
Solution de l’exercice II
// 1- test avec sinus
t = linspace(0,2*%pi,200); // abscisses d’evaluation pour visualisation
ye = sin(t); // ordonnees exactes
// points d’interpolation
n = 7;
x = linspace(0,2*%pi,n);
y = sin(x);
yi = lagrange2(t,x,y); // resultat
// visu
scf(1); clf()
plot(x,y,’ok’,t,ye,’b’,t,yi,’r’)
title(’ Interpolation de sin avec ’+string(n)+’ points’)
legend("points","sin","interp")
// 2- test avec runge
tr = linspace(-4,4,200); // abscisses d’evaluation pour visualisation
yre = runge(tr); // ordonnees exactes
// points d’interpolation
50/84
Solution de l’exercice III
nr = 9;
xr = linspace(-4,4,nr);
yr = runge(xr);
yri = lagrange2(tr,xr,yr); // resultat
// visu
scf(2)
clf()
plot(xr,yr,’ok’,tr,yre,’g’,tr,yri,’r’)
title(’ Interpolation de la fct de Runge avec ’+string(nr)+’ points’)
legend("points","runge","interp")
51/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
52/84
Graphiques avec scilab I
Le systeme graphique par objets
Legend
Compound
Polyline
Polyline
(string)TextPolyline
(string)Text
Surface
(coordinates sys.)
(coordinates sys.)
(window)Axes
Axes
Figure
Le niveau “Figure” est le plus eleve de la hierarchie;l’identificateur (handle) de la figure courante est obtenu avechf = gcf();
53/84
Graphiques avec scilab II
Le niveau “Axes” precise a la fois une sous-partie de la fenetreet un systeme de coordonnees ; l’identicateur du systeme d’“Axes” courant s’obtient avec : ha = gca();
ha = gca();
ha.data_bounds = [xmin,ymin;xmax,ymax]; // precise le rectangle de visualisation
ha.isoview = "on"|"off"; // echelle isometrique
ha.log_flags="nn"|"nl"|"ln"|"ll"; // echelle log
Le dernier niveau est compose des objets graphiques de base“Polyline”, “Surface”, “Text”, “Legend”, etc... ou de“Compounds”, qui encapsulent plusieurs objets de base (etd’autres “Compounds”). Par exemple plot rassemble lescourbes crees (“Polylines”) dans un objet “Compound”. Onrecupere l’identificateur du dernier objet graphique cree aveche = gce().
54/84
Graphiques avec scilab III
Essayez :
clf();
x = linspace(0,2*%pi,81);
y1 = cos(x);
y2 = sin(x);
plot(x,y1,"b",x,y2,"r"); // dessin de cos en bleu et de sin en rouge
he = gce(); // compound des 2 polylines
hsin = he.children(1); // handle de la 2 eme courbe (ordre inverse !)
// modification de qq proprietes
hsin.thickness = 4; // trait plus epais
hsin.foreground = 6; // changement de couleur (indice d’une colormap)
//
hcos = he.children(2); // handle de la 1 ere courbe
hcos.line_style = 2; // dessin en tirets
// options de plot
clf()
plot(x,y1,"color",[0,0,1],"linestyle","--")
plot(x,y2,"color",[1,0,0],"thickness",4)
55/84
Quelques figures realisees avec scilab I
Exemples disponibles dans le fichier galerie graphique.sce
clf();
x = linspace(0,2*%pi,11);
plot(x,sin(x),"r--o","markforeground",[0,0.3,0],"marksize",10);
ha = gca();
ha.x_location = "origin"; ha.y_location = "origin"; ha.box = "off";
title("Axes centres a l’’origine","fontsize",4,"fontname",7)
56/84
Quelques figures realisees avec scilab II
clf();
x = linspace(-1,1,11);
y = (x+1).*(x-1);
plot(x,y,"b",x,y,"r","thickness",2)
he = gce(); hc = he.children(1); hc.polyline_style = 2;
title("Trace classique versus en escaliers","fontsize",4)
57/84
Quelques figures realisees avec scilab III
clf();
x = -5:5;
plot(x,abs(x)-1.5,"-","foreground",[0,0.3,0],"thickness",4)
he = gce(); hc = he.children(1); hc.polyline_style = 3;
hc.line_mode = "off";
xgrid(color("grey"));
title("En batons","fontsize",4)
58/84
Quelques figures realisees avec scilab IV
clf();
x = logspace(-3,3,100); y = x + x.^4;
plot(x,y,"-","foreground",[0.6,0,0],"thickness",4)
ha = gca(); ha.log_flags = "ll";
xgrid(color("grey"));
title("Echelle log-log","fontsize",4)
59/84
Quelques figures realisees avec scilab V
function z = chameau(x,y)
z = (4 - 2.1*x.^2 + (x.^4)/3).*x^2 + x.*y + (-4+4*y.^2).*y.^2
endfunction
nx = 200; x = linspace(-1.9,1.9,nx);
ny = 100; y = linspace(-1.1,1.1,ny);
nv = 14; // nb de lignes isovaleurs
clf(); hf = gcf(); hf.color_map = jetcolormap(nv);
contour2d(x,y,chameau,nv); title("Le chameau a 6 bosses","fontsize",4)
60/84
Quelques figures realisees avec scilab VI
clf()
hf = gcf(); hf.color_map = jetcolormap(64);
[X,Y] = meshgrid(x,y); Z = chameau(X,Y);
surf(X,Y,Z); he = gce(); he.color_flag = 3; he.color_mode = -1;
colorbar(min(Z),max(Z))
title("Le chameau a 6 bosses","fontsize",4)
61/84
Quelques figures realisees avec scilab VII
function [x,y,z] = moebius(theta, rho)
x = (2 + rho.*sin(theta/2)).*cos(theta)
y = (2 + rho.*sin(theta/2)).*sin(theta)
z = rho.*cos(theta/2)
endfunction
theta = linspace(0,2*%pi,80); rho = linspace(-0.5,0.5,10);
[Theta,Rho] = meshgrid(theta,rho); [X,Y,Z] = moebius(Theta,Rho);
clf(); id1 = color("lightsteelblue"); id2 = color("steelblue")
surf(X,Y,Z); hs = gce(); hs.hiddencolor=id2; hs.color_flag=0;
hs.color_mode = id1; hs.foreground = color("black");
ha = gca(); ha.isoview = "on"; ha.cube_scaling = "off";
title("Un ruban de Moebius","fontsize",4)
62/84
Quelques figures realisees avec scilab VIII
Quelques autres possibilites graphiques :
trace de champs de vecteurs 2d avec champ (pour les champs3d il faut coder en utilisant la primitive xarrows) ;
courbes en 3d avec param3d ;
histogrammes avec histplot ;
representations 2d avec couleurs pour la 3 eme dimension :grayplot, Sgrayplot, et fec pour une fonction definie surune triangulation ;
“images” avec Matplot : a partir de la version 5.5 il estpossible de visualiser une image TrueColor mais pas defonction pour lire les formats usuels (png, jpg,...) : il faututiliser une toolbox externe avec ATOMS.
fonctions elementaires (segments, polygones, etc...)
dessins specialises pour l’automatique.
63/84
***
1 Logiciels “a la matlab” quid ?
2 Buts du TP
3 L’environnement scilab
4 Definir des vecteurs et des matrices
5 Assignations et extractions
6 L’algebre “element par element” et la fonction plot
7 Elements de programmation
8 Graphiques avec scilab
9 Exercices (au choix)Statistiques elementaires, lecture de fichiers csvResoudre une equation differentielleIdentification des parametres d’un modele
64/84
Statistiques elementaires, lecture de fichiers csv I
Exercice 5 La temperature a Nancy au mois de Juillet !Donnees obtenues sur le site http://www.infoclimat.fr. Le fichiertemp_nancy_juillet.csv a la structure suivante :
Date UTC T◦ (C)
01/07/14 00h00 12.1
01/07/14 03h00 9.8
01/07/14 06h00 13.9
........
ou les 2 champs verticaux sont separes par une tabulation (ledefaut des csv est la virgule).
1 Lecture du fichier csv : la fonction qui permet de lire un telfichier est csvRead. Dans notre cas on utilisera :
M = csvRead("temp_nancy_juillet.csv","\t",[],"string");
on recupere alors une matrice de chaınes de caracterescomportant 2 colonnes.
65/84
Statistiques elementaires, lecture de fichiers csv II
Pour recuperer les donnees numeriques de la deuxiemecolonne on utilisera :
n = size(M,1); // doit etre egal a 1 + 31*8 = 249
temp = evstr(M(2:n,2)); // evstr evalue un texte comme du code scilab.
2 Dans la fenetre 0, tracer l’evolution de la temperature des 5premiers jours (jusqu’au 6 juillet a 00h), cad des8× 5 + 1 = 41 premieres composantes de temp. Pour obtenirune graduation sympatique de l’axe des “x” :
ha = gca();
pos_xticks = 1:8:41; lab_xticks = string(1:6)+" juil";
ha.x_ticks = tlist(["ticks","locations","labels"],pos_xticks,lab_xticks)
Pour rajouter une grille :idgrey = color("grey");
xgrid(idgrey)
Pour le label en “y” on pourra utiliser la chaıne M(1,2).
66/84
Statistiques elementaires, lecture de fichiers csv III
3 Pour faire quelques statistiques il va etre plus simple dereformatter le vecteur des temperatures comme une matrice8× 31 ou la premiere ligne correspondra a la temperature a 0H, la deuxieme a 3 H, etc... La bonne fonction est matrix,voir le help.
4 Calculer la moyenne, la medianne et l’ecart type destemperatures pour chaque heure des releves journaliers (0 H,3 H, 6 H, etc... (fonctions : mean, median, stdev). Pourtravailler “vectoriellement” on utilisera le deuxieme argumentde ces fonctions. Sortir les resultats dans la console ; onpourra utiliser le code suivant :printf("\n stats temperatures a Nancy au mois de juillet :\n")
printf("\n heure | T◦ moy | T◦ medianne | ecart type")
printf("\n -------+--------+-------------+-----------\n")
for k = 1:8
printf(" %2d h | %3.1f | %3.1f | %2.1f \n",3*(k-1),moy(k),med(k),ec(k) )
end
67/84
Statistiques elementaires, lecture de fichiers csv IV
5 Dans la fenetre 1, tracer un histogramme des temperatures a15 H (help histplot). Prendre par exemple 7 classes (premierparametre de histplot). Par defaut histplot “normalise” lesdonnees pour obtenir une densite de probabilite. Tracer lesdeux histogrammes (le “normalise” et le non normalise) dansla meme fenetre en utilisant 2 instructions subplot.
68/84
Statistiques elementaires, lecture de fichiers csv V
Solution
M = csvRead("temp_nancy_juillet.csv","\t",[],"string");
n = size(M,1); // doit etre egal a 1 + 31*8 = 249
temp = evstr(M(2:n,2));
// dessin de la temperature des 5 premiers jours de juillet
scf(0); clf()
plot(temp(1:41),"bo-","thickness",2);
ha = gca();
ha.x_ticks = tlist(["ticks", "locations", "labels"],1:8:41,string(1:6)+" juil")
ha.sub_ticks = [6,1];
idgrey = color("grey");
xgrid(idgrey)
ylabel(M(1,2),"fontsize",3)
title("Courbe de temperature a Nancy des 5 premiers jours de juillet","fontsize",3)
// mise sous la forme d’un tableau 2d
Temp = matrix(temp, 8,31);
// stats
moy = mean(Temp,2);
med = median(Temp,2);
ec = stdev(Temp,2);
// impression des resultats dans la console
printf("\n stats temperatures a Nancy au mois de juillet :\n")
printf("\n heure | T◦ moy | T◦ medianne | ecart type")
printf("\n -------+--------+-------------+-----------\n")
69/84
Statistiques elementaires, lecture de fichiers csv VI
for k = 1:8
printf(" %2d h | %3.1f | %3.1f | %2.1f \n",3*(k-1),moy(k),med(k),ec(k) )
end
// histogrammes des temperatures a 15 h
T15 = Temp(6,:); // 6 est l’index pour 15 h
scf(1); clf();
subplot(1,2,1)
histplot(7,T15,style=2);
title("histogramme normalise","fontsize",3)
subplot(1,2,2)
histplot(7,T15,style=5,normalization=%f);
title("histogramme non normalise","fontsize",3)
70/84
Resoudre une equation differentielle I
Scilab permet assez simplement de resoudre une equationdifferentielle (avec condition initiale) :{
u′ = f(t, u)u(t0) = u0
(u(t) est un vecteur de Rn, f une fonction de R× Rn −→ Rn, etu0 ∈ Rn) a l’aide de la fonction ode :
1 Il faut ecrire le second membre f comme une fonction Scilabavec la syntaxe :
function [f] = MonSecondMembre(t,u)
//
ici le code donnant les composantes de f en fonction de t et
des composantes de u.
Rmq : mettre t comme argument meme si l’equation est autonome
(cad meme si f ne depend pas explicitement de t).
endfunction
71/84
Resoudre une equation differentielle II
2 Un appel a ode pour resoudre l’equation (l’integrer) de t0 aT , en partant de u0 (un vecteur colonne), et en voulantrecuperer la solution aux instantst(1) = t0, t(2), ..., t(m) = T , prendra l’allure suivante :
t = linspace(t0,T,m);
[U] = ode(u0,t0,t,MonSecondMembre)
On recupere alors une matrice de format (n,m) telle queU(i,j) est la solution approchee de ui(t(j)) (la i emecomposante a l’instant t(j)). Rmq : le nombre decomposantes que l’on prend pour t n’a rien a voir avec laprecision du calcul qui peut se regler avec des parametresoptionnels de ode.
72/84
Resoudre une equation differentielle III
Exemple complet avec l’equation de Van der Pol (cf fichierexemple ode.sce) :
y′′ = c(1− y2)y′ − y
et que l’on reformule comme un systeme de deux equationsdifferentielles du premier ordre en posant u1(t) = y(t) etu2(t) = y′(t) :
d
dt
[u1(t)u2(t)
]=
[u2(t)c(1− u21(t))u2(t)− u1(t)
]function [f] = VanDerPol(t,u) // second membre pour Van der Pol (c = 0.4)
f(1) = u(2)
f(2) = 0.4*(1 - u(1)^2)*u(2) - u(1)
endfunction
73/84
Resoudre une equation differentielle IV
// resolution de l’equation differentielle
m = 500 ; T = 30 ;
t = linspace(0,T,m); // les instants pour lesquels on recupere la solution
u0 = [-2.5 ; 2.5]; // la condition initiale
[u] = ode(u0, 0, t, VanDerPol);
clf()
subplot(1,2,1); plot(u(1,:),u(2,:),"b");
title("Solution dans le plan de phase")
subplot(1,2,2); plot(t,u(1,:),"g",t,u(2,:),"r"); legend("position","vitesse")
74/84
Resoudre une equation differentielle V
Exercice 6 Le systeme de Lotka-Volterra est un systemedifferentiel modelisant l’evolution des populations de proies et depredateurs. Il s’ecrit :
dx
dt(t) = x(t)(a− by(t)), t ≥ 0
dy
dt(t) = −y(t)(c− dx(t)),
ou x(t) represente le nombre de proies et y(t) est le nombre depredateurs a l’instant t. Les parametres du systeme sont le taux dereproduction a des proies sans predateurs, le taux de mortalite bdes proies, le taux de mortalite c des predateurs sans proies et letaux de reproduction d des predateurs en fonction des proiesmangees. On impose des conditions initiales x(0) = x0 ety(0) = y0.
75/84
Resoudre une equation differentielle VI
Resoudre avec ode le systeme proie-predateur mis sous la forme{u′(t) = f(t,u), t ≥ 0u(0) = u0,
On pourra prendre a = 2, b = 1.5, c = 2 et d = 1 commeparametre et u0 = [1.5, 2.5]> et simuler jusqu’a T = 14.Faire le dessin de l’evolution des proies et des predateurs enfonction du temps dans une fenetre et le dessin de l’evolution dansle plan de phase dans une autre (le systeme est periodique).
76/84
Resoudre une equation differentielle VII
Solution
function du = lotkavolterra(t,u)
a = 2; b = 1.5; c = 2; d = 1;
du = [u(1)*(a-b*u(2));...
-u(2)*(c - d*u(1))]
endfunction
u0 = [1.5; 2.5];
T = 14;
t = linspace(0,T,900);
u = ode(u0,0,t,lotkavolterra)
scf(0); clf()
plot(t,u(1,:),"r",t,u(2,:),"g","thickness",3)
legend("proies","predateurs","fontsize",3)
xlabel("$t$","fontsize",5)
scf(1); clf()
plot(u(1,:),u(2,:),"b","thickness",2)
xlabel("proies","fontsize",3)
ylabel("predateurs","fontsize",3)
77/84
Identification des parametres d’un modele avec leastsq I
On dispose de m points (ti, yi)1≤i≤m experimentaux. La physiquenous dit que l’on devrait observer un comportement de la forme :
yi = f(ti, p∗)
ou f est une fonction de t mais aussi d’un ou de plusieursparametres p∗ inconnus. On cherche a identifier p∗ pour que lemodele “colle” aux mesures (yi ' f(ti, p∗), ∀i). La methode desmoindres carres consiste a trouver p∗ en minimisant la fonction :
F (p) :=
m∑i=1
(f(ti, p)− yi)2
Si on connaıt les ecarts types σi des erreurs sur les yi (qu’onsuppose juste en “moyenne”) alors il est preferable de minimiser :
F (p) :=
m∑i=1
(f(ti, p)− yi
σi
)2
78/84
Identification des parametres d’un modele avec leastsq II
Exemples de modeles
1 f est, par exemple, tout simplement une droite :
f(t, p) = p2t+ p1
dans ce cas le probleme est simple et peut se resoudre avec del’algebre lineaire mais qui peut le plus peut le moins. . .
2 f est une exponentielle decroissante :
f(t, p) = p1 exp
(− t
p2
)La encore “en passant en log” on peut se ramener a unprobleme d’algebre lineaire.
3 f pourrait etre donnee par la resolution d’une equationdifferentielle...
Rmq : la methode n’est pas restreinte a des modeles de R→ R (tet f(t, p) peuvent etre des vecteurs).
79/84
Identification des parametres d’un modele avec leastsq III
Utilisation (basique) de leastsqleastsq se propose de minimiser la somme des carres descomposantes d’une fonction g de Rn dans Rm :
g(p) = [g1(p), g2(p), . . . , gm(p)]>
c’est a dire de minimiser la fonction G : Rn → R suivante :
G(p) =
m∑i=1
gi(p)2
et l’appel le plus simple est de la forme :
[Gopt,popt] = leastsq(g,p0)
ou p0 est une estimation plus ou moins grossiere des bonsparametres.
80/84
Identification des parametres d’un modele avec leastsq IV
Dans le contexte precedent, cette fonction g prendra la forme :
gi(p) = f(ti, p)− yi ou gi(p) =f(ti, p)− yi
σi
et il faudra lui passer les “parametres” tmes = [t1, . . . , tm]>,
ymes = [y1, . . . , ym]> voire les erreurs de mesures
σmes = [σ1, . . . , σm]> si on les connaıt. Ainsi les appels a leastsq
seront plutot de la forme :
[Gopt,popt] = leastsq(list(g,tmes,ymes),p0)
[Gopt,popt] = leastsq(list(g,tmes,ymes,sigmames),p0)
leastsq appele alors g avec les parametres supplementaires(tmes,ymes) ou (tmes,ymes,sigmames) en plus de p.
81/84
Identification des parametres d’un modele avec leastsq V
Un exemple complet : (cf fichier exemple identification.sce)
function y = modele(t,p) // le modele (la fonction f precedente)
y = p(1)*t + p(2)
endfunction
function z = g(p,t,y) // la fonction g demandee par leastsq
// (ici version sans inclure les ecarts types des erreurs )
z = modele(t,p) - y
endfunction
// des mesures (fabriquees...)
m = 30; tmes = linspace(0,1,m)’;
ymes = -tmes + 1 + 0.02*rand(tmes,"nor")// les parametres exacts sont p(1) = -1 et p(2) = 1
// dessin des mesures
clf(); plot(tmes,ymes,"xb")
// il faut une valeur pour p0
p0 = [-0.5; 2]
// appel a leastsq
[Gopt,popt] = leastsq(list(g,tmes,ymes),p0)
// calcul de la courbe (voir graphiquement si le modele "colle" aux donnees)
t = linspace(min(tmes),max(tmes),100);
y = modele(t,popt);
plot(t,y,"r")
legend("donnees","modele opt");
82/84
Identification des parametres d’un modele avec leastsq VI
Exercice 7 Un chercheur bavarois, Arnd Leike, a montre quelorsqu’on sert un verre de biere, juste apres la formation du nuagede mousse (cet instant etant repere par t = 0), la hauteur de lamousse diminue de maniere exponentielle au cours du temps, c’esta dire qu’en notant h(t) la hauteur a l’instant t on a le modelesuivant :
h(t) = Ce−tτ
ou C est la hauteur a l’instant t = 0 et τ la constante de tempsassociee a la decroissance exponentielle. On pourrait memereconnaıtre differents types de biere a cette constante. . . ArndLeike a recu un prix “Ig” Nobel en 2002 pour cette “decouverte”.
Identifier les parametres C et τ pour la Erdinger Weissbier (lesdonnees sont dans le fichier biere.sce).
83/84
Identification des parametres d’un modele avec leastsq VII
Solution
// instants de mesure
tm = [0;15;30;45;60;75;90;105;120;150;180;210;240;300;360];
// hauteurs mesurees (pour la Erdinger Weissbier)
hm = [17;16.1;14.9;14.0;13.2;12.5;11.9;11.2;10.7;9.7;8.9;8.3;7.5;6.3;5.2];
// erreurs sur les hauteurs
dhm = [0.001;0.3;0.4;0.4;0.4;0.6;0.4;0.4;0.4;0.4;0.3;0.4;0.4;0.5;0.5];
function y = modele(t,p) // le modele (la fonction f precedente)
y = p(1)*exp(-t/p(2))
endfunction
function z = g(p,tm,hm,dhm)
z = (modele(tm,p) - hm)./dhm
endfunction
// dessin des mesures
clf(); plot(tm,hm,"xb")
// il faut une valeur pour p0
p0 = [1; 1]
// appel a leastsq
[Gopt,popt] = leastsq(list(g,tm,hm,dhm),p0)
printf("\n C = %g, tau = %g",popt(1),popt(2))
// calcul de la courbe (voir graphiquement si le modele "colle" aux donnees)
t = linspace(min(tm),max(tm),100);
y = modele(t,popt);
plot(t,y,"r")
legend("donnees","modele opt");
84/84