Méthodes Numériques et Informatiques (MP050) Examen de TP du

Transcription

Méthodes Numériques et Informatiques (MP050) Examen de TP du
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2011-2012
MP050
Méthodes Numériques et Informatiques (MP050)
Examen de TP du 13 décembre 2011
Calculatrices et documents autorisés. Durée 2 h.
Les deux parties sont indépendantes.
Indiquer en commentaire au début de chacun des fichiers source vos nom, prénom et numéro d’étudiant.
Traiter les questions de programmation en choisissant soit le Fortran, soit le langage C et l’indiquer sur votre copie.
On construira les codes progressivement, en recopiant le fichier source dans un nouveau fichier à chaque question, mais
on n’imprimera que la dernière version opérationnelle. En fortran, les procédures seront insérées dans un module placé en
tête du fichier source.
Créer dans votre répertoire d’accueil un sous-répertoire extp2 et en faire votre répertoire de travail.
I
Calcul du cosinus intégral au moyen d’une série
On se propose de calculer la fonction cosinus intégral, Ci(x) à partir de sa série de Taylor :
Ci(x) = γ + log(x) −
1
1
(−1)k 2k
1
x2 +
x4 −
x6 + · · · +
x + ··· ,
2! × 2
4! × 4
6! × 6
(2k)!(2k)
où γ = 0.5772156649 est la constante d’Euler-Mascheroni. La série converge pour x > 0, la convergence étant toutefois
lente pour x grand.
On note uk (x) le terme général associé à la série, Sn (x) la somme partielle des n premiers termes et
Cin (x) = γ + log(x) + Sn (x) où Sn (x) =
n
X
uk (x),
avec uk (x) =
k=1
(−1)k 2k
x .
(2k)!(2k)
On montre que, pour k > 2 :
rk (x) =
uk (x)
(k − 1)x2
=− 2
.
uk−1 (x)
2k (2k − 1)
(1)
? Q 1 : Indiquer le nombre de chiffres significatifs à prendre en compte pour la constante γ pour travailler en simple
précision (float en C et REAL en fortran).
? Q 2 : Dans un fichier cosint.c ou cosint.f90, écrire le programme principal de manière à demander à l’utilisateur
de saisir un entier n correspondant au nombre de termes à sommer et un réel x. Inclure une instruction permettant
d’arrêter l’exécution du programme après affichage d’un message si x 6 0, auquel cas la série ne converge pas, ou si
x > 10, auquel cas la série converge lentement.
? Q 3 : Dans le même fichier, écrire une fonction cn permettant de calculer Cin (x) à l’aide des n premiers termes de
la somme partielle Sn (x) associée. À chaque itération on utilisera le rapport rk = uk (x)/uk−1 (x) de l’équation (1)
pour calculer uk (x) et Sk (x), connaissant uk−1 (x) et Sk−1 (x). Dans la fonction, on notera u le terme général, r le
rapport et s la somme partielle. La fonction cn doit renvoyer la valeur de Cin (x). Ces variables seront codées en
simple précision.
Q 4 : Compléter le programme principal de manière à faire appel à la fonction cn. Calculer Ci4 (0.5) (on donne
Ci(0.5) ≈ −0, 17778).
Q 5 : Compléter le programme pour qu’il affiche aussi (sans avoir à saisir x) les valeurs calculées pour : Ci4 (π/2),
Ci4 (5π/2) et Ci20 (5π/2). Pour plus de précision, la valeur de π sera calculée au moyen de la fonction intrinsèque
atan. Comparer aux résultats donnés ci-après : Ci(π/2) = 0.472001 et Ci(5π/2) = 0.123772.
sappli1
1/6
13/12/2011
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2011-2012
MP050
Q 6 : Pour une série alternée, on peut interrompre la sommation lorsque le rapport βk entre le terme à ajouter et
la somme partielle est inférieur, en valeur absolue, à l’erreur relative α que l’on tolère :
βk = |uk (x)/Sk−1 (x)| < α.
Écrire une fonction cn_eps de x et α qui renvoie Cin (x) en tenant compte de ce critère.
Q 7 : Compléter le programme principal de manière à appeler la fonction cn_eps et afficher Cin (x). Tester avec
x = 5π/2. On choisira α = 10−5 .
II
Surface des polygônes
À partir du répertoire ~lefrere/M1/2011-2012/etu/mni/extp2/ recopier dans ~/extp2 les fichiers :
carre.dat, grand-u.dat et islande.dat
ainsi qu’un des fichiers source suivants contenant les procédures fournies :
– util_c99.c pour les tableaux automatiques du C99
– util_c89.c pour les tableaux alloués par vos soins en C via libmnitab en C
– util.f90 pour les tableaux alloués par vos soins en fortran
II.A
II.A.1
Introduction
Objectif
On s’intéresse à des polygônes dont on souhaite calculer la surface par deux méthodes indépendantes :
– un découpage du polygône en triangles s’appuyant sur les sommets (II.B) ;
– une discrétisation du domaine rectangulaire sur une grille carrée permettant aussi de visualiser l’intérieur du
polygône sous forme d’image en noir et blanc (II.C).
On étudiera successivement : (1) un carré, (2) un polygône en forme de U et (3) l’Islande.
II.A.2
Représentation et lecture des polygônes
y
S2
S1 = S6
S3
x
S5
S4
Figure 1 – Exemple
d’un polygône à 5
sommets parcouru
dans le sens trigonométrique : 6 points
en partant de S1
seront stockés dans
le fichier associé.
On définit chaque polygône par la liste des cordonnées de
ses sommets, ordonnée en tournant dans le sens trigonométrique. Elles sont stockées dans un fichier texte de n
lignes comportant chacune les coordonnées xs et ys d’un
sommet du polygône à raison d’un point par ligne. Dans
cette liste, le premier sommet S1 est répété à la dernière
ligne pour indiquer qu’il s’agit d’un parcours fermé. Les n
couples de coordonnées représentent donc seulement n − 1
sommets distincts (voir fig. 1).
? Q 8 : Afficher successivement les polygônes définis par les fichiers carre.dat, grand-u.dat et islande.dat avec
la commande plot-polygone.sh suivie du nom du fichier de polygône. Calculer la surface du carré, du grand U et
évaluer grossièrement l’ordre de grandeur de celle de l’Islande (graphique en km).
? Q 9 : Dans un fichier surfpoly.c ou surfpoly.f90, écrire le programme principal qui :
– Invite à saisir un entier n permettant de choisir le fichier de polygône étudié grâce au nombre de lignes qu’il
comporte : 5 pour carre.dat, 9 pour grand-u.dat et 353 pour islande.dat.
– Crée deux tableaux 1D xs et ys de n réels destinés à stocker les coordonnées des sommets.
– Appelle la procédure lire_polygone fournie pour lire les coordonnées des sommets du fichier identifié par n.
– Affiche les coordonnées du premier et du dernier points lus, vérifie qu’ils sont confondus (courbe fermée). Dans le
cas contraire, il faudra afficher un message et arrêter le programme.
La procédure de lecture des sommets lire_polygone sera intégrée au fichier du programme principal : on la copiera
depuis util_c89.c, util_c99.c ou util.f90 selon la méthode choisie pour la création des tableaux.
13/12/2011
2/6
sappli1
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
II.B
2011-2012
MP050
Méthode I : découpage en triangles
II.B.1
Calcul du produit vectoriel
? Q 10 : En respectant l’interface (prototype) fournie en annexe (voir III, p. 5), écrire une fonction pvect qui calcule
→ de composantes (x , y ) par −
→ de composantes (x , y ),
la composante verticale du produit vectoriel du vecteur −
u
u
1
1 1
2
2 2
−−−→
−−−→
−
→
−
→
soit u1 ∧ u2 = x1 y2 − x2 y1 . Vérifier que le produit vectoriel de S1 S2 par S1 S3 du carré est bien égal à +40000.
II.B.2
−−→
1−
2 S1 S3
Calcul de l’aire intérieure du polygône
À partir d’un sommet, par exemple S1 , on peut calculer l’aire A
de l’intérieur du polygône comme la somme des aires des n − 3
triangles que l’on découpe dans le polygône en joignant S1 aux
n − 2 autres sommets. Ces triangles sont définis par S1 et deux
sommets consécutifs du contour (voir fig. 2). Sachant que l’aire
→ et −
→, est (−
→∧−
→)/2, comptée
du triangle dont les côtés sont −
u
u
u
u
1
2
1
2
−
→
−
→
positivement si la rotation de u1 à u2 est dans le sens direct, on
obtient :
−−−→
∧ S1 S4 S2
Figure
2
–
Exemple de déS1 coupage
d’un
polygône convexe
à n − 1 = 5 somS5
mets (n = 6 points
dans le fichier) en
n−3 = 3 triangles.
−−→ −−−−→
−−−−−→ −−−−−→
1 −−−→ −−−→
S1 S2 ∧ S1 S3 + . . . + S1 Si ∧ S1 Si+1 + . . . + S1 Sn−2 ∧ S1 Sn−1
A=
2
S3
S4
(2)
? Q 11 : En respectant l’interface fournie en annexe (voir III, p. 5), écrire une fonction aire_poly à laquelle on
fournit les coordonnées des sommets et qui rend l’aire A du polygône selon l’expression (2).
Q 12 : Cette méthode est également applicable à des polygônes non convexes car l’expression (2) effectue la somme
algébrique des produits vectoriels. Calculer ainsi l’aire du carré, du grand U et enfin de l’Islande. Comparer avec
les aires estimées à la question 8.
II.C
Méthode II : discrétisation
Copier votre fichier surfpoly.c ou surfpoly.f90 dans un fichier nommé surfpoly2.c ou surfpoly2.f90 pour traiter
cette partie.
II.C.1
Détermination de l’intérieur d’une surface polygonale par le nombre de tours
S1
S2
dϕ2
dϕ1
M
dϕ3
dϕ4
Pour tester si un point M quelconque est à l’intérieur d’un polygône, on calcule
−−→
l’angle ϕ de la rotation totale du vecteur M S quand le point S parcourt le contour
du polygône de S1 à Sn (voir fig. 3) en suivant l’ordre des n − 1 sommets :
ϕ=
n−1
X
−→ −−−−→
(−
M S\
sachant que Sn = S1
i , M Si+1 )
(3)
i=1
S3
S4
Figure 3 – Rotation
totale autour d’un
point M intérieur au
carré.
Si ϕ = 0, le point M est extérieur. Si ϕ = ±2π le point M est intérieur a . Pour tenir
compte des possibles erreurs d’arrondi, on admettra que le point M est extérieur
si |ϕ| 6 0, 005.
a. Comme le polygône est ici parcouru dans le sens direct, ϕ = +2π pour un point intérieur.
? Q 13 : En respectant l’interface fournie en annexe (voir III, p. 5), écrire une fonction interieur à laquelle on
fournit les coordonnées des sommets et celles d’un point M et qui rend un entier égal à +1 si le point M est intérieur
et 0 sinon. On utilisera la fonction angle fournie (fichiers util.f90, util_c89.c ou util_c99.c), qui calcule l’angle
→ vers un vecteur −
→. Tester la fonction interieur avec comme point
−
→, u
−
→) de rotation (en radians) d’un vecteur −
(\
u
u
u
1
2
1
2
M l’origine (0, 0) pour les trois polygônes.
sappli1
3/6
13/12/2011
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
II.C.2
2011-2012
MP050
Discrétisation du domaine
Tous les polygônes envisagés sont inclus dans le domaine rectangulaire défini par xmin = −300 6 x 6 xmax = +300
et ymin = −200 6 y 6 ymax = +200. Pour estimer l’aire intérieure de la surface polygônale et tracer son image, on
découpe ce domaine selon une grille régulière de résolution δ identique en x et en y. On note nx (respectivement
ny) le nombre de points dans l’intervalle [xmin , xmax ] des abscisses (respectivement des ordonnées). Le domaine peut
alors être décrit par deux indices i en abscisse et j en ordonnée pour parcourir les nx par ny nœuds de la grille. Il
s’agira de déterminer pour chacun de ces points s’il est intérieur à la surface ou non.
? Q 14 : Dans le programme principal, déclarer et initialiser les réels xmin, xmax, ymin, ymax. Déclarer les deux
entiers nx et ny. Inviter à saisir la résolution delta. Calculer et afficher les valeurs obtenues pour nx et ny pour
δ = 4.
II.C.3
Estimation de la surface discrétisée
Q 15 : En approximant l’intérieur du polygône par un assemblage de petits carrés 1 de côté δ, on peut estimer
son aire. Compléter le programme pour compter les points intérieurs et en déduire l’aire. Afficher l’aire des trois
polygônes avec une résolution δ = 4. Comparer avec les résultats obtenus par la méthode précédente.
II.C.4
Visualisation de l’intérieur du polygône en bitmap
L’objectif est maintenant de visualiser l’intérieur du polygône sous la forme d’une image bitmap en noir sur fond
blanc. Le domaine rectangulaire peut être représenté par un tableau à deux dimensions.
Q 16 : Allouer un tableau 2D noté pixels de nx par ny entiers pour représenter la grille : chaque nœud intérieur
au polygône sera représenté par un pixel noir (valeur 1), les nœuds extérieurs par des pixels blancs (valeur 0).
En utilisant la procédure fournie ecrire_image (fichiers util.f90, util_c89.c ou util_c99.c), écrire le fichier
d’image bitmap int.pbm représentant l’intérieur du polygône avec une résolution δ = 4. Afficher cette image avec la
commande :
xv -expand 2 -aspect 1:1 int.pbm &
(utiliser > pour agrandir l’image)
Comparer ces images avec les contours des polygônes affichés dans la question 8. On rapppelle que, dans une image,
le domaine rectangulaire doit être parcouru de gauche à droite et de haut en bas, y doit donc commencer à ymax .
Quelle est l’influence de la résolution δ ?
En fin d’exercice, imprimer une seule fois la version opérationnelle la plus complète des fichiers
sources rédigés :
cosint.c ou cosint.f90
surfpoly.c ou surfpoly.f90
surfpoly2.c ou surfpoly2.f90
puis se connecter au serveur d’applications :
ssh sappli1.ccre.upmc.fr
et fournir le mot de passe (pas d’écho lors de la saisie)
se placer dans son répertoire extp2
et envoyer les fichiers sources des exercices par la commande :
envoi1-mni.sh
1. Ces carrés sont centrés sur les noœuds de la grille.
13/12/2011
4/6
sappli1
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
III
2011-2012
MP050
Annexes de la partie II
Voir II.B.1, II.B.2 et II.C.1
1
/* C89
allocation des tableaux avec libmnitab */
2
3
4
float pvect(float x1, float y1, float x2, float y2);
/* composante z du produit vectoriel de (x1, y1) par (x2, y2) */
5
6
7
float aire_poly(int n, float *xs, float *ys);
/* xs, ys coordonnées des sommets */
8
9
10
11
12
13
1
int interieur(int n, float *xs, float *ys, float mx, float my);
/* renvoie 1 si intérieur, 0 si extérieur, */
/* utilise angle */
/* xs, xy : sommets du polygône (avec fermeture) */
/* mx, my point à tester */
// C99
: tableaux automatiques
2
3
4
float pvect(float x1, float y1, float x2, float y2);
/* composante z du produit vectoriel de (x1, y1) par (x2, y2) */
5
6
7
float aire_poly(int n, float xs[n], float ys[n]);
/* xs, ys coordonnées des sommets */
8
9
10
11
12
13
int interieur(int n, float xs[n], float ys[n], float mx, float my);
/* renvoie 1 si intérieur, 0 si extérieur, */
/* utilise angle */
/* xs, xy : sommets du polygône (avec fermeture) */
/* mx, my point à tester */
sappli1
5/6
13/12/2011
Université Paris vi : M1 Master de Sciences et Technologies
Mentions physique et applications et SDUEE
2011-2012
MP050
real function pvect(x1, y1, x2, y2)
! composante z du produit vectoriel de (x1, y1) par (x2, y2)
implicit none
real, intent(in) :: x1, y1, x2, y2
! à compléter
1
2
3
4
5
6
end function pvect
7
8
real function aire_poly(xs, ys)
implicit none
real, dimension(:), intent(in) :: xs, ys
! coordonnées des sommets + fermeture
! à compléter
9
10
11
12
13
14
end function aire_poly
15
16
function interieur(xs, ys, mx, my)
implicit none
integer :: interieur ! renvoie 1 si intérieur, 0 sinon
real, dimension(:), intent(in) :: xs, ys
! coordonnées des sommets + fermeture
real, intent(in) :: mx, my
! coordonnées du point à tester
! à compléter
17
18
19
20
21
22
23
24
25
end function interieur
13/12/2011
26
6/6
sappli1

Documents pareils