01.06.2013 Views

1 Introduction à Scilab - CNRS Orleans

1 Introduction à Scilab - CNRS Orleans

1 Introduction à Scilab - CNRS Orleans

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!