博客中所有内容均来源于对yalmip官方教程的翻译以及自己在学习过程中的心得体会:https://yalmip.github.io/tutorials/
一、基础MPC形式(Model predictive control - Basics)
首先,让我们定义线性时不变(Linear Time-Invariant Systems)系统及控制问题的数值数据。以单输入单输出问题为例:
yalmip('clear') %清除所有由YALMIP生成的变量 clear all %清除MATLAB工作区中的所有变量 % MPC模型定义 A = [2 -1;1 0.2]; %状态矩阵 B = [1;0]; %输入矩阵 nx = 2; %状态变量 nu = 1; %输入变量 % MPC参数设置 Q = eye(2); %状态惩罚矩阵 R = 2; %控制输入的惩罚系数 N = 7; %预测时域 % 初始状态变量 x0 = [3;1];
优化问题的目标是在有限时域内最小化状态和控制轨迹的代价函数,并满足所设定的约束条件。
1.显示预测形式
实现的第一个版本明确地将预测状态表示为给定当前状态和未来控制序列的函数(下文将提出更好的方法)。通过简单地循环仿真方程,并在时域内收集约束和目标项。请注意快速定义控制输入列表的过程。
u = sdpvar(repmat(nu,1,N),repmat(1,1,N)); %控制输入量定义,生成一个1*N的cell,cell中每一个元素的大小为nu*1 constraints = []; %约束定义,这个必须在程序中加入 objective = 0; x = x0; for k = 1:N x = A*x + B*u{k}; objective = objective + norm(Q*x,1) + norm(R*u{k},1); constraints = [constraints, -1 <= u{k}<= 1, -5<=x<=5]; end
生成了约束和目标函数后,我们就可以求解优化问题。
optimize(constraints,objective); value(u{1})
在上述优化问题中的状态变量的初始值是给定的,每次遇到新的初始状态时都要更改初始值,为了避免一些不必要的复杂计算,我们将问题的初始状态作为决策变量来处理。
u = sdpvar(repmat(nu,1,N),repmat(1,1,N)); x0 =