如何使用 lmfit 修复此拟合例程(2 个自变量)?

肖恩马里昂的粉丝

我目前正在尝试使用 实现曲线拟合例程lmfit,尽管我的编码技能有限,而且我以前的经验curve_fit也无济于事。另外,我一直在浏览https://lmfit.github.io/lmfit-py/model.html上的文档,但我仍然无法修复它。

正如您在下面看到的,我正在尝试拟合以下等式:R2avg*(np.sin(thetas))**2 + ((np.sin(thetas))**2)*(phi_ex*k_ex/(k_ex**2 + omega_eff**2)),它有 2 个自变量(omega_effthetas),而我想拟合其余三个参数。

import lmfit as lf
from lmfit import Model, Parameters
import numpy as np
import matplotlib.pyplot as plt
from math import atan

def on_res(omega_eff, thetas, R2avg=5, k_ex=0.1, phi_ex=500):
    return R2avg*(np.sin(thetas))**2 + ((np.sin(thetas))**2)*(phi_ex*k_ex/(k_ex**2 + omega_eff**2))

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)

carrier = 6146.53
O_1 = 5846
spin_locks = (1000, 2000, 3000, 4000, 5000) 
delta_omega = (O_1 - carrier)

omega_eff1 = ((delta_omega**2) + (spin_locks[0]**2))**0.5
omega_eff2 = ((delta_omega**2) + (spin_locks[1]**2))**0.5
omega_eff3 = ((delta_omega**2) + (spin_locks[2]**2))**0.5
omega_eff4 = ((delta_omega**2) + (spin_locks[3]**2))**0.5
omega_eff5 = ((delta_omega**2) + (spin_locks[4]**2))**0.5

theta_rad1 = atan(spin_locks[0]/delta_omega)
theta_rad2 = atan(spin_locks[1]/delta_omega)
theta_rad3 = atan(spin_locks[2]/delta_omega)
theta_rad4 = atan(spin_locks[3]/delta_omega)
theta_rad5 = atan(spin_locks[4]/delta_omega)

x = (omega_eff1/1000, omega_eff2/1000, omega_eff3/1000, omega_eff4/1000, omega_eff5/1000)# , omega_eff6/1000)# , omega_eff7/1000)
theta = (theta_rad1, theta_rad2, theta_rad3, theta_rad4, theta_rad5)
R1rho_vals = (7.9328, 6.2642, 6.0005, 5.9972, 6.1988)
e = (0.33, 0.31, 0.32, 0.33, 0.5)

new_x = np.linspace(0, 6, 1000)
omega_eff = np.array(x, dtype=float)
thetas = np.array(theta, dtype=float)
R1rho_vals = np.array(R1rho_vals, dtype=float)

result = model.fit(R2avg, k_ex, phi_ex, thetas=thetas, omega_eff=omega_eff)

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()
print(model.param_names)
print(model.independent_vars)

如果我在发布时运行脚本,我会得到:

result = model.fit(R2avg, k_ex, phi_ex, thetas=thetas, omega_eff=omega_eff)
NameError: name 'R2avg' is not defined

我真的不明白。我做了一些故障排除,并通过检查:

print(model.param_names)print(model.independent_vars)

似乎一切都被适当地定义了。

非常欢迎任何帮助!

M纽维尔

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) 这些值实际上并不是您模型的一部分(参数或约束表达式的边界可能是,但值很少是)。

然后去拟合独立的 ( 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!

通常,显式使用 Parameters 对象是首选。

看来(但我不确定)这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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python - 使用 lmfit 拟合函数

来自分类Dev

如何使用三个自变量拟合线性回归模型并使用sklearn计算均方误差?

来自分类Dev

使用lmfit python进行曲线拟合

来自分类Dev

具有lmfit的两个独立变量的非线性最小二乘拟合

来自分类Dev

如何将自变量中的值使用到另一个自变量Django Views

来自分类Dev

Python lmfit:拟合2D模型

来自分类Dev

Python lmfit:拟合2D模型

来自分类Dev

如何基于另一个参数将lmfit参数绑定为param1 <0.5 * param2

来自分类Dev

如何确定一个VI的自变量编号顺序?

来自分类Dev

tibble()的函数自变量相对于第一个自变量中的向量如何操作?

来自分类Dev

在python lmfit中设置包含自变量的参数表达式

来自分类Dev

此过滤代码如何使用函数自变量来填补给定计算中的空白?

来自分类Dev

将数据拟合到高斯轮廓时如何在 lmfit 中包含误差线?

来自分类Dev

lmfit 拟合后提取拟合统计参数

来自分类Dev

由于数据值看起来太小,无法使用lmfit进行高斯拟合

来自分类Dev

使用lmfit拟合曲线时为参数设置初始值

来自分类Dev

通过仅更改mutate()中的一个自变量来拟合多个回归模型

来自分类Dev

如何获得一个bash脚本自变量从头开始给出的位置?

来自分类Dev

使用facet_grid()在两个自变量的y轴上设置限制

来自分类Dev

使用两个自变量计算 numpy 数据的最有效方法

来自分类Dev

Python lmfit-如何计算R平方?

来自分类Dev

Python lmfit-如何计算R平方?

来自分类Dev

如何从lmfit模型中抽取样本?

来自分类Dev

尝试使用lmfit拟合时,获取错误“ /:'list'和'float''不支持的操作数类型”

来自分类Dev

使用 lmfit 最小化在 3D 点数据集上拟合 3D 线

来自分类Dev

如何使用两个数据帧(一个用于因变量,另一个用于自变量)为glm制作双循环?

来自分类Dev

RSpec如何检查一个自变量对象是否具有一个值?

来自分类Dev

lmfit:如何通过在 LMFIT 中的其他参数之间限定参数来为参数添加约束?

来自分类Dev

在Eigen 2库中使用linearRegression时模板自变量推导/替换失败

Related 相关文章

  1. 1

    Python - 使用 lmfit 拟合函数

  2. 2

    如何使用三个自变量拟合线性回归模型并使用sklearn计算均方误差?

  3. 3

    使用lmfit python进行曲线拟合

  4. 4

    具有lmfit的两个独立变量的非线性最小二乘拟合

  5. 5

    如何将自变量中的值使用到另一个自变量Django Views

  6. 6

    Python lmfit:拟合2D模型

  7. 7

    Python lmfit:拟合2D模型

  8. 8

    如何基于另一个参数将lmfit参数绑定为param1 <0.5 * param2

  9. 9

    如何确定一个VI的自变量编号顺序?

  10. 10

    tibble()的函数自变量相对于第一个自变量中的向量如何操作?

  11. 11

    在python lmfit中设置包含自变量的参数表达式

  12. 12

    此过滤代码如何使用函数自变量来填补给定计算中的空白?

  13. 13

    将数据拟合到高斯轮廓时如何在 lmfit 中包含误差线?

  14. 14

    lmfit 拟合后提取拟合统计参数

  15. 15

    由于数据值看起来太小,无法使用lmfit进行高斯拟合

  16. 16

    使用lmfit拟合曲线时为参数设置初始值

  17. 17

    通过仅更改mutate()中的一个自变量来拟合多个回归模型

  18. 18

    如何获得一个bash脚本自变量从头开始给出的位置?

  19. 19

    使用facet_grid()在两个自变量的y轴上设置限制

  20. 20

    使用两个自变量计算 numpy 数据的最有效方法

  21. 21

    Python lmfit-如何计算R平方?

  22. 22

    Python lmfit-如何计算R平方?

  23. 23

    如何从lmfit模型中抽取样本?

  24. 24

    尝试使用lmfit拟合时,获取错误“ /:'list'和'float''不支持的操作数类型”

  25. 25

    使用 lmfit 最小化在 3D 点数据集上拟合 3D 线

  26. 26

    如何使用两个数据帧(一个用于因变量,另一个用于自变量)为glm制作双循环?

  27. 27

    RSpec如何检查一个自变量对象是否具有一个值?

  28. 28

    lmfit:如何通过在 LMFIT 中的其他参数之间限定参数来为参数添加约束?

  29. 29

    在Eigen 2库中使用linearRegression时模板自变量推导/替换失败

热门标签

归档