我正在尝试使用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(其他)