%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ajuste no lineal en dos etapas: primero un metodo robusto y que da una solucion buena
%despues una regresion no lineal, que calcula derivadas y permite obtener los intervalos
%de confianza (incertezas) de los parametros de ajuste, a traves de la
%matriz de covarianza
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% cargo datos medidos
load '/Ruta/a/donde/tengo/mis/datos/NombreDelArchivo.txt'; % Aca se pone el archivo con los datos que queremos ajustar
x=NombreDelArchivo(100:700,1); % selecciono el rango de datos que quiero ajustar (por ejemplo solo la carga)
y1=NombreDelArchivo(100:700,2); % selecciono el mismo rango que en X

%% rutina inicial con fminsearch:

%semilla inicial
c0=[2 3.5 0.001]; % aca poner valores iniciales estimados para cada parametro que se quiere ajustar
z=y1;
%FuncionAjuste.m define el modelo propuesto para el ajuste de los datos "x"
%tomando como parámetros iniciales los definidos en c0
s=feval('FuncionAjuste',c0,x); 
TOLF=1e-8; %tolerancia
%busqueda de minimos y luego vuelve a evaluar la funcion con nuevos
%parametros iniciales c que viene de fminsearch sobre la relacion z(x)
[c,fval,exitflag]=fminsearch('estimador',c0,optimset('TolFun',TOLF,'TolX',1e-9),z,x)
s=feval('FuncionAjuste',c,x);
figure(3),plot(x,z,'o',x,s,'-r','Linewidth',2),grid %Grafico el resultado del 1er ajuste


%% rutina posterior, con ajuste no lineal, calcula gradientes (nlinfit)

%la semilla inicial de este metodo es la solucion del metodo anterior (c)
b0=c;

%mod_nlinfit es una modificacion de nlinfit que deja fijo el parametro
%cuyo estado en el vector inicial es TRUE (mejora sustancial del metodo de
%ajuste)
[be,err]=mod_nlinfit([false false false],x,z,@FuncionAjuste,b0,...
    statset('TolFun',1e-6,'TolX',1e-12));

s=feval('FuncionAjuste',be,x);
figure(4),plot(x,z,'o',x,s,'-r','Linewidth',2),grid,title('nlinfit')%Grafico el 2do resultado

%los tres parametros ajustados y sus incertezas, o tolerancias
%esto se escribe en el terminal para que podamos observar los resultados
out=[be' err']

