Vous êtes sur la page 1sur 10

Numéro d’anonymat : 1 2012-03-07 00 :11 :41.

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 2011-2012 première session d’examen

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

Examen d’informatique 5 Mars 2012 14h à 16h bât. 337 salle 2

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é : par exemple la variable notée nt dans l’énoncé devra être écrite nt dans un
programme, n′′ devra être écrite ns.
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<stdlib.h> ... #include<bibli fonctions.h> using namespace std; nécessaires
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 principal 1 et les fonctions 2 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 2011-2012 première session
Numéro d’anonymat : 2 2012-03-07 00:11:41.000000000

Triangulation * (10) [20 lignes]


Pour constituer une carte géographique on cherche à déterminer les coordonnées (x, y) d’un point inaccessible P à
partir de deux points accessibles A et B, en mesurant :
– la longueur a = AB
−−→ −→
– l’angle θA = (AB, AP )
−−→ −−→
– l’angle θB = (BA, BP )

y  
x
P
y

θB
~
θA j
A O ~i B x
a a

2 2

(Dans le cas de cette figure θB est négatif)

dans ces conditions on a :


a sin(θA + θB )
x=−
2 sin(θA − θB )

sin θA sin θB
y = −a
sin(θA − θB )
Pour estimer l’erreur statistique commise sur les coordonnées de P on fait n mesures des quantités a, θA et θB que
l’on écrit manuellement dans un fichier nommé tri.dat sous la forme :
20
567.4 28.2 -115.9
568.1 27.8 -116.4
...
Sur le première ligne se trouve le nombre n de mesures effectuées et sur les n lignes suivantes les n valeurs mesurées
pour le triplet a, θA et θB .
Question : écrire un programme qui lit les données dans le fichier tri.dat et affiche à l’écran les n valeurs correspon-
dantes de x et y, la valeur moyenne de x et son écart type, la valeur moyenne de y et son écartptype.
On rappelle que, en notant <> la valeur moyenne, l’écart type d’une grandeur u peut s’écrire < u2 > − < u >2 .
Réponse à la question :
int main()
{
int i,n=20;
double a,teta,tetb,x,sx,s2x,y,sy,s2y;
fstream dat("tri.dat",ios::in);
dat >> n;
sx=0; sy=0; s2x=0; s2y=0;
for(i=1;i<=n;i++)

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 3 2012-03-07 00 :11 :41.000000000

{
dat >> a >> teta >> tetb;
teta=teta/180*M_PI; tetb=tetb/180*M_PI;
x=-a/2*sin(teta+tetb)/sin(teta-tetb);
y=-a*sin(teta)*sin(tetb)/sin(teta-tetb);
cout << x << " " << y << endl;
sx+=x; s2x+=x*x; sy+=y; s2y+=y*y;
}
cout << endl << "<x>=" << sx/n << " écart type de x=" << sqrt(s2x/n-sx*sx/n/n)
<< " <y>=" << sy/n << " écart type de y=" << sqrt(s2y/n-sy*sy/n/n) << endl;
return 0;
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 4 2012-03-07 00 :11 :41.000000000

Pointeurs ** (6)
Indiquer et expliquer ce qui sera affiché à l’écran par les deux programmes suivants écrits côte à côte. La seule ligne
qui diffère entre les deux programmes est repérée par //.

#include<iostream> #include<iostream>
#include<stdlib.h> #include<stdlib.h>
using namespace std; using namespace std;
int main() int main()
{ {
double *x,*y; int i,n=3; double *x,*y; int i,n=3;
x=(double *)malloc(n*sizeof(double)); x=(double *)malloc(n*sizeof(double));
for(i=0;i<n;i++) x[i]=i; for(i=0;i<n;i++) x[i]=i;
for(i=0;i<n;i++) y[i]=x[i]; // y=x; //
for(i=0;i<n;i++) for(i=0;i<n;i++)
cout << x[i] << " " << y[i] << endl; cout << x[i] << " " << y[i] << endl;
return 0; return 0;
} }

Réponse : Réponse :
Aucune adresse valide n’a été mise dans le pointeur
y donc il y a une erreur de segmentation. 0 0
1 1
2 2
Le pointeur y contient la même adresse que le poin-
teur x. Cette adresse a été attribuée par l’instruction
malloc et est donc valide.

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 5 2012-03-07 00 :11 :41.000000000

Déviation des rayons lumineux par l’atmosphère *** (12) [30 lignes]
La trajectoire d’un rayon lumineux dans un milieu inhomogène d’indice n(− →
r ) est donnée par le système d’équations
différentielles :
d − → →

(n t ) = ∇n
ds


t étant le vecteur unitaire tangent au rayon lumineux au point M (x, y, z) d’abscisse curviligne s, qui vaut :
−−→

→ dOM
t =
ds
On considère un rayon lumineux pénétrant dans l’atmosphère terrestre dans la configuration suivante :

−−→ y
M0 tM0

R
rayon −

tR

r0 + dy0

~j

−2r0 O ~i r0 x

Terre, de rayon r0

−−→
tM0 est le vecteur unitaire tangent au rayon en M0 .


tR est le vecteur unitaire tangent au rayon en R.
→ −
− → −−→ −

i , j , tM0 et tR devraient être tous de la même longueur puisqu’ils sont unitaires.
Ils ne le sont pas pour assurer une meilleure lisibilité de la figure.

Au point M0 de coordonnées (−2r0 , r0 + dy0 ) le rayon est parallèle à l’axe Ox. Il va ensuite être légèrement dévié
vers la Terre, le gradient de la pression atmosphérique entraı̂nant un gradient de l’indice de l’air. On prend :
r0 = 6.4 106 mètres, rayon de la Terre
dy0 = 1 mètre
La trajectoire du rayon est dans le plan de la figure et ses équations paramétriques x(s), y(s) sont les solutions du
système :
1 dn
ẍ = [x − ẋ(xẋ + y ẏ)]
nr dr
1 dn
ÿ = [y − ẏ(xẋ + y ẏ)]
nr dr
dx −−→
etc., →
− p
avec ẋ = r = OM donc r = x2 + y 2 .
ds

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 6 2012-03-07 00:11:41.000000000

Dans un modèle simple on prend :  


r − r0
n = 1 + ∆n exp −
h0
avec :
∆n = 2.8 10−4
h0 = 8 103 mètres
Le système d’équations différentielles peut alors s’écrire :

ẍ = f (r) [x − ẋ(xẋ + y ẏ)]

ÿ = f (r) [y − ẏ(xẋ + y ẏ)]


avec :
−1
f (r) =    
1 r − r0
rh0 exp +1
∆n h0
Question : écrire un programme qui calcule, par la méthode d’Euler, la trajectoire du rayon lumineux jusqu’à ce que
ce dernier rencontre la surface terrestre (à la précision du pas d’intégration ds près, qu’on prendra égal à 10 mètres).
−−−→
→ dOM

Soit R le point de rencontre du rayon avec la Terre et tR = (R) le vecteur unitaire tangent au rayon en R. Le
ds
→ −
− →
programme doit afficher à l’écran la valeur de l’angle orienté ( i , tR ). Pour un vecteur quelconque de composantes


vx , vy , l’angle orienté qu’il fait avec le vecteur i (en radians et dans l’intervalle [−π, π]) est donné par la fonction
atan2(vy,vx) du C++.
Il n’est pas nécessaire de prévoir le cas où le rayon ne rencontrerait pas la Terre, on suppose que c’est le cas avec les
conditions proposées.
On ne demande pas d’écrire les coordonnées des points de la trajectoire dans un fichier.
Remarque :
Ce genre de calcul permet de corriger les positions des étoiles de l’effet de l’atmosphère et de montrer que
la possibilité de voir le Canigou depuis la région de Marseille n’est pas une galéjade.
http ://canigou.allauch.free.fr
Réponse à la question :
double r0_=6400e3;
double ff(double r)
{
double h0=8.e3,dn=28e-5;
return -1/r/h0/(exp((r-r0_)/h0)/dn+1);
}
int main()
{
int j,nn=4;
double *q=D_1(4),*qp=D_1(4),tet,r,a,ds=10.,dy0=1.;
tet=0;
q[0]=-2*r0_; q[1]=r0_+dy0; q[2]=cos(tet); q[3]=sin(tet);
r=sqrt(q[0]*q[0]+q[1]*q[1]);
while(r>r0_)
{
// Calcul des dérivées
qp[0]=q[2];
qp[1]=q[3];
r=sqrt(q[0]*q[0]+q[1]*q[1]);
a=q[0]*qp[0]+q[1]*qp[1];
qp[2]=ff(r)*(q[0]-qp[0]*a);
qp[3]=ff(r)*(q[1]-qp[1]*a);

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 7 2012-03-07 00 :11 :41.000000000

// Euler
for(j=0;j<nn;j++) q[j]=q[j]+ds*qp[j];
}
cout << r << " " << 180./M_PI*atan2(q[3],q[2]) << " " << q[0] << " " << q[1] << endl;
return 0;
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 8 2012-03-07 00 :11 :41.000000000

Stationnement *** (12) [60 lignes]


X se rend tous les jours à la gare du RER en voiture venant de son domicile.

1

ng

np
ki

e
r

ar
i=
i=
Pa
Domicile

G
b b b b b b b b b b

B A
Chaque point • symbolise une place de stationnement

La gare se trouve au bout d’une longue avenue en sens unique qui comporte d’abord un parking puis np places de
stationnement. Chaque place a une probabilité p d’être libre. Au delà de la gare il n’y a pas de possibilité de se garer,
il faut faire le tour du quartier pour revenir au début de l’avenue. X essaye de stationner le plus près possible de la
gare. Il ne peut voir une place libre qu’en arrivant à sa hauteur. Si X arrive une première fois jusqu’à la gare sans
s’être garé il fait le tour du quartier Gare-A-B-Parking pour revenir au début de l’avenue et se gare dans le parking,
dans lequel il y a toujours de la place. Il n’essaie pas une seconde fois de prendre une place dans l’avenue, même s’il
en a repéré une qu’il a négligée lors de son premier passage en espérant trouver plus près de la gare, parce que cette
place pourrait avoir été prise entre temps et il ne peut pas prendre le risque de manquer son train.
Prendre les valeurs suivantes :
np=200
p=0.01
L =1000 mètres

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 9 2012-03-07 00 :11 :41.000000000

Question 1 : écrire, à l’aide de la fonction alea() 3 , une fonction nommée pl 4 , d’argument p, qui vaut 0 avec la
probabilité p et 1 avec la probabilité 1 − p
Réponse à la question :
int pl(double p)
{
if(drand48()<=p) return 0;
return 1;
}
Question 2 : la distance d à parcourir à pied depuis la place de stationnement numéro i (0 ≤ i ≤ np − 1) jusqu’à la
gare est donnée par la formule :  
i+1
d=L 1−
np + 1
Écrire une fonction nommée ll dont les arguments sont L, np et i et dont la valeur est d.
Réponse à la question :
double ll(double L,int np,int i)
{
return L*(1-(double)(i+1)/(np+1));
}
Question 3 : écrire un programme qui calcule la distance moyenne que X parcourt à pied pour parvenir à la gare
dans chacune des trois hypothèses suivantes :
1. Il prend la première place qu’il trouve dans l’avenue.
2. Il prend la seconde place qu’il trouve dans l’avenue.
3. Il prend la seconde place qu’il trouve dans l’avenue lorsqu’il est dans la première moitié de l’avenue et la
première place dans la seconde moitié de l’avenue.
Les distances moyennes seront calculées sur N = 105 épreuves.
Question 4 : que faut-il ajouter au programme pour généraliser les points 1. et 2. de la question 3 en calculant la
longueur moyenne lk du trajet à parcourir à pied dans l’hypothèse ou X prend toujours la k ème place qu’il trouve,
avec 0 ≤ k ≤ np − 1 ?

3. Ou la fonction drand48() si l’on préfère.


4. La valeur de la fonction pl représente le nombre de voitures (0 ou 1) se trouvant sur l’emplacement de stationnement. Donc 0
représente une place libre, 1 une place occupée.

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2011-2012 première session
Numéro d’anonymat : 10 2012-03-07 00 :11 :41.000000000

Réponse aux questions 3 et 4 :


int main()
{
int i,j,k,jmax=100000,np=200,nps2=np/2;
double p=0.01,sl1,sl2,sl3,L=1000,*l=D_1(np);
sl1=0; sl2=0; sl3=0; for(i=0;i<np;i++) l[i]=0;
// Boucle sur les épreuves successives
for(j=1;j<=jmax;j++)
{
// Hypothèse 1
for(i=0;i<np;i++)
{
if(pl(p)==0) {sl1+=ll(L,np,i); break;}
if(i==np-1) sl1+=L;
}
// Hypothèse 2
for(k=0,i=0;i<np;i++)
{
if(pl(p)==0) {k++; if(k<2) continue; sl2+=ll(L,np,i); break;}
if(i==np-1) sl2+=L;
}
// Hypothèse 3
for(k=0,i=0;i<np;i++)
{
if(pl(p)==0) {k++; if(i<nps2 && k<2) continue; sl3+=ll(L,np,i); break;}
if(i==np-1) sl3+=L;
}
// Question 4
for(k=0,i=0;i<np;i++) if(pl(p)==0){l[k]+=ll(L,np,i); k++;}
for(i=k;i<np;i++) l[i]+=L;
}
cout << setprecision(15);
cout << sl1/jmax/L << " " << sl2/jmax/L << " " << sl3/jmax/L << endl;
for(i=0;i<np;i++)
{
cout << i << " " << l[i]/jmax/L << endl;
}
return 0;
}

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

Vous aimerez peut-être aussi