如何在lmfit中设置多个参数乘积为固定常数的约束条件
参数乘积约束的正确编写方法
错误根因
你遇到的报错由两个问题共同导致:
- 基础语法错误:约束名
'mult_constraint"的引号不匹配,左单引号、右双引号的写法不符合Python语法规范 - 表达式参数传入错误:你给
expr参数传入了字符串格式的公式,绝大多数参数优化、建模类库要求expr接收参数对象直接运算生成的表达式,或符合库规范的可解析表达式格式,直接传字符串会导致变量找不到,触发NameError
常见库的正确写法示例
场景1:lmfit参数拟合库
lmfit是常用的带边界约束的参数拟合工具,要求约束表达式的计算结果等于0,两种写法都支持:
from lmfit import Parameters p = Parameters() # 先完成A、B、C参数的初始化 p.add('A', value=2, min=0, max=10) p.add('B', value=1, min=0, max=10) p.add('C', value=0.5, min=0, max=10) # 写法1:直接用参数对象运算生成表达式 p.add('mult_constraint', expr = p['A'] * p['B'] * p['C'] - 1) # 写法2:传入参数名组成的表达式字符串(lmfit原生支持该写法) p.add('mult_constraint', expr = 'A*B*C - 1')
场景2:Pyomo优化建模库
如果是用于数值优化建模的Pyomo库,需要通过规则函数定义约束:
from pyomo.environ import ConcreteModel, Var, Constraint model = ConcreteModel() # 初始化带边界的参数变量 model.A = Var(bounds=(0, 10)) model.B = Var(bounds=(0, 10)) model.C = Var(bounds=(0, 10)) # 定义约束规则 def mult_constraint_rule(m): return m.A * m.B * m.C == 1 model.mult_constraint = Constraint(rule=mult_constraint_rule)
内容的提问来源于stack exchange,提问作者Waveform
相关产品推荐
相关产品推荐

