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

Gekko技术问题:数组结果提取、本地求解报错及IMODE算法咨询

问题1:结果提取错误及解决

错误原因

代码中ydata[:] = np.array(dist[frame].VALUE)逻辑错误:dist是包含N个Gekko变量的数组,每个dist[i]对应一个年龄组的人口随时间变化的变量,其.VALUE属性存储的是该变量所有时间步的结果(形状为(Ndt,))。而frame是时间步索引,需要的是所有N个变量在第frame个时间步的取值,而非第frame个变量的所有时间步值。

修改方案

修改update函数的取值逻辑,遍历所有N个dist变量,提取每个变量在当前frame时间步的结果:

def update(frame):
    ax.clear()
    # 提取所有年龄组在当前时间步的数值
    ydata = np.array([d.VALUE[frame] for d in dist])
    ax.plot(np.arange(len(ydata)), ydata)
    
    ax.set_xlim(0, len(dist))
    ax.set_ylim(0, np.amax(ydata))
    ax.set_xlabel('年龄组')
    ax.set_ylabel('人口数量')
    ax.set_title(f'人口分布动画 时间: {m.time[frame]:.1f}')

同时修正原代码中frame*5的时间计算错误,直接用m.time[frame]获取实际模拟时间。

问题2:本地求解内存不足及解决

错误原因

本地APMonitor版本存在内存限制,模型设置Ndt = tf*1000 = 100000个时间步,导致联立方程系统规模过大(每个时间步400个变量+400个方程,总规模达千万级),超出本地Fortran程序的内存分配上限,求解失败后无法生成options.json和results.json文件。

解决方案

  1. 减少时间步数量:降低Ndt,比如设置Ndt = tf*100 = 10000,在保证动画流畅度的同时减少内存占用。
  2. 使用远程求解:保持m = GEKKO(remote=True),远程服务器具备更高的内存和计算资源,可处理更大规模的模型。
  3. 切换IMODE=7:IMODE=7采用序贯求解器,内存占用远低于IMODE=4的联立求解,适合大时间步的动态模拟(具体见第三个问题说明)。
问题3:IMODE=4和IMODE=7的底层算法
  • IMODE=4(动态模拟,联立求解):将微分方程通过数值离散化(如正交配置法)转化为代数方程的联立系统,把整个时间范围内的所有变量作为优化变量,用非线性规划求解器(默认IPOPT)求解整个系统。精度高但内存占用大,适合小规模时间步的模拟。
  • IMODE=7(动态模拟,序贯求解):采用ODE求解器(如CVODES),逐个时间步推进求解,每次仅处理当前时间步的变量和方程,内存占用远低于IMODE=4。适合大规模时间步的模拟,或内存有限的本地环境。

内容的提问来源于stack exchange,提问作者Claquettes-Sandales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:09:24