Académique Documents
Professionnel Documents
Culture Documents
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 :
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
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.
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
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 :
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
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
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
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
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