Python Gekko轨迹重规划代码报错KeyError: 'v2',如何解决?
Gekko轨迹重规划代码KeyError问题解决
错误原因
你在同一个Gekko模型实例m的循环内反复创建新的CV变量v并多次调用solve(),导致模型内积累了多个自动命名的变量(如v1、v2等),Gekko后续求解时无法正确识别这些动态生成的变量,引发KeyError: 'v2'。
解决方法
方法1:每次循环创建新模型实例
将Gekko模型初始化放到循环内部,确保每次求解都是独立的全新模型,避免变量积累:
from gekko import GEKKO point = [40,20,10,35] traject= [1,30,60,100] # 预先定义模型参数 mass = 10 b = 0.5 K = 2.0 for i in range(len(point)): m = GEKKO() # 每次循环新建模型 # 定义操纵变量(根据实际需求调整) p = m.MV(value=0) p.STATUS = 1 # 被控变量配置 v = m.CV(value=0) v.STATUS = 1 v.TAU = 5 m.options.CV_TYPE = 2 m.options.IMODE = 6 v.SP = point[i] v.TR_INIT = traject[i] # 过程模型方程 m.Equation(mass*v.dt() == -v*b + K*b*p) m.solve(disp=False)
方法2:复用模型但每次求解后清空状态
如果需要复用同一个模型框架,每次求解后调用m.clear()清空所有变量、方程和配置,再重新定义:
from gekko import GEKKO m = GEKKO() point = [40,20,10,35] traject= [1,30,60,100] mass = 10 b = 0.5 K = 2.0 for i in range(len(point)): m.clear() # 清空模型状态 p = m.MV(value=0) p.STATUS = 1 v = m.CV(value=0) v.STATUS = 1 v.TAU = 5 m.options.CV_TYPE = 2 m.options.IMODE = 6 v.SP = point[i] v.TR_INIT = traject[i] m.Equation(mass*v.dt() == -v*b + K*b*p) m.solve(disp=False)
方法3:一次性定义完整轨迹(更符合MPC逻辑)
将多个轨迹点整合为一条完整的设定点轨迹,单次完成MPC求解,这是更规范的MPC应用方式:
from gekko import GEKKO import numpy as np m = GEKKO() m.time = np.linspace(0, 100, 101) # 覆盖所有轨迹时间点 point = [40,20,10,35] traject= [1,30,60,100] # 生成完整设定点轨迹 sp = np.zeros(len(m.time)) for i in range(len(point)): # 找到对应时间点的索引 idx = np.argmin(np.abs(m.time - traject[i])) sp[idx:] = point[i] # 参数与变量定义 mass = 10 b = 0.5 K = 2.0 p = m.MV(value=0) p.STATUS = 1 v = m.CV(value=0) v.STATUS = 1 v.TAU = 5 m.options.CV_TYPE = 2 m.options.IMODE = 6 v.SP = sp # 传入完整轨迹 v.TR_INIT = 0 # 过程模型 m.Equation(mass*v.dt() == -v*b + K*b*p) m.solve(disp=True)
内容的提问来源于stack exchange,提问作者Limin M
相关产品推荐
相关产品推荐

