Examen Janvier 04 Avec Corriges
Examen Janvier 04 Avec Corriges
Examen Janvier 04 Avec Corriges
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
...
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++)
{
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);
}
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.
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);
}
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
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 :
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;
}
}