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

GEKKO中基于线性插值的参数动态优化问题

GEKKO动态优化中仅优化关键时间点参数并自动线性插值的解决方案

问题背景

需要在GEKKO中求解刚性ODE的动态优化问题:仅针对5个关键时间点优化参数k(t)的值,同时ODE积分过程中自动将k(t)线性插值到所有积分时间点,避免因优化全量时间点参数导致的计算成本过高(真实场景为15个关键点对应150个积分点)。直接将MV设置为关键点长度时会触发Data arrays must have the same length错误。

解决方案

使用GEKKO的**分段线性样条(pspline)**功能,将关键时间点的k值设为优化变量(MV),通过pspline自动完成从关键点到积分时间点的线性插值,仅需优化5个变量即可满足需求。

完整代码示例

from gekko import GEKKO
import numpy as np

# 关键时间点与初始参数值
kt = np.array([0, 0.2, 0.45, 0.75, 1.0])
kv_init = np.array([0.5, 1.0, 0.2, 1.2, 1.0])

# 初始化模型
m = GEKKO()
# 设置ODE积分所需的时间点(保持原11个点)
m.time = np.linspace(0, 1, 11)

# 关键时间点作为固定参数
t_key = m.Param(value=kt)
# 关键时间点的k值作为优化变量(MV),共5个优化自由度
k_key = m.MV(value=kv_init, lb=0, ub=2)
k_key.STATUS = 1  # 允许求解器优化这些变量

# 使用pspline实现分段线性插值,得到全时间点的k(t)
k = m.Var(value=np.interp(m.time, kt, kv_init))
m.pspline(t_key, k_key, m.Param(value=m.time), k, bound_x=False)

# 定义ODE方程
x = m.Var(value=0)
m.Equation(x.dt() == k)

# 设置优化目标(原需求为最小化x)
m.Minimize(x)

# 配置动态优化模式
m.options.IMODE = 6
m.solve(disp=False)

# 结果可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(5,2.5))
plt.plot(kt, kv_init, 'bo-', label='初始k数据')
plt.plot(kt, k_key.value, 'rs-', label='优化后k关键点')
plt.plot(m.time, k.value, 'rx-', label='k插值结果')
plt.plot(m.time, x.value, 'k-', label='x')
plt.legend(); plt.grid()
plt.show()

代码解释

  1. 关键变量定义:

    • t_key:固定的关键时间点参数,不参与优化
    • k_key:长度为5的MV数组,对应每个关键时间点的k值,是唯一的优化变量
  2. 分段线性插值:

    • m.pspline()函数实现从关键时间点到积分时间点的分段线性插值,bound_x=False允许积分时间点覆盖关键时间点的全区间
  3. 优化配置:

    • IMODE=6启用动态优化模式,求解器仅需优化5个k_key变量,大幅降低计算成本,同时保证ODE积分使用全时间点的插值k值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:44:59