logo资料库

DMC算法,经典.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
【原创】Matlab实现DMC控制加热炉程序
【原创】Matlab 实现 DMC 控制加热炉程序 DMC 单入单出控制程序 这是一个加热炉控制程序 程序是自己编的 请大家指正 Contents * 程序开始 * 建立传递函数 * 设置 PID 参数 * 主程序 初始化 DMC * DMC 程序 * 画图显示结果 %程序开始 clc; clear all; close all; %建立传递函数 G=tf(0.6,[2400 85 1]); set(G,'InputDelay',20); [y0,t0]=step(G,0:5:500); %设置 DMC 参数 Ts=5;%采样时间 N=60;%截断步长 P=25;%预测步长 m=1;%控制步长 % for m=1:3 Sv=10;%设定值 %主程序 初始化 DMC A=zeros(P,m);%动态矩阵 a=zeros(N,1); for i=1:N a(i)=y0(i); end for i=1:P for j=1:m if i-j+1>0 A(i,j)=a(i-j+1); end end end K=inv(A'*A+eye(m))*A'; ys=ones(N,1); y=zeros(N,1); u=zeros(N,1);
e=zeros(N,1); A0=zeros(P,N-1); for i=1:P for j=N-2:-1:1 if N-j+1+i-1<=N A0(i,j)=a(N-j+1+i-1)-a(N-j+i-1); else end A0(i,j)=0; end A0(i,N-1)=a(i+1); end %DMC 程序 for k=2:N Uk_1=zeros(N-1,1); for i=1:N-1 if k-N+i<=0 Uk_1(i)=0; else end Uk_1(i)=u(k-N+i); end Y0=A0*Uk_1; e(k)=y(k-1)-Y0(1); Ysk=zeros(P,1); for i=1:P Ysk(i)=Sv; end Ek=zeros(P,1); for i=1:P Ek(i)=e(k); end dertu=K*(Ysk-Y0-Ek); for i=1:m if k+i-1<=N u(k+i-1)=u(k+i-1-1)+dertu(i); end end temp=0; for j=1:N-1 if k-j<=0 temp; else if k-j-1<=0
temp=temp+a(j)*u(k-j); temp=temp+a(j)*(u(k-j)-u(k-j-1)); else end end end if k-N<=0 y(k)=temp+e(N); y(k)=temp+a(N)*u(k-N)+e(N); else end end %画图显示结果 t=Ts.*(1:N); subplot(2,1,1); plot(t,y,'.-'); legend('y','Location','Best'); title('输出曲线'); xlabel('Time') ylabel('振幅') grid on subplot(2,1,2); plot(t,u,'.-'); legend('控制作用 u','Location','Best') % if m==1 % % end % if m==2 % % end % if m==3 % % end % legend('控制作用 u:实线 m=1,虚线 m=2,点线 m=3','Location','Best') title('控制作用'); xlabel('Time') ylabel('振幅') grid on hold on % end plot(t,u,'--','LineWidth',2); plot(t,u,'-','LineWidth',2); plot(t,u,'.-','LineWidth',2);
分享到:
收藏