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

基于GEKKO的Python非线性优化:权重上限约束报错修复

修复Gekko权重约束代码错误

错误原因分析

  1. 重复变量命名报错:原代码中wmax的写法不符合Gekko语法规范,直接用<=生成的不是可识别的优化表达式,试图将这些无效表达式求和等于n的操作,会导致Gekko内部变量命名冲突。
  2. 约束逻辑冗余:原约束((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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:38:16