gtx_0011 2023-12-04 21:11 采纳率: 33.3%
浏览 14
已结题

请教一下simulink中S函数相关问题

请教一下大家:如何利用一个S函数块获取状态变量及其观测值?

对于了解ADRC的人解释起来就比较方便了,简单来说就是我想把ADRC用一个S函数块表示出来,但是如何同时获取TD的两个状态变量和ESO的三个状态变量呢?难道说要定义5个离散状态变量吗?不了解ADRC的请往下看。

一般来说S函数进行初始化时需要定义出离散状态变量和连续状态变量的个数,但是我的项目中包含着二阶跟踪微分器(两个状态变量)以及二阶扩张状态观测器(三个状态变量,准确来说是对上述两个状态变量的观测值以及扰动的观测值,共三个),如何在一个S函数块中同时获取这五个状态变量的值并进行更新呢?求解惑

  • 写回答

8条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-04 21:11
    关注

    引自强大而免费的微信小程序:皆我百晓生

    在Simulink中使用S函数块表示ADRC算法,并同时获取二阶跟踪微分器(TD)的两个状态变量和二阶扩张状态观测器(ESO)的三个状态变量可以通过以下步骤实现:

    1. 定义离散状态变量和连续状态变量的个数:
      在S函数块的初始化函数中,你需要定义出离散状态变量和连续状态变量的个数。根据你的描述,你的算法包含二阶跟踪微分器的两个状态变量和二阶扩张状态观测器的三个状态变量,所以你需要定义总共5个状态变量。

      示例如下:

      function [sys, x0] = mySFunction(t, x, u, flag)
          switch flag
              case 0 % 初始化函数
                  sizes = simsizes; % 获取sizes结构体
                  sizes.NumContStates = 0; % 连续状态变量个数
                  sizes.NumDiscStates = 5; % 离散状态变量个数
                  sizes.NumOutputs = 1; % 输出的端口个数
                  sizes.NumInputs = 1; % 输入的端口个数
                  sizes.DirFeedthrough = 1; % 系统是否直接通过输入到输出(1: 是,0: 否)
                  sizes.NumSampleTimes = 1; % 系统的采样时间个数
                  sys = simsizes(sizes); % 更新sizes结构体
                  x0 = zeros(5, 1); % 初始化状态变量
              case 3 % 更新函数
                  sys = []; % 状态变量的更新在Outputs函数中进行
              case {1, 2, 4, 9} % 其他情况不需要做处理
                  sys = [];
          end
      end
      
    2. 获取状态变量的当前值:
      在S函数块的输出函数中,你可以通过访问x参数来获取状态变量的当前值。在你的情况下,前两个状态变量对应TD的状态变量,后三个状态变量对应ESO的状态变量。

      示例如下:

      function sys = mySFunction(t, x, u, flag)
          switch flag
              case 0 % 初始化函数
                  % ...
              case 3 % 更新函数
                  TD_state_var1 = x(1); % 获取TD的状态变量1
                  TD_state_var2 = x(2); % 获取TD的状态变量2
                  ESO_state_var1 = x(3); % 获取ESO的状态变量1
                  ESO_state_var2 = x(4); % 获取ESO的状态变量2
                  ESO_state_var3 = x(5); % 获取ESO的状态变量3
      
                  % 根据你的需求进行状态变量的更新操作
      
                  sys = []; % 不需要返回值
              case {1, 2, 4, 9} % 其他情况不需要做处理
                  sys = [];
          end
      end
      
    3. 对状态变量进行更新操作:
      根据你的需求,可以在S函数块的输出函数中对状态变量进行相应的更新操作。这些操作可能涉及到ADRC的具体实现细节,根据你的算法和系统要求进行操作。

      示例如下:

      function sys = mySFunction(t, x, u, flag)
          switch flag
              case 0 % 初始化函数
                  % ...
              case 3 % 更新函数
                  % 获取状态变量的当前值
                  TD_state_var1 = x(1);
                  TD_state_var2 = x(2);
                  ESO_state_var1 = x(3);
                  ESO_state_var2 = x(4);
                  ESO_state_var3 = x(5);
      
                  % 根据你的需求对状态变量进行更新操作
                  % ...
      
                  % 更新后的状态变量赋值给输出
                  sys = [TD_state_var1; TD_state_var2; ESO_state_var1; ESO_state_var2; ESO_state_var3];
              case {1, 2, 4, 9} % 其他情况不需要做处理
                  sys = [];
          end
      end
      

    通过以上步骤,你可以在S函数块中同时获取并更新TD和ESO的所有状态变量的值。请注意根据你的具体算法和系统要求,可能需要修改具体的状态变量命名和更新逻辑。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 12月13日
  • 已采纳回答 12月5日
  • 创建了问题 12月4日