GEKKO自定义函数引入pandas数据时报无等式/不等式错误求助
问题根因
- 你在约束函数中直接使用GEKKO符号变量执行pandas匹配查询,pandas无法识别GEKKO的符号变量类型,
df.loc[df['integer'] == xi]不会返回你预期的目录数值,而是无效对象,最终约束函数返回的不是GEKKO可识别的等式/不等式表达式,触发报错。 - 你定义的
x是SOS1类型的符号变量,在模型编译阶段不会代入实际数值,所有涉及变量的逻辑必须使用GEKKO内置的符号运算实现,不能使用普通Python条件判断、pandas查询这类仅支持数值运算的逻辑。 - 原有代码中初始值赋值写法错误:
x[i] = ig[i]会直接把GEKKO变量对象覆盖为普通数值,导致后续模型调用出错。
修复方案
将pandas查表逻辑替换为GEKKO内置的if3符号条件运算实现映射,提前从DataFrame中提取映射常量,修复初始值赋值写法,修改后可运行代码如下:
# libraries in use from gekko import GEKKO import pandas as pd # building GEKKO model m = GEKKO() integer=[1,2] x=[m.sos1(integer) for i in range(len(integer))] # example dataframe data=[[1,5],[2,10]] df = pd.DataFrame(data, columns = ['integer', 'catalogue']) # 提前提取映射常量 val_1 = df.loc[df['integer'] == 1, 'catalogue'].item() val_2 = df.loc[df['integer'] == 2, 'catalogue'].item() def obj(x,a): return a*x[0]**2-4*x[1]*x[0]**2+x[1]**2+x[0]**2-x[0]+1 def con(x,a): r = [] for xi in x: # 用GEKKO内置if3实现符号条件映射:
相关产品推荐
相关产品推荐

