基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现

基于粒子群优化(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

代码说明:

  1. 系统建模

    • 完整的IEEE 30节点系统数据(节点、发电机、支路)
    • STATCOM安装在节点10,无功输出范围[-50, 50] MVAr
  2. 优化变量

    • 6台发电机有功出力(PG1-PG13)
    • STATCOM无功输出(Q_sh)
    • 29个节点电压幅值(节点1为平衡节点,电压固定)
  3. 目标函数

    • 发电成本:二次函数 ∑(aᵢPᵢ² + bᵢPᵢ + cᵢ)
    • 网络损耗:估算为总负荷的5%
    • 总成本 = 发电成本 + λ×网损(λ=100)
  4. PSO算法

    • 粒子群规模:50
    • 最大迭代次数:100
    • 惯性权重:0.8(衰减率0.99)
    • 学习因子:c1=c2=2.0
  5. 约束处理

    • 发电机出力上下限
    • STATCOM无功限制
    • 节点电压范围[0.95, 1.05] p.u.
    • 使用罚函数法处理约束违反
  6. 结果输出

    • 优化后的发电机有功出力
    • STATCOM无功输出
    • 节点电压分布
    • 收敛曲线

关键功能模块:

  1. 目标函数计算

    matlab 复制代码
    function total_cost = objective_function(x, ...)
      % 解析变量
      % 调用潮流计算
      % 计算发电成本
      % 计算网损成本
      % 返回总成本
    end
  2. 潮流计算简化版

    matlab 复制代码
    function [Ploss, cost_pg, voltages] = run_power_flow(...)
      % 简化潮流计算(实际应用应使用牛顿-拉夫逊法)
      % 添加STATCOM无功注入
      % 估算网损
    end
  3. 约束处理

    matlab 复制代码
    function penalty = constraint_violation(...)
      % 检查所有约束
      % 计算罚函数值
    end

参考代码 带STATCOM的ieee30节点系统的最优潮流 www.youwenfan.com/contentcsu/100948.html

使用说明:

  1. 此代码为简化实现,实际应用时需要:

    • 完善潮流计算函数(使用牛顿-拉夫逊法)
    • 增加更多约束(线路潮流、发电机无功等)
    • 添加详细的网络损耗计算
  2. 运行结果将显示:

    • 优化后的发电机有功出力
    • STATCOM无功输出
    • 节点电压分布
    • 收敛曲线
  3. 扩展建议:

    • 添加多目标优化(如同时考虑成本和电压稳定性)
    • 实现完整的AC潮流计算
    • 增加其他FACTS设备(如SVC、TCSC)
    • 使用更高级的优化算法(如MOPSO、NSGA-II)
相关推荐
Stream_Silver2 小时前
【JNA实战:Java无缝调用Windows API模拟键盘输入】
java·开发语言·windows
hele_two2 小时前
SDL2高效画实心圆的算法(一)
c++·算法·图形渲染
cheems95272 小时前
[算法手记] 动态规划,二叉树计数问题
算法·动态规划
焦糖玛奇朵婷2 小时前
回收小程序开发案例分享
java·开发语言
yuanpan2 小时前
Python 网页数据爬取入门教程:requests + BeautifulSoup 从解析到保存
开发语言·python·beautifulsoup
贫民窟的勇敢爷们2 小时前
Scikit-learn算法:从入门到精通的机器学习工具箱
算法·机器学习·scikit-learn
Liangwei Lin3 小时前
LeetCode 155. 最小栈
java·javascript·算法
lbb 小魔仙3 小时前
基于Python构建RAG(检索增强生成)系统:从原理到企业级实战
开发语言·python
~|Bernard|3 小时前
二.go语言中map的底层原理(2026-5-8)
算法·golang·哈希算法