我正在使用Scipy将我的数据拟合到一个函数。该函数会给出2个参数的值,这里是a和b。我想使用bound参数来限制这些参数可以取的值,它们各自都有一定范围内可接受的值。
可接受的值:15 < a < 50 和 0.05 < b < 0.2
我想知道如何实现它们。官方文档仅展示了如何对1个参数进行设定。这个问题与 Python曲线拟合库允许我为参数分配边界类似。该问题也仅解决了1个参数的边界问题。
以下是我尝试过的:
def Ebfit(x,a,b):
Eb_mean = a*(0.0256/kt) # Eb at bake temperature
Eb_sigma = b*Eb_mean
Foursigma = 4*Eb_sigma
Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device)
dEb = Eb_a[1] - Eb_a[0]
pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma)
## Retention Time
DMom = np.zeros(len(x),float)
tau = (1/f0)*np.exp(Eb_a)
for bb in range(len(x)):
DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb))
return DMom
time = datafile['time'][0:501]
Moment = datafile['25Oe'][0:501]
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[(15,50),(0.05,0.2)])
我还尝试了以下变化,以查看括号是否是问题:
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[[15,50],[0.02,0.2]])
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=((15,50),(0.02,0.2)))
但是我对所有这些变化都得到同样的错误
值错误: 每个下限必须严格小于每个上限。
仅适用于单个界限,例如:
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[0,50])
非常感谢您的帮助。
谢谢!
curve_fit.bounds
文档的哪些部分不清楚,以至于您不明白如何操作?请注意,文档中提到的是“2- tuple数组”,因此您可能需要将内部列表更改为元组。 - user707650