scipy python中的指数曲线拟合--参数没有意义

bcs8qyzn  于 2022-12-13  发布在  Python
关注(0)|答案(1)|浏览(178)

我正在python中使用scipy.curve_fit进行曲线拟合,拟合本身看起来很棒,但是生成的参数没有意义。
方程是(ax)^B + cx,但是使用参数python发现a = -c和b = 1,所以对于每个x值,整个方程都等于0。
这是情节和我的代码。(https://i.stack.imgur.com/fBfg7.png)](https://i.stack.imgur.com/fBfg7.png

# experimental data
xdata = cfu_u
ydata = OD_u

# x-values to plot for curve fit
min_cfu = 0.1
max_cfu = 9.1
x_vec = pow(10,np.arange(min_cfu,max_cfu,0.1))

# exponential function 
def func(x,a, b, c):
  return (a*x)**b + c*x 

# curve fit 
popt, pcov = curve_fit(func, xdata, ydata)

# plot experimental data and fitted curve
plt.plot(x_vec, func(x_vec, *popt), label = 'curve fit',color='slateblue',linewidth = 2.2)
plt.plot(cfu_u,OD_u,'-',label = 'experimental data',marker='.',markersize=8,color='deepskyblue',linewidth = 1.4)
plt.legend(loc='upper left',fontsize=12)
plt.ylabel("Y",fontsize=12)
plt.xlabel("X",fontsize=12)
plt.xscale("log")
plt.gcf().set_size_inches(7, 5)
plt.show()

print(popt)
[ 1.44930871e+03  1.00000000e+00 -1.44930871e+03]

如何找到实际参数?
下面是我使用的实际实验原始数据:https://pastebin.com/CR2BCJji

yhqotfr8

yhqotfr81#

选择的函数模型为:
y(x)=(ax)^B+cx
为了理解所遇到的困难,首先必须将函数的行为与X的最低值范围上的数据进行比较。

我们看到y(x)=0是考虑到分散性的大范围(至少60个十年)上的点的可接受拟合。它们是大多数实验点(27个点中的18个点)。仅当b=1导致y(x)=(a+c)x且a+c=0时,才从函数模型获得函数y(x)=0。乍一看,python似乎给予:B=1和c=-a。但是我们必须更仔细地看。
当然,函数y(x)=0对于较大X处的9个点是不方便的。
该图认为,整个点集的拟合是上述拟合的扩展,其中参数值不同于b=1和a+c=0,但并不远,以便继续对上述18个点进行良好拟合。
结论:python找到的参数的实际值肯定非常接近b=1,a接近1.44930871e+03,b接近-1.44930871e+03
python内部的演算当然是用16或18位数进行的,但显示只有9位数,这还不足以看出b可能不同于1,c可能不同于-a,这表明线索可能只是显示有足够位数的问题。
是的,python的拟合看起来很棒。这是数学观点上的一个很好的表现。但是物理意义是值得怀疑的,因为在整个范围内拟合所必需的数字太多了。

相关问题