如何使用 gekko 变量作为数组的组件?

Posted

技术标签:

【中文标题】如何使用 gekko 变量作为数组的组件?【英文标题】:How to use gekko variables as componets of an array? 【发布时间】: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)

最好的问候。

【问题讨论】:

【参考方案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 你知道为什么会这样吗? 您能否使用显示错误的最少代码创建一个新问题(类似于我发布的内容)?

以上是关于如何使用 gekko 变量作为数组的组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 gekko 对象插入/附加到现有列表/数组?

如何使用gekko解决ini方程问题?

如何在 GEKKO 中级中使用 np.log 或 np.exp

GEKKO 变量实时更新

Gekko 中间变量,错误:不等式或不等式的方程

如何使用 R reticulate 安装 gekko 包?