简单DMC与MPC控制代码(MATLAB实现)
DMC(动态矩阵控制)和MPC(模型预测控制)均为基于模型的预测控制算法,核心是通过“预测-优化-滚动”三步实现闭环控制。
一、DMC(动态矩阵控制)代码
DMC基于阶跃响应模型,适用于渐近稳定的线性系统,核心是“控制增量”优化。
1.1 被控对象(一阶惯性系统)
设被控对象为一阶系统:
采样时间
1.2 DMC代码实现
%% 简单DMC控制代码(一阶系统)
clear; clc; close all;
%% 1. 系统参数与阶跃响应模型
Ts = 0.5; % 采样时间 (s)
T = 10; % 系统时间常数
K = 1; % 系统增益
N = 20; % 预测时域(阶跃响应系数个数)
a = zeros(1, N); % 阶跃响应系数
% 计算阶跃响应系数(一阶系统阶跃响应:y(t)=K(1-e^(-t/T)),离散化后a_i=y(i*Ts))
for i = 1:N
t = i * Ts;
a(i) = K * (1 - exp(-t/T)); % 阶跃响应值
end
a = a / a(end); % 归一化(可选,简化计算)
%% 2. DMC参数设置
Nc = 5; % 控制时域(控制增量个数)
lambda = 0.5; % 控制增量惩罚系数(越大,控制越平滑)
r = 1; % 设定值
u0 = 0; % 初始控制量
y0 = 0; % 初始输出
%% 3. 初始化变量
u = zeros(1, 100); % 控制量序列
y = zeros(1, 100); % 输出序列
y(1) = y0;
u(1) = u0;
% 控制增量矩阵(DMC核心:动态矩阵A)
A = zeros(N, Nc);
for i = 1:N
for j = 1:min(i, Nc)
A(i, j) = a(i - j + 1); % 动态矩阵元素A(i,j)=a(i-j+1)
end
end
%% 4. 仿真循环(100步)
for k = 1:99
% 4.1 参考轨迹(从当前输出平滑过渡到设定值)
yr = y(k) + (r - y(k)) * (1 - exp(-k/10)); % 一阶参考轨迹
% 4.2 预测输出(基于历史控制增量)
Yp = A * (u(k) - u(k-1) + zeros(Nc,1)); % 简化:仅用当前控制增量(实际需累积)
% 4.3 优化控制增量(最小化目标函数)
% 目标函数:J = ||Yp - Yr||² + lambda||ΔU||²,Yr为参考轨迹
Yr = repmat(yr, N, 1); % 参考轨迹矩阵
H = A'*A + lambda*eye(Nc); % Hessian矩阵
f = -A'*(Yr - Yp); % 线性项
delta_u = H\f; % 求解控制增量(简化:取第一个控制增量)
% 4.4 更新控制量与输出
u(k+1) = u(k) + delta_u(1); % 控制量更新(仅用第一个增量)
y(k+1) = 0.9*y(k) + 0.1*u(k); % 一阶系统离散模型(近似)
end
%% 5. 结果可视化
t = 0:Ts:(length(y)-1)*Ts;
figure;
subplot(2,1,1);
plot(t, y, 'b-', 'LineWidth', 1.5); hold on;
plot(t, r*ones(size(t)), 'r--', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('输出 y');
title('DMC控制效果'); legend('实际输出', '设定值'); grid on;
subplot(2,1,2);
plot(t, u, 'g-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('控制量 u');
title('控制量变化'); grid on;
二、MPC(模型预测控制)代码
MPC基于状态空间模型,通过预测时域内优化控制序列实现跟踪,核心是二次规划求解。
2.1 被控对象(一阶状态空间模型)
设系统状态空间模型:
其中
2.2 MPC代码实现
%% 简单MPC控制代码(一阶状态空间模型)
clear; clc; close all;
%% 1. 系统模型(状态空间)
A = 0.9; % 状态转移矩阵
B = 0.1; % 输入矩阵
C = 1; % 输出矩阵
Ts = 0.5; % 采样时间 (s)
%% 2. MPC参数设置
Np = 10; % 预测时域(预测Np步输出)
Nc = 3; % 控制时域(优化Nc步控制量)
Q = 1; % 输出误差权重
R = 0.1; % 控制增量权重
r = 1; % 设定值
%% 3. 初始化变量
x = 0; % 初始状态
u = 0; % 初始控制量
y = zeros(1, 100); % 输出序列
u_seq = zeros(1, Nc); % 控制序列
%% 4. 仿真循环(100步)
for k = 1:99
% 4.1 预测时域内状态与输出
Y_pred = zeros(Np, 1); % 预测输出
X_pred = zeros(Np, 1); % 预测状态
X_pred(1) = x; % 当前状态
for i = 1:Np-1
if i <= Nc
u_i = u_seq(i); % 控制序列内用优化值
else
u_i = u_seq(end); % 控制序列外用最后一个值
end
X_pred(i+1) = A*X_pred(i) + B*u_i;
Y_pred(i) = C*X_pred(i);
end
Y_pred(Np) = C*X_pred(Np);
% 4.2 构建预测输出误差矩阵(Φ)与控制增量矩阵(Γ)
Phi = zeros(Np, Nc);
Gamma = zeros(Np, Nc);
for i = 1:Np
for j = 1:min(i, Nc)
Phi(i,j) = C*A^(i-j)*B;
Gamma(i,j) = Phi(i,j);
end
end
% 4.3 优化目标函数(二次规划):min J = ||Y_pred - Y_ref||²Q + ||ΔU||²R
Y_ref = r * ones(Np, 1); % 参考轨迹(恒定设定值)
H = Gamma'*Q*Gamma + R*eye(Nc); % Hessian矩阵
f = Gamma'*Q*(Y_ref - Phi*u_seq); % 线性项(简化:u_seq初始为零)
% 4.4 求解控制增量(Δu = u_seq - u_prev)
delta_u = H\f; % 控制增量序列(解析解)
u_seq = u_seq + delta_u; % 更新控制序列
% 4.5 应用第一个控制量,更新状态与输出
u = u_seq(1); % 仅用第一个控制量
u_seq(2:end) = u_seq(1:end-1); % 控制序列滚动
x = A*x + B*u; % 更新状态
y(k+1) = C*x; % 更新输出
end
%% 5. 结果可视化
t = 0:Ts:(length(y)-1)*Ts;
figure;
subplot(2,1,1);
plot(t, y, 'b-', 'LineWidth', 1.5); hold on;
plot(t, r*ones(size(t)), 'r--', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('输出 y');
title('MPC控制效果'); legend('实际输出', '设定值'); grid on;
subplot(2,1,2);
plot(t, u, 'g-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('控制量 u');
title('控制量变化'); grid on;
三、核心区别与总结
| 算法 | 模型类型 | 核心思想 | 特点 |
|---|---|---|---|
| DMC | 阶跃响应模型 | 基于阶跃响应系数预测输出,优化控制增量 | 简单直观,适用于渐近稳定系统 |
| MPC | 状态空间/传递函数模型 | 预测时域内优化控制序列,滚动实施 | 通用性强,可处理约束和多变量 |
参考代码 简单的DMC以及MPC控制代码 www.youwenfan.com/contentcnt/160582.html
四、运行说明
- DMC代码:直接运行,输出为设定值跟踪曲线和控制量变化,一阶系统响应较慢,可通过调整
lambda(控制增量惩罚)加快响应。 - MPC代码:基于状态空间模型,预测时域
Np和控制时域Nc是关键参数(Np>Nc),可通过增大Q(输出权重)提高跟踪精度。