Vous êtes sur la page 1sur 6

Numéro d’anonymat : 1 2009-05-27 10 :06 :50.

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-27 10 :06 :50.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, " << 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é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 :

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

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;
}
Pour le carré on peut se contenter de tirer dans [0, a] puisqu’il y a symétrie par rapport à Ox et Oy.

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

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

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
}

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;

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;
}

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 :

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

Vous aimerez peut-être aussi