1 %预测控制书上的P79例5-1 得到的输出曲线趋近于无穷 不对 不知错误在哪里   pid控制器也是趋近于无穷大
  2 %不明白采样周期Ts怎么用,什么意思???
  3 %将阶跃响应 离散状态空间模型的采样周期都设为Ts=5 预测步长P=50 M=1都有了很好的效果
  4 %所以有两个重要的参数:采样周期Ts 预测步长P    还有M参数的作用,要弄清楚
  5 clear all
  6 %传递函数模型
  7 %{
  8 num=[8611.77];
  9 p1=[1,1.1,36.3025];
 10 p2=[1,0.5,237.2225];
 11 den=conv(p1,p2);
 12 sys=tf(num,den);
 13 %}
 14 sys=tf(0.6,[2400 85 1]);
 15
 16 Ts=5;%Ts为采样周期
 17 delay=0;%延迟时间  即纯滞后模块
 18 startvalue=0;%系统初始输出值
 19 x1=startvalue;
 20 x2=0;
 21 c=3;%阶跃值
 22 pipestartvalue=0;%管温初始值
 23 step1=101;%仿真长度  注意变量名字不能与MATLAB中的函数名相同 否则函数不能再调用
 24 %P=50;%效果最好 之前一直不稳定 可能是因为P取得太小  或者是采样周期T保持了一致
 25 %M=1;
 26 P=50;
 27 M=1;
 28 Q=eye(P);%构造预测输出误差加权矩阵
 29 for i=1:1:delay
 30     Q(i,i)=0;
 31 end %预测输出误差加权阵,对应纯滞后长度的权值为0
 32 S=zeros(P);%构造移位矩阵
 33 for i=1:1:P
 34     if i<P
 35         S(i,i+1)=1;
 36     end
 37     if i==P
 38         S(P,P)=1;
 39     end
 40 end
 41 R1=eye(M);%构造控制增量加权矩阵R
 42 %R=0.1*R1;
 43 R=0.0*R1;
 44 HT=linspace(1,1,P);
 45 H=HT';%构造误差校正向量
 46 for i=2:1:P
 47     H(i)=0.9;
 48 end
 49 d1=linspace(0,0,M);%构造向量d
 50 d1(1)=1;
 51 d=d1;
 52
 53 %给单位阶跃响应序列a1赋值
 54 %{
 55 for i=1:1:step1
 56     a11(i)=1*(1-exp(-i*T/60));%采样周期T
 57 end
 58 figure
 59 plot(a11);title('阶跃响应1');
 60 %}
 61 t=0:5:500;
 62 %t=0:0.5:100;
 63 [a11,t0]=step(sys,t);%横轴时间与书上的数量级相差太大,不知原因
 64 figure
 65 plot(a11);title('阶跃响应step');
 66 %{
 67 for i=1:1:40
 68     a11(i)=a1(10*i);%为了与书上的数量级保持一致 乘以系数 求预测模型参数  书上的例5-1
 69 end
 70 %}
 71 %{
 72 a1=1-1.1835*exp(-0.55*t).*sin(6*t+1.4973)-0.18038*exp(-0.25*t).*sin(15.4*t-1.541);
 73 figure
 74 plot(a1);title('表达式求得的阶跃响应');
 75 %}
 76
 77 %计算AT A为动态矩阵,AT为其转置
 78 for i=1:1:P
 79     for j=1:1:M
 80         if j<=i
 81            A(i,j)=a11(i-j+1);
 82         end
 83         if j>i&j<M
 84             A(i,j)=0;
 85         end
 86         if i>M
 87             A(i,j)=a11(i-j+1);
 88         end
 89     end
 90 end
 91 AT=A';
 92 %计算DT
 93 DT=d*inv(AT*Q*A+R)*AT*Q;%计算得到控制向量DT
 94 a=a11(1:P);%计算a列向量
 95 %a=a';% %
 96 qu1=linspace(0,0,P);
 97 qu1(1)=1;%构建取1向量
 98 for i=1:1:step1
 99     Uk(i)=0;%初始化UK,用来记录控制量
100     Yk1(i)=0;%初始化Yk1,用来记录实际仿真输出值
101 end
102 Uk=Uk';
103 Yk1=Yk1';
104 for i=1:1:P
105     Y0(i)=startvalue;%初始化
106     Yp0k1(i)=0;
107     Ycork1(i)=0;
108 end
109 Y0=Y0';
110 Yp0k1=Yp0k1';
111 Ycork1=Ycork1';
112 y1k1=0;
113 daltauk=0;%初始化控制增量
114 uk1=pipestartvalue;% 0
115 uk2=0;
116 yk1=0;
117 yk2=0;
118 for n=1:1:step1+90
119     %x2=(0.98^(n*1))*1+(1-0.98^(n*1))*c;%参考轨迹参数a=0.992
120     %x1=x2;
121     Yrk1(n)=3;%计算参考轨迹yrk1,记录到Yrk1(i)
122     %参考轨迹设为定值3  可以看出PID控制器输出有超调,而DMC可以快速稳定的达到设定值 无超调
123 end
124 Yrk1=Yrk1';
125 %仿真第一步
126 Yp0k1=Y0;
127 TempYrk1=Yrk1(1:P);
128 daltauk=DT*(TempYrk1-Yp0k1);
129 uk2=uk1+daltauk;%计算当前控制量uk
130 uk1=uk2;
131 Uk(1)=uk1;
132 Yk1(1)=Y0(1);%第一步采样值保存到Yk1
133 yk1=Y0(1);%第一步不用移位操作,直接取实际系统的输出值作为预测值
134 Y1k1=Yp0k1+a*daltauk;%一步预测
135 %{
136 %Ts=5;
137 As=[ -1.6,-17.13,-2.18,-8.41;16,0,0, 0; 0,8,0,0;0,0,8,0];%状态空间方程系数
138 As=eye(4)+As*Ts;
139 Bs=[4;0;0;0];
140 Bs=Bs*Ts;
141 Cs=[0,0,0,2.102];
142 xs0=[0;0;0;0];
143 xs1=[0;0;0;0];
144 %}
145
146 %Ts=5;
147 As=[-0.03542,-0.02667;0.01563,0];
148 As=eye(2)+As*Ts;
149 Bs=[0.125;0];
150 Bs=Bs*Ts;
151 Cs=[0,0.128];
152 xs0=[0;0];
153 xs1=[0;0];
154
155 %第二步及其以后的仿真
156 for i=2:1:step1
157     %前15步,由于纯滞后,所以输出为0
158     %if i<=delay
159         %采样 yk1
160         %yk2=-0.01667*yk1+0.125*0.1333*0;%对象离散模型
161         %yk2=-0.2315*yk1+0.6991*0;
162     %end
163     %if i>delay
164         %yk2=-0.01667*yk1+0.125*0.1333*Uk(i-delay);%离散模型的参数
165         %yk2=-0.2315*yk1+0.6991*Uk(i-delay);
166     %end
167     xs1=As*xs0+Bs*uk1;
168     yk2=Cs*xs1;
169     xs0=xs1;
170
171     %if yk2<=startvalue
172        % yk2=startvalue;
173     %end
174     yk1=yk2;
175     Yk1(i)=yk1;%采样结束,并保存到Yk1中
176     Y0k1=Y1k1;
177     y1k1=qu1*Y0k1;%计算y1k1,即Y0k1的第一个元素
178     Ycork1=Y0k1+H*(yk2-y1k1);%计算校正预测值
179     Yp0k1=S*Ycork1;%移位,计算初始预测值
180     TempYrk2=Yrk1(i:i+P-1);
181     daltauk=DT*(TempYrk2-Yp0k1);
182     uk2=uk1+daltauk;
183     %{
184     if uk2>4;
185         uk2=4;
186     end
187     %}
188     if uk2<0
189         uk2=0;
190     end
191
192     uk1=uk2;
193     Uk(i)=uk1;
194     Y1k1=Yp0k1+a*daltauk;%一步预测
195 end
196 Yrklend=Yrk1(1:step1);%整理计时器值,做曲线时使用
197 figure
198 x=Ts*(1:step1);
199 plot(t,Yrklend,t,Yk1);%将实际输出与期望输出两条曲线画在一张图中,要保证二者矢量长度相同
200 title(['预测时域P=',num2str(P)]);
201
202 %以下为增量式PID控制算法
203 y(1)=0;
204 kp=0.35; % 0.4效果会好一些 曲线形式相同
205 ki=0.1; % 0.54
206 kd=0.62; % 0.2
207 actual=0;
208 e=0;
209 e1=0;
210 e2=0;
211 uk0_pid=0;
212 x0=[0;0];
213 x1=[0;0];
214
215 for i=1:1:step1-1
216         e=Yrk1(i)-actual;
217         %e=set-actual;
218         increase=kp*(e-e1)+ki*(e)+kd*(e-2*e1+e2);
219         uk_pid=uk0_pid+increase;
220         %y(i+1)=-0.2315*y(i)+0.6991*uk_pid;%离散模型参数  离散模型参数可由传递函数得到ss(system)
221
222         x1=As*x0+Bs*uk_pid;
223         y(i+1)=Cs*x1;
224         x0=x1;
225
226         e1=e;
227         e2=e1;
228         actual=y(i+1);
229         uk0_pid=uk_pid;
230         nums(i)=e;
231 end
232 Yrklend=Yrk1(1:step1);
233 x=1.*(1:step1);
234 figure
235 plot(x,Yk1,'b',x,y,'r');%将DMC控制与PID控制的输出值,画在一张表上进行比较
236 title(['预测时域P=',num2str(P)]);
237 figure
238 plot(x,y,'r');title(['采样周期Ts=',num2str(Ts)]);%PID控制器输出曲线

注意参数的选择,尤其是采样周期Ts,控制时域P,一般都是先选定M,再调整P

转载于:https://www.cnblogs.com/1987-05-04/p/6957020.html

动态矩阵控制 MATLAB代码相关推荐

  1. 动态矩阵控制matlab程序_【实时关注】你了解MATLAB吗?

    你了解MATLAB吗? MATLAB(矩阵实验室),全称为matrix laboratory.是由美国mathworks公司发布的主要面对科学计算.可视化以及交互式程序设计的高科技计算环境. 20世纪 ...

  2. 席裕庚《预测控制》学习记录 (一)-基于阶跃响应的动态矩阵控制(DMC)包含仿真

    本文除了黑体部分均为<预测控制>一书中的知识点,感觉像之前的ADRC只放个仿真不太好,就把原理也写上了 简介 模型预测控制(Model Predictive Control,MPC),或简 ...

  3. 混沌系统matlab程序,dynamos混沌系统的追踪控制matlab代码

    dynamos混沌系统的追踪控制matlab代码 Mahmoud 提出了一个非常复杂的含有复数向量的 Dynamos 混沌 系统,该系统在电磁场方面有潜在的非常广泛应用.其动力学系统方 程为其中,x ...

  4. 模型预测控制(MPC)——动态矩阵控制(DMC)

    目录 一.模型预测的发展 1.1.先进控制技术及其分类 1.2.工业过程特点 1.3.预测控制的产生 1.4.模型预测控制系统大致包括四部分 1.5.模型预测控制历史 1.6.模型预测 1.7.滚动优 ...

  5. ​【优化求解】基于人工蜂群算法求解无刷直流电机PID控制matlab代码

    1 简介 高精度的精密微位移系统在近代尖端工业生产和科学研究领域内占有极其重要的地位.它广泛应用于航空航天.微型机械制造.超精密加工.医学.生物工程等领域.纳米级位移定位技术已经成为推动科技发展的前进 ...

  6. 多天线MIMO无线信道中,已知CSI时,关于莱斯信道(瑞利信道)矩阵的MATLAB代码。

    莱斯分布(Rice distribution或Riciandistribution)是一种连续概率分布,用于在概率论与数理统计领域中,以美国科学家斯蒂芬·莱斯 [1]  (Stephen O. Ric ...

  7. 追赶法求解块三对角矩阵以及matlab代码实现

    数值分析课的作业 单从题目来看,矩阵A和矩阵B都是三对角矩阵 参考资料:块三对角矩阵方程的追赶法及其应用 - 豆丁网Docin 推导过程如下: 求解matlab程序: function x=tridi ...

  8. 学习随笔#15 MPC控制MATLAB代码详解

      MPC控制的详细数学推导可以参照文章:一个MPC详细建模的例子.MATLAB/SIMULINK中自带有MPC相关的工具,但本文给出MPC控制的MATLAB程序. function [M, C, Q ...

  9. 【ADC】分析ADC动态参数的MATLAB代码

    首先将cadence中波形导出,为matlab程序备用.(这里的cadence波形可以是经过理想DAC后还原的一个输出波形,也可以是未还原的几组数字信号,因为测试需要,我采用的是后一种.) 具体的导出 ...

最新文章

  1. F5内网大二层负载均衡业务访问故障解析(CISCO OTV+LISP-MTU问题导致)
  2. 分享Silverlight/WPF/Windows Phone一周学习导读(3月14日-3月19日)
  3. 一起 goroutine 泄漏问题的排查
  4. 一分钟学会在Mac中如何将文件批量重命名
  5. mysql排序显示行数的语句_MySQL中sql语句count(*),orderby,随机数据展示。
  6. 插入排序算法(C实现)
  7. jQuery之.queue()
  8. 如何安装mysql 5.72_linux安装MySQL5.7.13(二进制|源码)
  9. 用acdess制作html文件,使用ACDSee制作图片注释
  10. 【CVPR 2021】Revisiting Knowledge Distillation: An Inheritance and Exploration Framework
  11. MySQL实战宝典 高可用架构篇 17 高可用设计三大高可用设计架构方案
  12. java dismiss_窗口泄漏甚至在dialog.dismiss()
  13. 【已解决】mysql报错error Found option without preceding group in config file Dmysql-5.7.25-win32
  14. intellij idea 类和文件夹(目录)左上角出现小叉号
  15. Xcode 4.1~4.6 + iOS 5、iOS 6免证书(iDP)开发+真机调试+生成IPA全攻略
  16. 每周分享第 21 期
  17. FPGA入门系列12--RAM的使用
  18. CF1514C---数论
  19. 基于SDN的蜜网技术概述
  20. 下载和安装配置 MinGW-w64(免安装版)

热门文章

  1. Java栈和局部变量操作(二)
  2. vue[源码]你不知道的observe!
  3. Java Data Access Object Pattern(数据访问对象模式)
  4. 数据泄漏保护:你的企业的投资是否足够?
  5. Re:[转]如何基于discuz开发网站通行证的功能
  6. 单机版 hadoop 云平台(伪分布式)搭建 统计单词
  7. python 删除字符串中空格
  8. OpenCV 色彩空间的改变
  9. 浏览器用xpath获取一直为空
  10. Linux 设置端口转发