在 MATLAB 中复制瞬态函数

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

我正在尝试在 MATLAB 中复制以下函数:

其中 beta、gamma 和 delta 是常数。

到目前为止我所拥有的如下。求和只能应用于 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 x 99 双精度,而不是应有的 99 x 1 双精度。如何制作 y_out,即我的函数输出 y(t),一个 99 x 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 x 1 矩阵,值为 1,2,3,... 这不是我应该得到的。我不确定这里出了什么问题。

arrays function matlab symbolic-math function-handle
1个回答
0
投票

从简单开始。输入您看到的每个计算。使用循环,不用担心效率。

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
。我们需要吗?不,在代码的第一个版本中没有。把事情简单化。如果这足够快,那么你就完成了。如果不是,那么当您尝试提高效率时,您可以使用一个代码版本来比较结果。

© www.soinside.com 2019 - 2024. All rights reserved.