带有前馈-反馈的DMC控制算法
原理介绍,matlab的代码实现,并注释下
采用粒子群算法寻优该结构的P M Q R H
matlab
% 设置控制器参数
P = 30; % 控制时域
M = 20; % 预测时域
Q = 1; % 控制输入变量个数
R = 1; % 控制输出变量个数
H = 0.1; % 控制器采样时间
% 设定实际系统的模型
% 系统矩阵、输入矩阵、输出矩阵可以通过系统辨识得到
A = [...];
B = [...];
C = [...];
% 初始化模型参数
N = P + M - 1;
PHI = zeros(N*R, Q*N);
F = zeros(N*R, M*R);
G = zeros(N*R, (P-1)*R);
% 构建预测模型矩阵
for i = 1:N
for j = 1:Q
if i+j-1<=P
PHI(R*(i-1)+1:R*i, Q*(j-1)+1:Q*j) = C*A^(i-j)*B;
else
PHI(R*(i-1)+1:R*i, Q*(j-1)+1:Q*j) = zeros(R, Q);
end
end
end
% 构建前馈控制器矩阵
for i = 1:N
for j = 1:M
if i>=j
F(R*(i-1)+1:R*i, R*(j-1)+1:R*j) = C*A^(i-j)*B;
end
end
end
% 构建反馈控制器矩阵
for i = 1:N
for j = 1:(P-1)
if i>=j+1
G(R*(i-1)+1:R*i, R*(j-1)+1:R*j) = C*A^(i-j-1)*B;
end
end
end
% 初始化控制器参数
x = zeros(N*R,1);
u = zeros(Q,1);
% 设定系统输入输出参考值
u_sp = [...];
y_sp = [...];
% 控制循环
for k = 1:200
% 从实际系统中获取当前的状态
y = [...];
% 计算控制器输出
e = y_sp(:,k) - y;
du = G*x + F*reshape(y_pred, [], 1);
u = u + du(1:Q);
% 执行控制器输出
[...]
% 计算预测模型的预测值
y_pred = zeros(M,1);
for i = 1:M
if i == 1
y_pred(i) = C*x + F(1:R,:)*reshape(u, [], 1);
else
y_pred(i) = C*A*y_pred(i-1) + F(R*(i-1)+1:R*i,:)*reshape(u, [], 1);
end
end
% 更新状态量
for i = N:-1:1
if i == N
x(R*(N-1)+1:R*N) = PHI(R*(N-1)+1:R*N,:)*x + F(1:R,:)*reshape(u, [], 1);
elseif i >= P
x(R*(i-1)+1:R*i) = PHI(R*(i-1)+1:R*i,:)*x + F(R*(P-1)+1:end,:)*reshape(y_pred, [], 1) + G(R*(i-P)+1:R*(i-P+1),:)*reshape(u_sp(:,k-P+1:k-i), [], 1);
else
x(R*(i-1)+1:R*i) = PHI(R*(i-1)+1:R*i,:)*x + F(R*(i-1)+1:end,:)*reshape(y_pred, [], 1) + G(1:R*i,:)*reshape(u_sp(:,k-P+1:k-i), [], 1);
end
end
end