我对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.
希望能有所帮助。