1

我在使用matlab linprog代码时遇到问题。优化函数是 24 周期的总成本,仅考虑锅炉的燃料成本。

模拟目的:

针对由锅炉、热量需求和 TES 组成的系统的 24 小时运行优化热能存储 (TES) 的充电/放电行为。天然气的价格是随时间变化的。

问题:

如果 TES 是理想的(效率 = 100%),我没有任何约束可以阻止系统同时充电和放电。我不能用一个变量来描述充电和放电。我确实需要他们分开

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

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

是否有可能在 linprog 的约束下实现以下逻辑规则?

if ChargeThermalTES<0,
   DischargeThermalTES=0
end

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

4

2 回答 2

1

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

但是,您可以执行以下操作:

1\解决你的线性程序,没有这个约束。获取目标函数的最佳成本(我们将其命名为 OldCost)。

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

  • 添加约束:旧目标函数应介于 OldCost * (1-Epsilon) 和 OldCost * (1+Epsilon) 之间

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

干杯

于 2013-07-28T14:15:31.170 回答
0

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

实现逻辑规则:

if ChargeThermalTES<0,
   DischargeThermalTES=0
end

条件:如果 ChargeThermalTES<0,则 DischargeThermalTES=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.

希望有帮助。

于 2013-07-31T03:14:56.400 回答