# Método da Bisseção

A função a seguir testa se uma função (fun) muda de sinal nos extremos do 
intervalo dado.

muda_de_sinal(fun, intervalo) :=  
    if signum(fun(intervalo[1])) # signum(fun(intervalo[2])) then 
        true 
    else 
        false$

Implementação do método da bisseção

comprimento(intervalo) := intervalo[2] - intervalo[1]$
meio(intervalo) := (intervalo[2] + intervalo[1])/2$

bissecao(fun, intervalo) :=
    if muda_de_sinal(fun, intervalo) then
        block( 
                I: intervalo,
                while comprimento(I) > 1.0e-5 do
                block(
                    c: meio(I), 
                    novo: [I[1], c],
                    if muda_de_sinal(fun, novo) then 
                        I: novo
                    else
                        I: [c, I[2]]
                ),
            meio(I)
        )
    else
        disp ("A função não muda de sinal no intervalo dado.")$

Vamos testar o método:

f(x) := x^2-x^4+5$
bissecao(f, [0,2]), float;