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);
}
}