From 974ac6d6db515324d28afec9e67bae3d063714ba Mon Sep 17 00:00:00 2001 From: dmy Date: Thu, 25 Dec 2025 21:05:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=BE=E8=A1=A8=E4=B9=B1?= =?UTF-8?q?=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example_usage.py | 152 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 110 insertions(+), 42 deletions(-) diff --git a/example_usage.py b/example_usage.py index 42f362f..e68f208 100644 --- a/example_usage.py +++ b/example_usage.py @@ -11,6 +11,10 @@ import numpy as np import matplotlib.pyplot as plt from storage_optimization import optimize_storage_capacity, SystemParameters +# 配置matplotlib支持中文显示 +plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans'] +plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + def example_1_basic_scenario(): """示例1: 基础场景""" @@ -48,7 +52,13 @@ def example_1_basic_scenario(): print(f"实际上网电量比例: {result['total_grid_feed_in_ratio']:.3f} (约束: {params.max_grid_ratio})") print(f"能量平衡校验: {'通过' if result['energy_balance_check'] else '未通过'}") - return result + return { + 'result': result, + 'solar_output': solar_output, + 'wind_output': wind_output, + 'thermal_output': thermal_output, + 'load_demand': load_demand + } def example_2_high_renewable_scenario(): @@ -85,7 +95,13 @@ def example_2_high_renewable_scenario(): print(f"实际上网电量比例: {result['total_grid_feed_in_ratio']:.3f}") print(f"能量平衡校验: {'通过' if result['energy_balance_check'] else '未通过'}") - return result + return { + 'result': result, + 'solar_output': solar_output, + 'wind_output': wind_output, + 'thermal_output': thermal_output, + 'load_demand': load_demand + } def example_3_winter_scenario(): @@ -122,48 +138,94 @@ def example_3_winter_scenario(): print(f"实际上网电量比例: {result['total_grid_feed_in_ratio']:.3f}") print(f"能量平衡校验: {'通过' if result['energy_balance_check'] else '未通过'}") - return result + return { + 'result': result, + 'solar_output': solar_output, + 'wind_output': wind_output, + 'thermal_output': thermal_output, + 'load_demand': load_demand + } -def plot_results(result, title): +def plot_results(result, title, solar_output, wind_output, thermal_output, load_demand): """绘制结果图表""" hours = list(range(24)) - fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 10)) + fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6)) = plt.subplots(3, 2, figsize=(16, 12)) fig.suptitle(title, fontsize=16) - # 储能状态 - ax1.plot(hours, result['storage_profile'], 'b-', linewidth=2) - ax1.set_title('储能状态 (MWh)') + # 发电与负荷对比 + ax1.plot(hours, load_demand, 'r-', linewidth=2, label='负荷需求') + ax1.plot(hours, thermal_output, 'b-', linewidth=2, label='火电出力') + ax1.plot(hours, wind_output, 'g-', linewidth=2, label='风电出力') + ax1.plot(hours, solar_output, 'orange', linewidth=2, label='光伏出力') + + # 计算总发电量 + total_generation = [thermal_output[i] + wind_output[i] + solar_output[i] for i in range(24)] + ax1.plot(hours, total_generation, 'k--', linewidth=1.5, alpha=0.7, label='总发电量') + + ax1.set_title('发电与负荷曲线') ax1.set_xlabel('时间 (小时)') - ax1.set_ylabel('储能容量 (MWh)') + ax1.set_ylabel('功率 (MW)') + ax1.legend() ax1.grid(True) - # 充放电功率 - ax2.plot(hours, result['charge_profile'], 'g-', label='充电', linewidth=2) - ax2.plot(hours, [-p for p in result['discharge_profile']], 'r-', label='放电', linewidth=2) - ax2.set_title('储能充放电功率 (MW)') + # 储能状态 + ax2.plot(hours, result['storage_profile'], 'b-', linewidth=2) + ax2.set_title('储能状态 (MWh)') ax2.set_xlabel('时间 (小时)') - ax2.set_ylabel('功率 (MW)') - ax2.legend() + ax2.set_ylabel('储能容量 (MWh)') ax2.grid(True) - # 弃风弃光 - ax3.plot(hours, result['curtailed_wind'], 'c-', label='弃风', linewidth=2) - ax3.plot(hours, result['curtailed_solar'], 'm-', label='弃光', linewidth=2) - ax3.set_title('弃风弃光量 (MW)') + # 充放电功率 + ax3.plot(hours, result['charge_profile'], 'g-', label='充电', linewidth=2) + ax3.plot(hours, [-p for p in result['discharge_profile']], 'r-', label='放电', linewidth=2) + ax3.set_title('储能充放电功率 (MW)') ax3.set_xlabel('时间 (小时)') ax3.set_ylabel('功率 (MW)') ax3.legend() ax3.grid(True) - # 上网电量 - ax4.plot(hours, result['grid_feed_in'], 'orange', linewidth=2) - ax4.set_title('上网电量 (MW)') + # 弃风弃光 + ax4.plot(hours, result['curtailed_wind'], 'c-', label='弃风', linewidth=2) + ax4.plot(hours, result['curtailed_solar'], 'm-', label='弃光', linewidth=2) + ax4.set_title('弃风弃光量 (MW)') ax4.set_xlabel('时间 (小时)') ax4.set_ylabel('功率 (MW)') + ax4.legend() ax4.grid(True) + # 上网电量 + ax5.plot(hours, result['grid_feed_in'], 'orange', linewidth=2) + ax5.set_title('上网电量 (MW)') + ax5.set_xlabel('时间 (小时)') + ax5.set_ylabel('功率 (MW)') + ax5.grid(True) + + # 能量平衡分析 + total_gen = sum(thermal_output) + sum(wind_output) + sum(solar_output) + total_load = sum(load_demand) + total_curtailed = sum(result['curtailed_wind']) + sum(result['curtailed_solar']) + total_grid = sum(result['grid_feed_in']) + total_charge = sum(result['charge_profile']) + total_discharge = sum(result['discharge_profile']) + + # 创建能量平衡柱状图 + categories = ['总发电量', '总负荷', '弃风弃光', '上网电量', '储能充电', '储能放电'] + values = [total_gen, total_load, total_curtailed, total_grid, total_charge, total_discharge] + colors = ['blue', 'red', 'orange', 'green', 'cyan', 'magenta'] + + bars = ax6.bar(categories, values, color=colors, alpha=0.7) + ax6.set_title('能量平衡分析') + ax6.set_ylabel('能量 (MWh)') + ax6.grid(True, axis='y', alpha=0.3) + + # 在柱状图上添加数值标签 + for bar, value in zip(bars, values): + height = bar.get_height() + ax6.text(bar.get_x() + bar.get_width()/2., height, + f'{value:.1f}', ha='center', va='bottom', fontsize=9) + plt.tight_layout() plt.show() @@ -173,31 +235,31 @@ def compare_scenarios(): print("\n=== 场景比较 ===") # 运行三个场景 - result1 = example_1_basic_scenario() - result2 = example_2_high_renewable_scenario() - result3 = example_3_winter_scenario() + data1 = example_1_basic_scenario() + data2 = example_2_high_renewable_scenario() + data3 = example_3_winter_scenario() # 比较结果 scenarios = ['基础场景', '高可再生能源场景', '冬季场景'] storage_capacities = [ - result1['required_storage_capacity'], - result2['required_storage_capacity'], - result3['required_storage_capacity'] + data1['result']['required_storage_capacity'], + data2['result']['required_storage_capacity'], + data3['result']['required_storage_capacity'] ] curtailment_wind = [ - result1['total_curtailment_wind_ratio'], - result2['total_curtailment_wind_ratio'], - result3['total_curtailment_wind_ratio'] + data1['result']['total_curtailment_wind_ratio'], + data2['result']['total_curtailment_wind_ratio'], + data3['result']['total_curtailment_wind_ratio'] ] curtailment_solar = [ - result1['total_curtailment_solar_ratio'], - result2['total_curtailment_solar_ratio'], - result3['total_curtailment_solar_ratio'] + data1['result']['total_curtailment_solar_ratio'], + data2['result']['total_curtailment_solar_ratio'], + data3['result']['total_curtailment_solar_ratio'] ] grid_feed_in = [ - result1['total_grid_feed_in_ratio'], - result2['total_grid_feed_in_ratio'], - result3['total_grid_feed_in_ratio'] + data1['result']['total_grid_feed_in_ratio'], + data2['result']['total_grid_feed_in_ratio'], + data3['result']['total_grid_feed_in_ratio'] ] print("\n场景比较结果:") @@ -207,7 +269,7 @@ def compare_scenarios(): print(f"{scenario:<15} {storage_capacities[i]:<12.2f} {curtailment_wind[i]:<8.3f} " f"{curtailment_solar[i]:<8.3f} {grid_feed_in[i]:<8.3f}") - return result1, result2, result3 + return data1, data2, data3 if __name__ == "__main__": @@ -215,13 +277,19 @@ if __name__ == "__main__": print("=" * 50) # 运行示例 - result1, result2, result3 = compare_scenarios() + data1, data2, data3 = compare_scenarios() # 绘制图表(如果matplotlib可用) try: - plot_results(result1, "基础场景储能运行情况") - plot_results(result2, "高可再生能源场景储能运行情况") - plot_results(result3, "冬季场景储能运行情况") + plot_results(data1['result'], "基础场景储能运行情况", + data1['solar_output'], data1['wind_output'], + data1['thermal_output'], data1['load_demand']) + plot_results(data2['result'], "高可再生能源场景储能运行情况", + data2['solar_output'], data2['wind_output'], + data2['thermal_output'], data2['load_demand']) + plot_results(data3['result'], "冬季场景储能运行情况", + data3['solar_output'], data3['wind_output'], + data3['thermal_output'], data3['load_demand']) except ImportError: print("\n注意: matplotlib未安装,无法绘制图表") print("要安装matplotlib,请运行: pip install matplotlib")