2.1.1 Bisección Ejemplo01

Referencia: Burden ejemplo 1 p.51/pdf.61

La ecuación mostrada tiene una raiz en [1,2], ya que f(1)=-5 y f(2)=14 y existe cambio de signo.
Muestre los resultados parciales del algoritmo de la bisección con una tolerancia de 0.0001

f(x) = x^3 + 4x^2 -10 =0

Desarrollo en Python

Observe los resultados de f(c), principalmente en la iteracion 9, respecto a la obtenida en la última posición.

[ i, a, c, b, f(a), f(c), f(b), paso]
1 1.000 1.500 2.000 -5.000 2.375 14.000 1.000 
2 1.000 1.250 1.500 -5.000 -1.797 2.375 0.500 
3 1.250 1.375 1.500 -1.797 0.162 2.375 0.250 
4 1.250 1.312 1.375 -1.797 -0.848 0.162 0.125 
5 1.312 1.344 1.375 -0.848 -0.351 0.162 0.062 
6 1.344 1.359 1.375 -0.351 -0.096 0.162 0.031 
7 1.359 1.367 1.375 -0.096 0.032 0.162 0.016 
8 1.359 1.363 1.367 -0.096 -0.032 0.032 0.008 
9 1.363 1.365 1.367 -0.032 0.000 0.032 0.004 
10 1.363 1.364 1.365 -0.032 -0.016 0.000 0.002 
11 1.364 1.365 1.365 -0.016 -0.008 0.000 0.001 
raiz:  1.36474609375
>>> 

se grafican los puntos c de la tabla para obsevar mejor el resultado. Para la gráfica se requieren ordenar los puntos c.

Escriba sus observaciones y preguntas sobre los resultados.

Los resultados se obtienen usando un algoritmo modificado de la bisección, para agregar los resultados parciales a una tabla y mostrar el resultado:

# Algoritmo de Bisección
# [a,b] se escogen de la gráfica de la función
# error = tolera

import numpy as np

fx = lambda x: x**3 + 4*x**2 - 10

# INGRESO
a = 1
b = 2
tolera = 0.001

# PROCEDIMIENTO
tabla = []
tramo = b-a

fa = fx(a)
fb = fx(b)
i = 1
while (tramo>tolera):
    c = (a+b)/2
    fc = fx(c)
    tabla.append([i,a,c,b,fa,fc,fb,tramo])
    i = i+1
                 
    cambia = np.sign(fa)*np.sign(fc)
    if (cambia<0):
        b = c
        fb = fc
    else:
        a=c
        fa = fc
    tramo = b-a
c = (a+b)/2
fc = fx(c)
tabla.append([i,a,c,b,fa,fc,fb,tramo])
tabla = np.array(tabla)

raiz = c

# SALIDA
np.set_printoptions(precision = 4)
print('[ i, a, c, b, f(a), f(c), f(b), paso]')
# print(tabla)

# Tabla con formato
n=len(tabla)
for i in range(0,n,1):
    unafila = tabla[i]
    formato = '{:.0f}'+' '+(len(unafila)-1)*'{:.3f} '
    unafila = formato.format(*unafila)
    print(unafila)
    
print('raiz: ',raiz)

para realizar la gráfica se áñade:

# GRAFICA
import matplotlib.pyplot as plt

xi = tabla[:,2]
yi = tabla[:,5]

# ordena los puntos para la grafica
orden = np.argsort(xi)
xi = xi[orden]
yi = yi[orden]

plt.plot(xi,yi)
plt.plot(xi,yi,'o')
plt.axhline(0, color="black")

plt.xlabel('x')
plt.ylabel('y')
plt.title('Bisección en f(x)')
plt.grid()
plt.show()

Scipy.optimize.bisect

El método de la bisección se encuentra implementado en Scipy, que también puede ser usado de la forma:

>>> import scipy.optimize as opt
>>> opt.bisect(fx,1,2,xtol=0.001)
1.3642578125

que es el valor de la variable ‘a’ de la tabla para la última iteración del ejercicio. Lo que muestra que el algoritmo realizado tiene un valor más aproximado.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.bisect.html