Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def brents(f, a_k, b_k):
- mflag = True
- a_k_1 = None
- b_k_1 = None
- b_k_2 = None
- m_k = (a_k + b_k)/2
- if f(a_k) == f(b_k_1) or f(b_k) == f(b_k_1):
- s_k = a_k * f(b_k) - b_k*f(a_k)/(f(b_k) - f(a_k))
- else:
- s_k = (a_k * f(b_k) * f(b_k_1) / ((f(a_k)-f(b_k))*(f(a_k)-f(b_k)))
- + b_k * f(a_k) * f(b_k_1) / ((f(b_k)-f(a_k))*(f(b_k)-f(b_k_1)))
- + b_k_1 * f(a_k) * f(b_k) / ((f(b_k_1)-f(a_k))*(f(b_k_1)-f(b_k)))
- )
- tp = (3*a_k + b_k)/4
- # test if in interval (no guarentee a_k>b_k, so I did it this way)
- if (s_k < tp and s_k < b_k) or (sk > tp and sk > b_k):
- c_k = m_k
- mflag = 1
- elif mflag and abs(s_k-b_k) > abs(b_k-b_k_1)/2:
- c_k = m_k
- mflag = 1
- elif not mflag and abs(s_k-b_k)>abs(b_k_1-b_k_2)/2
- c_k = m_k
- mflag = 1
- else:
- c_k = s_k
- mflag = 0
- a_k_1 = a_k
- b_k_1 = b_k
- b_k_2 = b_k_1
- if f(a_k)*f(c_k) < 0:
- a_k, b_k = a_k, c_k
- if f(c_k)*f(c_k) < 0:
- a_k, b_k = c_k, b_k
- if abs(f(a_k)) < abs(f(b)):
- a_k, b_k = b_k, a_k
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement