#12-Solución de la ecuación f(x)=0. Métodos: Gráfico, Newton-Raphson y Biseccion

El problema a discutir en este post y en el siguiente es el de resolver la ecuación f(x)=0, donde f(x) es una función de cualquier naturaleza, por ejm: f(x)=x^5-3×4+x^2-3=0, o f(x)=arctan(x)+sen(x)-2=0.

Diversos métodos se han propuestos para este tipo de problemas. Aquí discutiremos, el método gráfico, el de Newton Raphson y el de la Biseccion.

METODO GRAFICO

Consiste en hacer una gráfica de la curva y=f(x) en el sistema de coordenadas (x,y). Luego se escoge el/o  los puntos por donde corta el eje X.

Ejemplo: Hallar las raíces de la ecuación: f(x)=x^3 +7*x^2 -60=0

Solución en Python:

```python
import numpy as np
import matplotlib.pyplot as plt

# definición de la función
def f(x): return x**3+7*x**2-60
#f=lambda: x**3+7*x**2-60
#definición del intervalo
x = np.arange(-3.0,3.0,0.2)
plt.plot(x,f(x)) # Plot with specified
plt.plot(x,0*x)
plt.show() # Show plot on screen

Salida:

Puede observarse que la curva (color azul) corta a el eje X (color naranja ) en el punto x=2.4, luego esta es la solución aproximada por el método gráfico

METODO DE NEWTON RAPHSON

El método de Newton- Raphson es un método iterativo que comienza con una aproximación inicial x0 (la cual suele tomarse del resultado del método gráfico) y una formula a iterar:

x(n+1)=f(x(n))/f'(x(n))

donde f’ es la derivada de f. Se realizan las iteraciones hasta un numero máximo: N, o hasta alcanzar un grado de tolerancial: tol (lo que ocurra primero) previamente definidos.

Vamos a ejemplificar con la misma función anterior

f(x)= x^3 +7*x^2 -60. En este caso f'(x)=3x^2+14x y

podemos tomar x0=2.4 como valor Valor inicial y dejamos al usuario que introduzca la tolerancia y el valor maximo de iteraciones a trves del comando input

Programa en Python

```python
import numpy as np
#import matplotlib.pyplot as plt

# definición de la función
def f(x): return x**3+7*x**2-60
def df(x): return 3*x**2+14*x
x0=2.4 # Valor inicial
n=input("numero de interaciones = ?")
n=int(n)

maxe=input("tolerancia = ?")
maxe=float(tol)
print("\n")
for i in range(n):
    x=x0-f(x0)/df(x0)
    err=np.abs(x-x0)
    print("solución parcial para i = ",i+1)
    print(" x0, x : ",x0,x)
    if err < tol :
        print("\n","Convergencia alcanzada")
        print(" solución = ",x)
        print(" Numero de iteraciones = ",i+1)
        break
    else: 
        x0=x
    
Salida

```

    numero de interaciones = ?10
    tolerancia = ?.000000001
    
    
    solución parcial para i =  1
     x0, x :  2.4 2.5150943396226415
    solución parcial para i =  2
     x0, x :  2.5150943396226415 2.511594922905926
    solución parcial para i =  3
     x0, x :  2.511594922905926 2.511591630458341
    solución parcial para i =  4
     x0, x :  2.511591630458341 2.511591630455428
    
     Convergencia alcanzada
     solución =  2.511591630455428
     Numero de iteraciones =  4
       

METODO DE LA BISECCION

Es un algoritmo de búsqueda de raíces que trabaja dividiendo el intervalo a la mitad y seleccionando el subintervalo que tiene la raíz. Es un método sencillo de comprender, ya que es muy intuitivo. Se basa en el siguiente teorema
Teorema de BOLZANO
Sea y = f(x) continua en un intervalo [a,b] y supongamos que
f(x) tenga signos opuestos en a y b es decir f(a)*f(b)<0
Entonces debe existir r en [a,b] tal que tal que f(r)=0,
es decir, debe haber por lo menos una raíz en el intervalo.

Ejemplo: considere la función y= x^3+7*x-60. (Ver grafico)

This image has an empty alt attribute; its file name is image-1.png

Se realiza un estudio preliminar( el gráfico ayuda en esto) para seleccionar 2 puntos, a y b, tal que sus imágenes tengan signos diferentes, es decir, f (a)*f (b) <0. En esta caso, observando la gráfica podemos visualizar que entre  a=2 y b=3 hay un cambio de signo de f(x). Por lo tanto según el teorema de Bolzano existe una raiz  de f(x) entre a=2 y b=3

def f(x): return x3+7*x**2-60
a=2;b=3;n=30;tol=0.01 # valores iniciales
import numpy as np
import matplotlib.pyplot as plt
plt.plot(x,f(x))
plt.plot(x,0*x)
xvieja=0
for i in range(n):
    xm=(a+b)/2
    print(xvieja)
    err=np.abs(xm-xvieja)
    print("\n"," solucion parcial iteracion",i)
    print("raiz,error",xm,err)
    print("imagenes f(a),f(b),f(xm)",f(a),f(b), f(xm))
    if err<tol:
       print("\n","convergencia alcanzada")
       print("numero de iteraciones",i)
       print("Raiz= ",xm)
       break
    else:
       if f(a)*f(xm)> 0 :
          a=xm
          print("cambia a, a=xm ")
          if f(a)*f(xm)< 0 :
             b=xm
             print("cambia  b,  b=xm")

Leave a comment

Design a site like this with WordPress.com
Get started