Files
multi_energy_complementarity/tests/test_grid_calculation.py
2025-12-27 19:15:56 +08:00

110 lines
4.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
测试上网电量计算逻辑
测试基于可用发电量乘以最大上网比例的上网电量计算
"""
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_grid_calculation():
"""测试上网电量计算逻辑"""
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 = [5.0] * 24 # 稳定的风电
thermal_output = [10.0] * 24 # 稳定的火电
load_demand = [8.0] * 24 # 稳定的负荷,小于发电量
# 验证数据长度
print(f"数据长度验证: solar={len(solar_output)}, wind={len(wind_output)}, thermal={len(thermal_output)}, load={len(load_demand)}")
print(f"总发电潜力: {sum(solar_output) + sum(wind_output) + 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")
# 测试参数1低上网比例
params1 = SystemParameters(
max_curtailment_wind=0.1,
max_curtailment_solar=0.1,
max_grid_ratio=0.1, # 10%上网比例
storage_efficiency=0.9,
discharge_rate=1.0,
charge_rate=1.0,
available_thermal_energy=240.0, # 24小时 * 10MW
available_solar_energy=150.0, # 基于实际光伏出力
available_wind_energy=120.0 # 基于实际风电出力
)
# 计算期望的上网电量上限(不考虑火电)
total_available_energy = params1.available_solar_energy + params1.available_wind_energy
expected_max_grid_feed_in = total_available_energy * params1.max_grid_ratio
print(f"\n测试参数1")
print(f" 可用发电量总计: {total_available_energy:.2f} MWh")
print(f" 最大上网比例: {params1.max_grid_ratio}")
print(f" 期望上网电量上限: {expected_max_grid_feed_in:.2f} MWh")
# 设置储能容量上限以观察上网电量限制
params1.max_storage_capacity = 50.0 # 限制储能容量为50MWh
result1 = optimize_storage_capacity(solar_output, wind_output, thermal_output, load_demand, params1)
actual_grid_feed_in = sum(x for x in result1['grid_feed_in'] if x > 0)
print(f" 实际上网电量: {actual_grid_feed_in:.2f} MWh")
print(f" 实际弃风量: {sum(result1['curtailed_wind']):.2f} MWh")
print(f" 实际弃光量: {sum(result1['curtailed_solar']):.2f} MWh")
# 验证上网电量是否正确限制
if abs(actual_grid_feed_in - expected_max_grid_feed_in) < 1.0: # 允许1MW误差
print(" [OK] 上网电量计算正确")
else:
print(" [ERROR] 上网电量计算有误")
# 测试参数2高上网比例
params2 = SystemParameters(
max_curtailment_wind=0.1,
max_curtailment_solar=0.1,
max_grid_ratio=0.5, # 50%上网比例
storage_efficiency=0.9,
discharge_rate=1.0,
charge_rate=1.0,
available_thermal_energy=240.0, # 24小时 * 10MW
available_solar_energy=150.0, # 基于实际光伏出力
available_wind_energy=120.0 # 基于实际风电出力
)
# 计算期望的上网电量上限(不考虑火电)
total_available_energy = params2.available_solar_energy + params2.available_wind_energy
expected_max_grid_feed_in2 = total_available_energy * params2.max_grid_ratio
# 计算期望的上网电量上限(不考虑火电)
total_available_energy2 = params2.available_solar_energy + params2.available_wind_energy
print(f"\n测试参数2")
print(f" 可用发电量总计: {total_available_energy2:.2f} MWh")
print(f" 最大上网比例: {params2.max_grid_ratio}")
print(f" 期望上网电量上限: {expected_max_grid_feed_in2:.2f} MWh")
# 设置储能容量上限以观察上网电量限制
params2.max_storage_capacity = 50.0 # 限制储能容量为50MWh
result2 = optimize_storage_capacity(solar_output, wind_output, thermal_output, load_demand, params2)
actual_grid_feed_in2 = sum(x for x in result2['grid_feed_in'] if x > 0)
print(f" 实际上网电量: {actual_grid_feed_in2:.2f} MWh")
print(f" 实际弃风量: {sum(result2['curtailed_wind']):.2f} MWh")
print(f" 实际弃光量: {sum(result2['curtailed_solar']):.2f} MWh")
# 验证上网电量是否正确限制
if abs(actual_grid_feed_in2 - expected_max_grid_feed_in2) < 1.0: # 允许1MW误差
print(" [OK] 上网电量计算正确")
else:
print(" [ERROR] 上网电量计算有误")
print("\n=== 测试完成 ===")
if __name__ == "__main__":
test_grid_calculation()