Método de Müller

Método de Müller.

 

 

El método de la secante obtiene raíces de una función estimando una proyección de una línea recta en el eje de las x, a través de los valores de la función. El método de Müller, trabaja de manera similar, pero en lugar de hacer la proyección de una recta  utilizando dos puntos, requiere de tres puntos para calcular una parábola.

 

Para esto necesitaremos de tres puntos [x0, f(x0)], [x1, f(x1)] y [x2, f(x2)]. La aproximación la podemos escribir como:

 

f2(x) = A(x – x2)2 + B(x – x2) + C

 

Los coeficientes de la parábola los calculamos resolviendo el siguiente sistema de ecuaciones.

 

f2(x0) = A(x0 – x2)2 + B(x0 – x2) + C

f2(x1) = A(x1 – x2)2 + B(x1 – x2) + C

f2(x2) = A(x2 – x2)2 + B(x2 – x2) + C

 

De la última ecuación podemos ver que el calor de C = f2(x2). Sustituyendo los valores de C en las otras dos ecuaciones tenemos

 

f2(x0)- f2(x2)  = A(x0 – x2)2 + B(x0 – x2)

f2(x1) - f2(x2) = A(x1 – x2)2 + B(x1 – x2)

 

Si definimos

 

h0 = x1 - x0

h1 = x2 – x1

d0 = [f(x1) – f(x0)]/[x1 – x0]

d1 = [f(x2) – f(x1)]/[x2 –x1]

 

Sustituyendo en las ecuaciones tenemos

 

 

-(d0* h0 + d1* h1)= A(h1 + h0 )2 - B(h1 + h0 )

-d1* h1 = A(h1)2 - Bh1

 

La solución de este sistema de ecuaciones es:

 

A = (d1 – d0)/(h1 + h0)

B = Ah1 + d1

C = f(x2)

 

Ahora para calcular la raíz del polinomio de segundo grado, podemos aplicar la formula general.  Sin embargo, debido al error potencial de redondeo, usaremos una formulación alternativa.

 

 

Ejemplo.

 

Use el método de Müller con los valores iniciales de 4.5, 5.5 y 5 para determinar la raíz de la ecuación f(x) = x3 – 13x – 12.

 

x0

x1

x2

f(x0)

f(x1)

f(x2)

x3

4.50000

5.50000

5.00000

20.62500

82.87500

48.00000

3.97649

5.50000

5.00000

3.97649

82.87500

48.00000

-0.81633

4.00105

5.00000

3.97649

4.00105

48.00000

-0.81633

0.03678

4.00000

3.97649

4.00105

4.00000

-0.81633

0.03678

0.00002

4.00000

 

Implementación en Java.

 

/**

 * <p>Title: Metodo de Muller</p>

 * <p>Description: Resuelve un ecuación haciendo una aproximacion cuadratica</p>

 * <p>Copyright: Copyright (c) 2003</p>

 * <p>Company: UMSNH</p>

 * @author Dr. Felix Calderon Solorio

 * @version 1.0

 */

 

public class ej058 {

  public static void main(String[] args) {

    Muller();

  }

 

  static public void Muller()

  {

    double x0 = 4.5, x1 = 5.5, x2 = 5.0, x3;

    double h0, h1, d0, d1, A, B, C;

    double den, raiz;

 

    do

    {

 

      h0 = x1 - x0;

      h1 = x2 - x1;

      d0 = (f(x1) - f(x0)) / h0;

      d1 = (f(x2) - f(x1)) / h1;

 

      A = (d1 - d0) / (h1 + h0);

      B = A * h1 + d1;

      C = f(x2);

 

 

      raiz = Math.sqrt(B * B - 4.0 * A * C);

 

      if (Math.abs(B + raiz) > Math.abs(B - raiz))

        den = B + raiz;

      else

        den = B - raiz;

 

      x3 = x2 - 2 * C / den;

      System.out.println(" x = " + x3 + " " + f(x3));

 

      x0 = x1;

      x1 = x2;

      x2 = x3;

    }while (Math.abs(f(x3)) > 0.000001);

  }

  static public double f(double x)

  {

    return(x*x*x - 13*x -12);

  }

}

 

Regresar.