#!/usr/bin/env python3 # -*- coding: utf-8 -*- """测试场景储能配置优化模块""" import sys import os sys.path.append(os.path.join(os.path.dirname(__file__), 'src')) from multi_scenario import MultiScenarioAnalyzer from storage_optimization import SystemParameters import numpy as np def test_scenario_storage_optimization(): """测试聚类场景的储能配置优化""" print("=== 场景储能配置优化测试 ===") # 生成模拟数据 np.random.seed(42) solar_output = [] wind_output = [] load_demand = [] for day in range(30): # 30天数据用于测试 # 光伏:白天有出力,夜间为0 daily_solar = [0.0] * 6 + list(np.random.uniform(2, 8, 12)) + [0.0] * 6 solar_output.extend(daily_solar) # 风电:相对随机 daily_wind = np.random.exponential(3.0, 24).tolist() wind_output.extend(daily_wind) # 负荷:日内变化,夜间低,白天高 daily_load = [4.0, 5.0, 6.0, 7.0, 9.0, 11.0, 13.0, 15.0, 17.0, 19.0, 21.0, 19.0, 17.0, 15.0, 13.0, 11.0, 9.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 3.0] load_demand.extend(daily_load) try: # 1. 执行聚类分析 print("1. 执行多场景聚类分析...") analyzer = MultiScenarioAnalyzer(n_clusters=4, random_state=42) result = analyzer.fit_predict(solar_output, wind_output, load_demand) print(f" 识别出 {result.n_scenarios} 个场景") # 2. 对每个场景进行储能配置优化 print("\n2. 对每个场景进行储能配置优化...") # 系统参数 system_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 ) # 使用 analyzer 的优化功能 optimization_results = analyzer.optimize_storage_for_scenarios( result, solar_output, wind_output, load_demand, system_params, safety_factor=1.2 ) # 3. 显示优化结果 print("\n3. 储能配置优化结果...") analyzer.print_storage_optimization_summary(optimization_results) # 4. 测试结果验证 assert 'summary' in optimization_results, "缺少汇总结果" assert optimization_results['summary']['n_scenarios'] == result.n_scenarios, "场景数不匹配" assert optimization_results['summary']['recommended_capacity'] > 0, "推荐容量应该大于0" print("\n✅ 场景储能配置优化测试通过") return True, optimization_results except Exception as e: print(f"❌ 场景储能配置优化测试失败: {str(e)}") import traceback traceback.print_exc() return False, None def test_storage_optimization_with_different_scenarios(): """测试不同场景数量的储能优化""" print("\n=== 不同场景数量的储能优化测试 ===") # 生成测试数据 np.random.seed(123) solar_output = [] wind_output = [] load_demand = [] for day in range(60): # 60天数据 # 光伏:模拟夏季和冬季差异 if day < 30: # 夏季 daily_solar = [0.0] * 6 + list(np.random.uniform(3, 10, 12)) + [0.0] * 6 else: # 冬季 daily_solar = [0.0] * 6 + list(np.random.uniform(1, 6, 12)) + [0.0] * 6 solar_output.extend(daily_solar) # 风电:模拟季节性变化 daily_wind = np.random.exponential(2.5, 24).tolist() wind_output.extend(daily_wind) # 负荷:模拟夏冬负荷差异 if day < 30: # 夏季负荷较高(空调) daily_load = [6.0, 7.0, 8.0, 9.0, 11.0, 13.0, 15.0, 17.0, 19.0, 21.0, 23.0, 21.0, 19.0, 17.0, 15.0, 13.0, 11.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 5.0] else: # 冬季负荷相对较低 daily_load = [4.0, 5.0, 6.0, 7.0, 9.0, 11.0, 13.0, 15.0, 17.0, 19.0, 21.0, 19.0, 17.0, 15.0, 13.0, 11.0, 9.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 3.0] load_demand.extend(daily_load) analyzer = MultiScenarioAnalyzer(random_state=123) # 测试不同聚类数 for n_clusters in [3, 5, 7]: print(f"\n测试 {n_clusters} 个场景的储能优化...") try: result = analyzer.fit_predict(solar_output, wind_output, load_demand, n_clusters=n_clusters) print(f" 实际识别出 {result.n_scenarios} 个场景") # 执行储能优化 optimization_results = analyzer.optimize_storage_for_scenarios( result, solar_output, wind_output, load_demand, safety_factor=1.3 ) # 显示结果 summary = optimization_results['summary'] print(f" 加权平均储能需求: {summary['weighted_average_storage']:.2f} MWh") print(f" 推荐储能容量: {summary['recommended_capacity']:.2f} MWh") except Exception as e: print(f" ❌ {n_clusters}场景测试失败: {str(e)}") return False print("\n✅ 不同场景数量的储能优化测试通过") return True def test_edge_cases(): """测试边界情况""" print("\n=== 边界情况测试 ===") # 测试短时间数据 print("1. 测试短时间数据...") analyzer = MultiScenarioAnalyzer(n_clusters=2, random_state=42) # 只生成24小时数据 solar_24h = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 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, 0.0, 0.0, 0.0, 0.0, 0.0] wind_24h = [2.0, 3.0, 4.0, 3.0, 2.0, 1.0, 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0, 1.0, 2.0, 3.0, 4.0, 3.0, 2.0] load_24h = [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] try: result = analyzer.fit_predict(solar_24h, wind_24h, load_24h) # 对于短时间数据,应该会被扩展到24小时 optimization_results = analyzer.optimize_storage_for_scenarios( result, solar_24h, wind_24h, load_24h ) print(" ✅ 短时间数据测试通过") except Exception as e: print(f" ❌ 短时间数据测试失败: {str(e)}") return False # 测试极大储能需求情况 print("2. 测试极大储能需求情况...") # 创建储能需求很大的场景 solar_extreme = [10.0] * 24 # 始终高出力 wind_extreme = [8.0] * 24 # 始终高出力 load_extreme = [1.0] * 24 # 始终低负荷 try: result_extreme = analyzer.fit_predict(solar_extreme, wind_extreme, load_extreme) optimization_results_extreme = analyzer.optimize_storage_for_scenarios( result_extreme, solar_extreme, wind_extreme, load_extreme ) print(f" 极端场景推荐储能容量: {optimization_results_extreme['summary']['recommended_capacity']:.2f} MWh") print(" ✅ 极大储能需求情况测试通过") except Exception as e: print(f" ❌ 极大储能需求情况测试失败: {str(e)}") return False print("\n✅ 所有边界情况测试通过") return True if __name__ == "__main__": print("=== 场景储能配置优化模块测试 ===\n") success = True # 基础功能测试 success1, optimization_results = test_scenario_storage_optimization() success &= success1 # 不同场景数量测试 success2 = test_storage_optimization_with_different_scenarios() success &= success2 # 边界情况测试 success3 = test_edge_cases() success &= success3 print(f"\n{'='*60}") if success: print("🎉 所有场景储能配置优化测试通过!") print(" 储能优化模块功能正常工作。") else: print("💥 部分测试失败,请检查代码。") print(f"{'='*60}") # 返回测试结果供其他模块使用 if success: print(f"\n测试数据示例:") if optimization_results: summary = optimization_results['summary'] print(f" - 加权平均储能需求: {summary['weighted_average_storage']:.2f} MWh") print(f" - 推荐储能容量: {summary['recommended_capacity']:.2f} MWh") print(f" - 安全系数: {summary['safety_factor']}") print(f" - 分析场景数: {summary['n_scenarios']}")