Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
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 x 1. 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 x 0, y
vamos realizando sucesivas iteraciones, obteniendo los valores x 1,x2,x3,..., donde
cuantas ms iteraciones se realicen, ms prximo a la solucin Q ser nuestro
valor estimado.
Que cumpla:
Es decir:
Una vez encontrada la hiprbola osculatriz, tomamos como nueva aproximacin 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:
ALGORITMO
PROGRAMhalley(INPUT,OUTPUT);
TYPE
Coef=ARRAY[0..10]OFdouble;
(*Lecturadelosdatosdelpolinomio*)
PROCEDURElee_coef(VARn:integer;
VARa:coef);
VAR
i:integer;
BEGIN
WRITELN;
WRITE('Gradodelpolinomio:');
READLN(n);
FORi:=nDOWNTO0DO
BEGIN
WRITE('Coeficientea[',i:2,']=');
READLN(a[i])
END
END;{lee_coef}
(*************************************
*PROGRAMAPRINCIPAL*
************************************)
VAR
grado,i
:integer;
M,iter
:integer;
a
:coef;
x0,x1
:double;
d,fm,conv,ft
:double;
f,df,d2f
:double;
BEGIN
WRITELN;
WRITELN('***IteraciondeHalley***');
WRITELN;
(*Polinomio*)
WRITELN('Datosdelpolinomio:');
lee_coef(grado,a);
WRITE('Aproximacioninicial:');
READLN(x0);
WRITE('Naximodeiteraciones:');
READLN(M);
WRITE('Criteriodeconvergencia:');
READLN(d);
WRITE('Valormaximodelafuncion:');
READLN(fm);
(*Inicializamosvariables*)
iter:=0;
conv:=d+1.0;
ft:=fm+1.0;
(*Bucleprincipaldeiteracion*)
WHILE(iter<M)AND
((conv>d)OR(ft>fm))DO
BEGIN
(*Calculaf(x);f'(x)yf''(x)*)
f:=a[grado];
df:=0;
d2f:=0;
FORi:=grado1DOWNTO0DO
BEGIN
d2f:=x0*d2f+df;
df:=x0*df+f;
f:=x0*f+a[i]
END;
x1:=x0f*df/
(df*dff*d2f/2);
ft:=abs(f);
iter:=iter+1;
conv:=abs((x1x0)/x1);
x0:=x1;
END;
IF(iter>=M)THEN
WRITELN('***NoConverge***')
ELSE
WRITELN('***Converge***');
WRITELN('x=',x0);
WRITELN('f(x)=',f);
WRITELN('Iteraciones=',iter);
WRITELN('Convergencia=',conv)
END.