
PSO(粒子群算法)在處理連續(xù)問題上有著較強的能力,因此很適合用來做參數(shù)優(yōu)化,而PID控制器由三個參數(shù)組成,它們分別是:Kp 、Ki 、Kd 。
我們可以把PID控制器當做一個“黑箱”,輸入為這三個參數(shù),輸出為響應(yīng)曲線,我們要做的就是優(yōu)化這個響應(yīng)曲線。而一個控制效果好的PID控制器應(yīng)針對不同類型輸入都有較快的響應(yīng)速度,較小的超調(diào)以及穩(wěn)態(tài)誤差。在本次分享中,選擇輸入信號為階躍輸入用來衡量PID控制效果。
PSO的適應(yīng)函數(shù)選用綜合指標來衡量設(shè)計效果,由于是數(shù)字控制器,我們選用求和而不是積分的方式:

在特定的問題中,這個適應(yīng)函數(shù)也可以按照實際需求修改,比如分析超調(diào)量、穩(wěn)定時間等,具體問題具體分析
PSO的主函數(shù)和之前的案例類似
參數(shù)設(shè)置
wmax = 1;     % 最大慣性因子 
wmin = 0.6;   % 最小慣性因子 
% w = 0.6;      % 慣性因子 
c1 = 2;       % 加速常數(shù)
c2 = 2;       % 加速常數(shù)
Dim = 3;            % 維數(shù)
SwarmSize = 30;    % 粒子群規(guī)模
ObjFun = @PSO_PID;  % 待優(yōu)化函數(shù)句柄
MaxIter = 10;      % 最大迭代次數(shù)  
MinFit = 0.1;       % 最小適應(yīng)值 
Vmax = 1;
Vmin = -1;
Ub = [300 300 300];
Lb = [0 0 0];
其中的Ub和Lb分別是kp ki kd的上下限,開始優(yōu)化的時候可以設(shè)置大一點,如果大概知道范圍,也可以縮小范圍,減少迭代次數(shù)
粒子群初始化
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,:) = PSO_PID(Swarm(i,:));                         % 粒子群的適應(yīng)值
end
%% 個體極值和群體極值
[bestf,bestindex]=min(fSwarm);
zbest=Swarm(bestindex,:);   % 全局最佳
gbest=Swarm;                % 個體最佳
fgbest=fSwarm;              % 個體最佳適應(yīng)值
fzbest=bestf;               % 全局最佳適應(yīng)值
迭代尋優(yōu)
iter = 0;
y_fitness = zeros(1,MaxIter);   % 預(yù)先產(chǎn)生4個空矩陣
K_p = zeros(1,MaxIter);         
K_i = zeros(1,MaxIter);
K_d = zeros(1,MaxIter);
while( (iter < MaxIter) && (fzbest > MinFit) )
    w = wmax-(wmax-wmin)/MaxIter*iter;  %% 慣性權(quán)重因子調(diào)整
    for j=1:SwarmSize
        % 速度更新
        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
        % 適應(yīng)值
        fSwarm(j,:) = PSO_PID(Swarm(i,:));
        % 個體最優(yōu)更新     
        if fSwarm(j) < fgbest(j)
            gbest(j,:) = Swarm(j,:);
            fgbest(j) = fSwarm(j);
        end
        % 群體最優(yōu)更新
        if fSwarm(j) < fzbest
            zbest = Swarm(j,:);
            fzbest = fSwarm(j);
        end
    end 
    iter = iter+1;                      % 迭代次數(shù)更新
    y_fitness(1,iter) = fzbest;         % 為繪圖做準備
    K_p(1,iter) = zbest(1);
    K_i(1,iter) = zbest(2);
    K_d(1,iter) = zbest(3);
end
繪圖輸出
figure     % 繪制性能指標ITAE的變化曲線
plot(y_fitness,'LineWidth',2)
title('最優(yōu)個體適應(yīng)值','fontsize',18);
xlabel('迭代次數(shù)','fontsize',18);ylabel('適應(yīng)值','fontsize',18);
set(gca,'Fontsize',18);
figure      % 繪制PID控制器參數(shù)變化曲線
plot(K_p)
hold on
plot(K_i,'k','LineWidth',3)
plot(K_d,'--r')
title('Kp、Ki、Kd 優(yōu)化曲線','fontsize',18);
xlabel('迭代次數(shù)','fontsize',18);ylabel('參數(shù)值','fontsize',18);
set(gca,'Fontsize',18);
legend('Kp','Ki','Kd');
目標函數(shù)設(shè)計
function z=PSO_PID(x)
assignin('base','Kp',x(1));    %粒子依次賦值給Kp
assignin('base','Ki',x(2));    %粒子依次賦值給Ki
assignin('base','Kd',x(3));    %粒子依次賦值給Kd
try  %% simulink仿真異常,返回一個極大值
    y_out=sim('PID_Model',[0,20]);    %使用命令行運行控制系統(tǒng)模型
    z = y_out.yout{1}.Values.Data(end);
catch
    z=1e6;
end
代碼中assignin實現(xiàn)了m文件和simulink傳遞參數(shù),其中y_out是simulink輸出的目標變量,為啥這兒需要一個try呢,因為這個優(yōu)化的過程中,可能參數(shù)設(shè)置不合理,會拋出simulink報錯,故增加一個try避免代碼異常出錯提前結(jié)束優(yōu)化過程
simulink模型用一個簡單的pid控制帶時延的傳遞函數(shù)

仿真結(jié)果類似這樣,因為迭代次數(shù)很少,設(shè)計中可以加大,得到更優(yōu)的結(jié)果

- 
                                MATLAB仿真
                                +關(guān)注
關(guān)注
4文章
176瀏覽量
20733 - 
                                PID控制器
                                +關(guān)注
關(guān)注
2文章
173瀏覽量
19549 - 
                                粒子群算法
                                +關(guān)注
關(guān)注
0文章
63瀏覽量
13347 - 
                                數(shù)字控制器
                                +關(guān)注
關(guān)注
0文章
103瀏覽量
20022 - 
                                simulink仿真
                                +關(guān)注
關(guān)注
0文章
75瀏覽量
8929 
發(fā)布評論請先 登錄
永磁同步直線電機的粒子群PID空間矢量控制
改進粒子群算法的永磁同步電機PID控制器
PSO算法在數(shù)控機床交流伺服系統(tǒng)PID參數(shù)優(yōu)化中的應(yīng)用
粒子群算法城鎮(zhèn)能源優(yōu)化調(diào)度問題
什么是粒子群算法?
【Simulink】粒子群算法(PSO)整定PID參數(shù)(附代碼和講解)精選資料分享
基于模擬退火結(jié)合粒子群算法介紹
基于模擬退火結(jié)合粒子群算法分析
基于模擬退火結(jié)合粒子群算法相關(guān)資料分享
PID控制器的量子粒子群多目標優(yōu)化設(shè)計
基于新粒子群算法優(yōu)化向量機參數(shù)
基于粒子群優(yōu)化的模糊PID控制器研究
    
如何使用免疫粒子群優(yōu)化算法實現(xiàn)增量式的PID控制
    
基于免疫粒子群優(yōu)化算法的增量式PID控制
    
          
        
        
matlab-粒子群算法優(yōu)化simulink中的pid參數(shù)詳解
                
 
           
            
            
                
            
評論