2.1 Bisección – Concepto

Referencia: Burden 2.1 p.48/pdf.58, Chapra 5.2 p.124/pdf148, Rodriguez 3.1 p.36

El método se basa en el teorema del valor intermedio, conocido como método de la bisección, busqueda binaria, partición de intervalos o de Bolzano.

Es un tipo de búsqueda incremental en el que:

  • el intervalo se divide siempre en la mitad.
  • Si la función cambia de signo sobre un intervalo, se evalua el valor de la función en el punto medio.
  • La posición de la raíz se determina en el punto medio del subintervalo  dentro del cual ocurre un cambio de signo.
  • el proceso se repite hasta obtener una mejor aproximación

Cota de Error

Teorema 2.1 (Burden p,52/pdf.62.)

Suponga que f ∈ C[a,b] y f(a)*f(b)<0, f es una función en el intervalo [a,b] y que presenta un cambio de signo.

|p_n - p| \leq \frac{b-a}{2^n} , \text{donde } n \geq 1

la desigualdad implica que pn converge a p con una razón de convergencia O \big(\frac{1}{2^n}\big) , es decir:

p_n =p+O \Big( \frac{1}{2^n} \Big)

Iteraciones, Ejemplo 2 (Burden ejemplo 2 p.52/pdf.62)

Determine la cantidad de iteraciones necesarias para resolver f(x) = x^3 + 4x^2 -10 =0 con exactitud de 10 – 3 en el intervalo [1,2].

Desarrollo: Se buca encontrar un entero n que satisface la ecuación:

|p_n -p| \leq \frac{b-a}{2^{n}} 2^{-n}< 10^{-3}

usando logaritmos:

-n log_{10} 2 < -3 n > \frac{3}{log_{10} 2} = 9.96

En consecuencia se requieren unas diez iteraciones para lograr la aproximación de 10-3. Verifique los resultados con los valores calculados.


Se presenta una forma de implementar el algoritmo de la bisección:

# Algoritmo de Bisección
# Los valores de [a,b] son seleccionados
# desde la gráfica de la función
# error = tolera

import numpy as np

def biseccion(fx,a,b,tolera):

    fa = fx(a)
    fb = fx(b)
   
    tramo = np.abs(b-a)
    while (tramo>=tolera):
        c = (a+b)/2
        fc = fx(c)
        cambia = np.sign(fa)*np.sign(fc)
        if (cambia<0):
            b = c
            fb = fc
        else:
            a = c
            fa = fc
        tramo = np.abs(b-a)
       
    return(c)