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
相关产品推荐
相关产品推荐

