Voici une trame à terminer autour de la composée et de la dérivée itérée : décomposer vos problèmes en sous-problèmes, choisissez des noms de variables explicites, exprimez les opérateurs de la syntaxe papier mathématique en terme de fonctions.
Dérivée n-ème d'un e fonction numérique :
$$f^{(0)} = f \qquad f^{(n)} = \left( f^{(n - 1)} \right)'$$
Composée itérée :
$$f^{0} = Identité \qquad f^{n} = f\circ f^{n - 1}$$
Puissance d'un entier :
$$ a^0=1 \qquad a^n=a\times a^{n - 1}$$
Python
#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################# # # TP4 # ############################################## from functools import reduce ## Derive n fois def derive(f, precision) : """ renvoie une approximation de la fonction dérivée de f avec un pas de dx qui est une puissance de 2 """ dx = 2**-precision return lambda x: ( f(x + dx ) - f(x) ) / dx def derive_n_fois1(f, precision, n) : # version récursive du calcul de la dérivée n-eme assert n >= 0, "n doit être positif !" if n == 0: # cas terminal return f # f^(0) = f return derive( derive_n_fois1(f, precision, n - 1), precision ) # f^(n) = derivée de f^(n - 1) def derive_n_fois2(f, precision, nb_total_de_derivations) : # avec while assert nb_total_de_derivations >= 0, "nb de deriv doit être positif !" derivee_k_de_f = f nb_de_derivations = 0 while nb_de_derivations < nb_total_de_derivations : derivee_k_de_f = derive(derivee_k_de_f, precision) nb_de_derivations += 1 return derivee_k_de_f # def derive_n_fois3(f, puis2, n) : # # avec une structure for # def deriv_n_fois4(f, puis2, n) : # # avec reduce # # On s'aperçoit que l'on compose en fait n fois la fonction derive # def compose2(f, g) : # return ... # def compose_n_fois( f, n ) : # on compose un nombre quelconque de fois f avec elle-même # def derive_n_fois5(f, puis, n) : # # en utilisant compose_n_fois # def compose( *fs ) : # en fait compose_n est un cas particulier de la composition d'un # nb quelconque de fonctions différentes ou non