如何在GEKKO中实现分段函数alpha_beta用于非线性优化求解?
GEKKO实现分段二次函数的方案
核心说明
numpy的np.piecewise仅支持数值运算,无法处理GEKKO的符号决策变量,需要用GEKKO内置的条件函数m.if3实现分段逻辑,该函数支持自动微分,完全兼容优化求解流程。
实现代码
def alpha_beta_gekko(m, x): a = 0.0019727939 b = 0.0078887 Lmin, Lnom, Lmax = 0.8035, 2.3811, 3.084 # 区间外返回0,区间内返回1 in_range = m.if3(x - Lmin, 0, m.if3(x - Lmax, 1, 0)) # 区间内分段计算二次函数值 range_val = m.if3(x - Lnom, a * (x - Lnom)**2 + 0.006226, b * (x - Lnom)**2 + 0.006226) return in_range * range_val
调用方式
目标函数中直接替换原alpha_beta调用即可,示例:
m.Minimize(k*(w1*abs(x0-L10)+w2*abs(x1-L20))+β*Dindf[0]*(w1*alpha_beta_gekko(m,x0)+w2*alpha_beta_gekko(m,x1)+w1*alpha_beta_gekko(m,x2)+w2*alpha_beta_gekko(m,x3)) +\ k*(w1*abs(x2-x0) + w2*abs(x3-x1)+w1*abs(x4-x2) + w2*abs(x5-x3)))
注意事项
- 建议给对应决策变量设置边界约束,比如
x.LOWER = Lmin、x.UPPER = Lmax,缩小求解搜索空间,提升收敛效率 - 若你的求解场景对整数变量敏感,也可以预先在
[Lmin, Lmax]区间内采样足够多的点,用GEKKO的m.pwl()方法拟合该分段函数,完全规避二进制变量
内容的提问来源于stack exchange,提问作者Jian ZUO
相关产品推荐
相关产品推荐

