文章目录
- 非线性求解函数
- 约束求解
- 求解器选择
非线性求解函数
nlpsol 是 CasADi 里用来求解 非线性规划问题(NonLinear Programming, NLP) 的核心接口。功能很直接,给它一个目标函数和约束,它会调用优化求解器算出最优解。由于CasADi的源码是C++,所以官方并没有提供其Python签名,但其输入参数大致如下
nlpsol(strname,strsolver,dictnlp)其中,name是当前问题名称,solver是求解器名称,nlp是待求解的具体问题的字典,其格式为
nlp={'x':x,# 优化变量'f':f,# 目标函数'g':g,# 约束,可选'p':p# 参数,可选}下面做一个简单的示例
importcasadiasca x=ca.MX.sym('x',2)f=(x[0]-1)**2+(x[1]-2)**2# 目标函数g=x[0]+x[1]# 约束函数# 定义 NLPnlp={'x':x,'f':f,'g':g}# 创建求解器solver=ca.nlpsol('solver','ipopt',nlp)ipopt,即Interior Point OPTimizer,是一个开源的非线性求解器。
约束求解
nlpsol的返回值是Function类型的优化函数,其输入参数包括初值、变量上下界、约束上下界,以及参数p,求解过程如下
sol=solver(x0=[0,0],# 初始值lbx=[-10,-10],# 变量下界ubx=[10,10],# 变量上界lbg=-ca.inf,# 约束下界ubg=2# 约束上界)print(sol['x'])# [0.5, 1.5]求解器选择
nlpsol支持多种求解器,其中开箱即用的包括
| 调用名 | 全称 | 适用问题与特点 |
|---|---|---|
| ipopt | Interior Point OPTimizer | 通用非线性规划(NLP)。基于内点法,稳定鲁棒,处理大规模非凸问题能力极强。轨迹优化、MPC首选。 |
| sqpmethod | Sequential Quadratic Programming Method | CasADi 内置的 SQP 算法框架,需配合底层 QP 求解器(如 OSQP)。 |
| feasiblesqpmethod | Feasible SQP Method | sqpmethod 的变种,致力于在迭代过程中始终不违反硬约束,保证中间解的安全性。 |
| qrsqp | QR-factorization based SQP | 使用 QR 分解处理底层二次规划子问题,适合变量较少且不想依赖外部大型 QP 求解器的场景。 |
| scpgen | Sequential Constraint Generation | 一种序列约束生成算法,较老,现多用于特定实验或教学目的。 |
| ampl | A Mathematical Programming Language | 外部求解器桥接。本身不是求解器,而是将 CasADi 模型导出为 .nl 文件格式,以调用 AMPL 环境下的独立求解器(如 MINOS, CONOPT)。 |
nlpsol还支持调用一些外部求解器,这些求解器可能需要自行编译。
| 调用名 | 全称 | 开源 | 适用问题与特点 |
|---|---|---|---|
| snopt | Sparse Nonlinear OPTimizer | 商业 | 基于SQP,特别擅长最优解位于约束边界上的工业级问题,航空航天常用。 |
| knitro | Artelys Knitro | 商业 | 顶级商业求解器,内含内点法、主动集法、SQP等多种算法自动切换,适合预算充足、追求极致性能的场景。 |
| worhp | We Optimize Robustly Hard Problems | 商业 | 基于大规模 SQP 方法,专为极高风险、需要极高数值精度的轨迹优化设计。 |
| bonmin | Basic Open-source Nonlinear Mixed INteger programming | ✅ | 当决策变量包含整数或0-1变量时使用(如车辆是否换道、阀门是否开启)。 |
| madnlp | Matrix-free Active-set Dual NLP | ✅ | 超大规模 NLP。一个较新的内点法求解器,支持GPU加速。 |
| fatrop | Fast Trajectory Optimizer | ✅ | 专为多阶段轨迹优化设计,利用动力学方程的特定结构进行极致的线性代数加速,适合高频实时 MPC。 |
| blocksqp | Block-structured SQP Method | ✅ | 专门针对具有明显多阶段、分块特性的优化问题优化矩阵运算。 |