如何使用 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 变量作为数组的组件?的主要内容,如果未能解决你的问题,请参考以下文章