Referencia: Burden ejemplo 1 p51
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
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
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)
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 grafica básica 2D de la función f(x)