在MATLAB中复制时间相关函数

esyap4oy  于 8个月前  发布在  Matlab
关注(0)|答案(1)|浏览(100)

我尝试在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,.我不应该得到这个。我不知道这里出了什么问题。

sr4lhrrt

sr4lhrrt1#

从简单的开始。输入你看到的每一个计算。使用循环,不要担心效率。cumsum和类似的东西可以在以后出现,如果你的第一次尝试不够快的话。
当我用这种方式将等式转换为代码时,我得到:

beta = 0.3;
delta = 0.8;
gamma = 0.4;
m = 10;
N = 100;

y = zeros(N,1);
% y(0)=0, and also y(-1)=0 etc.
t = 1;
y(t) = gamma * cos(beta * (t-m)) * cos(beta * t) + delta;
for t = 2:N
    v = y(t-1);
    for i = 1:m
        if t-i > 0  % else we add 0
            v = v + y(t-i);
        end
    end
    v = v + gamma * cos(beta * (t-m)) * cos(beta * t) + delta;
    y(t) = v;
end

就是这样。一个循环来计算每个t,还有一个循环来求和。是的,我们可以用对sum的调用来替换内部循环。是的,我们可以通过正确设置循环限制来删除if。有必要吗?不,不是在代码的第一个版本。保持简单。如果够快,你就完了。如果不是,那么您就有一个版本的代码来比较结果,以使其更有效。

相关问题