【MATLAB数据处理实用案例详解(22)】——基于BP神经网络的PID参数整定

news2025/1/11 22:40:33

目录

    • 一、问题描述
    • 二、算法仿真
      • 2.1 BP_PID参数整定初始化
      • 2.2 优化PID
      • 2.3 绘制图像
    • 三、运行结果
    • 四、完整程序

一、问题描述

基于BP神经网络的PID控制的系统结构如下图所示:
在这里插入图片描述
考虑仿真对象,输入为r(k)=1.0,输入层为4,隐藏层为5,输出层为3,仿真输出满足 a ( k ) = 1.2 ( 1 − 0.8 e x p ( − 0.1 k ) ) , y ( k ) = a ( k ) y − 1 1 + ( y − 1 ) 2 + u − 1 a(k)=1.2(1-0.8exp(-0.1k)),y(k)=a(k) \frac{y-1}{1+(y-1)^2}+u-1 a(k)=1.2(10.8exp(0.1k)),y(k)=a(k)1+(y1)2y1+u1,进行仿真分析。

二、算法仿真

算法流程图如下:
在这里插入图片描述

2.1 BP_PID参数整定初始化

代码如下:

clc,clear,close all
warning off
xite=0.25;  % 学习因子
alfa=0.05;  % 惯量因子
S=1; %Signal type
%NN Structure
IN=4;   % 输入层个数
H=5;    % 隐藏层个数
Out=3;  % 输出层个数
if S==1  %Step Signal
wi=[-0.6394   -0.2696   -0.3756   -0.7023;
    -0.8603   -0.2013   -0.5024   -0.2596;
    -1.0749    0.5543   -1.6820   -0.5437;
    -0.3625   -0.0724   -0.6463   -0.2859;
     0.1425    0.0279   -0.5406   -0.7660];
%wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[0.7576 0.2616 0.5820 -0.1416 -0.1325;
   -0.1146 0.2949 0.8352  0.2205  0.4508;
    0.7201 0.4566 0.7672  0.4962  0.3632];
%wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
end
 
if S==2  %Sine Signal
wi=[-0.2846    0.2193   -0.5097   -1.0668;
    -0.7484   -0.1210   -0.4708    0.0988;
    -0.7176    0.8297   -1.6000    0.2049;
    -0.0858    0.1925   -0.6346    0.0347;
     0.4358    0.2369   -0.4564   -0.1324];
%wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[1.0438    0.5478    0.8682    0.1446    0.1537;
    0.1716    0.5811    1.1214    0.5067    0.7370;
    1.0063    0.7428    1.0534    0.7824    0.6494];
%wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
end

x=[0,0,0];
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
% 初始化
Oh=zeros(H,1);    %从隐藏层到输出层
I=Oh;             %从输入层到隐藏层
error_2=0;
error_1=0;
 
ts=0.001;

2.2 优化PID

2.3 绘制图像

三、运行结果

PID三个参数变化值如下:
在这里插入图片描述

四、完整程序

完整程序如下:

%BP based PID Control
clc,clear,close all
warning off
xite=0.25;  % 学习因子
alfa=0.05;  % 惯量因子
S=1; %Signal type
%NN Structure
IN=4;   % 输入层个数
H=5;    % 隐藏层个数
Out=3;  % 输出层个数
if S==1  %Step Signal
wi=[-0.6394   -0.2696   -0.3756   -0.7023;
    -0.8603   -0.2013   -0.5024   -0.2596;
    -1.0749    0.5543   -1.6820   -0.5437;
    -0.3625   -0.0724   -0.6463   -0.2859;
     0.1425    0.0279   -0.5406   -0.7660];
%wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[0.7576 0.2616 0.5820 -0.1416 -0.1325;
   -0.1146 0.2949 0.8352  0.2205  0.4508;
    0.7201 0.4566 0.7672  0.4962  0.3632];
%wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
end
 
if S==2  %Sine Signal
wi=[-0.2846    0.2193   -0.5097   -1.0668;
    -0.7484   -0.1210   -0.4708    0.0988;
    -0.7176    0.8297   -1.6000    0.2049;
    -0.0858    0.1925   -0.6346    0.0347;
     0.4358    0.2369   -0.4564   -0.1324];
%wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo=[1.0438    0.5478    0.8682    0.1446    0.1537;
    0.1716    0.5811    1.1214    0.5067    0.7370;
    1.0063    0.7428    1.0534    0.7824    0.6494];
%wo=0.50*rands(Out,H);
wo_1=wo;wo_2=wo;wo_3=wo;
end

x=[0,0,0];
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
% 初始化
Oh=zeros(H,1);    %从隐藏层到输出层
I=Oh;             %从输入层到隐藏层
error_2=0;
error_1=0;
 
ts=0.001;
for k=1:1:500
time(k)=k*ts;
if S==1
   rin(k)=1.0;
elseif S==2
   rin(k)=sin(1*2*pi*k*ts);
end
%非线性模型
a(k)=1.2*(1-0.8*exp(-0.1*k));
yout(k)=a(k)*y_1/(1+y_1^2)+u_1;  % 输出

error(k)=rin(k)-yout(k);  % 误差
xi=[rin(k),yout(k),error(k),1];
 
x(1)=error(k)-error_1;
x(2)=error(k);
x(3)=error(k)-2*error_1+error_2;
 
epid=[x(1);x(2);x(3)];
I=xi*wi';
for j=1:1:H
    Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j))); %Middle Layer
end
K=wo*Oh;             %Output Layer
for l=1:1:Out
    K(l)=exp(K(l))/(exp(K(l))+exp(-K(l)));        %Getting kp,ki,kd
end
kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);
Kpid=[kp(k),ki(k),kd(k)];
 
du(k)=Kpid*epid;
u(k)=u_1+du(k);
% 饱和限制
if u(k)>=10
   u(k)=10;
end
if u(k)<=-10
   u(k)=-10;
end
 
dyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.0000001));
 
%Output layer
for j=1:1:Out
    dK(j)=2/(exp(K(j))+exp(-K(j)))^2;
end
for l=1:1:Out
    delta3(l)=error(k)*dyu(k)*epid(l)*dK(l);
end
 
for l=1:1:Out
   for i=1:1:H
       d_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2);
   end
end
    wo=wo_1+d_wo+alfa*(wo_1-wo_2);
%Hidden layer
for i=1:1:H
    dO(i)=4/(exp(I(i))+exp(-I(i)))^2;
end
    segma=delta3*wo;
for i=1:1:H
   delta2(i)=dO(i)*segma(i);
end
 
d_wi=xite*delta2'*xi;
wi=wi_1+d_wi+alfa*(wi_1-wi_2);
% 参数更新
u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);   
y_2=y_1;y_1=yout(k);
   
wo_3=wo_2;
wo_2=wo_1;
wo_1=wo;
   
wi_3=wi_2;
wi_2=wi_1;
wi_1=wi;
 
error_2=error_1;
error_1=error(k);
end
% 绘图
figure(1);
plot(time,rin,'r',time,yout,'b','linewidth',2);
xlabel('time(s)');ylabel('rin,yout');   % 输入和输出
figure(2);
plot(time,error,'r','linewidth',2);
xlabel('time(s)');ylabel('error');      % 误差
figure(3);
plot(time,u,'r','linewidth',2);
xlabel('time(s)');ylabel('u');          % 控制输出
figure(4); 
subplot(311);                           % PID参数
plot(time,kp,'r','linewidth',2);
xlabel('time(s)');ylabel('kp');
subplot(312);
plot(time,ki,'g','linewidth',2);
xlabel('time(s)');ylabel('ki');
subplot(313);
plot(time,kd,'b','linewidth',2);
xlabel('time(s)');ylabel('kd');

ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

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

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

相关文章

04-Vue技术栈之组件化编程

目录 1、模块与组件、模块化与组件化1.1 模块1.2 组件1.3 模块化1.4 组件化1.5 传统方式编写应用1.6 组件方式编写应用 2、非单文件组件2.1 基本使用2.2 几个注意点2.3 组件的嵌套2.4 VueComponent2.5 一个重要的内置关系2.6 总结 3、单文件组件3.1 一个.vue 文件的组成(3 个部…

常用排序算法汇总—Python版

一、选择排序 1. 原理&#xff1a; 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思路是将数组按顺序分成已排序部分和未排序部分&#xff0c;然后每次从未排序部分中选择出最小的元素&#xff0c;将其添加到已排序部分的末尾…

计算机网络|第三章:传输层

前文回顾&#xff1a;第二章&#xff1a;应用层 目录 &#x1f4da;概述和运输层服务 &#x1f407;运输层和网络层的关系 &#x1f407;因特网传输概述 &#x1f4da;多路复用和多路分解 &#x1f407;无连接的多路复用与多路分解 &#x1f407;面向连接的多路复用与多路…

【硬件】嵌入式电子设计基础之分析电路

电子技术&#xff08;electronics&#xff09;是我们研究科技产品的基石&#xff0c;本文章通过一系列简单且使用的实例&#xff0c;带领大家走进电子技术的世界&#xff0c;并通过对这些实例的分析&#xff0c;掌握其中的知识点和实用的电路分析设计技能。 本篇文章围绕着模拟…

三数之和(Java实现)

文章目录 思路1.暴力算法(超出时间限制)解题思路复杂度 2.双指针算法解题思路&#xff1a;注意点复杂度 Problem: 15. 三数之和 思路 1.暴力算法 2.双指针算法 1.暴力算法(超出时间限制) class Solution {public List<List<Integer>> threeSum(int[] nums) {// 检查…

使用TrieTree(字典树)来实现敏感词过滤

使用TrieTree&#xff08;字典树&#xff09;来实现敏感词过滤 1. 字典树定义 字典树&#xff08;TrieTree&#xff09;&#xff0c;是一种树形结构&#xff0c;典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串,如01字典树&#xff09;。…

Hive本地开发/学习环境配置

前提 hive依赖hadoop的相关组件&#xff0c;需要启动Hadoop的相关组件。 Hive 版本&#xff1a;3.1.3 Hadoop版本&#xff1a;3.3.4 hive-env.sh export HADOOP_HOME$HADOOP_HOME export HIVE_CONF_DIR/usr/local/Cellar/hive/3.1.3/libexec/conf export HIVE_AUX_JARS_PATH/…

micro-app的简单学习

本文承接上一篇手把手教你使用vue2搭建micro-app&#xff0c;对micro-app进行简单的认识与学习。 简述 因为上一篇只是对micro-app的搭建&#xff0c;并没有对具体的内容进行深入了解&#xff0c;所以本文是在上一篇文章代码的基础上对micro-app官网&#xff0c;的初步了解。…

Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)

一、ref&#xff08;打标识&#xff09; 前面提及到了标签属性&#xff1a;keys 这里将了解ref&#xff1a;打标识 正常布置脚手架并创建入口文件main.js,引入组件 1. 可以给元素注册引用信息&#xff08;获取真实DOM&#xff09; 给一个按钮获取上方的dom的方法&#xff0c;方…

log4j2实现日志输出

引言 日志是我们在软件开发过程中非常重要的一个组成部分&#xff0c;它能够记录系统运行时的各种信息和异常&#xff0c;方便我们在需要的时候进行排查和调试。而Log4j2是目前最为流行的Java日志框架之一&#xff0c;它提供了丰富的日志输出方式和配置选项&#xff0c;可以满…

设计模式——装饰器模式(Decorator Pattern)

很久没有写博客了&#xff0c;最近也有很多事情要处理&#xff0c;也在努力的备考软件考试&#xff0c;正好模拟题中有一道关于装饰器模式的题&#xff0c;觉得还不错&#xff0c;所以特地写一篇文章希望能分享给小伙伴们。 装饰器模式的作用&#xff1a;允许向一个现有的对象…

vue3导入elcel表格并展示(使用xlsx插件+vite+element-plus)/js上传表格(js+xlsx)

表格内容(本博客演示的表格,这里其实可以更换任意表格,动态展示的) 安装插件xlsx npm install xlsx组件的所有代码(附解释) <script setup> import { ref } from "vue"; import * as XLSX from "xlsx"; // 把文件按照二进制进行读取 function read…

解密PyTorch动态计算图:打破深度学习束缚的秘密武器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【C++】STL之priority_queue类源码剖析

目录 概述 算法 源码 PriorityQueue.h test.cpp 测试结果 概述 priority_queue&#xff1a;优先级队列&#xff0c;包含在头文件<queue>中 优先级队列类似于堆结构&#xff0c;优先级最高的元素被置为堆顶&#xff0c;最优先被弹出top()和删除pop() 优先级队列的…

Python凸包

文章目录 ConvexHullQG三维情况ConvexHull属性 ConvexHull ConvexHull是spatial中的一个类&#xff0c;主要功能是找到一组点的边缘&#xff0c;并做一个凸包。其必要的初始化参数为一个点集&#xff0c;点集格式为 n m n\times m nm维度的数组&#xff0c;n为点集中点的个数…

定位的特殊应用

注意&#xff1a;发生固定定位&#xff0c;绝对定位后&#xff0c;元素都变成了定位元素&#xff0c;默认高宽被内容撑开&#xff0c;则可以设置宽高&#xff1b;以下只针对绝对定位和固定定位的元素&#xff0c;不包括相对定位元素。 1.定位元素块的宽充满包含块 前提&#x…

封装建立-SMD封装

1. 看规格书&#xff0c;建立需要的焊盘&#xff0c;命名。注意padstack editor保存路径中不能有中文。 2.新建.dra工程&#xff0c;layout/pin 在里面筛选需要的焊盘。 3. 放置焊盘&#xff0c;需要计算精确坐标&#xff0c;allegro里command用x 0 0命令可以定位到原点。 4…

Python综合案例-学生数据可视化

近年来,数据分析和可视化已经成为了许多领域中的重要工具。在教育领域中,通过对学生的表现和行为进行数据分析和可视化,可以更好地了解学生的学习状态,发现问题、改进教学,并提高学生成绩。本文将介绍一个 Python 综合案例,使用 Pandas 和 Seaborn 库,对学生的数据进行清…

MySQL几种备份方式对比,你用对了吗?

各备份方法对比 备份数据的策略需要根据几种维度考虑 备份能承受最大丢失数据量 备份期间系统可以处于哪种情况&#xff08;不可用&#xff0c;部分可用&#xff0c;完全可用&#xff09; 数据恢复时长 需要恢复全量数据还是增量数据 备份数据的方法 逻辑备份&#xff1a;…

推荐算法实战项目:Deep Crossing 模型原理以及案例实战(附完整 Python 代码)

本文要介绍的Deep Crossing模型是由微软研究院在论文《Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features》中提出的&#xff0c;它主要是用来解决大规模特征自动组合问题&#xff0c;从而减轻或者避免手工进行特征组合的开销。 Deep Cross…