1 参考
Chenglin Li:最优化方法(九)遗传算法求一元函数的极值
Chenglin Li:最优化方法(十)遗传算法求二元函数的极值
2 基于遗传算法整定PID参数的步骤
考虑被控对象
3 Note
- 目标函数中添加关于控制输入的罚函数,作为约束,可以限制控制量的幅值。
- 以阶跃函数为标准计算出来的参数值,可以应用到正弦波的输入信号。
- 含有扰动时的参数整定,以标称模型为准?
4 仿真结果
4 相关程序
function GA_PID()
%{
程序功能:
1、遗传算法PID的实现
2、传递函数:
G(s)=400/(s^2+50s)
date:2020.05.12
%}
clear,clc
close all
global N L num w1 w2 w3 w4 vin t G
%-----------------完成PID初始化---------------------------------------------
w1=0.5; %误差权重
w2=0.4; %超调量权重
w3=0.9; %上升时间
w4=0.4; %调节时间 %权重的大小可以影响对应的性能
vin=1; %参考输入
KPRange=[0.001, 20];
KIRange=[0.001 ,1];
KDRange=[0.001,1 ] ; %参数取值范围,不要从0开始,否则会陷入迭代困难!
G=tf(400,[ 1 ,50, 0 ]) ; %被控对象
time=0.1 ;%仿真时长
t=linspace(0,time ,200);
%----------------完成遗传算法初始化-----------------------------------------------
num=3 ;%变量个数
N = 50; % 种群上限
ger = 10; % 迭代次数
L = 10; % 单个变量的编码基因长度
pc = 0.8; % 交叉概率
pm = 0.1; % 变异概率
pt=0.2; %自我复制概率
dna1 = randi([0, 9], [N, L]); % 基因
dna2=randi([0, 9], [N, L]); % 基因
dna3=randi([0, 9], [N, L]); % 基因
dna=[dna1,dna2,dna3]; %合并两个变量的基因
for epoch = 1: ger % 进化代数为100
%交叉
[x1,x2]=jiaoCha(dna, pc);
% 变异操作
x3=bianYi(dna, pm);
%自我复制
x4=copy(dna, pt);
dna = [dna; x1; x2; x3; x4]; % 合并新旧基因
dna1=dna(:, 1:L);
dna2=dna(:, L+1 : 2*L);
dna3=dna(:, 2*L+1 : num*L);
fi = zeros(N*5, 1); % 初始化适应度,提速
% fi = Fx(jieMa(dna1,xRange) , jieMa(dna2 ,yRange)); % 计算适应度,容易理解,求最大值
M=length(dna1);
for k=1:M
fi(k)=-Fx(jieMa(dna1(k,:),KPRange) , jieMa(dna2(k,:) ,KIRange) , jieMa(dna3(k,:) ,KDRange)); %求最小值
end
% fi=Fx(jieMa(dna1,xRange) , jieMa(dna2 ,yRange)); %求最大值
dna = [dna, fi]; %适应度放在最后一列
%自然选择
dna=choice(dna, fi);
dna = dna(:, 1 : num*L); %去掉矩阵末尾的适应度,进入下一次迭代
end
x = jieMa( dna(:, 1:L) ,KPRange); % 对最终种群解码 (dco(1)-1)
y = jieMa( dna(:, L+1:2*L ) ,KIRange);
z= jieMa(dna( :, 2*L+1 : num*L) ,KDRange) ;
KP=x(1)
KI=y(1)
KD=z(1)
% Fxy=Fx(KP,KI,KD)
y=draw( KP, KI, KD) ;
figure
plot(t ,y, 'linewidth' ,3) %绘制效果图
title('Genetic algorithm PID')
xlabel('time(s)')
ylabel('Amplitude')
grid on
end
%适应度函数/目标函数
function J=Fx(kp , ki , kd)
global w1 w2 w3 w4 vin
[y, tr ,ts ,pos]=performance( kp, ki, kd ) ;
n=length(y);
J=0;
for k=1:n
e=vin-y(k) ; %误差
J=J+w1*abs(e)+w2*pos+w3*tr ; %误差超调量的积分
end
J=J+w4*ts ;%调节时间
end
%绘制图形
function y=draw( kp, ki, kd)
global t G
Gpid=tf([kd, kp ,ki ], [1,0] ) ; %描述PID控制器的传递函数
Gs=feedback(Gpid*G ,1, -1) ;%描述闭环系统的负反馈传递函数,H=1
% figure
y=step(Gs, t) ; %单位阶跃响应
end
%{
计算PID性能指标
tr:上升时间
ts:调节时间
pos:超调量
%}
function [y, tr ,ts ,pos]=performance(kp, ki, kd)
global t
y=draw( kp, ki, kd);
ymax=max(y); %最大响应
yend=y(length(y)); %响应终值
pos=( ymax-yend )/yend; %超调量
n=1;
while( y(n)<yend )
n=n+1;
end
tr=t(n) ;%上升时间
% n=1;
% while( y(n)<ymax )
% n=n+1;
% end
% tp=t(n) ; %峰值时间
n=length(t) ;
while( y(n)>0.98*yend && y(n)<1.02*yend )
n=n-1;
end
ts=t(n); %调节时间
end
%解码
function result=jieMa(gene , range)
global L
a=range(1) ;
b=range(2) ;
dco=zeros(L,1);
for i=1 : L
dco(i)=10^(L-i); %解码器
end
result=gene * dco / (dco(1)-1)/10 *(b-a)+a;
end
%选择
function result=choice(gene, fi)
% 自然选择--排名法
global L N num
dna = flipud(sortrows(gene, L*num + 1)); % 对适应度进行降序排名,
while size(dna, 1) > N % 自然选择,只保留50条基因
d = randi(size(dna, 1)); % 排名法
%当d非常大时,则容易被淘汰
if rand < (d - 1) / size(dna, 1) %根据概率大小,淘汰排名靠后的小概率基因
dna(d,:) = [];
fi(d, :) = [];
end
end
result=dna ;
end
%变异
function result=bianYi(gene, pm)
global N L num
for i = 1: N % 变异操作
if rand < pm
gene(i,randi(num*L)) = randi([0, 9]);
end
end
result=gene;
end
%复制
function result=copy(gene, pt)
global N L num
x= zeros(N, num*L); % 初始化子代基因,提速用
for i = 1: N % 交叉操作
if rand < pt
d = randi(N);
x(i,:)=gene(d,:);% 随机抽选一个自我复制的个体
end
end
result=x;
end
%交叉函数,一条dna,产生两条交叉后的dna
function [x1,x2]=jiaoCha(gene, pc)
global N L num
x1 = zeros(N, num*L); % 初始化子代基因,提速用
x2 = x1; % 同上
for i = 1: N % 交叉操作
if rand < pc
d = randi(N);
m = gene(d,:); % 随机抽选一个交叉的个体
d = randi(num*L-1); % 确定交叉断点
x1(i,:) = [gene(i,1:d), m(d+1: num*L)]; % 新个体 1
x2(i,:) = [m(1:d), gene(i, d+1: num*L)]; % 新个体 2
end
end
end
评论(0)
您还未登录,请登录后发表或查看评论