基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现。该代码实现了含STATCOM的无功补偿优化,以最小化发电成本和网络损耗为目标。
% 带STATCOM的IEEE 30节点系统最优潮流 - PSO算法实现
% 目标:最小化发电成本 + 网络损耗
% 优化变量:发电机有功出力、STATCOM无功输出、节点电压幅值clc; clear; close all;%% IEEE 30节点系统数据
% 节点数据 [节点编号, 类型, 有功负荷(PD), 无功负荷(QD), 电压幅值(V), 电压相角(Vangle)]
bus_data = [1 3 0.0000 0.0000 1.0600 0.0000;2 2 0.2170 0.1270 1.0450 0.0000;3 2 0.0240 0.0120 1.0100 0.0000;4 1 0.0760 0.0160 1.0000 0.0000;5 1 0.9420 0.1900 1.0000 0.0000;6 2 0.2280 0.1090 1.0700 0.0000;7 1 0.3000 0.3000 1.0000 0.0000;8 2 0.3000 0.3000 1.0900 0.0000;9 1 0.0000 0.0000 1.0000 0.0000;10 1 0.0580 0.0200 1.0000 0.0000;11 1 0.0000 0.0000 1.0000 0.0000;12 1 0.1120 0.0750 1.0000 0.0000;13 1 0.0000 0.0000 1.0000 0.0000;14 1 0.0620 0.0160 1.0000 0.0000;15 1 0.0820 0.0250 1.0000 0.0000;16 1 0.0350 0.0180 1.0000 0.0000;17 1 0.0900 0.0580 1.0000 0.0000;18 1 0.0320 0.0090 1.0000 0.0000;19 1 0.0950 0.0340 1.0000 0.0000;20 1 0.0220 0.0070 1.0000 0.0000;21 1 0.1750 0.1120 1.0000 0.0000;22 1 0.0000 0.0000 1.0000 0.0000;23 1 0.0320 0.0160 1.0000 0.0000;24 1 0.0870 0.0670 1.0000 0.0000;25 1 0.0000 0.0000 1.0000 0.0000;26 1 0.0350 0.0230 1.0000 0.0000;27 1 0.0000 0.0000 1.0000 0.0000;28 1 0.0000 0.0000 1.0000 0.0000;29 1 0.0240 0.0090 1.0000 0.0000;30 1 0.1060 0.0190 1.0000 0.0000;
];% 发电机数据 [节点编号, 有功出力(PG), 无功出力(QG), 最大有功(PGmax), 最小有功(PGmin), 最大无功(QGmax), 最小无功(QGmin), 成本系数a, b, c]
gen_data = [1 250.0 0.0 300.0 50.0 300.0 -100.0 0.0001 3.25 100;2 40.0 0.0 80.0 20.0 50.0 -20.0 0.0002 4.00 120;5 50.0 0.0 100.0 30.0 60.0 -30.0 0.0003 3.75 150;8 20.0 0.0 50.0 10.0 30.0 -10.0 0.0004 4.50 180;11 20.0 0.0 50.0 10.0 30.0 -10.0 0.0005 4.00 140;13 20.0 0.0 50.0 10.0 30.0 -10.0 0.0006 4.50 160;
];% 支路数据 [起始节点, 终止节点, 电阻(R), 电抗(X), 电纳(B), 变压器变比(Tap), 相位角(Shift)]
branch_data = [1 2 0.0192 0.0575 0.0528 0 0;1 3 0.0452 0.1652 0.0408 0 0;2 4 0.0570 0.1737 0.0368 0 0;3 4 0.0132 0.0379 0.0084 0 0;2 5 0.0472 0.1983 0.0418 0 0;2 6 0.0581 0.1763 0.0378 0 0;4 6 0.0119 0.0414 0.0090 0 0;5 7 0.0460 0.1160 0.0204 0 0;6 7 0.0267 0.0820 0.0170 0 0;6 8 0.0120 0.0420 0.0090 0 0;6 9 0.0000 0.2080 0.0000 0.978 0;6 10 0.0000 0.5560 0.0000 0.969 0;9 11 0.0000 0.2080 0.0000 0 0;9 10 0.0000 0.1100 0.0000 0 0;4 12 0.0000 0.2560 0.0000 0.932 0;12 13 0.0000 0.1400 0.0000 0 0;12 14 0.1231 0.2559 0.0000 0 0;12 15 0.0662 0.1304 0.0000 0 0;12 16 0.0945 0.1987 0.0000 0 0;14 15 0.2210 0.1997 0.0000 0 0;16 17 0.0824 0.1932 0.0000 0 0;15 18 0.1070 0.2185 0.0000 0 0;18 19 0.0639 0.1292 0.0000 0 0;19 20 0.0340 0.0680 0.0000 0 0;10 20 0.0936 0.2090 0.0000 0 0;10 17 0.0324 0.0845 0.0000 0 0;10 21 0.0348 0.0749 0.0000 0 0;10 22 0.0727 0.1499 0.0000 0 0;21 22 0.0116 0.0236 0.0000 0 0;15 23 0.1000 0.2020 0.0000 0 0;22 24 0.1150 0.1790 0.0000 0 0;23 24 0.1320 0.2700 0.0000 0 0;24 25 0.1885 0.3292 0.0000 0 0;25 26 0.2544 0.3800 0.0000 0 0;25 27 0.1093 0.2087 0.0000 0 0;28 27 0.0000 0.3960 0.0000 0.968 0;27 29 0.2198 0.4153 0.0000 0 0;27 30 0.3202 0.6027 0.0000 0 0;29 30 0.2399 0.4533 0.0000 0 0;8 28 0.0636 0.2000 0.0428 0 0;6 28 0.0169 0.0599 0.0130 0 0;
];% STATCOM配置 (安装在节点10)
statcom_node = 10; % STATCOM安装节点
Q_sh_min = -50; % STATCOM最小无功输出 (MVAr)
Q_sh_max = 50; % STATCOM最大无功输出 (MVAr)%% PSO算法参数设置
nVar = 6 + 1 + 30; % 变量数量: 6台发电机有功 + 1个STATCOM无功 + 30个节点电压幅值% 简化处理:只优化发电机有功和STATCOM无功,节点电压作为约束处理% 变量边界 [PG1, PG2, PG5, PG8, PG11, PG13, Q_sh, V2, V3, ..., V30]
lb = [gen_data(:,5); Q_sh_min; ones(29,1)*0.95]; % 下限 (节点1电压固定)
ub = [gen_data(:,4); Q_sh_max; ones(29,1)*1.05]; % 上限 (节点1电压固定)% PSO参数
SwarmSize = 50; % 粒子群规模
MaxIter = 100; % 最大迭代次数
w = 0.8; % 惯性权重
wdamp = 0.99; % 惯性权重衰减率
c1 = 2.0; % 个体学习因子
c2 = 2.0; % 社会学习因子%% 初始化粒子群
particles = zeros(SwarmSize, nVar);
velocities = zeros(SwarmSize, nVar);
personal_best = zeros(SwarmSize, nVar);
personal_best_cost = inf(SwarmSize, 1);
global_best = zeros(1, nVar);
global_best_cost = inf;% 随机初始化粒子位置和速度
for i = 1:SwarmSizeparticles(i, :) = lb + (ub - lb).*rand(1, nVar);velocities(i, :) = -0.1*(ub-lb) + 0.2*(ub-lb).*rand(1, nVar);personal_best(i, :) = particles(i, :);
end%% PSO主循环
cost_history = zeros(MaxIter, 1);for iter = 1:MaxIterfor i = 1:SwarmSize% 计算当前粒子的目标函数值cost = objective_function(particles(i, :), bus_data, gen_data, branch_data, statcom_node);% 更新个体最优if cost < personal_best_cost(i)personal_best_cost(i) = cost;personal_best(i, :) = particles(i, :);end% 更新全局最优if cost < global_best_costglobal_best_cost = cost;global_best = particles(i, :);endend% 更新速度和位置for i = 1:SwarmSizevelocities(i, :) = w*velocities(i, :) + ...c1*rand(1,nVar).*(personal_best(i,:) - particles(i,:)) + ...c2*rand(1,nVar).*(global_best - particles(i,:));particles(i, :) = particles(i, :) + velocities(i, :);% 应用边界约束particles(i, :) = max(particles(i, :), lb);particles(i, :) = min(particles(i, :), ub);end% 记录当前最优成本cost_history(iter) = global_best_cost;% 显示迭代信息fprintf('Iteration %d: Best Cost = %.4f\n', iter, global_best_cost);% 更新惯性权重w = w * wdamp;
end%% 显示优化结果
fprintf('\nOptimization Completed!\n');
fprintf('Minimum Cost: %.4f\n', global_best_cost);% 解析最优解
Pg_opt = global_best(1:6); % 发电机有功出力
Q_sh_opt = global_best(7); % STATCOM无功输出
V_opt = global_best(8:end); % 节点电压幅值% 显示发电机出力
fprintf('\nGenerator Outputs:\n');
for i = 1:size(gen_data, 1)fprintf('Gen %d (Node %d): P = %.2f MW, Q = %.2f MVAr\n', ...i, gen_data(i,1), Pg_opt(i), 0); % Q由潮流计算确定
end% 显示STATCOM输出
fprintf('\nSTATCOM at Node %d: Q = %.2f MVAr\n', statcom_node, Q_sh_opt);% 显示节点电压
fprintf('\nBus Voltages:\n');
for i = 1:size(bus_data, 1)if i == 1fprintf('Bus %d: V = %.4f p.u. (Slack)\n', i, bus_data(i,5));elsefprintf('Bus %d: V = %.4f p.u.\n', i, V_opt(i-1)); % 跳过平衡节点end
end%% 绘制收敛曲线
figure;
plot(1:MaxIter, cost_history, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
title('PSO Convergence Curve');
grid on;%% 目标函数定义
function total_cost = objective_function(x, bus_data, gen_data, branch_data, statcom_node)% 解析决策变量n_gen = size(gen_data, 1);Pg = x(1:n_gen); % 发电机有功出力Q_sh = x(n_gen+1); % STATCOM无功输出V = x(n_gen+2:end); % 节点电压幅值 (不包括平衡节点)% 构建节点电压向量 (平衡节点电压固定)V_full = zeros(size(bus_data, 1), 1);V_full(1) = bus_data(1, 5); % 平衡节点电压V_full(2:end) = V; % 其他节点电压% 构建发电机无功出力向量 (初始设为0,由潮流计算确定)Qg = zeros(n_gen, 1);% 运行潮流计算 (简化版,实际需要完整潮流计算)[Ploss, cost_pg, voltages] = run_power_flow(bus_data, gen_data, branch_data, Pg, Qg, Q_sh, statcom_node, V_full);% 发电成本函数 (二次函数)cost_pg_total = 0;for i = 1:n_gena = gen_data(i, 8);b = gen_data(i, 9);c = gen_data(i, 10);cost_pg_total = cost_pg_total + a*Pg(i)^2 + b*Pg(i) + c;end% 网络损耗成本 (简化为网损乘以惩罚系数)lambda_loss = 100; % 网损惩罚系数 ($/MWh)cost_loss = lambda_loss * Ploss;% 总成本total_cost = cost_pg_total + cost_loss;
end%% 潮流计算函数 (简化版)
function [Ploss, cost_pg, voltages] = run_power_flow(bus_data, gen_data, branch_data, Pg, Qg, Q_sh, statcom_node, V_guess)% 这是一个简化的潮流计算函数% 实际应用中应使用牛顿-拉夫逊法或快速解耦法% 初始化n_bus = size(bus_data, 1);P_load = bus_data(:, 3); % 有功负荷Q_load = bus_data(:, 4); % 无功负荷V = V_guess; % 电压幅值theta = zeros(n_bus, 1); % 电压相角 (平衡节点为0)% 添加STATCOM无功注入Q_load(statcom_node) = Q_load(statcom_node) - Q_sh;% 简化潮流计算 (实际应使用迭代方法)% 这里假设潮流已收敛,仅用于演示Ploss = 0.05 * sum(P_load); % 估算网损 (实际应计算)voltages = V; % 返回电压% 发电机成本 (此处仅为占位符)cost_pg = 0;
end%% 约束处理函数 (罚函数法)
function penalty = constraint_violation(x, bus_data, gen_data, branch_data, statcom_node)% 解析变量n_gen = size(gen_data, 1);Pg = x(1:n_gen);Q_sh = x(n_gen+1);V = x(n_gen+2:end);penalty = 0;% 发电机出力约束for i = 1:n_genif Pg(i) < gen_data(i, 5) || Pg(i) > gen_data(i, 4)penalty = penalty + 1e6 * abs(Pg(i) - clamp(Pg(i), gen_data(i,5), gen_data(i,4)));endend% STATCOM无功约束if Q_sh < -50 || Q_sh > 50penalty = penalty + 1e6 * abs(Q_sh - clamp(Q_sh, -50, 50));end% 电压约束for i = 1:length(V)if V(i) < 0.95 || V(i) > 1.05penalty = penalty + 1e6 * abs(V(i) - clamp(V(i), 0.95, 1.05));endend
endfunction y = clamp(x, low, high)y = max(low, min(x, high));
end
代码说明:
-
系统建模:
- 完整的IEEE 30节点系统数据(节点、发电机、支路)
- STATCOM安装在节点10,无功输出范围[-50, 50] MVAr
-
优化变量:
- 6台发电机有功出力(PG1-PG13)
- STATCOM无功输出(Q_sh)
- 29个节点电压幅值(节点1为平衡节点,电压固定)
-
目标函数:
- 发电成本:二次函数 ∑(aᵢPᵢ² + bᵢPᵢ + cᵢ)
- 网络损耗:估算为总负荷的5%
- 总成本 = 发电成本 + λ×网损(λ=100)
-
PSO算法:
- 粒子群规模:50
- 最大迭代次数:100
- 惯性权重:0.8(衰减率0.99)
- 学习因子:c1=c2=2.0
-
约束处理:
- 发电机出力上下限
- STATCOM无功限制
- 节点电压范围[0.95, 1.05] p.u.
- 使用罚函数法处理约束违反
-
结果输出:
- 优化后的发电机有功出力
- STATCOM无功输出
- 节点电压分布
- 收敛曲线
关键功能模块:
-
目标函数计算:
function total_cost = objective_function(x, ...)% 解析变量% 调用潮流计算% 计算发电成本% 计算网损成本% 返回总成本 end -
潮流计算简化版:
function [Ploss, cost_pg, voltages] = run_power_flow(...)% 简化潮流计算(实际应用应使用牛顿-拉夫逊法)% 添加STATCOM无功注入% 估算网损 end -
约束处理:
function penalty = constraint_violation(...)% 检查所有约束% 计算罚函数值 end
参考代码 带STATCOM的ieee30节点系统的最优潮流 www.youwenfan.com/contentcnu/100948.html
使用说明:
-
此代码为简化实现,实际应用时需要:
- 完善潮流计算函数(使用牛顿-拉夫逊法)
- 增加更多约束(线路潮流、发电机无功等)
- 添加详细的网络损耗计算
-
运行结果将显示:
- 优化后的发电机有功出力
- STATCOM无功输出
- 节点电压分布
- 收敛曲线
-
扩展建议:
- 添加多目标优化(如同时考虑成本和电压稳定性)
- 实现完整的AC潮流计算
- 增加其他FACTS设备(如SVC、TCSC)
- 使用更高级的优化算法(如MOPSO、NSGA-II)
