LQR,输入无约束,仿真代码

该代码实现了一个模型预测控制(MPC)算法,用于处理单输入系统。通过定义状态空间矩阵A和B,以及Q、R和F权重矩阵,计算E和H矩阵,然后利用quadprog求解优化问题以确定输入变量U,最终模拟状态变量和输入的变化趋势。
摘要由CSDN通过智能技术生成
MPC_Test.m

%% 清屏
clear;
close all;
clc;
%% 第一步,定义状态空间矩阵
%% 定义状态矩阵 A, n x n 矩阵
A = [1 0.1; 0 2];
n= size (A,1);  %查询矩阵有多少行
%% 定义输入矩阵 B, n x p 矩阵
B = [ 0;0.5];
p = size(B,2);%r=size(A,1)该语句返回的时数组A的行数, c=size(A,2) 该语句返回的时数组A的列数。
%% 定义Q矩阵,n x n 矩阵
Q=[1 0;0 1];
%% 定义F矩阵,n x n 矩阵
F=[1,0;0,1];
%% 定义R矩阵,p x p 矩阵
R=0.1;
%% 定义step数量k
k_steps=101;%对应x(k)中的k值
%% 定义矩阵X_K,n x k矩阵即2*101的零矩阵
X_K = zeros(n,k_steps);
%% 初始状态变量值,n x 1 向量
X_K(:,1) =[-20;20];
%% 定义输入矩阵 U_K,p x 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);%自定义函数块求E和H矩阵
%% 计算每一步的状态变量的值
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
legend("u1","u2") 
MPC_Matrices.m

function [E , H]=MPC_Matrices(A,B,Q,R,F,N)
n=size(A,1);% A 是 n x n 矩阵, 得到 n
p=size(B,2); % B 是 n x p 矩阵, 得到 p
%%%%%%%%%%%%
M=[eye(n);zeros(N*n,n)]; % 初始化 M 矩阵. M 矩阵是 (N+1)n x n的, 
% 它上面是 n x n 的单位阵, 这一步先把下半部
% 分写成 0 
C=zeros((N+1)*n,N*p); % 初始化 C 矩阵, 这一步令它有 (N+1)n x NP 个 0
% 定义M 和 C 
tmp=eye(n);%定义一个n x n 的 I 矩阵
% 更新M和C
for i=1:N % 循环,i 从 1到 N
rows =i*n+(1:n); %定义当前行数,从i x 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 x n
E=C'*Q_bar*M; % E: NP x n
H=C'*Q_bar*C+R_bar; % NP x NP 
end 
Prediction.m

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);%matalb自带的优化函数,求取最小值
u_k = U_k(1:p,1); % 取第一个结果
end 

 

 系统单输入,输入无约束,状态变量均选择末态趋近于0。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值