Método de la Müller.
Introducción
Este método utilizado para encontrar raíces de ecuaciones con raíces múltiples, y consiste en obtener los coeficientes de la parábola que pasa por tres puntos elegidos. Dichos coeficientes son sustituidos en la formula cuadrática para obtener el valor donde la parábola intersecta al eje X; es decir, la raíz estimada. La aproximación se puede facilitar, si se escribe la ecuación de la parábola en una forma conveniente.
Una de las mayores ventajas de este método, es que al trabajar con la formula cuadrática es posible localizar tanto raíces reales, como raíces complejas.
Características del método Muller.
▪ Converge cuadráticamente en un intervalo cercano a la raíz.
▪ No requiere evaluar la primera derivada.
▪ Se obtiene raíces reales y complejas (cuando las raíces sean repetidas.
▪ Requiere valores iníciales
▪ Extensión del método de la secante; aprox. la gráfica de la función f(x) por una línea recta que pasa por x los puntos (xi -1,f(x1)) su intersección con el eje x da una nueva aproximación (Xi -1).
▪ n=2 segundo
Se tomó 3 valores iníciales X0, X1, X2 y está ene. Polinomio P(x) de segundo grado que pasa por los puntos (X0,f(X0)), (X1,f(X1)) y (X2,f(X2)).
▪ Se toman sus raíces de p(x), la más cercana a X 2, como la siguiente aproximación a X3
Fórmula
Los tres valores iniciales necesitados son denotados como xk, xk-1 y xk-2. La parábola pasa a través de los puntos: (xk, f(xk)), (xk-1, f(xk-1)) y (xk-2, f(xk-2)), si se escribe en la forma de Newton, entonces:
donde f[xk, xk-1] y f[xk, xk-1, xk-2] denotan restas divididas. Esto puede ser escrito como:
Donde:
La próxima iteración esta dada por la raíz que brinda la ecuación y = 0.
- Determina la siguiente aproximación x3 encontrando la intersección con el eje x de la parábola definida por los puntos (x0,f(x0)), (x1,f(x1)), (x2,f(x2)).
Pseudocódigo
using System;
using System.Collections.Generic;
using System.Text;
namespace Muller
{
class Program
{
static double F(double x)
{
double F= Math.Pow(x,3)-13*x-12;
return F;
}
static void Main(string[] args)
{
Console.WriteLine(“****METODO MULLER***”);
Console.WriteLine(“ingrese X0″);
double X0 = double.Parse(Console.ReadLine());
Console.WriteLine(“ingrese X1″);
double X1 = double.Parse(Console.ReadLine());
Console.WriteLine(“ingrese X2″);
double X2 = double.Parse(Console.ReadLine());
Console.WriteLine(“ingrese Eadm”);
double Eadm = double.Parse(Console.ReadLine());
Console.WriteLine(“ingrese n”);
Double n = double.Parse(Console.ReadLine());
double h0,h1,d0,d1,A,B,C,R, denominador, h,X3;
int i = 1;
h0 = X1 – X0;
h1 = X2 – X1;
d0 = (F(X1) – F(X0)) / (X1 – X0);
d1 = (F(X2) – F(X1)) / (X2 – X1);
A = (d1 – d0) / (h1 + h0);
i = 3;
do
{
B = A * h1 + d1;
C=F(X2);
R=Math.Sqrt(Math.Pow(B,2)-(4*A*C));
if (B+R>B-R)
{
denominador = B + R;
}
else
{
denominador = B – R;
}
h = (-2*C) / (denominador);
X3 = X2 + h;
if (Eadm>Math.Abs(h ))
{
Console.WriteLine(X3);
Console.WriteLine(i);
goto id1;
}
X0 = X1;
X1 = X2;
X2 = X3;
h0 = X1 – X0;
h1 = X2 – X1;
d0 = (F(X1) – F(X0)) / h0;
d1 = (F(X2) – F(X1)) / h1;
A = (d1 – d0) / (h1 + h0);
i++;
} while (i<=n);
Console.WriteLine(“NeuN”);
id1:
Console.ReadKey();
}
}
}
Salidas









