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

GEKKO秒级在线仿真场景下如何配置m.time及更新初始条件

GEKKO 每秒更新在线仿真配置方案

你遇到的变量不更新问题核心是初始条件更新的时机错误,m.time的基础配置符合单步仿真需求,具体修正方法如下:

1. 核心逻辑修正

  • m.time配置:单步跑1秒仿真的场景下,m.time = np.linspace(0,1,2)本身配置正确,两个点分别对应本次仿真的起始时刻和1秒后的结束时刻。如果需要更高的单步仿真精度,可以增加时间点数,比如np.linspace(0,1,11)代表1秒内分10个步长计算,不影响整体1秒的仿真周期。
  • 初始值更新时机:原有代码在m.solve()执行后才更新变量值,本次求解用的还是上一轮的初始值,赋值结果仅对下一轮求解生效,因此看起来变量没有更新。必须把初始值更新逻辑放到m.solve()之前,且取上一轮仿真结果的最后一个点作为本轮初始值。
  • 求解参数优化:添加remote=False本地求解、disp=False关闭求解日志,适配在线仿真的低延迟需求。

2. 修正后代码示例

import numpy as np
import time
from gekko import GEKKO

# 所有模型定义逻辑放到循环外,不要重复定义
m = GEKKO(remote=False)
# 1秒单步仿真时间配置
m.time = np.linspace(0, 1, 2)
# 变量定义,第一次仿真的初始值可以在这里设置
x1 = m.Var(value=0)
x2 = m.Var(value=0)
x3 = m.Var(value=0)
# 替换为你自己的系统方程
m.Equation(x1.dt() == -0.5 * x1 + x2)
m.Equation(x2.dt() == x1 - x2 + x3)
m.Equation(x3.dt() == -x2 - 2 * x3)
# 设置动态仿真模式
m.options.IMODE = 4

simulation_on = True
while simulation_on:
    # 先更新初始条件:取上一轮仿真的最后一个状态作为本轮初始值
    x1.value = x1.value[-1]
    x2.value = x2.value[-1]
    x3.value = x3.value[-1]
    # 执行求解
    m.solve(disp=False)
    # 此处添加你的结果处理、状态打印、业务逻辑代码
    print(f"仿真结果:x1={x1.value[-1]:.3f}, x2={x2.value[-1]:.3f}, x3={x3.value[-1]:.3f}")
    # 和真实时间对齐可选
    time.sleep(1)
    # 此处添加你的仿真停止条件,示例为跑20次后停止
    # if 停止条件触发:
    #     simulation_on = False

3. 注意事项

  • 不要在循环内部重复定义模型、变量、方程,否则会导致模型重复叠加,运行速度越来越慢甚至报错。
  • 如果不需要严格对齐真实时钟,可以去掉time.sleep(1)语句,仿真会以最快速度运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:07