【问题标题】:How to use gekko variables as componets of an array?如何使用 gekko 变量作为数组的组件?
【发布时间】:2022-01-19 19:03:28
【问题描述】:

我需要解决一个涉及向量的最小化问题,我正在使用 cern 的根和 Gekko 来尝试解决这个问题。但是我有点需要用 Gekko 变量构建根四向量/三以使操作更容易。

假设我有 x1、x2 和 x3 作为 gekko 变量。我想构建一个类似的数组:

x = ( x1*sin(x2)cos(x3) , x1sin(x2)*sin(x3) , x1 )

这可能吗?我可以用它做手术吗?喜欢:

m.equation(x*x ==20)

最好的问候。

【问题讨论】:

    标签: python gekko minimization


    【解决方案1】:

    这是一个包含三个变量、一个方程和一个点积向量运算的示例:

    from gekko import GEKKO
    import numpy as np
    
    m = GEKKO(remote=False)
    x1,x2,x3 = m.Array(m.Var,3)
    x = [x1*m.sin(x2)*m.cos(x3), \
         x1*m.sin(x2)*m.sin(x3), \
         x1]
    m.Equation(np.dot(x,x)==0)
    m.solve(disp=True)
    print(x1.value,x2.value,x3.value)
    

    当点积为0 时,Gekko 生成解[0,0,0]。当点积为20 时,它会正确报告不可行的解决方案。

     ----------------------------------------------
     Steady State Optimization with APOPT Solver
     ----------------------------------------------
        1  0.00000E+00  0.00000E+00
     Successful solution
     
     ---------------------------------------------------
     Solver         :  IPOPT (v3.12)
     Solution time  :   7.099999987985939E-003 sec
     Objective      :   0.000000000000000E+000
     Successful solution
     ---------------------------------------------------
    

    这里的解决方案细节并不重要,但这只是一个使用数组和向量操作的演示。如果向量非常大,请使用 m.sum() 而不是 sum()。同样,对于大的x 向量,使用m.sum([xi**2 for xi in x]) 而不是np.dot(x,x)

    CERN ROOT 软件包是对 gekko 优化功能的一个很好的补充,可以可视化和探索解决方案。 ROOT 函数可以帮助优化解决方案的预处理和后处理,但可能不能直接在 Gekko 表达式中使用。 Gekko 执行自动微分,为基于梯度的求解器提供精确的一阶和二阶导数信息。大多数其他软件包未配置为提供求解器所需的稀疏矩阵信息或接口。

    【讨论】:

    • 我的问题中有 6 个变量,我用 gekko 变量定义了两个数组:x_l = [x1*m.sin(x3)*m.cos(x5), x1*m.sin (x3)*m.sin(x5), x1] x_l2 = [x2*m.sin(x4)*m.cos(x6), x2*m.sin(x4)*m.sin(x6), x2]我试图用一个 3d numpy 数组做一个 np.dot() ,它返回给我: ValueError: operands could not be broadcast together with shapes (6,) (3,) 。 o 你知道为什么会这样吗?
    • 您能否使用显示错误的最少代码创建一个新问题(类似于我发布的内容)?
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2021-01-07
    • 2020-09-18
    • 2018-06-23
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多