Algoritmo da Bisseção

Publicado por Rafael Henrique da Silva Correia 02/05/2008

[ Hits: 17.835 ]

Homepage: http://abraseucodigo.com.br

Download bissecao.c




Quer encontrar 0 em funções reais? Aí vai o primeiro algoritmo, lembrando que o algoritmo da bisseção de acordo com os matemáticos é o menos eficaz para se achar 0 de funções devido ao número de iterações que ele executa.

OBS: este código ainda não pega sua função, você tem que inserí-la manualmente no código. Neste código exemplo calculo a função F(x) = x^3 - 9*x + 3.

  



Esconder código-fonte

#include <stdio.h>
#include <stdlib.h>

int main(){
    float a = 0., b = 0., E = 0., M = 0., Fa = 0., Fb = 0., Fm = 0.;
    int k = 0;

    printf( "Digite valor de A:" );
    scanf( "%f", &a );
    printf( "Digite valor de B:" );
    scanf( "%f", &b );
    printf( "Digite valor de E:" );
    scanf( "%f", &E );

    printf("\n");

    do{
        M = ( a + b ) / 2.;
        Fa = ( a*a*a ) - (9. * a) + 3.; //insira a sua função aqui para calcular F(a)
         Fm = ( M*M*M ) - (9. * M) + 3.; //insira a sua função aqui para calcular F(M)
        Fb = ( b*b*b ) - (9. * b) + 3.; //insira a sua função aqui para calcular F(b)
        if ( Fa * Fm < 0 )
           b = M;
        else
           a = M;
       k += 1;
       printf( "iteracao = %d\n", k );
       printf( "A = %f\nB = %f\n", a, b );
    } while( b - a >= E || Fa >= E || Fb >= E);
    //se for verdade ele continua o laço

    printf("\nb - a = %f\n", b - a);
    printf( "A solucao final eh: %f\n", ( a + b ) / 2. );
    return 0;
}

Scripts recomendados

Aritmética de ponteiros (gcc)

Controle de maior idade em C++

Photon Mapper

Métodos de Ordenação - Radix Sort

merge sort


  

Comentários
[1] Comentário enviado por HelioCampos em 02/05/2008 - 07:56h

Dependendo da função que a pessoa colocar, o valor de float estoura antes de vc conseguir achar o ponto pois vc colocou seu E (Epsilon) igual a 0. O algoritmo serve apenas para funções MUITO bem comportadas ( sem muitos graus de liberdade ) e, mesmo assim, pode não dar certo.

[2] Comentário enviado por rafaelhenrique em 02/05/2008 - 11:20h

Nesta função novamente HelioCampos, eu não defini E constantemente como 0, mas sim inicializei E como 0 pois, como diz Deitel, quando se inicializa uma variável quando se declara, o programa se torna mais rápido e mais livre de erros de stacks overflow, o E na verdade vai ser digitado pelo usuário, portanto E não será 0, será o valor que o usuário digitar depois que E for declarado.

Obrigado mais uma vez pelos comentários

[3] Comentário enviado por g_s.lima em 04/05/2010 - 18:13h

Eu sugiro que você utilize um epsilon cte de acordo com o tipo de dado que você utilizar. No caso do float, temos precisão simples. De uma estudada na biblioteca float.c.

Abraço

[4] Comentário enviado por manolosk em 09/09/2013 - 16:55h

Galera vou ressuscitar o topico.. Rafael vc poderia me ajudar mudando o código? è bem simples.. faço engenharia mas não manjo de programação, e um dos trabalhos que tenho que é fazer um programa para calcular a bisseção.
A função que vc usou foi F(x) = x^3 - 9*x + 3.
A minha esta na imagem anexada...
E também o programa deve perguntar quantas iterações será realizada.
Voce pode me ajudar? Vai quebrar um galhão!
Te mandie msg no face mas vc nao viu heheh.

https://dl.dropboxusercontent.com/u/67616195/bissecao.jpg

[5] Comentário enviado por leandro21 em 01/09/2016 - 13:08h

sou estudante de engenharia e gostaria da ajuda de vocês para adicionar essa função ao código c -4x^4-3x^3+9x^2-8


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts