ajuste usando lsqcurvefit

Eu quero encaixar alguns dados em uma função lorentz, mas eu acho que há problemas em ajustar quando eu uso parâmetros que são de diferentes ordens de grandeza.

Esta minha função lorentz:

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

Agora o script para gerar dados de amostra:

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

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

E o script para ajustar lorentz aos dados de amostra:

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;

Isso só varia o último parâmetro (o menor, que é a amplitude). Se eu deixar todos os exponenciais fora, isso funciona como esperado. Eu suponho que há alguma otimização das opções a serem feitas, mas não sei como. Alguma idéia de como fazer isso?