Advertisement
Guest User

Untitled

a guest
Sep 28th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.98 KB | None | 0 0
  1. def brents(f, a_k, b_k):
  2. mflag = True
  3. a_k_1 = None
  4. b_k_1 = None
  5. b_k_2 = None
  6.  
  7. m_k = (a_k + b_k)/2
  8.  
  9. if f(a_k) == f(b_k_1) or f(b_k) == f(b_k_1):
  10. s_k = a_k * f(b_k) - b_k*f(a_k)/(f(b_k) - f(a_k))
  11. else:
  12. s_k = (a_k * f(b_k) * f(b_k_1) / ((f(a_k)-f(b_k))*(f(a_k)-f(b_k)))
  13. + b_k * f(a_k) * f(b_k_1) / ((f(b_k)-f(a_k))*(f(b_k)-f(b_k_1)))
  14. + b_k_1 * f(a_k) * f(b_k) / ((f(b_k_1)-f(a_k))*(f(b_k_1)-f(b_k)))
  15. )
  16.  
  17. tp = (3*a_k + b_k)/4
  18.  
  19. # test if in interval (no guarentee a_k>b_k, so I did it this way)
  20. if (s_k < tp and s_k < b_k) or (sk > tp and sk > b_k):
  21. c_k = m_k
  22. mflag = 1
  23. elif mflag and abs(s_k-b_k) > abs(b_k-b_k_1)/2:
  24. c_k = m_k
  25. mflag = 1
  26. elif not mflag and abs(s_k-b_k)>abs(b_k_1-b_k_2)/2
  27. c_k = m_k
  28. mflag = 1
  29. else:
  30. c_k = s_k
  31. mflag = 0
  32.  
  33. a_k_1 = a_k
  34. b_k_1 = b_k
  35. b_k_2 = b_k_1
  36.  
  37. if f(a_k)*f(c_k) < 0:
  38. a_k, b_k = a_k, c_k
  39.  
  40. if f(c_k)*f(c_k) < 0:
  41. a_k, b_k = c_k, b_k
  42.  
  43. if abs(f(a_k)) < abs(f(b)):
  44. a_k, b_k = b_k, a_k
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement