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.
Seguimos ampliando el laboratorio de Analytics Lane con el lanzamiento de la versión 1.4, que…
Hemos llegado a la sexta entrega de la serie. Si las cuatro primeras fueron las…
En Analytics Lane seguimos apostando por desarrollar herramientas que simplifiquen el trabajo de analistas y…
Imagina que construyes un scorecard con un Gini de 0,85. Un resultado extraordinario, muy por…
En las cuatro entregas anteriores recorrimos los disparates más folclóricos del género: faldas que predicen…
En Analytics Lane seguimos evolucionando nuestras herramientas y damos un paso más con el lanzamiento…
This website uses cookies.