Univ. Lille1 - Licence STS 1ère année 013-014 Objectifs du TP : Algorithmes et Programmation Impérative 1 Nombre complexe. Ensemble de Mandelbrot. 1. utiliser les enregistrements ;. fabriquer un module contenant l'arithmétique des nombre complexes ; 3. dessiner l'ensemble de Mandelbrot 1 Représentation des nombres complexes Cette section a pour but d'implanter les opérations sur les nombres complexes 1.1 Motivation Parmi les types numériques prédénis de caml, on connait le type entier (int) et le type ottant (float). L'implantation d'un type pour représenter les nombres complexes permet de se familiariser avec la manipulation d'enregistrement. 1. Un module pour les nombres complexes Vous allez créer un module qui contiendra les déclarations d'un type pour les nombres complexes, ainsi que quelques fonctions de base sur les nombres complexes. Question 1 Pour cela, recopiez toutes les déclarations de type et de fonctions que vous trouverez dans la partie Un exemple complet du chapitre sur les enregistrements dans le polycopié de cours. Toutes ces déclarations seront faites dans un chier nommé complexe.ml. Ajoutez aussi sous forme de commentaires les spécications de ces fonctions. Pensez à tester une à une chacune de ces fonctions. 1.3 Compilation du module Vous allez maintenant compiler ce module pour pouvoir l'utiliser pour d'autres programmes. Question Pour cela dans un terminal tapez la commande > ocamlc -c complexe.ml Vous devez obtenir deux nouveaux chiers complexe.cmi et complexe.cmo. 1.4 Utilisation du module Pour utiliser le module, il faut lancer l'interpréteur Caml en mentionnant le nom du chier contenant le module : > ocaml complexe.cmo puis, une fois entré dans la boucle d'interaction, la commande 1
# open Complexe ;; permet de ne pas qualier pleinement les noms des fonctions du module en les préxant par le nom du module. 1.5 Familiarisation avec les fonctions du module Complexe Question 3 À l'aide du module Complexe, déclarez deux variables pour les nombres complexes z = 1 + i, et Question 4 c = 1 + i 3. Calculez le module (la norme) des deux nombres complexes dénis précédemment. Question 5 ainsi que sa norme. Calculez le nombre z = z + c, Question 6 Réalisez la fonction à deux paramètres complexes z et c associe le nombre complexe z + c. Dans la suite on nommera f cette fonction. L'ensemble de Mandelbrot L'ensemble de Mandelbrot est une fractale dénie comme étant l'ensemble des points c du plan complexe pour lesquels la suite dénie par récurrence par : z 0 = 0 z n+1 = z n + c = f(z n ) (1) ne tend pas vers l'inni (en module) 1. Cet ensemble est représenté par les points de couleur noire sur la gure 1..1 Décider si un nombre complexe est dans l'ensemble de Mandelbrot Comment peut-on écrire un programme pour dessiner l'ensemble de Mandelbrot comme sur la gure 1? Par dénition, un nombre complexe c est dans l'ensemble de Mandelbrot si la suite (z n ) n N de nombres complexes dénie par les équations 1 tend vers l'inni. Si c'est le cas, on dessine un pixel blanc pour ce nombre. Dans le cas contraire, un pixel noir. Mais comment savoir si cette suite tend vers l'inni? Un programme ne peut pas calculer une innité de termes de la suite. Heureusement, on peut démontrer que la suite tend vers l'inni en module si et seulement s'il existe un indice k pour lequel le terme d'indice k est strictement supérieur à, z k >. 1. Pour en savoir plus http://fr.wikipedia.org/wiki/ensemble_de_mandelbrot
Figure 1 L'ensemble de Mandelbrot Donc si la suite tend vers l'inni, le calcul des termes z 1, z,... amènera à un terme z k de module plus grand que et on peut arrêter là le calcul : on sait que la suite tend vers l'inni et on dessine un pixel blanc. Mais si la suite ne tend pas vers l'inni, alors aucun terme z k ne possède un module plus grand que. Comment peut-on alors arrêter le calcul? Pour répondre à ce dernier problème, on convient d'arrêter arbitrairement le calcul à un indice maximum M : si arrivé à z M on a jamais obtenu de nombre dont le module dépasse, on considèrera (peut-être à tort) que la suite ne tend pas vers l'inni. Et on dessine un pixel noir. Ce critère fait que le dessin ainsi construit n'est qu'une approximation de l'ensemble de Mandelbrot qu'on cherche à dessiner. La représentation de la gure 1 a été obtenu en décidant d'arrêter le calcul pour M = 64. Question 7 1. c un nombre complexe. et m un entier positif, Réalisez une fonction nommée iteration à deux paramètres qui renvoie le premier indice k < m tel que z k > si un tel terme existe dans la suite dénie en, m si aucun terme z k, avec 0 k < m n'a un module qui dépasse. An de vérier la validité de votre fonction, voici quelques valeurs que vous devez obtenir avec m = 64 : c iteration c 64 0 + i 64 1 + i 1 3 1 64 (1+i) 5. Dessiner l'ensemble de Mandelbrot Pour dessiner l'ensemble de Mandelbrot, vous allez utiliser le module Graphics. Pour cela, il vous faut soit relancer l'interpréteur (après l'avoir quitté) en précisant le module sur la ligne de commande 3
> ocaml graphics.cma complexe.cmo soit charger le module depuis la session courante # #load "graphics.cma" ;; Rappel de quelques déclarations du module Graphics utiles : Nom Type Rôle open_graph string unit ouvre une fenêtre graphique close_graph unit unit ferme la fenêtre graphique plot int int unit dessine un pixel set_color Graphics.color unit dénit la couleur du crayon black Graphics.color couleur noire white Graphics.color couleur blanche.3 Changements de coordonnées Les coordonnées (i, j) d'un pixel dans une fenêtre graphique sont des nombres entiers. La première coordonnée (abscisse i) est la coordonnée horizontale, la seconde (ordonnée j) la coordonnée verticale. L'axe des abscisses est orienté à droite, celui des ordonnées vers le haut. Si la fenêtre graphique a pour largeur L et hauteur H (en nombre de pixels), alors les quatre coins de la fenêtre ont pour coordonnées 1. (0, 0) pour le coin inférieur gauche ;. (L 1, 0) pour le coin inférieur droit ; 3. (L 1, H 1) pour le coin supérieur droit ; 4. (0, H 1) pour le coin supérieur gauche. Le plan complexe qu'on peut assimiler au plan R est constitué de points à coordonnées réelles. Le point dont l'axe est le nombre complexe z = x + iy à pour coordonnées (x, y). Le plan complexe est inni, mais si on s'intéresse au dessin de l'ensemble de Mandelbrot, seule une petite région de ce plan doit être considérée. La région montrée dans la gure 1 est une région carrée du plan dont les coordonnées sont 1. ( 9 4, 3 ) pour le coin inférieur gauche ;. ( 3 4, 3 ) pour le coin inférieur droit ; 3. ( 3 4, 3 ) pour le coin supérieur droit ; 4. ( 9 4, 3 ) pour le coin supérieur gauche. Dimensions de la fenêtre graphique : pour représenter cette région carrée du plan complexe, on choisit les dimensions de la fenêtre graphique de sorte qu'elle soit carrée. Pour la gure 1, la fenêtre graphique a pour dimensions 400 400 pixels. On suppose donc déclarées les deux variables let larg = 400 and haut = 400. Pour en savoir plus sur ce module http://caml.inria.fr/pub/docs/manual-ocaml-31/libref/graphics. html 4
Conversion d'un pixel en nombre complexe Il va être nécessaire d'associer à chaque pixel (i, j) de la fenêtre graphique un nombre complexe z = x + iy de notre région carrée du plan complexe. Cette transformation est une transformation ane déterminée par x = 3 L (i 3L 4 ) y = 3 H (j H ). Question 8 Réalisez la fonction complexe_of_pixel de type int int complexe, qui renvoie ce nombre complexe z = x + iy. Et nalement le dessin : 1. ouvrir une fenêtre graphique ; tout est prêt pour le dessin. Pour cela il faut. pour chaque pixel (i, j) de cette fenêtre, calculer la valeur produite par la fonction iteration pour le nombre complexe c calculé par complexe_of_pixel, en prenant un nombre d'itérations maximal égal à 64 par exemple ; 3. colorier en blanc ou en noir selon la valeur obtenue par iteration. Question 9 ci-dessus. Réalisez la fonction dessiner de type unit unit qui eectue le travail décrit 5