【非线性阀控制的强化学习】应用DDPG对非线性阀门最优控制研究(Matlab&Simulink仿真实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
🌈4 Matlab代码、Simulink仿真、数据、文章下载
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
摘要
本文研究了强化学习(RL)作为非线性阀控制的最优控制策略。它使用统一的框架,根据PID(比例积分微分)策略进行评估。RL是一种自主学习机制,通过与环境的交互进行学习。它在控制系统的世界中越来越受到关注,作为为具有挑战性的动态和非线性过程构建最优控制器的一种手段。使用DDPG(深度确定性策略梯度)算法和Simulink®进行训练,以模拟非线性阀门并创建实验测试台进行评估。Simulink允许工业工程师快速适应并试验他们选择的其他系统。结果表明,RL控制器在快速跟踪信号方面表现出色,并且相对于参考信号产生的误差较小。然而,PID在抗干扰方面更好,因此为阀门提供了更长的寿命。成功的机器学习需要调整许多超参数,需要投入大量的时间和精力。我们引入“分级学习”作为更正式和算法化的“强化学习课程”的简化、面向应用的改编。实验表明,它有助于收敛复杂的非线性现实世界系统的学习任务。最后,本研究获得的经验性学习与已发表的研究相印证。
1.导言
强化学习(RL)是一种模仿人类和动物学习能力的机器学习技术。RL应用程序已被OpenAI用于编程机器人手,以史无前例的人类般的灵巧性操纵物理对象(openai.com,2018),被斯坦福大学的CARMA程序用于自动驾驶(Vitelli和Nayebi,2016),并被研究用于更快的从头分子设计(Olivecrona,Blaschke,Engkvist和Chen,2017)。
本文研究了RL作为最优控制策略的应用。RL承诺通过直接与工厂交互并学习最优控制来更好地控制,而不需要对工厂进行精确建模。
阀门被选为受控设备,因为它们在过程控制中无处不在,几乎在所有可以想象的制造和生产行业中都有应用。工业过程回路可能涉及数千个阀门,并且不可能精确建模。
PID(比例积分微分)是事实上的控制策略,涵盖了95%以上的工业控制器(Desborough和Miller,2002)。然而,应用这种传统策略可能会影响流程的质量和效率,并增加大量成本。
将计算机连接到真实的物理工厂,让RL代理通过直接交互进行学习可能并不总是可行的,通常采用的一种实用方法包括尽可能接近地模拟真实工厂,这也是我们使用的方法。MATLAB Simulink®用于模拟非线性阀、工业过程、代理训练电路,以及最终的统一RL-PID验证电路。控制器在强化学习术语中被称为“代理”,使用MATLAB最近推出的(R2019a)强化学习工具箱™,使用DDPG(深度确定性策略梯度)算法进行训练。
分级学习是在这项研究中偶然发现的一种技术,它是一种简单的程序化方法,可以在复杂的任务上有效地训练强化学习代理,实际上是最简化的形式,被称为“课程学习”(Narvekar,Peng,Leonetti,Sinapov,Taylor等人,2020)。
本研究的主要贡献:
1.将RL理解为一种最优控制策略。
2.一种帮助执业工厂工程师将RL应用于工业最优控制的方法。使用MATLAB和Simulink进行设计和仿真,而不是要求更高的开源Python。
3.
分级学习:一种适合执业工程师的“辅导”方法。它是一种面向应用的改编,改编自更正式、更算法化的“强化学习课程”。
4.关于RL控制阀门的三个研究的文献研究。
5.在统一框架下对PID和RL策略的实验比较。
6.RL控制器在时域和频域的稳定性分析。
7.体验式学习与已发表的研究相辅相成。最后,虽然阀门是本文的重点,但这些方法适用于任何工业系统。
2. 强化学习入门在本节中,我们简要介绍了传统的最优控制求解方法,然后概述了RL、它与最优控制的联系,最后介绍了为实现而选择的DDPG算法。Sutton 和 Barto 的书(2018)是对强化学习的最全面的介绍,也是下面理论基础来源。
2.1. 最优控制和RL
反馈控制器传统上使用两种设计理念:自适应控制和最优控制。自适应控制器是在线学习者,通过测量实时数据来学习控制未知系统。然而,由于设计过程不涉及最小化工厂的任何性能指标,因此它们没有得到优化(Lewis,Vrabie和Vamvoudakis,2012)。
另一方面,传统的最优控制设计是通过求解哈密顿-雅可比-贝尔曼(HJB)方程离线进行的。根据Lewis等人(2012)的研究,求解HJB方程需要完全了解工厂的动态,而根据Tedrake(2009)的研究,这反过来又需要一个工程猜测作为起点。



📚2 运行结果






部分代码:
%% Set paths and RL agent/controller to be analyzed
MODELS_PATH = 'results/';
VALVE_SIMULATION_MODEL = 'sm_StabilityStudy'; % Stability study Simulink circuit
PRE_TRAINED_MODEL = 'Grade_I.mat';
%% Flags to be set. See instructions above. Two rounds need to be run,
% (1) SIMULATE_MODE = true. Run for creating the "data" for estimation the TF
% (2) SIMULATE_MODE = false. Run for estimating the TF from data created in previous step
SIMULATE_MODE = true;
ESTIMATE_MODE = not(SIMULATE_MODE);
% Physical system parameters. Use iteratively. Suceessively increase
% difficulty of training task and apply Graded Learning to train the agent
TIME_DELAY = 2.5; % Time delay for process controlled by valve
fS = 8.4000; % Valve dynamic friction
fD = 3.5243; % Valve static friction
%% Simulate for estimating the TF
if (SIMULATE_MODE)
RL_AGENT = strcat(VALVE_SIMULATION_MODEL, '/RL Sub-System/RL Agent');
% GRADED LEARNING MODELS
PRE_TRAINED_MODEL_FILE = strcat(MODELS_PATH, PRE_TRAINED_MODEL);
ACCEPTABLE_DELTA = 0.05;
% Time step. Tf/Ts gives Simulink's simulation time
Ts = 1.0; % Ts: Sample time (secs)
Tf = 200; % Tf: Simulation length (secs)
% Run simulation for collecting data to estimate a Transer Function
% simout = RunSimulation(VALVE_SIMULATION_MODEL, PRE_TRAINED_MODEL_FILE, RL_AGENT);
% Load experiences from pre-trained agent
sprintf('- Estimating Transfer Function for model: %s', PRE_TRAINED_MODEL_FILE)
load(PRE_TRAINED_MODEL_FILE,'agent');
% ----------------------------------------------------------------
% Validate the learned agent against the model by simulation
% ----------------------------------------------------------------
% Define observation and action space
NUMBER_OBSERVATIONS = 3;
% Observation Vector is composed of
% (1) U(k)
% (2) Error signal
% (3) Error integral
obsInfo = rlNumericSpec([3 1],...
'LowerLimit',[-inf -inf 0]',...
'UpperLimit',[ inf inf inf]');
obsInfo.Name = 'observations';
obsInfo.Description = 'controlled flow, error, integral of error';
numObservations = obsInfo.Dimension(1);
actInfo = rlNumericSpec([1 1]);
actInfo.Name = 'flow';
numActions = numel(actInfo);
env = rlSimulinkEnv(VALVE_SIMULATION_MODEL, RL_AGENT, obsInfo, actInfo);
simOpts = rlSimulationOptions('MaxSteps', 500);
experiences = sim(env, agent, simOpts);
else
% Run the Simulink Model to collect data in 'out' variable
% Esimating a TF
NP=3; NZ=2;
% Estimate Controller TF
InputData_C = out.InputData_C.Data(:);
OutputData_C = out.OutputData_C.Data(:);
OutputData_P = out.OutputData_P.Data(:);
uC = InputData_C;
yC = OutputData_C;
signal_length = min(size(yC), size(uC));
yC = yC(1:signal_length);
uC = uC(1:signal_length);
tfdata_C = iddata(yC, uC, Ts);
tf_Controller = tfest(tfdata_C, NP, NZ);
%% Estimate transfer-function for the entire Plant (process + non-linear valve)
% In case you want to use the industrial-process TF separately, we
% could use it directly and estimate ONLY for the non-linear valve too
% s = tf('s');
% tf_Plant_TD = 3.8163 / (156.46*s + 1) * exp(-2.5*s);
% --------------------------------------------------
InputData_P = OutputData_C;
uP = InputData_P;
yP = OutputData_P;
signal_length = min(size(yP), size(uP));
yP = yP(1:signal_length);
uP = uP(1:signal_length);
tfdata_P = iddata(yP, uP, Ts);
tf_Plant = tfest(tfdata_P, NP, NZ);
tf_Plant_TD = tf_Plant;
% -------------------------------------------------
% TF Open and Closed Loop
TF_OpenLoop_TD = tf_Controller*tf_Plant_TD;
TF_ClosedLoop_TD = feedback(tf_Plant_TD*tf_Controller, 1);
figure(1); step(TF_ClosedLoop_TD); title ('Closed Loop: Step Response');
figure(2); bode(TF_OpenLoop_TD); title ('Open Loop: Bode plot');
figure(3); margin(TF_OpenLoop_TD);
figure(4); pzmap(TF_OpenLoop_TD); title ('Open Loop: Pole-Zero map');
figure(5); nyquist(TF_OpenLoop_TD); title ('Open Loop: Nyquist plot');
% Save TFs
save('RL_TransferFunctions_V5', 'NP', 'NZ', 'tf_Controller', 'tf_Plant', 'tf_Plant_TD', 'TF_OpenLoop_TD', 'TF_ClosedLoop_TD')
end
% ------------------------------------------------------------------------
% Environment Reset function
% Randomize Reference_Signal between 0 and 100
% Reset if the controlled speed drops below zero or exceeds 100
% ------------------------------------------------------------------------
function in = localResetFcn(in, RL_System)
block_Reference_Signal = strcat (RL_System, '/Reference_Signal');
Reference_Signal = 20+randi(80) + rand;
in = setBlockParameter(in, block_Reference_Signal, ...
'Value', num2str(Reference_Signal));
% Randomize initial condition of the flow (0 and 100)
block_Actual_Flow = strcat (RL_System, '/Plant/Process/FLOW');
Actual_Flow = 20 + randi(80) + rand;
in = setBlockParameter(in, block_Actual_Flow, 'Bias', num2str(Actual_Flow));
end
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)

🌈4 Matlab代码、Simulink仿真、数据、文章下载
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

更多推荐

所有评论(0)