Simulink中MATLAB Function的变量初始化

在function头的下一行增加%#codegen符号,其作用是为了使静态代码分析器Code Analyzer 诊断代码并提示用户对可能在代码生成的过程中导致错误的违规写法进行修正。
MATLAB Function内部的M语言有严格的要求: 变量必须要给定初始值及其维度,变量类型及其虚实性,不支持变维度变量
simulink中的运行机制,每个采样点会调用一次MATLAB Function的函数,两次调用之间,同一个变量的前次计算结果传递到当前计算周期是个大问题。解决的办法是采用persistent变量来实现函数退出和进入时内部变量值的保持。
persistent变量是定义在某个函数内的来变量类型,可以在函数调用的不同次数间保持上一次退出该函数的值。它变量声明与global的区别是,persistent变量是能在被定义函数中被识别,避免被外部修改。声明persistent变量时,它刚刚被创建,还不具有初始值,其内容为空值[ ]。调用persistent变量的函数时,先判断persistent变量是否为空。如果为空需要进行初始化赋值。当非空时,它会记住上次被调用的结果。
Example 1:
function y = fcn(u)
%#codegen
%*********初始化******************
persistent sum_val
if isempty(sum_val)  %初始化
    sum_val = 0;
end
sum_val = sum_val + u ;
y = sum_val;
Example 2:
% 来源https://blog.csdn.net/zouxu634866/article/details/103766675

function y_filter = fcn(u)

persistent A B C D Q p R  x1 p_1

% 对于一直保持不变的值,我们可以这样赋值:
    A=[1.000 0.0010;0 0.9753];
    B=[0.0001;0.1314];
    C=[1 0];
    D=[0];
    R=1;
    Q=1;

% 对于需要调用上次结果的值,我们需要这样赋值:
if isempty(x1)
    x1=zeros(2,1);%上一时刻对象的状态
end
   
if isempty(p_1)
    p_1=B*Q*B';
end    
 
    x1=A*x1+B*u(1);  
    p=A*p_1*A'+B*Q*B';
    K=p*C'/(C*p*C'+R);
    x1= x1+K*(u(2)-C*x1);
    y_filter=C*x1;
    p=(eye(2)-K*C)*p;

    x1= x1;
    p_1=p;

y_filter = y_filter ;


参考文献:

  • https://blog.csdn.net/u011731418/article/details/84144849
  • https://blog.csdn.net/zouxu634866/article/details/103766675
### 设置SimulinkMATLAB Function模块的初始值 在Simulink环境中,`MATLAB Function`模块允许用户编写自定义的MATLAB代码来实现特定的功能。为了确保这些函数能够正常运行并处理数据流,在某些情况下需要设定变量的初始值。 对于`MATLAB Function`模块内的局部变量初始化,可以在函数体内部通过赋初值的方式完成。例如: ```matlab function y = fcn(u) % 初始化局部变量 persistent myVar; if isempty(myVar) myVar = 0; % 设定初始值为零或其他适当数值 end ... ``` 当涉及到输入信号或状态变量时,则可以利用模块参数对话框来进行配置[^3]。具体操作如下所示: - 利用属性窗口中的“Ports and Data Manager”,在这里可以指定端口的数据类型以及维度大小等特性;如果要给某个全局可见的状态量设初值,可以通过创建一个具有持久性的存储器对象(Persistent Variable),并在第一次调用此函数时为其赋予所需的起始值[^2]。 此外,还可以考虑采用外部源提供预置条件的方法,比如从工作区加载预先计算好的数组作为默认启动状态的一部分[^1]。 #### 示例代码展示如何在外围脚本里准备初始条件并向Function传递: 假设有一个名为 `initCond.mat` 的文件保存了一些必要的初始条件矩阵,那么可以在顶层模型开始仿真前执行一段简单的命令读取它们并将结果存放到合适的位置供后续使用. ```matlab load('initCond.mat'); % 加载包含初始条件的工作空间变量 set_param(gcb,'ParameterName','ValueFromWorkspaceVariable'); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值