function [z,fz,niter]=fsolve_b(x0,x1,%fun,tol,Nit)
///////////////////////////
// Método da bissecção   //
///////////////////////////

// Variáveis de entrada

// x0       -> extremidade inferior.
// x1       -> extremidade superior.
// %fun     -> função.
// tol      -> tolerância na diferença relativa entre duas aproximações sucessivas.
// Nit      -> número máximo de iteradas.

// Variáveis de saída

// z        -> solução aroximada.
// fz       -> valor de %fun em z.
// niter    -> número de iteradas.

// Variáveis auxiliares

// f0       -> valor da função e em x0.
// f1       -> valor da função e em x1.
// contador -> conta o número da vezes que o laço principal é executado.
// segue    -> variável booliana que controla a parada.
// cr_conv  -> variável booliana. É igual a %T se ocorrer convergência.
// xm       -> ponto intermediário.
// fm       -> valor da função f em x=xm.

// Inicialização das variáveis

f0       = %fun(x0)
f1       = %fun(x1)
cr_conv  = %F
contador = 0

// Caso não tenha sido definida na chamada da função, a 
// tolerância recebe o valor 1e-10.

if ~isdef('tol','local') then
    tol=1e-10
end

// Caso não tenha sido definida na chamada da função, a 
// Nit recebe o valor 100.

if ~isdef('Nit','local') then
    Nit=100
end

// Checagem inicial

segue = (f0*f1<0)
if ~segue then
// mensagem de aviso: não foi possível utilizar o método.
    error('Não foi possível utilizar o método, cheque os dados de entrada.',42)
end

// Laço principal

while segue
  xm=0.5*(x0+x1)
  fm=%fun(xm)

  // Escolha das novas extremidades
  if fm*f0<0 then 
    x1=xm
    f1=fm
  else         
    x0=xm
    f0=fm
  end
  
  contador=contador+1
  
  // Teste da convergência
  cr_conv=(fm==0|abs(x1-x0)<=tol*abs(xm))
  
  // Teste para o prosseguimento do laço
  segue=~(cr_conv|contador==Nit)
end

// Saída de dados

// mensagem de aviso: tolerância não satisfeita.
if (contador==Nit)&(~cr_conv) then 
    warning(msprintf('A tolerância não foi satisfeita em %d iteracoes.',Nit))
end

z=xm
fz=fm
niter=contador

endfunction