Méthodes Numériques et Informatiques Examen du 5 janvier 2010 I

Transcription

Méthodes Numériques et Informatiques Examen du 5 janvier 2010 I
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2009-2010
MP050
Méthodes Numériques et Informatiques
Examen du 5 janvier 2010
Calculatrices et documents autorisés
Durée 2 heures 30.
Les trois parties sont indépendantes.
Les questions indépendantes sont signalées par le symbole ?
Dans toutes les réponses exprimées en unix, indiquer explicitement tous les blancs par le symbole ␣
Traiter les questions de programmation
en choisissant soit le Fortran, soit le langage C
et l’indiquer sur votre copie.
I
Unix
Vous êtes l’utilisateur user1 du groupe enseignants. Dans votre répertoire d’accueil /home/user1/, vous disposez
d’un sous-répertoire /home/user1/paris/ecoles/, contenant les notes des élèves des écoles primaires de la ville de
Paris. Les résultats de chaque école sont contenus dans un fichier dont le nom est du type : res_XX_YY.dat,
où XX désigne le numéro de l’arrondissement (entre 01 et 20) et YY le numéro de l’école (supérieur ou égal à 01) dans
l’arrondissement.
Exemple de fichier pour la première école
Chaque fichier comprend les résultats d’une école toutes
du 5e arrondissement
classes confondues, chaque ligne du fichier indiquant les
fichier res_05_01.dat :
résultats d’un élève, sous la forme de huit colonnes :
colonne 1 : le nom de l’élève,
Torino
Abracpova
Etter
Alonso
Badertscher
Beaumier
Blatter
Bonacci
Barry
Carpinteiro
Comino
Doutre
Banesic
Dejoux
colonne 2 : son prénom,
colonne 3 : sa classe (cp, ce1, ce2, cm1 ou cm2),
colonne 4 : sa moyenne en Français,
colonne 5 : sa moyenne en Histoire,
colonne 6 : sa moyenne en Géographie,
colonne 7 : sa moyenne en Mathématiques,
Stefy
Olga
Aurelia
Christina
Valentine
Marie
Isabelle
Helene
Irene
Vanessa
Daniela
Delphine
Silvia
Laure
cm1
ce1
cm2
cp
cm2
cp
ce1
ce2
cm1
cm1
ce2
cp
cp
cm1
8
5
6
9
8
5
6
9
4
6
4
5
7
4
5
8
6
9
7
6
3
7
5
8
9
5
9
2
6
9
9
8
5
7
6
5
4
9
7
4
8
8
colonne 8 : sa moyenne en Sciences naturelles.
Dans ces fichiers, les noms et prénoms ne comportent pas d’espace et les notes sont des entiers entre 0 et 9.
Votre répertoire de travail est /home/user1/.
4
8
4
6
4
8
2
8
8
6
5
7
8
9
7
5
9
7
9
4
9
7
5
8
5
8
8
8
? Q 1 : Indiquer la commande pour construire un répertoire stats/ sous le répertoire paris/.
? Q 2 : Quelle commande permet d’afficher le nombre d’écoles primaires à Paris ?
? Q 3 : Indiquer la commande qui permet d’afficher les noms et attributs de tous les fichiers du répertoire paris/
tel qu’indiqué ci-dessous ?
drwxr-xr-x 4 user1 enseignants
drwxr-xr-x 12 user1 enseignants
drwxr-x--- 15 user1 enseignants
drwxrwxr-x 16 user1 enseignants
1024
1024
4096
1024
Dec
Dec
Dec
Dec
22
22
24
25
15:29
15:29
00:00
12:00
./
../
ecoles/
stats/
? Q 4 : Quelle(s) commande(s) permet(tent) de donner au répertoire stats/ les mêmes droits que ceux du répertoire
ecoles/ ?
? Q 5 : Quelle commande permet de faire du répertoire stats/ votre répertoire de travail ?
Dans les questions suivantes, on suppose que stats/ reste votre répertoire de travail.
1/8
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2009-2010
MP050
? Q 6 : On souhaite travailler sur les résultats de l’ensemble des écoles du 5e arrondissement. Copier les fichiers de
résultats nécessaires dans votre répertoire courant.
? Q 7 : Concaténer les fichiers copiés en un seul fichier stats_05.dat.
Dans les questions suivantes sauf la dernière (Q 13), on utilisera le fichier stats_05.dat.
? Q 8 : Quelle commande permet d’afficher le nombre total d’élèves du 5e arrondissement ?
? Q 9 : Créer les trois fichiers stats_05_cp.dat, stats_05_ce.dat, stats_05_cm.dat contenant respectivement les
résultats des classes de CP, puis de CE1 et CE2 (confondus), puis de CM1 et CM2 (confondus).
? Q 10 : Pour chaque élève de CM, quelle commande permet d’afficher une neuvième colonne correspondant à sa
moyenne générale (toutes les disciplines ont le même coefficient) ?
? Q 11 : Afficher les informations des 3 élèves de CE ayant eu les meilleures notes en Mathématiques.
? Q 12 : Quelle commande permet de calculer la moyenne en Sciences naturelles des élèves de CM ?
? Q 13 : En gardant stats/ comme répertoire de travail, quelle commande permet d’obtenir le nombre d’élèves de
CE2, sur l’ensemble de la ville, ayant obtenu 9 en Géographie ?
II
Exercice
On s’intéresse à des données de précipitations totales journalières échantillonnées sur une grille rectangulaire de
nlat points en latitude par nlon points en longitude : chaque valeur de précipitation représente la moyenne des
précipitations sur la maille élémentaire 1 de la grille. Les données de précipitations constituent une matrice stockée
sous forme de tableau 2D de réels nommé mat de taille nlat par nlon et alloué par le programme principal. En
fortran comme en C, le premier indice décrit les latitudes et le second décrit les longitudes. D’autre part, les tableaux
1D x et y fournissent les nlon valeurs réelles des longitudes et les nlat valeurs réelles des latitudes de la grille utilisée.
II.A
Procédures à écrire
Dans toutes les questions de cette section, les procédures demandées doivent respecter un prototype permettant de les
appeler comme mentionné dans le programme principal fourni en annexe IV.A.1, page 5. En fortran, on précisera les
attributs INTENT des arguments des procédures.
? Q 14 : Écrire une fonction moyenne qui calcule et renvoie la valeur moyenne des précipitations sur toute la grille
mat (voir l’appel dans le programme principal ligne 71 en fortran et ligne 69 en C).
? Q 15 : Écrire une procédure compte_zeros qui compte, pour chaque bande de latitude, le nombre de mailles
(aux différentes longitudes) où les précipitations sont négligeables (en pratique inférieures à 0.001). Cette procédure
remplira un tableau 1D nommé nb_zeros de taille nlat préalablement alloué par le programme principal (voir l’appel
dans le programme principal ligne 76 en fortran et ligne 74 en C).
? Q 16 : On souhaite dégrader la résolution spatiale des données d’un facteur 2 dans les deux directions ce qui
multiplie par 4 la surface de la maille élémentaire (voir fig. 1). Les précipitations sur le domaine sont alors décrites
par une grille matr comportant 2 fois moins d’éléments dans chaque direction. La valeur de précipitation dans la
maille grossière est la moyenne des valeurs des quatre mailles fines qui la constituent. Écrire une procédure nommée
regrille qui effectue ce re-échantillonage en remplissant le tableau 2D basse résolution à partir des valeurs de la
grille initiale (voir l’appel dans le programme principal ligne 80 en fortran et ligne 78 en C). On suppose que les
nombres de longitudes et de latitudes de la grille initiale sont tous les deux pairs. On rappelle qu’en fortran, les
indices des tableaux commencent à 1...
1. On suppose que la surface de la maille est constante en particulier indépendante de la latitude.
2/8
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2009-2010
MP050
nlat
nlon
Figure 1 – Dégradation de la résolution spatiale : exemple du passage d’une grille 4 × 6 à une grille 2 × 3
II.B
Codes fournis à expliquer
? Q 17 : Dans le programme principal (voir IV.A.2, page 6), quel est le rôle de la boucle while de la ligne 103 en
fortran, et de la ligne 103 en C ? Proposer un texte plus informatif pour remplacer le message de la ligne 107 en
fortran et de la ligne 107 en C.
? Q 18 : Expliquer le rôle des lignes de code numérotées de 112 à 123 en fortran et de 112 à 123 en C (voir IV.A.2,
page 6).
Q 19 : Décrire avec précision le rôle des lignes de code numérotées de 126 à 139 en fortran et de 126 à 139 en C
(voir IV.A.2, page 6). Expliquer quelles sont les valeurs de qlat et qlon à la fin de ce code.
III
Problème
Les procédures demandées dans cette partie doivent respecter les prototypes incomplets indiqués dans l’annexe IV.B
qui comporte aussi les codes fournis pour cette partie. En fortran, on précisera les attributs INTENT des arguments des
procédures.
III.A
Recherche de zéro par la méthode de Newton (voir prototypes incomplets en
annexe IV.B.1, page 7)
Principe
La méthode de Newton permet de rechercher, par approximations successives, les
solutions d’équations du type f (x) = 0,
lorsque la dérivée f 0 de la fonction f est
connue. On choisit tout d’abord une première approximation x0 de la solution
dans le domaine de définition de f . Puis,
on itère le processus suivant : si xn est
l’approximation de la solution à l’étape n
de l’algorithme, l’approximation suivante
xn+1 est obtenue en calculant l’intersection de la tangente à f en xn avec l’axe
des abscisses (voir la figure ci-contre).
Figure 2 – Méthode de Newton : x1 est l’intersection avec l’axe des abscisses de la tangente
à f en x0 . Puis x2 est construit à partir de la
tangente en x1 , et ainsi de suite.
? Q 20 : Dans le cas général, écrire l’équation de la tangente à f en un point d’abscisse xn , en fonction de xn , f (xn )
et f 0 (xn ). En déduire xn+1 en fonction de xn , f (xn ) et f 0 (xn ).
3/8
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
On considère dans cette partie la fonction
f (x) = ln x + x.
? Q 21 : Faire une étude succincte de cette
fonction : préciser en particulier son domaine
de définition, sa dérivée, son sens de variation,
ses limites aux bornes du domaine de définition. La courbe représentative de la fonction f
est fournie figure 3. Proposer un encadrement
de la solution de l’équation f (x) = 0.
Q 22 : On choisit x0 = 1. Calculer à la main
x1 par la méthode de Newton. Vérifier graphiquement sur la figure 3.
2009-2010
MP050
5
log(x)+x
4
3
2
Figure 3 – Tracé de la
fonction ln(x) + x
1
0
? Q 23 : Écrire en C ou en Fortran une fonction nommée f qui admet un argument réel x,
et calcule f (x).
-1
Q 24 : Écrire de même une fonction fp qui
calcule f 0 (x).
-2
-3
0
1
2
3
4
Q 25 : Écrire une fonction newton qui admet un argument xn et permet d’avancer d’une seule étape dans
l’algorithme de Newton. Cette fonction calcule donc xn+1 à partir de xn en faisant appel à f et fp.
Q 26 : Écrire le programme principal qui demande à l’utilisateur de saisir x0 , effectue 10 itérations de l’algorithme
de Newton, et affiche les approximations successives de la solution à l’équation f (x) = 0.
III.B
Polynômes (voir interfaces incomplètes en annexe IV.B.2)
Informatiquement, un polynôme est représenté par un vecteur contenant l’ensemble de ses coefficients. Ainsi, pour le
polynôme de degré n, a0 + a1 X + . . . + an X n (où an 6= 0), on stocke le tableau 1D de taille n + 1 (a0 , a1 , . . . , an ).
Le programme principal portant sur la partie III.B sera rendu sur une feuille séparée et construit au fur et à mesure des
questions de cette partie. En C, on pourra utiliser les tableaux automatiques à déclaration tardive.
? Q 27 : Écrire un nouveau programme principal qui demande à l’utilisateur de saisir le degré du polynôme et effectue
l’allocation d’un tableau nommé poly permettant de stocker ses coefficients. La taille du tableau devra être définie
en fonction du degré choisi par l’utilisateur.
? Q 28 : On fournit la procédure saisie_pol qui demande à l’utilisateur de saisir les différents coefficients du
polynôme et qui remplit le tableau passé en argument (voir IV.B.2.1, page 7 en C et IV.B.2.2, page 8 en fortran).
Compléter le programme principal pour appeler cette procédure.
? Q 29 : Quelles sont les expressions analytiques calculées par chacune des fonctions expr1 et expr2 fournies en
annexe (voir IV.B.2.1, page 7 en C et IV.B.2.2, page 8 en fortran) ? Dans chaque cas, préciser les expressions
développées pour un polynôme de degré 3. Compter le nombre de multiplications effectuées par chacune de ces
fonctions : en déduire la méthode la plus efficace. On comptablisera les appels à la fonction pow() en C ou à
l’opérateur ** en Fortran comme autant de multiplications implicites associées.
? Q 30 : Écrire une procédure deriv qui remplit le vecteur associé au polynôme dérivé d’un polynôme passé en
argument. L’allocation du tableau pour le polynôme dérivé sera faite dans le programme principal. Compléter le
programme principal pour appeler cette procédure.
Q 31 : Écrire une fonction newton_poly permettant d’avancer d’une seule étape dans l’algorithme de Newton
lorsque l’on recherche le zéro d’un polynôme.
4/8
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
IV
51
52
53
54
Annexes
IV.A
Annexes de l’exercice (voir II)
IV.A.1
Partie de code fourni à titre indicatif (voir II.A)
int main(void){
FILE *fid;
int i, j, nlat, nlon, plat, plon, qlat, qlon;
float moy,lon_min,lon_max,lat_min,lat_max;
55
56
57
58
59
60
61
62
63
64
65
/*Lecture de la matrice*/
fid=fopen("data.txt","r");
fscanf(fid, "%d %d", &nlat, &nlon);
float mat[nlat][nlon]; // tableau automatique
for (i=0; i < nlat; i++) {
for (j=0; j < nlon; j++) {
fscanf(fid, "%g", &mat[i][j]);
}
}
fclose(fid);
program principal
use precipitation
implicit none
integer :: i, j, nlat, nlon, plat, plon, qlat, qlon
real :: moy, lon_min, lon_max, lat_min, lat_max
integer, dimension(:), allocatable :: nb_zeros
real, dimension(:), allocatable :: x, y
real, dimension(:,:), allocatable:: mat, matr, matz
67
69
70
/* Moyenne */
moy = moyenne(nlat, nlon, mat); //
printf("Moyenne %g\n",moy);
73
74
/* Nombre de zeros par latitude*/
int nb_zeros[nlat];
compte_zeros(nlat, nlon, mat, nb_zeros); //
77
78
/* Regrillage */
float matr[nlat/2][nlon/2]; // tableau automatique
regrille(nlat, nlon, mat, matr); //
81
82
83
84
85
86
87
88
89
90
91
92
54
55
56
57
58
60
61
62
63
64
65
66
67
68
70
71
72
74
75
76
77
! Regrillage
allocate(matr(nlat/2, nlon/2))
call regrille(mat, matr) !
79
80
53
73
! Nombre de zeros par latitude
allocate(nb_zeros(nlat))
call compte_zeros(mat, nb_zeros) !
75
76
52
69
! Moyenne
moy = moyenne(mat) !
write(*,*) "moyenne", moy
71
72
51
59
! Lecture de la matrice
open(unit=11,file="data.txt", &
form="formatted",status="old")
read(11,*) nlat, nlon
allocate(mat(nlat, nlon))
do i=1,nlat
read(11,*) mat(i,:)
enddo
close(11)
66
68
2009-2010
MP050
/* Axes */
float x[nlon]; // tableau automatique
float y[nlat]; // tableau automatique
fid=fopen("axe_x.txt","r");
for (i=0; i < nlon; i++) {
fscanf(fid, "%f", &x[i]);
}
fclose(fid);
fid=fopen("axe_y.txt","r");
for (i=0; i < nlat; i++) {
fscanf(fid, "%g", &y[i]);
}
fclose(fid);
78
79
80
81
! Axes
allocate(x(nlon))
allocate(y(nlat))
open(unit=11, file="axe_x.txt", &
form="formatted",status="old")
read(11,*) x(:)
close(11)
open(unit=11, file="axe_y.txt", &
form="formatted",status="old")
read(11,*) y(:)
close(11)
5/8
82
83
84
85
86
87
88
89
90
91
92
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
IV.A.2
94
95
96
97
2009-2010
MP050
Partie de code à commenter (voir II.B)
printf("Longitude min: %g\n Longitude max: %g\n"
"Latitude min: %g\n Latitude max:%g\n",
x[0], x[nlon-1],
y[0], y[nlat-1]);
write(*,*) "Longitude min:",
"Longitude max:",
"Latitude min:",
"Latitude max:",
x(1),
&
x(nlon), &
y(1),
&
y(nlat)
printf("Sélection de zone:\n"
"Indiquer lon_min, lon_max, lat_min, lat_max\n");
scanf("%g %g %g %g",
&lon_min, &lon_max, &lat_min, &lat_max);
while ( lon_min < x[0]
||
//
lon_max > x[nlon-1] ||
lat_min < y[0]
||
lat_max > y[nlat-1] ){
printf("Message a modifier\n"); //
scanf("%g %g %g %g",
&lon_min, &lon_max, &lat_min, &lat_max);
}
write(*,*) "Sélection de zone:"
99
write(*,*) "Indiquer lon_min,lon_max,lat_min,lat_max" 100
read (*,*) lon_min, lon_max, lat_min, lat_max
101
plon=0; //
for (i=0; i < nlon; i++)
if ((x[i]>=lon_min) &&
plon++;
}
}
plat = 0;
for (i=0; i < nlat; i++)
if ((y[i]>=lat_min) &&
plat++;
}
}
//
plon = 0 !
do i=1, nlon
if ((x(i)>=lon_min) .AND. (x(i)<=lon_max)) then
plon = plon + 1
end if
end do
plat = 0
do i=1, nlat
if ((y(i)>=lat_min) .AND. (y(i)<=lat_max)) then
plat = plat + 1
end if
end do !
98
99
100
101
102
103
104
105
106
107
108
109
110
113
114
115
116
117
118
119
120
121
122
123
126
127
128
129
130
131
132
133
134
135
136
137
138
139
142
97
lon_min < x(1)
) .OR. & !
lon_max > x(nlon) ) .OR. &
lat_min < y(1)
) .OR. &
lat_max > y(nlat) )
)
"Message a modifier" !
lon_min, lon_max, lat_min, lat_max
103
104
105
106
107
108
109
110
111
{
(x[i]<=lon_max)){
{
(y[i]<=lat_max)){
112
113
114
115
116
117
118
119
120
121
122
123
124
// tableau automatique
float matz[plat][plon]; //
qlat = 0;
for (i=0; i < nlat; i++) {
if ((y[i]>=lat_min) && (y[i]<=lat_max)){
qlon = 0;
for (j=0; j < nlon; j++) {
if ((x[j]>=lon_min) && (x[j]<=lon_max)){
matz[qlat][qlon] = mat[i][j];
qlon++;
}
}
qlat++;
}
} //
140
141
96
102
do while ( (
(
(
(
write(*,*)
read (*,*)
end do
124
125
95
98
111
112
94
exit(EXIT_SUCCESS);
}
125
allocate(matz(plat, plon)) !
126
qlat = 1
127
do i=1, nlat
128
if ((y(i)>=lat_min) .AND. (y(i)<=lat_max)) then
129
qlon = 1
130
do j=1, nlon
131
if ((x(j)>=lon_min) .AND. (x(j)<=lon_max)) then 132
matz(qlat, qlon) = mat(i, j)
133
qlon = qlon + 1
134
end if
135
end do
136
qlat = qlat + 1
137
end if
138
end do !
139
deallocate(mat, nb_zeros, matr)
140
deallocate(matz, x, y)
141
end program principal
142
6/8
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2009-2010
MP050
IV.B
Annexes du problème (voir III)
IV.B.1
Prototypes incomplets pour la méthode de Newton (voir III.A)
IV.B.1.1
Langage C
IV.B.1.2
Fonction f
Fonction f
f(
x) ;
function f(x)
Fonction fp
Fonction fp
fp(
x) ;
function fp(x)
Fonction newton
Fonction newton
newton(
IV.B.2
IV.B.2.1
Langage Fortran
xn) ;
function newton(xn)
Codes et prototypes à compléter pour les polynômes (voir III.B)
Langage C
Fonction saisie_pol
void saisie_pol(const int d, float poly[d+1]) {
for (int i=0; i<=d; i++) {
printf("coeff du monome de degre %d ?\n", i);
scanf("%g", &poly[i]);
}
return;
}
Fonctions expr1 et expr2
1
2
float expr1(const int d, const float poly[d+1], const float x) {
float res;
3
res = poly[0];
for (int i=1; i<=d; i++) {
res += poly[i] * pow(x,i);
}
return res;
4
5
6
7
8
9
}
10
11
12
float expr2(const int d, const float poly[d+1], const float x) {
float res;
13
14
15
16
17
18
res = poly[d];
for (int i=d; i>0; i--) {
res = res * x + poly[i-1];
}
return res;
Fonction deriv
deriv(
d,
poly[
],
dpoly[
7/8
]);
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2009-2010
MP050
Fonction newton_poly
newton_poly(
IV.B.2.2
xn,
d,
poly[
],
Langage Fortran
Sous-programme saisie_pol
subroutine saisie_pol(poly)
implicit none
real, intent(out), dimension(:) :: poly
integer :: i
do i=1, size(poly)
write (*,*) "coeff du monome de degre", i-1, "?"
read (*,*) poly(i)
enddo
end subroutine saisie_pol
Fonctions expr1 et expr2
1
2
3
real function expr1(poly, x)
real, intent(in), dimension(:) :: poly
real, intent(in) :: x
4
5
integer :: i
6
7
8
9
10
11
expr1 = poly(1)
do i=2, size(poly)
expr1 = expr1 + poly(i) * x**(i-1)
enddo
end function expr1
12
13
14
15
real function expr2(poly, x)
real, intent(in), dimension(:) :: poly
real, intent(in) :: x
16
17
integer :: i, d
18
19
20
21
22
23
24
d = size(poly) - 1
expr2 = poly(d+1)
do i=d, 1, -1
expr2 = expr2 * x + poly(i)
enddo
end function expr2
Sous-programme deriv
subroutine
deriv(poly, dpoly)
Fonction newton_poly
function newton_poly(xn, poly, dpoly)
8/8
dpoly[
]);