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

使用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])

关键修改说明

  1. 数据类型适配:通过m.Param()将Pandas Series的数值数组转换为GEKKO参数,这是GEKKO识别的合法输入类型。
  2. 对象初始化顺序:必须先创建GEKKO模型对象m,再定义基于m的参数,否则会抛出初始化错误。
  3. 运算一致性:所有涉及x1、x2的运算均与GEKKO变量、中间变量结合,避免跨类型运算冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:32:52