无法在 Matlab 中更改持久变量的值

Posted

技术标签:

【中文标题】无法在 Matlab 中更改持久变量的值【英文标题】:Unable to change the value of a persistent variable in Matlab 【发布时间】:2019-02-24 06:08:32 【问题描述】:

我在其中一个 simulink 功能块中定义了一个功能。在该函数中,我定义了一些持久变量,并希望根据特定条件更改它们的值。这些持久变量的值没有改变。这是我的代码,

function [er,mem,phi_hat_dot,hdot,ldot,x_hat,x_til1,...
    x_til2,f_hat,g_hat,x_hat_dot,h_bar,ns]= ident(x,u,h,...
    l,phi_hat,gain)
persistent i Z x_tj;            % initialized persistent values
if isempty(i)
    i=0;
end
if isempty(Z)
    Z=zeros(5,15);
end
if isempty(x_tj)
    %si=size(Z);
    x_tj=zeros(length(x),15);
end
Gamma=gain(1);a=gain(2);A=gain(3); % gains
x1=x(1);x2=x(2);                   % state variable
z=[x1,x2,x1*(x1^2+x2^2),x2*(x1^2+x2^2),u]';
hdot=-a*h+z;
ldot=-A*l+x;
ns=1+h'*h+l'*l;
x_bar=x/ns;h_bar=h/ns;l_bar=l/ns;
x_hat=phi_hat*h_bar+a*l_bar;
e=x_hat-x_bar;
%%%%%%%%%Memory Stack%%%%%%%
while i<15               %This is the place where I am altering persistent variables
    Z(:,i+1)=h_bar;
    x_tj(:,i+1)=x_bar;
    i=i+1;
end
mem=x_tj;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%Error Stack%%%%%%%%%%%
%Gamma=102;
si=size(Z);
er=zeros(length(x),si(2));
if i>=15
    for j=1:si(2)
        er(:,j)=x_hat-x_tj(:,j);
    end
    phi_hat_dot=-Gamma*e*h_bar'-Gamma*er*Z';
else
    phi_hat_dot=-Gamma*e*h_bar';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%Update Law%%%%%%%%%%%
x_til1=x-x_hat;
x_til2=x_bar-x_hat;
f_hat=phi_hat(:,1:4)*z(1:4);
g_hat=phi_hat(:,5)*1;
x_hat_dot=f_hat+g_hat*u;

【问题讨论】:

【参考方案1】:

只需查看变量i,并按照您的代码,i 只会在模型初始化期间发生变化。

也就是说,在t=0,代码被调用并且

最初i = 0; 然后在内存堆栈中,i 将从0 递增到15

由于您没有在其他任何地方更改i,上述意思是因为i 是持久的,所以在所有其他时间它的值都将为15

因此while i &lt; 15 循环永远不会执行(在初始化之后),并且您永远不会更改Zx_tj 的值(在初始化之后)。这也意味着在错误堆栈中,i &gt;= 15 代码将始终被执行。

如果上述情况没有发生(它一定是),那么您看到了什么,您期待什么?

还请注意,您可以稍微简化初始化。当i 为空时,Zx_tj 将始终为空,因此没有真正的理由去检查它们。

if isempty(i)
    i=0;
    Z=zeros(5,15);
    %si=size(Z);
    x_tj=zeros(length(x),15);
end

【讨论】:

以上是关于无法在 Matlab 中更改持久变量的值的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 上使用持久变量

Matlab中持久变量的初始化

在MATLAB上使用持久性变量

matlab persistent啥意思

在 Matlab 中列出/查看/清除持久变量

如何在 MATLAB 方法中清除持久变量