我尝试在MATLAB中复制以下函数:
其中β、γ和δ是常数。
到目前为止,我所做的都在下面。求和应仅应用于y(t-i),如以下中的方括号所示:
beta = 0.3;
gamma = 0.5;
delta = 0.2;
m = 10;
N = 100;
y_out = NARMA(beta,delta,gamma,m,N);
function y_out = NARMA(beta,delta,gamma,m,N)
t = 2:N;
y = zeros (N,1);
u = @(t) cos(beta * t);
y = y(t-1) + cumsum(gamma * u(t - m) .* u(t) + delta);
y(m+1:end) = y(m+1:end) - y(1:end-m);
y_out = y;
end
在运行这段代码之后,y_out是一个99乘99的double,而不是一个99乘1的double。我如何使y_out,也就是我的函数输出y(t),成为一个99 × 1的矩阵输出?有更好的办法吗?
更新:我的新尝试如下所示。求和应仅应用于y(t-i),如方括号所示:
close all;
clear all;
clc;
beta = 0.3;
delta = 0.8;
gamma = 0.4;
m = 10
NARMA = @(y_in,t) [y_in + delta + gamma*cos(beta*(t-
m))*cos(beta*t)+cumsum(y_in(m+1:end) - y_in(1:end-m)),t];
N = 100;
y_out = zeros(N,1);
y_out(1) = NARMA(0,0);
for t=2:N
y_out(t) = NARMA(y_out(t-1),t-1);
end
y_out的结果是一个100 × 1的矩阵,值为1,2,3,.我不应该得到这个。我不知道这里出了什么问题。
1条答案
按热度按时间sr4lhrrt1#
从简单的开始。输入你看到的每一个计算。使用循环,不要担心效率。
cumsum
和类似的东西可以在以后出现,如果你的第一次尝试不够快的话。当我用这种方式将等式转换为代码时,我得到:
就是这样。一个循环来计算每个
t
,还有一个循环来求和。是的,我们可以用对sum
的调用来替换内部循环。是的,我们可以通过正确设置循环限制来删除if
。有必要吗?不,不是在代码的第一个版本。保持简单。如果够快,你就完了。如果不是,那么您就有一个版本的代码来比较结果,以使其更有效。