Scipy minimize添加不等式约束致QP控制分配求解异常
问题成因
核心问题是Python原生字典的语法特性:同一个字典内不允许存在重复键,重复声明的键会被最后一次赋值的内容完全覆盖。
你定义cons2时把等式约束、不等式约束的type和fun键写在了同一个字典里,解析后这个字典实际只保留了最后写入的不等式约束ineq1,力平衡必需的等式约束eqcon根本没有被传入minimize函数。
此时优化问题缺少推力与环境力平衡的强制约束,而目标函数是求推力项、松弛变量项的加权平方和最小值,所有变量取0时目标函数值达到理论最小值0,同时满足fmax[0] - x[0] > 0的不等式要求,自然会输出全0结果,不存在优化器忽略第一个约束的情况。
修复方法
SciPy的minimize接口对多约束的传参要求为:每个约束单独定义为一个字典,所有约束字典按顺序放入列表/元组后,整体传给constraints参数,不能把多个约束的键值对写到同一个字典里。
修正后的约束定义代码如下:
# 错误写法:同字典重复键,前序约束被覆盖 # cons2 = {'type': 'eq', 'fun': eqcon, # 'type': 'ineq', 'fun': ineq1} # 正确写法:多约束以字典列表形式传入 cons2 = [ {'type': 'eq', 'fun': eqcon}, {'type': 'ineq', 'fun': ineq1} ]
替换后重新运行即可让两个约束同时生效,得到符合预期的推力分配结果。后续新增其他推进器的推力上限、角度限制等约束时,只需要在这个约束列表里追加对应的约束字典即可。
内容的提问来源于stack exchange,提问作者napahlm
相关产品推荐
相关产品推荐

