使用Gekko进行非线性优化时遇TypeError错误求助
解决GEKKO TypeError: x must be a python list of GEKKO parameters, variables, or expressions
错误根源
触发该类型错误的核心原因是:代码中的x1和x2是Pandas Series对象,而GEKKO的运算API(如m.exp()、m.sum())仅支持GEKKO原生的参数、变量或表达式作为输入,直接混用Pandas数据结构会导致类型校验失败。
修正步骤
将输入数据转换为GEKKO参数类型,并确保所有运算基于GEKKO对象执行,以下是修正后的完整代码:
import numpy as np import pandas as pd from gekko import GEKKO x0 = [0,1,2,3,4] x1 = [5,6,7,8,9] x2 = [4,3,2,1,0] y = pd.DataFrame({'x0':x0,'x1':x1,'x2':x2}) # 先初始化GEKKO模型 m = GEKKO(remote=False) # 将Pandas Series转为GEKKO参数(必须基于已创建的m对象) x1 = m.Param(y.iloc[:,1].values) x2 = m.Param(y.iloc[:,2].values) M1 = 55.0 TM1 = 0.005 S1=6.0 TS1=0.005 M2 = 0.64 TM2 = 0.0005 n = len(x1) a0,a1,a2,a3,a4 = m.Array(m.Var,5,lb=-300,ub=300) b1,b2 = m.Array(m.Var,2,lb=-500,ub=500) # 用GEKKO对象定义中间变量w,确保所有运算符合GEKKO要求 w = m.Intermediate(m.exp(a0 + a1*x1 + a2*x1**2 + a3*x1**3 + a4*x1**4 + b1*x2)) # 约束方程保持原有数学逻辑,仅确保操作数均为GEKKO对象 m.Equation(m.abs3(m.sum(w*x1)/m.sum(w)-M1) <= TM1) m.Equation(m.abs3(m.sqrt(m.sum(w*(x1-M1)**2)/(n-1))-S1) <= TS1) m.Equation(m.abs3(m.sum(w*x2)/m.sum(w)-M2) <= TM2) m.Equation(m.sum(w)==n) m.Minimize(m.sum(w**2)) m.solve() print(a0.value[0],a1.value[0],a2.value[0],a3.value[0],a4.value[0]) print(b1.value[0])
关键修改说明
- 数据类型适配:通过
m.Param()将Pandas Series的数值数组转换为GEKKO参数,这是GEKKO识别的合法输入类型。 - 对象初始化顺序:必须先创建GEKKO模型对象
m,再定义基于m的参数,否则会抛出初始化错误。 - 运算一致性:所有涉及
x1、x2的运算均与GEKKO变量、中间变量结合,避免跨类型运算冲突。
内容的提问来源于stack exchange,提问作者Jonathan A
相关产品推荐
相关产品推荐

