ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

风力发电与压缩空气储能联合运行建模及Matlab仿真实现

风力发电与压缩空气储能联合运行建模及Matlab仿真实现 风电这块儿大家做功率预测、做并网控制核心痛点一直很稳定风是间歇的风电出力也跟着犯神经今天风大明天没风上午十分钟内风速能跳好几米每秒电网那边调度看着功率曲线直摇头。要让风电从“看天吃饭”变成“可调可控”唯一的思路就是配储能。而在储能这条路上锂电池研究多、热度高但真到了风电场级的大容量、长时间尺度场景压缩空气储能CAES反而是被严重低估的一个选项——寿命长、成本低、容量大不受地理条件限制。本文要聊的就是“风力涡轮机系统与压缩空气储能联合运行的建模与实验研究”附带完整的Matlab代码实现思路从系统架构、数学模型、仿真搭建到实验对标一条线走通。这篇内容适合谁看新能源方向的硕博研究生、做风电或者储能系统仿真的工程师、参加数学建模竞赛想找能源类题目切入点的同学。无论你是想快速搭一个联合系统的仿真平台还是准备做硬件在环实验下文里都有可以直接抄的模型方程、代码框架以及我实际调参踩坑的记录。1. 为什么要做风储联合整体设计思路与方案选型1.1 风电出力波动的本质与储能需求风电出力的波动性说白了就是空气流动的不确定性在电气侧的映射。风速从9 m/s跳到12 m/s功率变化可不是线性增长——风机捕获的风功率与风速的立方成正比公式是 P 0.5·ρ·A·Cp·v³。其中ρ是空气密度A是风轮扫掠面积Cp是风能利用系数。按这个关系风速增加33%理论功率可以增加接近1.37倍这个突变对电网频率、电压稳定性的冲击相当直观。实际运行中风电功率波动是多时间尺度叠加的结果湍流引起的秒级高频波动、阵风引起的分钟级中频波动、天气系统过境带来的小时级低频波动。如果风电场直接并网这些波动都会传导到电网侧调度部门看到的就是一条“不好驾驭”的出力曲线。要平滑这条曲线储能系统需要具备两方面的能力一是快速响应能跟踪秒级到分钟级的功率变化二是长时间吞吐能量覆盖小时级的风速持续偏低或偏高。在这儿解释一句为什么建模先行储能系统的容量配置、控制策略设计、经济性评估都不能靠拍脑袋。你得先在仿真环境里把“风力机—储能—负荷/电网”这条链路的动态特性跑清楚算出不同风速序列下储能需要吸收或释放多少功率、储气室压力怎么变化、整体效率是多少再决定系统参数。空对空谈“加储能”大概率是要翻车的。1.2 储能方案横向对比为什么选中压缩空气储能储能技术路线不少但适合与风电大规模联合运行的其实就几个。我做选择时拉了一张对比表把关键指标摊开看技术路线能量密度 (Wh/L)功率密度 (W/L)响应速度使用寿命单位成本地理限制锂电池200~4001000毫秒级5~10年中高无飞轮储能20~801000毫秒级15~20年高无抽水蓄能0.2~20.1~0.2分钟级50年低强压缩空气储能3~200.2~0.5秒~分钟级30~40年低较弱锂电池的响应速度快、能量密度高适合做短时功率补偿但大规模风电储能动辄需要几小时甚至更长的能量吞吐锂电池堆上去成本非常可观而且循环寿命受充放电深度影响大几年就得换。抽水蓄能虽然便宜耐用但需要特定地形和水库条件不是每个风电场旁边都有合适的地理环境。压缩空气储能的核心优势在于容量大、单位成本低、使用寿命长可以做到“慢充慢放”或者“快充慢放”与风电出力的长时间波动匹配度很高。它的响应速度虽然比电池慢一些但对分钟级乃至小时级的风电功率平滑来说完全够用。而且现代压缩空气储能可以配合储热系统即绝热压缩空气储能A-CAES把压缩过程中产生的热量存下来膨胀发电时再换热回去往返效率能做到70%左右已经不输给一些电池方案了。1.3 联合系统架构与技术路线联合系统的整体架构我在模型里分成了三层来看物理层风力机风轮传动链发电机出力经过变压器接入交流母线母线另一侧连接压缩空气储能系统的电动机/发电机储能系统内部是压缩机、储气室、膨胀机透平、储热/换热模块。风力发电时如果出力高于目标功率多余电能驱动压缩机把空气压入储气室如果出力低于目标功率储气室释放高压空气驱动膨胀机发电补足差额。控制层采集风电实时出力、储气室压力、膨胀机/压缩机状态由上层控制器计算功率分配指令。控制目标可以是平滑出力波动、跟踪调度计划曲线或者基于电价信号的套利策略。仿真层在Matlab/Simulink里搭建风力机模型和压缩空气储能热力学模型跑不同风速场景验证控制策略并输出关键性能指标。这套架构的好处是模块解耦清晰——风机模型、压缩机模型、储气室模型、膨胀机模型各自独立替换任何一部分都不会影响其他模块后面做实验对比时也可以逐模块校准。这也是我在建模时最看重的一点先保证每个子模块的物理准确性再谈系统层面的联合控制。2. 核心细节解析与实操要点风力机和CAES建模2.1 风力机气动模型与传动链建模风力机模型是整个联合系统的“输入源”它的精度直接决定了储能侧需要怎么配合。在Matlab实现里我采用了经典的两质量块模型思路但做了适当简化以平衡计算量。风功率捕获部分核心是风能利用系数Cp。Cp是叶尖速比λ和桨距角β的函数工程上常用如下经验公式逼近这也是IEC标准里的常见写法Cp(λ, β) 0.5176 · (116/λ_i - 0.4·β - 5) · e^(-21/λ_i) 0.0068·λ其中1/λ_i 1/(λ 0.08·β) - 0.035/(β³ 1)叶尖速比λ ω·R / vω是风轮转速R是风轮半径v是风速。这个公式算出的Cp最大值在0.48左右接近贝兹极限0.593符合实际风机的转换效率水平。传动链我采用了单质量块简化J·dω/dt T_aero - T_emJ是风轮与发电机折算到风轮侧的转动惯量T_aero是气动转矩T_aero 0.5·ρ·A·Cp·v³/ωT_em是发电机的电磁转矩。在功率调度层面的仿真里这个一阶惯性模型已经足够不需要再细致建模齿轮箱内部的多级传动刚度。如果你的研究对象是暂态稳定性或者机械载荷分析那就需要升到更精细的两质量块模型了。发电机部分并网研究常用dq坐标系下的双馈感应发电机DFIG模型包含定子磁链、转子电压方程、电磁转矩方程等状态变量较多。但如果只是研究风储联合系统的功率分配和储能策略我建议把发电机组等效为一个一阶惯性环节P_gen P_ref / (τ_gen·s 1)。这里τ_gen取0.1~0.5秒即可。为什么可以简化因为储能控制的关注点在分钟级的时间尺度发电机的电气暂态毫秒级对功率分配结果影响很小强行加入只会让仿真变慢、收敛性变差。2.2 压缩空气储能热力学模型压缩空气储能的建模是整个系统的核心难点因为它涉及流体力学、热力学和机械动力学的多域耦合。我在建模时把储能系统拆成压缩机、储气室、膨胀机和换热器四个子模块。压缩机模块压缩机消耗电功率P_com将常压空气压缩到储气室压力p_s。对于理想气体多变压缩过程的出口温度 T_out T_in · (p_out/p_in)^((γ-1)/(η_pol·γ))其中γ是空气绝热指数约1.4η_pol是多变效率。消耗的功率可以近似为P_com (ṁ · c_p · T_in / η_com) · [(p_out/p_in)^((γ-1)/γ) - 1]这里ṁ是空气质量流量c_p是定压比热容。实际仿真我建议直接调用这个方程而不是用等熵效率近似因为多变效率在压缩比变化较大时更接近真实值。储气室模块储气室是一个容积固定的压力容器内部压力和温度随时间变化。连续方程给出质量守恒dm/dt ṁ_in - ṁ_out能量方程给出温度变化dT/dt (1/(m·c_v)) · [ṁ_in·(h_in - u) - ṁ_out·(h_out - u)]其中h_in和h_out分别是进出口空气比焓u是储气室内空气比内能。如果储气室壁与外界充分换热可以进一步加上对流换热项。为了方便仿真我把储气室假设为绝热然后在后处理时通过效率修正来反映实际热损失。这样做的原因是绝热假设下储气室模型是一组清晰的一阶微分方程便于验证求解器稳定性误差可以后期修正。膨胀机模块膨胀机透平把储气室的高压空气热能转换成机械功。与压缩机对称输出功率为P_exp ṁ · c_p · T_in · η_exp · [1 - (p_out/p_in)^((γ-1)/γ)]注意这里的η_exp是膨胀效率取决于透平的等熵效率工程上一般取0.75~0.85。如果配了储热系统膨胀机入口温度可以提高从而提升输出功率和整体效率——这就是绝热压缩空气储能比传统CAES效率更高的原因。整体系统的往返效率定义为 RTE E_exp_out / E_com_in即膨胀发电量除以压缩耗电量。建模完成后我建议单独核算这个指标如果低于50%基本就是模型参数有问题需要回头查压缩机的效率和膨胀机的进口温度。2.3 联合运行控制策略与功率分配逻辑有了风机模型和储能模型接下来要回答的核心问题是储能系统在每个时刻应该充多少、放多少我采用了两种控制策略分别应对平滑波动和跟踪计划出力两类应用场景。平滑出力波动策略核心思路是让风储联合系统向电网输出的功率P_grid尽量平滑。具体做法是先把风电原始功率P_wind通过一阶低通滤波器得到平滑后的参考功率P_ref储能系统的参考充放电功率就是P_sto_ref P_wind - P_ref。当P_sto_ref为正时储能充电为负时储能放电。滤波器时间常数T_f决定了平滑的力度T_f越大输出越平滑但储能需要的容量也越大这是一个需要权衡的设计参数。跟踪计划出力策略这种场景下风电场需要按照日前申报的计划曲线P_plan发电。储能实时补偿偏差P_sto_ref P_wind - P_plan。如果风力实际出力高于计划值储能充电吸收多余电量如果出力低于计划值储能放电补充不足电量。此策略对储能的容量要求比平滑策略小但对P_plan的准确性依赖较高。实际仿真中我还加入了储气室压力边界保护逻辑当储气室压力达到上限时即使功率分配指令要求储能继续充电也强制转为弃风或降低风机出力当压力低于下限时储能停止放电切为仅风电直供模式。这层约束非常重要因为实际物理系统不允许压力无限上升或下降。在代码里就是一个if-else判断但少了它仿真跑不了多长时间就会出问题。3. 实操过程与核心环节实现Matlab代码框架与Simulink搭建3.1 参数初始化与数据准备动手写代码之前先把系统参数集中到一个初始化脚本里。我的习惯是单独建立一个init_params.m把所有需要调参的量都放在里面后续修改参数只动这个文件避免满屏找变量。核心参数大致分为三类风机参数风轮半径R、额定功率P_rated、切入/切出风速、额定风速、空气密度ρ。这些参数直接查风机的出厂说明书即可仿真是用不着调它们的。储能参数储气室体积V_s、初始压力p_0、最大/最小压力、压缩机多变效率η_pol、膨胀机效率η_exp、空气绝热指数γ、空气比热容c_p/c_v。这些参数不同CAES系统差异很大需要根据地实验装置的具体参数来设定。控制参数低通滤波器时间常数T_f、仿真步长Ts、仿真时长T_end、功率上限/下限约束。风速数据方面我建议优先使用实测风速时间序列可以从当地气象站或风电场SCADA系统导出。如果没有实测数据可以用Matlab自带的高斯湍流模型生成合成风速序列。具体做法是对平均风速叠加一个由白噪声滤波生成的湍流分量使风速谱密度符合Kaimal谱特征这样仿真得到的功率波动更接近真实情况。注意风速序列的采样周期要尽量短1秒或更短因为储能控制器需要感知到分钟级的波动细节。3.2 核心函数模块的Matlab实现主仿真流程我用的是m脚本加函数文件的组合方式没有直接上Simulink因为纯m脚本更适合做批量场景仿真和参数扫描。当然如果你的研究重点在控制器快速原型验证Simulink也是好选择后面3.3我会专门讲Simulink的搭建思路。首先是风力机功率计算函数function P_wind wind_turbine_power(v, R, rho, Cp_max) % 输入: 风速v(标量或向量), 风轮半径R, 空气密度rho, 最大风能利用系数 % 输出: 风力机捕获功率 A pi * R^2; P_wind 0.5 * rho * A * Cp_max * v.^3; % 若风速超过切出风速功率归零低于切入风速功率为零 P_wind(v 3 | v 25) 0; end这里我对Cp做了简化处理直接用最大值Cp_max。这样做在分钟级功率调度研究中是可以接受的因为最优叶尖速比控制在正常运行范围内都能保证风机运行在最大功率点附近。如果你的仿真涉及变桨距工况或者阵风期间的风机动态那就把2.1节的Cp(λ,β)函数完整写进去。接下来是CAES储能模型函数这里我用一个状态方程描述储气室压力和温度的时间导数function [dpdt, dTdt] caes_storage(p, T, m_dot_in, m_dot_out, V_s, R_air) % p: 储气室压力(Pa), T: 温度(K) % m_dot_in: 空气质量流入速率(kg/s), m_dot_out: 流出速率 % V_s: 储气室容积(m^3), R_air: 气体常数(J/(kg·K)) m p * V_s / (R_air * T); % 当前储气室内空气质量 T_in 300; % 假设压缩机出口温度实际应由压缩比决定 cv 717; % 空气定容比热(J/(kg·K)) cp 1004; % 空气定压比热(J/(kg·K)) dpdt (R_air * T) / V_s * (m_dot_in - m_dot_out); dTdt (1 / (m * cv)) * (m_dot_in * cp * T_in - m_dot_out * cp * T - p * V_s / m * (m_dot_in - m_dot_out) / cv); % 补充如果储气室绝热能量方程里还要考虑压力做功项这里为简洁略去部分高阶项实操中可按完整能量方程编写 end注意这个函数里我做了绝热假设实际还要根据压缩比计算T_in。完整版本应通过压缩机出口温度方程计算T_in T0·(p/p0)^((γ-1)/(γ·η_pol))这里的简化是为了让示例代码逻辑清晰。主控制循环是仿真框架的核心用ode45或者for循环逐时间步推进。我用的是for循环加固定步长因为后续要对接实验数据对比固定步长更方便对齐。代码如下%% 主仿真循环 dt 1; % 时间步长, 秒 T_end 3600; % 仿真时长, 秒 N T_end / dt; P_grid zeros(1, N); P_sto zeros(1, N); p_store zeros(1, N); p_s p_0; T_s T_0; % 初始化储气室状态 for k 1:N v_k wind_speed(k); P_wind wind_turbine_power(v_k, R, rho, Cp_max); % 低通滤波平滑出力 if k 1 P_ref P_wind; else P_ref P_ref dt / T_f * (P_wind - P_ref); end P_sto_ref P_wind - P_ref; % 储气室压力边界约束 if (p_s p_max P_sto_ref 0) || (p_s p_min P_sto_ref 0) P_sto_ref 0; end % 压缩机/膨胀机功率转换 if P_sto_ref 0 % 压缩储气 m_dot_in P_sto_ref / (cp * T_amb * ((p_s/p_atm)^((gamma-1)/gamma) - 1)); m_dot_out 0; P_sto(k) P_sto_ref; P_grid(k) P_ref; elseif P_sto_ref 0 % 膨胀放气 m_dot_out -P_sto_ref / (cp * T_in * eta_exp * (1 - (p_atm/p_s)^((gamma-1)/gamma))); m_dot_in 0; P_sto(k) P_sto_ref; P_grid(k) P_ref; else m_dot_in 0; m_dot_out 0; P_sto(k) 0; P_grid(k) P_ref; end % 更新储气室状态 [dpdt, dTdt] caes_storage(p_s, T_s, m_dot_in, m_dot_out, V_s, R_air); p_s p_s dpdt * dt; T_s T_s dTdt * dt; p_store(k) p_s; end这个循环框架跑通之后大部分工作就完成了。后续的扩展方向很清晰把恒压边界改成更精细的PID压力控制、把低通滤波换成模型预测控制、把储能模型从绝热升级到带换热器的详细版本都是在这个骨架上做加法。3.3 Simulink仿真平台搭建遇到代数环怎么办虽然m脚本能跑通但如果要做控制器设计的快速验证Simulink的表达能力明显更强模块拖拽加上Scope直接看波形调试效率高不少。我在项目中同时也搭了一个Simulink版本这里说说关键结构和避坑点。顶层模型分成四大块风速信号源From Workspace导入之前的wind_speed变量、风力机模型封装为一个Matlab Function模块、储能系统模型封装成S-Function或者Subsystem、控制器逻辑状态流Stateflow或者Matlab Function。如果你的目标只是联合系统仿真验证直接把这几个模块用信号线连接即可。最容易踩的坑是代数环。风力机功率是风速的函数风速信号直接进入控制器控制器的输出又反馈到风力机的桨距角控制如果加了变桨模块这就形成了一个闭环瞬间反馈Simulink会在报错或者收敛很慢。解决办法有几个一是在反馈路径上加Memory或者Unit Delay模块打破瞬时环二是把控制周期设置为仿真步长的整数倍让控制器输出在下一拍才作用于系统三是换用Solver设置为ode23t或者ode15s这类求解器对刚性系统更友好。我实测下来“加Unit Delay”是最省事的做法几乎不需要改任何模块参数。另一个Simulink的推荐实践是用总线信号Bus传递风机、储能、控制量等多路信号而不是密密麻麻的单独信号线。模块多了以后飘来飘去的线会让人心态崩溃总线信号让模型结构一目了然。封装方面每个子模块都做成Subsystem并配好Mask参数双击就能调参方便后期做对照组实验。3.4 实验对标与误差分析光跑仿真不算完仿真跑通之后真正的考验来了模型能不能复现实验系统的工作特性这个环节最花时间但也最能出成果。我的实验对标思路分三步第一步确定性工况验证。给实验台输入一组确定的风速序列比如先保持8 m/s恒定然后阶跃到10 m/s再降到6 m/s同时把相同风速序列灌入仿真模型对比风机输出功率和储气室压力变化曲线。这一步能检查模型是否存在方向性的错误——比如时间常数是否接近、稳态值是否一致。第二步统计性误差分析。跑一段半小时以上的随机风速序列采集实验数据与仿真数据的差值计算平均绝对百分比误差MAPE和均方根误差RMSE。一般来说风机功率的MAPE在5%以内算合理储气室压力的偏差在3%以内可接受。如果误差超出这个区间优先检查实验系统的压缩机效率和膨胀机效率是否和模型设置的参数一致这两项是误差的主要来源。第三步模型参数校准。如果误差过大就要动参数了。我的做法是用Matlab的优化工具箱lsqnonlin来做参数辨识把压缩机效率、膨胀机效率、储气室换热系数设为待辨识参数以实验数据与仿真输出的误差平方和为目标函数跑一轮参数寻优。这个方法在实操中很管用通常迭代几十步就能把MAPE从15%压到3%以内。4. 常见问题与排查技巧实录4.1 仿真运行缓慢或出现不收敛这是我被问得最多的问题。原因无非三种一是模型里有代数环Simulink每步要迭代多次才能解出来二是微分方程的病态问题——压缩空气储能的压力动态和风机机械动态时间尺度差了好几个数量级构成了刚性系统三是仿真步长设置过小时间步进太密导致计算量爆炸。我的处理建议Simulink求解器从ode45换成ode15s或者ode23t刚性求解器能显著提速固定步长仿真改成可变步长但储存数据的采样模块用固定步长记录如果是m脚本自己写的for循环把气体动力学子模块的时间常数做缩放补偿比如将储气室容积适当调小来加速压力动态这种方法在趋势性研究中可接受。4.2 压缩空气储能整体效率始终上不去如果你在结果里发现RTE不到40%大概率不是模型错了而是设置参数太保守。检查以下几处排查项常见问题调整建议压缩机多变效率取了0.7以下按实际设备铭牌参数设定一般0.75~0.85膨胀机入口温度用环境温度而不是储热温度若带储热系统入口温度可以设为390~420 K压缩比分配单级压缩比过大导致效率陡降改成两级压缩带级间冷却压缩比均分充放电压力区间储气室工作压力区间过窄尽量让压力在p_min到p_max的全程区间工作还有一个隐蔽问题我在仿真中把空气当成理想气体处理直接用γ1.4。但在高压5 MPa以上工况下真实气体可用系数z偏离1较多理想气体模型算出的功率误差会被放大。如果你的系统压力超过5 MPa建议在模型里加入压缩因子z的计算通用的状态方程中有冗余的参数表可用或者用市面上的开源气体物性库如CoolProp替代。4.3 模型结果和实验台实测数据对不上这个问题的排查优先级从高到低我的排序是先查传感器采样频率和滤波方式是否与仿真一致再查压缩机/膨胀机效率是否标定过最后查传动链和机械摩擦损耗是否建模。实验台和仿真对不上80%的情况出在效率参数没有做实际标定直接用理论值导致的偏差。之前带学生做实验时遇到过一个典型的坑实验台的储气室压力上升速度比模型预测慢但最终平衡压力又比模型高怎么调都不对。后来发现是压缩机的空气流量计安装位置测量的是质量流量而我在模型里用的是体积流量换算中间忘了乘当地气压修正系数。这种单位与基准状态的错位排查起来非常耗时所以建议大家在建模脚本里统一所有气体流量单位——全部采用质量流量(kg/s)不要混用标准立方米每分Nm³/min或者标方每小时省得自己坑自己。4.4 一个必须提的隐藏坑风速序列的时间分辨率很多同学在仿真时习惯把所有时间序列的步长统一为1秒但实际SCADA系统的风速记录往往是10秒甚至1分钟一个点。直接用这种序列做储能控制仿真风速的秒级波动信息已经完全丢失了储能系统根本无法体现出平滑作用。我在处理实测风速数据时会先做插值重采样到1秒间隔再用频谱分析检查重采样后的数据是否保留了湍流频段的信息。如果原始数据本身采样率不足建议放弃时域波形比拟改用统计特征平均值、标准差、功率谱密度进行对比验证。5. 最后聊几句实操心得从接到这个课题到最终跑通联合系统仿真我个人的经验是别急着上复杂模型先把最简单版本跑通再逐步丰富。第一版我只写了风机功率计算和储气室压力积分用恒定风速试跑确认储气室压力曲线符合物理直觉后才一步步加入低通滤波控制、压力边界约束、压缩机效率模型。这个过程虽然“慢”但每一步的故障范围都很小定位问题特别快。另外一个很深的体会是压缩空气储能系统的研究魅力在于它横跨了多个物理域不像纯电气模型那么“干净”需要同时处理流体方程、热力学方程和控制逻辑。也正因为如此Simulink和m脚本混合编程是最顺手的搭配控制策略和场景管理用脚本物理方程用Simulink的S-Function或者Stateflow两者各司其职调试效率最高。后续如果想往深了做可以考虑把风电出力预测接入储能调度——用前一天的风速预报来滚动优化压缩机的启停时刻进一步压低弃风率。还可以在里面加一层经济性模型综合电价和储能损耗来决策充放电功率。这些扩展方向都是在这个基础框架上自然生长出来的希望这篇内容能帮你把这第一步走稳。
返回列表