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