minseeker.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # Jovian Hersemeule
  2. def dicho(f, a, b, epsilon=0.01, n=10, deep=0, deep_max=10, debug=False, prefix=""):
  3. """
  4. Cherche le minimum entre a et b.
  5. :param f: Fonction numérique.
  6. :param a: Borne inférieure.
  7. :param b: Borne supérieure.
  8. :param epsilon: Marge tolérée.
  9. :param n: Découpage.
  10. :param deep: Profondeur d'appel.
  11. :param deep_max: Profondeur d'appel maximale.
  12. :param debug: Si vrai alors fait des print.
  13. :param prefix: Chaine affichées en tête de ligne.
  14. :return: x0 où f(x0) est le minimum.
  15. """
  16. # Profondeur
  17. deep_next = deep + 1
  18. if deep_next <= deep_max:
  19. if debug:
  20. print(prefix, "Lancement du calcul à profondeur ", deep_next, " entre ", a, " et ", b, ".")
  21. else:
  22. if debug:
  23. print(prefix, "Avortment du calcul : profondeur maximale dépassée.")
  24. return a
  25. # Recherche
  26. pas = (b - a) / n
  27. mini = f(a)
  28. loc = a
  29. x = a
  30. img = 0
  31. for k in range(n - 1):
  32. x += pas
  33. img = f(x)
  34. if img < mini:
  35. if debug:
  36. print(prefix, "Nouveau minimum trouvé. Ancien : x0 = ", loc, " et y0 = ", mini, "Nouveau : x0 = ", x,
  37. " et y0 = ", img)
  38. mini = img
  39. loc = x
  40. elif debug:
  41. print(prefix, "Ce n'est pas un nouveau minimum.")
  42. # Erreur acceptable
  43. if abs(f(loc + pas / 2) - f(loc)) + abs(f(loc - pas / 2) - f(loc)) < epsilon:
  44. if debug:
  45. print(prefix, "Minimum trouvé en ", loc, " de valeur ", mini, "\n")
  46. return loc
  47. else:
  48. return dicho(f, loc - pas, loc + pas, epsilon=epsilon, n=n, deep=deep_next, debug=debug, prefix=prefix)
  49. def minSeeker(f, x1, x2, y1, y2, epsilon=0.01, debug=False):
  50. """
  51. Cherche à minimiser f( x, y ).
  52. :param f: Une fonction numérique à deux paramètres réels.
  53. :param x1, x2, y1, y2: Les plages de valeurs de recherche.
  54. :param epsilon: Marge tolérée.
  55. :param debug: Si vrai alors fait des print.
  56. :return: ( v, a, b ) où v = f(a , b) le minimum cherché.
  57. """
  58. if debug:
  59. print("Exécution de minSeeker.")
  60. print("x dans ", x1, " : ", x2)
  61. print("y dans ", y1, " : ", y2, "\n")
  62. minLine = lambda x: dicho(lambda t: f(x, t), y1, y2, epsilon=epsilon, debug=debug, prefix="| > ")
  63. ans = dicho(minLine, x1, x2, epsilon=epsilon, debug=debug, prefix="> ")
  64. if debug:
  65. print("Fin de l'exécution de minSeeker. Minimum trouvé : ", ans, ".\n")
  66. return ans