Matlab linprog约束:如何同时停止充电和放电存储



我对matlab linprog代码有问题。优化函数是24个周期的总成本,仅考虑锅炉的燃料成本。

模拟目的:

优化由锅炉、热需求和储热系统组成的系统24小时运行的储热系统的充放电行为。天然气价格随时间变化。

问题:

如果TES是理想的(效率=100%),我没有限制系统同时充电和放电。我不能用一个变量来描述充电和放电。我确实需要它们分开

目前,我有以下限制来描述最小/最大充电/放电速率(当然还有其他一些):

maxChargeThermalTES>=ChargeThermalTES<=0
maxDischargeThermalTES >= DischargeThermalTES <=0

在linprog的约束下,有可能实现以下逻辑规则吗

if ChargeThermalTES<0,
   DischargeThermalTES=0
end

所有方法,例如使用二进制变量(用于描述系统是否正在充电或放电)都不起作用,因为二进制变量总是取决于优化的输出。

在线性编程中不能强制执行这样的逻辑规则。

然而,你可以做的是:

1\在没有这个约束的情况下求解线性程序。获取目标函数的最优成本(将其命名为OldCost)。

2\然后以这种方式更改您的线性程序:

  • 添加一个约束:旧的目标函数应该在OldCost*(1-Epsilon)和OldCost*

  • 要最小化的新目标函数是ChargeThermalTES+DischargeThermalTES。

干杯

是的,这是可能的。您可以使用一个0-1二进制变量和Big-M将If Then条件添加到linprog

实现逻辑规则:

if ChargeThermalTES<0,
   DischargeThermalTES=0
end

条件:如果ChargeThermalTES<0,然后放电热TES=0

让我们介绍一个二进制变量y

所以我们可以将条件重写为

ChargeThermalTES - M y < 0

这意味着

if y = 0, then DischargeThermalTES must be = 0
if y=1, DischargeThermalTES can be anything

让我们把equal to约束分解成两个不等式

DischargeThermalTES < M y
DischargeThermalTES > -M y

如果y=1,则上述两者基本上不具有约束力。

如果y=0,它将强制DischargeThermalTES变为0。

因此,结合以下约束,可以将逻辑约束强制应用于线性程序。

 ChargeThermalTES - M y < 0
 DischargeThermalTES < M y
 DischargeThermalTES > -M y
 y = {0,1} binary, M is a large number.

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新