工业控制之“什么叫RTO?”

news2024/9/24 5:25:15

读研究生时,过程控制领域经常涉及“APC”、“RTO”等字眼,导师也经常性提及,现在在工作中也开始提了,可能意识到先进控制的重要性了。

今天谈一下RTO在工业上的应用,曾经和一个博士生对“RTO涉及哪些算法”发生过激烈争吵,关于一些算法寻优名词,例如:”瞎子爬山法“、“进退法”、“成功失败法”等,这些算法其实是一种局部择优的贪心搜索算法,本质上是梯度下降法。神经网络中的权值调整就是通过梯度下降法。J目标函数(偏差最小),优化权值,典型案例求最值问题,梯度下降法先天不足就是只能在单调区间内寻优(单调函数),假设有多个单调区间,(负)梯度下降法就会被拉回原单调区间,这就是经常说的容易陷入局部最优解问题。权值w取值区间假设[0 +∞],采用梯度下降法只能得到第一个谷点。如果应用到PID控制上,假设已知被控对象传递函数,经差分离散化得到差分函数,经过梯度下降法循环迭代求出一组权值(PID参数)得到第一个谷点,权值在迭代过程中始终没有越过[0 w5点],也就是说限制在w3点上,典型案例人工神经网络优化PID参数。

关于梯度下降法原理可以参考:https://blog.csdn.net/weixin_43213884/article/details/122303703

在这里插入图片描述
在这里插入图片描述
不断逼近-0.625
在这里插入图片描述

遗传算法可以解决梯度下降法的局部最优解问题,举个完整例子[图片摘自智能控制导论_昆明理工大学]:

在这里插入图片描述
在这里插入图片描述
有几个自变量就有几个样本数据,把这几个样本数据合成一个染色体。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

%Generic Algorithm for function f(x1,x2) optimum
clear all;
close all;

%Parameters
Size=80;   
G=100;     
CodeL=10;
 
umax=2.048;
umin=-2.048;
%初始化 种群 采样rand+round 产生0和1
E=round(rand(Size,2*CodeL));    %Initial Code

%Main Program
for k=1:1:G
time(k)=k;

for s=1:1:Size
m=E(s,:);
y1=0;y2=0;

%Uncoding  解码操作
m1=m(1:1:CodeL);
for i=1:1:CodeL
   y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(CodeL+1:1:2*CodeL);
for i=1:1:CodeL
   y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
%优化目标是求函数的最大值,故可将个体的适应度直接取为对应的目标函数值
F(s)=100*(x1^2-x2)^2+(1-x1)^2;
end
%选个体适应度的倒数作为目标函数
Ji=1./F;     %(有一说一 这个真的没用)
%****** Step 1 : Evaluate BestJ ******
BestJ(k)=min(Ji);

fi=F;                          %适应度函数 
%'ascend' 表示升序(默认值),'descend' 表示降序。
[Oderfi,Indexfi]=sort(fi,'ascend' );     %升序排列
Bestfi=Oderfi(Size);           %Let Bestfi=max(fi )选出最优个体
BestS=E(Indexfi(Size),:);      %Let BestS=E(m), m is the Indexfi belong to max(fi)
bfi(k)=Bestfi;             %作图用的 寻优过程

%****** Step 2 : Select and Reproduct Operation******
   fi_sum=sum(fi);
   fi_Size=(Oderfi/fi_sum)*Size;%比例法进行 复制
   
   fi_S=floor(fi_Size);        %Selecting Bigger fi value
   
   kk=1;       
   for i=1:1:Size
      for j=1:1:fi_S(i)        %Select and Reproduce 
       TempE(kk,:)=E(Indexfi(i),:);  %%优秀的个体进行复制
         kk=kk+1;              %kk is used to reproduce
      end
   end
   
%************ Step 3 : Crossover Operation ************
pc=0.60;               %%交叉的概率
n=ceil(20*rand);       %%一点交叉 选择出一点交叉的位置
for i=1:2:(Size-1)
    temp=rand;
    if pc>temp                  %Crossover Condition
    for j=n:1:20
        TempE(i,j)=E(i+1,j);
        TempE(i+1,j)=E(i,j);
    end
    end
end
TempE(Size,:)=BestS;
E=TempE;
   
%************ Step 4: Mutation Operation **************
%pm=0.001;
%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm
%pm=0.0;    %No mutation
pm=0.1;     %Big mutation   %%%变异

   for i=1:1:Size
      for j=1:1:2*CodeL
         temp=rand;
         if pm>temp                %Mutation Condition
            if TempE(i,j)==0
               TempE(i,j)=1;        %1变0 0变1
            else
               TempE(i,j)=0;
            end
        end
      end
   end
   
%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
TempE(Size,:)=BestS;      %保证最优个体不丢失(变异交叉等会改变最优个体的基因)
E=TempE;                  %形成新的一代种群的基因
end
 
Max_Value=Bestfi
BestS
x1
x2
figure(1);
plot(time,BestJ); 
xlabel('Times');ylabel('Best J');
figure(2);
plot(time,bfi);
xlabel('times');ylabel('Best F');

在这里插入图片描述

关于遗传算法原理可以参考:https://blog.csdn.net/qq_30759585/article/details/112761360

遗传算法PID的解析和实现
https://zhuanlan.zhihu.com/p/139945063

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]; %合并3个变量的基因

    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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 设计模式——访问者模式

目录 C 设计模式——访问者模式1. 主要组成成分2. 逐步构建访问者模式步骤1: 创建元素接口和具体元素步骤2: 创建抽象访问者和具体访问者步骤3:创建对象结构步骤4: 客户端使用访问者模式 3. 访问者模式 UML 图UML 图解析 4. 访问者模式的优点5. 访问者模式的缺点6. 访问者模式适…

spring security 记住我在web和前后端分离如何使用

一、传统web开发准备工作 如果不懂原理的话&#xff0c;去看上一篇文章&#xff1a;CSDNhttps://mp.csdn.net/mp_blog/creation/editor/141716695 导入需要的依赖包&#xff0c;在传统web页面开发比较简单&#xff0c;我们设置只需要在页面请求参数加上一个remember-me 即可&a…

Linux-gcc/g++使用

文章目录 概念gccg 编译过程预处理(进行宏替换)编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;连接&#xff08;生成可执行文件或库文件&#xff09;函数库 gcc选项 概念 Linux中的gcc和g是GNU Compiler Collection&#xff08;GNU编译…

RESP图形化界面远程连接虚拟机Redis教程

参考优质大佬文章&#xff1a; Redis安装以及RESP连接Redis服务器_resp 连接-CSDN博客 《Redis&#xff1a;小白入门》RESP远程连接问题_redis配置文件更改为可以远程连接-CSDN博客 目录 环境 第一步&#xff1a;修改redis配置文件 第二步&#xff1a;关闭Linux防火墙 第三…

功能需求文档-自适应巡航控制ACC

本文以特斯拉Model3为例&#xff0c;展示如何撰写其主动巡航控制功能的功能需求文档&#xff1b;详情请参照用户手册 功能概述 主动巡航控制(ACC)是指系统实时监控车辆前方行驶环境&#xff0c;在设定的速度范围内&#xff0c;通过控制油门和制动&#xff0c;自动调整行驶速度…

Mybatis 潦草笔记

准备工作&#xff08;创建springboot工程、数据库表、实体类&#xff09;引入Mybatis的相关依赖&#xff0c;配置Mybatis&#xff08;数据库连接信息&#xff09;编写SQL语句&#xff08;注解/XML&#xff09; 创建springboot工程 选中两项 MyBatis Framework&#xff1a;My…

分支和循环(上)

目录 1. if语句 1.1 if ​1.2 else 1.3 分支中包含多条语句 1.4 嵌套if 1.5 悬空else问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符 4.1 逻辑取反操作符 4.2 逻辑与运算符 4.3 逻辑或运算符 4.4 连续:闰年的判断 4.5 短路 5. switch语句 5.1 if语句和switch…

28. 双耳配对 - 配置

1. 概述 通过MAC地址的最后一位的奇偶来判断左右耳 2. 验证 右耳:奇数(主耳)-》BT ADDR: 12:42:22:34:34:6d 左耳:偶数(从耳)-》BT ADDR: 12:42:22:34:34:6c

K8S - 理解volumeMounts 中的subpath

在上一篇文章中 springboot service如何动态读取外部配置文件 介绍了springboot 中如何实时读取外部配置文件的内容 部署在K8S 接下来我把它部署在k8s 首先&#xff0c; 我们把配置文件放入项目某个目录 这步部是必须的&#xff0c; 毕竟我们要引入是项目外部的文件&#xf…

TI DSP TMS320F280025 Note9:GPIO输入输出与外部中断功能原理与应用

TMS320F280025 GPIO输入输出与外部中断功能原理与应用 文章目录 TMS320F280025 GPIO输入输出与外部中断功能原理与应用GPIO原理输入输出模式的共同特性1. 复用设置2. 内部上拉设置3. GPIO状态读取 对于输出模式输出电平设置开漏输出设置 对于输入模式极性设置采样类型不同步(异…

CSS3换装达人原理

引言 换装或者是换皮肤是常见的行为&#xff0c;我们可以先看下效果&#xff1a; 选择不同的颜色&#xff0c;就可以秒变人物服装的颜色&#xff0c;原理其实非常简单 实现步骤 主要分为三步&#xff0c;即素材的提供、布局样式、动态控制 图片提供 提供两张图片&#xff…

每日OJ_牛客_红与黑(简单dfs)

目录 牛客_红与黑&#xff08;简单dfs&#xff09; 解析代码 牛客_红与黑&#xff08;简单dfs&#xff09; 红与黑__牛客网 解析代码 循环接收每组用例&#xff0c;对于每组用例进行如下操作&#xff1a; 1. 找到‘’所在的位置&#xff0c;即起始搜索的点 2. 使用DFS搜索地…

20240831-PostgreSQL小课持续更新

PostgreSQL 小课专栏介绍 PostgreSQL 小课目前已累积了近 21 万字。小课最新的大纲&#xff1a; 目前已完成大概 95% 的进度&#xff1a; (venv312) ➜ mypostgres git:(dev) sh scripts/word_statistics_pg_style.shFilename …

【微服务】限流、熔断和降级(持续更新中~)

1、限流 1.1 什么是限流 限流&#xff08;Rate Limiting&#xff09;是一种常用的技术手段&#xff0c;用于控制系统对资源的访问速率&#xff0c;确保系统的稳定性和可靠性。在分布式系统、Web服务、API接口等场景中&#xff0c;限流尤为重要。通过限制请求的频率或数量&…

uniapp u--input实现select下拉列表 input点击事件

背景&#xff1a; 技术框架&#xff1a; uniapp框架(vue2语法)uView组件库。 通过form表单实现数据列表的“查询”功能。注意&#xff1a; 1、<u--form>内部嵌套<u-form-item>&#xff0c;<u-form-item>内部嵌套<u--input>表单组件。 2、H5浏览器端&am…

华为 HCIP-Datacom H12-821 题库

有需要题库的可以看主页置顶 1.MSTP 有不同的端口角色&#xff0c;对此说法不正确的是&#xff1a; A、MSTP 中除边缘端口外&#xff0c;其他端口角色都参与 MSTP 的计算过程 B、MSTP 同一端口在不同的生成树实例中可以担任不同的角色。 C、MSTP 域边缘端口是指位于 MST 域的边…

QT实战项目之音乐播放器

项目效果演示 myMusicShow 项目概述 在本QT音乐播放器实战项目中&#xff0c;开发环境使用的是QT Creator5.14版本。该项目实现了音乐播放器的基本功能&#xff0c;例如开始播放、停止播放、下一首播放、上一首播放、调节音量、调节倍速、设置音乐播放模式等。同时还具备搜索功…

SPR系列单点激光测距传感器|模组之RS485串口调试说明

SPR系列单点激光测距传感器|模组是一款近程红外测距传感器&#xff0c;测距距离可达0-10米&#xff0c;可用于对物体进行非接触式距离测量&#xff0c;其应用场景十分广泛工业自动化&#xff1a;在生产线、传送带等工业自动化场景中&#xff0c;可以使用红外测距传感器进行物体…

Git安装及配置

Git安装 在你开始使用 Git 前,需要将它安装在你的计算机上。 即便已经安装,最好将它升级到最新的版本。 你可以通过软件包或者其它安装程序来安装,或者下载源码编译安装。 下面,我们将会介绍不同操作系统上 Git 的安装方法。 在 Windows 上安装 在 Windows 上安装 Git 的…

LangChain基础知识

这篇文档介绍了LangChain大模型应用开发框架的入门知识和核心内容&#xff0c;包括LangChain是什么、为什么需要它、典型使用场景、基础概念与模块化设计等。同时&#xff0c;还详细阐述了该框架的核心模块如标准化的大模型抽象、大模型应用的最佳实践、赋予应用记忆的能力、框…