Você está na página 1de 15

program proyecto;

uses wincrt;
type coe=array [1..100] of real;
var seleccion,g,grado:integer;
coef:coe;
ind:real;

procedure MENU;
begin
writeln('----------OPCIONES----------');
writeln('');
writeln('

1) BISECCION');

writeln('

2) NEWTON');

writeln('

3) SECANTE');

writeln('

4) FALSA POSICION');

writeln('

5) SALIR...');

writeln('');
write('Escriba la opcin del metodo que desea utilizar o la opcion para
SALIR! ---> ');
end;

function RAIZ(grado:integer;coef:coe;ind,x:real):real;
var fact,term:coe;
i,f:integer;
result:real;
begin
result:=0;
for i:=grado downto 1 do
begin

fact[i]:=1;
for f:= 1 to i do
fact[i]:=fact[i]*x;
term[i]:=coef[i]*fact[i];
result:=result+term[i];
end;
RAIZ:=result+ind
end;

function DERIVADA(grado:integer;coef:coe;ind,x:real):real;
var fact,term:coe;
i,f:integer;
result:real;
begin
result:=0;
for i:=grado downto 1 do
begin
fact[i]:=i;
for f:= 1 to i-1 do
fact[i]:=fact[i]*x;
term[i]:=coef[i]*fact[i];
result:=result+term[i];
end;
DERIVADA:=result
end;

procedure POLINOMIO(grado:integer;coef:coe;ind:real);
begin

writeln('

----------------------------------');

if grado=1 then
writeln('----------- P(x) = ',coef[1]:0:2,'x + ',ind:0:2,' -----------')
else
if grado=2 then
writeln('----------- P(x) = ',coef[2]:0:2,'x^2 + ',coef[1]:0:2,'x + ',ind:0:2,'
-----------')
else
writeln('----------- P(x) = ',coef[3]:0:2,'x^3 + ',coef[2]:0:2,'x^2 +
',coef[1]:0:2,'x + ',ind:0:2,' -----------');
writeln('

----------------------------------');

end;

procedure BISECCION(grado:integer;coef:coe;ind:real);
var FP,FA,FB,tol,a,b,p:real;
i,iter:integer;
salir:boolean;
begin
writeln('

"METODO DE LA BISECCION"');

writeln('
');
writeln('Estimado usuario, en este mtodo usted deber igresar dos
extremos de un');
writeln('intervalo cerrado [a,b] en el cual, el polinomio P(x) est
definido y adems');
writeln('que P(a) y P(b) sean de signos diferentes...!!! ');
writeln('
');
write('Ingrese el extremo a del intervalo cerrado a=');

read(a);
FA:=RAIZ(grado,coef,ind,a);
writeln('

P(',a:0:2,')=',FA:0:2);

write('Ingrese el extremo b del intervalo cerrado b=');


read(b);
FB:=RAIZ(grado,coef,ind,b);
writeln('

P(',b:0:2,')=',FB:0:2);

while FA*FB>=0 do
begin
writeln('Debe ingresar los extremos a y b de manera que P(a) y
P(b) sean de');
writeln('signos diferentes!!!');
write('Ingrese el extremo a del intervalo cerrado a=');
read(a);
FA:=RAIZ(grado,coef,ind,a);
writeln('

P(',a:0:2,')=',FA:0:2);

write('Ingrese el extremo b del intervalo cerrado b=');


read(b);
FB:=RAIZ(grado,coef,ind,b);
writeln('

P(',b:0:2,')=',FB:0:2)

end;
write('Ingrese el nmero mximo de iteraciones ');
readln(iter);
write('Ingrese tolerancia ');
readln(tol);
clrscr;
writeln('-----------------------------------------------------------------------------');
writeln('n','An':12,'Bn':13,'Pn':16,'f(Pn)':18,'ERROR':13);
writeln('-----------------------------------------------------------------------------');

i:=1;
salir:=false;
while salir=false do
begin
p:=a+(b-a)/2;
FP:=RAIZ(grado,coef,ind,p);
if (FP=0) or (abs(b-a)/2<tol) or (i>iter) then
begin
salir:=true;
if i>iter then
begin
writeln('-----------------------------------------------------------------------------');
writeln;
writeln(' EL METODO FRACASO DESPUES DE ',iter,' ITERACIONES!!!!');
end
else
begin
writeln(i,a:15:9,b:15:9,p:15:9,FP:15:5,abs(b-a)/2:15:9);
writeln('-----------------------------------------------------------------------------');
writeln;
writeln(' LA SOLUCION APROXIMADA PARA LA FUNCION
POLINOMICA ES... X = ',p:0:9);
end

end
else
begin
writeln(i,a:15:9,b:15:9,p:15:9,FP:15:5,(b-a)/2:15:9);

i:=i+1;
if FA*FP>0 then
begin
a:=p;
FA:=FP
end
else b:=P;
end
end;
writeln;
end;

procedure NEWTON(grado:integer;coef:coe;ind:real);
var p,Po,tol,FPo,DerPo:real;
iter,i:integer;
salir:boolean;
begin
writeln('

"METODO DE NEWTON"');

writeln('');
write('Ingrese la aproximacion Po= s ');
readln(Po);
write('Ingrese iteraciones: ');
readln(iter);
write('Ingrese tolerancia: ');
readln(tol);
writeln;
salir:=false;
writeln('-----------------------------------------------------------------------------');

writeln('n

Po

Pn

f(Po)

ERROR');

writeln('-----------------------------------------------------------------------------');
i:=1;
while salir=false do
begin
FPo:=RAIZ(grado,coef,ind,Po);
DerPo:=DERIVADA(grado,coef,ind,Po);
p:=Po-(FPo/DerPo);
if (i>iter) or (abs(p-Po)<tol) then
begin
salir:=true;
if i>iter then
begin
writeln('-----------------------------------------------------------------------------');
writeln(' EL METODO FRACASO DESPUES DE ',iter,'
ITERACIONES!!!!');

end
else
begin
writeln(i,Po:15:9,p:15:9,FPo:15:9,abs(p-Po):15:9);
writeln('-----------------------------------------------------------------------------');
writeln;
writeln(' LA SOLUCION APROXIMADA PARA LA FUNCION
POLINOMICA ES... X = ',p:0:9)
end
end
else
begin

writeln(i,Po:15:9,p:15:9,FPo:15:9,abs(p-Po):15:9);
i:=i+1;
Po:=p;
end
end;
writeln;
end;

procedure SECANTE(grado:integer;coef:coe;ind:real);
var p,Po,P1,tol,Qo,Q1:real;
iter,i:integer;
salir:boolean;
begin
writeln('

"METODO DE LA SECANTE"');

writeln('');
write('Ingrese la primera aproximacion: ');
readln(Po);
write('Ingrese la segunda aproximacion: ');
readln(P1);
write('Ingrese iteraciones: ');
readln(iter);
write('Ingrese tolerancia: ');
readln(tol);
writeln;
salir:=false;
writeln('-----------------------------------------------------------------------------');
writeln('n

Po

P1

Pn

ERROR');

writeln('-----------------------------------------------------------------------------');

i:=2;
while salir=false do
begin
Qo:=RAIZ(grado,coef,ind,Po);
Q1:=RAIZ(grado,coef,ind,P1);
p:=P1-Q1*(P1-Po)/(Q1-Qo);
if (i>iter) or (abs(p-P1)<tol) then
begin
salir:=true;
if i>iter then
begin
writeln('-----------------------------------------------------------------------------');
writeln(' EL METODO FRACASO DESPUES DE ',iter,'
ITERACIONES!!!!');
end
else
begin
writeln(i,Po:15:9,P1:15:9,p:15:9,abs(p-P1):15:9);
writeln('-----------------------------------------------------------------------------');
writeln;
writeln(' LA SOLUCION APROXIMADA PARA LA FUNCION
POLINOMICA ES... X = ',p:0:9)

end
end
else
begin
writeln(i,Po:15:9,P1:15:9,p:15:9,abs(p-P1):15:9);

i:=i+1;
Po:=P1;
Qo:=Q1;
P1:=p;
Q1:=RAIZ(grado,coef,ind,p);
end
end;
writeln;
end;

procedure POSICION_FALSA(grado:integer;coef:coe;ind:real);
var p,Po,P1,tol,Qo,Q1,q:real;
iter,i:integer;
salir:boolean;
begin
writeln('

"METODO DE LA POSICION FALSA"');

writeln('
');
writeln('Estimado usuario, en este mtodo usted deber ingresar dos
aproximaciones');
writeln('Po y P1 de manera que F(x) est definido en [Po,P1] y que
adems');
writeln('F(Po) y F(P1) sean de signos diferentes...!!! ');
writeln('
');
write('Ingrese la primera aproximacin Po=');
read(Po);
Qo:=RAIZ(grado,coef,ind,Po);
writeln('

F(',Po:0:2,')=',Qo:0:2);

write('Ingrese la segunda aproximacin P1=');


read(P1);
Q1:=RAIZ(grado,coef,ind,P1);
writeln('

F(',P1:0:2,')=',Q1:0:2);

while Qo*Q1>=0 do
begin
writeln('Debe ingresar las aproximaciones Po y P1 de manera
que');
writeln('F(Po) y F(P1) sean de signos opuestos!!!');
write('Ingrese la primera aproximacin Po=');
read(Po);
Qo:=RAIZ(grado,coef,ind,Po);
writeln('

F(',Po:0:2,')=',Qo:0:2);

write('Ingrese la segunda aproximacin P1=');


read(P1);
Q1:=RAIZ(grado,coef,ind,P1);
writeln('

F(',P1:0:2,')=',Q1:0:2);

end;
write('Ingrese iteraciones: ');
readln(iter);
write('Ingrese tolerancia: ');
readln(tol);
writeln;
salir:=false;
writeln('-----------------------------------------------------------------------------');
writeln('n

Po

P1

Pn

ERROR');

writeln('-----------------------------------------------------------------------------');
i:=2;
while salir=false do

begin
Qo:=RAIZ(grado,coef,ind,Po);
Q1:=RAIZ(grado,coef,ind,P1);
p:=P1-Q1*(P1-Po)/(Q1-Qo);
if (i>iter) or (abs(p-P1)<tol) then
begin
salir:=true;
if i>iter then
begin
writeln('-----------------------------------------------------------------------------');
writeln(' EL METODO FRACASO DESPUES DE ',iter,'
ITERACIONES!!!!');
end
else
begin
writeln(i,Po:15:9,P1:15:9,p:15:9,abs(p-P1):15:9);
writeln('-----------------------------------------------------------------------------');
writeln;
writeln(' LA SOLUCION APROXIMADA PARA LA FUNCION
POLINOMICA ES... X = ',p:0:9)
end
end
else
begin
writeln(i,Po:15:9,P1:15:9,p:15:9,abs(p-P1):15:9);
i:=i+1;
q:=RAIZ(grado,coef,ind,p);
if q*Q1<0 then

begin
Po:=P1;
Qo:=Q1
end;
P1:=p;
Q1:=q
end
end;
writeln;
end;

begin {inicia el cuerpo principal del programa}


repeat
MENU;
readln(seleccion);
while (seleccion<1) or (seleccion>5) do
begin
write('Nmero no vlido. Escriba un valor correcto: ');
readln(seleccion)
end;
if seleccion=5 then
begin
clrscr;
writeln;
writeln('---------------------> QUE TENGA BUEN DIA...!!!')
end
else
begin

write('Escriba el grado de la funcin polinmica que sea igual o menor


que tres: ');
readln(grado);
while (grado<1) or (grado>3) do
begin
write('Este grado para la funcin polinmica no esta permitido.
Escriba de nuevo... ');
readln(grado)
end;
for g:=grado downto 1 do
begin
write('Escriba el coeficiente del trmino de grado ',g,': ');
readln(coef[g]);
while coef[grado]=0 do
begin
write('Este coeficiente no puede ser 0. Reescribalo: ');
readln(coef[grado])
end;
end;
write('Escriba el valor del trmino independiente: ');
readln(ind);
clrscr;
POLINOMIO(grado,coef,ind);
case seleccion of
1:BISECCION(grado,coef,ind);
2:NEWTON(grado,coef,ind);
3:SECANTE(grado,coef,ind);
4:POSICION_FALSA(grado,coef,ind);
end;

end;
until seleccion=5
end.

Você também pode gostar