基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现。该代码实现了含STATCOM的无功补偿优化,以最小化发电成本和网络损耗为目标。
matlab
% 带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:SwarmSize
particles(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:MaxIter
for 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_cost
global_best_cost = cost;
global_best = particles(i, :);
end
end
% 更新速度和位置
for i = 1:SwarmSize
velocities(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 == 1
fprintf('Bus %d: V = %.4f p.u. (Slack)\n', i, bus_data(i,5));
else
fprintf('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_gen
a = 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_gen
if 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)));
end
end
% STATCOM无功约束
if Q_sh < -50 || Q_sh > 50
penalty = penalty + 1e6 * abs(Q_sh - clamp(Q_sh, -50, 50));
end
% 电压约束
for i = 1:length(V)
if V(i) < 0.95 || V(i) > 1.05
penalty = penalty + 1e6 * abs(V(i) - clamp(V(i), 0.95, 1.05));
end
end
end
function 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无功输出
- 节点电压分布
- 收敛曲线
关键功能模块:
-
目标函数计算:
matlabfunction total_cost = objective_function(x, ...) % 解析变量 % 调用潮流计算 % 计算发电成本 % 计算网损成本 % 返回总成本 end -
潮流计算简化版:
matlabfunction [Ploss, cost_pg, voltages] = run_power_flow(...) % 简化潮流计算(实际应用应使用牛顿-拉夫逊法) % 添加STATCOM无功注入 % 估算网损 end -
约束处理:
matlabfunction penalty = constraint_violation(...) % 检查所有约束 % 计算罚函数值 end
参考代码 带STATCOM的ieee30节点系统的最优潮流 www.youwenfan.com/contentcsu/100948.html
使用说明:
-
此代码为简化实现,实际应用时需要:
- 完善潮流计算函数(使用牛顿-拉夫逊法)
- 增加更多约束(线路潮流、发电机无功等)
- 添加详细的网络损耗计算
-
运行结果将显示:
- 优化后的发电机有功出力
- STATCOM无功输出
- 节点电压分布
- 收敛曲线
-
扩展建议:
- 添加多目标优化(如同时考虑成本和电压稳定性)
- 实现完整的AC潮流计算
- 增加其他FACTS设备(如SVC、TCSC)
- 使用更高级的优化算法(如MOPSO、NSGA-II)