Python 拟合曲线的显示问题:无法解决粗糙度

Python 拟合曲线的显示问题:无法解决粗糙度,python,matplotlib,curve-fitting,lmfit,Python,Matplotlib,Curve Fitting,Lmfit,尽管有一个使用lmfit库进行曲线拟合的工作脚本,但我无法解决显示问题。实际上,由于只有5个相关值,因此生成的图相当粗糙 在切换到lmfit之前,我使用的是curve\u fit,只需使用np.linspace即可解决显示问题,并绘制拟合过程产生的优化值。然后,我通过plt.errorbar显示“真实”值。使用lmfit,上述解决方案会产生不匹配错误,因为它会识别“伪”自变量并启动不匹配类型错误 我的完整脚本如下: import lmfit as lf from lmfit import Mod

尽管有一个使用
lmfit
库进行曲线拟合的工作脚本,但我无法解决显示问题。实际上,由于只有5个相关值,因此生成的图相当粗糙

在切换到
lmfit
之前,我使用的是
curve\u fit
,只需使用
np.linspace
即可解决显示问题,并绘制拟合过程产生的优化值。然后,我通过
plt.errorbar
显示“真实”值。使用
lmfit
,上述解决方案会产生不匹配错误,因为它会识别“伪”自变量并启动不匹配类型错误

我的完整脚本如下:

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'])
params = model.make_params(R2avg=5, k_ex=0.01, phi_ex=1500)


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, 5.988)
e = (0.2, 0.2, 0.2, 0.2, 0.2)

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)
error = np.array(e, dtype=float)
R2avg = []
k_ex = []
phi_ex = []

result = model.fit(R1rho_vals, params, weights=1/error, thetas=thetas, omega_eff=omega_eff, method = "emcee", steps = 1000)

print(result.fit_report())

plt.errorbar(x, R1rho_vals, yerr = error, fmt = ".k", markersize = 8, capsize = 3)
plt.plot(new_x, result.best_fit)
plt.show()
正如您在运行它时看到的,它会启动不匹配形状错误消息。将
plt.plot
行更改为
plt.plot(x,result.best_fit)
可正确生成图形,但显示非常粗糙的轮廓(如人们所料,x轴上只有5个点)


你知道有什么办法可以解决这个问题吗?查看文档时,我注意到提供的示例都通过实际自变量值绘制结果,因为它们有足够的实验值。

您需要使用自变量的新值重新评估ModelResult:

plt.plot(new_x, result.eval(omega_eff=new_x/1000., thetas=thetas))

谢谢你的回复。使用您的解决方案仍然会产生不匹配的形状错误,而使用
plt.plot(x,result.eval(x=new_x))
不会产生错误,但线条仍然像以前一样粗糙!总是很高兴看到
lmfit
被用来拟合一些好的旧核磁共振数据!您的模型有两个自变量(
omega\u eff
theta
)。在执行
eval
时,我觉得您只是为其中一个自变量提供了新值。@Renee哦,是的!试着让它们有意义。。。是的,我只是根据ωeff(
omega_eff
)来绘制它们,我认为这是正确的方法,因为x轴反映了辐射频率。更新的回答:基本上,你需要用新的自变量来评估模型。@MNewville再次感谢你的建议。我还是不能让它工作。。。插入您的建议,我得到以下错误:
ValueError:操作数无法与形状(5,)(1000,)
一起广播。它似乎不会接受任何不是原始值的东西,但我相信有一种方法可以解决这个问题。你还有别的建议吗s