Vous êtes sur la page 1sur 7

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

Examen d’informatique première session 2004

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

I) Lentille électrostatique à fente (14)


Le problème étudié est à deux dimensions. Dans une enceinte conductrice rectangulaire au potentiel 0 sont placés
des conducteurs de potentiels imposés.

0 30 50 55 75 105
y (indice j)

20
0 volts 1000 volts

40
0 volts 1000 volts Toute l’enceinte
est a 0 volts
60

x
Les cotes sont exprimees en prenant
(indice i) comme unite le pas du reseau

Fig. 1 –

Le but de l’exercice est de calculer le potentiel électrostatique V (x, y), puis le champ électrique E(x, y), à l’intérieur
de l’enceinte, hormis sur les conducteurs. Il s’agit de déterminer numériquement la solution unique de l’équation :

∆V = 0 entre les conducteurs
V a les valeurs imposées sur les conducteurs

On effectue le calcul de V uniquement aux points d’un réseau régulier1 appliqué sur l’enceinte, c’est à dire en des
points tels que x = i et y = j, i et j étant des entiers nuls ou positifs. Dans ces conditions la solution est obtenue de
la façon suivante :
1. pour tous les points situés sur un conducteur, y compris l’enceinte, on attribue à V la valeur du potentiel de
ce conducteur
2. pour tous les autres points de l’enceinte on attribue à V une valeur initiale nulle puis on calcule tous les V (i, j)
par la formule :

V (i − 1, j) + V (i, j − 1) + V (i + 1, j) + V (i, j + 1)
V (i, j) = (moyenne arithmétique des quatre points adjacents)
4
3. on réitére l’étape 2. jusqu’à obtenir une convergence satisfaisante.
1) Question préliminaire : écrire une fonction qui initialise à zéro un tableau de double à deux indices de dimensions
quelconques.
2) Ecrire un programme qui calcule le potentiel pour un nombre d’itérations fixé par l’utilisateur et imprime les
valeurs finales dans un premier fichier sous la forme :
v(0,0)
v(0,1)
1 dont on choisit le pas comme unité de longueur

1 2004-12-08 01 :08 :49.000000000


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

...
v(0,105)
<- une ligne blanche
v(1,0)
v(1,1)
...
v(1,105)
<- une ligne blanche
...
<- une ligne blanche
v(60,0)
v(60,1)
...
v(60,105)
3) Compléter le programme précédent pour que le calcul s’arrête dès que l’une des deux conditions suivantes est
réalisée :
le nombre d’itérations fixé par l’utilisateur est dépassé
|V (i, j)itération n+1 − V (i, j)itération n | ≤ ε pour chacune des valeurs de i et j hors conducteurs, ε étant
choisi par l’utilisateur.
4) Calculer une valeur approchée du vecteur champ électrique en tout point du réseau (hors conducteurs) en utilisant
dy y(x + h) − y(x − h)
la formule de dérivation approchée : ' , h étant un accroissement suffisamment petit. La
dx 2h
formule de dérivation doit être programmée dans une fonction. Les résultats seront imprimés dans un second fichier
et selon la même présentation que le potentiel mais avec les deux composantes du champ sur chaque ligne.
Réponse :
#include<stdio.h>
#include<math.h>
#define NI 61
#define NJ 106
void zero(double x[],int ni,int nj)
{
int i,j;
for(i=0;i<ni;i++) for(j=0;j<nj;j++) x[i*nj+j]=0;
}
double derivee(double fp,double fm,double h)
{
return((fp-fm)/2/h);
}
int main(void)
{
double v[NI][NJ],v0=1000,Ex,Ey,eps=1e-3,u;
int i,j,k,i1=20,i2=40,j1min=30,j1max=50,j2min=55,j2max=75,nit=1000,ind;
FILE *fich0,*fich1;
fich0=fopen("lentille_electro_0.res","w");
fich1=fopen("lentille_electro_1.res","w");
// Initialisation des potentiels
zero(&v[0][0],NI,NJ);
for(j=j2min;j<=j2max;j++) {v[i1][j]=v0; v[i2][j]=v0;}
// Calcul du potentiel
for(k=1;k<=nit;k++)
{
printf("k=%d\n",k);
for(ind=0,i=1;i<NI-1;i++)
{

2 2004-12-08 01 :08 :49.000000000


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

for(j=1;j<NJ-1;j++)
{
if((i==i1 || i==i2) && ((j1min<=j && j<=j1max) || (j2min<=j && j<=j2max))) continue;
u=v[i][j];
v[i][j]=(v[i-1][j]+v[i][j-1]+v[i+1][j]+v[i][j+1])/4;
if(fabs(v[i][j]-u)>eps) ind=1;
}
}
if(ind==0) break;
}
printf("Nombre d’iterations effectuees=%d\n",k);
for(i=0;i<NI;i++)
{
for(j=0;j<NJ;j++)
{
fprintf(fich0,"%lg\n",v[i][j]);
}
fprintf(fich0,"\n");
}
// Calcul du champ
for(i=1;i<NI-1;i++)
{
for(j=1;j<NJ-1;j++)
{
if((i==i1 || i==i2) && ((j1min<=j && j<=j1max) || (j2min<=j && j<=j2max))) continue;
Ex=derivee(v[i+1][j],v[i-1][j],1); Ey=derivee(v[i][j+1],v[i][j-1],1);
fprintf(fich1,"%lg %lg\n",Ex,Ey);
}
}
fclose(fich0); fclose(fich1);
return (0);
}

II) Probabilité de recouvrement (13)


On lance deux pièces identiques de rayon r dans une boı̂te circulaire de rayon R.

Fig. 2 –

1) Question préliminaire : écrire une fonction qui calcule le carré de la distance de deux points du plan dont les
coordonnées sont fournies en argument.

3 2004-12-08 01 :08 :49.000000000


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

2) Ecrire un programme qui calcule la probabilité de recouvrement des deux pièces par une méthode de tirage aléatoire
(utiliser la fonction alea()).
3) Compléter ce programme pour faire écrire dans un fichier la probabilité précédente en fonction de r, R ayant une
valeur fixée.
4) Indiquer quelques conditions nécessaires que doivent vérifier les résultats.
Réponse :
#include<stdio.h>
#include<math.h>
#include<fonctions_magistere.h>
void t(double *x,double *y,double dif)
{
*x=2*dif*(alea()-0.5); *y=2*dif*(alea()-0.5);
}
double dist2(double x1,double y1,double x2,double y2)
{
return((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(void)
{
int i,imax=10000,s,j,nj;
double R,r,dif,x1,y1,x2,y2,dif2,d2,rmin,rmax,dr,r1,r2,tet2,dpi=2*acos(-1);
FILE *fich_1,*fich_2;
fich_1=fopen("proba_deux_pieces_1.res","w");
fich_2=fopen("proba_deux_pieces_2.res","w");
R=1; rmin=0.; rmax=R/2; dr=rmax-rmin; nj=51;
for(j=0;j<nj;j++)
{
r=rmin+dr*j/(nj-1);
dif=R-r; dif2=dif*dif; d2=4*r*r;
// Premiere methode on tire dans un carre de cote 2(R-r) et on enleve ce qui est en trop
for(s=0,i=1;i<=imax;i++)
{
do {t(&x1,&y1,dif);} while(dist2(0,0,x1,y1)>dif2);
do {t(&x2,&y2,dif);} while(dist2(0,0,x2,y2)>dif2);
if(dist2(x1,y1,x2,y2)>d2) continue;
s++;
}
printf("R=%lg r=%lg probabilite=%lg\n",R,r,(double)s/imax);
fprintf(fich_1,"%lg %lg\n",r,(double)s/imax);
// Seconde methode on tire dans un cercle de rayon R-r
for(s=0,i=1;i<=imax;i++)
{
r1=dif*sqrt(alea());
r2=dif*sqrt(alea()); tet2=dpi*alea();
x2=r2*cos(tet2); y2=r2*sin(tet2);
if(dist2(r1,0,x2,y2)>d2) continue;
s++;
}
printf("R=%lg r=%lg probabilite=%lg\n",R,r,(double)s/imax);
fprintf(fich_2,"%lg %lg\n",r,(double)s/imax);
}
fclose(fich_1); fclose(fich_2);
return(0);
}

4 2004-12-08 01 :08 :49.000000000


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

III) Chute d’une météorite (13)


On étudie la chute d’une météorite assimilée à un point matériel dans le champ de pesanteur terrestre, lancée suivant
la verticale vers le centre de la Terre. On tient compte du frottement exercé sur le point matériel par l’atmosphère
par une force proportionnelle au carré de la vitesse du corps et à la masse volumique de l’air, cette dernière étant
elle même une fonction de l’altitude.

z 0

v 0

O
R Terre

Fig. 3 –

Avec ces hypothèses, et sachant qu’on étudie la chute depuis une altitude donnée jusqu’au sol, le théorème de l’énergie
cinétique permet d’écrire :
z−R
 
2 −
d(v 2 ) R 2
v
= 2g − 2 + 2 e h 
dz z vl
avec :
z abscisse de la météorite sur un axe ayant pour origine le centre de la Terre
v = dz/dt vitesse de la météorite à tout instant2
g accélération de la pesanteur au niveau de la mer
R rayon de la Terre
vl vitesse limite qu’atteindrait la météorite si l’accélération de la pesanteur et la pression atmosphérique
avaient à toute altitude les valeurs qu’elles ont à la surface de la Terre
h constante de décroissance de la pression atmosphérique avec l’altitude
On note :
z0 l’abscisse initiale de la météorite
v0 sa vitesse initiale
On voit que la fonction v 2 est solution d’une équation différentielle du premier ordre du type :

dy/dx = f (x, y)

y étant la fonction inconnue, x la variable et f une fonction donnée, caractérisant l’équation différentielle. Comme
c’est une équation du premier ordre la donnée de la valeur y0 de y pour une valeur particulière x0 de x détermine
2 toujours négative puisqu’il s’agit d’une chute

5 2004-12-08 01 :08 :49.000000000


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

une solution unique. La méthode la plus simple pour résoudre numériquement cette équation de façon approchée
consiste à développer y au premier ordre :

y(x + δx) = y(x) + δx (dy/dx) = y(x) + δx f (x, y)

Cette expression permet de calculer une valeur approchée de y(x + δx) à partir de la donnée de y(x), cette valeur
approchée étant d’autant plus exacte que l’accroissement δx (appelé pas d’intégration) est plus petit. On calcule
donc y(x0 + δx) à partir de y(x0 ) = y0 , puis en réitérant, y(x0 + 2δx) à partir de y(x0 + δx), et ainsi de suite. On
obtient une suite de valeurs approchées de la solution.
1) On demande d’écrire un programme qui, utilisant cette méthode, permet de calculer la vitesse de la météorite en
z−R
1 −
fonction de sa position sur la verticale, depuis une altitude donnée jusqu’à la surface de la Terre. Le terme 2 e h
vl
ainsi que l’équation différentielle doivent être programmés chacun dans une fonction. Prendre les valeurs numériques
suivantes :
g=9.81 m.s−2
R=6400 km
vl =150 m.s−1
h=8 km
z0 =R+60 km
v0 =10 km.s−1
pas en z, δz =-10 m
et faire imprimer les résultats dans un fichier sous la forme :
z0 v0
z0 + dz v(z0 + dz)
z0 + 2dz v(z0 + 2dz)
etc.
2) Indiquer quelques conditions nécessaires que doivent vérifier les résultats.
Réponse :
#include <stdio.h>
const double R=6.4e6;
double f(double z)
{
double vl=150,vl2=vl*vl,h=8e3;
return (1/vl2*exp(-(z-R)/h));
}
double ed(double z,double vv)
{
const double g=9.81;
return (2*g*(-R*R/z/z+vv*f(z)));
}
int main(void)
{
int i,np;
double z,vv,z0,vv0,dz;
FILE *fich;
fich=fopen("chute_meteorite.res","w");
z0=R+6e4; vv0=1e8; dz=-10;
vv=vv0; z=z0;
while(z>R)
{
fprintf(fich,"%lg %lg\n",z,sqrt(vv));
vv=vv+dz*ed(z,vv);
z=z+dz;

6 2004-12-08 01 :08 :49.000000000


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

}
}

7 2004-12-08 01 :08 :49.000000000

Vous aimerez peut-être aussi