修复图表乱码。
This commit is contained in:
152
example_usage.py
152
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")
|
||||
|
||||
Reference in New Issue
Block a user