TD2: Exercices d'application du cours


Antony Lesage
antony.lesage@u-psud.fr

Ce deuxième cours-TD à pour vocation de mettre en application les bases du langage Python3 et de la bibliothèque NumPy, introduites au fil du premier cours-TD.

Exercice 1 :

Cet exercice porte sur l'implémentation de la fonction exponentielle de deux façons différentes (Question 1.1 et Question 1.2) en Python.

Question 1.1 :

Implémenter en Python une fonction qui calcule la valeur de la somme partielle du développement en série entière de la fonction exponentielle, ayant la signature suivante :

def exp_serie(x, n):

La somme partielle est définie comme suit :

$$ e^x \simeq \sum_{n=0}^N \frac{x^n}{n!} $$

Vous pourrez réécrire cette somme à l'aide de la suite de fonction suivante :

$$ \begin{align} \left ( x \mapsto t_n(x) \right )_{n \in \mathbb{N}} \\[2ex] \text{où} \quad t_n(x) = \frac{x^n}{n!} \\ \end{align} $$

Question 1.2 :

Implémenter en Python une fonction qui calcule la valeur du développement tronquée à l'ordre $n$ en fraction continue généralisée de la fonction exponentielle, ayant la signature suivante :

def exp_frac(x, n, acc=0):

Le développement est de la forme suivante :

$$ \begin{align} e^x &= b_{-1} + \frac{a_0(x)}{b_0(x)+} \frac{a_1(x)}{b_1(x)+} \frac{a_2(x)}{b_2(x)+} \; ... \\[2ex] e^x &= b_{-1} + \frac{a_0(x)}{b_0(x)+\frac{a_1(x)}{b_1(x)+\frac{a_2(x)}{b_2(x)+ \; ...}}} \\ \end{align} $$

avec :

$$ b_{-1}(x) = 0 \qquad \begin{cases} a_{0}(x) = 1 \\[2ex] b_{0}(x) = 1 \\[2ex] \end{cases} \qquad \begin{cases} a_{1}(x) = -x \\[2ex] b_{1}(x) = 1 + x \\[2ex] \end{cases} \qquad \begin{cases} a_{2}(x) = -x \\[2ex] b_{2}(x) = 2 + x \\[2ex] \end{cases} \qquad \begin{cases} a_{3}(x) = -2x \\[2ex] b_{3}(x) = 3 + x \\[2ex] \end{cases} \qquad ... $$

Exercice 2 :

Cet exercice porte sur l'implémentation d'un algorithme qui permet de construire de façon itérative le flocon de Koch. L'algorithme est illustré en images, ci-dessous.

**Initialisation (step=0)**
L'initialisation permet de crée le contour de départ de l'algorithme, ici un segment délimité par les points : $p_0 = (0,1)$ et $p_1 = (0,-1)$.
**Première étape (step=1)**
La première étape consiste à prendre un segment père et à la diviser en trois segments fils de longueur identique. Le deuxième segment fils sert de base à la construction d'un triangle équilatéral. Le contour est mainteant constitué de cinq points de $p_0 = (0,1)$ à $p_4 = (0,-1)$.
**Deuxième étape (step=2)**
La deuxième étape consiste à itérer l'étape précédente sur l'ensemble des segements du nouveau concour obtenu à l'étape précédente.
**...**

Question 2.1 :

La première chose à faire est d'implémenter une fonction capable de tracer un contour quelconque (ouvert ou fermé) dans une fenêtre carrée de côté 2 * scale. Cette fonction aura la signature suivante :

def plot(contour, scale=1.0):

Question 2.2 :

À présent, on souhaite implémenter une fonction qui à partir d'un segment (deux points) quelconque, va générer la liste des points issus de la subdivision de ce segment (première étape). Cette fonction aura la signature suivante :

def subdiv(p0, p4):

Question 2.3 :

Il faut implémenter une fonction qui à partir d'un contour quelconque, va générer un nouveau contour résultant de l'application de la fonction subdiv sur chaque des segments de ce dernier (deuxième étape). Cette fonction aura la signature suivante :

def next(contour):

Question 2.4 :

Il ne reste plus qu'à boucler sur la fonction next pour générer un flocon de Koch.

Question 2.5 : (Bonus)

Implémenter une fonction qui permet de générer un contour fermé et régulier à n sommets. Cette fonction aura la signature suivante :

def spawn_contour(n):

Question 2.6 : (Bonus)

Réécrivez une nouvelle fonction capable d'afficher non plus un contour, mais une liste de contours. Cette fonction aura la signature suivante :

def plots(contours, scale=1.0):