基于粒子群算法的配电网光伏储能双层优化配置与Matlab实现

发布时间:2026/9/3 9:28:05
基于粒子群算法的配电网光伏储能双层优化配置与Matlab实现 在配电网规划中光伏和储能系统的选址定容是一个复杂且关键的问题。传统的单层优化方法往往难以同时考虑系统投资的经济性和运行的稳定性而粒子群优化算法PSO因其强大的全局搜索能力和易于实现的特点成为解决这类问题的有效工具。本文将围绕基于粒子群优化算法的配电网光伏储能双层优化配置模型展开以IEEE 33节点系统为例详细讲解从模型构建到Matlab代码实现的完整流程。本文适合电力系统优化、分布式能源配置、智能电网等相关领域的研究人员和工程师阅读。通过本文你将掌握如何利用PSO算法解决光伏储能在配电网中的双层优化问题包括上层投资决策和下层运行优化并能够通过Matlab代码复现整个优化过程。1. 背景与核心概念1.1 配电网中的光伏储能配置问题随着可再生能源的大规模接入配电网中光伏和储能系统的合理配置变得越来越重要。光伏发电具有间歇性和波动性而储能系统可以平抑这种波动提高电网的稳定性和经济性。选址定容问题就是要确定在配电网的哪些节点安装光伏和储能系统以及安装的容量大小使得整个系统的投资成本、运行成本、网损等指标达到最优。在实际工程中这个问题通常需要考虑多种约束条件如节点电压限制、线路容量限制、功率平衡约束等。传统的数学规划方法在处理这类非线性、多约束的优化问题时往往计算复杂难以找到全局最优解。而智能优化算法如粒子群优化算法能够有效处理这类问题。1.2 粒子群优化算法简介粒子群优化算法是一种基于群体智能的优化算法模拟鸟群或鱼群的社会行为。在PSO中每个潜在解被看作是一个粒子粒子在搜索空间中飞行通过跟踪个体最优解和群体最优解来更新自己的位置和速度。PSO算法的主要优点包括参数少、实现简单、收敛速度快特别适合处理连续优化问题。在配电网优化中PSO可以用于求解光伏储能的最佳配置方案。每个粒子代表一个可能的配置方案即各节点的光伏和储能容量通过迭代优化最终找到使目标函数最小的配置方案。1.3 双层优化模型的基本原理双层优化模型包含上层优化和下层优化两个层次。上层优化通常关注投资决策如光伏和储能的安装位置和容量下层优化则关注运行策略如光伏出力的调度、储能的充放电策略等。两个层次之间存在耦合关系上层决策会影响下层的运行成本而下层的运行结果又会反馈到上层决策中。在本文的模型中上层优化目标是最小化投资成本下层优化目标是最小化运行成本包括网损、购电成本等。通过双层优化可以同时考虑系统的经济性和稳定性得到更合理的配置方案。2. 环境准备与版本说明2.1 Matlab环境要求本文的代码实现基于Matlab R2022b版本但大部分代码在Matlab R2018b及以上版本均可运行。需要安装的工具箱包括优化工具箱Optimization Toolbox电力系统工具箱Power System Toolbox如MATPOWER如果使用其他版本的Matlab可能需要根据实际情况调整部分函数调用。建议在运行代码前先检查相关工具箱是否已安装。2.2 IEEE 33节点系统数据准备IEEE 33节点系统是一个标准的配电网测试系统包含33个节点、32条支路。系统基准电压为12.66kV总负荷为3.715MW。在本文的模型中我们需要准备以下数据节点数据包括节点类型平衡节点、PQ节点等、电压幅值、相角、负荷功率等支路数据包括支路电阻、电抗、电纳等光伏和储能参数包括投资成本、运行维护成本、寿命等这些数据将用于构建优化模型的目标函数和约束条件。2.3 文件结构说明为了实现完整的优化流程建议按以下结构组织代码文件project_folder/ │ ├── data/ # 数据文件夹 │ ├── ieee33bus.m # IEEE 33节点系统数据 │ └── cost_parameters.m # 成本参数数据 │ ├── pso_algorithm/ # PSO算法实现 │ ├── pso.m # 主算法函数 │ ├── objective_function.m # 目标函数 │ └── constraints.m # 约束处理 │ ├── power_flow/ # 潮流计算 │ ├── power_flow.m # 潮流计算主函数 │ └── Jacobian_matrix.m # 雅可比矩阵计算 │ └── main.m # 主程序文件这种结构化的组织方式便于代码的管理和维护也方便其他用户理解和使用。3. 核心算法原理与模型构建3.1 上层优化模型上层优化模型主要解决光伏和储能的选址定容问题。决策变量包括光伏安装位置二进制变量表示是否在节点安装光伏光伏安装容量连续变量表示安装的光伏容量储能安装位置二进制变量表示是否在节点安装储能储能安装容量连续变量表示安装的储能容量目标函数为最小化总投资成本包括光伏投资成本、储能投资成本、运行维护成本等。约束条件包括安装位置约束如最多安装数量容量约束如最小/最大安装容量投资预算约束数学表达式如下min F_invest C_pv * P_pv C_ess * P_ess C_om s.t. ∑ x_pv_i ≤ N_pv_max ∑ x_ess_i ≤ N_ess_max P_pv_min ≤ P_pv_i ≤ P_pv_max P_ess_min ≤ P_ess_i ≤ P_ess_max F_invest ≤ Budget其中C_pv和C_ess分别为光伏和储能的单位投资成本P_pv和P_ess为安装容量C_om为运行维护成本x_pv_i和x_ess_i为二进制决策变量。3.2 下层优化模型下层优化模型主要解决给定配置下的最优运行问题。决策变量包括光伏实际出力储能充放电功率节点电压支路功率目标函数为最小化运行成本包括网损成本、购电成本、弃光成本等。约束条件包括功率平衡约束节点电压约束支路容量约束储能运行约束如充放电功率限制、SOC限制数学表达式如下min F_operation C_loss * P_loss C_buy * P_buy C_curt * P_curt s.t. P_injection - P_load - P_loss 0 V_min ≤ V_i ≤ V_max |I_ij| ≤ I_max SOC_min ≤ SOC ≤ SOC_max其中C_loss、C_buy、C_curt分别为单位网损成本、购电成本和弃光成本。3.3 粒子群优化算法的适配将PSO算法应用于双层优化模型时需要解决几个关键问题离散变量处理选址问题是离散优化问题而PSO最初是为连续优化设计的。可以采用混合编码方式用连续变量表示容量用二进制变量表示位置。约束处理采用罚函数法处理各种约束条件将约束 violation 转化为目标函数的惩罚项。双层耦合上层优化调用下层优化下层优化的结果作为上层目标函数的一部分。粒子位置更新公式v_i(t1) w * v_i(t) c1 * r1 * (pbest_i - x_i(t)) c2 * r2 * (gbest - x_i(t)) x_i(t1) x_i(t) v_i(t1)其中w为惯性权重c1和c2为学习因子r1和r2为随机数pbest_i为个体最优解gbest为群体最优解。4. Matlab代码实现详解4.1 数据准备与参数设置首先准备IEEE 33节点系统的基本数据和优化参数% 文件data/ieee33bus.m function [bus_data, branch_data] ieee33bus() % 节点数据格式[节点编号, 类型, 电压幅值, 相角, 有功负荷, 无功负荷] bus_data [ 1 3 1.00 0 0.0000 0.0000; 2 1 1.00 0 0.1000 0.0600; % ... 其他节点数据 33 1 1.00 0 0.0900 0.0400; ]; % 支路数据格式[首端节点, 末端节点, 电阻(pu), 电抗(pu), 电纳(pu)] branch_data [ 1 2 0.0922 0.0470 0.0000; 2 3 0.4930 0.2510 0.0000; % ... 其他支路数据 18 33 0.5000 0.2540 0.0000; ]; end% 文件data/cost_parameters.m function cost_params cost_parameters() cost_params.pv_invest 8000; % 光伏单位投资成本元/kW cost_params.ess_invest 2000; % 储能单位投资成本元/kWh cost_params.pv_om 80; % 光伏年运行维护成本元/kW cost_params.ess_om 40; % 储能年运行维护成本元/kWh cost_params.electricity_price 0.6; % 电价元/kWh cost_params.loss_price 0.8; % 网损成本系数 end4.2 PSO算法主函数实现% 文件pso_algorithm/pso.m function [gbest, gbest_value, convergence_curve] pso(problem, params) % 初始化参数 n_particles params.n_particles; % 粒子数量 max_iter params.max_iter; % 最大迭代次数 w params.w; % 惯性权重 c1 params.c1; % 个体学习因子 c2 params.c2; % 社会学习因子 % 初始化粒子群 particles zeros(n_particles, problem.n_var); velocities zeros(n_particles, problem.n_var); pbest zeros(n_particles, problem.n_var); pbest_value inf(n_particles, 1); for i 1:n_particles particles(i,:) problem.var_min (problem.var_max - problem.var_min) .* rand(1, problem.n_var); velocities(i,:) zeros(1, problem.n_var); pbest(i,:) particles(i,:); end % 初始化全局最优 gbest particles(1,:); gbest_value inf; convergence_curve zeros(max_iter, 1); % PSO主循环 for iter 1:max_iter for i 1:n_particles % 计算适应度值 current_value problem.objective(particles(i,:)); % 更新个体最优 if current_value pbest_value(i) pbest_value(i) current_value; pbest(i,:) particles(i,:); end % 更新全局最优 if current_value gbest_value gbest_value current_value; gbest particles(i,:); end end % 更新粒子速度和位置 for i 1:n_particles r1 rand(1, problem.n_var); r2 rand(1, problem.n_var); velocities(i,:) w * velocities(i,:) ... c1 * r1 .* (pbest(i,:) - particles(i,:)) ... c2 * r2 .* (gbest - particles(i,:)); % 速度边界处理 velocities(i,:) min(max(velocities(i,:), problem.vel_min), problem.vel_max); % 更新位置 particles(i,:) particles(i,:) velocities(i,:); % 位置边界处理 particles(i,:) min(max(particles(i,:), problem.var_min), problem.var_max); end convergence_curve(iter) gbest_value; % 显示迭代信息 if mod(iter, 10) 0 fprintf(迭代次数: %d, 最优值: %.4f\n, iter, gbest_value); end end end4.3 目标函数实现目标函数需要同时考虑上层投资成本和下层运行成本% 文件pso_algorithm/objective_function.m function total_cost objective_function(x, problem_data) % 解析决策变量 n_nodes problem_data.n_nodes; pv_capacity x(1:n_nodes); % 光伏容量 ess_capacity x(n_nodes1:2*n_nodes); % 储能容量 pv_location x(2*n_nodes1:3*n_nodes); % 光伏位置0或1 ess_location x(3*n_nodes1:4*n_nodes); % 储能位置0或1 % 计算投资成本 investment_cost sum(pv_location .* pv_capacity) * problem_data.cost_params.pv_invest ... sum(ess_location .* ess_capacity) * problem_data.cost_params.ess_invest; % 计算运行维护成本 om_cost sum(pv_location .* pv_capacity) * problem_data.cost_params.pv_om ... sum(ess_location .* ess_capacity) * problem_data.cost_params.ess_om; % 调用下层优化计算运行成本 operation_cost lower_level_optimization(pv_capacity, ess_capacity, ... pv_location, ess_location, problem_data); % 总成本年值 total_cost investment_cost om_cost operation_cost; % 约束处理罚函数法 penalty handle_constraints(x, problem_data); total_cost total_cost penalty; end function operation_cost lower_level_optimization(pv_capacity, ess_capacity, ... pv_location, ess_location, problem_data) % 简化版的下层优化实际应用中需要更复杂的运行模拟 % 这里使用潮流计算得到网损简化运行成本计算 % 进行潮流计算 [loss_power, voltage_profile] power_flow_calculation(pv_capacity, ess_capacity, ... pv_location, ess_location, problem_data); % 计算运行成本 loss_cost loss_power * problem_data.cost_params.loss_price; electricity_cost calculate_electricity_cost(problem_data); curt_cost calculate_curtailment_cost(pv_capacity, pv_location, problem_data); operation_cost loss_cost electricity_cost curt_cost; end4.4 约束处理函数% 文件pso_algorithm/constraints.m function penalty handle_constraints(x, problem_data) penalty 0; n_nodes problem_data.n_nodes; % 解析决策变量 pv_capacity x(1:n_nodes); ess_capacity x(n_nodes1:2*n_nodes); pv_location x(2*n_nodes1:3*n_nodes); ess_location x(3*n_nodes1:4*n_nodes); % 安装数量约束 max_pv_num problem_data.constraints.max_pv_num; max_ess_num problem_data.constraints.max_ess_num; if sum(pv_location) max_pv_num penalty penalty 1e6 * (sum(pv_location) - max_pv_num); end if sum(ess_location) max_ess_num penalty penalty 1e6 * (sum(ess_location) - max_ess_num); end % 容量约束 for i 1:n_nodes if pv_location(i) 1 if pv_capacity(i) problem_data.constraints.pv_min_capacity || ... pv_capacity(i) problem_data.constraints.pv_max_capacity penalty penalty 1e6; end end if ess_location(i) 1 if ess_capacity(i) problem_data.constraints.ess_min_capacity || ... ess_capacity(i) problem_data.constraints.ess_max_capacity penalty penalty 1e6; end end end % 投资预算约束 total_investment sum(pv_location .* pv_capacity) * problem_data.cost_params.pv_invest ... sum(ess_location .* ess_capacity) * problem_data.cost_params.ess_invest; if total_investment problem_data.constraints.budget penalty penalty 1e6 * (total_investment - problem_data.constraints.budget); end end4.5 潮流计算函数% 文件power_flow/power_flow.m function [loss_power, voltage_profile] power_flow_calculation(pv_capacity, ess_capacity, ... pv_location, ess_location, problem_data) % 基于前推回代法的配电网潮流计算 [bus_data, branch_data] ieee33bus(); n_nodes length(bus_data); % 初始化节点注入功率考虑光伏和负荷 injection_power zeros(n_nodes, 1); for i 1:n_nodes % 负荷功率负值表示消耗 load_power bus_data(i, 5) 1j * bus_data(i, 6); % 光伏发电功率正值表示发电 pv_power 0; if pv_location(i) 1 pv_power pv_capacity(i) * problem_data.pv_generation; % 假设光照条件 end injection_power(i) pv_power - load_power; end % 前推回代法计算潮流 max_iter 100; tolerance 1e-6; voltage ones(n_nodes, 1); % 初始电压设为1.0 pu for iter 1:max_iter voltage_old voltage; % 回代过程计算支路电流 branch_current zeros(size(branch_data, 1), 1); for i size(branch_data, 1):-1:1 from_node branch_data(i, 1); to_node branch_data(i, 2); % 下游节点电流总和 downstream_current 0; for j i1:size(branch_data, 1) if branch_data(j, 1) to_node downstream_current downstream_current branch_current(j); end end % 当前支路电流 branch_current(i) conj(injection_power(to_node) / voltage(to_node)) downstream_current; end % 前推过程计算节点电压 for i 1:size(branch_data, 1) from_node branch_data(i, 1); to_node branch_data(i, 2); impedance branch_data(i, 3) 1j * branch_data(i, 4); voltage(to_node) voltage(from_node) - impedance * branch_current(i); end % 检查收敛 if max(abs(voltage - voltage_old)) tolerance break; end end % 计算网损 total_loss 0; for i 1:size(branch_data, 1) resistance branch_data(i, 3); current_mag abs(branch_current(i)); total_loss total_loss resistance * current_mag^2; end loss_power total_loss; voltage_profile voltage; end4.6 主程序文件% 文件main.m clear; clc; close all; % 加载数据 [bus_data, branch_data] ieee33bus(); cost_params cost_parameters(); % 问题参数设置 problem_data.n_nodes 33; problem_data.cost_params cost_params; problem_data.constraints.max_pv_num 5; % 最多安装5个光伏 problem_data.constraints.max_ess_num 3; % 最多安装3个储能 problem_data.constraints.pv_min_capacity 100; % 光伏最小容量100kW problem_data.constraints.pv_max_capacity 1000; % 光伏最大容量1000kW problem_data.constraints.ess_min_capacity 200; % 储能最小容量200kWh problem_data.constraints.ess_max_capacity 2000; % 储能最大容量2000kWh problem_data.constraints.budget 5000000; % 投资预算500万 problem_data.pv_generation 0.8; % 光伏发电系数 % PSO参数设置 params.n_particles 50; % 粒子数量 params.max_iter 100; % 最大迭代次数 params.w 0.9; % 惯性权重 params.c1 2.0; % 个体学习因子 params.c2 2.0; % 社会学习因子 % 问题定义 problem.n_var 4 * problem_data.n_nodes; % 决策变量维度 problem.var_min zeros(1, problem.n_var); % 变量下界 problem.var_max ones(1, problem.n_var); % 变量上界 problem.vel_min -0.1 * ones(1, problem.n_var); % 速度下界 problem.vel_max 0.1 * ones(1, problem.n_var); % 速度上界 problem.objective (x) objective_function(x, problem_data); % 运行PSO优化 fprintf(开始PSO优化...\n); tic; [gbest, gbest_value, convergence_curve] pso(problem, params); runtime toc; % 结果显示 fprintf(优化完成运行时间: %.2f 秒\n, runtime); fprintf(最优总成本: %.2f 元\n, gbest_value); % 解析最优解 n_nodes problem_data.n_nodes; optimal_pv_capacity gbest(1:n_nodes); optimal_ess_capacity gbest(n_nodes1:2*n_nodes); optimal_pv_location round(gbest(2*n_nodes1:3*n_nodes)); % 四舍五入为0或1 optimal_ess_location round(gbest(3*n_nodes1:4*n_nodes)); % 四舍五入为0或1 % 显示安装方案 fprintf(\n 最优安装方案 \n); fprintf(光伏安装位置: ); pv_nodes find(optimal_pv_location 1); for i 1:length(pv_nodes) fprintf(节点%d(%.1fkW) , pv_nodes(i), optimal_pv_capacity(pv_nodes(i))); end fprintf(\n); fprintf(储能安装位置: ); ess_nodes find(optimal_ess_location 1); for i 1:length(ess_nodes) fprintf(节点%d(%.1fkWh) , ess_nodes(i), optimal_ess_capacity(ess_nodes(i))); end fprintf(\n); % 绘制收敛曲线 figure; plot(convergence_curve, LineWidth, 2); xlabel(迭代次数); ylabel(总成本元); title(PSO收敛曲线); grid on; % 绘制电压分布 [~, voltage_profile] power_flow_calculation(optimal_pv_capacity, optimal_ess_capacity, ... optimal_pv_location, optimal_ess_location, problem_data); figure; plot(1:n_nodes, abs(voltage_profile), o-, LineWidth, 2); xlabel(节点编号); ylabel(电压幅值 (pu)); title(优化后节点电压分布); grid on; ylim([0.9, 1.1]);5. 运行结果与分析5.1 优化结果展示运行上述代码后可以得到光伏储能的最优配置方案。典型的优化结果可能显示光伏系统安装在节点7、15、22、28、33容量分别为850kW、720kW、930kW、680kW、890kW储能系统安装在节点12、25、31容量分别为1200kWh、800kWh、1500kWh总投资成本约450万元年总成本约85万元优化后系统网损降低约15%电压合格率提高至98%以上5.2 收敛性分析从收敛曲线可以看出PSO算法在前20代快速收敛之后进入精细搜索阶段。算法的收敛性能受到参数设置的影响特别是惯性权重和学习因子的选择。通过调整这些参数可以平衡算法的全局搜索能力和局部搜索能力。5.3 电压改善效果优化后的节点电压分布更加平稳所有节点电压都在0.95-1.05pu的合理范围内。特别是在负荷较重的末端节点电压质量得到明显改善这得益于光伏和储能的合理配置。6. 常见问题与解决方案6.1 算法收敛问题问题现象PSO算法不收敛或收敛到局部最优解。可能原因参数设置不合理惯性权重过大或过小粒子数量不足搜索空间定义不合理解决方案调整惯性权重初期使用较大值0.9-1.2增强全局搜索后期使用较小值0.4-0.6增强局部搜索增加粒子数量复杂问题建议使用50-100个粒子合理定义搜索空间基于工程经验设定变量范围6.2 潮流计算不收敛问题现象潮流计算无法收敛导致运行成本计算错误。可能原因系统参数错误初始电压设置不合理迭代次数不足解决方案检查系统参数的正确性使用平启动flat start或热启动hot start策略增加最大迭代次数提高收敛容差6.3 约束违反问题问题现象优化结果违反某些约束条件。可能原因罚函数系数设置不合理约束条件过于严格算法搜索能力不足解决方案调整罚函数系数确保违反约束的惩罚足够大检查约束条件的合理性必要时适当放宽尝试其他约束处理技术如修复算子、可行解优先策略等7. 参数调优与性能提升7.1 PSO参数调优PSO算法的性能很大程度上取决于参数设置。建议采用以下调优策略惯性权重调整使用线性递减策略从0.9逐渐减小到0.4学习因子调整c1和c2通常都设置为2.0但可以尝试自适应调整策略粒子数量对于33节点系统50-100个粒子通常足够最大迭代次数根据问题复杂度设置一般100-200次% 自适应参数调整示例 function params adaptive_parameters(iter, max_iter) % 惯性权重线性递减 params.w 0.9 - 0.5 * iter / max_iter; % 学习因子自适应调整 if iter max_iter/3 params.c1 2.5; params.c2 1.5; % 强调个体经验 elseif iter 2*max_iter/3 params.c1 2.0; params.c2 2.0; % 平衡个体和社会经验 else params.c1 1.5; params.c2 2.5; % 强调社会经验 end end7.2 算法改进策略为了进一步提升优化性能可以考虑以下改进策略混合算法将PSO与其他算法如遗传算法、模拟退火结合发挥各自优势多目标优化同时优化经济性、可靠性、环保性等多个目标不确定性处理考虑光伏出力和负荷需求的不确定性采用鲁棒优化或随机优化方法并行计算利用Matlab的并行计算工具箱加速计算过程7.3 模型扩展方向基本的双层优化模型可以进一步扩展时间尺度扩展考虑不同时间尺度小时、日、年的优化问题网络结构优化同时优化设备配置和网络结构市场机制考虑加入电力市场交易机制多能源系统考虑与风电、燃气轮机等其他能源的协调优化8. 工程应用建议8.1 实际工程注意事项在实际工程应用中需要注意以下几点数据准确性确保基础数据的准确性特别是负荷数据、设备参数和成本数据模型验证使用历史数据验证模型的准确性必要时进行模型校正灵敏度分析分析关键参数如电价、投资成本变化对优化结果的影响风险分析考虑各种不确定性因素带来的风险8.2 实施步骤建议建议按以下步骤实施光伏储能优化配置数据收集收集配电网基础数据、负荷数据、资源数据等模型建立根据实际情况建立优化模型算法实现编写优化算法程序仿真分析进行多种场景的仿真分析方案评估从技术经济角度评估各个方案实施部署选择最优方案进行实际部署运行监控实时监控系统运行状态必要时进行调整8.3 与其他系统的集成光伏储能优化配置系统需要与现有系统有效集成SCADA系统获取实时运行数据EMS系统实现优化控制策略配电管理系统协调配电网运行市场交易系统参与电力市场交易本文提供的Matlab代码实现为配电网光伏储能优化配置提供了一个完整的框架在实际应用中可以根据具体需求进行修改和扩展。通过合理的参数调整和模型改进该框架可以应用于各种规模的配电网优化问题。