ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Python CasADi初步教程

Python CasADi初步教程 文章目录简介和安装符号表达式SX牛刀小试简介和安装CasADi 是一个开源的符号计算与数值优化框架提供了Python、MATLAB和C 接口。其核心机制是将数学表达式构建为有向无环图DAG形式的计算图并在此基础上实现精确的自动微分并生成高效的 C 代码适用于大规模非线性规划NLP和最优控制问题如模型预测控制 MPC的建模与求解在模型预测控制、机器人学与轨迹优化、电力系统等领域有着重要应用。Python可以用pip安装pip install casadi -i https://pypi.tuna.tsinghua.edu.cn/simple符号表达式SX在CasADi中符号表达式(Symbol eXpression)用来表示数学公式的内部对象支持定义变量和公式并构建计算图甚至可以自动求导。例如∂ ( x 2 sin ⁡ y ) ∂ x 2 x \frac{\partial(x^2\sin y)}{\partial x}2x∂x∂(x2siny)​2x示例如下importcasadiasca xca.SX.sym(x)yca.SX.sym(y)fx**2ca.sin(y)ca.gradient(f,x)# SX((xx))但需要注意的是符号表达式并不能直接带入数值在CasADi中需要在构造Function之后才能带入数值进行计算。下面令x [ 2 , 3 ] , y 3 x[2,3], y3x[2,3],y3进行计算Fca.Function(F,[x,y],[f])F([2,3],3)# DM([4.14112, 9.14112])importnumpyasnp np.array(F([2,3],3))在经过数值计算后Function的返回值是DM类型此为数据矩阵(Data Matrix, DM)可以无缝转为数组。在CasADi中有两种构建SX的方法分别是SX(n,m)和SX.sym(name, n, m)从表达式可以看出来二者在结构上完全一致都是n × m n\times mn×m的数组但后者是个带有名字的表达式从而在交互时更加便捷。比如SX.zeros(n,m), SX.ones(n,m), SX.eye(n)顾名思义不必多说。除了SX之外CasADi还提供了矩阵表达式(Matrix eXpression, MX)这种数据结构二者区别在于在SX中矩阵中的每个元素都被看成独立的标量表达式而在MX中则将矩阵本身作为一个整体对象来运算从而在大规模稀疏线性代数中效率更高。牛刀小试下面考虑一个常见的非线性规划问题min ⁡ x , y ( x − 2 ) 2 ( y 1 ) 2 \min_{x,y} (x-2)^2(y1)^2x,ymin​(x−2)2(y1)2这题很简单一瞪眼就知道结果是( 2 , − 1 ) (2,-1)(2,−1)下面调用CasADi中的IPOPT求解器进行优化结果如下xca.SX.sym(x)yca.SX.sym(y)obj(x-2)**2(y1)**2nlp{x:ca.vertcat(x,y),f:obj}solverca.nlpsol(solver,ipopt,nlp)solsolver(x0[0,0])print(sol[x])# DM([2, -1])
返回列表