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-27 10 :06 :50.000000000
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, " << E/u << " années de Soleil" << endl;
return 0;
}
Commentaire :
L’énergie électrostatique de la sphère représente l’énergie produite par le Soleil en 2.93 ans.
Réponse :
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-27 10 :06 :50.000000000
111
212
313
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;
}
Pour le carré on peut se contenter de tirer dans [0, a] puisqu’il y a symétrie par rapport à Ox et Oy.
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-27 10 :06 :50.000000000
a0 + a1 x + · · · + an−1 xn−1 + an xn
Réponse :
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;
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-27 10 :06 :50.000000000
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;
}
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 :
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-27 10 :06 :50.000000000
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.01; 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=1000001; tfin=20; dt=tfin/(np-1);
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.01; l0=1; m=1;
x=2; y=0.5; vx=1; vy=1;
fstream res("oscillateur_euler.res",ios::out);
np=1000001; tfin=20; 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;
}
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2008-2009 première session