TP 3 & 4 - INFO1

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