- program numericodefinitivo3;
- var
- a,b,c,d,e,f,g,h,i,j,k,l,m,n,x,x0,x1,epsilon,imagemmax,imagem, z,cmax,q:real;
- iteracao,itmax,escolha,testeglobal1,testeglobal2, pergunta: integer;
- function fun(a,b,c,d,e,f,g,h,i,j,k,l,v:real):real;
- begin
- if e<>0 then
- fun:=((a*sin(b*v)+c*cos(d*v)+e*ln(f*v)+g*exp(h*v)+i*v*v*v+j*v*v+k*v+l))
- else
- begin
- if e=0 then
- fun:=((a*sin(b*v)+c*cos(d*v)+g*exp(h*v)+i*v*v*v+j*v*v+k*v+l));
- end;
- end;
- function dfun(a,b,c,d,e,f,g,h,i,j,k,l,v:real):real;
- begin
- if e<>0 then
- dfun:= ((a*b*cos(b*v))-(c*d*sin(d*v))+((e/v))+(g*h*exp(h*v))+(3*i*v*v)+(2*j*v)+(k));
- if e=0 then
- dfun:= ((a*b*cos(b*v))-(c*d*sin(d*v))+(g*h*exp(h*v))+(3*i*v*v)+(2*j*v)+(k))
- end;
- function bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n:real):real;
- var p,x:real;
- teste:integer;
- begin
- p:=(n-m);
- x:=((m+n)/2);
- testeglobal2:=0;
- teste:=0;
- begin
- while ((teste)=(0)) do
- begin
- z:= ((fun(a,b,c,d,e,f,g,h,i,j,k,l,m))*(fun(a,b,c,d,e,f,g,h,i,j,k,l,x)));
- x0:=x;
- if ((z) < (0)) then
- n:=(x);
- if ((z) > (0)) then
- m:=(x);
- p:=(n-m);
- x:=((m+n)/2);
- x1:=x;
- imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x)));
- iteracao:=iteracao +1;
- writeln('Metodo da bissecao, iteracao ',iteracao,',x atual: ',x:0:6,'. O valor do modulo f(x) e:',imagem:0:6);
- if ((iteracao) = (itmax)) then
- teste:=1;
- if ((abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x))) < (imagemmax)) then
- teste:=1;
- if ((p)<(cmax)) then
- begin
- teste:=1;
- begin
- if ((iteracao) <> (itmax)) then
- begin
- if ((abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x))) >= (imagemmax)) then
- testeglobal2:=1;
- end;
- end;
- end;
- end;
- end;
- bissecao:=x;
- teste:=0;
- end;
- function newtoncomepsilon(a,b,c,d,e,f,g,h,i,j,k,l,v, epsilon, imagemmax:real; itmax:integer):real;
- var teste2: integer;
- begin
- teste2:=0;
- x1:=v;
- while ((teste2)=(0)) do
- begin
- v:= (v-((fun(a,b,c,d,e,f,g,h,i,j,k,l,v))/(dfun(a,b,c,d,e,f,g,h,i,j,k,l,v))));
- iteracao:=((iteracao)+(1));
- begin
- if ((iteracao)=(itmax)) then
- begin
- teste2:=1;
- end;
- end;
- x0:=x1;
- x1:=v;
- imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v)));
- writeln('Metodo de newton, iteracao ',iteracao,' ,x atual: ,',v:0:6,'. O valor do modulo f(x) e:',imagem:0:6);
- if ((abs(dfun(a,b,c,d,e,f,g,h,i,j,k,l,v))<epsilon)) then
- teste2:=1;
- if ((abs(dfun(a,b,c,d,e,f,g,h,i,j,k,l,v))<epsilon)) then
- testeglobal1:=1;
- if (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v))<imagemmax) then
- teste2:=1;
- end;
- newtoncomepsilon:=v;
- end;
- function newtonsemepsilon(a,b,c,d,e,f,g,h,i,j,k,l,v,imagemmax:real; itmax:integer):real;
- var teste:integer;
- begin
- teste:=0;
- while ((teste)=(0)) do
- begin
- v:= (v-((fun(a,b,c,d,e,f,g,h,i,j,k,l,v))/(dfun(a,b,c,d,e,f,g,h,i,j,k,l,v))));
- iteracao:=iteracao +1;
- imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v)));
- writeln('Metodo de newton, iteracao ',iteracao,' ,x atual: ,',v,'. O valor do modulo f(x) e:',imagem:0:6);
- if (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v))<imagemmax) then
- teste:=1;
- if ((iteracao)=(itmax)) then
- teste:=1;
- end;
- newtonsemepsilon:=v;
- end;
- function secante(a,b,c,d,e,f,g,h,i,j,k,l,x0,x1,imagemmax,itmax:real):real;
- var
- teste: integer;
- aux: real;
- begin
- teste:=0;
- while ((teste)=(0)) do
- begin
- aux:=x1;
- x1:= ((((x0)*(fun(a,b,c,d,e,f,g,h,i,j,k,l,x1)))-((x1)*(fun(a,b,c,d,e,f,g,h,i,j,k,l,x0))))/((fun(a,b,c,d,e,f,g,h,i,j,k,l,x1))-(fun(a,b,c,d,e,f,g,h,i,j,k,l,x0))));
- x0:=aux;
- iteracao:= iteracao+1;
- imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x1)));
- writeln('Metodo das secantes, iteracao ',iteracao,' ,x atual: ,',x1,'. O valor do modulo f(x) e:',imagem:0:6);
- if ((abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x1))) < (imagemmax)) then
- teste:=1;
- if ((iteracao) = (itmax)) then
- teste:=1;
- secante:=x1;
- end;
- end;
- begin
- iteracao:=0;
- writeln('Digite os coeficientes (a,b,c,d,e,f,g,h,i,j,k,l) da funcao)');
- readln(a,b,c,d,e,f,g,h,i,j,k,l);
- writeln('Agora digite os metodos de aproximaçao de raizes desejado');
- writeln('1 para Bissecao');
- writeln('2 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo de Newton');
- writeln('3 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo de Newton com criterio de parada como valor da imagem de f');
- writeln('4 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo das secantes');
- writeln('5 para finalizar o programa');
- readln(escolha);
- if escolha<>0 then
- begin
- repeat
- begin
- if escolha=1 then
- begin
- writeln('Digite o comprimento maximo desejado do intervalo de separacao');
- readln(cmax);
- writeln('Digite o valor maximo para o modulo de f(x)');
- readln(imagemmax);
- writeln('Digite o número maximo de iteracoes desejado');
- readln(itmax);
- writeln('Digite os extremos (do menor para o maior) do intervalo');
- readln(m,n);
- q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
- if (frac(q))<>0 then
- q:= q - (frac(q)) + 1;
- writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressione alguma tecla');
- readln;
- x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
- end
- else
- begin
- if escolha=2 then
- begin
- cmax:= 0.1;
- writeln('Digite o valor máximo para o módulo de f(x)');
- readln(imagemmax);
- writeln('Digite o número maximo de iteracoes desejado');
- readln(itmax);
- writeln('Digite os extremos (do menor para o maior) do intervalo');
- readln(m,n);
- q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
- if (frac(q))<>0 then
- q:= q - (frac(q)) + 1;
- writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressione alguma tecla');
- readln;
- x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
- if testeglobal2=1 then
- x:=(newtonsemepsilon(a,b,c,d,e,f,g,h,i,j,k,l,x,imagemmax,itmax));
- end
- else
- begin
- if escolha=3 then
- begin
- cmax:= 0.1;
- writeln('Digite o valor maximo para o módulo de f(x)');
- readln(imagemmax);
- writeln('Digite o numero maximo de iteracoes desejado');
- readln(itmax);
- writeln('Digite os extremos (do menor para o maior) do intervalo');
- readln(m,n);
- q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
- if (frac(q))<>0 then
- q:= q - (frac(q)) + 1;
- writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressione alguma tecla');
- readln;
- writeln('Digite o valor minimo para a derivada de f(x) no metodo de newton');
- readln(epsilon);
- x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
- testeglobal1:=0;
- if testeglobal2=1 then
- begin
- x:=(newtoncomepsilon(a,b,c,d,e,f,g,h,i,j,k,l,x,epsilon,imagemmax,itmax));
- pergunta:=0;
- if testeglobal1=1 then
- begin
- writeln('Valor da derivada de f(x) muito pequeno, deseja mudar para metodo das secantes? 1 para sim, outra tecla para nao');
- readln(pergunta);
- end;
- if pergunta=1 then
- x:=secante(a,b,c,d,e,f,g,h,i,j,k,l,x0,x1,imagemmax,itmax)
- else
- x:=(newtonsemepsilon(a,b,c,d,e,f,g,h,i,j,k,l,x,imagemmax,itmax))
- end
- end
- else
- begin
- if escolha=4 then
- begin
- cmax:= 0.1;
- writeln('Digite o valor maximo para o modulo de f(x)');
- readln(imagemmax);
- writeln('Digite o numero maximo de iteracoes desejado');
- readln(itmax);
- writeln('Digite os extremos (do menor para o maior) do intervalo');
- readln(m,n);
- q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
- if (frac(q))<>0 then
- q:= q - (frac(q)) + 1;
- writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressiona alguma tecla');
- readln;
- x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
- if testeglobal2=1 then
- x:=secante(a,b,c,d,e,f,g,h,i,j,k,l,x0,x1,imagemmax,itmax);
- end
- end
- end
- end;
- writeln('O que deseja fazer agora?');
- writeln('1 para Bissecao');
- writeln('2 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo de Newton');
- writeln('3 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo de Newton com criterio de parada como valor da imagem de f');
- writeln('4 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo das secantes');
- writeln('5 para finalizar o programa');
- readln(escolha);
- iteracao:=0;
- end;
- until escolha = 5;
- end;
- readln;
- end.