"""
""" #! /usr/bin/python3 # -*- coding: utf-8 -*- # Résoudre une équation du second degré : a x² + b x + c = 0 # première version : la plus simple def ax2bxc( a, b, c ) : print(f"ax2bxc() : f(x) = {a} x² + ({b}) x + ({c}) = 0") delta = b * b - 4 * a * c if delta < 0 : print(" 0 solution dans R") racines = [] elif delta == 0 : x1 = -b/(2*a) print(f" 1 solution : x1={x1}") racines = [-b/(2*a)] else : x1 = (-b - pow(delta, 0.5)) / (2*a) x2 = (-b + pow(delta, 0.5)) / (2*a) print(f" 2 solutions : x1={x1}, x2={x2}") racines = [ x1, x2 ] # contrôle des résultats : for x in racines : verification_racine( a, b, c, x ) return racines def verification_racine( a, b, c, x ) : resultat = a * x*x + b * x + c if abs(resultat) > 1.e-9 : print(f" verification_racine() : f({x})=", resultat, "> 1.e-9 pb") else : print(f" verification_racine() : f({x})=", resultat, "< 1.e-9 ok") return def ax2bxc_test() : print("""### test des 3 cas possibles de la fonction ax2bxc() ### x^2 + 1 = 0 -> racines = [] (x+1)^2 = 0 -> racines = [-1] (x-2)(x-3) = 0 -> racines = [2, 3] Comparaison des fonctions ax2bxc() et ax2bxc_amelioree() """) liste_tests = [ ( 1, 0, 1, [] ), ( 1, 2, 1, [-1] ), ( 1, -5, 6, [2, 3] )] for (a, b, c, solution) in liste_tests : racines = ax2bxc( a, b, c ) if len(racines) != len(solution) : print(f"ERREUR : racines={racines} != sol={sol}") return def ax2bxc_limite() : print(""" ### limites de validité de la fonction ### 2 racines : une petite x1=1 et une grande x2 > 1e10 la précision des nombres réels est de l'ordre de 1e-16 1 + 1e17 = 1e17 : le 1 est totalement perdu""") # (x-x1)(x-x2) = 0 x1, x2 = (1, 1e17) a, b, c = (1, -(x1+x2), x1*x2) sol1 = ax2bxc(a, b, c) sol2 = ax2bxc_amelioree( a, b, c ) print(f"""\nComparaison des résultats des 2 fonctions : ax2bxc() solution={sol1} != (x1,x2)={(x1,x2)} trouve la grande solution (en valeur absolue), la petite est perdue. ax2bxc_amelioree() solution={sol2} == (x1,x2)={(x1,x2)} trouve les 2 solutions""") return def ax2bxc_amelioree( a, b, c ) : """ on calcule la plus grande racine (en valeur absolue) on en déduit la petite racine en utilisant le produit des racines = c/a car -b + sqrt(delta) est peu précis quand a*c est petit devant b² sqrt(delta) = |b| sqrt(1-4ac/b²) ~ |b| (1 - (1/2)4ac/b² + ...) (1/2)4ac/b² est perdu dans les décimales de 1 """ print(f"ax2bxc_amelioree() : f(x) = {a} x² + ({b}) x + ({c}) = 0") delta = b * b - 4 * a * c if delta < 0 : print(" 0 solution dans R") racines = [] elif delta == 0 : x1 = -b/(2*a) print(f" 1 solution : x1={x1}") racines = [-b/(2*a)] else : # calcul de la grande racine |x2| # il faut additionner des nombres de mêmes signes if b < 0 : x2 = (-b + pow(delta, 0.5)) / (2*a) else : x2 = (-b - pow(delta, 0.5)) / (2*a) x1 = (c/a) / x2 print(f" 2 solutions : x1={x1}, x2={x2}") racines = [ x1, x2 ] # contrôle des résultats : for x in racines : verification_racine( a, b, c, x ) return racines def ax2bxc_interactif() : print("""-> Entrez les 3 coefficients un par un """) a = "?" while a != "" : a = input("a (entrée vide pour terminer) ? ") if a == "" : break else : a = float(a) b = float(input("b ? ")) c = float(input("c ? ")) racines = ax2bxc_amelioree( a, b, c ) if __name__ == "__main__" : # début du programme : ax2bxc_test() ax2bxc_limite() print("""\n### à vous maintenant de résoudre a x² + b x + c = 0 ###""") ax2bxc_interactif() """"""