在 Python 到 运行 时间序列线性优化中使用 Gekko
Using Gekko in Python to run time series linear optimization
我正在尝试 运行 Gekko 中的电力套利模型。我有一个一年中每个小时(总小时数为 8760 小时)的电价数组,一个能量大小为 E 的电池,每个小时我都想根据电费最小化来决定是给电池充电还是放电,以及跟踪电池中的能量,限制为不低于 0 且不高于 E。
我试过很多次了,最近一次出现优化方程超出限制的错误
from gekko import Gekko
m = Gekko()
#variables
E_battery = m.Var(lb=0, ub=366.2, value=0) #energy in battery at time t, battery size 366 MWh
Pc = m.Var(lb=0, ub=50) #charge power, 50 MW max
Pd = m.Var(lb=0, ub=36.6) #discharge power, max 36 MW
E_price = m.Param(electricity_price[:,1])
m.time = np.linspace(0,8759, 8760)
m.Equation(E_battery.dt() == (1-delta)*E_battery + roundtrip_eff*(Pc - Pd))
m.Obj(sum(E_price[i]*Pc for i in range(8760)))
m.options.IMODE = 7
m.solve()
如果您在整个时间范围内进行优化,那么您需要切换到 IMODE=6
。您可能遇到以下问题:
m.Obj(sum(E_price[i]*Pc for i in range(8760)))
因为它创建了一个非常长的 objective 表达式。对于 IMODE=6
的动态优化问题,您可以使用以下代替:
m.Obj(E_price*Pc)
Gekko 自动对该表达式中的所有时间点求和。该脚本不是一个完整的示例,因此很难验证什么不起作用。如果您可以 post 一个显示问题的最小且完整的示例,那么提供有用的反馈会更容易。 machine learning and dynamic optimization course, especially with economic optimization or some of the other benchmark problems 中还有其他示例。
求和
您可以将诸如 E_battery
的变量与以下内容相加:
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote=False)
m.time = [0,1,2,3,4,5]
x = m.Param(value=m.time)
E_battery = m.Var()
m.Equation(E_battery.dt()==x)
m.options.IMODE = 4
m.solve(disp=False)
print('x = ' + str(x.value))
print('E_battery = ' + str(E_battery.value))
这产生了解决方案:
x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
E_battery = [0.0, 1.0, 3.0, 6.0, 10.0, 15.0]
我正在尝试 运行 Gekko 中的电力套利模型。我有一个一年中每个小时(总小时数为 8760 小时)的电价数组,一个能量大小为 E 的电池,每个小时我都想根据电费最小化来决定是给电池充电还是放电,以及跟踪电池中的能量,限制为不低于 0 且不高于 E。
我试过很多次了,最近一次出现优化方程超出限制的错误
from gekko import Gekko
m = Gekko()
#variables
E_battery = m.Var(lb=0, ub=366.2, value=0) #energy in battery at time t, battery size 366 MWh
Pc = m.Var(lb=0, ub=50) #charge power, 50 MW max
Pd = m.Var(lb=0, ub=36.6) #discharge power, max 36 MW
E_price = m.Param(electricity_price[:,1])
m.time = np.linspace(0,8759, 8760)
m.Equation(E_battery.dt() == (1-delta)*E_battery + roundtrip_eff*(Pc - Pd))
m.Obj(sum(E_price[i]*Pc for i in range(8760)))
m.options.IMODE = 7
m.solve()
如果您在整个时间范围内进行优化,那么您需要切换到 IMODE=6
。您可能遇到以下问题:
m.Obj(sum(E_price[i]*Pc for i in range(8760)))
因为它创建了一个非常长的 objective 表达式。对于 IMODE=6
的动态优化问题,您可以使用以下代替:
m.Obj(E_price*Pc)
Gekko 自动对该表达式中的所有时间点求和。该脚本不是一个完整的示例,因此很难验证什么不起作用。如果您可以 post 一个显示问题的最小且完整的示例,那么提供有用的反馈会更容易。 machine learning and dynamic optimization course, especially with economic optimization or some of the other benchmark problems 中还有其他示例。
求和
您可以将诸如 E_battery
的变量与以下内容相加:
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote=False)
m.time = [0,1,2,3,4,5]
x = m.Param(value=m.time)
E_battery = m.Var()
m.Equation(E_battery.dt()==x)
m.options.IMODE = 4
m.solve(disp=False)
print('x = ' + str(x.value))
print('E_battery = ' + str(E_battery.value))
这产生了解决方案:
x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
E_battery = [0.0, 1.0, 3.0, 6.0, 10.0, 15.0]