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

115 lines
5.0 KiB
Python
Raw 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.
# -*- coding: utf-8 -*-
"""
测试火电可用发电量为0时的系统行为 - 简化版本
验证系统在无火电情况下的基本功能
"""
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_zero_grid_simple():
"""测试火电可用发电量为0时的系统行为"""
print("=== 测试火电可用发电量为0时的系统行为简化版 ===")
# 创建简单的测试场景
solar_output = [30.0] * 12 + [0.0] * 12 # 12小时有光伏12小时无光伏
wind_output = [20.0] * 24 # 稳定风电
thermal_output = [0.0] * 24 # 无火电
load_demand = [25.0] * 24 # 稳定负荷
print("测试数据设计:")
print(f" 光伏出力: {sum(solar_output):.1f} MWh (12小时)")
print(f" 风电出力: {sum(wind_output):.1f} MWh")
print(f" 火电出力: {sum(thermal_output):.1f} MWh")
print(f" 总发电量: {sum(solar_output) + sum(wind_output) + sum(thermal_output):.1f} MWh")
print(f" 总负荷: {sum(load_demand):.1f} MWh")
print(f" 理论盈余: {(sum(solar_output) + sum(wind_output) + sum(thermal_output) - sum(load_demand)):.1f} MWh")
# 设置系统参数
params = SystemParameters(
max_curtailment_wind=0.1, # 允许弃风10%
max_curtailment_solar=0.1, # 允许弃光10%
max_grid_ratio=0.2, # 允许上网20%
storage_efficiency=0.9,
discharge_rate=1.0,
charge_rate=1.0,
max_storage_capacity=50.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.max_storage_capacity} MWh")
try:
result = optimize_storage_capacity(
solar_output, wind_output, thermal_output, load_demand, params
)
if result is None:
print(f"\n[ERROR] 优化计算失败")
return
# 计算结果统计
actual_grid_feed_in = sum(x for x in result['grid_feed_in'] if x > 0)
actual_curtail_wind = sum(result['curtailed_wind'])
actual_curtail_solar = sum(result['curtailed_solar'])
print(f"\n优化结果:")
print(f" 储能容量需求: {result['required_storage_capacity']:.2f} MWh")
print(f" 实际上网电量: {actual_grid_feed_in:.2f} MWh")
print(f" 实际弃风量: {actual_curtail_wind:.2f} MWh")
print(f" 实际弃光量: {actual_curtail_solar:.2f} MWh")
print(f" 实际弃风率: {actual_curtail_wind/sum(wind_output):.3f}")
print(f" 实际弃光率: {actual_curtail_solar/sum(solar_output):.3f}")
# 验证约束条件
total_generation = sum(solar_output) + sum(wind_output) + sum(thermal_output)
total_load = sum(load_demand)
total_surplus = total_generation - total_load
expected_max_curtail_wind = sum(wind_output) * params.max_curtailment_wind
expected_max_curtail_solar = sum(solar_output) * params.max_curtailment_solar
print(f"\n约束验证:")
print(f" 总盈余电力: {total_surplus:.2f} MWh")
print(f" 弃风限制: {actual_curtail_wind:.2f} <= {expected_max_curtail_wind:.2f} {'OK' if actual_curtail_wind <= expected_max_curtail_wind else 'NG'}")
print(f" 弃光限制: {actual_curtail_solar:.2f} <= {expected_max_curtail_solar:.2f} {'OK' if actual_curtail_solar <= expected_max_curtail_solar else 'NG'}")
print(f" 储能限制: {result['required_storage_capacity']:.2f} MWh (限制: {params.max_storage_capacity} MWh)")
# 能量平衡验证
energy_used = actual_grid_feed_in + actual_curtail_wind + actual_curtail_solar + total_load
energy_balance = abs(total_generation - energy_used)
print(f"\n能量平衡验证:")
print(f" 总发电量: {total_generation:.2f} MWh")
print(f" 能量使用: {energy_used:.2f} MWh")
print(f" 平衡误差: {energy_balance:.2f} MWh {'OK' if energy_balance < 0.1 else 'NG'}")
# 综合评估
constraints_ok = (actual_curtail_wind <= expected_max_curtail_wind + 0.1 and
actual_curtail_solar <= expected_max_curtail_solar + 0.1 and
energy_balance < 0.1)
if constraints_ok:
print(f"\n[OK] 测试通过:")
print(f" [OK] 约束条件正确执行")
print(f" [OK] 能量平衡正确")
print(f" [OK] 系统在有盈余时正确处理")
else:
print(f"\n[WARNING] 测试部分通过,需要检查约束条件")
except Exception as e:
print(f"\n[ERROR] 测试失败: {str(e)}")
import traceback
traceback.print_exc()
print("\n=== 测试完成 ===")
if __name__ == "__main__":
test_zero_grid_simple()