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
  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值