""" derivees.py
"""
#! /usr/bin/python3
# -*- coding: utf-8 -*-
# lettres accentuées interdites (sauf dans les commentaires et les chaînes de caractères)
doc = """
# intérêt de ce programme : didactique
# objet : précision de la dérivée selon dx = h
# calcul d'une dérivée : f' = df/dx
#   f'(x) = limite (f(x+h) - f(x)) / h       quand h -> 0
# ou, pour davantage de pécision :
#   f'(x) = limite (f(x+h) - f(x-h)) / (2 h) quand h -> 0 (forme symétrique autour de x)
#   on diminue h de 0.1 à 1.e-15 et on compare le taux d'accroissement avec la dérivée
#   quand h est trop petit, les erreurs d'arrondi deviennent trop importantes
# conclusion :
#   la précision machine est "1e-15", le h optimum est "1e-5" ou "1e-6"
#   il dépend de la rapidité de variation de la fonction.
"""

from math import pi, sin, cos, exp, log

print("### Estimation de la dérivée f' par : f'(a) = (f(a+h) - f(a-h)) / (2 h)")

puissance10   = lambda x : x**10
exp10         = lambda x : 10**x
parabole      = lambda x : x**2
inverse       = lambda x : 1 / float(x)
inverse_carre = lambda x : 1 / float(x*x)

def cube(x) :
    # x^3
    y = x * x * x
    return y

def derivee(f, a, cible, commentaire="") :
    print(f"### début de derivee({commentaire})")
    print(f"  {'  h':5s} →  f'({a})")
    (imin, ecart_min) = (0, a)
    for i in range(1, 10) :
        h = pow(10,-i)
        dx = 2 * h
        df = f(a+h) - f(a-h)
        f_prime = df / dx
        if abs(f_prime - cible) < ecart_min :
            imin = i
            ecart_min = abs(f_prime - cible)
        print(f"  {h:5.0e} → {f_prime}")
    # bilan : meilleure approximation de f'(a)
    print(f"  meilleure approximation de f'({a}) pour h=1e-{imin:1}")
    return 
        
# f(x) = x^3 -> dérivée f'(x) = 3 x^2 ; pour x=2 : f'(2) = 12
# meilleur résultat pour h = 1e-5
derivee(cube, 2, 12, "cube(x) = x^3 -> dérivée cube'(2) = 3 x^2 = 12")

# sin'(2*pi) = cos(2*pi) = 1
# meilleur résultat pour h = 1e-5
derivee(sin, 2*pi, 1, "sin'(2*pi) = cos(2*pi) = 1")

# (1/x)' = -1/x^2 : pour x=2 : -1/4
# meilleur résultat pour h = 1e-5
derivee(inverse, 2, -1/4, "(1/x)' = -1/x^2 : pour x=2 : -1/4")

print("# Conclusion : meilleures dérivées pour h=1e-5 pour des fonctions 'douces'")
print("# derivees.py terminé")
"""
"""