You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

lmfit VoigtModel调用eval()传入不同参数始终返回相同值问题

lmfit VoigtModel调用eval()传入不同参数输出曲线重合问题解决

问题原因

lmfit所有模型的eval()方法不支持直接传入普通Python字典作为参数输入。传入普通字典时,模型不会读取字典内的自定义参数值,会直接使用内置的默认参数计算结果,这就是传入三组不同参数却得到完全重合曲线的核心原因。
另外原参数组p2中v1_gamma为负值,Voigt分布的洛伦兹半宽参数gamma物理上不允许为负,即使参数传入正确,负值也会被参数约束自动截断为0,需要修正为合法正值。

修正方法

调用每个模型的make_params()方法生成专属的Parameters对象,把自定义的参数值更新到这个对象里,再传给eval()即可。
修正后的可运行代码:

from lmfit.models import VoigtModel
import numpy as np
import matplotlib.pyplot as plt

p1={'v0_amplitude': 0.7895507911965995, 'v0_center': 0, 'v0_sigma': 0.3115195639177176, 'v0_gamma': 0.3115195639177176}
# 修正原p2中gamma为负的非法值
p2={'v1_amplitude': 0.2433671058552931, 'v1_center': 0, 'v1_sigma': 0.5154224820790644, 'v1_gamma': 0.10060349484692119}
p3={'v2_amplitude': 0.2560477563760484, 'v2_center': 0, 'v2_sigma': 0.19387399410496087, 'v2_gamma': 0.5953440400428517}

p=[p1, p2, p3]
v1=VoigtModel(prefix='v0_')
v2=VoigtModel(prefix='v1_')
v3=VoigtModel(prefix='v2_')

v = [v1, v2, v3]
x = np.linspace(-10,10, 100)

for i in range(3):
    # 生成合法Parameters对象,直接解包字典传入参数值
    params = v[i].make_params(**p[i])
    y = v[i].eval(params, x=x)
    plt.plot(x, y, label=f'Voigt {i}')
plt.legend()
plt.show()

注意事项

  • make_params(**p[i])会自动把字典里匹配前缀的参数值写入Parameters对象,不需要手动遍历赋值,前提是字典的key和模型带前缀的参数名完全一致。
  • 所有线形模型的sigma、gamma、amplitude参数默认带非负约束,传入负值会被自动截断,设置参数时需要注意取值合法性。

内容的提问来源于stack exchange,提问作者Beandope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:12:30