感谢您阅读我的问题。我尝试通过 custum 函数在 matlab 中拟合一组数据,该函数只不过是带有附加 $x^d$ 项的高斯分布。但是,遇到了错误。尽管我付出了很多努力,但还是无法解决这个问题。
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
。
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.
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
。这个问题还有什么进一步的建议或者标准答案吗?
对于您的伽玛分布模型
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]);