我有以下功能:
y(t) = alpha*y(t-1) + beta*y(t-1) + delta
其中 alpha、beta 和 delta 是常数。
我假设 y(0) = 0。我正在尝试使用 persist 命令创建一个 MATLAB 函数来表示 y(t)。当我第一次调用函数时,我传递 0 作为 y(t) 的初始条件。然后我使用 for 循环更新 y(t) 1000 次迭代。由于某种原因,我的 y(t)、y_out 输出的大小永远不会改变并且保持为 0。我不确定为什么会发生这种情况。如何让 y(t) 随着 t 的增加而迭代更新?
alpha = 0.5;
beta = 0.3;
delta = 0.8;
y_out = NARMA(alpha,beta,delta,0);
for t=2:1:1000
y_out = NARMA(alpha,beta,delta);
end
function y_out = NARMA(alpha,beta,delta,varargin) % pass 0 to varargin as y(0) = 0 only the first time you call the function
persistent y
if nargin>3
y = y + alpha*varargin{1} + beta*varargin{1} + delta
end
y_out = y;
end
我认为你使用持久变量使你的程序变得复杂。我会这样实现:
alpha = 0.5;
beta = 0.3;
delta = 0.8;
N = 100;
y_out = zeros(1, N);
y_out(1) = NARMA(0,alpha,beta,delta);
for t=2:N
y_out(t) = NARMA(y_out(t-1),alpha,beta,delta);
end
function y_out = NARMA(y_in,alpha,beta,delta)
y_out = alpha*y_in + beta*y_in + delta;
end
因为该函数现在是一行,所以您可以使用匿名函数,如下所示:
alpha = 0.5;
beta = 0.3;
delta = 0.8;
NARMA = @(y_in) alpha*y_in + beta*y_in + delta;
N = 100;
y_out = zeros(1, N);
y_out(1) = NARMA(0);
for t=2:N
y_out(t) = NARMA(y_out(t-1));
end
请注意匿名函数(也称为 lambda)如何在定义时捕获变量
alpha
、beta
和 delta
的值。我们不需要将它们作为函数参数传递,它们已经成为函数的一部分。
如果你坚持使用持久变量,你可以这样做:
alpha = 0.5;
beta = 0.3;
delta = 0.8;
N = 100;
y_out = zeros(1, N);
y_out(1) = NARMA(alpha,beta,delta,true);
for t=2:N
y_out(t) = NARMA(alpha,beta,delta);
end
function y_out = NARMA(alpha,beta,delta,first_call)
% Set first_call to true only the first time you call the function
persistent y
if nargin>3 && first_call
y = 0;
end
y = alpha*y + beta*y + delta;
y_out = y;
end