将上一个值传递给函数 MATLAB

Pass a Previous Value to function MATLAB

提问人:Jonathan Frutschy 提问时间:10/2/2023 最后编辑:Jonathan Frutschy 更新时间:10/3/2023 访问量:46

问:

我有以下功能:

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
函数 MATLAB 参数 迭代持久性

评论

0赞 Cris Luengo 10/2/2023
当 时,您不进行任何计算,您只是输出以前的值。然后,在循环中,您要分配到 .nargin==3y_out(t)
0赞 Cris Luengo 10/2/2023
请注意,您的函数与 !(alpha + beta) * y(t-1) + delta
0赞 Jonathan Frutschy 10/2/2023
还行。我更改了 y_out = NARMA(alpha,beta,delta);to y_out = y_out + NARMA(alpha,beta,delta) 在 for 循环中。我还更改了 y = y + α varargin{1} +beta varargin{1} +delta;至 y = α varargin{1}+ beta varargin{1}+ delta。但现在我得到的y_out是 0.8、1.6、2.4、......这意味着代码只是在每次迭代中添加增量。为什么每次迭代都根据我的 y(t) 函数用 alpha 和 beta 更新y_out?@CrisLuengo
0赞 Cris Luengo 10/2/2023
正如我所说,你想做.这样,您每次都可以将新值分配给新的数组元素。y_out(t) = NARMA(alpha,beta,delta);
1赞 Cris Luengo 10/3/2023
您不需要初始化为最终大小,但这样做会更有效。问题是仍然返回一个空数组。您需要先修复该功能才能正常工作。y_outNARMA

答:

1赞 Cris Luengo 10/3/2023 #1

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

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

评论

0赞 Jonathan Frutschy 10/3/2023
这些都是很好的选择 Bravo。@CrisLuengo