【问题标题】:How to implement the segment function in GEKKO?GEKKO中如何实现segment功能?
【发布时间】:2021-12-14 02:46:15
【问题描述】:

我正在尝试通过 GEKKO 建模和解决非线性优化问题。 目标函数如下:

m.Minimize(k*(w1*abs(x0-L10)+w2*abs(x1-L20))+β*Dindf[0]*(w1*alpha_beta(x0)+w2*alpha_beta(x1)+w1***alpha_beta**(x2)+w2*alpha_beta(x3)) +\
                k*(w1*abs(x2-x0) + w2*abs(x3-x1)+w1*abs(x4-x2) + w2*abs(x5-x3)))

问题是我需要 alpha_beta(x) 函数(写入决策变量,如下所示)是一个段形式,我该如何编写这个函数来解决这个问题?

def alpha_beta(x):
    a = 0.0019727939
    b = 0.0078887
    Lmin, Lnom, Lmax = 0.8035, 2.3811, 3.084
    return np.piecewise(x, [np.logical_and(Lmin <= x, x < Lnom),
                            np.logical_and(Lnom <= x, x <= Lmax)],
                        [lambda x: a * ((x - Lnom)**2) + 0.006226,
                         lambda x: b * ((x - Lnom)**2) + 0.006226, 0])

非常感谢!

【问题讨论】:

    标签: python optimization gekko


    【解决方案1】:

    使用m.if3() Gekko 函数可根据x 的值使用不同的函数。此外,将目标函数中的abs() 函数替换为Gekko 版本的m.abs2()m.abs3()(首选)。这是一个示例脚本。

    from gekko import GEKKO
    
    m = GEKKO()
    x = m.Var(lb=0.8035,ub=3.084)
    
    def alpha_beta(x):
        a = 0.0019727939
        b = 0.0078887
        Lnom = 2.3811
        e1 = a*(x-Lnom)**2 + 0.006226
        e2 = b*(x-Lnom)**2 + 0.006226
        return m.if3(x-Lnom,e1,e2)
        
    m.Minimize(alpha_beta(x)+m.abs3(-x))
    
    m.solve()
    

    这会产生解决方案x=0.8035

     Number of state variables:              9
     Number of total equations: -            6
     Number of slack variables: -            4
     ---------------------------------------
     Degrees of freedom       :             -1
     
     * Warning: DOF <= 0
     ----------------------------------------------
     Steady State Optimization with APOPT Solver
     ----------------------------------------------
    Iter: 1 I: 0 Tm: 0.00 NLPi: 3 Dpth: 0 Lvs: 0 Obj: 8.15E-01 Gap: 0.00E+00
     Successful solution
     
     ---------------------------------------------------
     Solver         :  APOPT (v1.0)
     Solution time  :   1.290000000153668E-002 sec
     Objective      :   0.814635932386315     
     Successful solution
     ---------------------------------------------------
    

    【讨论】:

    • 非常感谢赫登仁教授的指导。我将在我的问题上尝试这个实现。
    • Hedengren教授,我有一个关于m.abs3()的小问题。它的功能与数学 abs() 中的功能相同吗?我不明白为什么以下结果我得到 0? m=GEKKO() m.abs3(-2), m.abs3(2
    • 在调用m.solve() 函数之前,解决方案是象征性的。尝试运行此脚本:from gekko import GEKKO; m = GEKKO(); y = m.Var(); m.Equation(y==m.abs3(-2)); m.solve(); print(y.value[0]) 以获得2 的答案。
    • 成功了,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-07-04
    • 2022-11-12
    • 2021-01-08
    • 2018-07-19
    • 2011-05-24
    • 2011-12-16
    • 2018-05-23
    相关资源
    最近更新 更多