Newton Raphson


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:


  1. Elegir un valor inicial x0x_0 que esté cerca de la raíz esperada.

  2. Calcular f(x0)f(x_0) y su derivada f(x0)f'(x_0).

  3. Sustituir los valores en la fórmula para obtener la siguiente aproximación x1x_1.

  4. Repetir el proceso usando el nuevo valor xnx_n hasta que el error esté dentro de la tolerancia deseada.

  5. Si se cumple la condición de parada (error pequeño o f(xn)0f(x_n) \approx 0), 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

f(x)=exx

Esta función tiene una raíz en el intervalo (0, 1).


     


                                                                                   EJEMPLO 3

f(x)=ln(x)+x

Esta función tiene una raíz en el intervalo (0.1, 1).


 


EXPLICACIÓN DE CODIGO.

 


  
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()