luizaspan icon

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

luizaspan | PRO | 09/24/15 11:52:33 PM UTC | 0 ⭐ | 830 👁️ | Never ⏰ | []
C |

2.1 KB

|

None

|

0 👍

/

0 👎

/*
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;
}

Comments