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 la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…
En la serie Creación de una API REST con Express y TypeScript construimos una API…
Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…
En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…
Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…
En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…
This website uses cookies.