概述
最近做的东西涉及到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是在外部调用存储器,每次调用两种方法都是提取上一次赋值的值。
最后
以上就是酷酷香氛为你收集整理的MATLAB使用Simulink内嵌函数初始化以及保持更新值的方法的全部内容,希望文章能够帮你解决MATLAB使用Simulink内嵌函数初始化以及保持更新值的方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复