Uno de los métodos numéricos más sencillos para obtener las raíces de una función es el método de la secante. Existe una modificación de este método en el que se usa una aproximación cuadrática en lugar de una línea llamado método de Muller. Este cambio permite una convergencia más rápida hacia el resultado y una mayor estabilidad.
Al igual que el método de las aproximaciones sucesivas, el de Newton o el de Steffensen, el método de Muller es un método numérico iterativo para encontrar las raíces de una función. El método combina el método de interpolación cuadrática inversa y el método de la secante para obtener una fórmula que converge rápidamente a la raíz de la función.
El algoritmo del método de Muller es el siguiente:
Este método puede ser útil para encontrar raíces de funciones no lineales donde otros métodos pueden ser ineficientes o fallar. Sin embargo, puede requerir más iteraciones que otros métodos para converger a la solución. Entre las ventajas del método de Muller se pueden destacar las siguientes:
La implementación del método de Muller es algo más complicada que otras como pueden ser el método de la secante, el método de Newton o el método de Steffensen. En cada una de las iteraciones requiere calcular bastantes puntos intermedios, pero, si se siguen los pasos de la sección anterior se puede crear una función como la siguiente.
import math
def muller(f, x0, x1, x2, epsilon=1e-10, max_iter=100):
h1 = x1 - x0
h2 = x2 - x1
y1 = (f(x1) - f(x0)) / h1
y2 = (f(x2) - f(x1)) / h2
d = (y2 - y1) / (h2 + h1)
n_iter = 3
x = None
while n_iter <= max_iter:
b = y2 + h2*d
D = math.sqrt(b**2 - 4*f(x2)*d)
if abs(b-D) < abs(b+D):
E = b + D
else:
E = b - D
h = -2*f(x2)/E
p = x2 + h
if abs(h) < epsilon:
x = p
break
x0, x1, x2 = x1, x2, p
h1 = x1 - x0
h2 = x2 - x1
y1 = (f(x1) - f(x0)) / h1
y2 = (f(x2) - f(x1)) / h2
d = (y2 - y1) / (h2 + h1)
n_iter += 1
if x is None:
raise ValueError("El método no converge")
return x Para validar la implementación de la sección anterior se puede usar la misma función que se empleó en anteriormente en métodos como el de la secante, el de Newton o el de Steffensen. Comprobando si la función puede encontrar las dos raíces de f(x) = x^2 + 2x -8.
fun = lambda x: x**2 + 2*x - 8 muller(fun, 0, 4, 8) # 2.0 muller(fun, -10, -6, -1) # -4.0
Observándose que, en función de los puntos de inicio, se puede obtener cada una de las dos raíces de la función: 2 o -4.
En esta ocasión se ha visto un nuevo método numérico para obtener la raíz de una función. Aunque es un poco más complicado de implementar que otros anteriores, ofrece mejores resultados en funciones complejas.
En un mundo donde los datos se han convertido en el lenguaje dominante de la…
Llevas un rato analizando datos y tienes cuatro gráficos abiertos en ventanas separadas: ventas, usuarios,…
Hace poco publiqué una entrada en la que trataba de un sesgo bien documentado: aferrarse…
En un entrada previa explicamos qué son el WOE y el IV y por qué…
Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…
“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…
This website uses cookies.