修复可用电量计算。

This commit is contained in:
dmy
2025-12-26 02:28:54 +08:00
parent 65be7e52dd
commit 269e985d83
3 changed files with 188 additions and 42 deletions

View File

@@ -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:
# 电力不足,优先放电