Implementando o método da Bisseção

6 respostas
R

Não encontro o erro no meu método da bisseção, so sei que está dando um resultado errado e ele não esta encontrando a raiz. Se alguem poder ajudar o código está logo abaixo

float condErro;

int iter;

float raiz;

float tolerancia;

float deltaX;

float x = 0;

float fa, fb, fx = 0;

float a, b, c;

int iterMax;
a = Integer.valueOf(JOptionPane.showInputDialog("Informe o valor de A"));
    b = Integer.valueOf(JOptionPane.showInputDialog("Informe o valor de B"));
    tolerancia = Float.valueOf(JOptionPane.showInputDialog("Informe o valor da tolerância"));
    iterMax = Integer.valueOf(JOptionPane.showInputDialog("Informe a quantidade máxma de iterações"));

    
    fa = funcao_da_Bissecao(a);
    fb = funcao_da_Bissecao(b);

    if(fa*fb>0){
        System.out.println("Função não muda de sinal nos extremos do intervalo dado");
    }
    
    deltaX = (b-a)/2;
    iter = 0;

   while(tolerancia > (b-a)){
        
        x = (a+b)/2;
        fx = funcao_da_Bissecao(x);
        
        if(deltaX <= tolerancia && Math.abs(fx) <= tolerancia || iter >= iterMax){
            break;
        }
        
        if(fa*fb > 0){
            a = x;
            fa = fx;
        }else{
            b = x;
            fb = fx;
        }
        
        deltaX = deltaX/2;
        iter++;
        
    }
    
    raiz = x;
    
    //Teste de convergência
    if (deltaX <= tolerancia && Math.abs(fx) <= tolerancia) {
        condErro = 0;
    }else{
        condErro = 1;
    }
    
    System.out.println("Rais: " + raiz);
    System.out.println("Iterações: " + iter);
    System.out.println("Condição do erro: " + condErro);

}

public static float funcao_da_Bissecao(float x) {
    return (float)((0.05 * Math.pow(x, 3)) + (-0.4 * Math.pow(x, 2)) + (3*x * Math.sin(x)));
}

6 Respostas

criador

Cara, tenho um exemplo disso que fiz a uns 3 anos atrás.

Não sei se é a melhor forma de fazer, mas está funcionando.

Abraço!

R

criador:
Cara, tenho um exemplo disso que fiz a uns 3 anos atrás.

Não sei se é a melhor forma de fazer, mas está funcionando.

Abraço!

Assim ele funciona, mas por exemplo as entradas de A e B seriam 10 e 12, tolerancia = 0.05 e iterMax = 15. Deveria aparecer no final:

Raiz =11.74390
Iter = 12
CondErro =0

E

É realmente essa equação que lhe passaram para resolver?

0.05 x^3 - 0.4 x^2 + 3 x sin x = 0

Ela é péssima para resolver usando o método da bissecção.

Como você deve ver, a raiz dela é zero, mas justamente a curva tem um mínimo na raiz. O método de bisecção só funcionaria corretamente se você passar para A e para B um valor positivo e outro negativo (por exemplo, -1 e +1).

E

Podia postar exatamente qual é a equação a ser resolvida?

criador

A equação utilizada no código foi x^3-9*x+3.

Abraço!

E

Desculpe, eu estava perguntando pro rafaetur

De qualquer forma, a equação que foi usada para testar o método de bissecção é bem comportada:

Criado 3 de abril de 2012
Ultima resposta 4 de abr. de 2012
Respostas 6
Participantes 3