引言:我们在simulink中会用到matlab function模块,需要去自己书写里面的函数。简单的还好,如果我们需要函数里面的变量能够储存它的值,也就是每个时间周期内运行这个matlab function模块时里面的某些变量的值能够保持上一次运行的结果,怎办?能不能像matlab’的workplace中的那些变量那样,能够一直在那里,不修改它它的值就不会变?方法就是将这些变量设为persistent
先上一段代码:
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); %注意这里易错:因为等号右边已经为数组形式,所以不能像以前那样将其写成:x(k)=A*x_1+B*u(k),因为不能把一个数组保存到另外一个数组里面,所以等号左边只能为一个变量,不能为一个数组。
%今后也要注意职能将数字保存到数组中,不能将数组保存到数组中。
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 ;
这段代码里面,我们将A B C D Q p R x1 p_1设为persistent,这时他们的值就为空。然后我们需要对他们进行初始化,对于那些值一直保持不变的变量,我们可以像下面这样直接赋值,这样每次运行到这个模块时这些变量都会被重新赋值:
A=[1.000 0.0010;0 0.9753];
B=[0.0001;0.1314];
C=[1 0];
D=[0];
R=1;
Q=1;
而像x1 p_1
这两个由于我们需要他们的值会存储每次运行后的结果供下次使用,所以我们不能像上面那样对他们初始化,因为上面那样的初始化会导致每次运行这个模块这些变量的值被重新初始化,所以对于这样的变量我们选取这样的方式进行初始化:
if isempty(x1)
x1=zeros(2,1);%上一时刻对象的状态
end
这样的话,因为只有第一次改变量为空,所以只有第一次会进行初始化,后面由于这个变量不为空,就不会对其初始化,而是保持它的值直到被修改。
另外需要注意:这些persistent变量只在该函数内可见可用,其他函数不能用,并且这些变量的名字不能和已经存在于workplace中的变量重名。