GEKKO动态模型增量求解异常:仿真变量间隔重置求助
问题原因与解决方案
你的代码中变量在每个时间间隔重置的原因是没有将上一个求解阶段的最终状态作为下一个阶段的初始条件。每次调用solve()时,Gekko会使用变量最初定义的初始值(如OP = m.Var(value=0.0)中的0.0)重新开始仿真,而非延续上一阶段的结果。
修正后的代码
import numpy as np from gekko import GEKKO import matplotlib.pyplot as plt m = GEKKO() tf = 40 timesteps = np.linspace(0, tf, 2*tf+1) step = np.zeros(2*tf+1) step[3:40] = 2.0 step[40:] = 5.0 # Controller model Kc = 15.0 # controller gain tauI = 2.0 # controller reset time tauD = 1.0 # derivative constant OP_0 = m.Const(value=0.0) # OP bias OP = m.Var(value=0.0) # controller output PV = m.Var(value=0.0) # process variable SP = m.Param(value=step) # set point Intgl = m.Var(value=0.0) # integral of the error err = m.Intermediate(SP-PV) # set point error m.Equation(Intgl.dt()==err) # integral of the error m.Equation(OP == OP_0 + Kc*err + (Kc/tauI)*Intgl - PV.dt()) # Process model Kp = 0.5 # process gain tauP = 10.0 # process time constant m.Equation(tauP*PV.dt() + PV == Kp*OP) setpoint_final = [] pv_final = [] output_final = [] for i in range(8): # 设置当前阶段的时间范围和设定值 m.time = timesteps[10*i:10*(i+1)] SP.value = step[10*i:10*(i+1)] # 求解当前阶段 m.options.IMODE=7 m.solve(disp=False) # 保存结果 setpoint_final.append(SP.value) pv_final.append(PV.value) output_final.append(OP.value) # 将当前阶段的最终状态作为下一个阶段的初始条件 OP.value = OP.value[-1] PV.value = PV.value[-1] Intgl.value = Intgl.value[-1] plt.figure() plt.subplot(2,1,1) plt.plot(timesteps[:-1], np.concatenate(output_final), 'b:', label='OP') plt.ylabel('Output') plt.legend() plt.subplot(2,1,2) plt.plot(timesteps[:-1], np.concatenate(setpoint_final), 'k-', label='SP') plt.plot(timesteps[:-1], np.concatenate(pv_final), 'r--', label='PV') plt.xlabel('Time (sec)') plt.ylabel('Process') plt.legend() plt.show()
关键修改点
- 状态延续:在每次求解完成后,将
OP、PV、Intgl的最终值(value[-1])赋值给变量本身,作为下一次求解的初始条件。这样就能实现状态在不同阶段之间的连续传递。 - 时间与设定值更新:保持原有的时间区间和设定值分段逻辑,确保每个阶段使用正确的输入数据。
这种增量求解的方式在Gekko中完全可行,非常适合需要在仿真过程中插入外部动态参数(如随机生成的参数)的场景。你可以在每次循环中根据外部模型生成新的参数(如修改Kp、Kc等),再执行求解即可。
内容的提问来源于stack exchange,提问作者Kobi
相关产品推荐
相关产品推荐

