Don't like ads? PRO users don't see any ads ;-)
Guest

merda

By: a guest on May 28th, 2012  |  syntax: None  |  size: 8.89 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. program numericodefinitivo3;
  2.  
  3. var
  4. a,b,c,d,e,f,g,h,i,j,k,l,m,n,x,x0,x1,epsilon,imagemmax,imagem, z,cmax,q:real;
  5. iteracao,itmax,escolha,testeglobal1,testeglobal2, pergunta: integer;
  6.  
  7.  
  8. function fun(a,b,c,d,e,f,g,h,i,j,k,l,v:real):real;
  9. begin
  10. if e<>0 then
  11.       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))
  12. else
  13. begin
  14. if e=0 then
  15. fun:=((a*sin(b*v)+c*cos(d*v)+g*exp(h*v)+i*v*v*v+j*v*v+k*v+l));
  16. end;
  17. end;
  18.  
  19. function dfun(a,b,c,d,e,f,g,h,i,j,k,l,v:real):real;
  20. begin
  21. if e<>0 then
  22. 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));
  23. if e=0 then
  24. dfun:= ((a*b*cos(b*v))-(c*d*sin(d*v))+(g*h*exp(h*v))+(3*i*v*v)+(2*j*v)+(k))
  25. end;
  26.  
  27. function bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n:real):real;
  28. var p,x:real;
  29. teste:integer;
  30. begin
  31. p:=(n-m);
  32. x:=((m+n)/2);
  33. testeglobal2:=0;
  34. teste:=0;
  35. begin
  36. while ((teste)=(0))  do
  37.       begin
  38.       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)));
  39.       x0:=x;
  40. if ((z) < (0)) then
  41.      n:=(x);
  42. if ((z) > (0)) then
  43.      m:=(x);
  44. p:=(n-m);
  45. x:=((m+n)/2);
  46. x1:=x;
  47. imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x)));
  48. iteracao:=iteracao +1;
  49. writeln('Metodo da bissecao, iteracao ',iteracao,',x atual: ',x:0:6,'. O valor do modulo f(x) e:',imagem:0:6);
  50. if ((iteracao) = (itmax)) then
  51.    teste:=1;
  52. if ((abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x))) < (imagemmax)) then
  53.    teste:=1;
  54. if ((p)<(cmax)) then
  55.    begin
  56.    teste:=1;
  57.    begin
  58.    if ((iteracao) <> (itmax)) then
  59.       begin
  60.       if ((abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x))) >= (imagemmax)) then
  61.    testeglobal2:=1;
  62.       end;
  63.    end;
  64.       end;
  65.    end;
  66.        end;
  67. bissecao:=x;
  68. teste:=0;
  69. end;
  70.  
  71.  
  72. function newtoncomepsilon(a,b,c,d,e,f,g,h,i,j,k,l,v, epsilon, imagemmax:real; itmax:integer):real;
  73. var teste2: integer;
  74. begin
  75. teste2:=0;
  76. x1:=v;
  77. while ((teste2)=(0)) do
  78. begin
  79. 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))));
  80. iteracao:=((iteracao)+(1));
  81. begin
  82. if ((iteracao)=(itmax)) then
  83.    begin
  84.    teste2:=1;
  85.    end;
  86. end;
  87. x0:=x1;
  88. x1:=v;
  89. imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v)));
  90. writeln('Metodo de newton, iteracao ',iteracao,' ,x atual: ,',v:0:6,'. O valor do modulo f(x) e:',imagem:0:6);
  91. if ((abs(dfun(a,b,c,d,e,f,g,h,i,j,k,l,v))<epsilon)) then
  92.    teste2:=1;
  93. if ((abs(dfun(a,b,c,d,e,f,g,h,i,j,k,l,v))<epsilon)) then
  94.    testeglobal1:=1;
  95. if (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v))<imagemmax) then
  96.    teste2:=1;
  97. end;
  98. newtoncomepsilon:=v;
  99. end;
  100.  
  101. function newtonsemepsilon(a,b,c,d,e,f,g,h,i,j,k,l,v,imagemmax:real; itmax:integer):real;
  102. var teste:integer;
  103. begin
  104. teste:=0;
  105. while ((teste)=(0)) do
  106. begin
  107. 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))));
  108. iteracao:=iteracao +1;
  109. imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v)));
  110. writeln('Metodo de newton, iteracao ',iteracao,' ,x atual: ,',v,'. O valor do modulo f(x) e:',imagem:0:6);
  111. if (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,v))<imagemmax) then
  112.    teste:=1;
  113. if ((iteracao)=(itmax)) then
  114.    teste:=1;
  115. end;
  116. newtonsemepsilon:=v;
  117. end;
  118.  
  119. function secante(a,b,c,d,e,f,g,h,i,j,k,l,x0,x1,imagemmax,itmax:real):real;
  120. var
  121. teste: integer;
  122. aux: real;
  123. begin
  124. teste:=0;
  125. while ((teste)=(0)) do
  126. begin
  127. aux:=x1;
  128. 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))));
  129. x0:=aux;
  130. iteracao:= iteracao+1;
  131. imagem:= (abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x1)));
  132. writeln('Metodo das secantes, iteracao ',iteracao,' ,x atual: ,',x1,'. O valor do modulo f(x) e:',imagem:0:6);
  133. if ((abs(fun(a,b,c,d,e,f,g,h,i,j,k,l,x1))) < (imagemmax)) then
  134.    teste:=1;
  135. if ((iteracao) = (itmax)) then
  136.    teste:=1;
  137. secante:=x1;
  138. end;
  139.  
  140. end;
  141.  
  142.  
  143. begin
  144. iteracao:=0;
  145. writeln('Digite os coeficientes (a,b,c,d,e,f,g,h,i,j,k,l) da funcao)');
  146. readln(a,b,c,d,e,f,g,h,i,j,k,l);
  147. writeln('Agora digite os metodos de aproximaçao de raizes desejado');
  148. writeln('1 para Bissecao');
  149. writeln('2 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo de Newton');
  150. 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');
  151. writeln('4 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo das secantes');
  152. writeln('5 para finalizar o programa');
  153. readln(escolha);
  154. if escolha<>0 then
  155.    begin
  156. repeat
  157. begin
  158. if escolha=1 then
  159.    begin
  160.    writeln('Digite o comprimento maximo desejado do intervalo de separacao');
  161.    readln(cmax);
  162.    writeln('Digite o valor maximo para o modulo de f(x)');
  163.    readln(imagemmax);
  164.    writeln('Digite o número maximo de iteracoes desejado');
  165.    readln(itmax);
  166.    writeln('Digite os extremos (do menor para o maior) do intervalo');
  167.    readln(m,n);
  168.          q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
  169.       if (frac(q))<>0 then
  170.          q:= q - (frac(q)) + 1;
  171.       writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressione alguma tecla');
  172.       readln;
  173.    x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
  174.    end
  175. else
  176. begin
  177.   if escolha=2 then
  178.      begin
  179.    cmax:= 0.1;
  180.    writeln('Digite o valor máximo para o módulo de f(x)');
  181.    readln(imagemmax);
  182.    writeln('Digite o número maximo de iteracoes desejado');
  183.    readln(itmax);
  184.    writeln('Digite os extremos (do menor para o maior) do intervalo');
  185.    readln(m,n);
  186.       q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
  187.       if (frac(q))<>0 then
  188.          q:= q - (frac(q)) + 1;
  189.       writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressione alguma tecla');
  190.       readln;
  191.      x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
  192.      if testeglobal2=1 then
  193.      x:=(newtonsemepsilon(a,b,c,d,e,f,g,h,i,j,k,l,x,imagemmax,itmax));
  194.      end
  195.          else
  196.          begin
  197.            if escolha=3 then
  198.               begin
  199.                   cmax:= 0.1;
  200.                   writeln('Digite o valor maximo para o módulo de f(x)');
  201.                   readln(imagemmax);
  202.                   writeln('Digite o numero maximo de iteracoes desejado');
  203.                   readln(itmax);
  204.                   writeln('Digite os extremos (do menor para o maior) do intervalo');
  205.                   readln(m,n);
  206.                   q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
  207.       if (frac(q))<>0 then
  208.          q:= q - (frac(q)) + 1;
  209.       writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressione alguma tecla');
  210.       readln;
  211.                   writeln('Digite o valor minimo para a derivada de f(x) no metodo de newton');
  212.                   readln(epsilon);
  213.                   x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
  214.                   testeglobal1:=0;
  215.                   if testeglobal2=1 then
  216.                      begin
  217.                   x:=(newtoncomepsilon(a,b,c,d,e,f,g,h,i,j,k,l,x,epsilon,imagemmax,itmax));
  218.                   pergunta:=0;
  219.                   if testeglobal1=1 then
  220.                      begin
  221.                   writeln('Valor da derivada de f(x) muito pequeno, deseja mudar para metodo das secantes? 1 para sim, outra tecla para nao');
  222.                   readln(pergunta);
  223.                      end;
  224.                   if pergunta=1 then
  225.                   x:=secante(a,b,c,d,e,f,g,h,i,j,k,l,x0,x1,imagemmax,itmax)
  226.                   else
  227.                   x:=(newtonsemepsilon(a,b,c,d,e,f,g,h,i,j,k,l,x,imagemmax,itmax))
  228.                   end
  229.               end
  230.                  else
  231.                  begin
  232.                    if escolha=4 then
  233.                       begin
  234.                   cmax:= 0.1;
  235.                   writeln('Digite o valor maximo para o modulo de f(x)');
  236.                   readln(imagemmax);
  237.                   writeln('Digite o numero maximo de iteracoes desejado');
  238.                   readln(itmax);
  239.                   writeln('Digite os extremos (do menor para o maior) do intervalo');
  240.                   readln(m,n);
  241.                   q:= (((ln((n-m)))-(ln(0.1)))/(ln(2)));
  242.       if (frac(q))<>0 then
  243.          q:= q - (frac(q)) + 1;
  244.       writeln('Serao necessarias ',q:0:0,' iteracoes para o intervalo de separacao medir 0.1, pressiona alguma tecla');
  245.       readln;
  246.                   x:=(bissecao(a,b,c,d,e,f,g,h,i,j,k,l,m,n));
  247.                   if testeglobal2=1 then
  248.                   x:=secante(a,b,c,d,e,f,g,h,i,j,k,l,x0,x1,imagemmax,itmax);
  249.                           end
  250.                    end
  251.                  end
  252.            end;
  253. writeln('O que deseja fazer agora?');
  254. writeln('1 para Bissecao');
  255. writeln('2 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo de Newton');
  256. 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');
  257. writeln('4 para bissecao ate o intervalo de separacao igual a 0.1 e, a partir dai, metodo das secantes');
  258. writeln('5 para finalizar o programa');
  259. readln(escolha);
  260. iteracao:=0;
  261. end;
  262. until escolha = 5;
  263.    end;
  264.  
  265. readln;
  266. end.