将先前值传递给函数MATLAB

sf6xfgos  于 7个月前  发布在  Matlab
关注(0)|答案(1)|浏览(58)

我有以下功能:

y(t) = alpha*y(t-1) + beta*y(t-1) + delta

其中alpha、beta和delta是常数。
假设y(0)= 0。我尝试创建一个MATLAB函数来使用persistent命令表示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
7rfyedvj

7rfyedvj1#

我认为你用持久变量使程序复杂化了。我会这样实现它:

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)如何在定义时捕获变量alphabetadelta的值。我们不需要把它们作为函数参数传递,它们已经成为函数的一部分。
如果你坚持使用持久化变量,你可以这样做:

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

相关问题