matlab 连续系统状态空间表达式的离散化&状态转移矩阵求解

  • Post author:
  • Post category:其他


最近在学习卡尔曼滤波需要在matlab/simulink系统中将连续系统进行离散化

推荐一篇个人觉得不错的卡尔曼滤波原理详解

https://blog.csdn.net/weixin_43942325/article/details/103416681


  • 数学过程推导

具’j体的数i学推导过程a就不做详绍了,在现代控制理论教材中都有,这儿贴两张图片


  • matlab 程序编写

根据上面公式推导,假设存在系统
\dot{x}=Ax+Bu
,其中
A = \begin{pmatrix} 0 & 1\\ 0&-2 \end{pmatrix}
,
B=\begin{bmatrix} 0\\ -2 \end{bmatrix}

其离散系统表达式为
x\left ( k+1 \right )=Gx\left ( k \right )+Hu\left ( k \right )

求系统的状态转移矩阵
\Phi \left ( t \right ) =e^A^T=L^-^1\begin{bmatrix} S & -1\\ 0& s+1 \end{bmatrix}=\begin{bmatrix} 1 & 1/2\ \left ( 1-e^-^2^t \right )\\ 0& e^-^2^t \end{bmatrix}
,式中
L^-^1
为拉氏反变换

matlab求解过程为

A = [0 1;0 -2];
B1 = [0 ;1];
syms s t Ls;   % 求状态转移矩阵 利用拉氏变换,syms为符号函数用来定义数学函数
    I = eye(size(A));
    Ls = inv(s*I - A);
    STM = ilaplace(Ls,s,t) %状态转移矩阵,ilaplace为拉氏反变换函数
    

同理可以求H

syms s t Ls;   % 求状态转移矩阵 利用拉氏变换
    I = eye(size(A));
    Ls = inv(s*I - A);% collect 函数为合并同类项
    STM = ilaplace(Ls,s,t) %状态转移矩阵
    
syms T
    HLs = int(STM,t,0,T);
    H = HLs*B1

运行结果如下

在simulink仿真过程中,我们需要G和H为已知的矩阵,当T固定时就可以求出G和H的具体数值了,这是需要用到

符号函数求解函数

subs,设步长T为0.001;matlab命令为

dt = 0.001;
A = [0 1;0 -2];
B1 = [0 ;1];
syms s t Ls;   % 求状态转移矩阵 利用拉氏变换
    I = eye(size(A));
    Ls = inv(s*I - A);% collect 函数为合并同类项
    STM = ilaplace(Ls,s,t); %状态转移矩阵
    G = double(subs(STM,t,dt)) % 符号函数求解
syms T
    HLs = int(STM,t,0,T);
    H = HLs*B1;
    H = real(double(subs(H,T,dt))) % 符号函数求解

结果如下:

到这matlab部分就完成了剩下的就是在simulink中的具体仿真了,这个有需要再写吧,贴下自己做的一个简单仿真和连续系统同时进行的以便对数据对比,结果是连续系统和离散系统仿真数据是一样的。



版权声明:本文为weixin_44051006原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。