为了账号安全,请及时绑定邮箱和手机立即绑定

使用 lmfit 评估模型

使用 lmfit 评估模型

慕容3067478 2022-10-05 18:20:33
我想在输入变量的定义范围内绘制计算并绘制模型的预测,我正在尝试使用lmfit. 这是我正在处理的代码。该模型被定义为只有一个自变量t的函数,但函数本身也使用另一组独立的观察值。我可以计算评估模型的 new_times,但不能对另一组观察值做同样的事情。除了糟糕的配合(这里本身不是问题)之外,我还强调了我在使用时遇到的错误,lmfit因为我认为它有效:import numpy as npimport matplotlib.pyplot as pltfrom lmfit import Modelimport scipy.integrate as itimport scipy.constants as sccdef new_f_function(t, sum, f0, a, b, c, T0):  obs_f = f0 + it.cumtrapz(-a * p**c + b, t-T0, initial=0)  new_f = obs_f*(1+sum/scc.c)  return new_f# Create Modelmodel = Model(new_f_function, independent_vars=['t'])# Initialize Parameterparams = model.make_params()params['sum'].value = 1.483 params['sum'].min = 1.47params['sum'].max = 1.50params['f0'].value = 1.483 params['f0'].min = 1.47params['f0'].max = 1.50params['a'].value = 1.483 params['a'].min = 1.47params['a'].max = 1.50params['b'].value = 1.483 params['c'].value = 1.483 params['T0'].value = 1.483 result = model.fit(y_obs, params, weights=(1./y_obs_err), t=times, scale_covar=False)print result.fit_report()# New x-values to evaluate the model x_fit = np.linspace(min(times)-10., max(times)+10, 1e4)  fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(3, 6), sharex='all')ax1.scatter(x=times, y=p, marker='+', c='k')ax2.errorbar(x=times, y=y_obs, yerr=y_obs_err, marker='.', ls='', label='DATA')ax2.plot(times, result.best_fit, label='best fit')new_predictions = result.eval(**result.best_values)#ax2.plot(x_fit, new_predictions, label='extended fit') # This gives error: `ValueError: x and y must have same first dimension, but have shapes (10000,) and (45,)`predicted = result.eval(t=x_fit) # This gives error: `raise ValueError("If given, length of x along axis must be the "ValueError: If given, length of x along axis must be the same as y.`plt.legend()plt.show()我在这里想念什么?
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

您的错误消息来自scipy.integrate.cumtrapz(). 阅读完整的回溯会告诉你这一点。该消息是说 的两个参数的scipy.integrate.cumtrapz()大小必须相同。

实际上,it.cumtrapz(-a * p**c + b, t-T0, initial=0)第一个参数的大小将由您的变量设置p,这是一个固定长度的数组,第二个参数将由t您的模型函数的自变量设置。

因此,当您这样做时result.eval(t=NEW_ARRAY),如果您的新数组与您的数组长度不同,您肯定会收到该错误消息p。那是实际的错误。你会怎么解决?好吧,你必须以某种方式传入一个数组,p因为它与新数组的长度相同t

混合全局数组和局部数组通常是个坏主意。这说明了这样做的问题之一。还有其他一些奇怪的事情会导致拟合效果不佳。比如a)为什么所有初始值都相同,b)为什么你对几个参数设置非常严格(和相同)的界限?我想这些并不是这里真正的问题,但它们可能会使合身效果不太好。


查看完整回答
反对 回复 2022-10-05
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信