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

推荐一篇个人觉得不错的卡尔曼滤波原理详解卡尔曼滤波原理详解及系统模型建立(simulink)_卡尔曼滤波 simulink-CSDN博客

  • 数学过程推导

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

  •  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中的具体仿真了,这个有需要再写吧,贴下自己做的一个简单仿真和连续系统同时进行的以便对数据对比,结果是连续系统和离散系统仿真数据是一样的。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐