修复了弃风计算不正确的bug。
This commit is contained in:
@@ -144,9 +144,24 @@ def calculate_energy_balance(
|
||||
total_potential_wind = np.sum(wind)
|
||||
total_potential_solar = np.sum(solar)
|
||||
|
||||
# 判断是否只有一种可再生能源
|
||||
has_wind = total_potential_wind > 0
|
||||
has_solar = total_potential_solar > 0
|
||||
single_renewable = (has_wind and not has_solar) or (has_solar and not has_wind)
|
||||
|
||||
# 计算允许的最大弃风弃光量
|
||||
max_curtailed_wind_total = total_potential_wind * params.max_curtailment_wind
|
||||
max_curtailed_solar_total = total_potential_solar * params.max_curtailment_solar
|
||||
if single_renewable:
|
||||
# 只有一种可再生能源时,弃电量不受限制
|
||||
max_curtailed_wind_total = float('inf')
|
||||
max_curtailed_solar_total = float('inf')
|
||||
elif params.max_grid_ratio == 0:
|
||||
# 上网电量限制为0时,所有超额电力都必须被弃掉,不受弃风弃光限制
|
||||
max_curtailed_wind_total = float('inf')
|
||||
max_curtailed_solar_total = float('inf')
|
||||
else:
|
||||
# 有多种可再生能源且上网电量限制不为0时,应用弃风弃光限制
|
||||
max_curtailed_wind_total = total_potential_wind * params.max_curtailment_wind
|
||||
max_curtailed_solar_total = total_potential_solar * params.max_curtailment_solar
|
||||
|
||||
# 初始化累计弃风弃光量
|
||||
accumulated_curtailed_wind = 0.0
|
||||
@@ -206,28 +221,59 @@ def calculate_energy_balance(
|
||||
|
||||
# 计算弃风弃光(优先弃光,然后弃风)
|
||||
if remaining_surplus > 0:
|
||||
# 计算当前可弃光量
|
||||
available_solar_curtail = min(
|
||||
solar[hour],
|
||||
max_curtailed_solar_total - accumulated_curtailed_solar
|
||||
)
|
||||
|
||||
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_wind_curtail = min(
|
||||
wind[hour],
|
||||
max_curtailed_wind_total - accumulated_curtailed_wind
|
||||
)
|
||||
# 在单一可再生能源场景下,弃风弃光不受限制
|
||||
if single_renewable:
|
||||
# 优先弃光
|
||||
if solar[hour] > 0:
|
||||
curtailed_solar[hour] = min(solar[hour], remaining_surplus)
|
||||
remaining_surplus -= curtailed_solar[hour]
|
||||
accumulated_curtailed_solar += curtailed_solar[hour]
|
||||
|
||||
if available_wind_curtail > 0:
|
||||
curtailed_wind[hour] = min(available_wind_curtail, remaining_surplus)
|
||||
# 如果还有剩余,弃风
|
||||
if remaining_surplus > 0 and wind[hour] > 0:
|
||||
curtailed_wind[hour] = min(wind[hour], remaining_surplus)
|
||||
remaining_surplus -= curtailed_wind[hour]
|
||||
accumulated_curtailed_wind += curtailed_wind[hour]
|
||||
else:
|
||||
# 混合可再生能源场景,弃风弃光受限制
|
||||
# 计算当前可弃光量
|
||||
if max_curtailed_solar_total == float('inf'):
|
||||
# 无限制弃光
|
||||
available_solar_curtail = solar[hour]
|
||||
else:
|
||||
# 受限制弃光
|
||||
available_solar_curtail = min(
|
||||
solar[hour],
|
||||
max_curtailed_solar_total - accumulated_curtailed_solar
|
||||
)
|
||||
|
||||
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:
|
||||
if max_curtailed_wind_total == float('inf'):
|
||||
# 无限制弃风
|
||||
available_wind_curtail = wind[hour]
|
||||
else:
|
||||
# 受限制弃风
|
||||
available_wind_curtail = min(
|
||||
wind[hour],
|
||||
max_curtailed_wind_total - accumulated_curtailed_wind
|
||||
)
|
||||
|
||||
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 remaining_surplus > 0:
|
||||
# 记录警告但不影响计算
|
||||
# 在实际系统中,这种情况不应该发生,但作为安全保护
|
||||
pass
|
||||
|
||||
else:
|
||||
# 电力不足,优先放电
|
||||
@@ -376,11 +422,25 @@ def optimize_storage_capacity(
|
||||
# 没有上网电量或为负值(购电),总是满足约束
|
||||
grid_constraint_satisfied = True
|
||||
|
||||
constraints_satisfied = (
|
||||
constraint_results['total_curtailment_wind_ratio'] <= params.max_curtailment_wind and
|
||||
constraint_results['total_curtailment_solar_ratio'] <= params.max_curtailment_solar and
|
||||
grid_constraint_satisfied
|
||||
)
|
||||
# 判断是否只有一种可再生能源
|
||||
has_wind = sum(wind_output) > 0
|
||||
has_solar = sum(solar_output) > 0
|
||||
single_renewable = (has_wind and not has_solar) or (has_solar and not has_wind)
|
||||
|
||||
# 特殊情况:当上网电量限制为0时,所有超额电力都必须被弃掉
|
||||
# 此时应该允许无限制弃风弃光
|
||||
grid_quota_zero = params.max_grid_ratio == 0
|
||||
|
||||
if single_renewable or grid_quota_zero:
|
||||
# 只有一种可再生能源时,或上网电量限制为0时,跳过弃风弃光约束检查
|
||||
constraints_satisfied = grid_constraint_satisfied
|
||||
else:
|
||||
# 有多种可再生能源且上网电量限制不为0时,检查所有约束
|
||||
constraints_satisfied = (
|
||||
constraint_results['total_curtailment_wind_ratio'] <= params.max_curtailment_wind and
|
||||
constraint_results['total_curtailment_solar_ratio'] <= params.max_curtailment_solar and
|
||||
grid_constraint_satisfied
|
||||
)
|
||||
|
||||
# 检查储能日平衡(周期结束时储能状态应接近初始值)
|
||||
storage_initial = balance_result['storage_profile'][0]
|
||||
|
||||
Reference in New Issue
Block a user