dmc-pid串级控制matlab代码
时间: 2023-07-23 18:12:49 浏览: 187
pid控制matlab
3星 · 编辑精心推荐
以下是一个基于DMC-PID串级控制的Matlab代码示例:
```matlab
% 系统模型
s = tf('s');
G1 = 1/(s*(s+1));
G2 = 1/(0.5*s+1);
% 控制器参数
N = 50; % 预测步数
Nu = 20; % 控制步数
lambda = 1; % 控制器惩罚因子
M = 2; % 串级控制器个数
% DMC-PID串级控制器
for i = 1:M
if i == 1
Gc = dmc_pid(G1,N,Nu,lambda);
else
Gc = dmc_pid(G2,N,Nu,lambda);
end
if i == 1
G = G1;
else
G = G2;
end
Gcl{i} = feedback(G*Gc,1);
end
% 绘图比较
t = 0:0.01:10;
u = sin(t);
[y1,t] = lsim(Gcl{1},u,t);
[y2,t] = lsim(Gcl{2},y1,t);
plot(t,u,'b',t,y1,'r',t,y2,'g');
legend('输入信号','一级控制输出','二级控制输出');
% DMC-PID控制器函数
function Gc = dmc_pid(G,N,Nu,lambda)
% 系统阶数
[n,m] = size(G);
% 计算K、Ku和Ke
D = zeros(N,Nu);
for i = 1:N
for j = 1:Nu
if (i >= j)
D(i,j) = G(i-j+1);
end
end
end
K = inv(D'*D+lambda*eye(Nu))*D';
Ku = K(1,:)*D;
Ke = sum(K(1,:));
% 控制器参数计算
deltau = zeros(Nu,1);
y = zeros(n,1);
yp = zeros(n,N);
ym = zeros(n,Nu);
du = zeros(Nu,1);
% 控制器函数
function u = controller(yd,y)
% 计算deltau
e = yd-y;
deltau(2:Nu) = deltau(1:Nu-1);
deltau(1) = Ku*e-Ke*du;
% 计算u
du = deltau(1)+K(2:end,:)*deltau;
u = du(1);
end
% 控制器输出函数
function [y,t] = output(u,t)
for k = 1:length(t)
y(k) = G*[u(k);y(k-1:-1:max(k-N+1,1))];
ym(:,2:Nu) = ym(:,1:Nu-1);
ym(:,1) = y-yd(k);
deltau = K*ym(:);
du = deltau(1)+K(2:end,:)*deltau;
u(k) = u(k-1)+du(1);
end
end
% 输出控制器函数
Gc = @controller;
Gc.output = @output;
end
```
需要注意的是,DMC-PID串级控制器需要对每个控制器单独进行参数计算,然后将其级联起来形成串级控制器。在控制器函数中,需要计算deltau和u两个变量,并在每个采样周期内更新控制器输出。在控制器输出函数中,需要计算系统输出和误差,并根据误差计算deltau和du,最终得到控制器输出u。
阅读全文