Files
multi_energy_complementarity/tests/test_curtail_priority.py

92 lines
4.2 KiB
Python
Raw Permalink Normal View History

2025-12-27 19:15:56 +08:00
"""
测试弃风弃光优先级
验证系统在需要弃风弃光时优先弃光的逻辑
"""
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'src'))
from storage_optimization import optimize_storage_capacity, SystemParameters
def test_curtail_priority():
"""测试弃风弃光优先级"""
print("=== 测试弃风弃光优先级 ===")
# 创建测试数据:有大量盈余电力的情况,光伏和风电都有出力
solar_output = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 25.0, 30.0, 30.0, 25.0, 20.0, 15.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # 24小时
wind_output = [15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0] # 24小时
thermal_output = [10.0] * 24 # 稳定的火电
load_demand = [20.0] * 24 # 稳定的负荷
print(f"光伏总出力: {sum(solar_output):.2f} MW")
print(f"风电总出力: {sum(wind_output):.2f} MW")
print(f"火电总出力: {sum(thermal_output):.2f} MW")
print(f"总负荷: {sum(load_demand):.2f} MW")
print(f"理论盈余: {sum(solar_output) + sum(wind_output) + sum(thermal_output) - sum(load_demand):.2f} MW")
# 设置参数,限制储能和上网电量,强制弃风弃光
params = SystemParameters(
max_curtailment_wind=0.1, # 允许10%弃风
max_curtailment_solar=0.3, # 允许30%弃光(更高)
max_grid_ratio=0.05, # 5%上网比例(更低)
storage_efficiency=0.9,
discharge_rate=1.0,
charge_rate=1.0,
max_storage_capacity=30.0, # 更小的储能容量
available_thermal_energy=240.0, # 不计入上网电量计算
available_solar_energy=200.0, # 基于实际光伏出力
available_wind_energy=300.0 # 基于实际风电出力
)
print(f"\n系统参数:")
print(f" 最大弃风率: {params.max_curtailment_wind}")
print(f" 最大弃光率: {params.max_curtailment_solar}")
print(f" 最大上网比例: {params.max_grid_ratio}")
print(f" 可用光伏发电量: {params.available_solar_energy} MWh")
print(f" 可用风电发电量: {params.available_wind_energy} MWh")
# 计算最大允许弃风弃光量
max_curtailed_wind_total = sum(wind_output) * params.max_curtailment_wind
max_curtailed_solar_total = sum(solar_output) * params.max_curtailment_solar
print(f"\n理论最大弃风量: {max_curtailed_wind_total:.2f} MW")
print(f"理论最大弃光量: {max_curtailed_solar_total:.2f} MW")
# 运行优化
result = optimize_storage_capacity(solar_output, wind_output, thermal_output, load_demand, params)
# 分析结果
total_curtailed_wind = sum(result['curtailed_wind'])
total_curtailed_solar = sum(result['curtailed_solar'])
total_grid_feed_in = sum(x for x in result['grid_feed_in'] if x > 0)
print(f"\n实际结果:")
print(f" 实际弃风量: {total_curtailed_wind:.2f} MW")
print(f" 实际弃光量: {total_curtailed_solar:.2f} MW")
print(f" 实际上网电量: {total_grid_feed_in:.2f} MWh")
print(f" 实际弃风率: {total_curtailed_wind/sum(wind_output):.3f}")
print(f" 实际弃光率: {total_curtailed_solar/sum(solar_output):.3f}")
# 检查弃光是否优先于弃风
if total_curtailed_solar > 0 or total_curtailed_wind > 0:
total_curtailment = total_curtailed_solar + total_curtailed_wind
solar_ratio = total_curtailed_solar / total_curtailment if total_curtailment > 0 else 0
wind_ratio = total_curtailed_wind / total_curtailment if total_curtailment > 0 else 0
print(f"\n弃风弃光比例分析:")
print(f" 弃光占比: {solar_ratio:.3f}")
print(f" 弃风占比: {wind_ratio:.3f}")
# 验证优先弃光逻辑
# 在有弃风弃光的情况下,应该先弃光直到达到弃光率限制
if solar_ratio > 0.5: # 如果弃光占比超过50%,说明优先弃光
print(" [OK] 验证通过:系统优先弃光")
else:
print(" [WARNING] 可能未完全优先弃光")
print("\n=== 测试完成 ===")
if __name__ == "__main__":
test_curtail_priority()