我一直在try 学习如何使用Gekko,目前正在try 根据输入/输出价格建立最佳电池充电/放电模型(灵感来自herehere).

下面是我的代码.

from gekko import Gekko
import numpy as np
m = Gekko()

electricity_price_in = np.random.uniform(low=0.1, high=1, size=50)
electrictiy_price_out = np.random.uniform(low=0.3, high=3, size=50)


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_in = m.Param(electricity_price_in)
E_price_out = m.Param(electrictiy_price_out)
m.time = np.linspace(0,49, 50)

Revenue =  m.Intermediate(Pd*E_price_out)
Cost = m.Intermediate(Pc*E_price_in)

m.Equation(E_battery.dt() == Pc-Pd)
m.Equation(E_battery >= 0)

m.Maximize(Revenue - Cost)
m.options.IMODE = 6
m.solve()

这似乎工作正常.但是,如果包含以下代码,我会得到非常不同的结果:

isCharging = m.if3(-Pc,1,0)
isDischarging = m.if3(-Pd,1,0)

我正在做的是创建两个变量.由于它们不是约束方程,也不包含在目标函数中,我原本希望包含这些不会对我的结果产生任何更改,但是我的代码给出了非常不同的结果(所有变量都变成了一个零列表).

为什么添加这两个变量会改变我的结果?

推荐答案

m.if3()函数将默认解算器从IPOPT更改为APOPT,以便可以解决混合整数优化问题.APOPT solver发现了一个不同(更差)的局部解,因此您看到了差异.

此外,随机数生成器每次都需要一个种子值来给出相同的结果,例如np.random.seed(1).与m.if3()函数相关的附加变量和方程也可能需要更多的迭代.try 对用IPOPT解决方案初始化的APOPT使用热启动.

无论m.if3()条语句是否存在,该脚本都给出了相同的答案.

from gekko import Gekko
import numpy as np
m = Gekko()

np.random.seed(1)
electricity_price_in = np.random.uniform(low=0.1, high=1, size=50)
electrictiy_price_out = np.random.uniform(low=0.3, high=3, size=50)

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_in = m.Param(electricity_price_in)
E_price_out = m.Param(electrictiy_price_out)
m.time = np.linspace(0,49, 50)

Revenue =  m.Intermediate(Pd*E_price_out)
Cost = m.Intermediate(Pc*E_price_in)

m.Equation(E_battery.dt() == Pc-Pd)
m.Equation(E_battery >= 0)

m.Maximize(Revenue - Cost)

isCharging = m.if3(-Pc,1,0)
isDischarging = m.if3(-Pd,1,0)

m.options.IMODE = 6

m.options.SOLVER = 3
m.solve(disp=False)
print('Objective (IPOPT)', m.options.objfcnval)

m.options.TIME_SHIFT = 0
m.options.SOLVER = 1
m.solve()
print('Objective (APOPT)', m.options.objfcnval)

Python相关问答推荐

如何从具有不同len的列表字典中创建摘要表?

什么相当于pytorch中的numpy累积ufunc

PyQt5,如何使每个对象的 colored颜色 不同?'

在极性中创建条件累积和

将输入聚合到统一词典中

索引到 torch 张量,沿轴具有可变长度索引

名为__main__. py的Python模块在导入时不运行'

在代码执行后关闭ChromeDriver窗口

为什么调用函数的值和次数不同,递归在代码中是如何工作的?

使用类型提示进行类型转换

如何重新组织我的Pandas DataFrame,使列名成为列值?

删除Dataframe中的第一个空白行并重新索引列

有没有一种方法可以在朗肯代理中集成向量嵌入

我如何处理超类和子类的情况

如何在Polars中创建条件增量列?

使用pythonminidom过滤XML文件

如何在Python中画一个只能在对角线内裁剪的圆?

3.我无法找到制作这种三角形图案的方法

如何在函数签名中输入数据类字段

Pandas:根据系列词典中的值筛选行