如何将log base 2与GEKKO(Python)一起使用

如何将log base 2与GEKKO(Python)一起使用,python,optimization,gekko,Python,Optimization,Gekko,我试图用python解决GEKKO的优化问题,我试图用log和sqrt开发一些数学函数,我发现我应该使用GEKKO操作符,而不是使用numpy或数学函数。我想知道如何使用gekko实现log base 2而不是log或log10 gk = GEKKO() gk.log(...) # work gk.sqrt(...) # work gk.log2(...) # does not work! 错误: AttributeError: 'GEKKO' object has no attribute

我试图用python解决GEKKO的优化问题,我试图用log和sqrt开发一些数学函数,我发现我应该使用GEKKO操作符,而不是使用numpy或数学函数。我想知道如何使用gekko实现log base 2而不是log或log10

gk = GEKKO()
gk.log(...) # work
gk.sqrt(...) # work
gk.log2(...) # does not work!
错误

AttributeError: 'GEKKO' object has no attribute 'log2'

相反,您可以使用以下规则更改日志库:

log2(x) = gk.log(x)/gk.log(2)

您不能期望它实现所有的日志库。

您可以在Gekko中创建一个
log2
函数,特别是如果您需要在整个模型中多次使用它

def glog2(x):
返回gk.log(x)/np.log(2)
下面是一个完整的脚本,演示了新的
log2
函数的使用,并显示了与Numpy
log2
函数的一致性

从gekko导入gekko
将numpy作为np导入
#与numpy相比
xnp=np.logspace(-1,4100)
ynp=np.log2(xnp)
gk=GEKKO(远程=False)
x=gk.Param(xnp)
y、 z=gk.Array(gk.Var,2)
#定义一个新的log2函数
def glog2(x):
返回gk.log(x)/np.log(2)
方程(y==glog2(x))
gk.options.IMODE=2;gk.solve(disp=False)
将matplotlib.pyplot作为plt导入
plt.semilogx(xnp,ynp,'b-',lw=4,label=r'$y=\log_2(x)$Numpy')
plt.semilogx(x.value,y.value,'r--',lw=2,label=r'$y=\log_2(x)$Gekko')
plt.legend();plt.xlabel('x');plt.ylabel('y');plt.grid();plt.show()
请注意,
gk.log()
是自然日志,而
gl.log10()
是日志10。