我正在尝试使用GEKKO开发我的约束,并且需要包括一些数学运算,例如log,coth或sqrt。

我最初使用numpy或mpmath尝试了惯用程序,但我发现使用mekth时,一旦完成m = GEKKO(),我需要使用它们的运算符定义,例如m.wathever(log,...)。

如何发展最好的方法?
更改时是否应该考虑一些问题?

K_t = (1 + m + np.sqrt(1 + m**3)) - mpmath.coth(s/2)  # Ref 2. Same results

最佳答案

使用这些函数的Gekko版本而不是NumPy或Math版本:

gk = GEKKO()
K_t = (1 + m + gk.sqrt(1 + m**3)) - gk.cosh(s/2)/gk.sinh(s/2)


需要Gekko版本是因为运算符重载,以便使用自动微分来计算求解器的一阶和二阶导数。没有coth,因此您需要用coth(x) = cosh(x)/sinh(x)代替。我通常将Gekko模型定义为m=GEKKO(),但是您还有另一个名为m的变量,因此我改用了gk。这是documentation on Model Building Functions中的一部分。

方程函数

GEKKO函数可提供除代数运算符之外的特殊函数。必须使用这些(不是numpy或其他等效函数):


gk.sin(其他)
gk.cos(其他)
gk.tan(其他)
gk.asin(其他)
gk.acos(其他)
gk.atan(其他)
gk.sinh(other)
gk.cosh(其他)
gk.tanh(其他)
gk.exp(其他)
gk.log(其他)
gk.log10(其他)
gk.sqrt(其他)

08-16 23:21