声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2963|回复: 6

[综合讨论] 有朋友用MATLAB实现动态矩阵控制(DMC)算法的请指教下

[复制链接]
发表于 2006-7-5 16:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我这有个动态矩阵控制(DMC)算法的程序调试时有问题,请大侠指教
联系方式:QQ:71347949
回复
分享到:

使用道具 举报

发表于 2006-7-5 21:21 | 显示全部楼层
我在毕业设计时做过DMC,你能说的具体一点吗?
我的邮箱是:fane123@gmail.com
 楼主| 发表于 2006-7-6 11:59 | 显示全部楼层
我这有个程序是用DMC编的,可是调试时有问题,老控不住,所以想请高人指点

我把程序发你油箱吧,大哥
发表于 2012-12-26 20:33 | 显示全部楼层
你好,楼主,不知道你这个问题现在解决了没,能发一份到我邮箱吗
发表于 2012-12-29 10:27 | 显示全部楼层
发表于 2012-12-29 10:29 | 显示全部楼层
我这人有个例子,你参考一下吧
  1. clc
  2. clear
  3. %DMC预测控制在加热系统温度控制中的应用仿真程序
  4. startvalue=0;%系统初始输出值
  5. x1=startvalue;       
  6. x2=0;
  7. c=3;%阶跃值
  8. pipestartvalue=0;%管温初始值
  9. step=250;%仿真长度
  10. P=80;%预测时域长度赋值
  11. M=2;%控制时域长度赋值
  12. Q=eye(P);%构造预测输出误差加权阵
  13. for i=1:1:15
  14. Q(i,i)=0;
  15. end%预测输出误差加权阵.对应纯滞后长度的权值取0
  16. S=zeros(P);%构造移位矩阵
  17. for i=1:1:P
  18. if i<P
  19. S(i,i+1)=1;
  20. end
  21. if i==P
  22. S(P,P)=1;
  23. end
  24. end
  25. Rl=eye(M);%构造控制增量加权矩阵R
  26. R=0.1*Rl;
  27. HT=linspace(1,1,P);
  28. H=HT;%构造误差校正向量
  29. for i=2:1:P
  30. H(i)=0.9;
  31. end
  32. d1=linspace(0,0,M);%构造向量d
  33. d1(1)=1;
  34. d=d1;
  35. %给阶跃响应序列al赋值
  36. a1=[2.1,2,2.2,2.19,2.18,2.17,2.16,2.15,2.19,2.20,2.11,2.2,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20];
  37. a1=a1*1;
  38. %计算AT
  39. for i=1:1:P
  40. for j=1:1:M
  41. if j<=i
  42. A(i,j)=a1(i-j+1);
  43. end
  44. if j>i&j<=M
  45. A(i,j)=0;
  46. end;
  47. if i>=M
  48. A(i,j)=a1(i-j+1);
  49. end
  50. end
  51. end
  52. AT=A';
  53. %计算DT
  54. DT=d*inv(AT*Q*A+R)*AT*Q;%计算得到行向量DT(1xP,1x80)
  55. a=a1(1:P);%计算a列向量(80x1,Pxl)
  56. qul=linspace(0,0,P);
  57. qul(1)=1;%构建取1向量
  58. for i=1:1:step
  59. Uk(i)=0;%初始化Uk,用来记录控制量
  60. Yk1(i)=0;%初始化Ykl,用来记录实际仿真输出值
  61. t(i)=i;%计时器
  62. end
  63. Uk=Uk';
  64. Yk1=Yk1';
  65. for i=1:1:P
  66. Y0(i)=startvalue;%初始化YO(i),YpOkl(i),Ycorkl(i)
  67. Yp0k1(i)=0;
  68. Ycork1(i)=0;
  69. end
  70. Y0=Y0';
  71. Yp0k1=Yp0k1';
  72. Ycork1=Ycork1';
  73. y1k1=0;
  74. daltauk=0;%初始化控制增量daltauk
  75. uk1=pipestartvalue;
  76. uk2=0;
  77. yk1=0;
  78. yk2=0;
  79. for n=1:1:step+90
  80. x2=(0.992^n)*x1+(1-0.992^n)*c;%参考轨迹参数a=0.992
  81. x1=x2;
  82. Yrk1(n)=1;%x2;%计算参考轨迹yrkl,记录到Yrkl(i)
  83. end;
  84. Yrk1=Yrk1;
  85. %仿真第一步
  86. Yp0k1=Y0;
  87. TempYrk1=Yrk1(1:P);
  88. daltauk=DT*(TempYrk1'-Yp0k1);
  89. uk2=uk1+daltauk;%计算控制量uk
  90. uk1=uk2;
  91. Uk(1)=uk1;
  92. Yk1(1)=Y0(1);%第一步采样值保存到Ykl;
  93. %第一步不用移位操作,直接取实际系统输出值作预测值
  94. yk1=Y0(1);
  95. Y1k1=Yp0k1+a'*daltauk;%一步预测
  96. %第二步及其以后步仿真
  97. for i=2:1:step       
  98. %前15步,由于纯滞后,所以输出值为0
  99. if i<=15
  100. %采样ykl
  101. yk2=0.9689*yk1+0.004644*0;%对象离散模型
  102. end
  103. if i>15
  104. yk2=0.9689*yk1+0.004644*Uk(i-15);
  105. end
  106. if yk2<=startvalue
  107. yk2=startvalue;
  108. end
  109. yk1=yk2;
  110. Yk1(i)=yk1;%采样结束,并保存到Yk1中
  111. YOk1=Y1k1;%开头大写表示向量,小写表示数值
  112. y1k1=qul*YOk1;%计算ylkl,既就是YOU的第一个元素
  113. Ycork1=YOk1+H'*(yk2-y1k1);%计算校正预测值
  114. YpOk1=S*Ycork1;%移位;计算初始预测值
  115. TempYrk2=Yrk1(i:i+P-1);
  116. daltauk=DT*(TempYrk2'-YpOk1);%计算控制增量
  117. uk2=uk1+daltauk;%计算控制摄uk
  118. if uk2>75       
  119. uk2=75;
  120. end
  121. if uk2<0
  122. uk2=0;
  123. end
  124. uk1=uk2;
  125. Uk(i)=uk1;
  126. Y1k1=YpOk1+a'*daltauk;%一步预测
  127. end
  128. Yrk1end=Yrk1(1:step);%整理计时器值,做曲线时使用
  129. %仿真程序结束
  130. [m_1,n_1]=size(Y1k1);
  131. ttt=1:1:m_1;
  132. figure(1);
  133. plot(ttt,Y1k1)
  134. grid on
  135. figure(2);
  136. plot(Yk1)
  137. grid on
复制代码
发表于 2012-12-29 10:29 | 显示全部楼层
我这人有个例子,你参考一下吧
  1. clc
  2. clear
  3. %DMC预测控制在加热系统温度控制中的应用仿真程序
  4. startvalue=0;%系统初始输出值
  5. x1=startvalue;       
  6. x2=0;
  7. c=3;%阶跃值
  8. pipestartvalue=0;%管温初始值
  9. step=250;%仿真长度
  10. P=80;%预测时域长度赋值
  11. M=2;%控制时域长度赋值
  12. Q=eye(P);%构造预测输出误差加权阵
  13. for i=1:1:15
  14. Q(i,i)=0;
  15. end%预测输出误差加权阵.对应纯滞后长度的权值取0
  16. S=zeros(P);%构造移位矩阵
  17. for i=1:1:P
  18. if i<P
  19. S(i,i+1)=1;
  20. end
  21. if i==P
  22. S(P,P)=1;
  23. end
  24. end
  25. Rl=eye(M);%构造控制增量加权矩阵R
  26. R=0.1*Rl;
  27. HT=linspace(1,1,P);
  28. H=HT;%构造误差校正向量
  29. for i=2:1:P
  30. H(i)=0.9;
  31. end
  32. d1=linspace(0,0,M);%构造向量d
  33. d1(1)=1;
  34. d=d1;
  35. %给阶跃响应序列al赋值
  36. a1=[2.1,2,2.2,2.19,2.18,2.17,2.16,2.15,2.19,2.20,2.11,2.2,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.11,2.12,2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20];
  37. a1=a1*1;
  38. %计算AT
  39. for i=1:1:P
  40. for j=1:1:M
  41. if j<=i
  42. A(i,j)=a1(i-j+1);
  43. end
  44. if j>i&j<=M
  45. A(i,j)=0;
  46. end;
  47. if i>=M
  48. A(i,j)=a1(i-j+1);
  49. end
  50. end
  51. end
  52. AT=A';
  53. %计算DT
  54. DT=d*inv(AT*Q*A+R)*AT*Q;%计算得到行向量DT(1xP,1x80)
  55. a=a1(1:P);%计算a列向量(80x1,Pxl)
  56. qul=linspace(0,0,P);
  57. qul(1)=1;%构建取1向量
  58. for i=1:1:step
  59. Uk(i)=0;%初始化Uk,用来记录控制量
  60. Yk1(i)=0;%初始化Ykl,用来记录实际仿真输出值
  61. t(i)=i;%计时器
  62. end
  63. Uk=Uk';
  64. Yk1=Yk1';
  65. for i=1:1:P
  66. Y0(i)=startvalue;%初始化YO(i),YpOkl(i),Ycorkl(i)
  67. Yp0k1(i)=0;
  68. Ycork1(i)=0;
  69. end
  70. Y0=Y0';
  71. Yp0k1=Yp0k1';
  72. Ycork1=Ycork1';
  73. y1k1=0;
  74. daltauk=0;%初始化控制增量daltauk
  75. uk1=pipestartvalue;
  76. uk2=0;
  77. yk1=0;
  78. yk2=0;
  79. for n=1:1:step+90
  80. x2=(0.992^n)*x1+(1-0.992^n)*c;%参考轨迹参数a=0.992
  81. x1=x2;
  82. Yrk1(n)=1;%x2;%计算参考轨迹yrkl,记录到Yrkl(i)
  83. end;
  84. Yrk1=Yrk1;
  85. %仿真第一步
  86. Yp0k1=Y0;
  87. TempYrk1=Yrk1(1:P);
  88. daltauk=DT*(TempYrk1'-Yp0k1);
  89. uk2=uk1+daltauk;%计算控制量uk
  90. uk1=uk2;
  91. Uk(1)=uk1;
  92. Yk1(1)=Y0(1);%第一步采样值保存到Ykl;
  93. %第一步不用移位操作,直接取实际系统输出值作预测值
  94. yk1=Y0(1);
  95. Y1k1=Yp0k1+a'*daltauk;%一步预测
  96. %第二步及其以后步仿真
  97. for i=2:1:step       
  98. %前15步,由于纯滞后,所以输出值为0
  99. if i<=15
  100. %采样ykl
  101. yk2=0.9689*yk1+0.004644*0;%对象离散模型
  102. end
  103. if i>15
  104. yk2=0.9689*yk1+0.004644*Uk(i-15);
  105. end
  106. if yk2<=startvalue
  107. yk2=startvalue;
  108. end
  109. yk1=yk2;
  110. Yk1(i)=yk1;%采样结束,并保存到Yk1中
  111. YOk1=Y1k1;%开头大写表示向量,小写表示数值
  112. y1k1=qul*YOk1;%计算ylkl,既就是YOU的第一个元素
  113. Ycork1=YOk1+H'*(yk2-y1k1);%计算校正预测值
  114. YpOk1=S*Ycork1;%移位;计算初始预测值
  115. TempYrk2=Yrk1(i:i+P-1);
  116. daltauk=DT*(TempYrk2'-YpOk1);%计算控制增量
  117. uk2=uk1+daltauk;%计算控制摄uk
  118. if uk2>75       
  119. uk2=75;
  120. end
  121. if uk2<0
  122. uk2=0;
  123. end
  124. uk1=uk2;
  125. Uk(i)=uk1;
  126. Y1k1=YpOk1+a'*daltauk;%一步预测
  127. end
  128. Yrk1end=Yrk1(1:step);%整理计时器值,做曲线时使用
  129. %仿真程序结束
  130. [m_1,n_1]=size(Y1k1);
  131. ttt=1:1:m_1;
  132. figure(1);
  133. plot(ttt,Y1k1)
  134. grid on
  135. figure(2);
  136. plot(Yk1)
  137. grid on
复制代码
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-24 07:18 , Processed in 0.100107 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表