qq_42625379 2023-02-26 18:12 采纳率: 0%
浏览 78
已结题

matlab中的mpc模型代码

下述在matlab中编写的mpc模型预测控制代码
图注标出画线部分不明白代码含义

img

b站 DR_CAN 编写的代码
具体mpc文字笔记详见链接https://www.robotsfan.com/posts/fe8d7b17.html
请解答,谢谢

% 清屏
clear;
close all;
clc;
% 第一步,定义状态空间矩阵
% 定义状态矩阵 A, n*n 矩阵
A = [1 0.1; -1 2];
n = size(A,1);
% 定义输入矩阵 B, n*p 矩阵
B = [0.2 1;0.5 2];
p = size(B,2);
% 定义Q矩阵,n*n 矩阵
Q = [100 0;0 1];
% 定义F矩阵,n*n 矩阵
F = [100 0;0 1];
% 定义R矩阵,p*p 矩阵
R = [1 0;0 0.1];
% 定义step数量k
k_steps = 100;
% 定义矩阵 X_K, n*k 矩 阵
X_K = zeros(n,k_steps);
% 初始状态变量值, n*1 向量
X_K(:,1) = [20;-20];
% 定义输入矩阵 U_K, p*k 矩阵
U_K = zeros(p,k_steps);
% 定义预测区间K
N = 5;
% Call MPC_Matrices 函数 求得 E,H矩阵
[E,H] = MPC_Matrices(A,B,Q,R,F,N);
% 计算每一步的状态变量的值
for k = 1 : k_steps
    % 求得U_K(:,k)
    U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);
    % 计算第k+1步时状态变量的值
    X_K(:,k+1) = (A*X_K(:,k) + B*U_K(:,k));
end
% 绘制状态变量和输入的变化
subplot(2, 1, 1);
hold;
for i = 1 : size(X_K,1)
    plot(X_K(i,:));
end
legend("x1","x2")
hold off;
subplot(2, 1, 2);
hold;
for i = 1 : size(U_K,1)
    plot(U_K(i,:));
end
function [E,H] = MPC_Matrices(A,B,Q,R,F,N)
    n=size(A,1); % A是n*n矩阵,得到n
    p=size(B,2); % B是n*p矩阵,得到p
    M=[eye(n);zeros(N*n,n)]; % 初始化M矩阵,M矩阵是(N+1)n*n的,
                             % 它上面是n*n个"I",这一步先把下半部分写成0
    C=zeros((N+1)*n,N*p); % 初始化C矩阵,这一步令它有(N+1)n*NP个0
    % 定义M和C
    tmp=eye(n); % 定义一个n*n 的 I 矩阵
    % 更新M和C
    for i=1:N % 循环,i从1到N
        rows =i*n+(1:n); %定义当前行数,从i*n开始,共n行
        C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; %将c矩阵填满
        tmp= A*tmp; %每一次将tmp左乘一次A
        M(rows,:)=tmp; %将M矩阵写满
    end
    % 定义Q_bar和R_bar
    Q_bar = kron(eye(N),Q);
    Q_bar = blkdiag(Q_bar,F);
    R_bar = kron(eye(N),R);
    % 计算G,E,H
    G=M'*Q_bar*M; % G: n*n
    E=C'*Q_bar*M; % E: NP*n
    H=C'*Q_bar*C+R_bar; % NP*NP



function u_k= Prediction(x_k,E,H,N,p)
    U_k = zeros(N*p,1); % NP x 1
    U_k = quadprog(H,E*x_k);
    u_k = U_k(1:p,1); % 取第一个结果
end 
  • 写回答

5条回答 默认 最新

  • CodeBytes 2023-02-26 18:21
    关注

    该回答引用ChatGPT

    for i=1:N % 循环,i从1N
            rows =i*n+(1:n); %定义当前行数,从i*n开始,共n行
            C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; %将c矩阵填满
            tmp= A*tmp; %每一次将tmp左乘一次A
            M(rows,:)=tmp; %将M矩阵写满
    
    
    

    这一段代码是 MPC_Matrices 函数中的 for 循环,用于更新控制矩阵 C 和状态矩阵 M。具体来说,循环中的代码含义如下:

    1、对于第 i 个循环,计算出 C 矩阵中的第 rows 行到第 rows+n-1 行,即 rows = i*n+(1:n)。其中,i 表示当前的循环次数,n 是状态矩阵 A 的行数,即状态变量的数量。这一行代码的作用是将控制矩阵 C 中第 i 个时刻到第 i+N 个时刻的输入矩阵和之前的状态矩阵组合在一起,得到一个 Np 行的控制矩阵,其中 p 是输入矩阵 B 的列数,即控制输入的数量。

    2、接着,将当前的 tmp 矩阵(初值为单位矩阵)左乘状态矩阵 A,得到新的 tmp 矩阵。这一行代码的作用是在状态矩阵 A 的作用下,更新当前时刻的状态变量对未来时刻的影响。

    3、最后,将更新后的 tmp 矩阵写入 M 矩阵中的第 rows 行到第 rows+n-1 行,即 M(rows,:) = tmp。这一行代码的作用是将更新后的状态矩阵写入 M 矩阵中,得到一个 N+1 行的状态矩阵,其中第 1 行为当前时刻的状态矩阵,第 2 到第 N+1 行为未来时刻的状态矩阵。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 创建了问题 2月26日

悬赏问题

  • ¥150 HDMI分路器LT86102 的输出在890MHz频点处EMC超标8DB
  • ¥36 如何安全的迁移用户C盘用户文件(戴尔电脑)
  • ¥15 druid(相关搜索:数据库|防火墙)
  • ¥15 大一python作业
  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥60 如何鉴定微信小程序数据被篡改过
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥20 手机截图相片分辨率降低一半