资讯动态

风光储与废弃矿井抽蓄互补调度:基于Matlab的仿真框架

发布时间:2026/10/14 12:56:22 来源:尧图企业网站定制
做新能源调度仿真这些年我最大的感受是风光出力靠天吃饭储能配置靠命干活。风电凌晨猛发、白天萎靡光伏中午爆表、傍晚撤场两者叠在一起负荷曲线却依旧有早高峰和晚高峰。你要是不在中间加一层“能量搬移”的缓冲器弃风弃光就是板上钉钉的事更别说还要考虑并网功率的平滑性和经济性了。这个项目要解决的问题正是把风电、光伏、电池储能和一套比较特殊的“废弃矿井小型抽水蓄能”放在同一个调度框架里做互补优化。前两者是波动电源后两者是时间尺度完全不同的储能装置。电池储能响应快、容量小适合做分钟级到小时级的功率补偿小型抽水蓄能容量大、启停周期长适合做跨时段甚至跨日级的能量搬移。把两者放在一起协同调度不是简单地“买两套储能装上”而是要在不同时间尺度上做嵌套优化这是整个项目的核心难点。这篇文章我会从系统架构、数学模型、调度策略、Matlab工程实现、仿真结果和调试实录六个方面完整拆解这套方案。无论你是做新能源规划的研究生、刚入职电网做调度算法的工程师还是准备把废弃矿井改造成储能电站的项目建设方这套基于Matlab的互补调度仿真框架都能给你一个可直接上手复现的参考模板。1. 互补调度的底层逻辑为什么要把风、光和“废弃矿井抽蓄”捆在一起先理清一个基本事实新能源并网最怕的不是新能源本身而是它的不可控性。风电出力随风速波动光伏出力随光照波动这种波动叠加到电网上会出现两个直接后果。第一低谷时段发电量大于用电量系统无法消纳只能弃风弃光。第二陡坡时段功率变化率太快传统调频机组跟不上电网频率质量变差。这两个问题严重程度不同但对调度策略的要求完全不同。所以设计互补调度系统本质上是设计一套“能量时空搬移机制”。在时间维度上把低谷时段多余的清洁电能挪到高峰时段用在物理维度上把原本要扔掉的电能储存在某种介质里。这套机制的核心就是储能但储能不是只有一种。电池储能密度高、响应速度快百兆瓦时级的电站可以在秒级到分钟级提供功率支撑但它的持续放电时间受容量限制通常只有几小时。抽水蓄能响应慢单机从静止到满发通常需要几分钟但它的库容可以支撑十小时以上的持续充放寿命还远长于电池。这里就引出了互补的关键电池和抽蓄不是竞争关系而是时间尺度上的接力关系。电池负责平抑高频波动类似“短跑运动员”抽蓄负责搬运大规模电量类似“马拉松选手”。把两者放在同一个调度模型里让优化算法根据每个时段的净负荷特征分配储能的充放功率这就是互补调度的第一层含义。第二层含义是出力侧互补。风电资源和光伏资源在时间分布上本身就存在天然互补性白天光伏强、晚上风电往往更强特别是在季风性气候区域这种昼夜互补非常明显。但天然互补不等于完全平滑两者联合出力依然有明显低谷和高峰更需要储能把剩余电量消化掉。调度模型的输入就是一组含预测误差的风电光伏出力序列、负荷序列以及两类储能的容量和效率参数。项目评价指标通常有四类。弃风弃光率直接反映系统对清洁电能的利用水平。功率波动值通常用并网功率的标准差或最大爬坡率衡量模拟电网对出力平滑性的考核要求。综合运行成本包括储能充放损耗折算、运维成本和外部购电成本反映调度结果的经济性。最后一个功率平衡偏差看24小时各时段发电用电是否为0这是调度问题最基本的可行边界。这四个指标一起构成多目标优化的基础。选择Matlab做这类仿真理由其实很朴素。Matlab的矩阵运算语法几乎和电力系统教材里的数学表达式一一对应目标函数和约束条件可以直接翻译成代码。更重要的是Matlab自带linprog、intlinprog、fmincon等一系列成熟求解器可以直接求解线性规划、混合整数线性规划和非线性规划问题不需要自己去写求解算法。工程团队后续还可以借助Simulink把调度策略嵌入到更细致的电气暂态模型里做联合验证扩展性相对理想。2. 核心建模风电、光伏出力模型与两类储能的数学表达调度模型的质量首先取决于电源和储能模型能不能真实反映物理过程。模型太粗糙结果没有参考价值模型太精细求解时间成倍增长。工程上要在这两者之间找平衡我的做法是电源侧用工程简化模型储能侧用状态递推模型约束条件全部线性化保证可以用混合整数线性规划稳定求解。2.1 风电和光伏出力模型风电模型的核心是风速-功率转换关系。标准的风机功率曲线通常是一条分段曲线风速低于切入风速时不发电在切入风速和额定风速之间出力随风速上升达到额定风速后出力封顶风速过高时为了保护风机自动切出。工程建模时可以直接用分段线性函数逼近这条曲线风速数据则可以从测风塔的历史数据中取典型日也可以按平均风速加随机扰动合成处理。光伏模型的物理过程相对直观。光伏组件输出功率主要取决于两个变量辐照度和组件温度。标准测试条件下的额定功率乘上当前辐照度与标准辐照度的比值再乘一个温度修正系数就得到当前出力。温度修正系数通常是负值组件温度高于25摄氏度时输出会略有下降这个细节在大规模光伏场站建模时不能忽略夏季午间光伏出力往往达不到额定值就是受温度影响。两种模型都做了简化没有去仿真风机内部的桨距角控制或光伏逆变器的最大功率点跟踪动态过程。这样处理的原因很明确日前调度关注的是小时级电量分配不是毫秒级的电磁暂态功率电气的动态特性在能量管理层面不是主要矛盾。把计算资源留给优化求解这才是调度仿真的核心任务。2.2 电池储能SOC模型电池储能的建模核心是荷电状态SOC递推关系。假设当前时段为t上一时段的SOC值、当前时段的充放电功率和储能自损耗率共同决定当前时段的SOC用公式表示为[ SOC_{t1} SOC_t \eta_{ch} \cdot P_{ch,t} \cdot \Delta t / E_{cap} - P_{dis,t} \cdot \Delta t / (\eta_{dis} \cdot E_{cap}) ]其中 (\eta_{ch}) 和 (\eta_{dis}) 分别是充电和放电效率。这里有一个新手经常忽略的陷阱充放电效率不对称。锂离子电池充电效率通常在0.92到0.98之间放电效率相近但工程上为了安全建议把两者分开建模。如果你偷懒用同一个效率系数模型会低估充放电过程中的能量损耗导致调度结果偏向“多充多放”实际运行时会发现电量对不上账。SOC需要满足上下限约束工程上一般不允许SOC低于10%防止电池过放影响寿命。同时充放电功率有上下限由PCS变流器容量决定。充放电状态不能同时为1这个约束需要用二进制变量建模充电动作为0/1变量放电动作也是0/1变量两者之和小于等于1。这一步直接导致问题变成混合整数线性规划也是后面选择intlinprog求解器的直接原因。有一个工程细节需要单独说明要不要引入充放电切换次数约束。这是我在实际调试中反复遇到的一个问题。如果不加限制优化算法为了让某个时段功率平衡可能出现“这个小时充满、下个小时立刻放空再过一小时又充满”的振荡充放电行为。物理上电池还能承受但寿命损耗明显增加经济上不划算。工程解法有两种一种是在目标函数中加入切换惩罚项每次充放状态切换时增加成本另一种是加最小持续运行时间约束强制充电或放电状态必须维持至少若干小时。2.3 废弃矿井小型抽水蓄能模型这部分是整个系统最有辨识度的地方也是最有想象空间的应用场景。传统抽水蓄能电站需要有天然的地形高差和大面积水库符合条件的选址越来越少。但废弃矿井完全不同矿井本身就有竖井、斜井和地下巷道天然具备高差条件采空区和巷道空间可以直接改造成上下水库建设成本远低于新建地面水库还能顺便解决废弃矿井的再利用问题。小型抽水蓄能的能量转换公式核心是重力势能[ P_{gen} \rho \cdot g \cdot Q \cdot H \cdot \eta_{gen} ](\rho) 是水的密度g是重力加速度Q是发电流量H是有效水头(\eta_{gen}) 是发电效率。水泵工况的功率公式类似但效率要放到分母上。如果水头差异较大需要考虑水头对效率的影响一般是查表或按运行区间分段线性近似。小型系统如果库容不大、水头相对恒定可以简化为固定效率误差在可接受范围内。抽蓄的状态变量是水库水量。用上层水库水量或下层水库水量作为状态均可本质是同一个量的互补关系。水量递推公式与电池SOC类似[ V_{t1} V_t Q_{pump,t} \cdot \Delta t - Q_{gen,t} \cdot \Delta t ]约束条件包括上库水量上下限即库容限制、发电流量和泵流量上下限、发电工况和泵工况的0-1互斥约束。还有一个常常被忽略的约束——最小启停机时间。抽蓄机组从停机状态转到抽水或发电状态不是按个按钮就行的机组需要完成辅助设备启动、导叶开启、并网等一系列过程一次启停循环至少需要几十分钟到数小时。调度模型如果忽略这一点优化结果可能出现同一台机组一小时发电、一小时抽水、再一小时发电的疯狂切换实际机组根本执行不了。对比电池和抽蓄的特性可以作为一组直观参考特性电池储能废弃矿井小型抽水蓄能响应速度毫秒至秒级分钟级持续放电时间1~4小时为主6~12小时以上单次循环效率85%~95%65%~80%建设成本较高较低利用既有矿井空间使用寿命10~15年电池衰减40~80年适合承担功能调频、短时削峰、平抑波动跨时段的电量搬移、长时削峰填谷从这张表可以直观看出电池和抽蓄在调度模型中承担的任务完全不同。电池像一个反应极快的短跑选手适合应对瞬时波动抽蓄更像一辆重载卡车搬运效率稍低但装载量大、运行时间长。一个好的互补调度策略就是让重载卡车尽量承担基础性的搬移任务让短跑选手只在波动剧烈或卡车来不及响应的时段出手。两者不是替代关系而是前后接力关系这是我做完整个系统之后最深的体会。3. 调度策略设计目标函数、约束条件与求解算法选型有了电源和储能模型接下来要解决的是“怎么分配功率”的问题。调度策略的核心是一个优化问题包含三要素目标函数、约束条件和求解算法。这三者的设计直接决定系统能不能用。3.1 目标函数多目标如何合并先看目标函数。实际调度不能只看经济性也不能只看消纳率必须变成统一量纲的加权和。我的做法是[ \min F \alpha C_{cost} \beta C_{curtail} \gamma C_{smooth} ]C_cost是运行成本项包括从外部电网购电的成本、储能设备的运维成本、充放电损耗折算成本。这部分数值可以直接按电价结构和设备参数计算。C_curtail是弃风弃光惩罚项弃掉一兆瓦时的惩罚系数要设得足够高否则优化算法会为了节省调度的麻烦而故意选择弃电这不符合项目初衷。C_smooth是并网功率波动惩罚项用相邻时段并网功率差值的平方和来度量权重系数控制平滑力度。惩罚系数的设定有讲究。(\beta) 定得太高优化结果会不惜一切代价消纳新能源甚至让储能在低电价时段频繁充电再在高电价时段放电经济账算不过来了。(\beta) 定得太低系统会接受大量弃电弃风弃光率指标很难看。我的经验是先按当地火电标杆电价或者现货市场电价做一次基准测算把惩罚系数设定在电价的1.5到2倍之间再通过敏感性分析微调。另一个常见问题是目标函数中要不要加入电池寿命损耗项实际上可以做就是把每次充放电循环折算成成本。做法是电池全生命周期可完成的总等效循环次数对应的总损耗成本除以单次循环的充放电量得到单位充放电的电量损耗系数。加上这一项之后调度结果会主动减少不必要的充放电结果更贴近实际运维场景。3.2 约束条件从物理边界到逻辑约束约束条件分为四类每一类都对应物理系统里的一个真实限制。第一类是功率平衡约束也是最硬性的约束。任意时刻风电出力加光伏出力加储能放电功率加抽蓄发电功率加外部购电功率必须等于负荷功率加储能充电功率加抽蓄泵送功率。外部购电作为松弛变量保留主要是为了保证模型在新能源严重不足时依然有可行解实际运行时可以理解为从大电网进口电力。第二类是设备物理约束。风电和光伏出力不能超过预测值电池充放电功率在变流器容量范围内SOC在上下限范围内抽蓄发电流量和泵流量在机组额定范围内上库水量在死水位和正常蓄水位对应的库容之间。第三类是运行逻辑约束。电池不能同时充放电机组不能同时发电和抽水储能设备的充放状态转移条件抽蓄机组的最小启停时间。这些都需要引入0-1变量用大M法写出线性约束表达式。大M法的思路很简单引入一个足够大的正数M当状态变量为1时不约束为0时把相关变量卡死标准做法不做展开。第四类约束常被忽略是爬坡约束。并网功率不允许在相邻时段之间出现剧烈跳变电网调度部门通常考核的是分钟内爬坡速率折算到小时级模型里就是相邻时段并网功率差值不得超过某个上限。加入这项约束后调度结果才会更接近可执行的状态。3.3 求解算法为什么主体用intlinprog而不是神经网络这个项目的求解算法选型经历了一个过程。一开始我考虑过直接用粒子群算法或遗传算法因为许多论文里新能源调度都是这么做的。但实际动手后发现启发式算法在含0-1变量的高维约束优化问题上有个致命弱点它们不保证找到全局最优解多次运行结果还可能不一致而且约束越复杂搜索结果越依赖初始种群选择可复现性很差。最终方案选定了Matlab自带的intlinprog求解器并配合稀疏矩阵做约束构造。原因有三。第一调度模型里的目标函数和约束条件已经全部线性化符合混合整数线性规划的标准形式intlinprog可以高效求解并给出全局最优解。第二intlinprog内部实现的分支定界算法自带剪枝逻辑变量规模从几百个上升到几千个时求解时间仍然在可接受范围内这对需要批量仿真多个场景的工程任务非常关键。第三Matlab原生的求解器接口简单明确只需要传入目标系数、约束矩阵、边界条件等几个参数。但这不代表启发式算法完全无用。在模型非线性程度高、线性化代价大或者只是粗略估算储能配置容量时粒子群算法作为预研工具仍有一定价值。我的建议是正式做调度方案评审时用intlinprog预研和敏感性初筛时可以用启发式算法两条路线各有适用场景。3.4 日前调度与日内滚动修正调度策略在时间维度上不是一次性定死的而是分两个层级。日前调度以1小时为步长对未来24小时做整体优化输入是风电光伏负荷的日前预测值输出是各机组各时段的计划功率。这个层级的作用是制定“大框架”把大多数能量搬移的逻辑确定下来比如低谷时段抽水蓄能、高峰时段发电的配置。但气象预报不可能永远准确实际风速光照和预测值存在偏差。日内滚动修正以15分钟为步长刷新未来4小时的功率分配输入则是更新的超短期预测数据。两个层级的衔接点在于日内修正必须尽量维持日前计划中的大趋势只在小范围内调整局部功率否则机组频繁改变运行计划实际执行时调度员会非常头疼。这种分层调度架构在代码实现上并不复杂只是需要把优化求解逻辑包装成一个函数日前调度调用一次日内滚动修正按窗口循环调用多次。两套模型共用同一组目标函数和约束条件函数只是时间步长不同、预测输入不同、边界条件不同。这里要特别留意时间步长转换导致的单位换算问题我在调试第6章会详细展开。4. Matlab工程实现从零搭建一套可复用的调度仿真平台有了数学模型接下来把这些公式搬进Matlab。很多初学者一开始就把所有逻辑堆在一个脚本里变量名满天飞最后改一个参数要拖十几分钟搜索。我建议从一开始就按工程化的方式组织代码这不仅是为了这次仿真更是为了让后续扩展别的算例时能快速复用。4.1 工程文件结构与职责划分我的目录结构一般是这样的dispatch_system/ ├── data_input/ │ ├── load_data.m │ ├── wind_data.m │ └── pv_data.m ├── model_func/ │ ├── obj_func.m │ ├── constraint_set.m │ └── storage_model.m ├── solver_run/ │ ├── day_ahead_schedule.m │ ├── intraday_revision.m │ └── build_optim_matrix.m ├── results_out/ │ ├── export_result.m │ └── plot_result.m └── main.mdata_input文件夹负责读入原始数据并生成可被优化函数直接调用的参数结构体。model_func文件夹实现各类设备的数学模型。solver_run文件夹是核心负责把数学模型的参数翻译成intlinprog要用的矩阵。results_out负责结果处理和可视化。main.m是整个项目的入口按顺序调用上述函数。这个结构可能看起来有些笨重但它的好处是用了一次之后就会觉得值得。当你需要测试一个新的储能类型时只需要在model_func里新增模型文件在constraint_set里增加一组约束完全不需要改动主流程代码。做仿真最怕的不是代码跑不通而是改一个参数牵一发动全身结构化组织能最大程度降低这种风险。4.2 变量编码与稀疏矩阵构造intlinprog的标准形式是[ \min f^T x \text{ s.t. } Ax \leq b, A_{eq}x b_{eq}, lb \leq x \leq ub ]核心工作是把调度的所有决策变量排成一个长向量x然后构造对应的f、A、b、Aeq、beq矩阵。这里最容易出错的就是变量索引不统一约束矩阵填错行求解器直接报无解。我的做法是先定义变量编号规则把变量分组、定长、定位。假设仿真周期为N个时段电池和抽蓄的0-1状态变量各占2*N个位置顺序依次为风电出力、光伏出力、电池充电功率、电池放电功率、抽蓄发电功率、抽蓄泵功率、购电功率、电池SOC、上库水量、电池充放状态、抽蓄工况状态。写约束矩阵时有两个技巧。第一个是初始化稀疏矩阵时直接指定行列维数后续用循环或向量化方式填充非零元素不要用零矩阵再逐项赋值否则N较大时内存占用高得吓人。第二个是每个约束函数单独写一个子函数函数内部构造自己的A矩阵片段再拼装最后用vertcat合并成完整的A矩阵。这样检查模型时可以把每个约束子矩阵单独打印出来核对排错效率高很多。4.3 主求解脚本关键逻辑求解的主逻辑可以概括为读数据设参数建矩阵求解输出。核心代码框架如下%% 参数初始化 N 24; % 日前调度时段数 dt 1; % 时间步长单位小时 E_cap 50; % 电池容量MWh V_max 20000; % 抽蓄上库有效库容m^3 H 120; % 有效水头m %% 决策变量编码共 8*N 个连续变量 4*N 个整数变量 num_cont 8 * N; num_int 4 * N; num_total num_cont num_int; %% 构造目标函数系数 f f zeros(num_total, 1); f(1:N) 0; % 风电出力成本系数 f(N1:2*N) 0; % 光伏出力成本系数 f(...) price_buy / 1000; % 购电成本系数 % ... 其余系数的设定按目标函数逐项对应 %% 构造约束矩阵 [A, b, Aeq, beq, lb, ub] build_optim_matrix(param, N, dt); %% 整数变量索引1-4是电池充放状态5-8是抽蓄状态 intcon num_cont (1:num_int); %% 求解 options optimoptions(intlinprog, Display, iter, MaxTime, 300); [x_opt, fval, exitflag] intlinprog(f, intcon, A, b, Aeq, beq, lb, ub, options);这里不展开全部细节但有一点必须提醒build_optim_matrix函数是整个代码库中最重要的部分。每增加一类约束就在这个函数里对应增加一段矩阵构造代码并且立即用一个小规模测试验证约束是否生效。我习惯的做法是先用N4或N6的小周期测试模型确认所有约束都能满足后再跑完整24小时的算例这种“从小到大的调试”策略能节省大量排查时间。4.4 结果可视化与数据导出仿真不出图等于白做。调度结果需要直观呈现以下内容风电光伏预测出力与实际消纳的对比、电池充放功率和SOC曲线、抽蓄发电泵工况和水量变化、并网功率与负荷曲线、各系统的弃电量统计。我的出图习惯是用双y轴图左侧坐标轴放功率类数据右侧坐标轴放SOC和水量状态便于观察“功率分配”与“能量状态”之间的联动关系。figure; yyaxis left; plot(t, P_grid, k-, LineWidth, 1.5); hold on; plot(t, P_wind P_pv, b--, LineWidth, 1.2); plot(t, P_load, r-., LineWidth, 1.2); ylabel(功率 (MW)); yyaxis right; plot(t, SOC_battery * 100, g-, LineWidth, 1.2); plot(t, V_water / V_max * 100, m-, LineWidth, 1.2); ylabel(SOC / 库容百分比); legend(并网功率, 风光联合出力, 负荷, 电池SOC, 抽蓄水量); grid on;保存结果时建议直接输出结构化数组以.mat格式存储所有时间序列同时导出一张CSV表格给下游做数据报表。这样既方便做多个场景的批量对比也方便交接给团队里不做仿真的人。5. 仿真结果与效果分析数据摆出来看互补调度到底补了什么模型跑通之后我设计了四组对照场景来验证互补调度策略的实际效果。场景A是完全没有储能的纯风光系统场景B只配置电池储能场景C只配置抽水蓄能场景D则是电池和抽蓄混合配置。四组场景使用的风电光伏负荷数据完全相同只是储能配置和调度策略不同。5.1 场景参数设置某模拟区域典型日参数大致如下。风电装机200MW光伏装机150MW最大负荷约250MW。电池容量50MWh额定功率25MW。抽蓄电站装机20MW额定水头120m上库有效库容20000立方米按这个库容可以支撑大约6到8小时满负荷发电。计算得到抽蓄单次满发储能量约6.5MWh虽然和电池相比总容量并不算突出但胜在建设成本低且可以利用废弃矿井空间。这里顺便给一个抽蓄库容的估算方法便于理解计算过程。发电工况的储能量用公式 E ρ × g × V × H × η 计算。水密度取1000kg/m^3重力加速度取9.8m/s^2库容按20000m^3算水头按120m算发电效率按0.8算折合电能约为 1000 × 9.8 × 20000 × 120 × 0.8 ≈ 1.88 × 10^10 J除以3600得到约5230 kWh约5.2MWh。如果在更高水头的矿井中运行或者库容更大可储能量还会明显增加。在目标函数里抽蓄单次循环的实际经济效益可以简单折算成再乘以抽水效率和电价的综合效果。5.2 四组场景的对比结果仿真得到的指标汇总如下指标场景A 无储能场景B 仅电池场景C 仅抽蓄场景D 混合配置弃风弃光率18.6%7.2%9.5%2.8%并网功率波动标准差22.4 MW10.1 MW14.6 MW6.8 MW综合运行成本指数1.000.870.930.78功率平衡偏差0000这些结果是特定场景下测得的模拟数值不代表所有地区都相同但趋势非常典型。无储能场景弃风弃光率最高这是自然结果凌晨风电大发时段负荷低谷光伏午间出力超过负荷需求的部分也全部弃掉。只加电池后弃风弃光率大幅下降原因是电池可以在低谷时段充电在早晚高峰放电反应速度快能很好地填补功率缺口。但也存在局限50MWh的容量在连续阴天导致风电不足时只能支撑一到两个晚高峰无法做跨日调节。只加抽蓄的场景结果有意思。弃风弃光率9.5%高于纯电池方案原因是抽蓄机组启停时间长在面对快速波动时反应不够及时部分短时段的弃电来不及回收。但它的优势体现在库容状态曲线上当低谷时段持续时间超过6小时时抽蓄依然能持续泵水没有像电池那样出现SOC触顶后被迫停止充电的情况。这说明长时储能对消除“持续窝电”有天然优势。混合配置的表现最为理想。弃风弃光率降到2.8%并网功率波动标准差比无储能场景降低约70%。具体运行过程中抽蓄承担大规模的跨时段搬移电池负责实时补偿两类储能的充放电次数都明显减少运行损耗也被控制住了。这就是我前面说的“短跑运动员和马拉松选手接力”的最直观体现。5.3 敏感性分析哪些参数最影响结果敏感性分析能在结果之外告诉你下一步该把投资重点放在哪里。我对三组关键参数做了扫描。第一组是电池容量从25MWh增大到100MWh结果显示弃风弃光率持续下降但边际效益递减50MWh之后再翻倍容量弃风率只降低2个百分点。电池的投资回报存在明显的饱和点设计时不必追求过大的电池容量。第二组是抽蓄库容从10000立方米增大到40000立方米弃风弃光率下降趋势相对平缓且稳定说明在长时段持续窝电的场景下增大抽蓄库容永远能带来实际收益不易饱和。第三组是抽蓄机组额定功率从10MW增大到30MW结果对功率波动指标影响明显功率增大后系统应对负荷突变的能力更强。这个敏感性分析的结论对工程配置的意义在于想要保证快速调峰能力优先保证电池功率容量想要提高长时间消纳清洁能源的能力重点扩大抽蓄库容想要兼顾平滑和消纳两类储能的容量配比需要联合优化。我也试过直接用这个仿真框架做容量配置的双层优化外层是粒子群搜索容量参数内层是当前配置下的调度优化计算量偏大但能把“配置多少储能”和“储能怎么调度”两个问题统一求解适合条件允许时深入研究。6. 调试实录那些改BUG改到怀疑人生的瞬间这部分我把自己实际调试中踩过的几个坑完整记录下来。这些坑在论文里基本不会写但任何一个做过调度仿真的人都大概率遇到过。6.1 约束矩阵维度不匹配第一个坑出现得非常早调用intlinprog后直接报错提示A矩阵的列数必须与决策变量个数一致。我反复数变量个数都是对的但代码就是跑不通。后来逐行检查才发现原因有两个。一个是某个约束函数的输出矩阵只覆盖了一部分变量范围拼装时行数没问题但列数少了几列Matlab不会自动补齐零列而是直接报错。另一个是lb和ub向量的长度不一致某个变量的上下界写漏了。经验是每次构造完约束矩阵后立即打印矩阵的尺寸进行检查和总变量数做比对。同时用assert语句在代码中做运行时校验比如assert(size(A,2) num_total)。这类错误在N24时不明显一旦扩展到N96甚至N28815分钟步长矩阵规模大了后单纯靠肉眼找行列数异常几乎不可能断言机制可以第一时间暴露问题。6.2 intlinprog求解速度慢第二个坑是求解效率问题。最初版本的模型设置了4N个整数变量N96时就是384个整数变量。intlinprog跑一次要将近10分钟如果做敏感性分析要跑几百次整个项目速度完全不能接受。后来我做了三个优化把求解时间压缩到了几十秒以内。第一个优化是减少整数变量的维度。电池充放电状态变量可以合并处理SOC在边界且目标价格合适时算法本身会倾向某一侧但严格来说充放互斥约束必须保留而抽蓄的启停状态可以通过最小启停时间约束来降低切换频率实际上进一步限制了整数变量的组合搜索空间。第二个优化是设置MaxTime求解上限这样即便复杂算例到时限后未完全收敛输出结果的可执行性也有保障避免死等。第三个优化是提供初始可行解作为intlinprog的起始点求解器可以在分支定界过程中更早地剪枝。初始可行解的获取方法很简单先跑一次没有整数约束的线性松弛问题把松弛解四舍五入后修正到可行域内。6.3 SOC和水量对不上账第三个坑出现在日前调度和日内滚动修正衔接处。日前模型用小时步长日内模型用15分钟步长两个模型衔接时电池SOC和抽蓄水量的初始状态要从前一个模型的结果读取。最初版本直接读取日前模型同一时刻的SOC值没有乘时间步长系数导致日内模型的电量递推算下来对不上。问题根源是单位混淆。日前模型里功率单位是MW时间步长是1小时能量转换系数是1到了15分钟步长能量转换系数变成0.25。如果SOC递推公式里用的还是原来的系数日内模型就等于把15分钟当成1小时在算账能量自然不守恒。我的处理办法是统一所有模型的能量单位功率一律用MW能量一律用MWh水量用立方米递推公式中的dt统一按小时计然后在参数结构体里显式存放步长值任何函数都不允许硬编码时间系数。6.4 明明有弃电量模型却告诉我无可行解第四个坑很有迷惑性。有时候风光出力充足、负荷不高正常情况下系统应该消纳不了那么多电结果intlinprog返回“无可行解”。问题出在功率平衡约束写得太死而且没有给弃电预留出口。在最早的模型版本里功率平衡等式右侧的负荷和储能充电功率是固定值左侧的风光出力被限制为预测值这意味着多出来的电无处可去等式永远不成立。解决方案是引入弃电变量让功率平衡约束变成左侧等于右侧再加弃电量。弃电量的物理意义是多发的清洁电能主动放弃目标函数用惩罚系数让它尽量趋近于零。这样一来模型始终有可行解优化算法只需要在“弃电”和“启动储能充电”之间做取舍。这也是在实际工程模型中最常见的处理手法之一直接硬约束不留余地在边界工况下会把自己卡死。6.5 问题排查速查表把以上调试经验汇总成一个速查表后续再跑新算例时可以直接对照排查症状可能原因检查方向intlinprog报维度不匹配约束矩阵列数不等于决策变量数打印各约束矩阵size并核对求解时间异常长整数变量过多、无初始可行解提供初值、减少冗余整数变量SOC或水量曲线漂移时间步长系数不一致统一功率能量单位换算出现无可行解平衡约束无松弛变量引入弃电变量并检查约束矛盾充放电频繁振荡缺少最小持续运行时间约束增加启停/充放切换惩罚或持续时间约束抽蓄开关过于频繁未设置最小启停机时间增加机组状态持续时间约束结果中弃电和购电同时存在惩罚系数设置不合理检查目标函数权重和价格参数7. 一点实操体会整套系统从头到尾调试下来我最大的体会是不要指望模型越复杂越好。电网调度问题的核心困难从来不是数学公式写不出来而是模型复杂度与求解效率之间的矛盾。真正可用的工程模型往往是在精度和速度之间做了大量妥协的结果。我从一开始就坚持“一切线性化”的原则虽然过程麻烦一些但最终换来了稳定的求解速度这让后续几百组敏感性分析场景能在可接受的时间内跑完。最后再分享一个小技巧。我建议你在评估调度策略时不要只盯着单次24小时的结果而是用滑动时间窗口连续评估多日运行效果。把预测误差注入到滚动优化中每天只执行当天的计划第二天重新优化这样得到的累计消纳率、累计充放电次数、累计成本才更接近系统真实投运后的运行表现。不少同行做完一次仿真就急着下结论结果换了一个数据集就完全不适用问题往往就出在测试场景的构建不够逼真上。这套互补调度框架本身还有很大的扩展空间。比如把抽蓄的启停状态建模做成精细化机组组合模型比如在日内滚动优化中引入模型预测控制比如把容量配置和调度策略做双层联合优化这些方向都可以在现有代码上顺势推进。先把基础框架吃透、把常见陷阱避开后面无论是扩展模型还是对接实际工程数据都会顺畅得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑