1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- # Jovian Hersemeule
- def dicho(f, a, b, epsilon=0.01, n=10, deep=0, deep_max=10, debug=False, prefix=""):
- """
- Cherche le minimum entre a et b.
- :param f: Fonction numérique.
- :param a: Borne inférieure.
- :param b: Borne supérieure.
- :param epsilon: Marge tolérée.
- :param n: Découpage.
- :param deep: Profondeur d'appel.
- :param deep_max: Profondeur d'appel maximale.
- :param debug: Si vrai alors fait des print.
- :param prefix: Chaine affichées en tête de ligne.
- :return: x0 où f(x0) est le minimum.
- """
- # Profondeur
- deep_next = deep + 1
- if deep_next <= deep_max:
- if debug:
- print(prefix, "Lancement du calcul à profondeur ", deep_next, " entre ", a, " et ", b, ".")
- else:
- if debug:
- print(prefix, "Avortment du calcul : profondeur maximale dépassée.")
- return a
- # Recherche
- pas = (b - a) / n
- mini = f(a)
- loc = a
- x = a
- img = 0
- for k in range(n - 1):
- x += pas
- img = f(x)
- if img < mini:
- if debug:
- print(prefix, "Nouveau minimum trouvé. Ancien : x0 = ", loc, " et y0 = ", mini, "Nouveau : x0 = ", x,
- " et y0 = ", img)
- mini = img
- loc = x
- elif debug:
- print(prefix, "Ce n'est pas un nouveau minimum.")
- # Erreur acceptable
- if abs(f(loc + pas / 2) - f(loc)) + abs(f(loc - pas / 2) - f(loc)) < epsilon:
- if debug:
- print(prefix, "Minimum trouvé en ", loc, " de valeur ", mini, "\n")
- return loc
- else:
- return dicho(f, loc - pas, loc + pas, epsilon=epsilon, n=n, deep=deep_next, debug=debug, prefix=prefix)
- def minSeeker(f, x1, x2, y1, y2, epsilon=0.01, debug=False):
- """
- Cherche à minimiser f( x, y ).
- :param f: Une fonction numérique à deux paramètres réels.
- :param x1, x2, y1, y2: Les plages de valeurs de recherche.
- :param epsilon: Marge tolérée.
- :param debug: Si vrai alors fait des print.
- :return: ( v, a, b ) où v = f(a , b) le minimum cherché.
- """
- if debug:
- print("Exécution de minSeeker.")
- print("x dans ", x1, " : ", x2)
- print("y dans ", y1, " : ", y2, "\n")
- minLine = lambda x: dicho(lambda t: f(x, t), y1, y2, epsilon=epsilon, debug=debug, prefix="| > ")
- ans = dicho(minLine, x1, x2, epsilon=epsilon, debug=debug, prefix="> ")
- if debug:
- print("Fin de l'exécution de minSeeker. Minimum trouvé : ", ans, ".\n")
- return ans
|