Vous êtes sur la page 1sur 9

Numéro d’anonymat : 1 2009-05-28 01 :16 :54.

000000000

Reportez votre numéro d’anonymat dans le cadre ci-dessous et en haut à gauche de chaque page de
l’énoncé.

A la fin de l’épreuve glissez ce cahier dans la copie double qui vous a été fournie, qui comporte
votre numéro d’anonymat et sur laquelle vous aurez écrit et masqué votre nom en rabattant dessus
et en collant la languette triangulaire. Vous ne devez rien écrire d’autre sur cette copie double.

Numéro d’anonymat :

UNIVERSITE DE PARIS SUD Centre d’Orsay 2008-2009 première session d’examen

L3 et Magistère 1ère année de Physique fondamentale

Examen d’informatique Lundi 25 Mai 2009 9h à 11h bât. 337

Aucun document n’est autorisé.


Les programmes doivent être écrits en C/C++. Les réponses doivent obligatoirement être écrites sur les feuilles
de l’énoncé, dans l’espace réservé. Il est fortement conseillé de rédiger d’abord le plan des réponses au brouillon.
Respecter les notations de l’énoncé.
Ne pas commencer à répondre à un exercice avant de l’avoir entièrement lu.
L’utilisation de fonctions est laissée à l’appréciation de l’étudiant, sauf quelques cas où elle est imposée.
On suppose que tous les #include nécessaires tels que #include<stdlib.h> #include<bibli fonctions.h> ...
using namespace std ; sont sous-entendus, il n’y a pas à les écrire.
On rappelle qu’on ouvre un fichier en écriture par l’instruction : fstream xxx("nom de fichier.qqc",ios : :out) ;
et en lecture par : fstream yyy("nom de fichier.qqc",ios : :in) ;
Ne pas faire lire les données au clavier ou dans un fichier par un cin >>, ou l’équivalent pour un fichier, sauf si
cela est explicitement demandé. Par défaut, les données seront donc fournies dans le programme lui-même, par
des instructions du type :
dx=0.01;
a=1.7; b=1.1;
etc.
Dans chaque exercice on suppose que le programme principal1 et les fonctions2 sont écrits dans un unique fichier.
Les exercices sont indépendants les uns des autres.
Le nombre d’étoiles (de zéro à trois) donne une indication sur le niveau de l’exercice.
Le nombre de points (sur 40) attribué à chaque exercice est indiqué entre parenthèses après le nom de l’exercice
(c’est un barème indicatif ). Deux points sont réservés à la qualité de la présentation.
A titre indicatif le nombre de lignes du corrigé de chaque exercice est indiqué entre crochets (tout compris, c’est
à dire avec int main(), les accolades, return 0 ;, des commentaires éventuels).
Le corrigé pourra être consulté sur le site du cours.
1 s’il y en a un
2 s’il y en a

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 2 2009-05-28 01 :16 :54.000000000

Energie électrostatique * (4) [10 lignes]


On suppose qu’un gramme d’électrons est réparti uniformément dans une sphère d’un centimètre de diamètre.
L’énergie électrostatique de cette sphère vaut :
 2
9 1 mq 1
15 4πε0 me r
Question : Ecrire un programme qui calcule cette énergie en prenant comme unité d’énergie l’énergie produite par
le Soleil en un an, sachant qu’à chaque seconde il convertit en énergie une masse M de matière égale à quatre tonnes.
On respectera les notations suivantes pour les constantes intervenant dans le calcul (unités SI) :
charge de l’électron q = −1.6 10−19
masse de l’électron me = 9.11 10−31
masse de la sphère m = 10−3
rayon de la sphère r = 0.5 10−2
constante diélectrique k = 1/4πε0 = 9 109
vitesse de la lumière c = 3 108
masse de matière convertie par seconde M = 4 103
nombre de secondes dans un jour ns = 86400
nombre de jours dans un an nj = 365

Réponse :
int main()
{
double q,qt,k,m,me,r,E,c,M,nsj,nja,u;
q=1.6e-19; m=1e-3; me=9.11e-31; r=0.5e-2; c=3e8; M=4e3; nsj=86400; nja=365; k=9e9;
qt=m/me*q;
E=9./15*k*qt*qt/r;
u=M*c*c*nsj*nja;
cout << E << " Joules, soit " << E/u << " fois l’énergie produite par le Soleil en une année" << endl;
return 0;
}
Commentaire :
L’énergie électrostatique de la sphère représente l’énergie produite par le Soleil en 2.93 ans.

Résultat ** (5) [3 lignes]


Quel résultat le programme suivant affiche-t-il à l’écran ?
int main()
{
int x,y,*z;
x=1; z=&x; y=*z;
cout << x << " " << y << " " << *z << endl;
x=2;
cout << x << " " << y << " " << *z << endl;
*z=3;
cout << x << " " << y << " " << *z << endl;
return 0;
}
Réponse :
111
212
313

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 3 2009-05-28 01 :16 :54.000000000

Distance moyenne au centre ** (7) [15 lignes]


On considère un carré de côté 2a. Ici le mot carré désigne l’ensemble des points se trouvant sur les bords ou à
l’intérieur :

y y
a a

„ « „ «
x x
× P × P
~j y ~j y

-a O ~i a x -a O ~i a x

-a -a

Question 1 : Ecrire un programme qui calcule par une méthode statistique la valeur moyenne de la distance des
points du carré à son centre O.
Question 2 : On considère le disque ayant le même centre que le carré et de rayon a. Quelles instructions faut-il
ajouter au programme précédent pour qu’il calcule aussi la valeur moyenne de la distance des points du disque à son
centre ?

Réponse :
int main()
{
int i,j,n=1000000; // ajouter j pour la question 2
double x,y,r,rm,rmm,a=1.; // ajouter rmm pour la question 2
for(rm=0,rmm=0,j=0,i=1;i<=n;i++) // ajouter rmm=0 et j=0 pour la question 2
{
x=a*(2*alea()-1); y=a*(2*alea()-1);
r=sqrt(x*x+y*y);
rm+=r;
if(r<=a){rmm+=r; j++;} // ligne à ajouter pour la question 2
}
cout << "carré : rmoy=" << rm/n << endl;
cout << "cercle : rmoy=" << rmm/j << endl; // ligne à ajouter pour la question 2
return 0;
}
On peut se contenter de tirer dans [0, a] puisqu’il y a symétrie par rapport à Ox et Oy.

Commentaire :
Ces résultats peuvent être obtenus analytiquement, mais dans le cas du carré l’intégrale n’est pas évidente.
Pour le carré :

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 4 2009-05-28 01 :16 :54.000000000

a a Z πZ a Z π
1 2 2a 4 dθ
Z Z
4 cos θ ρ2 dρ dθ =
p
< d >= 2 x2 + y 2 dx dy = 2
4a −a −a a 0 0 3 0 cos3 θ
  π
  4
2a  θ 1 1
= Argth tan − +

3 2 θ θ 4(1 − sin θ)

4(cos + sin )2
2 2 0
(primitive trouvée sur http ://integrals.wolfram.com/index.jsp)
Pour le disque :
2π a
1 2 a3 2a
Z Z
< d >= ρ2 dρ dθ = =
πa2 0 0 a2 3 3
On obtient le résultat suivant avec 1000000 de tirages et a = 1 :

< d > statistique < d > analytique

carré 0.765107 0.765196


cercle 0.666651 0.666667

Dérivée d’un polynôme * (4) [6 lignes]


On suppose que les coefficients du polynôme de degré n
a0 + a1 x + · · · + an−1 xn−1 + an xn
sont stockés dans le tableau a.
Question : Ecrire une fonction nommée der telle que le programme suivant qui l’appelle :
#define N 6
int main()
{
int i;
double a[N]={1,2,3,4,5,6};
for(i=0;i<N;i++) cout << a[i] << "x^" << i << " ";
cout << endl;
der(a,N-1);
for(i=0;i<N-1;i++) cout << a[i] << "x^" << i << " ";
cout << endl;
return 0;
}
affiche ainsi à l’écran le polynôme puis sa dérivée :
1x^0 2x^1 3x^2 4x^3 5x^4 6x^5
2x^0 6x^1 12x^2 20x^3 30x^4
Réponse :
void der(double *t,int n) // ou void der(double t[],int n)
{
int i;
for(i=1;i<=n;i++) t[i-1]=i*t[i];
t[n]=0; // facultatif
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 5 2009-05-28 01 :16 :54.000000000

Distribution statistique ** (8) [18 lignes]


On appelle loi uniforme sur [0, 1] la loi d’une variable aléatoire dont la densité est 1 sur [0, 1], et 0 en dehors de cet
intervalle (c’est la loi de la fonction alea()). Soit x1 et x2 deux variables aléatoires indépendantes de loi uniforme
sur [0, 1].
Question 1 : Ecrire un programme qui constitue dans un tableau de N éléments la distribution statistique de la
1
variable aléatoire (x1 + x2 ).
2
Question 2 : Comment faut-il modifier le programme précédent pour qu’il constitue dans le même tableau la
k
1X
distribution statistique de xi les xi étant des variables aléatoires de loi uniforme sur [0, 1] indépendantes deux
k i=1
à deux et k un entier positif quelconque ?

Réponse :
#define N 100
int main()
{
int i,j,n=100000;
// int i,j,n=100000,k=10,l; // remplacer la ligne précédente par celle-ci
double s,di[N]; // pour la question 2
for(i=0;i<N;i++) di[i]=0;
for(i=1;i<=n;i++)
{
s=(alea()+alea())/2;
// for(s=0,l=1;l<=k;l++) {s+=alea();} s=s/k; // remplacer la ligne précédente par celle-ci
j=(int)floor(s*N); // pour la question 2
if(j<0) j=0; if(j>N-1) j=N-1;
di[j]++;
}
for(i=0;i<N;i++) cout << i << " " << di[i] << endl;
return 0;
}

Commentaire :
En traçant le contenu du tableau sous forme d’histogramme avec gnuplot on obtient :

2000 4500
’distri.res’ ’distri.res’

1800 4000

1600
3500

1400
3000

1200
2500
1000
2000
800

1500
600

1000
400

200 500

0 0
0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1

k=2 k = 10

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 6 2009-05-28 01 :16 :54.000000000

Oscillateur *** (10) [22 lignes]


Deux particules de mêmes masses m sont situées dans un plan aux points M1 et M2 et sont reliées par un ressort de
raideur k et de longueur au repos l0 :

M2


r

M1
~j
O ~i x

−−−−→ −
→ → → d−
− →
r
On pose −
→r = M1 M2 = x i + y j , −̇ r = et r = |−

r |.
dt
En plus de la force exercée par le ressort, M1 est soumise à une force de frottement fluide de la forme


r
λ ṙ
r
et M2 à la force opposée. λ est un paramètre.
Dans ces conditions −→r obéit à l’équation
   
−̈
→ 2 l0 λ −
r =− k 1− → −̇

+ 2 r . r − →
r
m r r

Question : Ecrire un programme qui calcule les fonctions x(t) et y(t) par la méthode d’Euler, avec les valeurs des
paramètres k = 10, λ = 0.01, l0 = 1, m = 1 et les conditions initiales à t = 0 : x = 2, y = 0.5, ẋ = 1, ẏ = 1.
Les résultats seront écrits dans un fichier en mettant un triplet t x y par ligne de façon à obtenir par exemple :
0 2 0.5
0.02 2.02 0.52
0.04 2.03175 0.537938
0.06 2.03508 0.553709
0.08 2.02989 0.567223
...
Le programme peut être écrit avec ou sans fonctions, l’essentiel est qu’il soit bref et clair.

Réponse :
int main()
{
int n=4,i,j,np;
double t,dt,tfin,a,b,c,s,r2,r,k,lambda,l0,m;
double *q=D_1(n),*qp=D_1(n);
k=10; lambda=0.05; l0=1; m=1;
q[0]=2; q[1]=0.5; q[2]=1; q[3]=1;
fstream res("oscillateur_euler.res",ios::out);
np=60001; tfin=250; dt=tfin/(np-1);

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 7 2009-05-28 01 :16 :54.000000000

t=0;
for(i=1;i<=np;i++)
{
res << t << " " << q[0] << " " << q[1] << endl;
r2=q[0]*q[0]+q[1]*q[1]; s=q[0]*q[2]+q[1]*q[3];
r=sqrt(r2); a=k*(1-l0/r); b=lambda*s/r2; c=-2*(a+b)/m;
qp[0]=q[2]; qp[1]=q[3]; qp[2]=c*q[0]; qp[3]=c*q[1];
for(j=0;j<n;j++) q[j]=q[j]+dt*qp[j];
t=t+dt;
}
res.close();
return 0;
}
Comme il n’y a que deux fonctions inconnues et leurs dérivées une version sans tableau est aussi possible :
int main()
{
int i,np;
double x,y,vx,vy,xp,yp,vxp,vyp,t,dt,tfin,a,b,c,s,r2,r,k,lambda,l0,m;
k=10; lambda=0.05; l0=1; m=1;
x=2; y=0.5; vx=1; vy=1;
fstream res("oscillateur_euler.res",ios::out);
np=60001; tfin=250; dt=tfin/(np-1);
t=0;
for(i=1;i<=np;i++)
{
res << t << " " << x << " " << y << endl;
r2=x*x+y*y; s=x*vx+y*vy;
r=sqrt(r2); a=k*(1-l0/r); b=lambda*s/r2; c=-2*(a+b)/m;
xp=vx; yp=vy; vxp=c*x; vyp=c*y;
x=x+dt*xp; y=y+dt*yp; vx=vx+dt*vxp; vy=vy+dt*vyp;
t=t+dt;
}
res.close();
return 0;
}
Commentaire 1 : justification de l’expression des forces.
La force exercée par le ressort sur la masse (1) s’écrit


→  −−−−→ −
−−−→
M1 M2 −

r
f ressort → 1 = k |M1 M2 | − l0 = k (r − l0 )
M1 M2 r
La force de frottement fluide exercée sur la masse (1) est proportionnelle à la vitesse de variation de la distance des
−−−−→
M1 M2
deux masses et dirigée selon le vecteur unitaire
M1 M2
−−−−→ −−−−→

→ d|M1 M2 | M1 M2 d|−r| −
→ →r
f frott. fluide → 1 = λ =λ
dt M1 M2 dt r
Or
√− −
→ d−
→r


d| r | d r→ 2 2 r r d−

→ →r
= = √− dt = .
dt dt 2 r→ 2 r dt
Soit −→
r d− →r −
→

→ r λ → −̇
= 2 − r .→
r −→

f frott. fluide → 1 = λ . r
r dt r r

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 8 2009-05-28 01 :16 :54.000000000

La relation fondamentale de la dynamique s’écrit


−−−→
d2 OM1 −
→ −
→ 
2
= m f ressort → 1 + f frott. fluide → 1
dt
−−−→
d2 OM2 −
→ −
→  −
→ −
→ 
= m f ressort → 2 + f frott. fluide → 2 = −m f ressort → 1 + f frott. fluide → 1
dt2
Donc en soustrayant la seconde relation de la première on obtient
−−−−→
d2 M2 M1 2 −
→ −
→ 
2
= f ressort → 1 + f frott. fluide → 1
dt m
Soit    
−̈
→ 2 l0 λ → −̇
r =− k 1− + 2 −
r .→
r − →
r
m r r
qui donne le mouvement de la particule relative.

Commentaire 2 : comparaison Euler Runge-Kutta


Le même calcul fait avec Runge-Kutta d’ordre 4 donnerait le programme suivant :
#include<stdlib.h>
#include<cmath>
#include<string.h>
#include<time.h>
#include<iostream>
#include<fstream>
#include<iomanip>
#include<bibli_fonctions.h>
using namespace std;
double pi_=acos(-1.); double k_,lambda_,l0_,m_;
//******************************************************************************************************
void sd(double *q,double t,double *qp,int n)
{
int i; double r2,r,s,a,b;
for(r2=0,s=0,i=0;i<n/2;i++) {r2+=q[i]*q[i]; s+=q[i]*q[i+n/2];}
r=sqrt(r2); a=k_*(1-l0_/r); b=lambda_*s/r2;
for(i=0;i<n/2;i++) {qp[i]=q[i+n/2]; qp[i+n/2]=-2/m_*(a+b)*q[i];}
}
//******************************************************************************************************
int main()
{
int n=4,i,np;
double t,dt,tfin;
double *q=D_1(n);
k_=10; lambda_=0.05; l0_=1; m_=1;
q[0]=2; q[1]=0.5; q[2]=1; q[3]=1;
fstream res("oscillateur_rk4.res",ios::out);
np=60001; tfin=250; dt=tfin/(np-1);
t=0;
for(i=1;i<=np;i++)
{
res << t << " " << q[0] << " " << q[1] << endl;
rk4(sd,q,t,dt,n);
t=t+dt;
}
res.close();
fstream gnup("oscillateur_rk4.gnu",ios::out);

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session
Numéro d’anonymat : 9 2009-05-28 01 :16 :54.000000000

gnup << "set size .78,1." << endl;


gnup << "plot ’oscillateur_rk4.res’ u 2:3 w l" << endl;
gnup << "pause -1" << endl;
gnup.close();
system("gnuplot oscillateur_rk4.gnu");
// system("rm oscillateur_rk4.res oscillateur_rk4.gnu");
return 0;
}
La figure suivante illustre la différence entre Euler et Runge-Kutta :

’oscillateur_euler.res’ u 2:3 ’oscillateur_rk4.res’ u 2:3

4 4

2 2

0 0

-2 -2

-4 -4

-4 -2 0 2 4 -4 -2 0 2 4

Euler Runge-Kutta

Le résultat de Runge-Kutta a le comportement attendu : le mouvement est la composition d’une oscillation et d’une
rotation. L’oscillation est amortie par le frottement fluide et seule la rotation subsiste finalement. Le résultat d’Euler
coı̈ncide au début avec Runge-Kutta (cela ne se voit pas sur cette figure mais sur des courbes obtenues avec une
durée moins longue) puis la particule relative part à l’infini.

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

Vous aimerez peut-être aussi