如何将log base 2与GEKKO(Python)一起使用
我试图用python解决GEKKO的优化问题,我试图用log和sqrt开发一些数学函数,我发现我应该使用GEKKO操作符,而不是使用numpy或数学函数。我想知道如何使用gekko实现log base 2而不是log或log10如何将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
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
函数的使用,并显示了与Numpylog2
函数的一致性
从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。