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 60 0 volts 1000 volts Toute l enceinte est a 0 volts x (indice i) Les cotes sont exprimees en prenant 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égulier 1 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, j) = V (i 1, j) + V (i, j 1) + V (i + 1, j) + V (i, j + 1) 4 (moyenne arithmétique des quatre points adjacents) 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
v(0,105) v(1,0) v(1,1) v(1,105) v(60,0) v(60,1) v(60,105) <- une ligne blanche <- une ligne blanche <- une ligne blanche 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
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. D d d 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
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
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 z v 0 0 R O 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 : d(v 2 ) = 2g R2 dz z 2 + v2 vl 2 e z R h avec : On note : 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 instant 2 g accélération de la pesanteur au niveau de la mer R rayon de la Terre v l 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 z 0 l abscisse initiale de la météorite v 0 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 y 0 de y pour une valeur particulière x 0 de x détermine 2 toujours négative puisqu il s agit d une chute 5 2004-12-08 01 :08 :49.000000000
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(x 0 + δx) à partir de y(x 0 ) = y 0, puis en réitérant, y(x 0 + 2δx) à partir de y(x 0 + δ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 fonction de sa position sur la verticale, depuis une altitude donnée jusqu à la surface de la Terre. Le terme 1 e z R h 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 v l =150 m.s 1 h=8 km z 0 =R+60 km v 0 =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; v 2 l 6 2004-12-08 01 :08 :49.000000000
7 2004-12-08 01 :08 :49.000000000