Saltar al contenido

Cómo hacer el método de bisección en Python

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *