用ode45做控制系统仿真
本文是reddit r/ControlTheory一篇帖子的总结。这篇帖子以倒立摆为例,介绍如何在MATLAB中用解微分方程的方式做控制系统仿真,并与常规仿真方法做比较。
所用模型是倒立摆在平衡点附近的近似线性模型,这个模型很常见,从代码中也能很容易看出来,所以我就不列出。采用反馈控制方式,将测量输出
控制本质上要求解微分方程,MATLAB解微分方程最常用的是ode45函数,它求解的微分方程的标准形式为
1 | % 倒立摆近似线性模型的参数 |
最后几行代码是倒立摆微分方程模型的描述,将输入信号u作为model函数的参数。第18行调用ode45函数求解微分方程,在这里将输入信号的计算式u = K*(r-y)传递给model函数。
MATLAB中对这样的系统做仿真一般用lsim函数,因为它可以自定义输入信号,还可以包含初始条件。由于该模型是平衡点附近的近似线性模型,控制目标是将系统输出(或系统状态)保持在参考输入
将
本文使用lsim函数的如下接口:
1 | [y, tOut, x] = lsim(sys, u, t, x0) |
lsim的参数u,
1 | % 倒立摆近似线性模型的参数 |
可以验证,用ode45和lsim得到的结果完全一样,系统状态随时间变化的曲线如下图所示,达到了控制目标。
对比来看,lsim是MATLAB中专门用于控制系统仿真的函数,使用更方便,ode45则更通用,可以做更复杂更灵活的仿真,如事件触发控制(event-triggered
control)。