Matlab高斯分布输入的PID控制

一、matlab的随机数组

s=1:1:500;
in = 0.1*randn(1,500)+1;
plot(s,in,‘*‘);

hist(in,20);

二、PID控制

网上源码:

clear all;
close all;

ts=0.001;
sys=tf(5.235e005,[1,87.35,1.047e004,0]);%建立传递函数
dsys=c2d(sys,ts,‘z‘);%将连续的时间模型转换成离散的时间模型,采样时间是ts=0.001
[num,den]=tfdata(dsys,‘v‘);%获得离散后的分子分母

u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]‘;
error_1=0;

for k=1:1:500
time(k)=k*ts;

rin(k) = 1 ; %输入为(0.8,1.2)上高斯分布的的随机数
kp=0.6;ki=0.001;kd=0.001; %设置的P,I,D参数 

u(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller

%Linear model 线性模型
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;

error(k)=rin(k)-yout(k);

%Return of parameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);

x(1)=error(k); %Calculating P
x(2)=(error(k)-error_1)/ts; %Calculating
x(3)=x(3)+error(k)*ts; %Calculating I
xi(k)=x(3);

error_1=error(k);
end
figure(1);
plot(time,rin,‘b‘,time,yout,‘r‘);
xlabel(‘time(s)‘);ylabel(‘rin,yout‘)

  

三、高斯分布的输入

%PID Controler
clear all;
close all;

s=1:1:500;
in = 0.1*randn(1,500)+1; %取500个(0.95,1.05)上高斯分布的的随机数
% plot(s,in,‘*‘);grid on

ts=0.001;
sys=tf(5.235e005,[1,87.35,1.047e004,0]);%建立传递函数
dsys=c2d(sys,ts,‘z‘);%将连续的时间模型转换成离散的时间模型,采样时间是ts=0.001
[num,den]=tfdata(dsys,‘v‘);%获得离散后的分子分母

u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]‘;
error_1=0;

for k=1:1:500
time(k)=k*ts;

rin(k) = in(k) ; %输入为(0.95,1.05)上高斯分布的的随机数
kp=0.6;ki=0.001;kd=0.001; %设置的P,I,D参数 

u(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller

%Linear model 线性模型
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;

error(k)=rin(k)-yout(k);

%Return of parameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);

x(1)=error(k); %Calculating P
x(2)=(error(k)-error_1)/ts; %Calculating
x(3)=x(3)+error(k)*ts; %Calculating I
xi(k)=x(3);

error_1=error(k);
end
figure(1);
plot(time,rin,‘b‘,time,yout,‘r‘);
xlabel(‘time(s)‘);ylabel(‘rin,yout‘);

  

效果不错,还挺开心。下次做个基于退火的自整定控制系统

时间: 2024-10-09 22:01:08

Matlab高斯分布输入的PID控制的相关文章

两轮自平衡小车双闭环PID控制设计

                                                                                        两轮自平衡小车的研究意义 1.1两轮平衡车的研究意义 两轮平衡车是一种能够感知环境,并且能够进行分析判断然后进行行为控制的多功能的系统,是移动机器人的一种.在运动控制领域中,为了研究控制算法,建立两轮平衡车去验证控制算法也是非常有用的,这使得在研究自动控制领域理论时,两轮平衡车也被作为课题,被广泛研究.对于两轮平衡车模型的

四轴飞行器飞行原理与双闭环PID控制

四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的运用前景. 四轴飞行器关键技术在于控制策略.由于智能控制算法在运行复杂的浮点型运算以及矩阵运算时,微处理器计算能力受限,难以达到飞行控制实时性的要求:而PID控制简单,易于实现,且技术成熟,因此目前主流的控制策略主要是围绕传统的PID控制展开. 1 四轴飞行器的结构与基本飞行原理 四轴飞行器结构主要

Codesys——AD_DA在PID控制中的作用

1. 摘要 PID控制中用到AD/DA的输入/输出,给出其大致实现思路. 2. 思路 3. 总结 无

SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定

摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为底盘包含软硬件整套解决方案,是很多机器人公司的核心技术,一般不会随便公开.出于强烈的求知欲与学习热情,我想自己DIY一整套两轮差分底盘,并且将完整的设计过程公开出去供大家学习.说干就干,本章节主要内容: 1.stm32主控硬件设计 2.stm32主控软件设计 3.底盘通信协议 4.底盘ROS驱动开发

PID控制動手玩玩看

PID控制動手玩玩看 PID三個參數到底該怎麼調才好,真的是一門藝術. 雖然在Marlin韌體內有提供自動測量的功能,但是測得的結果,不見得能令人滿意,還是需要調整.可是到底該怎麼調整?從哪個參數開始動手?數值該增加還是該減小?會不會調整了這個,又需要回頭調整上一個?整個調整過程實在是亂七八糟,不容易理出頭緒.在加上實驗需要時間,可是有一直找不出最佳參數,實在有夠累人. 今天我不曉得是哪根筋不對,突然想說可以用excel模擬PID溫度控制,這樣就可以很快得得到實驗結果,增加調整PID參數的經驗.

Matlab 高斯分布 均匀分布 以及其他分布 的随机数

Matlab 高斯分布 均匀分布 以及其他分布 的随机数 betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布的随机数生成器 frnd f分布的随机数生成器 gamrnd 伽玛分布的随机数生成器 geornd 几何分布的随机数生成器 hygernd 超几何分布的随机数生成器 lognrnd 对数正态分布的随机数生成器 nbinrnd 负二项分布的随机数生成器 ncfrnd 非中心f分布的随机数生成器 nct

简单几步实现 IOS UITextField输入长度的控制

在ios开发过程中,我们有时候需要对UITextField的输入长度进行控制,比如输入手机号码最大长度为11位等,而ios自身又不像android那样可以设置输入框的输入长度,接下来通过简单几步实现这个功能: 1.新建一个类继续UITextField比如这个类叫MyUITextField 2.声明一个变量用来记录输入的最大长度 3.添加一个事件用于监听输入框输入值的变化 4.通过判断当前text字符串的长度是否大于最大长度来截取字符串并赋值給当前text保证text字符串的值始为指指定的最大长度

js正则实现用户输入银行卡号的控制及格式化

//js正则实现用户输入银行卡号的控制及格式化 <script language="javascript" type="text/javascript"> function formatBankNo (BankNo){ if (BankNo.value == "") return; var account = new String (BankNo.value); account = account.substring(0,22); /

关于C++ 输入输出流状态控制

关于这一点呢,是在做<C++primer >关联容器map的一道习题中发现这个蛋疼的问题的. 问题是这样的: 我想要将while循环条件设置为cin,这样就可以不断等待输入,普通的程序可以直接按下ctrl+z中止输入,麻烦在于这里有两层这样的while循环,而ctrl+z会一次性全部退出,导致无法实现想要的目的(在每个外层循环内部,可以输入有限量可中止的内层循环变量,也就是说第一次按下ctrl+z只停止内层的循环,等待进行下一次外层循环,然后再进入内层循环……) 1 #include<&