function [z,fz,niter]=fsolve_s(x0,x1,%fun,tol,Nit)// Método da Secante
///////////////////////////
// Método da secante     //
///////////////////////////

// Variáveis de entrada

// x0       -> primeira aproximação.
// x1       -> segunda aproximação.
// %fun     -> função
// tol      -> tolerância na diferença relativa entre duas aproximações 
// sucessivas.
// Nit     -> limite superior para o número de iteradas.

// Variáveis de saída

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

// Variáveis auxiliares

// f0       -> valor da função f em x0.
// f1       -> valor da função f em x1.
// x2       -> aproximação na iterada seguinte.
// contador -> guarda o número de iteradas realizadas.
// segue    -> variável booliana. Controla o fluxo de execução das iteradas.
// cr_conv  -> variável booliana. É igual a %T se ocorrer convergência.

// Inicialização das variáveis

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

// 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, Nit recebe o valor 100.

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

// Checagem inicial

segue=(x0<>x1)&(f0<>f1)
if ~segue then
    warning('A aproximação não pôde ser obtida.')
    warning('Verifique as aproximações iniciais ou o condicionamento.')
end

// Laço principal

while segue
    contador = contador + 1
    x2 = x1 - (x1-x0)/(f1-f0) * f1
    
    x0      = x1
    f0      = f1
    x1      = x2
    f1      = %fun(x2)
    cr_conv = abs(x1-x0)<=tol*abs(x1)|f1==0
    segue   = ~(cr_conv|f0==f1|contador==Nit)
end

// Saída de dados

// mensagem de aviso

if (f0==f1)&(~cr_conv) then
    warning('Divisão por zero. Verifique o condicionamento.')
end

if (contador==Nit)&(~cr_conv) then 
  warning(msprintf('\nA tolerância não foi alcançada em %d iterações.\n',Nit))
end

z     = x1
fz    = f1
niter = contador

endfunction