Este método tiene su fundamento teórico en el uso del cálculo diferencial.
Se basa en encontrar raíces de funciones reales usando derivadas. Parte de una aproximación inicial y mejora iterativamente el valor hasta acercarse a la raíz. Fue desarrollado por Isaac Newton en el siglo XVII y más tarde ampliado por Joseph Raphson.
La fórmula que se utiliza es:
El algoritmo para encontrar una raíz por el método de Newton-Raphson se basa en los siguientes puntos:
-
Elegir un valor inicial que esté cerca de la raíz esperada.
-
Calcular y su derivada .
-
Sustituir los valores en la fórmula para obtener la siguiente aproximación .
-
Repetir el proceso usando el nuevo valor hasta que el error esté dentro de la tolerancia deseada.
-
Si se cumple la condición de parada (error pequeño o ), se considera encontrada la raíz.
Este método converge rápidamente si la aproximación inicial es adecuada y si la función tiene derivada no nula cerca de la raíz.
EJEMPLO 1
f(x) = cos(x) - x
Esta función tiene una raíz en el intervalo (0, 1).
EJEMPLO 2
Esta función tiene una raíz en el intervalo (0, 1).
EJEMPLO 3
Esta función tiene una raíz en el intervalo (0.1, 1).
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#EJEMPLO 2
# Definición de la función y su derivada
def f(x):
return np.exp(-x) - x
def df(x):
return -np.exp(-x) - 1
# Implementación del método de Newton-Raphson
def newton_raphson(f, df, x0, tol=1e-6, max_iter=100):
data = []
x_ant = None
for i in range(max_iter):
fx = f(x0)
dfx = df(x0)
if dfx == 0:
raise ZeroDivisionError("Derivada cero en la iteración")
x1 = x0 - fx / dfx
if x_ant is None:
error = None
else:
error = abs((x1 - x_ant) / x1) * 100
data.append([i + 1, x0, x1, fx, dfx, error])
if error is not None and error < tol * 100:
break
x_ant = x1
x0 = x1
return data, x1
# Valor inicial y ejecución
x0 = 0
tabla, raiz = newton_raphson(f, df, x0)
# Mostrar resultados en tabla
df_resultado = pd.DataFrame(tabla, columns=["Iteración", "x_n", "x_{n+1}", "f(x)", "f'(x)", "Error Rel (%)"])
print(df_resultado)
print(f"\nRaíz aproximada: {raiz:.6f}")
# Graficar la función y los puntos
x_vals = np.linspace(-1, 2, 400)
y_vals = f(x_vals)
plt.figure(figsize=(10, 5))
plt.plot(x_vals, y_vals, label='f(x) = e^{-x} - x', color='blue')
plt.axhline(0, color='black', linestyle='--')
# Marcar iteraciones
for row in tabla:
plt.plot(row[1], f(row[1]), 'ro')
plt.title("Método de Newton-Raphson para $f(x) = e^{-x} - x$")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.grid(True)
plt.legend()
plt.show()