1 回答

TA贡献1828条经验 获得超3个赞
您lmfit.Model用于定义独立参数的用途看起来不错。您没有做的是定义一组要在拟合中使用的参数。
你做:
model = Model(on_res,independent_vars=['omega_eff','thetas'])
model.set_param_hint('R2avg',value=5)
model.set_param_hint('k_ex',value=0.1)
model.set_param_hint('phi_ex',value=500)
但set_param_hint告诉模型如何制作参数,但它不制作参数。你必须明确地这样做。在我看来,这样做会更好
model = Model(on_res,independent_vars=['omega_eff','thetas'])
params = model.make_params(R2avg=5, k_ex=0.1, phi_ex=500)
部分原因是a)您需要一个Parameters对象才能使其适合工作,并且b)这些值实际上并不是模型的一部分(Parameter或约束表达式的边界可能是,但值很少是)。
然后为了拟合独立的 ( y) 数据,你想做
result = model.fit(data, params, thetas=thetas, omega_eff=omega_eff)
或者(如果您真的坚持不创建参数)您可以显式声明每个参数的起始值:
result = model.fit(data, R2avg=5, k_ex=0.1, phi_ex=500,
thetas=thetas, omega_eff=omega_eff)
但不是
result = model.fit(param1, param2, ..., thetas=thetas, omega_eff=omega_eff) # NO!
通常,首选显式使用参数对象。
看起来(但我不确定)这R1rho_vals是要拟合的数据,所以这意味着你想要这样做:
result = model.fit(R1rho_vals, params, thetas=thetas, omega_eff=omega_eff)
要包括不确定性(您的e),您可以这样做:
result = model.fit(R1rho_vals, params, weights=1.0/e,
thetas=thetas, omega_eff=omega_eff)
然后您可以打印和绘制结果:
print(result.fit_report())
plt.errorbar(x, R1rho_vals, yerr = e, fmt = ".k", markersize = 8, capsize = 3)
plt.plot(new_x, result.best_fit, label="Two sites fast exchange")
plt.show()
添加回答
举报