function [ A, sA, Q2, NGL, VA, F, Niter ] = mmq_naolin( FUNCAO, Y, V, Achute )
%  [ A, sA, Q2, NGL, VA, F, Niter ] = mmq_naolin( FUNCAO, Y, V, Achute );


Y = Y(:);
Ndados = length( Y );
Nparam = length( Achute );
convergiu = 0;
MaxIter = 20;

if min(size(V))==1
    % ajuste com V = incerteza
    iV = diag( V.^2 ) \ eye( length(V) );
else
    % ajuste com matriz de covariância completa
    iV = V \ eye(Ndados);
end


Niter = 0;
A = Achute;
F = feval( FUNCAO, A );
Q2 = (Y-F)' * iV * (Y-F);
while( convergiu == 0 && Niter<MaxIter )
    Niter = Niter + 1;
    X = mmq_montaX( FUNCAO, A );
    VA =  ( X' * iV * X ) \ eye(Nparam);
    sA = sqrt( diag(VA) );
    dA = VA * X' * iV * (Y-F);
    Fnew = feval( FUNCAO, A+dA );
    Q2new = (Y-Fnew)' * iV * (Y-Fnew);
    if abs(Q2new-Q2)<1e-5*(Q2)  && sum(abs(dA)./sA)<1e-2
        convergiu = 1;
    end        
    A = A + dA;
    F = Fnew;
    Q2 = Q2new;
end
NGL = Ndados - Nparam;
if convergiu==0, warning( 'Ajuste não convergiu' ), end
