|
6-PSO_PID--粒子群算法--适应度函数有更改(采样时间)
百度网盘链接:https://pan.baidu.com/s/134vHa0M2gPMENML-t-AvnA 提取码:5hlg
具体链接在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'))
- %% PSO参数设置
- w = 0.6; % 惯性因子
- c1 = 2; % 加速常数
- c2 = 2; % 加速常数
- Dim = 3; % 维数,未知量个数nvar, N_VAR, N_PAR
- SwarmSize = 30; % 粒子群规模
- MaxIter = 50; % 最大迭代次数
- Vmax = 1;
- Vmin = -1;
- Ub = [15 10 5]; % 上限
- Lb = [0.5 0 0]; % 下限
- %% 适应度函数
- fun = @(x)PID_controller(x);
- %% 粒子群初始化
- Range = ones(SwarmSize,1)*(Ub-Lb);
- pop = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb; % 初始化粒子群
- V = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin; % 初始化速度
- fitness = zeros(SwarmSize,1);
- for i=1:SwarmSize
- 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) )
- disp(['当前迭代次数:',num2str(iter)]) % 迭代次数
- for j=1:SwarmSize
- % 速度更新
- V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
- for k=1:Dim
- if V(j,k)>Vmax,
- V(j,k)=Vmax;
- end
- if V(j,k)<Vmin,
- V(j,k)=Vmin;
- end
- end
- % 位置更新
- pop(j,:)=pop(j,:)+0.5*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响应
- [BSJ, rint, yout]=PID_controller_response(zbest);
- figure('color',[1,1,1])
- plot(rint,'b-','linewidth',2);hold on;
- plot(yout,'r.-','linewidth',2);
- axis tight;grid on;
- hold off;
- title('阶跃响应曲线')
- save PSO_result.mat
- rmpath(genpath('./PID_funtion'))
复制代码 PID控制系统如下(细节、细节、细节):- function BsJ=PID_controller(Kpidi)
- % PID控制误差--适应度函数
- % 输入:
- % Kpidi---包含Kp、Ki、Kd三个控制参数
- % 输出:
- % BsJ---控制累计误差
- %% 二阶控制系统
- ts=1; % 采样周期
- % sys=tf([-2,1],[0.2 1.2 1.0]);
- % dsys=c2d(sys,ts,'z');
- % [num,den]=tfdata(dsys,'v'); % z变换后的分子分母系数
- % 减小计算时间
- num = [0,-0.361018550145424,0.988879914151562];
- den = [1,-0.374617388170528,0.00247875217666640];
- %常规PID
- u_11=0;u_21=0;u_31=0;u_41=0;u_51=0;
- y_11=0;y_21=0;y_31=0;
- error_21=0;
- error_11=0;
- ei1=0;
- ei=0;
- u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
- y_1=0;y_2=0;y_3=0;
- error_2=0;
- error_1=0;
- kp1=Kpidi(1);
- ki1=Kpidi(2);
- kd1=Kpidi(3);
-
- for k=1:1:200
- time(k)=k*ts;
-
- % rin(k)=bb(k);
- rin(k)=1;
- yout1(k)=-den(2)*y_11-den(3)*y_21+num(2)*u_11+num(3)*u_21;
- error1(k)=(rin(k)-yout1(k))*0.05;
- ei1=ei1+error1(k)*ts;
- u1(k)= u_11+kp1*error1(k)+ kd1*(error1(k)-error_11)/ts+ki1*ei1;
- if u1(k)>=10 % Restricting the output of controller
- u1(k)=10;
- end
- if u1(k)<=-10
- u1(k)=-10;
- end
- u_51=u_41;u_41=u_31;u_31=u_21;
- u_21=u_11;u_11=u1(k);
- y_31=y_21;
- y_21=y_11;y_11=yout1(k);
- error_21=error_11;
- error_11=error1(k);
- end
- BsJ = sum(abs(error1));
复制代码
|
|