本文章全部内容均出自matlab help center 多输入单输出被控对象的模型预测控制 - MATLAB和Simulink - MathWorks 中国
本人为了后期自己方便看的懂翻译并进行解释
此示例说明如何为具有一个测量输出 (MO) 和三个输入的被控对象设计、分析和仿真具有硬约束和软约束的模型预测控制器。输入由一个操纵变量 (MV)、一个测量的干扰 (MD) 和一个未测量的干扰 (UD) 组成。
定义被控对象模型
plantTF = tf({1,1,1},{[1 .5 1],[1 1],[.7 .5 1]})
在此示例中,在将 Plant 传递给 MPC 控制器创建函数之前,将 Plant 显式转换为离散时间状态空间形式。
控制器创建功能可以接受连续时间或离散时间被控对象。在初始化过程中,使用零阶保持 (ZOH) 方法自动将连续时间被控对象(任何格式)转换为离散时间状态空间模型。如果存在延迟,则包含在状态空间模型中。
plantCSS = ss(plantTF); % 传递函数转化为状态空间方程
Ts = 0.2; % 指定0.2秒的采样时间
plantDSS = c2d(plantCSS,Ts) % 使用ZOH转换为离散时间状态空间
默认情况下,软件假定所有被控对象输入信号都是纵的变量。要指定信号类型,例如测量和未测量的干扰,请使用该函数。在此示例中,第一个输入信号是纵的变量,第二个是测量的干扰,第三个是未测量的干扰。此信息存储在被控对象模型中,稍后由 MPC 控制器使用。
设计 MPC 控制器
创建控制器对象,指定采样时间Ts以及预测10和控制3范围
mpcobj = mpc(plantDSS,Ts,10,3);
定义对操作变量的硬约束。
mpcobj.MV = struct('Min',0,'Max',1,'RateMin',-10,'RateMax',10);
可以使用输入和输出干扰模型来定义附加输入和输出未测量干扰的动态特性。这些模型允许控制器更好地抑制此类干扰,如果它们在运行时发生。默认情况下,为了能够更好地抑制阶梯状干扰,请使用积分器作为以下干扰模型.
MPC 对象还具有一个噪声模型,该模型指定测量输出变量上预期的加性噪声的特征。默认情况下,这假定为单位静态增益,这等效于假设控制器期望测量的输出变量在运行时受到白噪声的影响(协方差矩阵取决于整个预测模型的输入矩阵)
显示输入干扰模型。
getindist(mpcobj)
显示为一个离散时间积分器。
显示输出干扰模型。
getoutdist(mpcobj)
将未测量输入的干扰模型指定为方差1000的白噪声驱动的积分器
mpcobj.Model.Disturbance = tf(sqrt(1000),[1 0]);
仿真
获得连续时间对象的状态空间矩阵。
[A,B,C,D] = ssdata(plantCSS);
打开Simulink模型进行闭环仿真。
open_system('mpc_miso')
工厂输入信号u(t)、v(t)和d(t)分别表示操纵变量、测量输入扰动和未测量输入扰动,而y(t)是测量输出。块参数是形成连续时间对象的状态空间实现的矩阵,以及五个状态的初始条件。MPC控制器由MPC控制器块实现,该MPC控制器具有工作空间MPC对象作为参数,操纵变量作为输出,测量的系统输出、参考信号和测量的工厂输入扰动分别作为输入。
运行后结果
使用正弦输出噪声运行仿真
假设输出测量受到频率为0.1Hz的正弦扰动的影响。
omega = 2*pi/10;
打开Simulink模型,该模型与模型相似,只是测量输出中添加了正弦扰动。此外,模拟时间更长,未测量的扰动在测量的扰动之前开始。
open_system('mpc_misonoise')
由于这种噪声是预期的,您可以指定一个噪声模型来帮助状态估计器忽略它。这样做可以提高控制器的抗干扰能力。
mpcobj.Model.Noise = 0.5*tf(omega^2,[1 0 omega^2]); % measurement noise model
通过将未测量输入上的扰动模型指定为平均值和方差为0.1的高斯白噪声来修改MPC设计。
setindist(mpcobj,tf(0.1)); % static gain
在这种情况下,不能在未测量的输入和输出上都有积分器作为扰动模型,因为这违反了状态可观测性。因此,当您为输入扰动模型指定静态增益时,由离散积分器组成的输出扰动模型会自动添加到控制器中。该输出扰动模型有助于控制器抑制输出处的阶跃和缓慢变化的扰动。
getoutdist(mpcobj)
大的测量噪声会降低状态估计的准确性。为了降低控制器的攻击性,降低其噪声敏感性,减少输出变量跟踪的权重。
mpcobj.weights = struct('MV',0,'MVRate',0.1,'OV',0.005); % new weights
为了给卡尔曼滤波器更多的时间来成功地估计状态,将预测范围增加到40。
mpcobj.predictionhorizon = 40; % new prediction horizon
仿真结果
卡尔曼滤波器在50秒后成功学会忽略测量噪声。未测量和测量的扰动在10到20秒的时间跨度内被拒绝。正如预期的那样,被操纵的变量保持在0和1之间的区间内。
软化约束
对于MPC控制器,每个约束都有一个相关的无量纲ECR值。ECR值较大的约束比ECR值较小的约束更容易被违反。默认情况下,操纵变量上的所有约束的ECR值都为零,这使它们很难被违反。可以为约束指定非零的ECR值以使其变软。
mpcobj.ManipulatedVariables.MinECR = 1; % ECR for the MV lower bound
mpcobj.ManipulatedVariables.MaxECR = 1; % ECR for the MV upped bound
定义输出约束。默认情况下,输出变量(测量输出)上的所有约束的ECR值都为1,使其变软。可以减少输出约束的ECR值以使其更难违反,但最佳是保持输出约束的软性。软输出约束是优选的,因为工厂输出取决于工厂状态和测量的扰动;因此,如果发生足够大的扰动,则无论设备状态如何(因此无论MPC控制器采取的任何控制动作如何),都可能违反设备输出约束。当被操纵的变量具有硬约束时,这些违规行为尤其可能发生。
mpcobj.OutputVariables.Max = 1.1; % define the (soft) output constraint
运行一个新的闭环模拟,不包括模拟选项对象,因此没有任何模型不匹配、未测量的干扰或噪声添加到操纵变量或测量输出中。
Tstop = 30; % simulation time
Nf = round(Tstop/Ts); % number of simulation steps
r = ones(Nf,1); % output reference signal
v = [zeros(Nf/3,1);ones(2*Nf/3,1)]; % measured input disturbance signal
SimOptions.OutputNoise = []; % remove output measurement noise
SimOptions.InputNoise = []; % remove noise on manipulated variable
sim(mpcobj,Nf,r,v) % simulate the closed loop
为了抑制测量到的扰动,实现跟踪,并防止输出上升到其1.1的软约束之上,控制器略微违反了对操纵变量的软约束,操纵变量在第10秒到第11秒之间达到小负值。控制器违反对测量输出的约束大于对操纵变量的约束。
mpcobj.OV.MaxECR = 0.001; % the closer to zero, the harder the constraint
sim(mpcobj,Nf,r,v) % run a new closed-loop simulation.
强化对输出变量的约束,然后重新运行模拟。
现在,控制器只稍微违反了输出约束。这种输出性能的提高是以更多地违反操纵变量约束为代价的(操纵变量的值达到-3)。