MATLAB 中的复制求和运算符

问题描述 投票:0回答:1

我正在尝试在 MATLAB 中对以下时间相关函数进行建模:

其中 gamma、beta 和 delta 是常数。 我不确定进行求和的最佳方法是什么。我可以制作 u(t) 和 y(t) 函数句柄,但 symsum 只能用于符号。我唯一的选择是使用 for 循环手动添加 y(t-i) 和 u(t-m) 吗?到目前为止,我为生成 y(t) 所做的工作如下所示:

N = 100;
y_out = zeros(N,1);
u = zeros(N,1);

for t = 1:1:N
u(t) = cos(beta*t);
end

y_out(1) = NARMA(beta,delta,gamma,true);
for t=2:N
    y_out(t) = NARMA(beta,delta,gamma);
end


function y_out = NARMA(beta,delta,gamma,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

    for i=1:1:m
    y = y + gamma*u + delta;
    end

    y_out = y;

end

loops matlab iteration symbolic-math function-handle
1个回答
2
投票

这是一个不需要循环的可能解决方案(未经测试):

t = 1:N;
u = @(t) cos(beta * t);
y = cumsum(gamma * u(t - m) .* u(t) + delta);
y(m+1:end) = y(m+1:end) - y(1:end-m);

编辑:

事实证明,上述解决方案是错误的。我认为这是正确的:

u = @(t) cos(beta*t);
y = zeros(N+m, 1);
for t = 1:N
    y(t+m) = sum(y(t:t+m-1)) + gamma * u(t-m) * u(t) + delta;
end
y = y (m+1:end);

编辑2:

通过进一步简化,求和可以简化为简单的 for 循环:

u = @(t) cos(beta*t);
y = zeros(N+m, 1);
e = gamma * u((1:N)-m) .* u(1:N) + delta;
de = diff(e);
y(1+m) = e(1);
for t = 2:N
    y(t+m) = 2 * y(t+m-1) - y(t-1) + de(t-1);
end
y = y (m+1:end);
© www.soinside.com 2019 - 2024. All rights reserved.