dmc算法matlab
时间: 2023-07-01 14:21:17 浏览: 171
以下是DMC算法的Matlab代码示例:
```matlab
% 系统模型参数
A = [1.2, -0.4; 0.5, 0.2];
B = [0.3; 0.2];
C = [1, 0];
D = 0;
Ts = 1; % 采样周期
% 控制器参数
N = 3; % 预测步数
Nu = 2; % 控制步数
lambda = 1; % 超调系数
rho = 1; % 控制惩罚权重
% 仿真参数
t = 0:Ts:50;
r = ones(size(t));
y = zeros(size(t));
u = zeros(size(t));
% DMC算法主程序
% 计算M和Mp矩阵
M = zeros(N, Nu);
Mp = zeros(N, length(t)-1);
for i=1:N
for j=1:Nu
if i>=j
M(i,j) = C * A^(i-j) * B;
end
end
end
for i=1:N
for j=1:length(t)-1
if i+j<=length(t)
Mp(i,j) = C * A^i * B;
else
Mp(i,j) = C * A^i * B;
for k=1:i+j-length(t)
Mp(i,j) = Mp(i,j) + C * A^(i-k) * B * u(length(t)-1-(i-k));
end
end
end
end
% 权重矩阵Q和R
Q = eye(N) * rho;
R = lambda * eye(Nu);
% 初始化变量
du = zeros(Nu, 1);
deltau = zeros(Nu, 1);
y_ref = zeros(N, 1);
% 开始仿真
for i=1:length(t)-1
% 计算控制器输出
y_ref(1:N-1) = y(i+1:i+N-1) - y(i); % 参考输出
y_ref(N) = r(i+N) - y(i); % 预测N步后的参考输出
deltau = inv(M' * M + R) * M' * (y_ref - Mp * du);
du = du + deltau;
u(i+1) = u(i) + du(1);
du(1:Nu-1) = du(2:Nu);
du(Nu) = 0;
% 计算系统输出
y(i+1) = C * A * y(i) + B * u(i+1);
end
% 画图
plot(t, r, 'k--', t, y, 'b', t, u, 'r');
legend('参考输入', '系统输出', '控制输入');
xlabel('时间');
```
以上代码中,我们首先定义了系统模型的参数,包括状态矩阵A、输入矩阵B、输出矩阵C和常数D,以及采样周期Ts。然后我们定义了DMC控制器的参数,包括预测步数N、控制步数Nu、超调系数lambda和控制惩罚权重rho。接着我们定义了仿真参数,包括仿真时间t、参考输入r、系统输出y和控制输入u。
在DMC算法主程序中,我们首先计算了M和Mp矩阵,然后定义了权重矩阵Q和R。接着我们进行了初始化,然后开始仿真。在每个仿真步骤中,我们首先计算控制器输出,然后计算系统输出,最后更新变量。
最后我们画出了参考输入、系统输出和控制输入随时间变化的图形。
阅读全文