我正在学习将Gekko的大脑模块用于深度学习应用程序。
我一直在建立一个神经网络来学习numpy.cos()函数,然后产生相似的结果。
当我的训练范围是:
x = np.linspace(0,2*np.pi,100)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将范围扩展到以下内容时,模型崩溃了:
x = np.linspace(0,3*np.pi,100)
Run Code Online (Sandbox Code Playgroud)
我需要在神经网络中进行哪些更改以增加模型的灵活性,使其适用于其他范围?
这是我的代码:
from gekko import brain
import numpy as np
import matplotlib.pyplot as plt
#Set up neural network
b = brain.Brain()
b.input_layer(1)
b.layer(linear=2)
b.layer(tanh=2)
b.layer(linear=2)
b.output_layer(1)
#Train neural network
x = np.linspace(0,2*np.pi,100)
y = np.cos(x)
b.learn(x,y)
#Calculate using trained nueral network
xp = np.linspace(-2*np.pi,4*np.pi,100)
yp = b.think(xp)
#Plot results
plt.figure()
plt.plot(x,y,'bo')
plt.plot(xp,yp[0],'r-')
plt.show()
Run Code Online (Sandbox Code Playgroud)
这些是2pi的结果:
这些是3pi的结果:
我试图将三次样条曲线拟合到下面的数据点,当我使用Param类似示例m.x = m.Param(value=np.linspace(-1, 6))或常量时,我有点困惑Const。
import numpy as np
from gekko import GEKKO
xm = np.array([0, 1, 2, 3, 4, 5])
ym = np.array([0.1, 0.2, 0.3, 0.5, 1.0, 0.9])
m = GEKKO()
m.x = m.Param(value=np.linspace(-1, 6))
m.y = m.Var()
m.options.IMODE = 2
m.cspline(m.x, m.y, xm, ym)
m.solve(disp=False)
p = GEKKO()
p.x = p.Var(value=1, lb=0, ub=5)
p.y = p.Var()
p.cspline(p.x, p.y, xm, ym)
p.Obj(-p.y)
p.solve(disp=False)
Run Code Online (Sandbox Code Playgroud) 我目前正在 Python GEKKO 中实施 MINLP 优化问题,以确定三代能源系统的最佳运行策略。由于我将不同代表性日子的所有时期的能源需求视为输入数据,因此基本上我所有的决策变量、中间体等都是二维数组。我怀疑 2D 中间体的声明是我的问题。现在我使用列表理解来声明 2D 中间体,但似乎 python 不能使用这些中间体。此外,误差这个稳态 IMODE 只允许标量值。发生。
每当我像这样使用 GEKKO m.Array 函数时:
e_GT = m.Array(m.Intermediate(E_GT[z][p]/E_max_GT) for z in range(Z) for p in range(P), (Z,P))
它说,GEKKO 对象 m.Intermediate 不能被调用。
如果有人能给我提示,我将不胜感激。
这是完整的代码:
"""
Created on Fri Nov 22 10:18:33 2019
@author: julia
"""
# __Get GEKKO & numpy___
from gekko import GEKKO
import numpy as np
# ___Initialize model___
m = GEKKO()
# ___Global options_____
m.options.SOLVER = 1 # APOPT is MINLP Solver
# …Run Code Online (Sandbox Code Playgroud) 我正在优化的问题是在输电网络中建设发电厂。为此,我在每辆公交车上放置发电厂,并让优化告诉我应该建造哪些发电厂以最大限度地降低运行成本。
为了对植物的放置进行建模,我尝试使用一组二进制变量,如果植物完全被使用,则标记为 1,否则标记为 0。然后在最小化的目标函数中,我将此数组乘以一个常数:USEW。
我进行了多次尝试但没有任何效果。似乎有效的方法是直接在 Obj 中使用if2函数。 Gekko功能。然而我得到了非常奇怪的结果。我的代码有点长,所以我只会发布相关的行,希望这个想法很清楚,如果不是,请告诉我,我会发布整个内容。
bus=node=24
t=24
Sbase=100.
Gen = 12
VOLL = 10000.
VOLW = 50.
USEW = 100.
Pw = m.Array(m.Var,(bus,t), lb=0., ub=0., value=0.)
for b in range(bus):
m.Minimize( np.sum(VOLL*lsh[b,:] + VOLW*Pc[b,:])*Sbase \
+ m.if2(-1.*Sbase*m.sum(Pw[b,:]),1,0)*USEW )
Run Code Online (Sandbox Code Playgroud)
问题出在if2零件上。如果我移除它,我会得到预期的结果,但随后会失去放置哪种植物的决定。我也尝试过,if3但也没有成功。从我看来,优化器似乎正在尝试最小化,Pw[b,:]因为结果仅包含零。以某种方式绕过该if2部分并进入内部sum。
根据文档,这部分:m.if2(-1.*Sbase*m.sum(Pw[b,:]),1,0)应该返回0或,1但似乎没有这样做。我乘以-1因为Pw总是正数,我想检测何时Pw>0。
我需要有关如何为此目的正确使用条件函数的帮助。谢谢
EDIT1 考虑以下情况:
from gekko import GEKKO
m = GEKKO(remote=False)
Sbase=100. …Run Code Online (Sandbox Code Playgroud)