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

136 lines
5.2 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
# 添加src目录到路径
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'src'))
from storage_optimization import optimize_storage_capacity, SystemParameters
def test_24hour_data():
"""测试24小时数据不需要周期性平衡"""
print("=" * 60)
print("测试24小时数据不需要周期性平衡")
print("=" * 60)
# 示例数据
solar_output = [0.0] * 6 + [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0] + [0.0] * 6
wind_output = [2.0, 3.0, 4.0, 3.0, 2.0, 1.0] * 4
thermal_output = [5.0] * 24
load_demand = [3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 18.0,
16.0, 14.0, 12.0, 10.0, 8.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0]
# 系统参数
params = SystemParameters(
max_curtailment_wind=0.1,
max_curtailment_solar=0.1,
max_grid_ratio=0.2,
storage_efficiency=0.9,
discharge_rate=1.0,
charge_rate=1.0
)
# 计算最优储能容量
result = optimize_storage_capacity(
solar_output, wind_output, thermal_output, load_demand, params
)
print(f"\n=== 24小时优化结果 ===")
print(f"所需储能总容量: {result['required_storage_capacity']:.2f} MWh")
print(f"初始SOC: {result['storage_profile'][0]:.4f} MWh")
print(f"最终SOC: {result['storage_profile'][-1]:.4f} MWh")
print(f"SOC差值: {abs(result['storage_profile'][-1] - result['storage_profile'][0]):.4f} MWh")
print(f"实际弃风率: {result['total_curtailment_wind_ratio']:.3f}")
print(f"实际弃光率: {result['total_curtailment_solar_ratio']:.3f}")
print(f"实际上网电量比例: {result['total_grid_feed_in_ratio']:.3f}")
print(f"能量平衡校验: {'通过' if result['energy_balance_check'] else '未通过'}")
def test_8760hour_data():
"""测试8760小时数据需要周期性平衡"""
print("\n" + "=" * 60)
print("测试8760小时数据需要周期性平衡")
print("=" * 60)
# 生成8760小时示例数据简化版本
import numpy as np
# 使用重复的24小时模式生成8760小时数据
daily_solar = [0.0] * 6 + [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0] + [0.0] * 6
daily_wind = [2.0, 3.0, 4.0, 3.0, 2.0, 1.0] * 4
daily_thermal = [5.0] * 24
daily_load = [3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 18.0,
16.0, 14.0, 12.0, 10.0, 8.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0]
# 添加季节性变化
np.random.seed(42)
solar_output = []
wind_output = []
thermal_output = []
load_demand = []
for day in range(365):
# 季节性因子
season_factor = 1.0 + 0.3 * np.sin(2 * np.pi * day / 365)
for hour in range(24):
# 添加随机变化
solar_variation = 1.0 + 0.2 * (np.random.random() - 0.5)
wind_variation = 1.0 + 0.3 * (np.random.random() - 0.5)
load_variation = 1.0 + 0.1 * (np.random.random() - 0.5)
solar_output.append(daily_solar[hour] * season_factor * solar_variation)
wind_output.append(daily_wind[hour] * wind_variation)
thermal_output.append(daily_thermal[hour])
load_demand.append(daily_load[hour] * (2.0 - season_factor) * load_variation)
# 系统参数
params = SystemParameters(
max_curtailment_wind=0.1,
max_curtailment_solar=0.1,
max_grid_ratio=0.2,
storage_efficiency=0.9,
discharge_rate=1.0,
charge_rate=1.0,
max_storage_capacity=1000.0 # 设置储能容量上限以加快测试
)
# 计算最优储能容量
result = optimize_storage_capacity(
solar_output, wind_output, thermal_output, load_demand, params
)
print(f"\n=== 8760小时优化结果 ===")
print(f"所需储能总容量: {result['required_storage_capacity']:.2f} MWh")
print(f"初始SOC: {result['storage_profile'][0]:.4f} MWh")
print(f"最终SOC: {result['storage_profile'][-1]:.4f} MWh")
print(f"SOC差值: {abs(result['storage_profile'][-1] - result['storage_profile'][0]):.4f} MWh")
print(f"实际弃风率: {result['total_curtailment_wind_ratio']:.3f}")
print(f"实际弃光率: {result['total_curtailment_solar_ratio']:.3f}")
print(f"实际上网电量比例: {result['total_grid_feed_in_ratio']:.3f}")
print(f"能量平衡校验: {'通过' if result['energy_balance_check'] else '未通过'}")
# 验证周期性平衡
soc_diff = abs(result['storage_profile'][-1] - result['storage_profile'][0])
capacity = result['required_storage_capacity']
soc_convergence_threshold = capacity * 0.001 # 0.1%阈值
if soc_diff < soc_convergence_threshold:
print(f"\n✓ 周期性平衡验证通过")
print(f" SOC差值: {soc_diff:.4f} MWh < 阈值: {soc_convergence_threshold:.4f} MWh")
else:
print(f"\n⚠ 周期性平衡验证未通过")
print(f" SOC差值: {soc_diff:.4f} MWh >= 阈值: {soc_convergence_threshold:.4f} MWh")
if __name__ == "__main__":
test_24hour_data()
test_8760hour_data()
print("\n" + "=" * 60)
print("所有测试完成")
print("=" * 60)