1 参考

Chenglin Li:PID控制(一)参数调节规律

Chenglin Li:PID控制(二)参数整定方法

Chenglin Li:最优化方法(九)遗传算法求一元函数的极值

Chenglin Li:最优化方法(十)遗传算法求二元函数的极值

使用遗传算法整定PID参数_人工智能_wly-CSDN博客

控制器封装库(二)封装模块的优点和遗传算法PID模块的使用

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