无法在 matlab 中拟合自定义函数

问题描述 投票:0回答:1

感谢您阅读我的问题。我尝试通过 custum 函数在 matlab 中拟合一组数据,该函数只不过是带有附加 $x^d$ 项的高斯分布。但是,遇到了错误。尽管我付出了很多努力,但还是无法解决这个问题。

  • 一开始,我拟合了以下数据“data_x”:
0   0.0500000000000000  0.100000000000000   0.150000000000000   0.200000000000000   0.250000000000000   0.300000000000000   0.350000000000000   0.400000000000000   0.450000000000000   0.500000000000000   0.550000000000000   0.600000000000000   0.650000000000000   0.700000000000000   0.750000000000000   0.800000000000000   0.850000000000000   0.900000000000000   0.950000000000000   1   1.05000000000000    1.10000000000000    1.15000000000000    1.20000000000000    1.25000000000000    1.30000000000000    1.35000000000000    1.40000000000000    1.45000000000000

和“data_y”:

4.82569292042591    6.15748191498009    4.31807282776559    2.46795497033244    1.17871657319353    0.518857189303422   0.242237665610014   0.121149313175648   0.0619970738844184  0.0346663415427132  0.0237950093473137  0.0164594001463058  0.00944891489880517 0.00268227261643502 0.00288547508737706 0.00247907014549297 0.00195074372104365 0.00213362594489149 0.00174754125010160 0.00168658050881899 0.00140209704950012 0.00138177680240592 0.00146305779078274 0.00125985531984069 0.00111761359018126 0.00123953507274648 4.06404941884093e-05    0   0   0

通过高斯分布。我的代码如下:

fit_result = fit(data_x, data_y, 'gauss1');

没问题,拟合系数是

a1=5.79, b1=0.04453, c1=0.1165

  • 然后,我尝试使用自定义函数来拟合数据,该函数是包含 $x^d$ 项的广义伽玛分布。我使用了以下代码:
gamma_distribution = @(a, d, b, c, x) a * x.^d .* exp(-((x-b)/c).^2);
fit_result = fit(data_x, data_y, gamma_distribution);

但是,我遇到了一个错误:

Error using fit>iFit (line 340)
Inf computed by model function, fitting cannot continue.
Try using or tightening upper and lower bounds on coefficients.
  • 在Google上搜索后,我发现了一些建议。对下限和上限添加约束似乎是合理的。更新后的代码如下:
gamma_distribution = @(a, d, b, c, x) a * x.^d .* exp(-((x-b)/c).^2);
fit_result = fit(data_x, data_y, gamma_distribution, 'Lower', [-10, -10, -10, -10], 'Upper', [10, 10, 10, 10]);

但是,并没有解决错误。

  • 然后,有人建议我添加初始条件。所以我改进了我的代码如下:
gamma_distribution = @(a, d, b, c, x) a * x.^d .* exp(-((x-b)/c).^2);
fit_result = fit(data_x, data_y, gamma_distribution, 'Start', [5.79, 0, 0.04453, 0.1165], 'Lower', [-10, -10, -10, -10], 'Upper', [10, 10, 10, 10]);

请注意,所有初始值均选择高斯拟合结果中的初始值,并且外部参数

d
设置为
0
。这种方法奏效了,但结果并不令人满意。它只给所有参数相同的值,尤其是
d=0
。这个问题还有什么进一步的建议或者标准答案吗?

matlab curve-fitting numerical-methods
1个回答
0
投票

对于您的伽玛分布模型

gamma_distribution = @(a, d, b, c, x) a * x.^d .* exp(-((x-b)/c).^2);
d 应大于或等于零。 使用零作为 d 的下界应该可以解决您的问题。 (抱歉,我没有可用的 MATLAB)。

如果这不起作用,您应该收紧 b 和 a 的上限和下限。从您的 x 和 y 数据中,我们可以看到 a 应大于 0 且小于最大 x 数据,b 也应大于 0 且小于 y 的范围。

以下收紧界限应该可以解决您的问题

fit_result = fit(data_x, data_y, gamma_distribution, 'Start', [5.79, 0, 0.04453, 0.1165], 'Lower', [0, 0, 0, 0], 'Upper', [7, 10, 1.45, 10]);

© www.soinside.com 2019 - 2024. All rights reserved.