|
7-PSO_PID--粒子群算法的PID参数整定(微分抗饱和调节)
百度网盘链接:https://pan.baidu.com/s/1LfRMuEDkmz9mKrNP3eZBsw 提取码:8mi4
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
程序如下:
- %% 清空环境
- clc,clear,close all
- warning off
- format longG
- addpath(genpath('./PID_funtion'))
- % addpath(genpath('./test_function'))
- %% 参数设置
- w = 0.6; % 惯性因子
- c1 = 2; % 加速常数
- c2 = 2; % 加速常数
- Dim = 3; % 维数
- sizepop = 50; % 粒子群规模
- maxiter = 50; % 最大迭代次数
- MinFit = 0.1; % 最小适应值
- Vmax = 1;
- Vmin = -1;
- Ub = [500 500 500];
- Lb = [0 0 0];
- %% 适应度函数
- choosed = 2;
- if choosed==1
- fun = @(x)PID_Fun_1(x);
- elseif(choosed==2)
- fun = @(x)PID_Fun_2(x);
- elseif(choosed==3)
- fun = @(x)PID_Fun_3(x);
- elseif(choosed==4)
- fun = @(x)PID_Fun_4(x);
- end
- %% 粒子群初始化
- Range = ones(sizepop,1)*(Ub-Lb);
- pop = rand(sizepop,Dim).*Range + ones(sizepop,1)*Lb; % 初始化粒子群
- V = rand(sizepop,Dim)*(Vmax-Vmin) + Vmin; % 初始化速度
- fitness = zeros(sizepop,1);
- for i=1:sizepop
- fitness(i,:) = fun(pop(i,:)); % 粒子群的适应值
- end
- %% 个体极值和群体极值
- [bestf, bestindex]=min(fitness);
- zbest=pop(bestindex,:); % 全局最佳
- gbest=pop; % 个体最佳
- fitnessgbest=fitness; % 个体最佳适应值
- fitnesszbest=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 ) && (fitnesszbest > MinFit) )
- for j=1:sizepop
- % 速度更新
- V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
- if V(j,:)>Vmax,
- V(j,:)=Vmax;
- end
- if V(j,:)<Vmin,
- V(j,:)=Vmin;
- end
- % 位置更新
- pop(j,:)=pop(j,:)+V(j,:);
- for k=1:Dim
- if pop(j,k)>Ub(k),
- pop(j,k)=Ub(k);
- end
- if pop(j,k)<Lb(k),
- pop(j,k)=Lb(k);
- end
- end
- % 适应值
- fitness(j,:) =fun(pop(j,:));
- % 个体最优更新
- if fitness(j) < fitnessgbest(j)
- gbest(j,:) = pop(j,:);
- fitnessgbest(j) = fitness(j);
- end
- % 群体最优更新
- if fitness(j) < fitnesszbest
- zbest = pop(j,:);
- fitnesszbest = fitness(j);
- end
- end
- iter = iter+1; % 迭代次数更新
- y_fitness(1,iter) = fitnesszbest; % 为绘图做准备
- K_p(1,iter) = zbest(1);
- K_i(1,iter) = zbest(2);
- K_d(1,iter) = zbest(3);
- end
- %% 绘图
- disp(['PSO最优解', num2str(zbest)])
- disp(['PSO最优解对应的目标值', num2str(fitnesszbest)])
- fprintf('\n')
- figure(1) % 绘制性能指标ITAE的变化曲线
- plot(y_fitness,'LineWidth',3)
- title('最优个体适应值','fontsize',10);
- xlabel('迭代次数','fontsize',10);ylabel('适应值','fontsize',10);
- set(gca,'Fontsize',10);
- grid on
- figure(2) % 绘制PID控制器参数变化曲线
- plot(K_p,'b-','LineWidth',2); hold on
- plot(K_i,'k-.','LineWidth',2)
- plot(K_d,'r--','LineWidth',2)
- title('Kp、Ki、Kd 优化曲线','fontsize',10);
- xlabel('迭代次数','fontsize',10); ylabel('参数值','fontsize',10);
- set(gca,'Fontsize',10);
- legend('Kp','Ki','Kd',1);
- grid on;hold off;
- % PID响应
- if choosed==1
- [rint, yout]=PID_Fun_1_response(zbest);
- elseif(choosed==2)
- [rint, yout]=PID_Fun_2_response(zbest);
- elseif(choosed==3)
- [rint, yout]=PID_Fun_3_response(zbest);
- elseif(choosed==4)
- [rint, yout]=PID_Fun_4_response(zbest);
- end
- figure('color',[1,1,1])
- plot(rint,'b-','linewidth',2);hold on;
- plot(yout,'r.-','linewidth',2);
- axis tight;grid on;
- hold off;
- rmpath(genpath('./PID_funtion'))
- % rmpath(genpath('./test_function'))
复制代码 微分抗饱和调节:
|
|