实现非线性函数 MATLAB 的可变步长

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

我有以下函数,它返回作为时间函数的非线性信号:

function y = NARMA_optimized(u,mu,delta,phi,psi,m,N,k)
y = zeros(N,1);
% y(0)=0, and also y(-1)=0 etc.
t = 1;
y(t) = mu.* u(t-m-k).* u(t-k) + delta;
for t = 2:N
    v = 1;
    for i = 1:m
        if t-i > 0  % else we add 0
            v = v + y(t-i);
        end
    end
    v = phi.*y(t-1) + v.*psi.*y(t-1) + mu.*u(t-m-k).*u(t-k) + delta;
    y(t) = v;
end  
end

要调用该函数,我执行以下操作:

% NARMA Model Comparison
alpha = 0.2;
beta = 0.15;
f_0_i = 1; 
delta = 0.1;
Mu = 1.5;
m = 10;
phi = 0.3;
psi = 0.05;
k_shift = 0;
Sigma = 1;
M = 100; % Upper simulation time limit [seconds]
f = @(t) Sigma.*f_0_i.*sin(alpha.*t).*cos(beta.*t);
dt = 10^-2; % timescale step size [seconds]
t_span = [0:dt:M];
T = NARMA_optimized(f,Mu,delta,phi,psi,m,length(t_span),k_shift);
figure; 
plot(T);

我想更改当前函数的时间刻度以匹配我的时间离散表示,表示为

t_span

我知道这需要对函数进行两个关键更改:

  1. t=0
    开始,而不是
    t=1
  2. 将函数输出
    y
    的更新增加相当于
    dt
    的步长,而不是
    1
    秒。我不确定当前的 for 循环结构是否可以修改以适应这些必要的更改,或者我是否需要从头开始。我知道 MATLAB 从索引 1 开始,而不是索引 0。在循环中从索引 0 开始“开始”的解决方法如下:
dt = 10^-2; % [seconds]
M = 100; % [seconds]
t_span = [0:dt:M];
for t=1:numel(t_span)
y(t) = [insert value here]
end

我不确定这是否是他们解释

dt
并从新函数中的索引 0 开始的最佳方式。

function matlab nonlinear-functions function-handle discretization
1个回答
0
投票

您可以直接将

t_span
传递到函数中。如果您愿意,实时时间将用于
u
f
。然后为
index
循环定义一个
for
;这个
index
将用于
y

function y = NARMA_optimized(u,mu,delta,phi,psi,m,t_span,k)
y = zeros(length(t_span),1);
% y(0)=0, and also y(-1)=0 etc.
%t = 1;
t = t_span(1);
index = 1;
y(index) = mu.* u(t-m-k).* u(t-k) + delta;
for t = t_span(2:end)
    index = index + 1;
    v = 1;
    for i = 1:m
        if index-i > 0  % else we add 0
            v = v + y(index-i);
        end
    end
    v = phi.*y(index-1) + v.*psi.*y(index-1) + mu.*u(t-m-k).*u(t-k) + delta;
    y(index) = v;
end  
end

在主代码中更改以下内容:

M = 1; % Upper simulation time limit [seconds]
T = NARMA_optimized(f,Mu,delta,phi,psi,m,t_span,k_shift);
plot(t_span,T);    

这是输出: enter image description here

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