MPC算法

MPC

最优化控制和基本概念

研究动机(Motivation):在约束条件下达到最优的系统表现。

单输入单输出模型:

代价函数(Cost Function):

前一项q越小说明误差越小,效果越好。后一项越小,说明控制输入量越小,系统能耗也越小;最终要确定调节参数q,r的值使得代价函数 J 最小。(q和r更像一种权重)。

多输入多输出模型:

上述图片公式中公式解释:

x:这是描述系统内部"状态"的一组核心变量,比如位置、速度、温度、压力等。x是一个向量。

u:控制输入。这是我们可以操纵的变量,比如电机的电压、阀门的开度、推力的大小。u也是一个向量。

A矩阵:系统矩阵。它描述了系统状态 x自身如何随时间演化(内部动态)。

B矩阵:输入矩阵。它描述了控制输入 u如何影响系统状态 x的变化率。

物理意义:这个方程告诉我们,系统状态的变化率(dx/dt)由两部分组成:一部分是系统当前状态(Ax)决定的"惯性",另一部分是我们的控制输入(Bu)产生的"外力"。

y:系统输出。这是我们实际能测量或关心的量,通常由状态变量线性组合而成。它可能等于全部状态,也可能只是其中一部分。

C矩阵:输出矩阵。它将系统的内部状态 x映射为我们能观测到的输出 y。

MPC模型预测的步骤

通过模型来预测系统在某一未来时间段的表现来进行优化控制

常用离散型状态空间表达式:

MPC的三个步骤:

常用的优化策略

二次规划(QP问题)的一般形式:

二次规划的求解器现在有比较成熟的库/包(matlab和python等),我们做的主要是将我们的模型建立并且转换成二次规划的一般形式,然后用库函数求解。

MPC代价函数推导

对于一个系统的状态方程:







MPC示例代码(matlab实现)

MPC_Matrices.m

matlab 复制代码
function [E, H] = MPC_Matrices(A, B, Q, R, F, N)
    n = size(A, 1); 
    p = size(B, 2); 

    M = [eye(n); zeros(N*n, n)];

    C = zeros((N+1)*n, N*p);
    tmp = eye(n); 

    for i = 1:N 
        rows = i*n + (1:n); 
        C(rows, :) = [tmp*B, C(rows-n, 1:end-p)]; 
        tmp = A * tmp; 
        M(rows, :) = tmp; 
    end

    Q_bar = kron(eye(N), Q);
    Q_bar = blkdiag(Q_bar, F);
    R_bar = kron(eye(N), R); 

    G = M' * Q_bar * M; % G: n x n
    E = M' * Q_bar * C; % E: n x NP
    H = C' * Q_bar * C + R_bar; % H: NP x NP

    %H = (H + H') / 2;

end

Prediction.m

matlab 复制代码
function u_k = Prediction(x_k, E, H, N, p)
   
    U_k = zeros(N*p, 1);

    % Solve the quadratic programming problem
    U_k = quadprog(2*H,2*E'*x_k);

    % Extract the control action for the first step
    u_k = U_k(1:p,1); % 取第一个结果
end

MPC_Test.m

matlab 复制代码
function u_k = Prediction(x_k, E, H, N, p)
    U_k = zeros(N*p, 1);
    U_k = quadprog(2*H,2*E'*x_k);
    u_k = U_k(1:p,1); % 取第一个结果
end
相关推荐
Zldaisy3d4 分钟前
全球唯一仿真驱动自适应扫描路径新版本发布,金属3D打印工艺开发进入算法时代
算法·3d
小江的记录本8 分钟前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
故事和你9141 分钟前
洛谷-【动态规划2】线性状态动态规划4
开发语言·数据结构·c++·算法·动态规划·图论
不吃土豆的马铃薯44 分钟前
Socket 网络编程实战教程
linux·服务器·开发语言·网络·c++·算法
weixin_468466852 小时前
图像滤波算法新手实战指南
图像处理·人工智能·算法·计算机视觉·ai·机器视觉·滤波
Ulyanov2 小时前
深入QML-Python通信 构建响应式交互界面的桥梁设计:QML+PySide6现代开发入门(五)
开发语言·python·算法·交互·qml·系统仿真
重生之我是Java开发战士2 小时前
【贪心算法】加油站,单调递增的数字,坏了的计算器,合并区间,用最少数量的箭引爆气球
算法·贪心算法
小欣加油2 小时前
leetcode 3300 替换为数位和后的最小元素
数据结构·c++·算法·leetcode
晚风予卿云月2 小时前
【枚举】普通枚举
数据结构·c++·算法·竞赛·算法随笔
IronMurphy2 小时前
【算法五十三】1143. 最长公共子序列
算法