Vous êtes sur la page 1sur 8

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

Examen d’informatique première session 2003

Le chiffre à côté du titre de la question indique le nombre de points sur 40.

Etude de l’arc-en–ciel (34)

1 But de l’exercice
Les vecteurs sont notés en caractères gras.
Le but de l’exercice est d’étudier le trajet de la lumière dans une goutte d’eau pour expliquer la formation de l’arc-
en-ciel.
4
On considère une goutte d’eau sphérique de rayon R, d’indice ν = , placée au centre d’un repère Oxyz. Elle est
3
éclairée par un faisceau de rayons parallèles à l’axe Ox qui la recouvrent entièrement. Le système ayant la symétrie
de révolution autour de Ox on se limite à tracer les rayons situés dans le plan Oxy et pénétrant dans la goutte par
exemple par son quart supérieur gauche. Chaque rayon incident est caractérisé par son paramètre d’impact y ∈ [0, R].

M0 r0 M1
r1

y n1 M2
n2
r2
O x

M3
r3

M4 n3

Fig. 1 –

2 Préambule
Le trajet d’un rayon lumineux est représenté sur la figure 1. Chaque section rectiligne est définie par un point origine
Mi et une direction et un sens de propagation donnés par un vecteur unitaire ri . Les vecteurs ni sont des vecteurs
unitaires normaux aux dioptres. On a :
OM0 a pour composantes (−2R, y)
r0 a pour composantes (1, 0) p
OM1 a pour composantes (− R2 − y 2 , y)
n1 = −OM1 /R r
1 1 1
r1 = r0 + an1 avec a = 1 − 2 [1 − (r0 .n1 )2 ] − r0 .n1 (équations (I))
ν ν ν

1 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

(si le terme sous la racine est négatif il y a réflexion totale)


OM2 = OM1 − 2(OM1 .r1 )r1 (équation (II))
n2 = −OM2 /R
r2 = r1 − 2(n2 .r1 )n2
OM3 s’obtient en substituant, dans l’équation (II), l’indice 2 à l’indice 1, l’indice 3 à l’indice 2
n3 = OM3 /R
r3 s’obtient en substituant, dans les équations (I), l’indice 2 à 0, l’indice 3 à 1 et ν à 1/ν
OM4 = OM3 + 2r3

3 Questions préliminaires
Tous les vecteurs dont il est question dans la suite doivent être représentés par des tableaux à un indice dont les
noms respectent les notations de l’énoncé. Par exemple le vecteur r1 devra être noté r1 dans le programme, le vecteur
OM2 OM2, le vecteur n3 n3, etc.
1. (a) Ecrire une fonction nommée ps2 à laquelle on fournit deux vecteurs v 1 et v2 de dimension deux et dont
la valeur est le produit scalaire v1 .v2 .
(b) Ecrire un programme principal complet (main) qui :
– demande les composantes de deux vecteurs de dimension deux à l’utilisateur
– lit ces composantes au clavier
– écrit à l’écran la valeur du produit scalaire
Réponse :
#include<stdio.h>
#define N 2
double ps2(double a[N],double b[N])
{
int i; double x;
x=0.;
for(i=0;i<N;i++) x=x+a[i]*b[i];
return(x);
}
int main(void)
{
double v1[N],v2[N];
printf("Entrer les quatre composantes v1[0], v1[1], v2[0], v2[1] separees par un espace :\n");
scanf("%lg%lg%lg%lg",&v1[0],&v1[1],&v2[0],&v2[1]);
printf("Valeur du produit scalaire : %lg\n",ps2(v1,v2));
return (0);
}
2. Ecrire une fonction nommée ps à laquelle on fournit deux vecteurs v1 et v2 de dimension quelconque et dont
la valeur est le produit scalaire v1 .v2
3. Ecrire une fonction nommée ms à laquelle on fournit un vecteur v de dimension quelconque et un nombre réel
α et qui renvoit le vecteur αv dans un tableau différent de celui qui contient v.
4. Ecrire une fonction nommée cl à laquelle on fournit deux vecteurs v1 et v2 de dimension quelconque et deux
nombres réels α1 et α2 et qui renvoit le vecteur combinaison linéaire α1 v1 + α2 v2 .
5. Ecrire une fonction nommée coef, à valeurs entières, à laquelle on fournit les nombres réels q (supposé 6= 0) et
l et qui permet de calculer l’expression :
r
1 l
a = 1 − 2 (1 − l2 ) −
q q
Cette fonction doit valoir 0 si l’expression sous la racine est négative, 1 sinon, et, dans ce dernier cas, renvoyer
la valeur de a en argument.

2 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

4 Programme complet
Cette section doit être lue en entier avant de commencer à répondre aux questions.
1. Ecrire une fonction nommée ray à laquelle on fournit la valeur de y, et qui vaut 0 s’il y a réflexion totale,
1 sinon et qui, dans ce dernier cas, retourne en argument OM0 , OM1 , OM2 , OM3 , OM4 et r3 1 . L’indice
optique ν (noté nu dans le programme) sera déclaré et défini en variable locale statique dans cette fonction
ray. Le rayon R de la sphère sera déclaré en variable globale.
2. Ecrire un programme principal qui, en utilisant les fonctions précédentes :
(a) Ecrit dans un fichier nommé arc en ciel ray.res les coordonnées des points M 0, M 1, M 2, M 3, M 4
pour une série de nr rayons incidents, dans le format :
...

-4 1.11111 <- x et y pour M0 |


-1.66296 1.11111 <- x et y pour M1 |
1.92726 0.534465 <- x et y pour M2 | pour un rayon
-0.853192 -1.80888 <- x et y pour M3 |
-2.56754 -2.83894 <- x et y pour M4 |
une ligne blanche
-4 1.33333 <- x et y pour M0 |
-1.49071 1.33333 <- x et y pour M1 |
1.90006 0.624328 <- x et y pour M2 | pour le rayon suivant
-0.409345 -1.95766 <- x et y pour M3 |
-2.01956 -3.14392 <- x et y pour M4 |

...
Les nr valeurs de y seront régulièrement réparties entre 0 et R comme sur la figure 2 :

-1

-2

-3

-4

-5
-5 -4 -3 -2 -1 0 1 2 3

Fig. 2 –

S’il y a réflexion totale on n’écrit pas les coordonnées de M 0, M 1, M 2, M 3, M 4 dans le fichier et donc
on ne fait rien.
(b) Constitue dans un tableau nommé dist la distribution statistique2 des valeurs de l’angle d’émergence
(Ox, r3 ) entre les angles θmin = 170◦ et θmax = 240◦3 par intervalle de ∆θ = 0.5◦ . Pour cela considérer
1 Ne pas chercher, même si c’est une bonne idée, à représenter tous les OM par un seul tableau à deux indices, le premier indice
i
désignant par exemple le numéro du vecteur et le second sa composante
2 En vue de la représenter par un histogramme, non demandé ici, tel que celui de la figure 3
3 Par convention on mesure les angles de 0◦ à 360◦

3 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

un grand nombre (par exemple 100000) de rayons incidents dont les valeurs de y sont tirées aléatoirement
entre 0 et R selon le formule y=R*sqrt(alea())4 et enregistrer combien ont un angle de sortie compris
entre 170◦ et 170.5◦ dans dist[0], combien entre 170.5◦ et 171◦ dans dist[1], etc. jusqu’à 239.5◦ et 240◦
dans dist[139]. On ne se préoccupera pas d’initialiser la fonction alea() par germe et on utilisera les
fonctions arc cosinus acos et arc sinus asin.
S’il y a réflexion totale on ne fait rien.
Le programme doit être prévu pour fonctionner avec des valeurs quelconques de θ min , θmax et du nombre
NT d’intervalles, ce dernier pouvant être défini par un #define NT 140 par exemple.

12000

10000

8000

6000

4000

2000

0
170 180 190 200 210 220 230 240

Fig. 3 –

(c) Que doit-on modifier pour que le nombre d’intervalles ne soit pas défini par un define mais puisse être
fourni par l’utilisateur pendant l’exécution du programme ?
Réponse :
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<fonctions_magistere.h>
#define N 2
#define NT 140
double R=2.;
int coef(double q,double l,double *a)
{
double s;
s=1-(1-l*l)/q/q;
if(s<0.) return(0);
*a=sqrt(s)-l/q;
return(1);
}
double ps(double u[],double v[],int n)
{
int i; double x;
x=0.;
4 Voir justification en annexe

4 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

for(i=0;i<n;i++) x=x+u[i]*v[i];
return(x);
}
void ms(double w[],double a,double u[],int n)
{
int i;
for(i=0;i<n;i++) w[i]=a*u[i];
}
void cl(double w[],double a,double u[],double b,double v[],int n)
{
int i;
for(i=0;i<n;i++) w[i]=a*u[i]+b*v[i];
}
int ray(double y,double OM0[N],double OM1[N],double OM2[N],double OM3[N],double OM4[N],double r3[N])
{
static double nu=4./3.;
double a;
double r0[N],r1[N],r2[N],n1[N],n2[N],n3[N];
OM0[0]=-2.*R; OM0[1]=y;
r0[0]=1; r0[1]=0;
OM1[0]=-sqrt(R*R-y*y); OM1[1]=y;
ms(n1,-1/R,OM1,2);
if(coef(nu,ps(r0,n1,2),&a)==0) return(0);
cl(r1,1/nu,r0,a,n1,2);
cl(OM2,1,OM1,-2*ps(OM1,r1,2),r1,2);
ms(n2,-1/R,OM2,2);
cl(r2,1,r1,-2*ps(n2,r1,2),n2,2);
cl(OM3,1,OM2,-2*ps(OM2,r2,2),r2,2);
ms(n3,1/R,OM3,2);
if(coef(1/nu,ps(r2,n3,2),&a)==0) return(0);
cl(r3,nu,r2,a,n3,2);
cl(OM4,1,OM3,2,r3,2);
return(1);
}
/* La fonction suivante n’est pas demandee dans l’enonce */
void histo(int t[],double xmin,double xmax,int n,FILE *fres)
{
int i; double x,dx=(xmax-xmin)/n;
for(i=0; i<n; i++)
{
x=xmin+i*dx;
fprintf(fres,"%lg %lg\n",x,(double)t[i]);
fprintf(fres,"%lg %lg\n",x+dx,(double)t[i]);
}
}
int main(void)
{
int i,nr=20,imaxd=100000,j,k;
double y,tet,p,dtet,tetmin=170.,tetmax=240.,pi=acos(-1.),dpi=2.*pi,c=180./pi;
double OM0[N],OM1[N],OM2[N],OM3[N],OM4[N],r3[N];
int dist[NT];
FILE *fichr,*fichd;
fichr=fopen("arc_en_ciel_ray.res","w");
for(i=1;i<=nr;i++)
{

5 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

/* Le 0.9999 est introduit parceque l’erreur de troncature donne une reflexion totale
a la seconde refraction si on part exactement tangent a la sphere */
y=0.9999*R/(nr-1)*(i-1);
if(ray(y,OM0,OM1,OM2,OM3,OM4,r3)==0) continue;
fprintf(fichr,"%lg %lg\n",OM0[0],OM0[1]);
fprintf(fichr,"%lg %lg\n",OM1[0],OM1[1]);
fprintf(fichr,"%lg %lg\n",OM2[0],OM2[1]);
fprintf(fichr,"%lg %lg\n",OM3[0],OM3[1]);
fprintf(fichr,"%lg %lg\n",OM4[0],OM4[1]);
fprintf(fichr,"\n");
}
/* Les deux lignes suivantes ne sont pas demandees */
for(i=0;i<=100;i++) {p=dpi/100*i; fprintf(fichr,"%lg %lg\n",R*cos(p),R*sin(p));}
fclose(fichr);
fichd=fopen("arc_en_ciel_dist.res","w");
dtet=(tetmax-tetmin)/NT;
for(i=0;i<NT;i++) dist[i]=0;
for(i=1;i<=imaxd;i++)
{
y=R*sqrt(alea());
if(ray(y,OM0,OM1,OM2,OM3,OM4,r3)==0) continue;
tet=acos(r3[0]);
if(asin(r3[1])<0) tet=-tet+dpi;
tet=c*tet;
j=(int)((tet-tetmin)/dtet);
if(j<0) j=0; if(j>NT-1) j=NT-1;
dist[j]=dist[j]+1;
}
/* La ligne suivante n’est pas demandee */
histo(dist,tetmin,tetmax,NT,fichd);
fclose(fichd);
return (0);
}
/*
Pour declarer la dimension de dist en cours d’execution on remplace :

#define NT 140

et :

int dist[NT];

par :

int *dist;
int nt;
...
nt=...
...
dist=(int *)malloc(nt*sizeof(int));
*/

Dérivée (6)

6 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

Une valeur approchée de la dérivée de la fonction f (x) en x0 est donnée par la formule :
1
[f (x0 + h) − f (x0 − h)]
2h
où h est le pas de dérivation.
On suppose qu’un certain nombre de fonctions notées f1(x), f2(x), etc., supposées dérivables en tout point, sont
définies dans un programme.
1. Ecrire une fonction deriv(f,x0,h) pouvant fournir une valeur approchée de la dérivée de l’une quelconque des
fonctions f1(x), f2(x), etc., x0 et h étant fournis par l’utilisateur.
2. Ecrire un programme principal illustrant l’emploi de la fonction deriv.
Réponse :
#include<stdio.h>
double f1(double x)
{
return (1./(1.+x*x));
}
double f2(double x)
{
return (x*(x-1.));
}
double deriv(double (*f)(double),double x0,double h)
{
return(((*f)(x0+h)-(*f)(x0-h))/2./h);
}
int main(void)
{
double x0,h;
x0=1.; h=1.e-3;
printf("%lg\n",deriv(f1,x0,h));
printf("%lg\n",deriv(f2,x0,h));
return (0);
}

Annexe : loi de probabilité des paramètres d’impact


Pour l’ensemble de la goutte le nombre de rayons ayant un paramètre d’impact compris entre ρ et ρ + dρ est
proportionnel à la surface d’une couronne circulaire de rayon ρ et d’épaisseur dρ :

dN = α 2π ρ dρ

La constante α est fixée par la condition :


Z R
N0
dN = N0 N0 étant le nombre total de rayons incidents sur la goutte =⇒ α=
0 πR2
La probabilité pour que le paramètre d’impact soit compris entre ρ et ρ + dρ est donc :
2
dp = ρ dρ pour 0 ≤ ρ ≤ R et 0 pour ρ > R
R2

Il faut donc générer des nombres entre 0 et R avec la loi g(ρ) = 2 .
R
En utilisant la méthode présentée dans le chapitre Génératoire aléatoire uniforme et les mêmes notations on a :
ρ2 √
G(ρ) = =⇒ ρ=R G
R2

7 2004-12-07 22 :27 :00.000000000


Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2002-2003 première session

Donc, x étant une variable aléatoire de densité uniforme sur [0, 1] :


p
ρ = R x − 1 + G(R)

On choisit ρ = R pour x = 1 :
p √
R=R G(R) =⇒ G(R) = 1 =⇒ ρ=R x

8 2004-12-07 22 :27 :00.000000000

Vous aimerez peut-être aussi