1 Introduction à Scilab - CNRS Orleans
1 Introduction à Scilab - CNRS Orleans
1 Introduction à Scilab - CNRS Orleans
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
UNIVERSITÉ D’ORLEANS Année universitaire 2007-2008<br />
UFR Sciences Masters EE et ESM<br />
OUTILS NUMÉRIQUES ET STATISTIQUES POUR LA PHYSIQUE<br />
1 <strong>Introduction</strong> <strong>à</strong> <strong>Scilab</strong><br />
SÉANCES SUR ORDINATEUR<br />
<strong>Scilab</strong> est un logiciel de calcul numérique développé par l’Institut National de Recherche<br />
en Informatique et en Automatique (INRIA) et distribué gratuitement sur plusieurs plateformes<br />
(Linux, Unix, OSX, Windows). Ce logiciel gratuit peut être téléchargé de l’adresse<br />
http://www.scilab.org.<br />
Le logiciel <strong>Scilab</strong> possède plusieurs fenêtres : la fenêtre de commande (qui s’ouvre en premier),<br />
une ou plusieurs fenêtres graphiques, ainsi qu’un éditeur. <strong>Scilab</strong> et Matlab ont quasiment<br />
la même syntaxe et la même organisation matricielle des variables. La plupart des<br />
commandes s’écrivent directement dans la fenêtre de commande. On peut cependant aussi<br />
regrouper les commandes répétitives dans des fonctions.<br />
Pour créer une fonction, il faut ouvrir l’éditeur, écrire les lignes de commande et enregister<br />
le fichier sous un nom****.sci. Cette fonction doit être compilée avant de pouvoir l’exécuter<br />
dans <strong>Scilab</strong>. Après chaque modification de la fonction, allez dans le menuExecuter puis<br />
faitesCharger dans <strong>Scilab</strong>.<br />
La syntaxe d’une fonction est toujours la même :<br />
function [arguments de sortie] = nom de la fonction(arguments d’entrée)<br />
lignes de code<br />
\\ eventuellement des commentaires<br />
lignes de code<br />
endfunction<br />
N’écrivez jamais une telle fonction directement dans la fenêtre de commande. C’est dans<br />
l’éditeur qu’il faut la rédiger. La fonction doit être enregistrée puis compilée après chaque<br />
modification.<br />
1
Exemple<br />
La fonction ci-dessous calcule la moyenne et l’écart-type d’une variable aléatoire et restitue<br />
en outre la variable centrée réduite<br />
function [moy,sigma,y] = stat(x)<br />
moy = mean(x);<br />
sigma = st_deviation(x);<br />
y = (x-moy)/sigma;<br />
endfunction<br />
Enregistrez cette fonction dans un fichier nommé stat.sci. Le nom du fichier doit être le<br />
même que celui de la fonction. Avant de l’exécuter, on commence par créer avec la commande<br />
grand un vecteur de 50 valeurs aléatoires distribuées uniformément entre 0 et 1<br />
-->u = grand(50,1,"unf",0,1);<br />
-->u<br />
u =<br />
0.7577401<br />
0.8219033<br />
0.3019131<br />
0.6554779<br />
etc<br />
Pour ensuite exécuter la fonction stat <strong>à</strong> partir des valeurs contenues dans la variable u, il<br />
suffit de faire<br />
-->stat(u)<br />
ans =<br />
0.5103843<br />
-->[moy,s,v] = stat(u);<br />
-->moy<br />
moy =<br />
0.5103843<br />
-->s<br />
s =<br />
0.2768577<br />
-->mean(v)<br />
ans =<br />
1.221E-17<br />
Dans le premier cas, le résultat du calcul est affiché sans être stocké dans une variable ; sa<br />
valeur est donc perdue. Dans le second cas, les valeurs respectives de la moyenne, de l’écarttype<br />
et du vecteur centré-réduit sont enregistrés dans les variablesmoy,setv.<br />
Dans le cas où il faut traiter plusieurs vecteurs de valeurs aléatoires, il suffit de créer une matrice<br />
et d’appliquerstat séparément <strong>à</strong> chaque colonne de cette matrice. Il suffit alors d’écrire<br />
2
-->u = grand(50,4,"unf",0,1);<br />
-->for i=1:4, [moy(i),sigma(i),v(:,i)] = stat(u(:,i)); end<br />
-->moy<br />
moy =<br />
0.5223238<br />
0.5242195<br />
0.5454979<br />
0.4266284<br />
Dans <strong>Scilab</strong>, il n’est pas nécessaire de déclarer initialement les variables. Cependant, pour<br />
accélérer le déroulement du programme et pour en faciliter la lecture, il est vivement recommandé<br />
de le faire pour les grands tableaux. Ainsi, on aurait pu faire précéder la boucle cidessus<br />
d’une commande qui remplit les variables de valeurs nulles<br />
-->moy=zeros(4,1); sigma=zeros(4,1); v=zeros(50,4);<br />
Commandes <strong>à</strong> essayer<br />
Tapez successivement les commandes suivantes et vérifiez ce qui se passe, ainsi que le pourquoi<br />
de certains messages d’erreur<br />
x = 1<br />
x = 1;<br />
y = [10 11 12]<br />
y = [10 11 12]’<br />
pi<br />
%pi<br />
%eps<br />
%i<br />
%e<br />
racinei = sqrt(%i)<br />
z = [1 2 3; 4 5 6; 7 8 9]<br />
I = [1 0 0; 0 1 0; 0 0 1]<br />
I*z<br />
I.*z<br />
z<br />
z’<br />
y0 = y*z<br />
y0 = y’*z<br />
y0 = y*z’<br />
y0 = y.*z’<br />
y0 = z*y<br />
y0*2<br />
y0+2<br />
z(1,1), z(2,1), z(2,3)<br />
z(:,1), z(1,:)<br />
3<br />
z(:,1:2)<br />
z(:,2:$)<br />
ind = [1 3]; z(:,ind)<br />
z^2<br />
z.^2<br />
M = ones(3,4)<br />
M = zeros(2,4)<br />
M = eye(4,4)<br />
t = (0:3)<br />
t + M<br />
t = (0:0.1:3)<br />
t = linspace(0,1,30)<br />
t = t’<br />
n = length(t)<br />
whos()<br />
[n,m] = size(t)<br />
y = exp(-t’)<br />
y = exp(-t)<br />
y = sin(2*%pi*t)<br />
abs([-4:4])<br />
plot2d(y)<br />
plot2d([y sqrt(y)])<br />
clf<br />
plot2d(t,y)<br />
plot2d(t,y,style=3)
plot2d(t,y,leg="exponentielle")<br />
plot2d(t,y,logflag="nl")<br />
plot2d2(t,y)<br />
for i=1:10, i, end<br />
for i=1:2:10, i, end<br />
for i=1:0.2:10, i, end<br />
for i=[1 2 9 10], i, end<br />
for i=[5:-1:0], i, end<br />
u=4; for i=1:u, i, end<br />
u=-1; for i=1:u, i, end<br />
<strong>Scilab</strong> est un langage matriciel : chaque variable est interprétée comme une matrice. Un scalaire<br />
n’est rien d’autre qu’une matrice 1×1. La multiplication de deux variables se fait donc<br />
de façon matricielle. Ainsi, si<br />
A=<br />
1 2<br />
3 4<br />
<br />
et B =<br />
1 1<br />
0 1<br />
alors A∗ B donne le produit matriciel classique. Il arrive fréquemment qu’on ait besoin de<br />
faire un produit terme <strong>à</strong> terme. Dans ce cas, la syntaxe <strong>à</strong> utiliser est A.∗B. Il en va de même<br />
pour l’élévation <strong>à</strong> une puissance, etc.<br />
<br />
1 3<br />
A∗ B =<br />
3 7<br />
Problème : impacts de foudre<br />
<br />
<br />
1 2<br />
alors que A.∗B =<br />
0 4<br />
Un détecteur de foudre compte le nombre n d’impacts dans une région par intervalle d’une<br />
minute. Lors d’un orage (que l’on suppose stationnaire), ce détecteur a fonctionné pendant 80<br />
minutes consécutives. A cette occasion, N = 339 impacts ont été comptabilisés. On supposera<br />
que les impacts successifs sont indépendants et que l’orage était stationnaire durant cette<br />
période.<br />
1. Quelle est la loi que suit n ? Déterminez son espérance.<br />
2. Générez avec <strong>Scilab</strong> un vecteur colonnexde 80 valeurs aléatoires réparties selon cette<br />
même loi. Visualisez cette suite de nombres comme une série temporelle.<br />
3. Calculez la moyenne de x. Comparez-la avec l’espérance prédite par cette loi.<br />
4. L’écart-type de x est-il en accord avec celui prédit par la loi ?<br />
5. Comparez le mode de x, sa moyenne et sa médiane. Lequel est le plus grand ?<br />
6. Calculez d’après la loi la probabilité p
2 Tests d’hypothèse<br />
2.1 Porosité d’un film<br />
Dans une expérience de mesure de porosité, on soumet les deux faces d’un film de faible<br />
épaisseur <strong>à</strong> une forte différence de potentiel, et on compte le nombre de décharges qui se<br />
produisent pendant un intervalle de temps. Ce nombre est révélateur de la quantité de micropores<br />
dans l’échantillon ; chaque micropore donne lieu <strong>à</strong> une décharge au maximum.<br />
Huit échantillons ont été analysés. On a relevé les valeurs suivantes<br />
échantillon i 1 2 3 4 5 6 7 8<br />
nombre de décharges 2730 2734 2920 2938 2882 2746 2804 2888<br />
On aimerait savoir si ces échantillons possèdent les mêmes caractéristiques physiques. L’hypothèse<br />
nulle revient <strong>à</strong> supposer que les différences observées entre les huit échantillons sont<br />
imputables <strong>à</strong> des fluctuations aléatoires. La loi qui convient le mieux <strong>à</strong> ce test d’hypothèse est<br />
la loi du χ 2 .<br />
Pour tester l’hypothèse nulle, il vous faut<br />
1. Calculer la nouvelle variable J = i ˆx 2<br />
i , où ˆxi est la variable xi centrée et réduite.<br />
2. Quel est le nombre de degrés de liberté ?<br />
3. Fixez un niveau de confiance α et déterminez si Prob(J > Js)=α. L’hypothèse nulle estelle<br />
acceptée ?<br />
Dans <strong>Scilab</strong>, on obtient la valeur de Js avec la commande<br />
Js = cdfchi("X", N, 1-alpha, alpha)<br />
qui donne le seuil pour le cas unilatéral, pour N degrés de liberté. Essayez plusieurs<br />
valeurs de α.<br />
4. L’expression analytique de la loi de χ 2 étant connue, on peut inverser les calculs et déterminer<br />
la probabilité α correspondant <strong>à</strong> une valeur seuil Js donnée. La commande<br />
alpha = 1 - cdfchi("PQ", J, n-1)<br />
nous donne le niveau de confiance avec lequel l’hypothèse d’indépendance des échantillons<br />
peut être acceptée. Tracez le graphe α=α(Js) pour déterminer comment α varie<br />
avec Js.<br />
2.2 Origine des roches terrestres<br />
L’oxygène possède trois isotopes stables. Jusque dans les années 1980, il était admis que leur<br />
concentration relative était la même dans tout l’univers. On a depuis découvert que le rapport<br />
isotopique (= le rapport entre la concentration relative de deux isotopes) varie légèrement<br />
d’une roche <strong>à</strong> l’autre. Sur Terre, le rapport est partout le même. Par contre, certaines<br />
5
météorites présentent des rapports légèrement différents. Des classes de matériaux ont été<br />
définies en fonction de leur signature isotopique et de leur lien parental. Comme l’oxygène<br />
est essentiellement produit lors de supernovae, on en conclut que la matière sur Terre et celle<br />
rencontrée dans notre système solaire a été produite par deux voire trois supernovae.<br />
Il existe plusieurs techniques pour déterminer<br />
la concentration isotopique. L’une d’elles<br />
consiste <strong>à</strong> bombarder l’échantillon avec des<br />
neutrons d’énergie connue et <strong>à</strong> étudier les caractéristiques<br />
des neutrons diffractés. Le tableau<br />
ci-dessous résume le nombre de neutrons<br />
comptabilisés en fonction de leurs caractéristiques.<br />
On supposera ici que ce nombre<br />
est proportionnel <strong>à</strong> la proportion de chaque<br />
isotope.<br />
FIG. 1 – Comparaison entre le rapport isotopique<br />
de 18 O et celui de 17 O pour différents échantillons.<br />
nombre de neutrons n16 n17 n18<br />
météorite 1 260’075’109 520’121 89’304<br />
météorite 2 25’379’070 50’541 8’910<br />
valeur de référence (roche terrestre) n17/n16= 0.0020 n18/n17= 0.1779<br />
La valeur de référence donne le rapport isotopique (supposé ici exact) d’un échantillon de<br />
roche terrestre.<br />
1. Calculez le rapport isotopique ρ= n18/n17 des météorites ainsi que leur incertitude.<br />
2. Quelle loi approxime le mieux ce rapport ?<br />
3. Comparez les différents rapports isotopiques <strong>à</strong> celui de la valeur de référence terrestre.<br />
Fixez un seuil de α= 0.05 et testez l’hypothèse selon laquelle les rapports correspondent<br />
<strong>à</strong> des classes parentales différentes.<br />
4. Le rapport isotopique pour un échantillon de chondrite (une variété de météorite) est<br />
de ρ = 5.710. Pouvez-vous dire si, parmi les échantillons, certains sont assimilables <strong>à</strong><br />
des chondrites ?<br />
N.B. Les commandes<br />
ys = cdfnor("X", mu, s, a, 1-a)<br />
ys = cdfpoi("S", mu, a, 1-a)<br />
calculent la valeur ys telle que Prob(y < ys)= a, respectivement pour une loi normale d’espérance<br />
µ et d’écart-type s, et pour une loi de Poisson d’espérance µ.<br />
6
3 Détection de traceurs dans un spectre<br />
La figure ci-dessous représente deux spectres infrarouge obtenus dans des conditions identiques<br />
mais avec des échantillons différents : le premier sans impuretés, les second avec. La<br />
présence d’impuretés se traduit par l’apparition de raies spectrales nouvelles dont la position<br />
(i.e. la longueur d’onde) et l’amplitude fournissent des informations importantes sur la nature<br />
et la concentration des constituants. Il est donc important de déterminer ce qui change<br />
entre les deux mesures.<br />
FIG. 2 – Spectres infrarouge enregistrés sans (figure de gauche) et avec impuretés (figure de droite).<br />
Chaque spectre représente le nombre de photons comptés en fonction de la longueur d’onde.<br />
Les raies d’émission, même faibles, possèdent une largeur caractéristique (la largeur <strong>à</strong> mihauteur),<br />
qui vaut au moins dix unités de longueur d’onde.<br />
Les données<br />
Récupérez les données de la page<br />
http://lpce.cnrs-orleans.fr/~ddwit/enseignement.html#master-outils Enregistrez<br />
les fichiers dans votre répertoire de travail. Pour charger les données dans <strong>Scilab</strong>,<br />
faites<br />
load spectro.dat<br />
clf<br />
plot2d(y)<br />
le taux de comptage est stocké dans la variabley, de dimensions 512×2. La première colonne<br />
correspond <strong>à</strong> la mesure sans impuretés et la seconde <strong>à</strong> la mesure avec impuretés.<br />
7
Marche <strong>à</strong> suivre<br />
1. Pour une longueur d’onde donnée, quelle est la loi de probabilité de la variable y ?<br />
2. Définissez une nouvelle variablez = y(:,2)-y(:,1); qui contient la différence entre<br />
les deux spectres.<br />
3. Par quelle loi peut-on approximer la loi de probabilité de la variable z ?<br />
4. Estimez l’écart-type σz de z pour chaque longueur d’onde.<br />
5. Fixez un niveau de confiance α = 0.05 et déterminez le test <strong>à</strong> effectuer pour vérifier<br />
l’hypothèse nulle selon laquelle les deux spectres sont identiques (H0 : z = 0).<br />
6. Faut-il un test unilatéral ou bilatéral ?<br />
7. Si zmin et zmax sont les bornes de l’intervalle dans lequel doit se trouver z pour que<br />
l’hypothèse nulle soit vérifiée, alors il est commode de visualiser sur un même graphe<br />
z, zmi n et zmax. Pour définir ces bornes, faites appel <strong>à</strong> la fonctioncdfnor<br />
zmin = cdfnor("X", 0, sigmaz, alpha/2, 1-alpha/2);<br />
zmax = cdfnor("X", 0, sigmaz, 1-alpha/2, alpha/2);<br />
Ces commandes doivent être répétées pour chaque valeur de σz ; on obtient ainsi pour<br />
chaque longueur d’onde une valeur dezmin etzmax.<br />
8. Le résultat précédent est difficile <strong>à</strong> exploiter en raison du niveau de bruit important. Il<br />
est donc souhaitable de réduire ce dernier. On peut raisonnablement supposer que les<br />
valeurs de z varient peu d’une longueur d’onde <strong>à</strong> une autre. On peut donc tenter de<br />
lisser les spectres en moyennant chaque valeur de z sur ses plus proches voisins.<br />
Faut-il d’abord lisser les spectres puis calculer leur différence, ou bien lisser après calcul<br />
de la différence ?<br />
9. Répétez les étapes 2 - 4 en lissant les spectres avec la fonction lissage (décrite cidessous).<br />
Prenez diverses largeurs de lissage n allant de 1 <strong>à</strong> 30.<br />
Remarque : si vous lissez une série temporelle, l’écart-type sur chaque valeur diminue.<br />
Pour une série temporelle y dont chaque valeur possède la même incertitude σy, après<br />
un lissage gaussien avec une fenêtre de taille n (comme le fait la fonction lissage.sci), le<br />
nouvel écart-type devient approximativement σy −→ σy /(0.65× n).<br />
10. Identifiez les raies significatives pour différentes valeurs de la largeur de lissage n.<br />
Quelle valeur de n vous semble la plus appropriée ? Pourrait-on déterminer cette valeur<br />
de façon plus rigoureuse ?<br />
Lissage des données aveclissage<br />
La fonctionlissage.sci sert <strong>à</strong> lisser les données, cf. les notes de cours.<br />
La commande suivante (après compilation préalable de la fonctionlissage.sci)<br />
zs = lissage(z,n);<br />
permet d’effectuer un tel lissage, aveczun vecteur contenant la suite <strong>à</strong> lisser. La largeurn de<br />
la fenêtre de lissage doit être un entier positif.<br />
8
4 Mouvement d’un colorant dans un liquide<br />
Une goutte de colorant liquide, placée dans un fluide homogène, aura tendance <strong>à</strong> subir dans<br />
celui-ci un mouvement constitué d’une<br />
• diffusion : due au mouvement brownien des molécules ;<br />
• convection : si le colorant n’a pas la même densité que le fluide.<br />
Nous nous intéresserons ici uniquement au mouvement vertical d’une ou de plusieurs molécules<br />
de colorant. Celui-ci peut être simulé par une marche aléatoire, dans laquelle chaque<br />
molécule se déplace par une série de pas discrets. Chaque pas résulte d’une collision avec<br />
une autre molécule. Suivant le théorème de la limite centrale, on peut supposer que l’amplitude<br />
x de chaque pas suit une loi de probabilité normale de moyenne m et de variance v.<br />
On supposera pour simplifier que les collisions se produisent <strong>à</strong> des intervalles de temps réguliers.<br />
Les dimensions seront normalisées de façon <strong>à</strong> avoir une variance égale <strong>à</strong> 1. Nous nous<br />
intéresserons ici au déplacement de la molécule après n pas de temps, défini comme<br />
Ln =<br />
n<br />
xk<br />
k=1<br />
avec L(0)=0<br />
Le colorant est injecté dans un récipient de taille finie (hauteur H). Le mouvement de chaque<br />
molécule sera donc contraint dans l’espace. Une molécule sera réfléchie par les parois chaque<br />
fois que sa position verticale dépassera H/2 ou −H/2. Ce genre problème se rencontre dans<br />
les réacteurs chimiques. On peut par exemple être amené <strong>à</strong> se demander si un colorant plus<br />
dense que le liquide finira par diffuser ou non dans la cuve entière.<br />
Le modèle en <strong>Scilab</strong><br />
Nous nous intéressons ici <strong>à</strong> l’évolution temporelle de la position L d’une molécule de colorant,<br />
pour des temps allant de t = 1 <strong>à</strong> t = N pas, ce que calcule la fonction suivante. L est le chemin<br />
parcouru, N est nombre de pas de temps, H la hauteur de la boite et m la valeur moyenne<br />
d’un pas.<br />
function L = marche(N,H,m)<br />
L = zeros(N,1);<br />
for i=2:N<br />
L(i) = L(i-1) + grand(1,1,"nor",m,1);<br />
if L(i) > H/2,<br />
L(i) = H - L(i);<br />
elseif L(i) < -H/2,<br />
L(i) = -H - L(i);<br />
end<br />
end<br />
endfunction<br />
9
Calculs <strong>à</strong> effectuer<br />
1. Commençons par le régime dans lequel les molécules diffusent peu et s’approchent<br />
lentement des parois : N = 1000, H = 200 et m= 0.<br />
• Visualisez le déplacement de quelques molécules. Y’en a-t-il qui atteignent le<br />
bord ?<br />
• Le théorème de la limite centrale nous permet de calculer la position moyenne<br />
d’une molécule après n pas. Déterminez l’expression analytique de cette position<br />
moyenne. Pour vérifier ce résultat par la simulation, choisissez un grand<br />
nombre de molécules (au minimum 50) et calculez pour chaque pas de temps k<br />
la position〈Lk〉 moyennée sur toutes les molécules. L’accord est-il satisfaisant ?<br />
• Le même théorème nous permet de prédire la valeur de la dispersion (c’est-<strong>à</strong>dire<br />
l’écart-type σk sur les valeurs de Lk de différentes molécules) en un temps<br />
k donné. Déterminez l’expression analytique de σk et comparez-la aux résultats<br />
de la simulation. Complétez le tableau suivant<br />
n 〈Ln〉 (théorie) 〈Ln〉 (mesuré) σn (théorie) σn (mesuré) D (mesuré)<br />
2<br />
10<br />
100<br />
1000<br />
• La quantité σk équivaut ici <strong>à</strong> la distance quadratique moyenne parcourue après<br />
k pas de temps. En posant σk = Dk, nous pouvons interpréter le coefficient D<br />
comme le coefficient de diffusion des molécules dans le fluide. Cette quantité<br />
joue un rôle-clé dans la théorie cinétique des fluides. Donnez sa valeur dans le<br />
tableau ci-dessus.<br />
2. Prenons ensuite le régime dans lequel les molécules diffusent rapidement par rapport<br />
<strong>à</strong> la taille de la boîte : N = 1000, H = 30 et m= 0.<br />
• Calculez la position de quelques molécules et visualisez leur déplacement. Ontelles<br />
tendance <strong>à</strong> remplir uniformément la boîte ? Qu’est-ce qui distingue leur<br />
mouvement du cas précédent ?<br />
• Visualisez avechistplot la distribution des molécules aux différents temps n=<br />
2, 10, 100, 1000 et commentez ce que vous observez. Prenez un échantillon d’au<br />
moins 300 molécules pour avoir une bonne statistique.<br />
• A partir de quand les molécules remplissent-elles uniformément la boîte ?<br />
3. Pour finir, on considère le cas où les molécules se déplacent préférentiellement dans un<br />
sens. Ce cas surgit avec un colorant plus dense que le fluide. Le pas moyen m ne sera<br />
donc plus nul. Prenez N = 1000, H = 100 et m=−0.2.<br />
• Calculez la position de quelques molécules et visualisez leur déplacement. Ontelles<br />
tendance <strong>à</strong> remplir uniformément la boîte ?<br />
• Visualisez avechistplot la distribution des molécules aux différents temps n=<br />
2, 10, 100, 1000 et commentez ce que vous observez. Prenez un échantillon d’au<br />
moins 300 molécules pour avoir une bonne statistique.<br />
• Tracez sur un même graphe la dispersion σn ainsi que la position moyenne〈Ln〉<br />
au cours du temps. Que peut-on en déduire ?<br />
10
5 Cycle d’activité solaire<br />
La figure ci-dessous représente 52 ans de mesures journalières du :<br />
– nombre de taches solaires. Ce nombre est représentatif du niveau d’activité solaire. Le<br />
champ magnétique est intensifié dans les tâches solaires, qui sont sources d’éruptions.<br />
– nombre de neutrons enregistrés par un observatoire au Colorado. Ce flux de neutrons est le<br />
résultat de réactions nucléaires produites dans la haute atmosphère par l’impact de rayons<br />
cosmiques de très haute énergie. Ces derniers sont sensibles au niveau de turbulence générée<br />
par le Soleil dans le milieu interplanétaire, ce qui explique une anticorrélation : forte<br />
activité solaire = davantage de turbulence = diffusion accrue des rayons cosmiques = moins<br />
de neutrons.<br />
Les deux quantités révèlent une variation cyclique de 11 ans environ, qui correspond au cycle<br />
de l’activité solaire. Ces données suscitent aujourd’hui beaucoup d’intérêt, depuis la découverte<br />
d’un impact des rayons cosmiques sur la nébulosité et donc sur le climat global.<br />
isn, neutrons/1000<br />
600<br />
500<br />
400<br />
300<br />
200<br />
100<br />
isn<br />
neutrons/10 3<br />
0<br />
1950 1960 1970 1980<br />
annee<br />
1990 2000 2010<br />
FIG. 3 – A gauche : nombre de taches solaires et nombre moyen de neutrons par heure. A droite : le<br />
Soleil vu en lumière blanche, avec quelques tâches solaires particulièrement grosses.<br />
1. Les données<br />
Téléchargez de l’adresse<br />
http://lpce.cnrs-orleans.fr/~ddwit/enseignement.html#master-outils<br />
les fichierslissage.sci,crosscorr.sci etneutrons.dat et enregistrez-les dans dans votre<br />
répertoire de travail. Pour charger les données dans <strong>Scilab</strong>, faitesload(’neutrons.dat’). Le<br />
nombre de neutrons figure dans la variable n et le nombre de tâches solaires dans s. Le temps<br />
t est exprimé en années.<br />
11
2. Prétraitement<br />
1. Visualisez les données et repérez d’éventuels points aberrants (données manquantes,<br />
détecteur saturé, valeur anormale, ...) et remplacez-les par une valeur adéquate.<br />
La commandefind est utile pour déterminer les indices d’une matrice qui satisfont <strong>à</strong><br />
une condition particulière. Par exemple<br />
k = find(s < 0);<br />
s(k) = - s(k);<br />
enregistre dans k les indices du vecteur s dont la valeur est négative et inverse ensuite le<br />
signe de ces valeurs.<br />
2. Comme n et s s’expriment en des unités différentes, et que seule leur variation relative<br />
nous intéresse, il est conseillé de les standardiser. Définissez deux nouveaux vecteurs<br />
qui contiennent les valeurs standardisées.<br />
3. Corrélation<br />
1. Tracez s en fonction de n. Peut-on dire s’il existe une relation linéaire entre ces deux<br />
variables ?<br />
2. La dispersion des points sur le graphe précédent est en partie due <strong>à</strong> des variations sur<br />
de courtes échelles de temps. Pour s’en affranchir, il est judicieux de lisser les données<br />
(avec la fonction lissage).<br />
Lissez les données sur des durées variables, en allant au moins jusqu’<strong>à</strong> 400 jours. La<br />
corrélation s’améliore-t-elle visuellement ?<br />
4. Mesure de la corrélation<br />
Pour quantifier le degré de corrélation linéaire, on estime le coefficient de corrélation défini<br />
comme suit (fonction crosscorr)<br />
ρx y (τ)=<br />
Rx y (τ)<br />
Rxx (0) Ry y(0)<br />
<br />
<br />
où Rx y (τ)= (x(t)− ¯x) (y(t+ τ)− ¯y)<br />
Notez que Rxx(τ = 0) = σ2 x . Dans notre cas, x = s et y = n. La valeur de ρ est bornée, avec<br />
−1≤ρ ≤ 1. Une valeur proche de zéro équivaut <strong>à</strong> une faible covariance ; les variables x(t) et<br />
y(t+ τ) sont alors peu corrélées. Une valeur proche de 1 (respectivement -1) signifie qu’il y a<br />
forte (anti-)corrélation.<br />
1. Calculez la corrélation entre le nombre de tâches solaires et le nombre de neutrons pour<br />
des valeurs de τ allant de -5000 <strong>à</strong> +5000 jours.<br />
2. Pour quel délai τ les deux variables sont-elles le plus fortement anticorrélées ? Cela<br />
signifie-t-il que le minimum de neutrons est en avance ou en retard de phase par rapport<br />
au maximum de nombre de tâches ?<br />
3. Estimez le coefficient de corrélation pour les données lissées. En quoi cela change-t-il<br />
les valeurs ?<br />
12
6 Déposition de silicium amorphe<br />
Un des moyens pour déposer du silicium amorphe sur une surface consiste <strong>à</strong> exposer celleci<br />
<strong>à</strong> un plasma de silane (SiH4) chauffé par des ondes radio de haute fréquence. Lorsque le<br />
plasma est stationnaire, l’épaisseur d de la couche déposée tend <strong>à</strong> croître linéairement avec<br />
la durée t de l’exposition. Il est donc important de connaître la relation entre t et d pour bien<br />
maîtriser le processus. Pour faire cela, on expose plusieurs échantillons pendant des durées<br />
différentes, et on mesure l’épaisseur de la couche de silicium par des procédés optiques. Il se<br />
pourrait que la première couche se dépose plus aisément que les autres ; on cherche donc <strong>à</strong><br />
ajuster aux données une expression de la forme<br />
d = a t+ b<br />
où la durée t est connue avec précision, alors que la épaisseur d est entachée d’une erreur.<br />
1. Les données<br />
t [min] 2.0 3.0 3.5 4.0 4.6 5.7 6.2 6.8 7.5 8.5 9.2 9.6<br />
d [Å] 2.4 4.1 4.8 4.5 5.2 7.2 7.5 8.6 9.5 10.6 11.70 11.90<br />
L’incertitude sur l’épaisseur vaut 0.3 Å.<br />
2. Prétraitement<br />
Les éventuels points aberrants doivent être corrigés, mais comme nous nous intéressons ici <strong>à</strong><br />
la relation exacte entre d et t, il ne faut pas standardiser ces dernières.<br />
3. Régression<br />
Pour estimer les coefficients du système linéaire par la méthode des moindres carrés, il faut<br />
résoudre le système sur-déterminé<br />
⎛<br />
t1 1<br />
t2 1<br />
⎞<br />
⎜<br />
⎝ .<br />
⎟<br />
⎟ a<br />
⎟<br />
. ⎠ b<br />
tN 1<br />
⎛<br />
⎜<br />
= ⎜<br />
⎝<br />
1. Estimez les coefficients a et b par la méthode des moindres carrés (cf. cours).<br />
2. Il existe une autre méthode pour estimer ces coefficients, qui tire profit de la notation<br />
matricielle de <strong>Scilab</strong>. Le système linéaire (1) peut se résoudre avec une notation très<br />
compacte<br />
N = length(nd);<br />
M = [t ones(N,1)];<br />
coef = M \ d;<br />
a = coef(1); b = coef(2);<br />
13<br />
d1<br />
d2<br />
.<br />
dN<br />
⎞<br />
⎟<br />
⎠<br />
(1)
où l’opérationM \ d signifie que le vecteurdest divisé par la matriceMdepuis la gauche.<br />
Assurez-vous auparavant que t et d sont des vecteurs colonne.<br />
Vérifiez que le résultat obtenu est identique <strong>à</strong> celui trouvé en 1.<br />
3. Il est important de savoir dans quelle mesure le modèle linéaire reproduit bien les résultats.<br />
Il suffit pour cela d’estimer l’épaisseurdfit prédite par le modèle (1). Cela s’obtient<br />
avec<br />
dfit = M*coef;<br />
oùMetcoef sont les variables calculées précédemment. Comparezdfit <strong>à</strong>det déterminez<br />
si le modèle linéaire semble correct.<br />
4. Validation de la régression<br />
Pour quantifier les résultats ci-dessus, il convient de faire un test du χ 2 . Calculez l’écart quadratique<br />
moyen et comparez-le <strong>à</strong> la valeur seuil d’une loi du χ 2 <strong>à</strong> ν degrés de liberté, pour un<br />
niveau de confiance de 1 %.<br />
5. Extrapolation avec ce modèle<br />
Une fois que le modèle est validé, on peut l’utiliser pour extrapoler les données. Il est intéressant<br />
de connaître l’épaisseur de la couche pour des temps très courts, qui sont difficilement<br />
accessibles expérimentalement. Déterminez la valeur ˆ d prédite par le modèle pour t = 0 et<br />
donnez en particulier son incertitude. Que peut-on en conclure sur le processus ?<br />
14
7 Rendement d’un filtre antipollution<br />
Un constructeur de moteurs veut déterminer la durée de vie d’un filtre antipollution. Il effectue<br />
pour cela des mesures du rendement <strong>à</strong> des temps différents sur un même filtre. En<br />
première approximation, le rendement devrait diminuer avec le temps comme<br />
d x<br />
= A− x ⇒ x(t)=a+ be−ct<br />
d t<br />
et tendre progressivement vers une valeur constante (pas forcément nulle). Le système étant<br />
complexe et les mesures bruitées, on peut aussi être tenté d’approximer la décroissance par<br />
une simple droite<br />
x(t)= A+ B t<br />
Dans ce dernier cas, les paramètres A et B peuvent être estimés par une régression des<br />
moindres carrés. Ceci n’est pas possible avec l’exponentielle, pour laquelle l’estimation de<br />
{a,b,c} conduit <strong>à</strong> un système non-linéaire, qui requiert une régression non-linéaire.<br />
1. Les données<br />
Le fichier de données filtre.dat peut être téléchargé <strong>à</strong> l’adresse<br />
http://lpce.cnrs-orleans.fr/~ddwit/enseignement.html#master-outils Le rendement<br />
et son incertitude sont enregistrés dans x et dx, le temps (en unités quelconques) est<br />
dans la variable t.<br />
2. Régression linéaire<br />
Estimez d’abord les paramètres A et B par la méthode des moindres carrés.<br />
3. Régression non-linéaire<br />
Supposons que l’on dispose d’une estimation initiale {a0,b0,c0} des paramètres du modèle<br />
exponentiel. On peut alors estimer le rendement ˆx pour chaque temps t.<br />
Appelons J l’écart quadratique entre le vrai rendement et le résultat du modèle<br />
J =<br />
N<br />
(xk− ˆxk ) 2<br />
k=1<br />
Il s’agit de trouver de façon itérative la suite de valeurs de {ai ,bi ,ci } qui minimisent cet écart<br />
J. Avec un bon algorithme de recherche de minima et une estimation initiale correcte, la suite<br />
convergera vers un minimum (pas forcément global).<br />
Dans <strong>Scilab</strong>, ce genre d’optimisation non-linéaire se fait aisément <strong>à</strong> l’aide de la fonction optim<br />
(cf. cours). Cette fonction requiert deux paramètres d’entrée : le nom de la fonction qui<br />
calcule l’écart quadratique J ainsi qu’un vecteur contenant la valeur initiale {a0,b0,c0} des<br />
paramètres. Par exemple<br />
15
coef0 = [100 20 2];<br />
[J, coef] = optim(minimisation, coef0);<br />
fournit en retour la valeur de J minimale obtenue par la fonction minimisation lorsque les<br />
paramètres prennent les valeurs données dans coef.<br />
La syntaxe de la fonction qui calcule J doit obéir <strong>à</strong> une règle stricte :<br />
function [J, dJdp, K] = minimisation(p, K);<br />
...<br />
J = ....<br />
dJdp = ....<br />
endfunction<br />
où p est un vecteur qui contient les différents paramètres du modèle, J est l’écart quadratique<br />
(un scalaire), K est un paramètre qui ne sera pas utilisé ici (mais qui doit être déclaré) et dJdp<br />
est un vecteur contenant la dérivée partielle de J par rapport aux paramètres.<br />
La fonction minimisation.sci qui est donnée en annexe est un exemple de fonction qui calcule<br />
J et ses dérivées pour le cas d’une régression linéaire. Vous pouvez vous inspirer de cette<br />
fonction pour le cas de l’exponentielle.<br />
1. Concevez dans l’éditeur la fonction minimisation.sci (qui obéit <strong>à</strong> la syntaxe ci-dessus)<br />
afin qu’elle calcule la fonction de coût ainsi que sa dérivée partielle pour le modèle exponentiel.<br />
2. Au vu des résultats obtenus avec le modèle linéaire, déterminez quelle valeur initiale<br />
des paramètres a, b et c il faudrait prendre pour lancer la recherche non-linéaire.<br />
3. La fonction optim parvient-elle toujours <strong>à</strong> trouver la valeur des paramètres qui minimisent<br />
J ? Lancez la minimisation avec d’autres valeurs initiales et comparez la valeur<br />
de J ainsi obtenue. Regardez aussi ce qui ce passe quand b< 0 et c < 0.<br />
4. Relancezoptim avec la valeur des coefficients que vous venez de trouver en 3. La convergence<br />
se poursuit-elle ou bien optim a-t-il trouvé le minimum recherché ?<br />
5. Extrapolez les deux modèles jusqu’au temps t = 35. Lequel vous paraît le plus réaliste ?<br />
6. Effectuez un test du χ 2 pour décider lequel des deux modèles est le meilleur.<br />
16
8 Invariance d’échelle dans la turbulence<br />
La turbulence développée se rencontre dans les écoulements fluides <strong>à</strong> haut nombre de Reynolds<br />
et correspond <strong>à</strong> un état désordonné avec des tourbillons de toutes les tailles qui interagissent<br />
entre eux de façon non-linéaire. La densité spectrale de puissance ou spectre de<br />
puissance d’un paramètre (par exemple la densité ou la température) d’un tel fluide suit une<br />
fonction qui décroît avec la fréquence selon une loi de puissance<br />
P(f )= a f −b<br />
Une telle loi de puissance signifie qu’il y a invariance d’échelle = toutes les échelles caractéristiques<br />
sont mélangées = si on agrandit l’image d’une portion du fluide, on retrouve le même<br />
type d’image que précédemment.<br />
La figure suivante représente l’évolution temporelle de la température mesurée dans une<br />
soufflerie subsonique (<strong>à</strong> gauche) et son spectre de puissance (<strong>à</strong> droite). Le spectre en loi de<br />
puissance, exprimé en échelle logarithmique, donne lieu <strong>à</strong> une droite.<br />
temperature [V]<br />
4<br />
2<br />
0<br />
−2<br />
−4<br />
0 0.05 0.1<br />
temps [s]<br />
0.15 0.2<br />
spectre de puiss. [u.a.]<br />
10 9<br />
10 8<br />
10 7<br />
10 6<br />
10 5<br />
10 4<br />
10 3<br />
10 2<br />
10 1<br />
10 2<br />
10 3<br />
10 4<br />
frequence [Hz]<br />
De telles lois de puissance se rencontrent dans toutes les disciplines (biologie, économie, géologie,<br />
linguistique, ...) et apportent des renseignements importants sur les processus dynamiques<br />
sous-jacents. Il est important de parvenir <strong>à</strong> estimer correctement les paramètres a et<br />
b d’une telle loi. On appelle parfois b exposant d’échelle ou indice spectral.<br />
1. Les données<br />
Le fichier de données spectre.dat correspondant <strong>à</strong> l’exemple ci-dessus peut être téléchargé<br />
de l’adresse<br />
http://lpce.cnrs-orleans.fr/~ddwit/enseignement.html#master-outils Il comprend<br />
la fréquence f en [Hz] ainsi que la densité spectrale de puissance p en [mV 2 /Hz].<br />
L’incertitude relative sur p est donnée dans err, en pourcent.<br />
17<br />
10 5<br />
10 6
2. Régression par moindres carrés<br />
Estimez les paramètres a et b par une régression des moindres carrés, sans tenir compte de<br />
l’incertitude sur p. Divisez si nécessaire le spectre de puissance en plusieurs intervalles d’indices<br />
spectraux différents.<br />
3. Régression par moindres carrés pondérée<br />
Comme l’incertitude relative sur la densité de puissance est connue, il est préférable d’intégrer<br />
cette information dans l’estimation par moindres carrés, en pondérant chaque valeur par<br />
l’inverse de son écart-type.<br />
Montrez que si le système <strong>à</strong> résoudre par moindres carrés est Mc = y, avec<br />
⎛<br />
x1 1<br />
x2 1<br />
⎜<br />
M = ⎜<br />
⎝ .<br />
⎟<br />
⎟,<br />
. ⎠<br />
<br />
a<br />
c =<br />
b<br />
xN 1<br />
⎞<br />
⎛<br />
⎜<br />
, y = ⎜<br />
⎝<br />
alors il suffit de diviser tous les éléments de la i-ième ligne de M et de y par σi avant d’opérer<br />
la division c = M\y. Comparez les résultats avec ceux obtenus en 2.<br />
4. Estimation des incertitudes sur a et b<br />
Les estimateurs des incertitudes sur les paramètres a et b, quoique connus analytiquement,<br />
ne sont pas toujours faciles <strong>à</strong> manipuler. Une autre approche consiste <strong>à</strong> utiliser une méthode<br />
de Monte-Carlo (valable seulement si les erreurs sur p sont indépendantes d’une fréquence <strong>à</strong><br />
une autre) :<br />
1. Choisissez un intervalle de fréquences sur lequel il faut estimer a et b.<br />
2. A chaque valeur pi de la densité spectrale dans cet intervalle, ajoutez un nombre aléatoire<br />
distribué suivant une loi normale N (0,σi ). On obtient alors une nouvelle valeur<br />
p ′<br />
i .<br />
3. Estimez les paramètres a ′ et b ′ par régression des moindres carrés sur p ′ .<br />
4. Répétez les étapes 2. et 3. un grand nombre de fois, et mémorisez <strong>à</strong> chaque fois les valeurs<br />
de a ′ et de b ′ .<br />
5. Les meilleurs estimateurs de a et de b sont les moyennes respectivement de a ′ et de b ′ .<br />
Les écarts-type de ces derniers nous donnent une estimation de leur incertitude.<br />
18<br />
y1<br />
y2<br />
.<br />
yN<br />
⎞<br />
⎟<br />
⎠
TAB. 1 – Quelques commandes utiles<br />
x = [1,2,3,12]; crée le vecteur ligne x<br />
x = [1;2;3;12]; crée le vecteur colonne x<br />
x affiche le contenu de x<br />
y = [1 0 3; 4 3 1]; crée une matrice 2 x 3<br />
x = (0:5); crée le vecteur ligne x = [0 1 2 3 4 5];<br />
x = (0:0.5:2); crée le vecteur ligne x = [0 0.5 1 1.5 2];<br />
x = x’; transpose x<br />
y = sin(x); calcule y = sin(x)<br />
[n,m] = size(x); calcule le nombre n de lignes et le nombre m de colonnes<br />
de x<br />
y = x*x’ calcule le produit scalaire x x T si x est un vecteur<br />
ligne ; le résultat est un scalaire<br />
y = x’*x calcule le produit scalaire x T x si x est un vecteur<br />
colonne ; le résultat est un scalaire<br />
y = x.*x calcule le produit terme <strong>à</strong> terme yi = xi ∗ xi . Le résultat<br />
est un vecteur.<br />
y = 3*x-2 calcule yi = 3xi − 2. Le résultat est un vecteur de<br />
même dimensions que x.<br />
clf efface le contenu de la fenêtre graphique<br />
whos() affiche les variables actuellement en mémoire et<br />
donne leur taille<br />
plot2d(x,y) trace y en fonction de x<br />
plot2d(x,y,style=2) change la couleur du trait<br />
plot2d(x,y,style=-3) change le type de symbole<br />
subplot(3,1,2) découpe la fenêtre graphique en 3 fenêtres réparties<br />
verticalement ; le prochain graphe apparaîtra dans<br />
la seconde fenêtre<br />
z = mean(x) calcule la moyenne de tous les éléments de x<br />
z = mean(x,"c") calcule la moyenne sur les colonnes de x<br />
z = mean(x,"r") calcule la moyenne sur les rangées (lignes) de x<br />
z = sum(x,"r") calcule la somme selon les rangées (lignes) de x<br />
z = cumsum(x,"r") calcule la somme cumulée zk = k<br />
i=1 xi selon les<br />
rangées (lignes) de x<br />
z = st_deviation(x,"r") calcule l’écart-type sur les rangées (lignes) de x<br />
z = median(x,"r") calcule la médiane sur les rangées (lignes) de x<br />
z = max(x,"c") calcule la valeur maximale sur les colonne de x<br />
u = grand(m,n,’chi’,d) calcule une matrice m × n de variables aléatoires<br />
distribuées selon la loi du χ 2 <strong>à</strong> d degrés de liberté<br />
u = grand(m,n,’nor’,mu,sigma) idem pour la loi normale N (µ,σ 2 )<br />
u = grand(m,n,’poi’,mu) idem pour la loi de Poisson d’espérance µ<br />
u = grand(m,n,’unf’,1,4) idem pour la loi uniforme sur l’intervalle [1,4]<br />
k = find(u