MATLAB使用Simulink内嵌函数初始化以及保持更新值的方法

最近做的东西涉及到matlab中simulink工具及其内嵌函数。
simulink自带模块非常多,但是内嵌函数会更灵活,自己写了一个关于一维数组kalman filter的算法,但是过年那会回家心不在焉的,就随便写写了。回到学校发现有很大的BUG,输出结果不能用(其实在家就发现了)。

在matlab function下编写.m文件,因为这个.m文件是内嵌到simulink中,他的参数不会存入matlab workspace中,所以每个时间步长都会执行一次这个.m文件,那么问题来了,如果这个.m文件中需要对一些参数初始化,而且对参数要有存储记忆(本来就有存储,我只是怀疑一下),如果每个步长都执行初始化,存储毫无意义,输出数据也没有用。

刚开始我用的是在初始化函数中定义参数到workspace,结果是不行,存储空间不同在内嵌函数中读不到这个参数。
然后用global定义全局变量,这个方法理论上是可以的,利用constant在simulink中加入定义变量,在内嵌函数中global一下,例程完全理解,但是用在我的这个系统中就会报错,提示是不可用参数。然后就这样白折腾了一天(2月21日,今天过得很糟,淋雨,亏钱,还很饿)

然后睡一觉骗自己什么都忘了,开始第三种方法,利用persistent定义每个变量,这个方法是在另一个CSDN博客看到到,但是忘了存博客网址,抱歉。

我用我的代码单例子解释:

persistent flag1 p_last Q R x_mid x_now p_mid p_now z_real z_measure x_last 
if isempty(flag1)
    flag1 = 0;
    p_last = 0;
    % Xe1 = xe1.signals.values;%模型过程数据
    % Xe2 = xe2.signals.values;%系统测量数据
    Q = 0;%过程噪声
    R = 0.01;%测量噪声
    x_mid = 0;
    x_now = 0;
    p_mid = 0;
    p_now = 0;
    z_real = xe1;
    z_measure = xe2;
    x_last = z_real;
    x_mid = x_last;
    sum_kalmanerr = 0;
    sum_measureerr = 0;
end

用persistent定义每个你需要存储且保持的变量,定义后的值都是空,然后用if语句做初始化。把每一个变量的值都初始化。每次进入都会先执行persistent定义的变量,这个在第二个步长进来后flag1就有数值,不会进入if语句,就能完成对参数的初始化。

这种方法和global的区别就在是在函数内部调用存储器,global是在外部调用存储器,每次调用两种方法都是提取上一次赋值的值。

猜你喜欢

转载自blog.csdn.net/qq_24182661/article/details/87875182
今日推荐