Python中lmfit实现a < b < c变量拟合约束的技术问询
实现lmfit中
a < b < c的约束方法 这问题我之前也碰到过,其实就是把a < b < c这个链式不等式拆成两个独立的约束条件——a < b和b < c,然后用你提到的虚拟变量+表达式的方法分别实现,具体步骤如下:
核心思路
lmfit里没法直接写不等式约束,但可以通过定义非负的虚拟变量,把“大于”的关系转化为变量间的表达式:
- 对于
a < b,引入虚拟变量delta1(要求delta1 > 0),让b = a + delta1 - 对于
b < c,再引入虚拟变量delta2(要求delta2 > 0),让c = b + delta2(或者直接写成a + delta1 + delta2)
通过限制虚拟变量的最小值为0,就能保证两个不等式始终成立。
代码示例
from lmfit import Parameters # 初始化参数对象 pars = Parameters() # 1. 定义自由变量a,设置初始值 pars.add('a', value=1.0, vary=True) # 2. 定义虚拟变量delta1,min=0确保delta1≥0,拟合时会自动取正值 pars.add('delta1', value=0.5, min=0.0, vary=True) # 用表达式定义b,保证b = a + delta1 > a pars.add('b', expr='a + delta1') # 3. 定义虚拟变量delta2,同样min=0 pars.add('delta2', value=0.5, min=0.0, vary=True) # 用表达式定义c,保证c = b + delta2 > b pars.add('c', expr='b + delta2')
补充说明
- 虚拟变量
delta1和delta2的初始值可以根据你的数据范围调整,只要保证初始状态下a < b < c就行 - 如果需要更严格的约束(比如
delta1不能太小),可以给delta1设置一个大于0的min值,比如min=0.1 - 这种方法完全符合你提到的lmfit约束实现逻辑,把不等式转化为变量间的表达式,通过虚拟变量的范围来限制
内容的提问来源于stack exchange,提问作者ChemPaul
相关产品推荐
相关产品推荐

