Pass a Previous Value to function MATLAB

62 views Asked by At

I have the following function:

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

where alpha,beta, and delta are constants.

I am assuming that y(0) = 0. I'm trying to create a MATLAB function to represent y(t) using the persistent command. I pass 0 as the initial condition for y(t) when I call my function for the first time. I then use a for loop to update y(t) for 1000 iterations. For some reason my output for y(t), y_out, never changes in size and remains 0. I'm not sure why this is happening. How do I get y(t) to update iteratively as t increases?

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
1

There are 1 answers

1
Cris Luengo On BEST ANSWER

I think you're complicating your program with the persistent variable. I would implement it this way:

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

Because the function is now one line, you could instead use an anonymous function like so:

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

Note how the anonymous function (also called a lambda) captures the value of the variables alpha, beta and delta at the moment it's defined. We don't need to pass these in as function arguments, they've become part of the function.


If you insist on using a persistent variable, you could do it this way:

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