Advertisement
luizaspan

[PROVA FSC_COMP] Raiz de equação: método da bisseção

Sep 24th, 2015
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.10 KB | None | 0 0
  1. /*
  2. O MÉTODO EXPLICADO:
  3. Tenho uma função f que quero achar raiz x, i.e. f(x)=0. Usando o método da bisseção temos que escolher (chutar) um intervalo [a,b] que contém a raiz x, de modo que f(a)<f(b) -- tal condição é verificada a cada iteração.
  4. "O método consiste em dividir o intervalo no seu ponto médio c=(a+b)/2, e então verificar em qual dos dois subintervalos intervalos se encontra a raiz. Para tanto, basta verificar se f(a)*f(c) < 0} Caso afirmativo, a raiz encontra-se no intervalo [a,c], caso contrário ela se encontra no intervalo [c,b]. O procedimento é, então, repetido para o subintervalo correspondente à raiz até que c aproxime a raiz com a precisão desejada."
  5.  
  6. CONVERGÊNCIA E ERRO:
  7. Podemos observar que o erro absoluto máximo será sempre metade do intervalo em questão. Por exemplo, sendo c* o valor exato do zero da função, o erro na primeira interação será
  8. |c*- c^1| = (a + b)/2
  9. E a cada iteração este erro vai ser dividido para a metade do anterior, nos deixando com a equação geral para o erro na "n-ésima" iteração:
  10. |c*- c^n| = (a + b)/2^n
  11. Se \epsilon_n for o erro absoluto, então:
  12. \epsilon _{n+1} = \epsilon _n /2
  13. e, portanto, dizemos que o método da bisseção tem convergência linear.
  14. Podemos também utilizar a equação do erro absoluto para gerar o valor de n máximo para uma determinada tolerância ou erro, \epsilon.
  15. n = \log_2\left(\frac{\epsilon_0}{\epsilon}\right)
  16. Sendo \epsilon_0 o tamanho inicial do intervalo, portanto, \epsilon_0=b - a
  17.  
  18. MÉTODO:
  19. De início temos de achar valores para a e b tais que f(a) e f(b) tenham sinais contrários. Se a função é contínua, sabemos que existe uma raiz entre [1,2].
  20. */
  21.  
  22.  
  23. #include <stdio.h>
  24. #include <math.h>
  25.  
  26. #define pi M_PI
  27.  
  28. #define eps 1e-5
  29.  
  30. double f(double x)
  31. {
  32.     return cos(x); // aqui a função a achar a raiz
  33. }
  34.  
  35. int main(void)
  36. {
  37.     double a=0, b=3, x, y; // a e b tal que f(a)<f(b) ou f(b)<f(a)
  38.  
  39.     while ((b-a)>eps)
  40.     {
  41.         x=(a+b)/2;
  42.         y=f(x);
  43.  
  44.         if (y>0)
  45.             a=x;
  46.  
  47.         else if (y<0)
  48.             b=x;
  49.  
  50.         else if (y==0)
  51.             break;
  52.     }
  53.  
  54.     printf("Raiz calculada: %e \n",x);
  55.  
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement