我正在尝试使用scipy.optimize.curve_filt将曲线拟合到数组中。这是我的代码:
def foubert(t,K,n):
return (1+((1-0.0620281576)**(1-n)-1)*np.exp(-(1-n)*K*(t-3)))**(1/(1-n))
foub_params, _ = scipy.optimize.curve_fit(foubert,phi[:,0],phi[:,1])
K_f,n_f = foub_params
通过使用参数,我得到的最接近曲线的值约为K=0.06和n=2.5,但我的代码一直将n返回为~1,并给我一个运行时警告,因为方程中有一个1/(1-n(项。既然n显然不是1,我该如何解决这个问题?
这是错误消息:
RuntimeWarning: divide by zero encountered in double_scalars
return (1+((1-0.0620281576)**(1-n)-1)*np.exp(-(1-n)*K*(t-3)))**(1/(1-n))
使用curve_fit
时,如果不提供初始起点(p0
(,则使用[1, 1]
。由于您在n=1
除以零,因此必须提供初始估计。
如果你知道n > 1
(我怀疑它可能来自方程的形式(,那么你也可以定义bounds
。
例如,使用K=1, n=2
作为起点,并要求n>1
:
foub_params, _ = curve_fit(foubert, phi[:,0],phi[:,1], p0=[1, 2], bounds=[(-np.inf, 1.0), (np.inf, np.inf)])
更多详细信息可在curve_fit 的文档中找到