You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

第二版代码的错误分析

核心问题

第二版代码的逻辑完全偏离目标函数:

  1. 匿名函数返回值错误:返回的是 [计算值, t] 行向量,赋值给标量 y_out(t) 时要么报错,要么意外取到t的值(这就是你得到1,2,...序列的原因);
  2. 求和逻辑错误:cumsum(y_in(m+1:end) - y_in(1:end-m)) 和目标函数中“前m个y值求和”的要求完全无关;
  3. 初始条件缺失:没有初始化前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:47:15