I'我在scipy.optimize.curve_filt和获取RuntimeWarning方面遇到问题:在do



我正在尝试使用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 的文档中找到

最新更新