位置式\增量式PID、模糊PID、BRF-PID的Matlab实现以及封装

  • 位置式\增量式PID、模糊PID、BRF-PID的Matlab实现以及封装
    • 简要
    • Model类
    • Strategy 类
    • PID_Strategy类
    • Fuzzy_PID_Strategy类
    • BRF_PID_Strategy类
    • 测试

位置式\增量式PID、模糊PID、BRF-PID的Matlab实现以及封装

简要

PID控制由于结构简单,控制效果好,在工业上有广泛的应用,从出现到至今已经有一百多年的历史;PID控制本质是一种线性控制器,它是比例(P)、积分(I)、微分(D)的线性组合,所以一旦参数确定,控制效果就已经确定,在面对非线性系统时候,控制效果不是太理想。所谓的智能PID就是通过把智能算法与PID相结合,各取所长得到智能PID算法,其算法本质就是通过规则或者学习算法来在线的改变PID的三个参数,从而面对时变、非线性系统时,能有较强的鲁棒性。

本文主要包括位置式\增量式PID、模糊PID、BRF-PID的Matlab实现以及封装,其中包括了完整的代码。Matlab也是一门面向对象语言,利用面向对象的强大功能,本文通过策略模式把算法经行了封装,方便以后使用。以下是完整的代码实现:

Model类

此类负责储存数据

classdef Model < handle
% 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换
% 此类对象中存放数据,而在Strategy中存放算法,此类可以选择不同的算法propertiessampleTime      % 采样时间simTime         % 仿真时间rin             % 输入sys_Plant       % 被控对象传递函数dsys            % 离散模型den             % 离散模型分母num             % 离散信号分子uiyiistrategyObj     % 策略对象endmethods function obj = Model(sampleTime,simTime,rin,plant)% 初始化数据。obj.initialize(sampleTime,simTime,rin)% 建立模型及初始化其他参数obj.buildPlant(plant);endfunction initialize(obj,sampleTime,simTime,rin)obj.sampleTime = sampleTime;obj.simTime = simTime;obj.i =  obj.simTime/obj.sampleTime;if strcmp(rin,'step')obj.rin = ones(obj.i,1);elseif strcmp(rin,'impulse')obj.rin = zeros(obj.i,1);obj.rin(1) = 1/obj.sampleTime;elseif strcmp(rin,'square wave')x = 1:obj.i;obj.rin = sign(sin(2*pi*obj.sampleTime.*x));endend% 被控对象传递函数建立及其他参数初始化。function buildPlant(obj,plant)s = tf('s');obj.sys_Plant = eval(plant);% 零阶保持器离散化obj.dsys = c2d(obj.sys_Plant,obj.sampleTime,'z');[obj.num,obj.den] = tfdata(obj.dsys,'v');% 其他初始化obj.initialize_other();endfunction initialize_other(obj)n = length(obj.den);obj.ui = zeros(n-1,1);obj.yi = zeros(n-1,1);endfunction progress(obj)obj.initialize_other()obj.strategyObj.progress(obj);endend
end

Strategy 类

此类为抽象类,定义算法接口

classdef Strategy < handle
% 策略模式
% 策略抽象基类,定义算法接口,有PID_Strategy,FuzzyPID_Strategy,BRF_PID_Strategy,SingleNeuralPID_Strategy等子类。propertiesPID_param = [0 0 0];   % 向量依次代表pid三个参数yout                   % 输出stepTime               % 离散时间stepRin                % 离散输入error                  % 误差变化PID                    % PID三个参数变化过程endmethodsfunction obj = Strategy(P,I,D)obj.PID_param = [P I D];endendmethods(Abstract)progress(obj) end
end

PID_Strategy类

此类为位置式、增量式PID算法的具体实现。

classdef PID_Strategy < StrategypropertiesdisplacementPID             % 位置式PID和增量式PID切换,0代表增量式PID,1代表位置式PIDendmethodsfunction obj = PID_Strategy(P,I,D,displacementPID)obj = obj@Strategy(P,I,D);obj.displacementPID = displacementPID;endfunction progress(obj,modelObj)x = [0 0 0]';i = modelObj.i;obj.stepRin = modelObj.rin;obj.yout = zeros(i,1);time = zeros(i,1);% 位置式PIDu = zeros(i,1);                 % 控制器输出e = zeros(i,1);                 % 误差e_1 = 0;                        % 上一时刻误差% 增量式PIDdu = u;u_1 = 0;e_2 = 0;for k = 1:itime(k) = k*modelObj.sampleTime;% 输出obj.yout(k) = modelObj.num(2:end)*modelObj.ui - modelObj.den(2:end)*modelObj.yi;% 误差e(k) = obj.stepRin(k) - obj.yout(k);% 位置式PID算法if obj.displacementPID u(k) = obj.PID_param*x;if u(k) >= 10u(k) = 10;endif u(k) <= -10u(k) = -10;endx(1) = e(k);x(2) = x(2) + e(k)*modelObj.sampleTime; x(3) = e(k) - e_1;% 增量式PID算法elsedu(k) = obj.PID_param*x;u(k) = u_1 + du(k);if u(k) >= 10u(k) = 10;endif u(k) <= -10u(k) = -10;endx(1) = e(k) - e_1;x(2) = e(k);x(3) = e(k) - 2*e_1 + e_2; u_1 = u(k);e_2 = e_1;end              % 跟新数据modelObj.ui(2:end) = modelObj.ui(1:end-1);modelObj.ui(1) = u(k);modelObj.yi(2:end) = modelObj.yi(1:end-1);modelObj.yi(1) = obj.yout(k); e_1 = e(k);endobj.stepTime = time;figureplot(time,obj.yout)grid onobj.error = e;endend
end

Fuzzy_PID_Strategy类

此类为模糊PID的具体实现

classdef Fuzzy_PID_Strategy < Strategy
% 模糊PID控制算法。二输入,三输出propertiesfid                             % 模糊逻辑控制文件endmethodsfunction obj = Fuzzy_PID_Strategy(P,I,D,file)obj = obj@Strategy(P,I,D);obj.fid = readfis(file);endfunction progress(obj,modelObj)x = [0 0 0]';i = modelObj.i;obj.PID = zeros(i,3);obj.stepRin = modelObj.rin;obj.yout = zeros(i,1);time = zeros(i,1);u = zeros(i,1);                 % 控制器输出e = zeros(i,1);                 % 误差e_1 = 0;                        % 上一时刻误差ec_1 = 0;                       % 上一时刻误差变化           for k = 1:itime(k) = k*modelObj.sampleTime;% 根据模糊规则输出PID变化deltaPID = evalfis(obj.fid,[e_1,ec_1]);obj.PID(k,:) = obj.PID_param + deltaPID;u(k) = obj.PID(k,:)*x;if u(k) >= 10u(k) = 10;endif u(k) <= -10u(k) = -10;end% 输出obj.yout(k) = modelObj.num(2:end)*modelObj.ui - modelObj.den(2:end)*modelObj.yi;% 误差e(k) = obj.stepRin(k) - obj.yout(k);x(1) = e(k);x(2) = x(2) + e(k)*modelObj.sampleTime; x(3) = e(k) - e_1; % 跟新数据modelObj.ui(2:end) = modelObj.ui(1:end-1);modelObj.ui(1) = u(k);modelObj.yi(2:end) = modelObj.yi(1:end-1);modelObj.yi(1) = obj.yout(k); e_1 = e(k);ec_1 = x(3);endobj.stepTime = time;figureplot(time,obj.yout)grid onobj.error = e;endend
end

BRF_PID_Strategy类

此类为径向基函数PID的具体实现

classdef BRF_PID_Strategy < Strategy
% 径向基函数网络PID算法,核函数为高斯基函数,网络为3-6-1形式propertiesalpha                            % RBF网络学习效率eta                              % RBF网络动量因子b = 4                            % 高斯基函数宽度c                                % 高斯基函数中心矩阵hide_num = 6                     % 隐含层个数out_range                        % 模型输出范围etaPID = [0.2 0.2 0.2]           % PID三个参数学习效率ymout                            % BRF网络逼近输出dyout                            % BRF网络雅可比阵displacementPID                  % 位置式PID和增量式PID切换,0代表增量式PID,1代表位置式PIDendmethodsfunction obj = BRF_PID_Strategy(P,I,D,etaPID,alpha,eta,b,out_range,hide_num,displacementPID)obj = obj@Strategy(P,I,D);  obj.etaPID = etaPID;obj.alpha = alpha;obj.eta = eta;obj.b = b;obj.out_range = out_range;obj.hide_num = hide_num;obj.displacementPID = displacementPID;obj.c = [linspace(out_range(1),out_range(2),obj.hide_num);linspace(out_range(1),out_range(2),obj.hide_num);linspace(out_range(1),out_range(2),obj.hide_num)];endfunction progress(obj,modelObj)x = [0 0 0]';  y_1 = 0;                        % 上一时刻输出% 初始化神经网络各参数w = zeros(obj.hide_num,1);      % 初始权矩阵w_1 = w;w_2 = w_1;h = zeros(obj.hide_num,1);      % 初始化高斯基函数输出RBF_input = [0 0 0]';           % 初始化神经网络输入% 初始化模型输入输出参数i = modelObj.i;obj.PID = zeros(i,3);obj.stepRin = modelObj.rin;obj.yout = zeros(i,1);obj.ymout = zeros(i,1);obj.dyout = zeros(i,1);time = zeros(i,1);% 位置式PIDu = zeros(i,1);                 % 控制器输出e = zeros(i,1);                 % 误差e_1 = 0;                        % 上一时刻误差% 增量式PIDdu = u;u_1 = 0;e_2 = 0;for k = 1:itime(k) = k*modelObj.sampleTime;% 输出obj.yout(k) = modelObj.num(2:end)*modelObj.ui - modelObj.den(2:end)*modelObj.yi;for j = 1:obj.hide_numh(j) = exp(-norm(RBF_input - obj.c(:,j))^2/(2*obj.b^2));endobj.ymout(k) =  w'*h;d_w = obj.alpha*(obj.yout(k) - obj.ymout(k))*h;w = w_1 + d_w + obj.eta*(w_1 - w_2);yu = w.*h.*(-x(1) + obj.c(1,:))'/obj.b^2;obj.dyout(k) = sum(yu);% 误差e(k) = obj.stepRin(k) - obj.yout(k);obj.PID_param = obj.PID_param + e(k)*obj.dyout(k)*x'.*obj.etaPID;obj.PID(k,:) = obj.PID_param;% 位置式PID算法if obj.displacementPIDu(k) = obj.PID_param*x;if u(k) >= 10u(k) = 10;endif u(k) <= -10u(k) = -10;endx(1) = e(k);x(2) = x(2) + e(k)*modelObj.sampleTime; x(3) = e(k) - e_1;RBF_input = [u(k) obj.yout(k) y_1]';% 增量式PID算法elsedu(k) = obj.PID_param*x;u(k) = u_1 + du(k);if u(k) >= 10u(k) = 10;endif u(k) <= -10u(k) = -10;endx(1) = e(k) - e_1;x(2) = e(k);x(3) = e(k) - 2*e_1 + e_2; RBF_input = [du(k) obj.yout(k) y_1]';u_1 = u(k);e_2 = e_1;end% 跟新数据modelObj.ui(2:end) = modelObj.ui(1:end-1);modelObj.ui(1) = u(k);modelObj.yi(2:end) = modelObj.yi(1:end-1);modelObj.yi(1) = obj.yout(k); e_1 = e(k);w_2 = w_1;w_1 = w;y_1 = obj.yout(k);endobj.stepTime = time;obj.error = e;figureplot(time,obj.yout)grid onfigureplot(time,obj.yout,'r',time,obj.ymout,'b');endend
end

测试

测试对象为三阶的一型系统,采样时间TS=0.001sT_S=0.001sTS​=0.001s,仿真时长T=0.5sT=0.5sT=0.5s,输入为单位越阶。

%%  PID算法/增量式PID算法调试
a = Model(0.001,0.5,'step','523500/(s^3+87.35*s^2+10470*s)');
a.strategyObj = PID_Strategy(1,0,0,1);
% a.strategyObj = PID_Strategy(1,0,0,0);
a.progress()
%%  神经网络PID/神经网络增量式PID算法调试
% a = Model(0.001,0.5,'step','523500/(s^3+87.35*s^2+10470*s)');
% isa(a.strategyObj,'Strategy')
% a.strategyObj = BRF_PID_Strategy(0.8,0,0,[0.9,0.9,0.2],0.4,0.01,2,[-1,1],6,1);
% a.progress()

位置式\增量式PID、模糊PID、BRF-PID的Matlab实现以及封装相关推荐

  1. 总结PID算法,位置式增量式理解以及C代码实现

    前言 近日刚接触PID,于是查找了所有资料(PID是经典算法,有很多文章),理解一大堆资料后,整理总结才写下在这篇博客. 自己也用STM32F103写些代码实现验证,先是单纯比例控制,后来PI控制,到 ...

  2. 数字PI调节器_位置式/增量式_区别原理

    PI调节器是电力拖动自动控制系统中最常用的一种控制器 数字控制器需要对模拟控制器进行离散化 位置式PI 时域表达式转差分方程后的表达式: u(k)第K次的输出:e(k)第k次的误差:Tsam采样周期: ...

  3. 位置环PID模糊C语言,PID和位置环

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 所谓PID 自动控制,是对一个确定系统的- -个过程量的自动调节过程:* q* }3 B" @* V+ P# H ...

  4. 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)

    关于PID废话不多说,各种位置式增量式资料和公式网上也非常多.PID从提出和发展目前已经一个世纪过去了,还在不断研究创新,足见它的重要性.本篇博文给出三菱FX系列增量型PID的源代码.(三菱系列的优化 ...

  5. 11旋转编码器原理_旋转编码器的原理是什么?增量式编码器和绝对式编码器有什么区别?...

    先给出结论,最重要的区别在于:增量式编码器没有记忆,断电重启必须回到参考零位,才能找到需要的位置,而绝对式编码器,有记忆,断电重启不用回到零位,即可知道目标所在的位置. 接下来细说一下,主要包含如下的 ...

  6. 旋转编码器详解(主要讨论增量式编码器与绝对式编码器)

    参考资料:旋转编码器的原理是什么?增量式编码器和绝对式编码器有什么区别? 0. 前言 我们在选电机时,非常注重电机的扭矩和尺寸,因为这直接决定了电机是否能按规定的运动模式拖动负载,能不能很好地布置在有 ...

  7. 搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 位置式PID和增量式PID 位置式PID: 增量式PID: ...

  8. 位置式PID与增量式PID的介绍和代码实现

    PID分为位置式PID与增量式PID. 一.位置式PID 1.表达式为: 2.缺点: 1).由于全量输出,所以每次输出均与过去状态有关,计算时要对ek进行累加,工作量大: 2).因为计算机输出的uk对 ...

  9. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

最新文章

  1. CNS级别的插图你也可以实现,只需2天
  2. 「镁客早报」阿里巴巴与Office Depot合作,服务美国小企业;HTC与印厂商谈品牌许可协议,或退出手机市场...
  3. 多线程导出excel_【开源资讯】MyExcel 3.7.0 发布,屏蔽多线程处理细节
  4. UE选择合适的小区进行驻留以后
  5. python语句分为复合语句_复合语句if条件的Python求值
  6. postgresql 备份_在Kubernetes上使用PostgreSQL的正确姿势:第三部分
  7. 外连接就是允许不满足条件的字段查询出来
  8. 苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍、一遍又一遍指导记住为止。
  9. android内存置换,课内资源 - 基于Android实现的页面置换模拟
  10. python画柱状图-Python画柱状统计图操作示例【基于matplotlib库】
  11. zookeeper会话超时
  12. 基于Python的心电信号检测与处理
  13. mac电脑重装系统操作步骤
  14. etcd系列深入浅出客户端
  15. Unity MMO游戏架构设计之角色设计二
  16. 强化学习笔记3-Python/OpenAI/TensorFlow/ROS-规划博弈
  17. STM32CuBeMX驱动舵机
  18. Magento后台添加商品属性集属性集详细教程
  19. 中国「人造太阳」1.2亿摄氏度持续百秒,5倍时长打破可控核聚变世界纪录
  20. 优惠券通用测试要点 V1.1

热门文章

  1. 路侧停车系统是停车缺口解决方案之一
  2. Java 音乐播放器开发学习之——音频文件的播放
  3. django之html加载图片
  4. java如何缓存验证码图片_图片验证码概述及实现步骤
  5. 李双江之子打人遭警方羁押
  6. ECQs , Executive Core Qualifications
  7. 泰晤士报2013全球大学声望排行榜TOP100
  8. 【一行代码秒上云】Serverless六步构建全栈网站
  9. 3D建模师要学什么专业?
  10. 我未来的CS学习纲领