Solución:
Técnica básica
Aquí hay un código que muestra la técnica básica:
>>> def samesign(a, b):
return a * b > 0
>>> def bisect(func, low, high):
'Find root of continuous function where f(low) and f(high) have opposite signs'
assert not samesign(func(low), func(high))
for i in range(54):
midpoint = (low + high) / 2.0
if samesign(func(low), func(midpoint)):
low = midpoint
else:
high = midpoint
return midpoint
>>> def f(x):
return -26 + 85*x - 91*x**2 +44*x**3 -8*x**4 + x**5
>>> x = bisect(f, 0, 1)
>>> print(x, f(x))
0.557025516287 3.74700270811e-16
Tolerancia
Para salir temprano cuando se alcanza una tolerancia determinada, agregue una prueba al final del ciclo:
def bisect(func, low, high, tolerance=None):
assert not samesign(func(low), func(high))
for i in range(54):
midpoint = (low + high) / 2.0
if samesign(func(low), func(midpoint)):
low = midpoint
else:
high = midpoint
if tolerance is not None and abs(high - low) < tolerance:
break
return midpoint
Puede ver la solución en una pregunta anterior de Stack Overflow aquí que usa scipy.optimize.bisect. O, si su propósito es aprender, el pseudocódigo en la entrada de Wikipedia sobre el método de bisección es una buena guía para hacer su propia implementación en Python, como sugirió un comentarista en la pregunta anterior.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)