Skip to content
On this page

单年运行仿真模型

1. 变量和符号总结

名称说明n∈N={0,…|N|−1}母线t∈T={0,…|T|−1}时间序列l∈L={0,…|L|−1}线路s∈S={0,…|S|−1}每条母线上不同的发电机/储能类型wt目标函数中时间t的权重gn,s,t在时间t母线n上的发电机sg¯n,s母线n上发电机s的额定功率g¯n,s,t每单位额定功率在时间t母线n上发电机s的可用性un,s,t机组组合的发电机的二进制状态变量sucn,s,t机组组合的发电机在时间t启动的开机成本sdcn,s,t机组组合的发电机在时间t关闭的关机成本cn,s将发电机额定功率增加1MW的资本成本on,s发电机1MWh的边际成本fl,t时间t时线路l中的功率流Fl线路l的容量ηn,s母线n上发电机s的效率ηl可控链路l的效率es燃料载体s的二氧化碳当量吨/兆瓦时

2 目标函数

目标函数由每个组件的资本成本 c 和发电机的运营成本 o 组成:

∑n,scn,sg¯n,s+∑n,scn,sh¯n,s+∑lclFl+∑twt[∑n,son,s,tgn,s,t+∑n,son,s,thn,s,t]+∑t[sucn,s,t+sdcn,s,t]

3 发电机约束

可以优化每个时间的发电机标称功率和发电机调度。 每个发电机都有一个调度变量,用于标记总线,标记总线上的特定发电机(例如,它可以表示聚合网络中同一总线上的风能/天然气/煤炭发电机)并标记时间。 它遵循以下约束:

g~n,s,t∗g¯n,s≤gn,s,t≤g¯n,s,t∗g¯n,s

其中 g¯n,s 是标称功率(generator.p_nom), g~n,s,t 和 g¯n,s,t 是由于风力可用性或发电厂降级等原因对调度(每单位标称功率)的时间依赖性限制。

对于p_max_pu时变的发电机,单位可用性 g¯n,s,t 是一个时间序列; 对于p_max_pu固定的发电,单位可用性 g¯n,s,t 是一个常数。

如果发电机的标称功率 g¯n,s 也是优化的主题(generator.p_nom_extendable == True),那么也可以限制generator.p_nom_min 和 generator.p_nom_max:

g~n,s≤g¯n,s≤g^n,s

4 发电机和链路的机组组合约束

通过将 committable 设置为 True,可以为任何发电机或链路打开机组组合。 这引入了一个新的二进制状态变量的时间序列 un,s,t∈{0,1},保存在network.generators_t.status中,表示在时间段t内发电机/链路是运行(1)还是不运行(0)。 发电机/链路输出的限制现在变为:

un,s,t∗g~n,s,t∗g¯n,s≤gn,s,t≤un,s,t∗g¯n,s,t∗g¯n,s∀n,s,t

如果 un,s,t=0 ,那么 gn,s,t=0 。

请注意,发电机/链路不能同时扩容(generator.p_nom_extendable == True)和机组组合(generator.committable == True),因为这里变量 un,s,t 和 g¯n,s 的耦合。

如果设置了最小正常运行时间 Tmin−up  (generator.min_up_time),那么我们有通用时间:

∑t′=tt+Tmin−upun,s,t′≥Tmin−up(un,s,t−un,s,t−1)∀n,s,t

即,如果发电机/链路在某个时间t刚刚启动,那么 un,s,t−1=0 、 un,s,t=1 、 un,s,t−un,s,t−1=1。因此他必须至少运行 T_min_up 个时间戳。

在snapshots模拟期之前,发电机/链路可能已经运行了一段时间,在snapshots模拟器之前,如果up_time_before小于min_up_time,那么发电机和链路将会被强制开机,以弥补二者的差值。

在snapshots结束时,如果剩余snapshots的数量小于 T_min_up,则仅对剩余snapshots强制执行约束中的最短启动时间(min_up_time)。

同样,如果最小停机时间 Tmin−down (generator.min_up_time) 已设置,那么我们有:

∑t′=tt+Tmin−down(1−un,s,t′)≥Tmin−down(un,s,t−1−un,s,t)∀n,s,t

您也可以在network.snapshots之前的时段定义generator.down_time_before,类似于开机时间。

对于非零启动成本 sucn,s,每个时间段t都会引入一个新变量 sucn,s,t≥0 , 并将其添加到目标函数中。 变量满足:

sucn,s,t≥sucn,s(un,s,t−un,s,t−1)∀n,s,t

因此,如果 un,s,t−un,s,t−1=1, 即发电机/链路刚刚启动,则它仅为非零。

同样对于关闭成本 sdcn,s,t≥0 ,我们有:

sdcn,s,t≥sdcn,s(un,s,t−1−un,s,t)∀n,s,t

5 发电机和链路的爬坡约束

可以为发电机和链路定义爬坡速率限制,以增加功率输出 run,s 和减少功率输出 rdn,s。 默认情况下,这些为 null 并被忽略。 它们应按每单位发电机标称功率给出。 发电机放电然后服从:

−rdn,s∗g¯n,s≤(gn,s,t−gn,s,t−1)≤run,s∗g¯n,s

for t∈{1,…|T|−1}

对于具有机组组合的发电机/链路,您还可以在启动 rusun,s 和关闭 rdsdn,s 时指定爬坡限制:

[−rdn,s∗un,s,t−rdsdn,s(un,s,t−1−un,s,t)]g¯n,s≤(gn,s,t−gn,s,t−1)≤[run,s∗un,s,t−1+rusun,s(un,s,t−un,s,t−1)]g¯n,s

6 电储能约束

与具有一个时间相关变量的发电机相反,每个电储能具有三个:

  • 储能放电 hn,s,t(电量耗尽时):
0≤hn,s,t≤h¯n,s
  • 储能充电 fn,s,t(电量增加时):
0≤fn,s,t≤h¯n,s
  • 以及电量:
0≤socn,s,t≤rn,sh¯n,s

其中 rn,s 是满电量状态的标称功率小时数。

这些变量是相关的:

socn,s,t=ηstand;n,swtsocn,s,t−1+ηstore;n,swtfn,s,t−ηdispatch;n,s−1wthn,s,t+wtinflown,s,t−wtspillagen,s,t

ηstand;n,s 是静态损耗,例如蓄热的热损耗。ηstore;n,s 和 ηdispatch;n,s 分别是充电损耗和放电损耗。

指定初始电量有以下两个选项:

    1. 设置storage_unit.cyclic_state_of_charge = False(默认),设置storage_unit.state_of_charge_initial的值
    1. 设置storage_unit.cyclic_state_of_charge = True,然后优化假设 socn,s,t=−1=socn,s,t=|T|−1

如果在时间序列 storage_unit_t.state_of_charge_set 中存在不是 NaN 的值,则将假定这些是该时间所需的电量状态,并且这些值将作为额外的约束添加。

7 储能约束

储能有两个时间相关变量:

  • 储能放电 hn,s,t
∞≤hn,s,t≤+∞
  • 能量:
e~n,s≤en,s,t≤e¯n,s

这些变量是相关的:

en,s,t=ηstand;n,swten,s,t−1−wthn,s,t

ηstand;n,s 是静态损耗, 例如蓄热的热损耗。

指定初始电量有以下两个选项:

    1. 设置store.e_cyclic = False(默认),设置store.e_initial的值
    1. 设置store.e_cyclic = True,然后优化假设 en,s,t=−1=en,s,t=|T|−1

8 无源支流:线路和变压器

对于功率根据阻抗流动的线路和变压器,交流网络中的功率流 fl,t 由母线0处的电压角 θn,t 和母线 1 处的电压角 θm,t 之差除以串联电抗得出:

fl,t=θn,t−θm,txl

此流量受线路容量F_l的限制:

|fl,t|≤Fl

注意:如果 Fl 也要进行优化 ( branch.s_nom_extendable -- True ),则线路的阻抗不会随着容量而自动改变。

9 可控线路潮流:链路

对于功率流可控的链路,每个组件都有一个优化变量,满足:

|fl,t|≤Fl

10 节点功率平衡

这是最重要的方程,它保证在每个时间t的每个总线n处的功率平衡:

∑sgn,s,t+∑shn,s,t−∑sfn,s,t−∑lKnlfl,t=∑sdn,s,t↔wtλn,t

λn,t 是约束的影子价格,即位置边际价格,存储在 network.buses_t.marginal_price 中。

总线的作用是强制所有进出它的元素的能量守恒(即基尔霍夫电流定律)

image.png

11 全局约束

全局约束适用于多个组件。目前,定义了五种全局约束类型。如果将具有相应类型的全局约束添加到网络中,则会激活它们。默认情况下,该约束适用于所有投资期。对于数十年优化,可以通过在属性investment_period中指定全局约束,仅为一个投资期设置全局约束(例如,特定投资年的CO2限制)。每个全局约束的影子价格存储在 μ 中, 它是存储在network.global_contraints.mu中的优化的输出。

一次能源

一次能源约束( type=primary_energy )取决于电厂的效率和运营商的特定属性,比如 CO2 的排放。

如果能量载体 s 的特定排放量是 es (carrier.co2_emissions) CO2-equivalent-tonne-per-MWh , 并且在节点 n 处带有载体 s 的发电机具有效率 ηn,s, 那么 CO2 约束是:

∑n,s,t1ηn,swt⋅gn,s,t⋅en,s+∑n,s(en,s,t=−1−en,s,t=|T|−1)⋅en,s≤CAPCO2↔μ

第一个总和超过发电机;第二个总和是储能和电储能。μ 是约束的影子价格,即本例中 CO2 的价格

12 上下网约束

  • 上网约束:

全年上网总电量,小于或等于用户设置的上网约束值-up_grid_sum

  • 下网约束:

全年下网总电量,小于或等于用户设置的上网约束值-down_grid_sum

  • 上下网总额约束:

全年上网和下网的电量之和,小于或等于用户设置的上下网总额约束-up_down_grid_sum

  • 上下网差额约束:

全年上网和下网的电量之差,小于或等于用户设置的上下网差额约束-up_down_grid_substract

上网和下网电量都从Generator组件的p中获得,是变量。

13 新能源约束

  • 新能源利用率约束

全年新能源实发总电量除以全年新能源可发总电量,小于或等于用户设置的新能源利用率约束值- min_re_available_percent。

其中新能源实发电量从Generator组件的p中获得,是变量;新能源可发电量由p_max_pu *  p_nom_opt计算得来,也是变量,因为p_nom_opt不确定。

  • 新能源渗透率约束

全年新能源实发总电量除以全年负荷总电量,小于或等于用户设置的新能源渗透率约束值-min_re_load_percent。

其中新能源实发电量从Generator组件的p中获得,是变量;总负荷由常规负荷和可调负荷构成,常规负荷的电量从loads_t中获得,是常量,可调负荷的电量从Generator组件的p中获得,是变量。