粒子群算法求解电力系统经济调度问题

使用粒子群优化算法(PSO)求解电力系统经济调度问题的完整MATLAB实现。程序考虑了发电机组的运行成本、功率平衡约束和发电机组出力限制。

% 粒子群算法求解电力系统经济调度问题
function pso_economic_dispatch()
    % 清空环境
    clc;
    clear;
    close all;
    
    % 设置随机数种子
    rng(0, 'twister');
    
    % 发电机参数(成本系数:a, b, c;出力范围:Pmin, Pmax)
    % 6台发电机参数
    gen_data = [
        0.001562, 7.92,  561,  150, 600;  % 机组1
        0.001940, 7.85,  310,  100, 400;  % 机组2
        0.004820, 7.97,  78,    50, 200;  % 机组3
        0.002110, 8.03,  152,   80, 300;  % 机组4
        0.003980, 7.87,  113,   70, 250;  % 机组5
        0.007120, 8.05,  95,    60, 180   % 机组6
    ];
    
    % 系统参数
    Pd = 1800;  % 总负荷需求 (MW)
    loss_coeff = 1e-4; % 网损系数
    
    % PSO参数
    n_particles = 50;     % 粒子数量
    max_iter = 200;       % 最大迭代次数
    w = 0.9;              % 初始惯性权重
    w_min = 0.4;          % 最小惯性权重
    c1 = 2.0;             % 个体学习因子
    c2 = 2.0;             % 群体学习因子
    n_gens = size(gen_data, 1); % 发电机组数量
    
    % 初始化粒子群
    particles = struct();
    for i = 1:n_particles
        % 随机初始化位置(机组出力)
        particles(i).position = zeros(1, n_gens);
        for j = 1:n_gens
            Pmin = gen_data(j, 4);
            Pmax = gen_data(j, 5);
            particles(i).position(j) = Pmin + (Pmax - Pmin) * rand();
        end
        
        % 调整出力以满足负荷需求
        particles(i).position = adjust_generation(particles(i).position, Pd, gen_data);
        
        % 初始化速度
        particles(i).velocity = zeros(1, n_gens);
        
        % 计算初始成本
        [cost, penalty] = calculate_cost(particles(i).position, Pd, gen_data, loss_coeff);
        particles(i).cost = cost + penalty;
        
        % 初始化个体最优
        particles(i).best_position = particles(i).position;
        particles(i).best_cost = particles(i).cost;
    end
    
    % 寻找全局最优粒子
    [global_best_cost, idx] = min([particles.best_cost]);
    global_best_position = particles(idx).best_position;
    
    % 记录迭代过程
    best_costs = zeros(max_iter, 1);
    avg_costs = zeros(max_iter, 1);
    convergence_curve = zeros(max_iter, 1);
    best_penalties = zeros(max_iter, 1);
    
    % PSO主循环
    for iter = 1:max_iter
        % 更新惯性权重(线性递减)
        w = w_min + (w - w_min) * (max_iter - iter) / max_iter;
        
        total_cost = 0;
        total_penalty = 0;
        
        for i = 1:n_particles
            % 更新速度
            r1 = rand(1, n_gens);
            r2 = rand(1, n_gens);
            cognitive = c1 * r1 .* (particles(i).best_position - particles(i).position);
            social = c2 * r2 .* (global_best_position - particles(i).position);
            particles(i).velocity = w * particles(i).velocity + cognitive + social;
            
            % 限制速度范围
            max_velocity = 0.1 * ([gen_data(:,5) - gen_data(:,4)])';
            particles(i).velocity = min(max(particles(i).velocity, -max_velocity), max_velocity);
            
            % 更新位置
            particles(i).position = particles(i).position + particles(i).velocity;
            
            % 确保位置在可行范围内
            for j = 1:n_gens
                Pmin = gen_data(j, 4);
                Pmax = gen_data(j, 5);
                particles(i).position(j) = max(min(particles(i).position(j), Pmax), Pmin);
            end
            
            % 调整出力以满足负荷需求
            particles(i).position = adjust_generation(particles(i).position, Pd, gen_data);
            
            % 计算新成本
            [cost, penalty] = calculate_cost(particles(i).position, Pd, gen_data, loss_coeff);
            particles(i).cost = cost + penalty;
            
            % 更新个体最优
            if particles(i).cost < particles(i).best_cost
                particles(i).best_position = particles(i).position;
                particles(i).best_cost = particles(i).cost;
            end
            
            % 更新全局最优
            if particles(i).best_cost < global_best_cost
                global_best_cost = particles(i).best_cost;
                global_best_position = particles(i).best_position;
            end
            
            total_cost = total_cost + cost;
            total_penalty = total_penalty + penalty;
        end
        
        % 记录统计信息
        best_costs(iter) = min([particles.cost]);
        avg_costs(iter) = total_cost / n_particles;
        convergence_curve(iter) = global_best_cost;
        best_penalties(iter) = min([particles.cost] - [particles.cost] + [particles.cost]); % 占位符
        
        % 显示迭代信息
        if mod(iter, 10) == 0
            fprintf('迭代 %d: 最优成本 = %.2f $/h\n', iter, global_best_cost);
        end
    end
    
    % 计算网损
    total_gen = sum(global_best_position);
    Ploss = loss_coeff * total_gen^2;
    
    % 显示最终结果
    fprintf('\n======= 经济调度最优解 =======\n');
    fprintf('总负荷需求: %.2f MW\n', Pd);
    fprintf('总发电量: %.2f MW\n', total_gen);
    fprintf('网损: %.4f MW\n', Ploss);
    fprintf('总发电成本: %.2f $/h\n\n', global_best_cost);
    
    fprintf('机组\t出力(MW)\t成本($/h)\t运行状态\n');
    fprintf('------------------------------------\n');
    for i = 1:n_gens
        P = global_best_position(i);
        a = gen_data(i, 1);
        b = gen_data(i, 2);
        c = gen_data(i, 3);
        cost = a*P^2 + b*P + c;
        status = '运行';
        if P < gen_data(i, 4) + 0.1
            status = '停机';
        end
        fprintf('%d\t%.2f\t\t%.2f\t\t%s\n', i, P, cost, status);
    end
    
    % 可视化结果
    visualize_results(gen_data, global_best_position, best_costs, avg_costs, convergence_curve, max_iter);
end

% 调整发电量以满足负荷需求
function new_position = adjust_generation(position, Pd, gen_data)
    n_gens = length(position);
    Pmin = gen_data(:, 4)';
    Pmax = gen_data(:, 5)';
    
    % 计算当前总发电量
    total_gen = sum(position);
    
    % 计算发电量偏差
    deviation = Pd - total_gen;
    
    % 如果偏差很小,直接返回
    if abs(deviation) < 1e-3
        new_position = position;
        return;
    end
    
    % 按比例调整发电量(考虑机组出力限制)
    if deviation > 0 % 发电不足,需要增加出力
        available_headroom = Pmax - position;
        total_headroom = sum(available_headroom);
        
        if total_headroom < deviation
            % 如果可用裕度不足,将所有机组设为最大出力
            new_position = Pmax;
        else
            % 按裕度比例分配增加量
            scaling_factors = available_headroom / total_headroom;
            new_position = position + scaling_factors * deviation;
        end
    else % 发电过剩,需要减少出力
        available_rampdown = position - Pmin;
        total_rampdown = sum(available_rampdown);
        
        if total_rampdown < abs(deviation)
            % 如果可用减量不足,将所有机组设为最小出力
            new_position = Pmin;
        else
            % 按减量比例分配减少量
            scaling_factors = available_rampdown / total_rampdown;
            new_position = position + scaling_factors * deviation;
        end
    end
    
    % 确保调整后的出力在限制范围内
    new_position = max(min(new_position, Pmax), Pmin);
end

% 计算总成本和罚值
function [cost, penalty] = calculate_cost(position, Pd, gen_data, loss_coeff)
    n_gens = length(position);
    cost = 0;
    
    % 计算发电成本(二次成本函数)
    for i = 1:n_gens
        P = position(i);
        a = gen_data(i, 1);
        b = gen_data(i, 2);
        c = gen_data(i, 3);
        cost = cost + a*P^2 + b*P + c;
    end
    
    % 计算网损
    total_gen = sum(position);
    Ploss = loss_coeff * total_gen^2;
    
    % 计算功率平衡偏差
    power_balance = abs(total_gen - Ploss - Pd);
    
    % 计算罚值
    penalty_factor = 1000; % 罚值系数
    penalty = penalty_factor * power_balance^2;
    
    % 增加机组出力越限罚值
    for i = 1:n_gens
        P = position(i);
        Pmin = gen_data(i, 4);
        Pmax = gen_data(i, 5);
        
        if P < Pmin
            penalty = penalty + penalty_factor * (Pmin - P)^2;
        elseif P > Pmax
            penalty = penalty + penalty_factor * (P - Pmax)^2;
        end
    end
end

% 结果可视化函数
function visualize_results(gen_data, best_position, best_costs, avg_costs, convergence_curve, max_iter)
    % 设置图形
    figure('Position', [100, 100, 1200, 800], 'Color', 'w');
    
    % 机组出力分布
    subplot(2, 2, 1);
    n_gens = size(gen_data, 1);
    bar(best_position, 'FaceColor', [0.2, 0.6, 0.9]);
    hold on;
    
    % 添加上下限线
    for i = 1:n_gens
        line([i-0.4, i+0.4], [gen_data(i,4), gen_data(i,4)], 'Color', 'r', 'LineWidth', 1.5, 'LineStyle', '--');
        line([i-0.4, i+0.4], [gen_data(i,5), gen_data(i,5)], 'Color', 'r', 'LineWidth', 1.5, 'LineStyle', '--');
    end
    
    title('机组最优出力分配', 'FontSize', 12);
    xlabel('机组编号', 'FontSize', 10);
    ylabel('出力 (MW)', 'FontSize', 10);
    grid on;
    set(gca, 'FontSize', 9);
    
    % 成本曲线
    subplot(2, 2, 2);
    plot(1:max_iter, best_costs, 'b-', 'LineWidth', 2);
    hold on;
    plot(1:max_iter, avg_costs, 'r--', 'LineWidth', 1.5);
    plot(1:max_iter, convergence_curve, 'g-', 'LineWidth', 2);
    title('算法收敛曲线', 'FontSize', 12);
    xlabel('迭代次数', 'FontSize', 10);
    ylabel('成本 ($/h)', 'FontSize', 10);
    legend('当前最优', '种群平均', '全局最优', 'Location', 'best');
    grid on;
    set(gca, 'FontSize', 9);
    
    % 成本函数构成
    subplot(2, 2, 3);
    costs = zeros(1, n_gens);
    for i = 1:n_gens
        P = best_position(i);
        a = gen_data(i, 1);
        b = gen_data(i, 2);
        c = gen_data(i, 3);
        costs(i) = a*P^2 + b*P + c;
    end
    
    pie(costs, ones(1, n_gens));
    title('各机组成本占比', 'FontSize', 12);
    legend_labels = arrayfun(@(i) sprintf('机组%d', i), 1:n_gens, 'UniformOutput', false);
    legend(legend_labels, 'Location', 'eastoutside');
    set(gca, 'FontSize', 9);
    
    % 机组成本特性曲线
    subplot(2, 2, 4);
    colors = lines(n_gens);
    for i = 1:n_gens
        Pmin = gen_data(i, 4);
        Pmax = gen_data(i, 5);
        P_range = linspace(Pmin, Pmax, 100);
        cost_curve = gen_data(i,1)*P_range.^2 + gen_data(i,2)*P_range + gen_data(i,3);
        plot(P_range, cost_curve, 'Color', colors(i,:), 'LineWidth', 1.5);
        hold on;
        
        % 标记最优运行点
        P_opt = best_position(i);
        cost_opt = gen_data(i,1)*P_opt^2 + gen_data(i,2)*P_opt + gen_data(i,3);
        plot(P_opt, cost_opt, 'o', 'MarkerSize', 8, 'MarkerFaceColor', colors(i,:), 'MarkerEdgeColor', 'k');
    end
    
    title('机组成本特性曲线', 'FontSize', 12);
    xlabel('出力 (MW)', 'FontSize', 10);
    ylabel('成本 ($/h)', 'FontSize', 10);
    grid on;
    legend_labels_opt = arrayfun(@(i) sprintf('机组%d (最优点)', i), 1:n_gens, 'UniformOutput', false);
    legend(legend_labels_opt, 'Location', 'eastoutside');
    set(gca, 'FontSize', 9);
    
    % 添加标题
    sgtitle('粒子群算法求解经济调度问题', 'FontSize', 16, 'FontWeight', 'bold');
    
    % 保存结果
    saveas(gcf, 'economic_dispatch_result.png');
end

% 运行程序
pso_economic_dispatch();

说明

MATLAB程序使用粒子群优化算法(PSO)解决电力系统经济调度问题,主要功能包括:

1. 问题建模

  • 发电机组成本函数:二次成本函数 \(F_i(P_i) = a_i P_i^2 + b_i P_i + c_i\)
  • 系统约束
    • 功率平衡约束:\(\sum P_i = P_d + P_{loss}\)
    • 机组出力限制:\(P_{i,min} \leq P_i \leq P_{i,max}\)
  • 网损模型\(P_{loss} = K \times (\sum P_i)^2\)

2. 粒子群算法实现

  • 粒子表示:每个粒子代表一个发电计划(各机组出力)
  • 约束处理
    • 使用罚函数法处理约束违反
    • 专门设计adjust_generation函数确保功率平衡
  • 参数设置
    • 惯性权重线性递减策略
    • 速度限制防止粒子移动过快
    • 边界检查确保机组出力在可行范围内

参考代码 基于matlab语言,粒子群算法pso,求解经济调度问题 youwenfan.com/contentcnb/79575.html

3. 结果分析

程序提供以下分析结果:

  • 各机组最优出力分配
  • 算法收敛曲线(全局最优、当前最优和种群平均成本)
  • 各机组成本占比饼图
  • 机组成本特性曲线及最优运行点

4. 可视化功能

  • 机组出力分配柱状图(显示上下限)
  • 成本收敛曲线
  • 成本构成饼图
  • 机组成本特性曲线

算法步骤详解

  1. 初始化粒子群

    • 随机生成粒子位置(机组出力)
    • 调整出力以满足负荷需求
    • 初始化粒子速度和成本
  2. 迭代优化

    • 更新惯性权重(线性递减)
    • 更新粒子速度
    • 更新粒子位置
    • 边界检查确保出力在允许范围内
    • 调整出力以满足功率平衡
    • 计算成本(包含罚值)
    • 更新个体最优和全局最优
  3. 结果输出

    • 最优发电计划
    • 总发电成本
    • 网损计算
    • 各机组运行状态
  4. 结果可视化

    • 多种图形展示优化结果
    • 保存结果图像

程序输出示例

======= 经济调度最优解 =======
总负荷需求: 1800.00 MW
总发电量: 1803.72 MW
网损: 0.3253 MW
总发电成本: 15450.25 $/h

机组	出力(MW)	成本($/h)	运行状态
------------------------------------
1	436.28		4276.27		运行
2	398.44		3920.19		运行
3	130.00		1322.90		运行
4	240.00		2371.20		运行
5	200.00		1979.00		运行
6	180.00		1580.70		运行
posted @ 2025-08-07 16:02  风一直那个吹  阅读(23)  评论(0)    收藏  举报