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 :
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 2012-2013 première session
Numéro d’anonymat : 2 2013-03-25 10 :17 :18.000000000
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 3 2013-03-25 10 :17 :18.000000000
Autre solution, plus élégante car n’utilisant pas de tableau, mais nécessitant une petite justification mathématique :
int main(){
int N, i, j, k;
N = 1000;
for (j = 2; j <= N; j++){
i = 2;
cout << j << " : ";
k = j;
while (i <= j){
if (k % i == 0){
cout << i << " ";
k = k / i;
}
else
i++;
}
cout << endl;
}
return 0;
}
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 4 2013-03-25 10 :17 :18.000000000
Pointeurs ** (11)
Dans les programmes qui suivent les flèches <------ signalent les lignes qui diffèrent.
Pour chacun de ces programmes indiquer s’il est valide, si non pourquoi, et si oui, le résultat affiché à l’écran.
Question 1
#include<iostream> #include<iostream> #include<iostream>
#include<stdlib.h> #include<stdlib.h> #include<stdlib.h>
using namespace std; using namespace std; using namespace std;
int main() int main() int main()
{ { {
int i,*p; int i,*p; int i,*p;
i=3; *p=i; i=3; p=&i; *p=3; i=*p; <------
cout << i << " " << *p << endl; cout << i << " " << *p << endl; cout << i << " " << *p << endl;
return 0; return 0; return 0;
} } }
Question 2
#include<iostream> #include<iostream> #include<iostream>
#include<stdlib.h> #include<stdlib.h> #include<stdlib.h>
using namespace std; using namespace std; using namespace std;
void ff(int *p) void ff(int *p) void ff(int *p)
{ { {
cout << *p << endl; cout << *p << endl; cout << p << endl; <------
} } }
int main() int main() int main()
{ { {
int i; int i; int i;
i=5; i=5; i=5;
ff(i); ff(&i); ff(&i); <------
return 0; return 0; return 0;
} } }
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 5 2013-03-25 10 :17 :18.000000000
Question 3
#include<iostream> #include<iostream> #include<iostream>
#include<stdlib.h> #include<stdlib.h> #include<stdlib.h>
using namespace std; using namespace std; using namespace std;
void ff(int i) void ff(int i) void ff(int i)
{ { {
cout << i << endl; cout << i << endl; cout << i << endl;
} } }
int main() int main() int main()
{ { {
int j,*p; int j,*p; int j,*p;
p=&j; p=&j; p=&j;
j=5; j=5; j=5;
ff(j); ff(*p); ff(p); <------
return 0; return 0; return 0;
} } }
Question 4
#include<iostream> #include<iostream>
#include<stdlib.h> #include<stdlib.h>
using namespace std; using namespace std;
int main() int main()
{ {
int i,n=5; int i,n=5;
double *t=(double *)malloc(n*sizeof(double)); double *t=(double *)malloc(n*sizeof(double));
double *p; <------
for(i=0;i<n;i++) t[i]=1; for(p=t;p<t+n;p++) *p=1; <------
for(i=0;i<n;i++) cout << t[i] << " "; for(i=0;i<n;i++) cout << t[i] << " ";
cout << endl; cout << endl;
return 0; return 0;
} }
Réponse : Réponse :
Valide : Valide :
11111 11111
on peut ajouter, retrancher un entier à un pointeur et faire
des comparaisons entre pointeurs du même type.
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 6 2013-03-25 10 :17 :18.000000000
~v0
~j C S
O ~i xc rt + h x
Un satellite est lancé avec une vitesse orthoradiale ~v0 contenue dans le plan (0xy), depuis le point de coordonnées (rt +h, 0).
L’orbite du satellite est donc contenue dans le plan (0xy). Le module de ~v0 est tel r que, si la masse volumique de la Terre
GM
était homogène (α = 1), le satellite aurait une orbite circulaire, on a donc v0 = , avec, en unités SI :
rt + h
G = 6.67 10−11 constante de la gravitation universelle
M masse de la Terre homogène
rt = 6.4 106 , rayon de la Terre
h = 8 105 altitude initiale du satellite
ρ = 5517 masse volumique de la région de la Terre figurée en blanc.
α=0
xc = 5.5 106
rc = 5 105
Question 1
Écrire un programme qui calcule la position du satellite par la méthode d’Euler3 à n instants depuis l’instant
3 En pratique il faut faire ces calculs avec la méthode de Runge-Kutta d’ordre 4 (qui n’est pas demandée ici pour simplifier l’énoncé) et non
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 7 2013-03-25 10 :17 :18.000000000
2π(rt + h)
initial t = 0 jusqu’à l’instant final t = 10 T , T = étant la période du satellite dans le cas où la
v0
Terre est homogène.
x et y étant les coordonnées du satellite, les triplets t x y seront écrits dans un fichier avec un triplet par ligne.
On n’écrira pas les instructions de tracé par gnuplot.
Le programme peut-être écrit avec ou sans tableaux et avec ou sans fonctions, mais la brièveté et la lisibilité
seront appréciées.
Réponse à la question :
Version minimaliste :
int main()
{
int i,np=10000000;
double rho,alpha,rt,rt3,hh,xc,rc,rc3,G,M,c,beta,t,dt,tfin,dt3,dc3,T,x,y,vx,vy,vxp,vyp;
rho=5517; alpha=0; rt=6.4e6; rt3=rt*rt*rt; hh=8.e5; xc=5.5e6; rc=5e5; rc3=rc*rc*rc; G=6.67e-11;
M=4./3*M_PI*rt3*rho; c=1.5; beta=4*M_PI*rho*G/3;
x=rt+hh; y=0; vx=0; vy=sqrt(G*M/x); // conditions initiales
T=2*M_PI*x/vy; tfin=10*T; dt=tfin/(np-1);
fstream res("satellite.res",ios::out);
for(i=0;i<np;i++)
{
t=i*dt;
res << t << " " << x << " " << y << endl;
dt3=pow(x*x+y*y,c);
dc3=pow((x-xc)*(x-xc)+y*y,c);
vxp=-rt3*x/dt3+rc3*(alpha-1)*(xc-x)/dc3; vxp*=beta;
vyp=-rt3*y/dt3-rc3*(alpha-1)*y/dc3; vyp*=beta;
x=x+vx*dt;
y=y+vy*dt;
vx=vx+vxp*dt;
vy=vy+vyp*dt;
}
return 0;
}
Version plus structurée, avec fonctions. Dans cette version il suffit de remplacer la ligne euler(sd,q,t,dt,n) ; par
rk4(sd,q,t,dt,n) ; pour faire le calcul avec la méthode de Runge-Kutta d’ordre 4 en utilisant la fonction rk4 de la
bibliothèque des fonctions du Magistère. Tous les intermédiaires sont possibles entre cette version structurée et la version
mininimaliste ci-dessus.
double mu_,xc_,rt3_,a3_;
//***********************************************************************************************************
void sd(double *q,double t,double *qp,int n)
{
static double c=1.5; double so3,sc3;
qp[0]=q[2];
qp[1]=q[3];
so3=pow(q[0]*q[0]+q[1]*q[1],c);
sc3=pow((q[0]-xc_)*(q[0]-xc_)+q[1]*q[1],c);
qp[2]=-rt3_*q[0]/so3+a3_*(xc_-q[0])/sc3; qp[2]=mu_*qp[2];
qp[3]=-rt3_*q[1]/so3-a3_*q[1]/sc3; qp[3]=mu_*qp[3];
}
//***********************************************************************************************************
void euler(void (*eq)(double *,double,double *,int),double *q,double t,double dt,int n)
{
int i;
double *qp=(double *)malloc(n*sizeof(double));
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 8 2013-03-25 10 :17 :18.000000000
eq(q,t,qp,n);
for(i=0;i<n;i++) q[i]=q[i]+dt*qp[i];
}
//***********************************************************************************************************
int main()
{
int n=4,i,np=1000000;
double rho,alpha,rt,hh,rc,G,M,T,t,dt,tfin,*q=D_1(n);
rho=5517.; alpha=0; rt=6.4e6; hh=8.e5; rc=5e5; G=6.67e-11;
mu_=4*M_PI*rho*G/3; xc_=5.5e6; rt3_=rt*rt*rt; a3_=rc*rc*rc*(alpha-1);
M=4./3*M_PI*rt3_*rho;
q[0]=rt+hh; q[1]=0; q[2]=0; q[3]=sqrt(G*M/q[0]); // conditions initiales
T=2*M_PI*q[0]/q[3]; tfin=10*T; dt=tfin/(np-1);
fstream res("satellite.res",ios::out);
for(i=0;i<np;i++)
{
t=i*dt;
res << q[0] << " " << q[1] << endl;
euler(sd,q,t,dt,n);
//rk4(sd,q,t,dt,n);
}
return 0;
}
Question 2
Si la Terre inhomogène tournait autour d’un axe perpendiculaire au plan Oxy, comment suffirait-il de modifier
le programme ? L’indiquer en une phrase, sans écrire les instructions.
Réponse à la question :
Dans le calcul des composantes de l’accélération du satellite il suffit de remplacer les coordonnées du centre de la Terre
et du centre de la sphère hétérogène de rayon rc par leur expression en fonction du temps, connue à priori.
−→ M
d3 g ×
lz
O P× y
lx
x ly
Le champ de gravitation créé par ce plateau en un point M quelconque de l’espace, de coordonnées (u, v, w), est donné
par l’intégrale :
Z lx Z ly Z lz −−→
−
→ MP
g (M ) = Gρ dx dy dz
0 0 0 M P3
P étant un point dont les coordonnées sont notées (x, y, z) et qui décrit tout le parallélépipède.
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 9 2013-03-25 10 :17 :18.000000000
lx ly lz
, δy = , δz = , le point Pijk ayant pour coordonnées (i − 21 )δx , (j − 21 )δy , (k − 21 )δz .
avec : δx =
n n n
Pour la suite il est conseillé de ne pas utiliser de tableaux et d’utiliser des variables intermédiaires.
Question 1
Écrire une fonction ayant six arguments x, y, z, u, v, w et qui retourne la valeur de M P 3 .
Réponse à la question :
double ff(double x,double y,double z,double u,double v,double w)
{
double d2,cc=3./2;
d2=(x-u)*(x-u)+(y-v)*(y-v)+(z-w)*(z-w);
return pow(d2,cc);
}
Question 2
Écrire un programme qui calcule les composantes gx , gy , gz du champ de gravitation en M .
Réponse à la question :
int main()
{
int i,j,k,q,n=100,N=1000000000;
double x,y,z,dx,dy,dz,lx,ly,lz,G,rho,u,v,w,gx,gy,gz,dd,c;
G=6.67e-11; rho=5500;
lx=50e3; ly=100e3; lz=3e3;
u=25e3; v=-1e3; w=0;
// Méthode par réseau régulier
dx=lx/n; dy=ly/n; dz=lz/n;
gx=0; gy=0; gz=0;
for(i=1;i<=n;i++)
{
x=(i-0.5)*dx;
for(j=1;j<=n;j++)
{
y=(j-0.5)*dy;
for(k=1;k<=n;k++)
{
z=(k-0.5)*dz;
dd=ff(x,y,z,u,v,w);
gx+=(x-u)/dd; gy+=(y-v)/dd; gz+=(z-w)/dd;
}
}
}
c=G*rho*dx*dy*dz;
gx*=c; gy*=c; gz*=c;
cout << gx << " " << gy << " " << gz << " " << sqrt(gx*gx+gy*gy+gz*gz) << endl;
return 0;
}
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session
Numéro d’anonymat : 10 2013-03-25 10 :17 :18.000000000
Question 3
Une autre façon de calculer l’intégrale est d’utiliser l’expression :
N −−→
lx ly lz X M P q
Gρ
N q=1 M Pq3
Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2012-2013 première session