简单DMC与MPC控制代码(MATLAB实现)

简单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

四、运行说明

  1. DMC代码:直接运行,输出为设定值跟踪曲线和控制量变化,一阶系统响应较慢,可通过调整 lambda(控制增量惩罚)加快响应。
  2. MPC代码:基于状态空间模型,预测时域 Np 和控制时域 Nc 是关键参数(Np>Nc),可通过增大 Q(输出权重)提高跟踪精度。

专注于matlab/simulink,电子电路,编程