1 回答
TA贡献2041条经验 获得超4个赞
最好找到并发布一个显示问题的最小示例,并且最好包含包括回溯在内的完整输出。
例如,您会看到您遇到的问题:
from lmfit.models import PseudoVoigtModel
pref = 'f1_'
model = PseudoVoigtModel(prefix = pref)
print('before',model.param_names)
model.set_param_hint(pref+'fraction',value = 0.7, vary = False)
model.set_param_hint(pref+'amplitude', value=2, min=0, max=5)
model.set_param_hint(pref+'center', value=0, min=-0.5, max=0.5)
model.set_param_hint(pref+'fwhm', value=3, min=3/5, max=3*5)
model.set_param_hint(pref+'sigma', value=1, min=0, max=2)
# suspect line:
model.set_param_hint(pref+'height', value=1, min=-np.inf, max=np.inf,
expr='(((1-fraction)*amplitude)/(sigma*sqrt(pi/log(2)))+(fraction*amplitude)/(pi*sigma))')
print(model.param_names)
params = model.make_params()
for p in params.values():
print(p)
问题出现是因为没有名为fraction. 正如上面几行定义的那样,它被命名为f1_fraction.
要解决这个问题,你应该改变的表达式pref+'height'也包括你pref需要的前缀字符串fraction,amplitude和sigma。
或者:您可以删除您的提示,height因为无论如何这都会自动完成,并正确使用您提供的前缀。
还:
a) 绝对不鼓励使用参数提示来提供初始值。提示属于模型,不应依赖于任何特定的数据集。做一个Model作为通用的东西,然后给每个数据集做带初始值的参数。
b) 不要将边界设置得太紧或基于初始值。界限(尤其是在参数提示中)应该用于防止参数变为非物理值,例如“为sigma负值毫无意义”,而不是因为定义模型的人认为“应该足够接近” . 让合身完成它的工作。如果您确实需要设置自定义边界,请按照数据集进行设置。
添加回答
举报