⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ultimate_pid_ga.m

📁 -PID controller has been extensively used in the industrial world. But in this controller it is dif
💻 M
字号:
%Ultimate_PID_GA.m
%Written by Ian Griffin July 2003
%Last Modified 20-08-03
%____________________________________________________________________
clc
clear
close all
%global sys_controlled
%global time
global Ball_Hoop_d
rand('state',0);
%____________________________________________________________________
%Defining the ball and hoop system
hoop=tf([1.63],[.66 1]);
H=tf([67.5],[1 0]);
sys_ball=tf([.42 1.873 0],[1.42 1.873 112.11]);
sys_hoop=series(hoop,H);
Ball_Hoop=series(sys_hoop,sys_ball);
Ball_Hoop_d=c2d(Ball_Hoop,.01,'zoh');
%____________________________________________________________________
%Initialising the genetic algorithm
populationSize=3000;
variableBounds=[-10000 10000;-10000 10000;-10000 10000];
evalFN='Ultimate_PID_objfun_mse';%Change this to relevant object function
evalOps=[];
options=[1e-6 1];
initPop=initializega(populationSize,variableBounds,evalFN,evalOps,options);
%____________________________________________________________________
%Setting the parameters for the genetic algorithm
bounds=[-10000 10000;-10000 10000;-10000 10000];
evalFN='Ultimate_PID_objfun_mse';%change this to relevant object function
evalOps=[];
startPop=initPop;
opts=[1e-6 1 0];
termFN='maxGenTerm';
termOps=300;
selectFN='normGeomSelect';
selectOps=0.08;
xOverFNs='arithXover';
xOverOps=4;
mutFNs='unifMutation';
mutOps=500;
%____________________________________________________________________
%Iterating the genetic algorithm
[x,endPop,bPop,traceInfo]=ga(bounds,evalFN,evalOps,startPop,opts,...
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps);
%____________________________________________________________________
%Generating the Continuous PID Controller
den_pid=[1 0];
num_pid=[x(1) x(2) x(3)]; %Kd Kp Ki
sys_pid=tf(num_pid,den_pid);
%Discretizing the Continuous PID Controller
disp('PID controller')
sysd_pid=c2d(sys_pid,.01,'tustin')
%____________________________________________________________________
%Creating the controlled System
sys_controlled=feedback(series(sysd_pid,Ball_Hoop_d),1);
figure(1)
time =0:0.01:10;
u=.4*ones(size(time));
lsim(sys_controlled,u,time);
%____________________________________________________________________
%Printing to screen the PID values
%x
disp('_________________________________')
disp('| PID GAIN VALUES |')
disp('|________________________________|')
disp('| Kd Kp Ki |');
disp([x(1) x(2) x(3)]);
disp('|________________________________|')
%____________________________________________________________________
%Printing to screen the PID values
%x
%disp(' Kd Kp Ki');
%disp('ZN: 4.74 6 1.91');
%disp( x );
%____________________________________________________________________
%Plotting best population progress
figure(2)
subplot(3,1,1),plot(bPop(:,1),bPop(:,3)),...
title('Kp Value'),, ylabel('Gain');
subplot(3,1,2),plot(bPop(:,1),bPop(:,4)),...
title('Ki Value'),, ylabel('Gain');
subplot(3,1,3),plot(bPop(:,1),bPop(:,2)),...
title('Kd Value'),xlabel('Generations'), ylabel('Gain');
%____________________________________________________________________
%Informing user if the system is unstable
poles=pole(sys_controlled);
if abs(real(poles(1)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 1%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(1))
elseif abs(imag(poles(1)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 1%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(1))
elseif abs(real(poles(2)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 2%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(2))
elseif abs(imag(poles(2)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 2%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(2))
elseif abs(real(poles(3)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 3%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(3))
elseif abs(imag(poles(3)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 3%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(3))
elseif abs(real(poles(4)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 4%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(4))
elseif abs(imag(poles(4)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 4%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(4))
elseif abs(real(poles(5)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 5%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(5))
elseif abs(imag(poles(5)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 5%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(5))
elseif abs(imag(poles))<1
disp('This system is stable');
elseif abs(real(poles))<1
disp('This system is stable');
end
%__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -