基于Matlab粒子群算法的风光柴储微电网经济调度仿真

发布时间:2026/10/13 15:49:04
基于Matlab粒子群算法的风光柴储微电网经济调度仿真 做微电网项目这些年几乎每个甲方都会问同一个问题风光不是不需要燃料吗为什么电费还是压不下来问的人多了我发现大家真正想搞清楚的是——在风电、光伏、柴油发电机、储能同时存在的微电网里到底怎么分配每个时段的出力才能在保证供电的前提下让总成本最低。这就是经济调度。我用Matlab做过一个风光柴储微电网经济调度的仿真系统今天把这套东西从建模到求解、从代码到调参完整拆出来给正在做相关课题或者刚入门微电网调度的人一个能直接上手的参考。这篇东西适合电力系统方向的学生、刚接触微电网优化调度的工程师以及想用Matlab快速搭建调度Demo的研究者。1. 微电网经济调度到底在优化什么1.1 四个电源的“人设”完全不同微电网里最核心的矛盾是风电、光伏、柴油机、储能这四类电源脾气完全不一样。风电和光伏的边际成本接近零能发多少全看天属于“给你多少用多少”的电源而且是优先使用的。柴油发电机启动慢、响应慢燃料成本随出力非线性上涨属于兜底电源但它的存在是为了保证极端情况下的供电可靠性。储能比较特殊它本身不生产电能它干的是移峰填谷的事——电价低、风光富余的时候充电电价高、风光不足的时候放电相当于一个时空搬运工。经济调度的核心任务就是在满足负荷需求的前提下把每个时段该由谁来发电、发多少、储能该充还是该放安排得明明白白使得整个调度周期内系统的总运行成本最小。有人会问风光几乎零成本是不是风光的容量越大越好表面看是但实际不是因为电网对功率波动有承受极限。风光出力大了柴油机就得压低出力甚至停机储能也可能因为充电功率上限而被迫弃风弃光。弃风弃光虽然不花燃料钱但本质上浪费了已经建好的装机容量所以在目标函数里要加弃风弃光惩罚项让它出现在成本中。1.2 经济调度的“经济”二字藏在成本模型里要做经济调度第一步就是建立每个设备的成本模型。柴油发电机的燃料成本通常用二次函数拟合C_fuel(P_d) a * P_d² b * P_d c其中P_d是柴油机出力kWa、b、c是燃料成本系数。这个二次函数的含义很直观柴油机在小出力运行时单位燃料消耗率偏高随着出力上升逐渐接近最佳热效率点但超过某个负荷率后单位油耗又会上升。这就是为什么目标函数里会出现P²项它让优化算法自动避开低效率区间。储能的成本不那么直接一般用充放电爬坡产生的电池循环损耗来量化简单处理时可以用一个损耗系数乘上充放电电量。更多时候储能的作用是通过峰谷电价差体现的——白天电价高合理放电凌晨电价低谷充电这本身就是一种“经济行为”。所以储能的建模更多是约束条件而不是成本项本身。1.3 一个调度周期的“决策变量”到底有哪些24小时调度是最常见的场景以小时为调度间隔。决策变量包括柴油发电机每小时的出力 P_d(t)t 1, 2, ..., 24储能每小时的充放电功率 P_b(t)正值表示放电负值表示充电每小时从主网购电的功率 P_grid(t)——如果微电网是并网型的话这三个序列是整个优化问题的核心未知量。风电、光伏的出力P_w(t)、P_pv(t)是已知输入来自预测数据负荷需求P_load(t)也是已知输入。这个优化问题的规模看起来不大一共3×2472个连续变量但因为柴油机的燃料成本是非线性的储能还有SOC状态随时间递推的耦合关系所以这不是一个简单能手解的线性规划。要真正求解需要在目标函数和约束条件上做细致的设计。2. 数学建模目标函数与约束条件的设计2.1 目标函数里每一项都有它的现实意义我用的目标函数包括四部分F F_fuel F_om F_curtail F_gridF_fuel柴油机燃料成本F_om运行维护成本通常和机组出力成线性关系比如每千瓦时0.03元F_curtail弃风弃光惩罚单位是元/kWh这个系数要设置得比电价高否则优化结果会为了省钱而故意弃风逻辑上就反了F_grid与主网的购电成本/售电收益这里有个容易被初学者忽略的点F_curtail的系数一定要认真调。我一开始把弃风惩罚系数设成0.1元/kWh结果在某个时段风电出力大而负荷小的时候粒子群算法选择弃掉一部分风电因为这时候给储能充电再放出来的损耗成本比弃风惩罚更高。逻辑上这是“经济合理”的但现实中如果项目有可再生能源消纳率考核这种策略就不能接受。所以惩罚系数的取值本质上是把政策指标转化为经济信号需要和项目需求对齐。2.2 功率平衡约束整个优化问题的骨架任何时刻系统功率必须平衡P_w(t) P_pv(t) P_d(t) P_b(t) P_grid(t) P_load(t)其中P_b(t)充电时为负值。这个约束必须严格满足否则仿真结果没有实际意义。我见过不少初学者直接用罚函数把功率不平衡量加到目标函数里思路是“不平衡越大罚得越狠”。理论上可行但实践中有个坑罚函数系数如果太小最终结果会带着功率偏差看起来成本很低实际却违背了物理规律罚函数系数如果太大会压制粒子群算法的搜索能力让优化过程变成纯粹的罚函数最小化调度的经济性反而变差。所以功率平衡这个约束建议用等式约束处理方式在最外层加一个较大的罚项。具体做法我在后面的代码部分会给出。2.3 机组与储能约束每条约束都是设备说明书柴油发电机有出力上下限P_d_min ≤ P_d(t) ≤ P_d_max这对应机组的额定功率范围。还要考虑爬坡约束|P_d(t) - P_d(t-1)| ≤ Ramp_d爬坡约束反映柴油机的响应能力有的模型为了简化省略掉但对短时间尺度的调度比如15分钟间隔必须包含否则优化出来的出力曲线会剧烈跳变现场根本执行不了。储能约束包括SOC_min ≤ SOC(t) ≤ SOC_max-P_b_max ≤ P_b(t) ≤ P_b_maxSOC(t1) SOC(t) - P_b(t) * Δt / E_bat其中SOC是荷电状态E_bat是储能容量kWh。充放电功率上限P_b_max取决于变流器容量和电池特性SOC上下限则是为了保护电池寿命一般取0.2到0.9之间。还有一个很重要的约束调度周期结束时SOC要回到初始值SOC(24) SOC(0)这条约束的含义是储能不能把一个周期内的电量“用完”它的能量应该在每个调度周期内守恒。如果不加这个约束优化算法会在最后几个时段把储能彻底放空只考虑当前周期的经济性留下一个“透支”的状态给下一个调度周期无穷无尽的寅吃卯粮。我实际调模型时曾经因为没加这个约束仿真结果好看得离谱——最后一小时SOC掉到0.2以下整个系统的成本比正常情况低了将近8%但现场根本没法执行。2.4 联络线功率约束并网型微电网的特有约束如果微电网和主网相连联络线的传输能力是有限的|P_grid(t)| ≤ P_grid_maxP_grid_max取决于变压器的容量和线路的载流量。这个约束直接影响微电网“买卖电”的能力。在峰谷电价差异大的地区这个约束会显著影响经济调度结果——想多卖电给主网赚差价但联络线容量不够就只好把多余电量存到储能里或者减少风光出力。3. 基于Matlab的粒子群算法求解实操3.1 为什么选粒子群算法而不是线性规划风光柴储经济调度这个问题的难点在于柴油机成本的非线性。如果用线性规划或者混合整数线性规划需要将二次成本函数分段线性化对参数做离散处理。这种方法求解速度快、有全局最优性保证但建模过程繁琐分段点的设置对精度影响很大。我最终选择了粒子群算法PSO主要是考虑到课题演示和快速迭代的需求。PSO不依赖于梯度信息不需要对目标函数做线性化处理可以直接用原始的非线性模型。它的缺点是可能陷入局部最优但通过多轮随机初始化、调整惯性权重和种群规模实际效果足够稳定。做工程和做学术的侧重不一样。学术上讲究精确求解工程上讲究快速得到一个合理可用的方案然后再用精确算法验证。如果追求严谨可以在PSO得到初步结果后把它作为初值给非线性规划求解器比如Matlab的fmincon再做一次局部精化两者结合又稳又快。3.2 变量编码与粒子结构设计3.1节提到决策变量有72个。在PSO中每个粒子代表一组完整的调度方案其位置是一个72维的向量X [P_d(1), ..., P_d(24), P_b(1), ..., P_b(24), P_grid(1), ..., P_grid(24)]。有一个细节值得注意变量应该分组编码而不是直接全部堆在一起。原因是不同变量的取值范围差异很大——柴油机出力在几百kW量级储能功率可能只有几十kWSOC在0到1之间。如果不归一化粒子群算法会在数值上偏向大尺度变量导致小尺度变量搜索不充分。我的做法是每个变量先归一化到[0,1]区间粒子位置向量是一组归一化值计算适应度时再映射回实际变量。这样不仅消除了量纲差异还方便统一设置速度和位置的上下界。3.3 PSO核心参数怎么定PSO有四个关键参数种群规模N、最大迭代次数MaxIter、惯性权重w、学习因子c1和c2。我做了几组对比实验N30、50、100MaxIter100、200、500。结论是对于72维的调度问题N50、MaxIter300已经够用再往上增加迭代次数成本下降非常有限大概在0.5%以内但计算时间成倍增长。如果在线的微电网能量管理系统里跑实时调度建议N控制在30左右、迭代150次以内因为系统允许的计算时间通常只有几十秒。惯性权重的设置我采用线性递减策略w w_max - (w_max - w_min) * iter / MaxIterw_max一般取0.9w_min取0.4。迭代初期w大粒子的全局搜索能力强迭代后期w小局部精细搜索能力增强。这个策略几乎适用于所有PSO调度问题属于“万金油”但确实有效的做法。c1和c2取1.5代表粒子向个体最优和全局最优学习的强度。有的文献建议c1 c2 4效果更好但我在这个模型上实测没有明显差异建议直接在1.5附近试重点看适应度收敛曲线是否平滑。3.4 核心代码结构与关键函数我的Matlab代码分成四个模块参数初始化、粒子群迭代、适应度计算、结果可视化。参数初始化部分如下所示% 时间参数 T 24; % 调度周期小时 dt 1; % 时间间隔小时 % 负荷与新能源出力示例数据单位kW P_load [120, 110, 100, 95, 90, 100, 130, 180, 220, 240, 250, 260, ... 270, 265, 250, 240, 235, 230, 225, 210, 190, 170, 150, 130]; P_w [45, 40, 38, 35, 30, 32, 40, 50, 55, 48, 42, 38, ... 35, 33, 36, 42, 48, 52, 50, 49, 47, 45, 43, 40]; P_pv [0, 0, 0, 0, 10, 30, 60, 100, 140, 170, 190, 200, ... 195, 180, 155, 130, 95, 50, 10, 0, 0, 0, 0, 0]; % 柴油机参数 P_d_min 20; P_d_max 150; a_fuel 0.0002; b_fuel 0.15; c_fuel 5; ramp_rate 60; % 爬坡限制kW/h % 储能参数 E_bat 300; % 储能容量kWh SOC_min 0.2; SOC_max 0.9; SOC_init 0.5; P_b_max 60; % 充放电功率上限kW eta_ch 0.95; eta_dis 0.95; % 充放电效率 % 电价分时电价示例单位元/kWh price_buy [0.35, 0.32, 0.30, 0.28, 0.28, 0.30, 0.40, 0.60, ... 0.85, 0.95, 1.00, 1.05, 1.10, 1.08, 1.00, 0.90, ... 0.75, 0.65, 0.80, 0.90, 0.75, 0.55, 0.45, 0.38];适应度函数是整个算法的核心写法如下function cost fitness_calc(x, param) % x是一个T*3的向量前三段是柴油机出力、储能功率、购电功率 % 从x中拆出各个变量 P_d x(1:param.T); P_b x(param.T1:param.T*2); P_grid x(param.T*21:param.T*3); % 初始化SOC SOC zeros(1, param.T); SOC(1) param.SOC_init; total_cost 0; penalty 0; for t 1:param.T % 燃料成本 fuel_cost param.a_fuel * P_d(t)^2 param.b_fuel * P_d(t) param.c_fuel; % 购电成本负的P_grid表示向主网售电 if P_grid(t) 0 grid_cost P_grid(t) * param.price_buy(t); else grid_cost P_grid(t) * param.price_sell(t); end % 弃风弃光惩罚 curtail_w max(0, param.P_w(t) - (param.P_load(t) - P_d(t) - P_b(t) - P_grid(t))); curtail_penalty param.penalty_curtail * curtail_w * 1; % 这只是粗略示意 % 储能SOC递推 if P_b(t) 0 SOC_next SOC(t) - P_b(t) * param.dt / param.E_bat / param.eta_dis; else SOC_next SOC(t) - P_b(t) * param.dt / param.E_bat * param.eta_ch; end % 约束惩罚SOC越限、柴油机越界、爬坡越界等 penalty penalty ... param.lambda_SOC * (max(0, SOC_next - param.SOC_max)^2 max(0, param.SOC_min - SOC_next)^2) ... param.lambda_Pd * (max(0, P_d(t) - param.P_d_max)^2 max(0, param.P_d_min - P_d(t))^2) ... param.lambda_ramp * max(0, abs(P_d(t) - P_d_prev) - param.ramp_rate)^2; total_cost total_cost fuel_cost grid_cost curtail_penalty; SOC(t1) SOC_next; P_d_prev P_d(t); end % 末尾SOC回归约束的惩罚 penalty penalty param.lambda_SOC_end * (SOC(end) - param.SOC_init)^2; cost total_cost penalty; end这段代码是简化版但已经能体现完整的约束处理思路。SOC递推公式里我分别处理了充电和放电两种情况的效率爬坡约束用了上一时刻的出力值SOC末尾回归约束通过罚函数施加了一个软性要求。所有越界量都用平方形式进入罚项保证罚项是连续可导的虽然PSO不要求可导但这样处理数值上更平滑。3.5 PSO主循环怎么写主循环的框架并不复杂% 初始化粒子群 N 50; MaxIter 300; dim param.T * 3; pos rand(N, dim); % 归一化位置 vel zeros(N, dim); pbest_pos pos; pbest_val inf(N, 1); [gbest_val, gbest_idx] min(pbest_val); gbest_pos pbest_pos(gbest_idx, :); % 迭代 for iter 1:MaxIter w 0.9 - (0.9 - 0.4) * iter / MaxIter; for i 1:N % 映射到实际变量范围 x_real denormalize(pos(i, :), param); % 计算适应度 val fitness_calc(x_real, param); % 更新个体最优 if val pbest_val(i) pbest_val(i) val; pbest_pos(i, :) pos(i, :); end % 更新全局最优 if val gbest_val gbest_val val; gbest_pos pos(i, :); end % 速度和位置更新 vel(i, :) w * vel(i, :) ... 1.5 * rand(1, dim) .* (pbest_pos(i, :) - pos(i, :)) ... 1.5 * rand(1, dim) .* (gbest_pos - pos(i, :)); pos(i, :) pos(i, :) vel(i, :); % 边界处理反射或截断 pos(i, :) max(0, min(1, pos(i, :))); end end优化后的调度结果就是gbest_pos反归一化后的值。有两点值得说明。第一粒子位置向量是归一化的所以边界处理直接用0和1截断即可。截断之后可能出现粒子“堆积”在边界的情况但实际影响不大因为pbest和gbest保存了历史最优信息。第二速度和位置的更新公式里rand(1, dim)每次都会重新随机这保证了算法不会陷入确定性循环。4. 仿真结果解读调度曲线和成本分析4.1 典型日调度结果长什么样跑完24小时调度我会把结果画成三张图第一张是功率平衡图柱状图叠加显示每个时段的负荷、风电、光伏、柴油机出力、储能充放电和购电功率第二张是SOC曲线看储能一天的能量变化轨迹第三张是柴油机出力曲线和电价曲线的对比图用于分析柴油机和购电策略之间的配合逻辑。功率平衡图是最直观的验证手段眼睛扫一遍就能看出每个时段功率是否平衡、有没有丢负荷的情况。SOC曲线能看出储能的充放电次数、深度以及是否越界。柴油机和电价曲线对比图能看出调度的“经济逻辑”是否合理——在电价低谷时段应该优先从主网买电而不是烧柴油在电价尖峰时段应该让储能放电而不是从主网购电。我跑出来的典型结果是柴油机在凌晨负荷低谷时以最小出力运行甚至停机白天天阳充足时几乎所有负荷都由光伏承担傍晚光伏出力骤降后柴油机和储能协同顶峰夜间电价低谷时段转向主网购电并给储能充电为第二天早高峰做准备。这个调度曲线和现场工程师的经验判断高度一致明白了这个后面做策略优化才有了基准。4.2 储能SOC曲线的三个检查要点SOC曲线需要重点检查三点。第一SOC是否全程在上下限约束内。如果优化结果里SOC顶到0.9或者掉到0.2说明储能容量相对负荷偏小或者充放电策略不健康需要调整储能容量或者放宽充放电功率上限。第二SOC在调度周期末是否回到初始值。理想情况下SOC(24)和SOC_init的偏差应该小于0.01如果偏差较大说明末尾回归约束的罚函数权重不够往上调就行。第三充放电切换次数。如果SOC曲线高频振荡说明储能在一个小时内反复充放电这既不经济也伤电池。正常情况下一天之内储能的充放电状态切换应该控制在4次以内。如果超过这个数我会考虑在目标函数中加入储能动作惩罚项比如每次状态切换增加一个固定成本让算法自动减少无谓的充放电切换。4.3 成本构成分析与灵敏度分析经济调度的输出不只是“这个调度花了多少钱”更重要的是搞清楚钱花在了哪里。我通常会统计八个数值柴油机燃料总成本、运行维护成本、购电成本、售电收益、弃风惩罚、弃光惩罚、储能损耗成本、总成本。这组数据拿出来之后可以直观地看出系统运行的经济瓶颈在哪里。如果燃料成本占比超过50%说明柴油机在系统里出力过多要么是风光资源确实不足要么是储能的移峰能力没有被充分挖掘。如果购电成本占比很高就要看分时电价的结构考虑是否调整购电策略。灵敏度分析是快速判断方案可行性的一个很有用的手段。做法很简单在基准参数上下浮动10%-20%重新运行优化看总成本的变化幅度。比如研究光伏装机容量从100kW增加到150kW对总成本的影响只需要修改P_pv的输入序列保持其他参数不变对比两种方案下的成本和出力结构。这个分析在项目前期论证阶段特别有用能辅助决策要不要扩容、扩多少。5. 工程实践中的坑与调参经验5.1 PSO“早熟”怎么处理做PSO调度被问得最多的问题就是“我的算法老是收敛到同一个很差的解怎么办”。这类问题绝大多数是早熟收敛——种群在迭代初期就聚集到了局部最优附近失去了继续探索的能力。我用的三个对策亲测有效第一增加随机性。初始化种群时不要用zeros或者ones用rand并且可以多跑几轮每轮用不同的随机种子取成本最低的那轮结果作为最终方案。这是最简单粗暴但有效的方法。第二引入变异机制。在粒子更新完成后以较小的概率比如5%对随机选择的几个维度做扰动if rand 0.05 idx randi(dim); pos(i, idx) rand; end这个操作相当于遗传算法里的变异能在迭代后期重新引入探索能力让粒子有机会跳出局部最优。第三动态调整惯性权重的衰减曲线。前面提到w从0.9线性降到0.4但如果早熟现象严重可以让w在迭代中期突然增大一次比如在50%迭代次数处重置w为0.8再继续衰减。这个“跳出”动作对某些多峰目标函数很有效。5.2 罚函数权重的主观性怎么破罚函数方法有一个天然的弱点lambda系数是人工设定的带有主观性而且它对最终解的影响很大。lambda太大优化过程以“满足约束”为第一目标经济性被牺牲lambda太小约束被随意违反结果不可用。我的做法是分两步。先把等式约束功率平衡的lambda设得很大比如1e6确保解满足物理规律再把不等式约束的lambda设成比目标函数数量级稍大的值具体做法是先跑一次不带罚项的优化看目标函数大概在什么量级然后让惩罚项的量级比目标函数大一到两个数量级。但这个方法有个缺陷如果某个粒子严重违反约束但总成本很低罚函数会把它的适应度压得很高但这并不意味着算法会拒绝它。PSO的更新机制只认适应度数值所以只要罚函数的梯度方向正确粒子群会逐渐把解推向可行域。我强烈建议在优化完成后做一个约束校验重新计算最优解的功率平衡残差、SOC上下限、爬坡速率把所有残差打印出来。不要只看成本数值好看物理上是否自洽才决定了这个结果能不能落到现场。5.3 从仿真到实际应用还要补哪些东西仿真模型跑通了distances到真正能用还有几件事要补。第一风光出力的预测误差。我的模型用的是确定性预测数据但实际风电和光伏的预测误差在10%-30%是常态。工程上需要在调度模型上叠加一个滚动修正环节——每15分钟或每小时重新预测、重新优化用最新实测数据修正调度指令而不是一成不变地执行24小时前的预案。第二柴油机频繁启停的问题。经济调度结果可能显示某台柴油机在凌晨关机最省钱但实际现场的柴油机启动一次有额外成本油耗、磨损和时间延迟启动时间可能长达几分钟这些都要在模型中显式建模。最简单的处理方式是在目标函数里加一个启动成本项只要柴油机从停机状态转为运行状态就增加一笔固定费用。第三储能寿命衰减模型。我前文用了简单的损耗系数但更精细的模型会把充放电深度、循环次数、温度等因素对应的容量衰减折算成成本这部分对储能的经济性评价影响很大会直接改变“多用储能”和“少用储能”之间的取舍。5.4 我常用的调参经验小结最后把这段时间调参数的体会整理成一个清单先保证约束满足再谈经济性。任何结果都必须先过“功率平衡校验”这一关。罚函数权重从大到小调。先校准不可行域再放开搜索空间。PSO跑10轮取最优解不要只跑1轮就用结果。随机性是元启发式算法的双刃剑。看收敛曲线。如果适应度曲线在迭代末期还在明显下降说明迭代次数不够加迭代或者加变异。对比快照。取第10代、第50代、第150代的调度结果出来看工科判断优于只看适应度数值。这套风光柴储微电网经济调度模型我用Matlab反复调过很多次整体架构已经稳定下来。如果你正在做类似课题建议先从最简单的两电源模型柴油机储能跑通整个链路再加入风光预测数据和分时电价一步步加复杂度。等模型稳定了再试着引入滚动优化、混合整数规划这些更精确的求解方法往实际工程场景推进一步。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询