Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- O MÉTODO EXPLICADO:
- 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.
- "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."
- CONVERGÊNCIA E ERRO:
- 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á
- |c*- c^1| = (a + b)/2
- 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:
- |c*- c^n| = (a + b)/2^n
- Se \epsilon_n for o erro absoluto, então:
- \epsilon _{n+1} = \epsilon _n /2
- e, portanto, dizemos que o método da bisseção tem convergência linear.
- 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.
- n = \log_2\left(\frac{\epsilon_0}{\epsilon}\right)
- Sendo \epsilon_0 o tamanho inicial do intervalo, portanto, \epsilon_0=b - a
- MÉTODO:
- 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].
- */
- #include <stdio.h>
- #include <math.h>
- #define pi M_PI
- #define eps 1e-5
- double f(double x)
- {
- return cos(x); // aqui a função a achar a raiz
- }
- int main(void)
- {
- double a=0, b=3, x, y; // a e b tal que f(a)<f(b) ou f(b)<f(a)
- while ((b-a)>eps)
- {
- x=(a+b)/2;
- y=f(x);
- if (y>0)
- a=x;
- else if (y<0)
- b=x;
- else if (y==0)
- break;
- }
- printf("Raiz calculada: %e \n",x);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement