You are on page 1of 5

Descripcin del Metodo de Halley

La funcin de iteracin de Halley (IF) para aproximar las ra ces de una funcin
de una sola variable tiene una larga historia que se remonta a 1694. Este mtodo
se conoce con frecuencia como el mtodo de las hiprbolas tan- gentes, y puede
ser descrito de manera sencilla de la siguiente manera:
Dada una funcin f(x) y un valor inicial x0 lo suficientemente prximo a la ra z de
la funcin, consiste en la construccin de una hiprbola que es tangente a la
grfica de f(x) en el punto x0 hasta el segundo orden. El punto en que la hiprbola
tangente corta al eje de las abscisas, ser nuestra primera estimacin x1. Una vez
obtenida esta, volvemos a hacer otra vez el mismo proceso, pero en lugar de partir
del valor x0, ahora partimos del ltimo valor estimado x1, y as procederemos
sucesivamente. Evidente- mente, cuanto mayor nmero de estimaciones, mayor
precisin obtendremos en nuestro resultado, es decir, tendremos un menor error
en relacin al valor real Q, el cul debe estar dentro de los l mites establecidos
por el mtodo.
Todo esto lo podemos observar en la figura 1, donde para obtener la solucin de
la funcin f(x) = 0, es decir, el valor de la ra z Q, partimos de un valor inicial x0, y
vamos realizando sucesivas iteraciones, obteniendo los valores x1,x2,x3,..., donde
cuantas ms iteraciones se realicen, ms prximo a la solucin Q ser nuestro
valor estimado.

Figura 3.1: Representacin grfica del mtodo de Halley(H=M.Halley, E=M.Euler,


N=M.Newton
La proximidad a la raz de f(x) del valor inicial x0 depender de la natu- raleza
intrnseca de la funcin, ya que esta puede presentar distintos puntos de inflexin
o pendientes muy pequenas, lo que hace que aumenten las probabilidades de que
el algoritmo diverja.
Antes de empezar a describir las diferentes formas a travs de las cuales
podemos obtener el mtodo de Halley, debido a la imposicin de que el valor
inicial x0 sea prximo a la raz, estudiaremos diferentes mtodos que nos permiten
obtener un valor inicial adecuado.

Deduccin del mtodo de Halley


En este apartado vamos a estudiar cmo se construye el mtodo de Ha- lley,
es decir, vamos a ver como se obtiene geomtricamente, y ms adelante veremos
otros procedimientos para su obtencin.
El mtodo de Halley puede obtenerse aproximando una funcin por medio de
hiprbolas. Para aproximar la solucin de una ecuacin f(x) = 0, a partir de un
valor inicial x0, vamos a buscar una hiprbola de la forma:

Que cumpla:

Este tipo de curvas, denominadas osculatrices, coinciden con f en x0 hasta la


segunda derivada. En consecuencia, estas hiprbolas aproximan mejor a una
curva que la recta tangente, donde la coincidencia slo es hasta la primera
derivada. Esta mejor aproximacin se ve reflejada en una convergencia ms
rpida para el mtodo de Halley que para el de Newton: el primero tiene orden tres
mientras que el segundo tiene orden dos. De forma breve, se puede decir que el
orden de convergencia mide la velocidad con la que una sucesin se aproxima a
su l mite: a mayor orden, mayor velocidad. Para que la hiprbola cumpla las
condiciones requeridas, sus coeficientes a,b y c deben satisfacer:
Es decir:

Una vez encontrada la hiprbola osculatriz, tomamos como nueva apro-


ximacin su interseccin con el eje de abscisas, es decir el punto tal que y(x 1) = 0.
Dada la forma de la hiprbola, se tiene que:

Debido a esta interpretacin geomtrica, el mtodo de Halley es llamado a veces


el mtodo de las hiprbolas tangentes [1][2].
ALGORITMO

PROGRAM halley(INPUT, OUTPUT);


TYPE
Coef = ARRAY [0..10] OF double;

(* Lectura de los datos del polinomio *)


PROCEDURE lee_coef(VAR n : integer;
VAR a : coef);
VAR
i : integer;
BEGIN
WRITELN;
WRITE('Grado del polinomio: ');
READLN(n);
FOR i:=n DOWNTO 0 DO
BEGIN
WRITE('Coeficiente a[',i:2,'] = ');
READLN(a[i])
END
END; { lee_coef }

(*************************************
* PROGRAMA PRINCIPAL *
************************************)

VAR
grado,i : integer;
M,iter : integer;
a : coef;
x0,x1 : double;
d,fm,conv,ft : double;
f,df,d2f : double;
BEGIN
WRITELN;
WRITELN('*** Iteracion de Halley ***');
WRITELN;
(* Polinomio *)
WRITELN('Datos del polinomio:');
lee_coef(grado,a);
WRITE('Aproximacion inicial: ');
READLN(x0);
WRITE('Naximo de iteraciones: ');
READLN(M);
WRITE('Criterio de convergencia: ');
READLN(d);
WRITE('Valor maximo de la funcion: ');
READLN(fm);
(* Inicializamos variables *)
iter := 0;
conv := d + 1.0;
ft := fm + 1.0;
(* Bucle principal de iteracion *)
WHILE (iter < M) AND
((conv > d) OR (ft > fm)) DO
BEGIN
(* Calcula f(x); f'(x) y f''(x) *)
f := a[grado];
df := 0;
d2f := 0;
FOR i := grado-1 DOWNTO 0 DO
BEGIN
d2f := x0 * d2f + df;
df := x0 * df + f;
f := x0 * f + a[i]
END;
x1 := x0 f * df /
(df * df - f * d2f / 2);
ft := abs(f);
iter := iter + 1;
conv := abs((x1 - x0)/x1);
x0 := x1;
END;

IF (iter >= M) THEN


WRITELN('*** No Converge ***')
ELSE
WRITELN('*** Converge ***');

WRITELN('x = ',x0);
WRITELN('f(x) = ',f);
WRITELN('Iteraciones = ',iter);
WRITELN('Convergencia = ',conv)
END.

You might also like