基于GEKKO的Python非线性优化:权重上限约束报错修复
修复Gekko权重约束代码错误
错误原因分析
- 重复变量命名报错:原代码中
wmax的写法不符合Gekko语法规范,直接用<=生成的不是可识别的优化表达式,试图将这些无效表达式求和等于n的操作,会导致Gekko内部变量命名冲突。 - 约束逻辑冗余:原约束
((n/m.sum(w))*w[i])<=2.5,结合已有的m.sum(w)==n,可直接简化为w[i] <=2.5,无需额外计算n/m.sum(w)。
修复后的代码
import numpy as np import pandas as pd from gekko import GEKKO x1 = pd.DataFrame([1,5,2,3,2,5,2,6, 8,4,9,9,7,5,2,4]).iloc[:,0] m = GEKKO(remote=False) M1 = 5 TM1 = 0.05 S1 = 3 TS1 = 0.05 n = len(x1) a0,a1,a2,a3,a4 = m.Array(m.Var,5,lb=-500,ub=500) # 定义权重w,保留原表达式 w = [m.Intermediate(m.exp(a0+a1*x1[i] +a2*x1[i]**2 +a3*x1[i]**3 +a4*x1[i]**4)) for i in range(n)] # 定义辅助变量 w2 = [w[i]**2 for i in range(n)] wx1 = [w[i]*x1[i] for i in range(n)] wx1M1 = [w[i]*(x1[i]-M1)**2 for i in range(n)] # 添加均值约束 m.Equation(m.abs3(m.sum(wx1)/n - M1) <= TM1) # 添加标准差约束 m.Equation(m.abs3(m.sqrt(m.sum(wx1M1)/(n-1)) - S1) <= TS1) # 权重和为n的约束 m.Equation(m.sum(w) == n) # 直接为每个权重添加上限≤2.5的约束 for wi in w: m.Equation(wi <= 2.5) # 最小化权重平方和 m.Minimize(m.sum(w2)) m.options.SOLVER = 1 m.solve() # 输出结果 print("优化后的权重:") for i, wi in enumerate(w): print(f"w[{i}] = {wi.value[0]:.4f}")
关键修改点
- 移除错误的
wmax列表及对应求和约束,替换为遍历每个w[i]直接添加wi <=2.5的约束,符合Gekko优化表达式规范。 - 利用已有的
sum(w)==n简化约束逻辑,避免冗余计算。 - 添加结果输出代码,方便查看求解后的权重值。
内容的提问来源于stack exchange,提问作者Jonathan A
相关产品推荐
相关产品推荐

