为什么我在Mathematica中拟合的非线性模型不能提供小的数字?

问题描述 投票:0回答:1
#dataset, sigmoidal curve
ratio278a267 ={{5.445, 0.0501}, {6.177, 0.035}, {7., 0.0589}, {7.368, 
  0.0953}, {7.73, 0.1419}, {8.169, 1.0697}, {9.141, 1.0869}, {10.3, 
  1.0981}} 

#nonlinearmodelfitting for dataset
fit = FindFit[ratio278a267, (1/(a + (E^(-b*(x - c))))), {a, b, c}, x]
fit2 = NonlinearModelFit[
   ratio278a267, (1/(a + (E^(-b*(x - c))))), {a, b, c}, x]["RSquared"]

#fit1 & fit2 output respectively
output:
{a -> 0.639719, b -> -250.201, c -> -1008.92}
0.

上面的代码是我在Mathematica中用于非线性拟合的代码,尽管我已经用覆盖在我的数据集上方的图形计算器对此进行了绘制,但输出并未提供相当小的数字,其中a的数字在0到10之间, b,c并获得合理的拟合度

wolfram-mathematica
1个回答
0
投票

使FindFit收敛于一个好的解决方案的一种方法是为其提供良好的初始值,尤其是当您的模型可能对某些值的值给出非常差的拟合时。

x=.;a=.;b=.;c=.;
ratio278a267 ={{5.445, 0.0501}, {6.177, 0.035}, {7., 0.0589}, {7.368,0.0953},
  {7.73, 0.1419}, {8.169, 1.0697}, {9.141, 1.0869}, {10.3,1.0981}};
fit = FindFit[ratio278a267, (1/(a+(E^(-b*(x-c))))), {{a,0.92}, {b,8.7}, {c,7.9}}, x]
Show[ListPlot[ratio278a267],Plot[(1/(a+(E^(-b*(x-c)))))/.fit,{x,5.445,10.3}]]

在这个例子中,我通过进行一万次蒙特卡洛试验来寻找那些初始值,这些试验寻找模型和数据点之间的最小平方误差之和,然后让FindFit收敛到它可以找到的最佳值上。

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