粒子群算法优化PID参数实例

25 篇文章 0 订阅
%% 清空环境
clear all
clc
tic; %记录算法运行时间
%% 参数设置
%标准PSO算法
 w = 0.6;      % 惯性因子 
 c1 = 2;       % 加速常数
 c2 = 2;       % 加速常数

%%经验值
% w = 0.7298;      % 惯性因子 
% c1 = 1.49618;       % 加速常数
% c2 = 1.49618;       % 加速常数

%%随机权重策略
% mean_max = 0.8;  %随机权重均值最大值
% mean_min = 0.5;  %随机权重均值最小值
% sigma = 0.2;          %方差

%以下参数值都可以改

Dim = 3;            % 维数
SwarmSize = 30;    % 粒子群规模
ObjFun = @PSO_PID;  % 待优化函数句柄,来自于PSO_PID.m

MaxIter = 10;      % 最大迭代次数  
MinFit = 0.1;       % 最小适应值 

Vmax = 1;
Vmin = -1;
% Ub = [300 300 300];  %变量上限
 Ub = [40 1 40];
Lb = [0 0 0];        %变量下限

%% 粒子群初始化
    Range = ones(SwarmSize,1)*(Ub-Lb);
    Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb      % 初始化粒子群
    VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin                 % 初始化速度
    fSwarm = zeros(SwarmSize,1);
for i=1:SwarmSize
    fSwarm(i,:) = feval(ObjFun,Swarm(i,:));                         % 粒子群的适应值
end

%% 个体极值和群体极值
[bestf, bestindex]=min(fSwarm);
zbest=Swarm(bestindex,:);   % 全局最佳
gbest=Swarm;                % 个体最佳
fgbest=fSwarm;              % 个体最佳适应值
fzbest=bestf;               % 全局最佳适应值

%% 迭代寻优
iter = 0;
y_fitness = zeros(1,MaxIter);   % 预先产生4个空矩阵
K_p = zeros(1,MaxIter);         
K_i = zeros(1,MaxIter);
K_d = zeros(1,MaxIter);
while( (iter < MaxIter) && (fzbest > MinFit) )
    for j=1:SwarmSize
%         miu = mean_min+(mean_max-mean_min)*rand;
%         w = miu +sigma*randn();
        
        % 速度更新
        VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:) - Swarm(j,:)) + c2*rand*(zbest - Swarm(j,:));
        if VStep(j,:)>Vmax, VStep(j,:)=Vmax; end
        if VStep(j,:)<Vmin, VStep(j,:)=Vmin; end
        % 位置更新
        Swarm(j,:)=Swarm(j,:)+VStep(j,:);
        for k=1:Dim
            if Swarm(j,k)>Ub(k), Swarm(j,k)=Ub(k); end
            if Swarm(j,k)<Lb(k), Swarm(j,k)=Lb(k); end
        end
        % 适应值
        fSwarm(j,:) = feval(ObjFun,Swarm(j,:));
        % 个体最优更新     
        if fSwarm(j) < fgbest(j)
            gbest(j,:) = Swarm(j,:);
            fgbest(j) = fSwarm(j);
        end
        % 群体最优更新
        if fSwarm(j) < fzbest
            zbest = Swarm(j,:);
            fzbest = fSwarm(j);
        end
    end 
    iter = iter+1;                      % 迭代次数更新
    y_fitness(1,iter) = fzbest;         % 为绘图做准备
    K_p(1,iter) = zbest(1);
    K_i(1,iter) = zbest(2);
    K_d(1,iter) = zbest(3);
end

elapsed_time=toc % time taken for this algorithm

%% 绘图输出
figure(1)      % 绘制性能指标ITAE的变化曲线
plot(y_fitness,'LineWidth',2)
title('ITAE fitness curve','fontsize',12);
xlabel('No of Iteration','fontsize',12);ylabel('value of fitness','fontsize',12);
set(gca,'Fontsize',12);
%下面代码读取当前电脑时间命名并自动figure(1)保存为.fig格式,在当前文件位置
h1=figure(1);
fn1=['ITAE by PSO-',datestr(clock,'yy-mm-dd-HH-MM-SS'),'.fig'];
saveas(h1,fn1);


%下面图2是Kp Ki Kd的值变化过程,可以不画不保存
figure(2)      % 绘制PID控制器参数变化曲线
plot(K_p);
hold on
plot(K_i,'k','LineWidth',3);
plot(K_d,'--r');
title('Kp、Ki、Kd','fontsize',12);
xlabel('No of Iteration','fontsize',12);
ylabel('value of KpKiKd','fontsize',12);
set(gca,'Fontsize',12);
legend('Kp','Ki','Kd');
%下面代码读取当前电脑时间命名并自动figure(2)保存为.fig格式,在当前文件位置
h2=gcf;
fn2=['Kpid by PSO-',datestr(clock,'yy-mm-dd-HH-MM-SS'),'.fig'];
saveas(h2,fn2);

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值