Advertisement
iSach

Untitled

Feb 22nd, 2019
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.47 KB | None | 0 0
  1. % Cherche le zéro d'une fonction donnée dans un intervalle donné à l'aide
  2. % de la méthode de la bissection, avec une certaine précision.
  3. %
  4. % Paramètres :
  5. % func : La fonction dont on cherche un zéro.
  6. % lower_bound : Abscisse inférieure
  7. % upper_bound : Abscisse supérieure
  8. % err : Précision recherchée.
  9. function root = bisection(func, lower_bound, upper_bound, err)
  10.  
  11. % Si x1 est inférieur à x0, on appelle
  12. % la fonction en inversant les bornes pour
  13. % que x0 soit bien inférieur à x1.
  14. if upper_bound < lower_bound
  15. root = bisection(func, upper_bound, lower_bound, err);
  16. return;
  17. end
  18.  
  19. % Vérifie si les bornes sont de signes opposés.
  20. if func(lower_bound) * func(upper_bound) > 0
  21. error('Bornes non correctes, il faut une borne positive, et une negative')
  22. end
  23.  
  24. % Calcul du critère d'arrêt, c'est-à-dire le nombre
  25. % d'itérations à effectuer afin d'atteindre la précision
  26. % voulue.
  27. k = ceil((log((upper_bound - lower_bound) / (2 * err))) / log(2));
  28.  
  29. % On limite k à 100 pour éviter un nombre trop élevé d'itérations.
  30. k = min(k, 100);
  31.  
  32. % Recherche du zéro.
  33. for j = 1:k
  34.  
  35. low_y = func(lower_bound);
  36. up_y = func(upper_bound);
  37.  
  38. % On vérifie si on a atteint la précision voulue en la borne
  39. % inférieure.
  40. if abs(low_y) <= err
  41. root = lower_bound;
  42. return;
  43. end
  44.  
  45. % On vérifie si on a atteint la précision voulue en la borne
  46. % supérieure.
  47. if abs(up_y) <= err
  48. root = upper_bound;
  49. return;
  50. end
  51.  
  52.  
  53. % On prend le milieu de l'intervalle et le définit comme étant la
  54. % nouvelle borne supérieure (ou inférieure) selon le signe de la
  55. % fonction en cette abscisse.
  56. mid = (upper_bound + lower_bound) / 2;
  57.  
  58. mid_y = func(mid);
  59.  
  60. if mid_y * up_y > 0
  61. upper_bound = mid;
  62. else
  63. lower_bound = mid;
  64. end
  65.  
  66. % On vérifie si l'ordonnée en b répond à la précision voulue, si
  67. % oui on retourne b comme étant la racine approximative.
  68. if abs(mid_y) <= err
  69. root = mid;
  70. return;
  71. end
  72. end
  73.  
  74. if abs(func(mid)) > err
  75. % Aucune racine n'a été trouvée.
  76. error('Pas de racine dans cet intervalle.')
  77. end
  78. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement