【论文复现】风光制氢合成氨系统优化研究(Python代码实现)
欢迎来到本博客❤️❤️博主优势博客内容尽量做到思维缜密逻辑清晰为了方便读者。⛳️座右铭行百里者半于九十。本文内容如下⛳️赠与读者做科研涉及到一个深在的思想系统需要科研者逻辑缜密踏实认真但是不能只是努力很多时候借力比努力更重要然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览免得骤然跌入幽暗的迷宫找不到来时的路它不足为你揭示全部问题的答案但若能解答你胸中升起的一朵朵疑云也未尝不会酿成晚霞斑斓的别一番景致万一它给你带来了一场精神世界的苦雨那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。或许雨过云收神驰的天地更清朗.......第一部分——内容介绍摘 要为有效削减可再生能源发电出力的波动性提升可再生能源的整体利用效能本研究创新性地设计了一种集并网与离网功能于一体的风光互补制氢合成氨系统。该系统以实现年度收益最大化为核心目标在构建过程中充分考量了系统内的电平衡、氢平衡以及与电网的交互作用等关键运行约束条件进而建立了容量配置与调度优化的综合模型。研究以内蒙古某地区实际的风光出力数据作为模型输入通过深入分析风光容量的配比关系系统探究了不同风光容量配比对系统技术经济性能的具体影响。研究结果显示经过科学的容量配置与精细的调度优化并/离网风光互补制氢合成氨系统能够在风光出力多变的情境下灵活切换工作模式有效平抑风光出力的波动确保合成氨设备能够稳定且高效地运行其中并网型系统的综合性能优于离网型系统。在具体案例区域中随着风电装机容量的逐步提升系统所需配置的电解槽与储氢罐容量先呈现下降趋势后转为上升当风电与光伏的装机容量相近或相等时系统的经济效率达到较高水平。关 键 词风光互补系统绿色合成氨容量与调度优化风光容量配比研究本文聚焦于内蒙古特定区域精心打造了兼具并网与离网功能的风光制氢合成氨系统。在深入考量运行调度优化策略的前提下构建了一个以系统收益最大化为导向的目标函数优化模型。通过细致剖析风光容量配比深入探究了其对并网型与离网型系统技术经济层面的影响并得出以下关键结论。1所构建的并/离网风光制氢合成氨系统在历经各设备科学合理的容量配置后展现出了良好的经济性。同时借助系统运行调度优化分析该系统能够在风光出力条件各异的情况下灵活且合理地切换工作状态确保合成氨设备实现稳定、持续的生产作业并显著提升了可再生能源的利用效率。2经系统容量调度优化分析发现并网型系统在综合性能上更胜一筹。具体而言离网型系统的合成氨平准化成本高达3807.16元/t较并网型系统高出15.77%。这一差异主要源于离网型系统需配置更大容量的电解槽和储氢罐同时还需配备蓄电池从而增加了成本。3在本文所研究的内蒙古特定区域内对于并网型系统而言当风电装机容量略高于光伏装机容量时系统的经济性能达到最优状态而对于离网型系统当风光容量相近或相等时系统的经济性能最为出色。为积极应对全球气候变化的严峻挑战2016年全球主要国家携手签署了《巴黎气候协定》达成了应对气候变化的共同意志并共同规划了二氧化碳减排的具体路径。中国亦于2020年郑重宣布将力争于2030年前实现碳达峰2060年前达成碳中和的宏伟“双碳”目标。在此背景下大力发展风能、太阳能等可再生能源成为实现“双碳”目标、推动能源体系转型发展的核心策略与坚实支撑[1-3]。2022年3月中国国家发展和改革委员会与国家能源局携手发布了《氢能产业发展中长期规划2021—2035年》[4]清晰界定了氢能在中国能源结构调整与产业升级中的战略定位同时明确了“构建清洁、低碳、低成本的多元制氢体系优先发展可再生能源制氢严格限制化石能源制氢”的发展导向。据预测至2050年氢能在中国能源消费中的占比将达到10%[5]有望引领人类能源体系的深刻变革推动第三次能源革命的到来。“绿氢”作为二次能源的佼佼者其潜在应用领域广泛涵盖化工、冶金、交通、天然气掺氢、氢储能等多个行业[6]。当前中国的氢能消费主要集中于合成氨、合成甲醇等石化领域作为工业原料其中合成氨产业的氢气消耗量占据全国氢气总消耗量的37%[7]。利用风光等可再生能源发电生产“绿氢”以替代“灰氢”作为化工原料合成氨renewable power to ammoniaRePtA已成为中国电力和化工行业碳减排的重要突破口[8-9]。然而风能、太阳能等可再生能源具有显著的波动性、间歇性和随机性导致风光发电出力亦呈现出较大的不稳定性。在并网型RePtA系统并网过程中这可能引发供电电压和频率的不稳定进而造成严重的弃风弃光现象。而对于离网型RePtA系统风光发电出力的直接作用可能导致电解制氢设备频繁启停、寿命缩短等问题[10]。针对RePtA系统的上述挑战已有众多学者展开了深入探索。Richard等人[11]构建了可再生能源制氢合成氨系统的优化算法模型深入研究了可再生能源波动对RePtA系统设计规模及经济性的影响发现可再生能源电价、电解槽成本、哈伯-博世法操作负载以及可再生能源比例是影响系统经济性的关键因素。安光禄等[12]则从氨的季节性需求出发构建了以系统年总成本最小化为优化目标的可再生能源合成氨系统优化设计模型确定了系统的最优容量配置与操作计划。林今等[13]搭建了风光电解水制氢合成氨系统模型对比分析了电网调峰型、电网友好型以及工艺离网型系统的绿氨成本及适用场景指出近期应发展电网友好型RePtA系统远期则应转向工艺离网型RePtA系统。李晨鹏等[14]则建立了无碳氨成本计算方法和煤电机组氨煤混燃平准化电力成本经济模型评估了未来使用可再生能源生产的无碳氨在氨煤混燃机组中的实际应用技术经济性。尽管上述研究在RePtA系统的容量配置、运行优化以及技术经济性方面取得了有价值成果但针对风光互补发电系统对并网型与离网型系统技术经济影响的研究仍显不足。而风光互补发电系统正是利用风光互补的特性对RePtA系统的容量配置与调度优化产生着重要影响。鉴于此本文通过构建并/离网风光互补制氢合成氨系统以系统收益最大化为目标函数对系统各设备的容量及运行策略进行优化同时深入探究风光容量配比对并/离网风光互补制氢合成氨系统技术经济性的影响。第二部分——运行结果运行视频通过网盘分享的文件运行视频(Python版本).mp4链接:https://pan.baidu.com/s/1Tzys9HVgynX_xsAffQETng?pwdyb8j提取码: yb8j--来自百度网盘超级会员v6的分享主函数代码 生成所有优化结果和图表的主脚本 import os import sys import pandas as pd # 检查当前目录 if os.path.basename(os.getcwd()) ! optimal_python: print(请在optimal_python目录下运行此脚本) sys.exit(1) sys.path.insert(0, os.getcwd()) from utils.data_loader import DataLoader from solvers.ongrid_optimizer import OnGridOptimizer from solvers.offgrid_optimizer import OffGridOptimizer from utils.visualization import ( plot_power_balance_ongrid, plot_hydrogen_balance, plot_power_balance_offgrid, setup_chinese_font ) import matplotlib.pyplot as plt print(*80) print(生成所有优化结果和图表) print(*80) print(\n本脚本将生成) print( 1. 详细调度结果8760小时) print( 2. 电力平衡和氢平衡图图2-5) print( 3. 容量配比分析结果) print( 4. 容量配比对比图图6-8) print(*80) response input(\n是否继续(y/n): ) if response.lower() ! y: print(已取消) sys.exit(0) # 创建结果目录 os.makedirs(results, exist_okTrue) os.makedirs(results/figures, exist_okTrue) # # 第1步生成详细调度结果用于图2-5 # print(\n *80) print(第1步生成详细调度结果) print(*80) # 1.1 并网型调度结果 print(\n[1.1] 并网型系统风电600MW 光伏600MW...) data_loader_on DataLoader() optimizer_on OnGridOptimizer(data_loader_on) optimizer_on.set_fixed_capacities(wind_capacity600, solar_capacity600) optimizer_on.build_model() success_on optimizer_on.solve(time_limit900, mip_gap0.02, verboseFalse) if success_on: dispatch_data optimizer_on.results[dispatch] df_ongrid pd.DataFrame(dispatch_data) ongrid_file os.path.join(results, ongrid_dispatch_results.xlsx) df_ongrid.to_excel(ongrid_file, indexFalse) print(f 已保存: {ongrid_file} ({df_ongrid.shape[0]}行 x {df_ongrid.shape[1]}列)) else: print( 失败: 并网型优化失败) sys.exit(1) # 1.2 离网型调度结果使用最优配比600600 print(\n[1.2] 离网型系统风电600MW 光伏600MW...) data_loader_off DataLoader() optimizer_off OffGridOptimizer(data_loader_off) optimizer_off.set_fixed_capacities(wind_capacity600, solar_capacity600) optimizer_off.build_model() success_off optimizer_off.solve(time_limit900, mip_gap0.02, verboseFalse) if success_off: dispatch_data optimizer_off.results[dispatch] df_offgrid pd.DataFrame(dispatch_data) offgrid_file os.path.join(results, offgrid_dispatch_results.xlsx) df_offgrid.to_excel(offgrid_file, indexFalse) print(f 已保存: {offgrid_file} ({df_offgrid.shape[0]}行 x {df_offgrid.shape[1]}列)) else: print( 失败: 离网型优化失败) sys.exit(1) # # 第2步生成电力平衡和氢平衡图图2-5 # print(\n *80) print(第2步生成电力平衡和氢平衡图图2-5) print(*80) setup_chinese_font() figures_dir os.path.join(results, figures) # 2.1 并网型图表 print(\n[2.1] 并网型系统图表...) plot_power_balance_ongrid(df_ongrid, 0, 168, os.path.join(figures_dir, 图2a_并网型大风季电力平衡.png)) plot_power_balance_ongrid(df_ongrid, 4368, 4368168, os.path.join(figures_dir, 图2b_并网型小风季电力平衡.png)) plot_hydrogen_balance(df_ongrid, 0, 168, os.path.join(figures_dir, 图3a_并网型大风季氢平衡.png), system_modeongrid) plot_hydrogen_balance(df_ongrid, 4368, 4368168, os.path.join(figures_dir, 图3b_并网型小风季氢平衡.png), system_modeongrid) print( 已生成图2a, 2b, 3a, 3b) # 2.2 离网型图表 print(\n[2.2] 离网型系统图表...) plot_power_balance_offgrid(df_offgrid, 0, 168, os.path.join(figures_dir, 图4a_离网型大风季电力平衡.png)) plot_power_balance_offgrid(df_offgrid, 4368, 4368168, os.path.join(figures_dir, 图4b_离网型小风季电力平衡.png)) plot_hydrogen_balance(df_offgrid, 0, 168, os.path.join(figures_dir, 图5a_离网型大风季氢平衡.png), system_modeoffgrid) plot_hydrogen_balance(df_offgrid, 4368, 4368168, os.path.join(figures_dir, 图5b_离网型小风季氢平衡.png), system_modeoffgrid) print( 已生成图4a, 4b, 5a, 5b) # # 第3步容量配比分析 # print(\n *80) print(第3步容量配比分析) print(*80) import numpy as np # 配比参数与MATLAB一致 wind_caps np.arange(150, 1200 150, 150) solar_caps 1200 - wind_caps # 并网型和离网型使用相同配比 wind_capacities_ongrid wind_caps solar_capacities_ongrid solar_caps wind_capacities_offgrid wind_caps solar_capacities_offgrid solar_caps results_ongrid [] results_offgrid [] # 3.1 并网型分析 print(f\n[3.1] 并网型分析{len(wind_capacities_ongrid)}个配比...) for i, (wind_cap, solar_cap) in enumerate(zip(wind_capacities_ongrid, solar_capacities_ongrid)): print(f [{i1}/{len(wind_capacities_ongrid)}] 风电{wind_cap:.0f}MW, 光伏{solar_cap:.0f}MW, end ) try: data_loader DataLoader() optimizer OnGridOptimizer(data_loader) optimizer.set_fixed_capacities(wind_capacitywind_cap, solar_capacitysolar_cap) optimizer.build_model() success optimizer.solve(time_limit600, mip_gap0.02, verboseFalse) if success: cap optimizer.results[capacity] econ optimizer.results[economics] results_ongrid.append({ 风电容量_MW: wind_cap, 光伏容量_MW: solar_cap, 电解槽容量_Nm3_h: cap[电解槽容量_Nm3_h], 储氢罐容量_kg: cap[储氢罐容量_kg], 合成氨产能_ton_year: cap[合成氨产能_ton_year], 年化总成本_万元: econ[年化总成本_万元], 年产氨量_吨: econ[年产氨量_吨], 单位氨成本_元_吨: econ[单位氨成本_元_吨], }) print(f成本{econ[单位氨成本_元_吨]:.2f}元/t) else: raise Exception(求解失败) except Exception as e: print(f失败: {str(e)}) results_ongrid.append({ 风电容量_MW: wind_cap, 光伏容量_MW: solar_cap, 电解槽容量_Nm3_h: np.nan, 储氢罐容量_kg: np.nan, 合成氨产能_ton_year: np.nan, 年化总成本_万元: np.nan, 年产氨量_吨: np.nan, 单位氨成本_元_吨: np.nan, }) # 3.2 离网型分析 print(f\n[3.2] 离网型分析{len(wind_capacities_offgrid)}个配比...) for i, (wind_cap, solar_cap) in enumerate(zip(wind_capacities_offgrid, solar_capacities_offgrid)): print(f [{i1}/{len(wind_capacities_offgrid)}] 风电{wind_cap:.0f}MW, 光伏{solar_cap:.0f}MW, end ) try: data_loader DataLoader() optimizer OffGridOptimizer(data_loader) optimizer.set_fixed_capacities(wind_capacitywind_cap, solar_capacitysolar_cap) optimizer.build_model() success optimizer.solve(time_limit600, mip_gap0.02, verboseFalse) if success: cap optimizer.results[capacity] econ optimizer.results[economics] results_offgrid.append({ 风电容量_MW: wind_cap, 光伏容量_MW: solar_cap, 电解槽容量_Nm3_h: cap[电解槽容量_Nm3_h], 储氢罐容量_kg: cap[储氢罐容量_kg], 蓄电池容量_MWh: cap[蓄电池容量_MWh], 合成氨产能_ton_year: cap[合成氨产能_ton_year], 年化总成本_万元: econ[年化总成本_万元], 年产氨量_吨: econ[年产氨量_吨], 单位氨成本_元_吨: econ[单位氨成本_元_吨], }) print(f成本{econ[单位氨成本_元_吨]:.2f}元/t) else: raise Exception(求解失败) except Exception as e: import traceback print(f失败: {str(e)}) print(traceback.format_exc()) results_offgrid.append({ 风电容量_MW: wind_cap, 光伏容量_MW: solar_cap, 电解槽容量_Nm3_h: np.nan, 储氢罐容量_kg: np.nan, 蓄电池容量_MWh: np.nan, 合成氨产能_ton_year: np.nan, 年化总成本_万元: np.nan, 年产氨量_吨: np.nan, 单位氨成本_元_吨: np.nan, }) # 3.3 保存容量配比分析结果 print(\n[3.3] 保存容量配比分析结果...) df_ratio_ongrid pd.DataFrame(results_ongrid) df_ratio_offgrid pd.DataFrame(results_offgrid) results_file os.path.join(results, optimization_results.xlsx) with pd.ExcelWriter(results_file, engineopenpyxl) as writer: df_ratio_ongrid.to_excel(writer, sheet_name并网型_容量配比分析, indexFalse) df_ratio_offgrid.to_excel(writer, sheet_name离网型_容量配比分析, indexFalse) print(f 已保存: {results_file}) # # 第4步生成容量配比对比图图6-8 # print(\n *80) print(第4步生成容量配比对比图图6-8) print(*80) # 图6电解槽容量 fig, ax plt.subplots(figsize(12, 6)) x_axis np.arange(1, len(df_ratio_ongrid) 1) ax.plot(x_axis, df_ratio_ongrid[电解槽容量_Nm3_h]/1000, markero, linewidth2.5, markersize8, label并网型, color#4472C4) ax.plot(x_axis, df_ratio_offgrid[电解槽容量_Nm3_h]/1000, markers, linewidth2.5, markersize8, label离网型, color#ED7D31) # 设置x轴刻度标签 xtick_labels [f风:{int(row[风电容量_MW])} 光:{int(row[光伏容量_MW])} for _, row in df_ratio_ongrid.iterrows()] ax.set_xticks(x_axis) ax.set_xticklabels(xtick_labels, fontsize9) ax.set_xlabel(风光容量配比/MW, fontsize14) ax.set_ylabel(电解槽容量/(千Nm3/h), fontsize14) ax.grid(True, alpha0.3, linestyle--) ax.legend(locupper right, fontsize12, frameonTrue, shadowTrue) ax.tick_params(labelsize11) plt.tight_layout() plt.savefig(os.path.join(figures_dir, 图6_风光配比对电解槽容量影响.png), dpi300, bbox_inchestight) plt.close() print( 已保存: 图6_风光配比对电解槽容量影响.png) # 图7储氢罐容量 fig, ax plt.subplots(figsize(12, 6)) x_axis np.arange(1, len(df_ratio_ongrid) 1) ax.plot(x_axis, df_ratio_ongrid[储氢罐容量_kg]/1000, markero, linewidth2.5, markersize8, label并网型, color#4472C4) ax.plot(x_axis, df_ratio_offgrid[储氢罐容量_kg]/1000, markers, linewidth2.5, markersize8, label离网型, color#ED7D31) # 设置x轴刻度标签 xtick_labels [f风:{int(row[风电容量_MW])} 光:{int(row[光伏容量_MW])} for _, row in df_ratio_ongrid.iterrows()] ax.set_xticks(x_axis) ax.set_xticklabels(xtick_labels, fontsize9) ax.set_xlabel(风光容量配比/MW, fontsize14) ax.set_ylabel(储氢罐容量/(吨), fontsize14) ax.grid(True, alpha0.3, linestyle--) ax.legend(locupper right, fontsize12, frameonTrue, shadowTrue) ax.tick_params(labelsize11) plt.tight_layout() plt.savefig(os.path.join(figures_dir, 图7_风光配比对储氢罐容量影响.png), dpi300, bbox_inchestight) plt.close() print( 已保存: 图7_风光配比对储氢罐容量影响.png) # 图8合成氨成本 fig, ax plt.subplots(figsize(12, 6)) x_axis np.arange(1, len(df_ratio_ongrid) 1) ax.plot(x_axis, df_ratio_ongrid[单位氨成本_元_吨], markero, linewidth2.5, markersize8, label并网型, color#4472C4) ax.plot(x_axis, df_ratio_offgrid[单位氨成本_元_吨], markers, linewidth2.5, markersize8, label离网型, color#ED7D31) # 标注最优点 valid_ongrid df_ratio_ongrid[单位氨成本_元_吨].notna() valid_offgrid df_ratio_offgrid[单位氨成本_元_吨].notna() if valid_ongrid.any(): ongrid_min_idx df_ratio_ongrid.loc[valid_ongrid, 单位氨成本_元_吨].idxmin() ax.plot(ongrid_min_idx 1, df_ratio_ongrid.loc[ongrid_min_idx, 单位氨成本_元_吨], marker*, markersize15, colorred, zorder5) ax.annotate(f最优点\n({df_ratio_ongrid.loc[ongrid_min_idx, 风电容量_MW]:.0f} MW, f{df_ratio_ongrid.loc[ongrid_min_idx, 单位氨成本_元_吨]:.0f} 元/t), xy(ongrid_min_idx 1, df_ratio_ongrid.loc[ongrid_min_idx, 单位氨成本_元_吨]), xytext(20, 30), textcoordsoffset points, fontsize10, haleft, bboxdict(boxstyleround,pad0.5, fcyellow, alpha0.7), arrowpropsdict(arrowstyle-, connectionstylearc3,rad0)) if valid_offgrid.any(): offgrid_min_idx df_ratio_offgrid.loc[valid_offgrid, 单位氨成本_元_吨].idxmin() ax.plot(offgrid_min_idx 1, df_ratio_offgrid.loc[offgrid_min_idx, 单位氨成本_元_吨], marker*, markersize15, colorred, zorder5) ax.annotate(f最优点\n({df_ratio_offgrid.loc[offgrid_min_idx, 风电容量_MW]:.0f} MW, f{df_ratio_offgrid.loc[offgrid_min_idx, 单位氨成本_元_吨]:.0f} 元/t), xy(offgrid_min_idx 1, df_ratio_offgrid.loc[offgrid_min_idx, 单位氨成本_元_吨]), xytext(20, -40), textcoordsoffset points, fontsize10, haleft, bboxdict(boxstyleround,pad0.5, fcyellow, alpha0.7), arrowpropsdict(arrowstyle-, connectionstylearc3,rad0)) # 设置x轴刻度标签 xtick_labels [f风:{int(row[风电容量_MW])} 光:{int(row[光伏容量_MW])} for _, row in df_ratio_ongrid.iterrows()] ax.set_xticks(x_axis) ax.set_xticklabels(xtick_labels, fontsize9) ax.set_xlabel(风光容量配比/MW, fontsize14) ax.set_ylabel(合成氨平准化成本/(元/吨), fontsize14) ax.grid(True, alpha0.3, linestyle--) ax.legend(locupper right, fontsize12, frameonTrue, shadowTrue) ax.tick_params(labelsize11) plt.tight_layout() plt.savefig(os.path.join(figures_dir, 图8_风光配比对合成氨成本影响.png), dpi300, bbox_inchestight) plt.close() print( 已保存: 图8_风光配比对合成氨成本影响.png)第三部分——参考文献文章中一些内容引自网络会注明出处或引用为参考文献难免有未尽之处如有不妥请随时联系删除。(文章内容仅供参考具体效果以运行结果为准)[1]邓振宇,周家辉,徐钢,等.并/离网风光互补制氢合成氨系统容量-调度优化分析[J].热力发电, 2024, 53(9):136-146.第四部分——Matlab代码、数据、论文下载资料获取更多粉丝福利MATLAB|Simulink|Python资源获取
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2429367.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!