Introduction à Scilab
Semaine logiciels, année 2000-2001
vendredi 20 octobre 2000
Jean-Philippe Chancelier & Michel Cohen de Lara
Table des matières
- Table des matières
- 9h00
10h15. Manipulations vectorielles
- 10h45
12h00. Fonctions Scilab, graphiques, etc.
- 13h00
14h15. Probabilités
- 14h45
16h00. Zéros de fonctions,
équations différentielles, optimisation, graphes
- À propos de ce document...
9h00
10h15. Manipulations vectorielles
Les lignes de commande suivantes peuvent être directement tapées sous Scilab pour être exécutées immédiatement.
Elles peuvent également être
écrites dans un fichier nom_du_fichier.sce, puis exécutées en
tapant sous Scilab exec("nom_du_fichier.sce","c").
Objets vectoriels
// scalaires 5 ans^2 l=100 y=%e l*log(sqrt(y)) // vecteurs v=[3,4] norm(v) size(v) w=[%pi,v]' sin(w) sum(w) t=[4:9] u=sqrt(2)*[1:2:8]' size(u) s=ones(u) // matrices A=ones(3,7) B=eye(6,7) C=[A;(-6)*B]
Exercice
Construire une matrice (4,9) (à 4 lignes et 9 colonnes) dont la première ligne est formée de 1, et dont tous les autres termes sont nuls.
Construire une matrice (3,5) dont la première colonne est formée de 2, la deuxième colonne des entiers de 1 à 3, et le reste de -1.
Opérations vectorielles
//addition A=rand(5,6) B=sin(A) A+B //transposition A' // rang rank(A) //multiplication A'*A A*A' C=eye(A) A*C //déterminant A=[1,2;3,4] det(A) //exponentiation D=rand(3,3) expm(D) //extraction de sous-matrices A=[11:19;21:29;31:39;41:49;51:59;61:69] A(1,1) A(3,4) A(1,:) A(:,5) A(2:3,:) A(2:3,7:9) A([1 3 5],[2 4 6 8])
Exercice
Cliquer sur la touche Help
Taper \ dans la case A propos
Choisir des matrices
et
Résoudre numériquement le système linéaire
Recommencer avec / et le système linéaire
Valeurs propres et vecteurs propres
//valeurs propres A=eye(5,5) spec(A) A=[1,2;3,4] spec(A) //vecteurs propres [Ab,X]=bdiag(A) (A - Ab(1,1)*eye(A))*X(:,1) (A - Ab(2,2)*eye(A))*X(:,2) inv(X)*A*X
Exercice
Diagonaliser une matrice rand(4,4).
10h45
12h00. Fonctions Scilab, graphiques, etc.
Graphiques
// plot x=0.1:0.1:10 y=sin(x)./x plot(x,y) // plot2d r=rand(1,100) plot2d(r) xbasc() plot2d(1:100,r,-5) s=rand(1,100); xbasc() plot2d(r,s,-2) // histogrammes xbasc() histplot(10,r) xbasc() histplot(0:0.2:1,r)
Exercice
Engendrer un vecteur aléatoire
de taille 200.
Faire help cumsum
Créer, à partir de la suite
, la suite
des sommes partielles.
Représenter les couples de points
.
Programmation
// condition if
p=0.4
y=rand(1)
if y< p then x=1;
elseif y>= p then x=0;
end
x
// boucles while
p=0.2
y=rand(1);
compteur=1;
while y >=p do compteur=compteur+1; y=rand(1); end
compteur
// boucles for
N=500;
y=rand(1:N)-0.5*ones(1:N);
x=sign(y);
for i=2:N,x(i)=x(i-1)+x(i);end;
xbasc();
plot2d(0:N,[0,x])
// fonction (d'expression simple)
deff('[y]=densite(x)','y=1/(%pi*sqrt(x*(1-x)))');
densite(0.8)
deff('[y]=Gauss(x,mu,sigma)','y=1/(sigma*sqrt(2*%pi))*...
exp(-((x-mu)/sigma)^2/2)');
// mettre ... avant de passer à la ligne
Exercice
Écrire la fonction sinus cardinal (
).
Fonctions Scilab
Une fonction est une suite d'instructions, éventuellement paramétrées,
écrites dans un fichier nom_du_fichier.sci.
function [x]=permutation_lent(n)
// permutation aléatoire de {1,...,n}
x=ones(1,n);
for i=2:n,k=0;
for j=1:1+int(rand(1)*(n-i+2));k=k+1;
while x(k)>1 do k=k+1; end;end;
x(k)=i;end;
function [x]=permutation_rapide(n)
// permutation aléatoire de {1,...,n}
x=grand(1,'prm',[1:n]')
Une fonction est chargée en tapant sous Scilab
getf("nom_du_fichier.sci","c").
Toute fonction est ensuite appelée sous Scilab par son nom.
// chargement de la fonction permutation_lent
getf("nom_du_fichier.sci","c")
// appel de la fonction permutation_lent
permutation_lent(100)
Exercice
Écrire dans un fichier
- la fonction sinus cardinal (
)
- une fonction d'entrée 2 réels
,
qui produit son graphe sur l'intervalle
.
Saisie de tableaux de chiffres
Par copier-coller, transférer les lignes suivantes dans un fichier donnees.txt :
21.132487 56.084861 30.760907 50.153416 28.06498 75.604385 66.235694 93.296162 43.685876 12.800585 0.0221135 72.635068 21.460079 26.931248 77.831286 33.032709 19.851438 31.2642 63.257449 21.190304 66.53811 54.425732 36.16361 40.51954 11.213547 62.839179 23.207479 29.222666 91.847078 68.56896 84.974524 23.122372 56.642488 4.3733433 15.312167 68.573102 21.646326 48.26472 48.185089 69.708506 87.821648 88.338878 33.217189 26.39556 84.155184 6.8374037 65.251349 59.350947 41.481037 40.620248
// fscanfMat
// que fait la fonction fscanfMat ?
help fscanfMat
// lecture et stockage dans une matrice M
M= fscanfMat('donnees.txt');
Un exemple récapitulatif : analyse de données de température
//saisie de données de température
M= fscanfMat('SCI/contrib/tp_enpc/temperatures_globe.txt')
//on extrait les moyennes annuelles
[m,n]=size(M)
y=M(:,n)
//on programme une régression linéaire
t=[1:m]'; // représente le temps (années)
//formule de régression
x=[ones(M),t]; b=(x'*x)^(-1)*x'*y;
//superposition graphique des données et de la droite de régression
xbasc();plot2d(t',y');
plot2d(t',(x*b)');
//examen des résidus
r=y-x*b
plot(r)
histplot(r)
Un exemple récapitulatif : analyse de données de débit
Les debits moyen journaliers de la Gervanne à Beaufort sur Gervanne (en l/s) sont stockés dans un fichier.
On peut par exemple lire les données correspondante dans Scilab avec
la fonction fscanfMat comme suit :
// lecture et stockage dans une matrice M
M= fscanfMat('SCI/contrib/tp_enpc/gervanne.txt')
Combien de données avons-nous lu ?
[m,n]=size(M) // On a lu une seule colonne de chiffre : on doit avoir n=1
// m nous indique le nombre de valeurs lues
M=M/1000; // on se ramène a des m3/s
Visualisons les débits journaliers
plot(M); // visualisation de toutes les données xbasc();plot(M(1:100)); // les 100 premières valeurs
Analyse de la série temporelle des débits journaliers
[cor,moy]=corr(M,100) // les 100 premiers coefficiente de corrélation
Transformée de Fourier (discrète) du signal
y=fft(M,-1); xbasc();plot(abs(y(1:100)));
À quoi correspond le premier « pic » dans la transformée de Fourier discrète ?
[m,ind]=maxi(abs(y(2:100))); // on cherche l'indice qui réalise le max
// y étant complexe, on prend son module (abs)
y1=y;
y1(ind+1)=0;
y1($-ind+1)=0; // on élimine la fréquence du signal y
M1=real(fft(y1,1)); // transformée de Fourier inverse
per=M-M1; // signal périodique (de période l'année)
xbasc();plot(per);
xbasc();plot(per(1:360));
13h00
14h15. Probabilités
Générateurs aléatoires
// rand r=rand(1,100) plot2d(r) xbasc() plot2d(1:100,r,-5) // histogrammes xbasc() histplot(10,r) xbasc() histplot(0:0.2:1,r)
Simulations de lancers de pièces et de dés
// lancer de pièce int(2*rand) // 50 lancers de pièce int(2*rand(1,50)) // somme des faces de 2 dés n=100; s=int(1+6*rand(1,n))+int(1+6*rand(1,n)); xbasc();histplot(1.5:1:12.5,s,1,"011"," ",[1.5,0,12.5,1])
Exercice
Écrire dans un fichier une fonction de
entier qui effectue
simulations comme suit.
- Tirer un nombre
au hasard dans
.
- Calculer la partie entière
du (grand) scalaire
.
- Tirer un entier
au hasard dans
.
- Calculer
(modulo
).
Tracer un histogramme du résultat.
Quel jeu de hasard a-t-on ainsi approximativement simulé ?
Convergences
// loi forte des grands nombres (avec loi uniforme)
rand('uniform');
N=1000;
x=rand(1:N);
// x est un tirage de N=1000 v.a. uniformes sur [0,1]
for i=2:N,x(i)=(i-1)*x(i-1)/i+x(i)/i;end;
// calcul récursif des moyennes partielles
xbasc();
plot2d(1:N,x,1,"011"," ",[0,0,N,1],[0,N/50,0,10]);
// une programmation plus rapide qui évite une boucle for
N=1000;
x=rand(1:N);
s=cumsum(x); // somme cumulée
x=s./[1:N]; // division terme à terme
xbasc();
plot2d(1:N,x,1,"011"," ",[0,0,N,1],[0,N/50,0,10]);
Autres travaux pratiques
Voir le chapitre
Simulations de loi
du TD Calcul des probabilités.
14h45
16h00. Zéros de fonctions,
équations différentielles, optimisation, graphes
Zéros avec fsolve
// fsolve help fsolve
Zéro de fonction scalaire
// zéro de polynôme
deff('[y]=fct(x)','y=2*x^3-30*x^2-3*x+200');
x=[-3:0.1:15];xbasc();plot(x,fct(x));
x1=fsolve(-1,fct)
fct(x1)
x2=fsolve(1,fct)
fct(x2)
x3=fsolve(11,fct)
fct(x3)
// zéro de polynôme, avec gradient
deff('[y]=fct(x)','y=2*x^3-30*x^2-3*x+200');
deff('[y]=grad_fct(x)','y=6*x^2-60*x-3');
x=[-3:0.1:15];xbasc();plot(x,fct(x));
x1=fsolve(-1,fct,grad_fct)
fct(x1)
x2=fsolve(1,fct)
fct(x2)
x3=fsolve(11,fct)
fct(x3)
Intersection de quadriques
// intersection de quadriques
deff('[z]=quadrique1(x,y)','z=2*x^2+ 5*y^2-30*x+20');
deff('[z]=quadrique2(x,y)','z=2*x^2 -y^2-3*y-20');
// dessin
x=-2:10;
y=-10:10;
// on trace le contour 0 pour avoir la quadrique
// quadrique1(x,y)=0
xbasc();
fcontour2d(x,y,quadrique1,[0,0],[9,9])
// On superpose le deuxieme
fcontour2d(x,y,quadrique2,[0,0],[12,12],"000")
// recherche d'un point d'intersection
deff('[Y]=quadriques(X)','Y=[quadrique1(X(1),X(2)),quadrique2(X(1),X(2))]');
rep=fsolve([-1,1],quadriques)
// on rajoute le point sur le dessin
xpolys(rep(1),rep(2),-1)
// on vérifie le calcul
quadriques(rep)
Autres travaux pratiques
Voir le chapitre
La recherche de zéro avec fsolve
du TD Optimisation.
Intégration d'équations différentielles avec ode
// ode help ode
Équations différentielles scalaires autonomes
// y dot = sin(y)
deff("[ydot]=f(t,y)","ydot=sin(y)")
//attention ! on écrit f(t,y) même si f ne dépend pas de t
y0=0.2;t0=0;t=0:0.1:15;
y=ode(y0,t0,t,f);
xbasc(); plot(t,y)
// y dot = -y^2
deff("[ydot]=f(t,y)","ydot=-y^2")
y0=0.2;t0=0;t=0:0.1:30;
y=ode(y0,t0,t,f);
xbasc(); plot(t,y)
// y dot = y^2
deff("[ydot]=f(t,y)","ydot=y^2")
y0=0.2;t0=0;t=0:0.1:30;
y=ode(y0,t0,t,f);
xbasc(); plot(t,y)
Équation différentielle scalaire non autonome
// y dot = sin(t*y)
deff("[ydot]=f(t,y)","ydot=sin(t*y)")
y0=0.2;t0=0;t=0:0.1:15;
y=ode(y0,t0,t,f);
xbasc(); plot(t,y)
Système différentiel
// y dot dot = -sin(y)
deff('[z]=fct1(y1,y2)','z=y2');
deff('[z]=fct2(y1,y2)','z=-sin(y1)');
deff('[Z]=fct(Y)','Z=[fct1(Y(1),Y(2)),fct2(Y(1),Y(2))]');
y0=[0.3,0.2]';t0=0;t=0:0.1:30;
y=ode(y0,t0,t,f);
xbasc(); plot(t,y(1,:))
Autres travaux pratiques
Voir le chapitre
Systèmes dynamiques linéaires et stabilité du TD Systèmes dynamiques.
Voir le chapitre
Modèles biologiques et chimiques du TD Systèmes dynamiques.
Voir le chapitre
Attracteurs de systèmes dynamiques du TD Systèmes dynamiques.
Optimisation avec optim
//optim help optim
Minimum d'une fonction de deux variables, sans contraintes
// un exemple simple : optimiser x^2 + y^2
deff('[f,g,ind]=cost(x,ind)',['f=x(1)^2+x(2)^2';'g=[2*x(1);2*x(2)]']);
// g est le gradient
// ici, ind est un paramètre non utilisé mais qui doit être présent
[f,xopt]=optim(cost,[1;2])
// le coût est quasi nul
Minimum d'une fonction de deux variables, avec contraintes
//la même chose sous contrainte x dans [2,10] et y dans [-10,10]
// le min est atteint sur un bord
deff('[z]=C(x,y)','z=x^2+y^2');
x=2:10;y=-10:10;
z=feval(x,y,C);
xbasc();
plot3d(x,y,z);
[f,xopt,gopt]=optim(cost,'b',[2;-10],[10;10],[5;5]);
// f n'est pas nul
// le gradient en xopt est perpendiculaire au bord
Autres travaux pratiques
Voir le sous-chapitre
Une minimisation de fonction différentiable
du TD Optimisation.
Graphes avec Metanet
Help Metanet showgraph shortest_path
À propos de ce document...
Introduction à ScilabSemaine logiciels, année 2000-2001
vendredi 20 octobre 2000
This document was generated using the LaTeX2HTML translator Version 99.2beta8 (1.43)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 0 -nonavigation TPscilab_20oct2000
The translation was initiated by The Scilab Group on 2000-11-30
The Scilab Group 2000-11-30
