对于一个相当基本的问题,我很抱歉,但是我很难理解lmfit的语法,并且无法想出为什么会出现这个错误。具体而言,错误是:
"KeyError:‘通量’“
我知道它需要某种类型的字典对象,但仍然看不到与我的代码和lmfit文档不一致的地方。
我创建了一个函数,作为某个发行版的模型。我想使用这个模型来适应实际的数据分布。这个分布是被绑定的数据,因此,我得到了中点的回收箱作为x轴数据点使用。
def flemming(flux,alpha,fhalf):
a = alpha*np.log10(flux/fhalf)
b = np.sqrt(1+a**2)
return (1/2)*(1+(a/b))
def f20func(flux,alpha,fhalf):
return flemming(flux,alpha,fhalf) - 0.2
def modified(flux,alpha,fhalf):
flem = flemming(flux,alpha,fhalf)
f20 = fsolve(f20func,fhalf/2,args=(alpha,fhalf))
tau = 1 - np.exp(-flux/f20)
return flem**(1/tau)
def powerlaw(flux,beta,c):
return c*flux**(-beta)
def distribution(flux,alpha,fhalf,beta,c):
return powerlaw(flux,beta,c)*modified(flux,alpha,fhalf)
n_bins = 40
y_data, bin_edges, patches = plt.hist(flux,bins=n_bins,ec='black')
i = 0
midpoints = []
while i < len(bin_edges)-1:
midpoints.append((bin_edges[i+1]+bin_edges[i])/2)
i+=1
model = Model(distribution)
aegis_params = model.make_params()
aegis_params['alpha'].set(value=3.4,min=3.0,max=3.8)
aegis_params['fhalf'].set(value=3.9,min=3.5,max=4.4)
aegis_params['beta'].set(value=3.5,min=3.2,max=3.8)
aegis_params['c'].set(value=45000.0,min=0.0)
best_fit = model.fit(y_data,params=aegis_params,x=midpoints)发布于 2020-07-16 01:14:08
我认为你看到的问题是因为你使用了:
best_fit = model.fit(y_data,params=aegis_params,x=midpoints)但是您的模型函数( distribution())没有定义x,而是有一个名为flux的自变量。我猜你想
best_fit = model.fit(y_data, params=aegis_params, flux=midpoints)默认情况下,模型函数的第一个参数将被视为自变量,所有其他位置参数和那些带有数字默认值的关键字参数都将被转换为参数。
为了明确起见,您可以有多个独立变量,它们可以位于第一个参数以外的位置,并且名称x一点也不特殊。另外:自变量传递到您的模型函数,而不需要强制或检查数据类型,因此可以是复杂的对象或数据结构。
https://stackoverflow.com/questions/62925034
复制相似问题