在Python中使用Gekko运行时间序列线性优化

问题描述 投票:2回答:1

我正试图在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()
python linear-programming gekko
1个回答
1
投票

如果你是在整个时间范围内进行优化,那么你就会想换成 IMODE=6. 你可能有问题。

m.Obj(sum(E_price[i]*Pc for i in range(8760)))

因为它创建了一个很长的目标表达式。对于动态优化问题,有 IMODE=6 你可以用下面的方法来代替。

m.Obj(E_price*Pc)

Gekko会自动对该表达式中的所有时间点进行求和。这个脚本不是一个完整的例子,所以很难验证哪些地方没有工作。如果你能发布一个最小的、完整的例子来说明问题,那么将更容易提供有用的反馈。有额外的例子在 机器学习和动态优化课程特别是与 经济优化 或部分 其他基准问题.

总结

你可以对一个变量进行求和,例如 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]
© www.soinside.com 2019 - 2024. All rights reserved.