encaja usando lsqcurvefit

Quiero ajustar algunos datos a una función de lorentz pero imagino problemas con la adaptación cuando uso parámetros que tienen diferentes órdenes de magnitud.

Esta es mi función lorentz:

function [ value ] = lorentz( x,x0,gamma,amp )
    value = amp * gamma^2 ./ ((x-x0).^2 + gamma^2);
end

Ahora el script para generar datos de muestra:

x = linspace(2e14,6e14,200);
x0 = 4.525e14;
gamma = 0.5e14;
amp = 2e-14;

y = lorentz(x,x0,gamma,amp);

Y el script para ajustar lorentz a los datos de muestra:

params = [4.475e14;0.4e14;1.8e-14];
opts = optimset('TolFun',1e-60,'TolX',1e-50,'Display','Iter');
fitfunc = @(params,x) lorentz(x,params(1),params(2),params(3));
fitparams = lsqcurvefit(fitfunc,params,x,y,[],[],opts)

figure(1);hold on;
plot(x,y,'.');
plot(x,lorentz(x,params(1),params(2),params(3)),'--');
plot(x,lorentz(x,fitparams(1),fitparams(2),fitparams(3)));
hold off;

Esto solo varía el último parámetro (el más pequeño, que es la amplitud). Si dejo todas las exponenciales fuera, funciona como se espera. Supongo que hay que hacer algunos ajustes a las opciones, pero no sé cómo. ¿Alguna idea de como hacer esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta