El método de la secante es una técnica de aproximación numérica que usa dos puntos iniciales \(x_0\) y \(x_1\) para encontrar una raíz de la función \(f(x)\), sin necesidad de conocer su derivada.
La fórmula de iteración es:
\[ x_{n+1} = x_n - \frac{f(x_n)(x_n - x_{n-1})}{f(x_n) - f(x_{n-1})} \]
Paso a paso del algoritmo:
- Definir los valores iniciales: Se deben seleccionar dos valores iniciales \(x_0\) y \(x_1\). Aunque pueden elegirse de forma aleatoria, se recomienda que estén lo más cerca posible de la raíz para reducir el número de iteraciones. Una forma común de hacerlo es observar el signo del producto \(f(x_0) \cdot f(x_1)\). Si hay un cambio de signo, entonces existe una raíz en el intervalo.
-
Verificar el cambio de signo: Para confirmar la existencia de una raíz, se evalúan \(f(x_0)\) y \(f(x_1)\) y se comprueba que su producto sea negativo:
- Si \(f(x_0) \cdot f(x_1) < 0\), existe al menos una raíz en el intervalo.
- Si \(f(x_0) \cdot f(x_1) > 0\), se recomienda seleccionar otro intervalo.
- Si \(f(x_0) \cdot f(x_1) = 0\), entonces uno de los extremos es una raíz exacta.
-
Calcular la nueva aproximación: Utilizar la fórmula principal del método:
\[ x_{n+1} = x_n - \frac{f(x_n)(x_n - x_{n-1})}{f(x_n) - f(x_{n-1})} \]
-
Calcular el error aproximado porcentual: A partir de la segunda iteración, se calcula el error relativo:
\[ E_a = \left| \frac{x_{n+1} - x_n}{x_{n+1}} \right| \cdot 100 \]
Si el error es menor o igual a la tolerancia deseada, se considera que se ha encontrado la raíz con suficiente precisión. -
Actualizar los valores: Si el error es mayor a la tolerancia, se actualizan las variables:
- \(x_{n-1} \gets x_n\)
- \(x_n \gets x_{n+1}\)
Ejemplo 1: f(x) = cos(x) - x
Esta función tiene una raíz en el intervalo (0, 1). El método de la secante aproxima la raíz iterativamente.
Ejemplo 2: f(x) = x³ - x - 2
La raíz se encuentra entre 1 y 2. El método de la secante converge rápidamente a una solución.
Ejemplo 3: f(x) = ex - 2
La raíz real es \(\ln(2) \approx 0.693\). El método de la secante converge desde un intervalo inicial [0, 1].
Explicación en video del código en Python
Método de la Secante en Python
import numpy as np
# Definición de la función a evaluar
def f(x):
# Función polinómica de prueba: f(x) = x³ - 4x + 1
return x**3 - 4*x + 1
# Implementación del método de la secante
def secante(f, X0, X1, tol=0.05, iter_max=1000):
"""
Método de la secante para encontrar una raíz de una función f(x).
Parámetros:
- f : función a evaluar
- X0, X1 : valores iniciales de la aproximación
- tol : tolerancia del error relativo porcentual (en %)
- iter_max : número máximo de iteraciones permitidas
Retorna:
- Xn : aproximación de la raíz
- iteracion : número de iteraciones realizadas
- error : error relativo porcentual final
"""
error = 100.0 # Inicializar el error en 100% para garantizar al menos una iteración
iteracion = 0 # Contador de iteraciones
# Imprimir encabezado de la tabla de resultados
print("Iteración\t X0\t\t f(X0)\t\t X1\t\t f(X1)\t\t Xn\t\t Error (%)")
print("-" * 105)
# Bucle principal del método
while error > tol and iteracion < iter_max:
# Evaluar la función en los puntos actuales
f_X0 = f(X0)
f_X1 = f(X1)
# Verificar que no haya división por cero
if f_X1 - f_X0 == 0:
print("Error: División por cero en la iteración", iteracion+1)
break
# Aplicar la fórmula de la secante para obtener la siguiente aproximación
Xn = X1 - f_X1 * (X1 - X0) / (f_X1 - f_X0)
# Calcular el error relativo porcentual a partir de la segunda iteración
if iteracion > 0:
error = abs((Xn - X1) / Xn) * 100
error_str = f"{error:10.6f}"
else:
error_str = " ----- " # No se calcula el error en la primera iteración
# Imprimir los resultados de esta iteración
print(f"{iteracion+1:>10d}\t{X0:>10.6f}\t{f_X0:>10.6f}\t{X1:>10.6f}\t{f_X1:>10.6f}\t{Xn:>10.6f}\t{error_str}")
# Actualizar los valores para la siguiente iteración
X0 = X1
X1 = Xn
iteracion += 1 # Incrementar el contador de iteraciones
# Retornar los resultados
return Xn, iteracion, error
# ---------- EJECUCIÓN DEL MÉTODO ----------
# Llamada al método con valores iniciales X0 = 0 y X1 = 1
# Tolerancia del 0.05%
raiz, num_iter, err_final = secante(f, 0, 1, tol=0.05)
# Mostrar resultados finales
print("\nResultados finales:")
print("Raíz encontrada:", raiz)
print("Número de iteraciones:", num_iter)
print("Error final:", err_final, "%")