gpt4 book ai didi

matlab - 使用 lsqcurvefit 拟合

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:03 54 4
gpt4 key购买 nike

我想用洛伦兹函数拟合一些数据,但我发现当我使用不同数量级的参数时拟合会出现问题。

这是我的洛伦兹函数:

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

现在生成示例数据的脚本:

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

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

以及将洛伦兹拟合到样本数据的脚本:

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;

这只会改变最后一个参数(最小的,即振幅)。如果我将所有指数都排除在外,它会按预期工作。我假设要对选择进行一些微调,但我不知道如何做。任何想法如何做到这一点?

最佳答案

正如您所建议的,只要您的参数变化超过 28(!)个数量级,您就会遇到数值问题。例如,LSQCURVEFIT 将尝试估计适当的梯度步长,并且这些计算可能对数值稳定性敏感(取决于实际实现 - 请参阅 http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm 以了解所有这些操作的摘要)。

根据我的经验,您需要找到一种方法来规范化输入参数,使它们更具可比性。例如,您可以获取所有值的日志,然后在您的目标函数中对它们进行 exp()。

params = log([4.475e14;0.4e14;1.8e-14])

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

这可能会引入其他不稳定性,但它应该能让您入门。

关于matlab - 使用 lsqcurvefit 拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282864/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com