非线性求解器Casadi使用简介
Casadi做为一款非线性求解器,支持python、C++、matlab等多种语言,能够解决非常多的工程问题。具体使用请参考casadi官方使用文档。
使用Casadi主要包含3个步骤:构造变量、构造目标函数和设置求解器。
构造变量和目标函数
使用casadi求解优化问题时,就需要将变量定义成casadi能够识别的形式,其中可以将变量定义成向量、矩阵的形式,如“x = SX.sym(‘x’)”定义的是一个一维变量,“y=SX.sym(‘y’, 5)”定义的是一个5维向量变量
在定义完变量后,定义目标函数则是一件非常容易的事情。如“f=x * x + 5 * x”。
设置求解器
在casadi中,根据不同的问题有多种求解方式,如NLP问题、QP问题等,同时还需要设置一些约束条件,以及设置求解器参数如最大迭代步长、求解精度等。这些将在使用例程当中介绍。
使用例程
以下将通过一个非常简单的python程序介绍求解一个QP问题(需要使用“pip install casadi”安装python包)。
优化的问题如式(1)所示。
min
x
,
y
J
=
min
x
,
y
x
2
+
y
2
s
.
t
.
0
≤
x
+
y
−
10
(1)
\begin{array}{l} \min \limits_{x,y}{J}=\min \limits_{x, y} {x^2+y^2} \\ s.t. \quad 0 \leq x+y-10 \end{array} \tag{1}
x,yminJ=x,yminx2+y2s.t.0≤x+y−10(1)
式(1)的最优值为50,解为
(
x
,
y
)
=
(
5
,
5
)
(x,y)=(5,5)
(x,y)=(5,5)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import casadi as ca
import casadi.tools as ca_tools
import numpy as np
import time
import math
if __name__ == '__main__':
print("begin the test program.")
x = ca.SX.sym('x') #定义一 维变量x
y = ca.SX.sym('y') #定义一 维变量y
f = x**2+y**2 #定义目标函数
qp = {'x': ca.vertcat(x, y), 'f': f, 'g': x+y-10}
S = ca.qpsol('S', 'qpoases', qp) #加载求解器
print(S)
r = S(lbg = 0) #加载约束条件并进行求解
x_opt = r['x']
print('x_opt:', x_opt) #显示求解结果
扩展内容
目前已经使用该求解器做过MPC控制,效果非常可观。当然,理论上需要是优化求解的工程问题,只要能用数学公式描述出来,就能够使用这款求解器求解问题。比如规划、定位、SLAM等。