[ Newton-Raphson ] [ Ejercicio ] [ Analítico ] [ Algoritmo ] [ función ]
..
1. Ejercicio
Referencia: Burden 2.1 ejemplo 1 p38
La ecuación mostrada tiene una raíz en [1,2], ya que f(1)=-5 y f(2)=14.
Muestre los resultados parciales del algoritmo de Newton-Raphson con una tolerancia de 0.0001
[ Newton-Raphson ] [ Ejercicio ] [ Analítico ] [ Algoritmo ] [ función ]
..
2. Desarrollo Analítico
El método requiere obtener la derivada f'(x) de la ecuación para el factor del denominador.
f(x) = x^3 + 4x^2 -10 f'(x) = 3x^2 + 8x x_{i+1} = x_i -\frac{f(x_i)}{f'(x_i)}Para el desarrollo se inicia la búsqueda desde un punto en el intervalo [1,2], por ejemplo el extremo derecho, x1=2.
iteración 1
f(2) = (2)^3 + 4(2)^2 -10 = 14 f'(2) = 3(2)^2 + 8(2) = 28 x_{2} = 2 -\frac{14}{28} = 1.5 tramo = |2 -1.5| = 0.5iteración 2
f(1.5) = (1.5)^3 + 4(1.5)^2 -10 = 2.375 f'(1.5) = 3(1.5)^2 + 8(1.5) = 18.75 x_{3} = 1.5 -\frac{2.375}{18.75} = 1.3733 tramo = |1.5 -1.3733| = 0.1267iteración 3
f(1.3733) = (1.3733)^3 + 4(1.3733)^2 -10 = 0.1337 f'(1.3733) = 3(1.3733)^2 + 8(1.3733) = 16.6442 x_{4} = 1.3733 -\frac{0.1337}{16.6442} =1.3652 tramo = |1.3733 -1.3652| = 0.0081La tabla resume los valores de las iteraciones
iteración | xi | xnuevo | tramo |
1 | 2 | 1.5 | 0.5 |
2 | 1.5 | 1.3733 | 0.1267 |
3 | 1.3733 | 1.3653 | 0.0081 |
4 | … |
Observe que el error representado por el tramo se va reduciendo entre cada iteración. Se debe repetir las iteraciones hasta que el error sea menor al valor tolerado.
Las demás iteraciones se dejan como tarea
[ Newton-Raphson ] [ Ejercicio ] [ Analítico ] [ Algoritmo ] [ función ]
..
3. Algoritmo con Python
El método de Newton-Raphson se implementa como algoritmo básico en Python
De la sección anterior, luego de realizar tres iteraciones para la tabla, notamos la necesidad de usar un algoritmo para que realice los cálculos repetitivos y muestre la tabla o directamente el resultado.
['xi', 'xnuevo', 'tramo'] [[2.0000 1.5000 5.0000e-01] [1.5000 1.3733 1.2667e-01] [1.3733 1.3653 8.0713e-03] [1.3653 1.3652 3.2001e-05]] raiz en: 1.3652300139161466 con error de: 3.200095847999407e-05
Al algoritmo básico se les añade lo necesario para mostrar la tabla con los valores de las iteraciones.
# Método de Newton-Raphson # Ejemplo 1 (Burden ejemplo 1 p.51/pdf.61) import numpy as np # INGRESO fx = lambda x: x**3 + 4*(x**2) - 10 dfx = lambda x: 3*(x**2) + 8*x x0 = 2 tolera = 0.001 # PROCEDIMIENTO tabla = [] tramo = abs(2*tolera) xi = x0 while (tramo>=tolera): xnuevo = xi - fx(xi)/dfx(xi) tramo = abs(xnuevo-xi) tabla.append([xi,xnuevo,tramo]) xi = xnuevo # convierte la lista a un arreglo. tabla = np.array(tabla) n = len(tabla) # SALIDA print(['xi', 'xnuevo', 'tramo']) np.set_printoptions(precision = 4) print(tabla) print('raiz en: ', xi) print('con error de: ',tramo)
La gráfica presentada para revisar f(x) se realiza con las instrucciones:
# GRAFICA import matplotlib.pyplot as plt a = 1 b = 4 muestras = 21 xi = np.linspace(a,b,muestras) fi = fx(xi) plt.plot(xi,fi, label='f(x)') plt.axhline(0) plt.xlabel('x') plt.ylabel('f(x)') plt.grid() plt.legend() plt.show()
[ Newton-Raphson ] [ Ejercicio ] [ Analítico ] [ Algoritmo ] [ función ]
..
4. Función en Python
Se convierte el algoritmo a una función, con partes para ver la tabla, y se obtienen los siguientes resultados:
i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo'] 0 [ 2. 14. 28. 1.5 0.5] 1 [ 1.5 2.375 18.75 1.3733 0.1267] 2 [1.3733e+00 1.3435e-01 1.6645e+01 1.3653e+00 8.0713e-03] 3 [1.3653e+00 5.2846e-04 1.6514e+01 1.3652e+00 3.2001e-05] raíz en: 1.3652300139161466
Instrucciones en Python
# Ejemplo 1 (Burden ejemplo 1 p.51/pdf.61) import numpy as np import matplotlib.pyplot as plt def newton_raphson(fx,dfx,xi, tolera, iteramax=100, vertabla=False, precision=4): '''fx y dfx en forma numérica lambda xi es el punto inicial de búsqueda ''' itera=0 tramo = abs(2*tolera) if vertabla==True: print('método de Newton-Raphson') print('i', ['xi','fi','dfi', 'xnuevo', 'tramo']) np.set_printoptions(precision) while (tramo>=tolera): fi = fx(xi) dfi = dfx(xi) xnuevo = xi - fi/dfi tramo = abs(xnuevo-xi) if vertabla==True: print(itera,np.array([xi,fi,dfi,xnuevo,tramo])) xi = xnuevo itera = itera + 1 if itera>=iteramax: xi = np.nan print('itera: ',itera, 'No converge,se alcanzó el máximo de iteraciones') return(xi) # INGRESO fx = lambda x: x**3 + 4*(x**2) - 10 dfx = lambda x: 3*(x**2) + 8*x x0 = 2 tolera = 0.001 # PROCEDIMIENTO respuesta = newton_raphson(fx,dfx,x0, tolera, vertabla=True) # SALIDA print('raíz en: ', respuesta)
La gráfica se la puede añadir usando las instrucciones dadas en el algoritmo básico realizado al inicio par ala comprensión del método.
scipy.optimize.newton
El método de Newton-Raphson se encuentra implementado en Scipy, que también puede ser usado de la forma:
>>> import scipy.optimize as opt >>> opt.newton(fx,x0, fprime=dfx, tol = tolera) 1.3652300139161466 >>>
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html
Tarea
Calcule la raíz de f(x) = e-x – x, empleando como valor inicial x0 = 0
- convertir el algoritmo a una función
- Revisar las modificaciones si se quiere usar la forma simbólica de la función.
- incorpore la gráfica básica 2D de la función f(x)
[ Newton-Raphson ] [ Ejercicio ] [ Analítico ] [ Algoritmo ] [ función ]