如何使用 gekko 变量作为数组的组成部分?

How to use gekko variables as componets of an array?

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

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

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

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

m.equation(x*x ==20)

此致。

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

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 函数可以帮助优化解决方案的预处理和 post 处理,但可能不能直接在 Gekko 表达式中使用。 Gekko 执行自动微分,为基于梯度的求解器提供精确的一阶和二阶导数信息。大多数其他包未配置为提供稀疏矩阵求解器所需的信息或接口。