115 lines
5.0 KiB
Python
115 lines
5.0 KiB
Python
|
|
# -*- 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()
|