搞电力系统规划的同行都知道,分布式电源(DG)的选址定容是个典型的多目标优化难题。上个月我在做一个30节点配电网的DG规划项目时,深刻体会到教科书上的理论方法和实际工程之间的差距。今天我就把整个建模思路、算法实现和踩过的坑完整梳理一遍,重点分享如何用Matlab实现这个多目标优化过程。
先说说这个问题的特殊性:DG选址定容需要考虑投资成本、电压质量和网络损耗三个相互制约的目标。投资方希望容量越小越好,电网公司关注电压稳定性,而运维部门最在意线损指标。更麻烦的是,这些目标之间没有明确的数学关系,传统的单目标优化方法根本没法用。
我用的测试案例是一个30节点的辐射状配电网,基准电压10kV。网络参数用矩阵存储,这是电力系统分析的常规操作:
matlab复制bus_data = [...
1 0 0 0 0 0 1.0; % 节点编号, P负荷, Q负荷, P发电, Q发电, 无功补偿, 电压标幺值
2 100 60 0 0 0 1.0;
...
30 80 40 0 0 0 1.0];
这里有个细节要注意:负荷数据单位是kW和kVar,而电压是标幺值。实际项目中一定要确认数据单位是否统一,我曾经就遇到过因为单位不匹配导致计算结果偏差10倍的事故。
核心难点在于如何将三个不同量纲的目标统一到一个评价体系中。经过多次试验,我采用了加权求和法:
matlab复制function [f] = objective(x)
% x = [安装位置1, 容量1, 安装位置2, 容量2, ...]
cost_inv = sum(x(:,2) * 5000); % 投资成本(元)
loss = calc_power_loss(x); % 网损(kW)
voltage_dev = max(abs(1 - bus_voltage(x))); % 电压偏差(标幺值)
% 加权求和(权重需根据项目调整)
f = 0.5*cost_inv + 0.3*loss + 0.2*voltage_dev*10000;
end
这里有几个关键点:
精确计算推荐前推回代法,但代码量较大。赶时间时可以用这个近似公式:
matlab复制function [Ploss] = fast_loss_calc(P,Q,V,R,X)
I = (P - 1j*Q)./V; % 计算线路电流
Ploss = real(sum(3 * (I).^2 .* (R + 1j*X))); % 三相网损
end
注意:近似计算在重载情况下误差可能达到15%,正式报告建议用精确算法
经过对比测试,遗传算法(GA)在这个问题上表现最稳定:
matlab复制options = optimoptions('ga',...
'PopulationSize',50,... % 种群大小
'CrossoverFraction',0.8,... % 交叉概率
'MutationFcn',@mutationadaptfeasible,... % 自适应变异
'MaxGenerations',100); % 最大迭代次数
[x_opt,fval] = ga(@objective,...
2*num_dg,... % 变量数(位置+容量)
[],[],[],[],... % 线性约束(无)
zeros(1,2*num_dg),... % 下限
[ones(1,num_dg)*30, ones(1,num_dg)*2000],... % 上限
[],options);
第一版算法把安装位置当作连续变量处理,结果取整后性能下降严重。改进方案:
matlab复制IntCon = 1:num_dg; % 指定前num_dg个变量为整数(节点编号)
[x_opt,fval] = ga(@objective,...
2*num_dg,...
[],[],[],[],...
[ones(1,num_dg),zeros(1,num_dg)],... % 位置下限为1
[ones(1,num_dg)*30, ones(1,num_dg)*2000],...
[],IntCon,options);
这个改动让优化结果直接可用,无需后处理,计算效率提升约40%。
经过20多次实验,总结出这些黄金参数:
优化前后的电压分布对比最能说明问题:
matlab复制figure;
plot(1:30, V_base, 'r--', 1:30, V_opt, 'b-');
title('节点电压对比');
xlabel('节点编号');
ylabel('电压(pu)');
legend('原始网络','优化后');
grid on;

教科书案例通常显示DG应该装在馈线末端,但实际优化结果却集中在中段(15-20节点)。经过排查发现:
这说明实际项目中,负荷分布数据质量比算法选择更重要。建议:
问题现象:目标函数值震荡不收敛
解决方法:
典型case:DG全装在同一个节点
根源:未设置安装间隔约束
修正方法:添加非线性约束
matlab复制function [c, ceq] = constraints(x)
positions = x(1:2:end);
c = min(diff(sort(positions))) - 2; % 最小间隔2个节点
ceq = [];
end
当节点数超过50时,建议:
matlab复制options.UseParallel = true;
下一步我准备尝试混合算法,将GA与局部搜索结合:
matlab复制options.HybridFcn = @fmincon; % 遗传算法+非线性规划
另一个有意思的发现是:在不同负荷场景下,最优解集会发生变化。因此考虑:
最后给同行们的建议是:DG规划没有放之四海而皆准的方案,必须根据具体网架结构和负荷特性调整模型参数。多跑几次优化,对比分析结果差异,往往比追求单次计算的"最优解"更有工程价值。