Müller

El método de Müller es un algoritmo numérico para encontrar raíces de funciones no lineales. Se basa en aproximar la función mediante un polinomio cuadrático interpolador que pasa por tres puntos consecutivos y calcular la raíz de ese polinomio. Esta aproximación permite obtener estimaciones cada vez más precisas de las raíces de la función.

¿Para qué sirve?

El método de Müller se utiliza para resolver ecuaciones donde encontrar raíces exactas puede ser complicado o imposible mediante métodos analíticos. Es especialmente útil cuando la función es complicada o no se tiene una forma explícita para resolverla fácilmente. Además, puede manejar raíces complejas y es más eficiente que otros métodos como la bisección o la secante en ciertos casos.

¿Cómo se usa en la vida real?

En aplicaciones prácticas, el método de Müller se emplea en ingeniería, física, finanzas y ciencias aplicadas donde se requiere resolver ecuaciones no lineales. Por ejemplo:

  • Encontrar puntos de equilibrio en sistemas dinámicos complejos.
  • Calcular raíces de polinomios en diseño y análisis estructural.
  • Resolver ecuaciones en modelos financieros para valorar opciones o determinar tasas de interés.
  • Simular fenómenos físicos donde la solución analítica no es directa, como en termodinámica o electromagnetismo.

Gracias a su capacidad para aproximar raíces complejas y su convergencia rápida, es una herramienta valiosa en software científico y de simulación numérica.


Algoritmo

Paso 1: Definir los puntos iniciales X0, X1 y X2.
Paso 2: Definir la tolerancia para el error relativo.
Paso 3: Calcular los valores de la función f(x) en los puntos X0, X1 y X2.
Paso 4: Calcular los intervalos:
  • h0 = X1 − X0
  • h1 = X2 − X1
Paso 5: Calcular las pendientes secantes:
S0 =
f(X1) − f(X0)

h0
S1 =
f(X2) − f(X1)

h1
Paso 6: Determinar los coeficientes del polinomio cuadrático:
  • A =
    S1 − S0

    h1 + h0
  • B = A × h1 + S1
  • C = f(X2)
Paso 7: Calcular el discriminante:
  • D = √(B² − 4AC)
Paso 8: Elegir el denominador mayor en valor absoluto para calcular la nueva aproximación:
  • P1 = |B + D|
  • P2 = |B - D|
  • Si P1 > P2:
    Xr = X2
    2C

    B + D
  • Si no:
    Xr = X2
    2C

    B − D
Paso 9: Calcular el error relativo aproximado:
Ea = |
Xr − X2

Xr
| × 100
Paso 10: Verificar si el error Ea es menor que la tolerancia:
  • Si Ea < tolerancia, se acepta Xr como raíz y termina.
  • Si no, se actualizan los puntos: X0 = X1, X1 = X2, X2 = Xr y se vuelve al paso 3.
Ejemplo 1
f(x) = x3 - 13x - 12

Este método solo permite buscar las raíces de cada función.
En este ejemplo tenemos tres raíces reales diferentes y dos imaginarias.



Ejemplo 2
f(x) = x3 - 6x2 + 11x - 6

Este método solo permite buscar las raíces de cada función.
En este ejemplo tenemos tres raíces reales diferentes y dos imaginarias.



Ejemplo 3
f(x) = x3 + 4x2 - 10

Este método solo permite buscar la de cada función.



EXPLICACIÓN DE CODIGO

Método de Müller en Python

import sympy as sp

x = sp.Symbol('x')

# Método de Müller
def f(x):
    return x**3 - 13*x - 12

# Paso 1: Definir los puntos iniciales
X0 = 4.5
X1 = 5.5
X2 = 5

# Paso 2: Definir la tolerancia para el error relativo
tolerancia = 0.05

# Iteración (máximo 50)
for i in range(50):

    # Paso 3: Evaluar f(x) en los puntos
    fx0 = f(X0)
    fx1 = f(X1)
    fx2 = f(X2)

    # Paso 4: Calcular los intervalos
    h0 = X1 - X0
    h1 = X2 - X1

    # Paso 5: Calcular pendientes secantes
    S0 = (fx1 - fx0) / h0
    S1 = (fx2 - fx1) / h1

    # Paso 6: Determinar coeficientes A, B, C
    A = (S1 - S0) / (h1 + h0)
    B = A * h1 + S1
    C = fx2

    # Paso 7: Calcular el discriminante
    D = sp.sqrt(B**2 - 4*A*C)

    # Paso 8: Elegir el mejor denominador para evitar división por cero
    P1 = sp.Abs(B + D)
    P2 = sp.Abs(B - D)

    if P1 > P2:
        Xr = X2 + (-2 * C) / (B + D)
        print("Iteración #", i + 1)
        print("Xr:", Xr)
        print()
    else:
        Xr = X2 + (-2 * C) / (B - D)

    # Paso 9: Calcular el error relativo aproximado
    Ea = sp.Abs((Xr - X2) / Xr) * 100

    # Paso 10: Verificar tolerancia
    if Ea < tolerancia:
        print("La raíz es:", Xr)
        print("Error acumulado:", Ea)
        break
    else:
        # Actualizar puntos
        X0 = X1
        X1 = X2
        X2 = Xr