MATLAB中复现时间依赖函数遇维度及计算结果异常问题
MATLAB复现时间依赖函数的问题与修正
目标函数说明
要复现的时间依赖函数为:
$y(t) = \delta + \gamma u(t-m)u(t) + \sum_{i=1}^m y(t-i)$
其中 $u(t) = \cos(\beta t)$,$\beta、\gamma、\delta$ 为常数,$m$ 为求和项数。
第一版代码的维度问题分析与修正
问题根源
第一版代码输出99×99数组的核心原因是向量维度不匹配触发的广播机制:
- 匿名函数
u = @(t) cos(beta * t)返回行向量,而y(t-1)是列向量; - 两者相加时MATLAB会自动广播为99×99矩阵,后续减法操作无法修正维度错误;
- 用
cumsum实现求和的思路完全错误,目标函数是对每个t的前m个y值求和,而非累加所有历史项。
修正后的代码
改用循环实现,逻辑直观且避免维度问题:
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) y = zeros(N,1); % 初始化全0数组 u = @(t) cos(beta * t)'; % 确保返回列向量 % 从t=m+1开始计算,保证t-m >=1 for t = m+1:N % 计算前m个y值的和:sum(y(t-1), y(t-2), ..., y(t-m)) sum_y_terms = sum(y(t-m : t-1)); y(t) = delta + gamma * u(t-m) .* u(t) + sum_y_terms; end y_out = y(2:N); % 输出t=2到N的结果,若要全量结果直接返回y end
第二版代码的错误分析
核心问题
第二版代码的逻辑完全偏离目标函数:
- 匿名函数返回值错误:返回的是
[计算值, t]行向量,赋值给标量y_out(t)时要么报错,要么意外取到t的值(这就是你得到1,2,...序列的原因); - 求和逻辑错误:
cumsum(y_in(m+1:end) - y_in(1:end-m))和目标函数中“前m个y值求和”的要求完全无关; - 初始条件缺失:没有初始化前
m个y值,且循环仅依赖前一个y值,忽略了目标函数中对前m项的依赖。
修正思路
直接抛弃原匿名函数的错误逻辑,改用第一版修正后的循环实现即可。
最优实现方式
推荐用循环实现,递归依赖的模型用循环逻辑最清晰,也便于调试:
% 设定参数 beta = 0.3; gamma = 0.5; delta = 0.2; m = 10; N = 100; % 初始化y数组,前m个值设为0(可根据需求调整初始值) y = zeros(N, 1); % 定义输入函数u(t),确保返回列向量 u = @(t) cos(beta * t)'; % 逐个计算每个t的y值 for t = m+1:N % 计算前m个y值的和 sum_prev_y = sum(y(t - m : t - 1)); % 代入目标函数计算当前y(t) y(t) = delta + gamma * u(t - m) .* u(t) + sum_prev_y; end % 最终输出结果 y_out = y;
关键说明
- 初始的
y(1)到y(m)设为0,是时间序列模型常见的初始条件; - 循环从
t=m+1开始,保证t-m为正整数,u(t-m)有定义; - 所有运算都用列向量,彻底避免维度不匹配问题;
- 求和部分直接取前
m个y值的和,和目标函数完全对应。
内容的提问来源于stack exchange,提问作者Jonathan Frutschy
相关产品推荐
相关产品推荐

