You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在AnyLogic中将时序外部数据关联到系统动力学模型?

AnyLogic系统动力学模型关联外部时序数据的最佳实践

推荐方案:TableFunction优先(原生高效,符合SD连续逻辑)

对于你的列车运营SD模型,TableFunction是关联外部时序数据的最优选择——它原生支持时间插值,无需复杂代码,且能完美适配SD的连续仿真逻辑。以下是分步实现方案:

1. 数据导入与TableFunction配置

  • 导入数据:在Data面板新建Excel FileCSV File组件,选择你的时序数据集,确保Time字段为数值型(单位统一为秒,与仿真时间一致),设置正确的数据起始行。
  • 创建TableFunction:为每个需要关联的字段(如BCP1、Train_Speed)单独创建TableFunction:
    • X轴绑定数据的Time列,Y轴绑定对应字段列;
    • 插值方式选择线性插值(适配0.25秒高频采样,保证平滑过渡)或最近邻插值(严格匹配采样点);
    • 勾选"外插"选项,避免仿真时间超出数据范围时出错。

2. 仿真时间与数据时间戳同步

SD模型的time()函数返回当前仿真时间(单位秒),直接将其作为TableFunction的输入即可实现同步:

  • 新建辅助变量(如current_BCP1),赋值为tableFunction_BCP1(time())
  • 若数据时间戳非从0起始(比如起始时间为100秒),调整输入为tableFunction_BCP1(time() - 100),确保时间轴完全对齐。

3. 存量(Stock)的动态赋值(符合SD逻辑)

SD存量不能直接用TableFunction赋值(违反存量由流量驱动的核心逻辑),可通过调整流量实现存量实时跟踪数据值:

  • 定义目标变量:target_Compressor_Pressure = tableFunction_BCP1(time())
  • 创建调整流量:adjust_Pressure = (target_Compressor_Pressure - Compressor_Pressure) / timeStep()
  • 将该流量连接到Compressor_Pressure存量:每一步仿真中,流量会快速将存量拉至目标值,既符合SD因果结构,又实现了与实测数据的同步。

4. 混合仿真与KPIs计算

将同步后的变量/存量代入SD逻辑计算KPIs:

  • 例如计算Compressor_EffCompressor_Eff = (Compressor_Pressure * Train_Speed) / energy_input(其中Train_Speed来自tableFunction_TrainSpeed(time()));
  • 使用AnyLogic的Output组件或Dataset记录KPIs,模型运行结束后可直接导出为Excel/CSV。

替代方案(特定场景适用)

  • Database(大数据量场景):若数据集过大无法加载到内存,可使用Database组件,通过SQL查询实时获取当前时间对应的数据:
    selectSingleValue("SELECT BCP1 FROM train_data WHERE Time <= ? ORDER BY Time DESC LIMIT 1", time())
    
    注意:频繁查询会降低仿真效率,仅适合超大规模数据集。
  • 自定义Java插值函数:若需特殊插值逻辑(如非线性拟合),可编写Java函数实现时间插值,但无需重复造轮子——TableFunction已覆盖绝大多数场景。

常见问题解决

  • 同步失败:检查数据时间单位与仿真时间是否一致(如数据是分钟,仿真是秒),或TableFunction的X轴输入是否正确使用time()
  • 存量赋值问题:避免直接修改存量值,通过调整流量的方式既符合SD逻辑,又能实现数据同步。

内容的提问来源于stack exchange,提问作者Mohamed Abolezz

火山引擎 最新活动