修复可用电量计算。
This commit is contained in:
@@ -23,6 +23,14 @@ class SystemParameters:
|
||||
discharge_rate: float = 1.0 # 储能放电倍率 (C-rate)
|
||||
charge_rate: float = 1.0 # 储能充电倍率 (C-rate)
|
||||
max_storage_capacity: Optional[float] = None # 储能容量上限 (MWh),None表示无限制
|
||||
# 新增额定装机容量参数
|
||||
rated_thermal_capacity: float = 100.0 # 额定火电装机容量 (MW)
|
||||
rated_solar_capacity: float = 100.0 # 额定光伏装机容量 (MW)
|
||||
rated_wind_capacity: float = 100.0 # 额定风电装机容量 (MW)
|
||||
# 新增可用发电量参数
|
||||
available_thermal_energy: float = 2400.0 # 火电可用发电量 (MWh)
|
||||
available_solar_energy: float = 600.0 # 光伏可用发电量 (MWh)
|
||||
available_wind_energy: float = 1200.0 # 风电可用发电量 (MWh)
|
||||
|
||||
|
||||
def validate_inputs(
|
||||
@@ -79,6 +87,20 @@ def validate_inputs(
|
||||
raise ValueError("充放电倍率必须大于0")
|
||||
if params.max_storage_capacity is not None and params.max_storage_capacity <= 0:
|
||||
raise ValueError("储能容量上限必须大于0")
|
||||
# 验证新增的额定装机容量参数
|
||||
if params.rated_thermal_capacity <= 0:
|
||||
raise ValueError("额定火电装机容量必须大于0")
|
||||
if params.rated_solar_capacity <= 0:
|
||||
raise ValueError("额定光伏装机容量必须大于0")
|
||||
if params.rated_wind_capacity <= 0:
|
||||
raise ValueError("额定风电装机容量必须大于0")
|
||||
# 验证新增的可用发电量参数
|
||||
if params.available_thermal_energy < 0:
|
||||
raise ValueError("火电可用发电量必须为非负值")
|
||||
if params.available_solar_energy < 0:
|
||||
raise ValueError("光伏可用发电量必须为非负值")
|
||||
if params.available_wind_energy < 0:
|
||||
raise ValueError("风电可用发电量必须为非负值")
|
||||
|
||||
|
||||
def calculate_energy_balance(
|
||||
@@ -130,6 +152,13 @@ def calculate_energy_balance(
|
||||
accumulated_curtailed_wind = 0.0
|
||||
accumulated_curtailed_solar = 0.0
|
||||
|
||||
# 计算总可用发电量上限(不考虑火电)
|
||||
total_available_energy = params.available_solar_energy + params.available_wind_energy
|
||||
max_total_grid_feed_in = total_available_energy * params.max_grid_ratio
|
||||
|
||||
# 初始化累计上网电量
|
||||
cumulative_grid_feed_in = 0.0
|
||||
|
||||
# 逐小时计算
|
||||
for hour in range(hours):
|
||||
# 确保储能状态不为负
|
||||
@@ -145,7 +174,7 @@ def calculate_energy_balance(
|
||||
power_surplus = available_generation - demand
|
||||
|
||||
if power_surplus > 0:
|
||||
# 有盈余电力,优先储能,然后上网
|
||||
# 有盈余电力,优先储能
|
||||
max_charge = min(
|
||||
storage_capacity - storage_soc[hour], # 储能空间限制
|
||||
storage_capacity * params.charge_rate, # 充电功率限制
|
||||
@@ -160,36 +189,45 @@ def calculate_energy_balance(
|
||||
if hour < hours - 1:
|
||||
storage_soc[hour + 1] = storage_soc[hour] + actual_charge * params.storage_efficiency
|
||||
|
||||
# 剩余电力考虑弃风弃光和上网
|
||||
# 剩余电力优先上网,超出上网电量比例限制时才弃风弃光
|
||||
remaining_surplus = power_surplus - actual_charge
|
||||
|
||||
# 计算弃风弃光(优先弃风,然后弃光)
|
||||
# 计算当前允许的最大上网电量
|
||||
# 基于总可用发电量和已累计上网电量
|
||||
remaining_grid_quota = max_total_grid_feed_in - cumulative_grid_feed_in
|
||||
|
||||
# 优先上网,但不超过剩余配额
|
||||
grid_feed_allowed = min(remaining_surplus, max(0, remaining_grid_quota))
|
||||
grid_feed_in[hour] = grid_feed_allowed
|
||||
cumulative_grid_feed_in += grid_feed_allowed
|
||||
|
||||
# 剩余电力考虑弃风弃光
|
||||
remaining_surplus -= grid_feed_allowed
|
||||
|
||||
# 计算弃风弃光(优先弃光,然后弃风)
|
||||
if remaining_surplus > 0:
|
||||
# 计算当前可弃风量
|
||||
available_wind_curtail = min(
|
||||
wind[hour],
|
||||
max_curtailed_wind_total - accumulated_curtailed_wind
|
||||
# 计算当前可弃光量
|
||||
available_solar_curtail = min(
|
||||
solar[hour],
|
||||
max_curtailed_solar_total - accumulated_curtailed_solar
|
||||
)
|
||||
|
||||
if available_wind_curtail > 0:
|
||||
curtailed_wind[hour] = min(available_wind_curtail, remaining_surplus)
|
||||
remaining_surplus -= curtailed_wind[hour]
|
||||
accumulated_curtailed_wind += curtailed_wind[hour]
|
||||
if available_solar_curtail > 0:
|
||||
curtailed_solar[hour] = min(available_solar_curtail, remaining_surplus)
|
||||
remaining_surplus -= curtailed_solar[hour]
|
||||
accumulated_curtailed_solar += curtailed_solar[hour]
|
||||
|
||||
# 如果还有剩余,弃光
|
||||
# 如果还有剩余,弃风
|
||||
if remaining_surplus > 0:
|
||||
available_solar_curtail = min(
|
||||
solar[hour],
|
||||
max_curtailed_solar_total - accumulated_curtailed_solar
|
||||
available_wind_curtail = min(
|
||||
wind[hour],
|
||||
max_curtailed_wind_total - accumulated_curtailed_wind
|
||||
)
|
||||
|
||||
if available_solar_curtail > 0:
|
||||
curtailed_solar[hour] = min(available_solar_curtail, remaining_surplus)
|
||||
remaining_surplus -= curtailed_solar[hour]
|
||||
accumulated_curtailed_solar += curtailed_solar[hour]
|
||||
|
||||
# 最终剩余电力上网
|
||||
grid_feed_in[hour] = max(0, remaining_surplus)
|
||||
if available_wind_curtail > 0:
|
||||
curtailed_wind[hour] = min(available_wind_curtail, remaining_surplus)
|
||||
remaining_surplus -= curtailed_wind[hour]
|
||||
accumulated_curtailed_wind += curtailed_wind[hour]
|
||||
|
||||
else:
|
||||
# 电力不足,优先放电
|
||||
|
||||
Reference in New Issue
Block a user