92 lines
4.2 KiB
Python
92 lines
4.2 KiB
Python
"""
|
|
测试弃风弃光优先级
|
|
|
|
验证系统在需要弃风弃光时优先弃光的逻辑
|
|
"""
|
|
|
|
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() |