【原创】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);