主要内容

多输入单输出设备的模型预测控制

本示例展示了如何设计、分析和模拟具有硬约束和软约束的模型预测控制器,用于具有一个测量输出(MO)和三个输入的工厂。输入由一个操纵变量(MV)、一个测量扰动(MD)和一个未测量扰动(UD)组成。在设计了控制器并分析了其闭环稳态增益之后,您可以使用sim卡命令,在循环使用mpcmove,并使用Simulin金宝appk®。模拟模型不匹配,没有约束,并在开环显示。本文还讨论了输入和输出干扰和噪声模型,以及如何改变内置状态估计器的卡尔曼增益。

定义植物模型

定义一个工厂模型。对于本例,使用从每个输入到输出的连续时间传递函数。

plantTF = tf({1,1,1},{[1 .5 1],[1 1],[。7 .5 1]})定义并显示tf对象
plantTF =从输入1到输出:1 --------------- s²+ 0.5 s + 1从输入2到输出:1 ----- s + 1从输入3到输出:1 ------------------- 0.7 s²+ 0.5 s + 1连续时间传递函数。

对于本例,在将植物传递给MPC控制器创建函数之前,显式地将其转换为离散时间状态空间形式。

控制器创建函数可以接受连续时间或离散时间植物。在初始化过程中,使用零阶保持器(ZOH)方法将连续时间植物(任何格式)自动转换为离散时间状态空间模型。如果存在延迟,则将其合并到状态空间模型中。

当您需要用于分析或模拟的离散时间系统矩阵时(如本例所示),或者当您想使用除ZOH以外的离散时间转换方法时,您可以自己将工厂转换为离散时间。

plantCSS = ss(plantTF);%传递函数到连续状态空间Ts = 0.2;%指定0.2秒的采样时间plantDSS = c2d(plantCSS,Ts)%转换到离散时间状态空间,使用ZOH
plantDSS = = (x1, x2) x3 x4 x5 x1 0.1891 - 0.9807 0.8862 - -0.1891 0 0 0 x2 0 0 0 x3 0 0 0 0 x4 0 0 0 0.8187 0.841 -0.2637 x5 0 0 0 0.1846 0.9729 B = u1, u2 u3 x1 0.1891 0.1813 0.01929 0 0 x2 0 0 x3 0 0 x4 0 0 0.1846 x5 0 0 0.01899摄氏度= (x1, x2) x3 x4 x5 y1 0 1 1 0 1.429 D = u1, u2 u3 y1 0 0 0样品时间:0.2秒离散时间状态空间模型。

默认情况下,软件假定所有植物输入信号都是被操纵的变量。要指定信号类型,如测量的和未测量的干扰,请使用setmpcsignals函数。在这个例子中,第一个输入信号是一个被操纵的变量,第二个是一个测量的扰动,第三个是一个未测量的扰动。该信息存储在工厂模型中plantDSS后来被MPC控制器使用。

plantDSS = setmpcsignals(plantDSS,“MV”, 1“医学博士”2,“UD”3);指定信号类型

MPC控制器设计

创建控制器对象,指定采样时间以及预测和控制范围(分别为10步和3步)。

mpcobj = mpc(plantDSS,Ts,10,3);
- - - >“权重。属性为空。假设默认值为0.00000。- - - >“权重。属性为空。假设默认为0.10000。- - - >“权重。OutputVariables属性为空。假设默认值为1.00000。

由于您没有指定要最小化的二次代价函数的权重,控制器使用它们的默认值(0表示操作变量,0.1表示操作变量率,1表示输出变量)。此外,在这一点上,MPC问题仍然是不受约束的,因为你还没有指定任何约束。

在被操作的变量上定义硬约束。

mpcobj。MV = struct(“最小值”,0,“马克斯”, 1“杀鼠灵”, -10,“RateMax”10);

您可以使用输入和输出扰动模型来定义可加性输入和输出不可测扰动的动态特性。这些模型允许控制器更好地拒绝这种干扰,如果它们发生在运行时。默认情况下,为了更好地拒绝阶跃干扰,货币政策委员会使用积分器作为扰动模型:

  • 每个不可测扰动输入和

  • 每个未测扰动作用于每个测量输出

除非这样做会导致违反状态可观察性。

MPC对象还具有一个噪声模型,该模型指定了在测量输出变量上预期的附加噪声的特征。默认情况下,这被假定为一个单位静态增益,这相当于假设控制器期望测量的输出变量在运行时受到白噪声的影响(协方差矩阵取决于整个预测模型的输入矩阵)。有关更多信息,请参见MPC预测模型

显示输入扰动模型。正如预期的那样,它是一个离散时间积分器。

getindist (mpcobj)
——>”模式。干扰" property is empty: Assuming unmeasured input disturbance #3 is integrated white noise. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property is empty. Assuming white noise on each measured output. ans = A = x1 x1 1 B = UD1-wn x1 0.2 C = x1 UD1 1 D = UD1-wn UD1 0 Sample time: 0.2 seconds Discrete-time state-space model.

显示输出扰动模型。

getoutdist (mpcobj)
ans =空状态空间模型。

将未测量输入的扰动模型指定为由带有方差的白噪声驱动的积分器1000

mpcobj. model .扰动= tf(平方根(1000),[1 0]);

再次显示输入扰动模型以验证它是否发生了变化。

getindist (mpcobj)
ans = A = x1 x1 1 B =噪声#1 x1 0.8 C = x1 UD1 7.906 D =噪声#1 UD1 0采样时间:0.2秒离散时间状态空间模型。

显示MPC控制器对象mpcobj回顾其性质。

mpcobj
MPC对象(创建于31- 8月2022 04:49:59):---------------------------------------------采样时间:0.2(秒)预测水平:10控制水平:3植物模型:-------------- 1操纵变量(s)—>| 5状态| | |—> 1测量输出(s) 1测量扰动(s)—>| 3输入| | |—> 0未测输出(s) 1未测扰动(s)—>| 1输出| --------------指数:(输入矢量)操纵变量:[1]测量扰动:[2]未测扰动:[3](输出向量)测量输出:[1]扰动和噪声模型:输出扰动模型:default(类型“getoutdist(mpcobj)”详细信息)输入扰动模型:用户指定(类型“getindist(mpcobj)”详细信息)测量噪声模型:default(缩放后的单位增益)权重:0 ManipulatedVariablesRate: 0.1000 OutputVariables: 1 ECR: 100000状态估计:默认卡尔曼滤波器(类型“getEstimator(mpcobj)”详细信息)0 <= MV1 <= 1, -10 <= MV1/rate <= 10, MO1不受约束

检查稳态偏移量

为了检验MPC控制器是否可以拒绝恒定的输出扰动,并在稳态下跟踪一个具有零偏移的恒定设定值,计算从输出扰动到被控输出的闭环直流增益cloffset命令。这个增益也被称为闭环的稳态输出灵敏度。

DC = cloffset(mpcobj);流('从输出扰动到输出的直流增益=% 5.8f (=%g) \n'特区特区);
假设测量的输出通道1没有任何扰动。——>”模式。噪音" property is empty. Assuming white noise on each measured output. DC gain from output disturbance to output = 0.00000000 (=3.10862e-15)

零增益,这通常是控制器具有积分器作为输入或输出扰动模型的结果,意味着测量的设备输出在稳态下完美地跟踪所需的输出参考设定值。

模拟闭环响应使用sim卡

sim卡命令提供了一种快速的方法来模拟MPC控制器的闭环与线性时不变植物时,约束和权重保持不变,你可以很容易地和完整地指定干扰和参考信号提前。

首先,指定仿真时间以及参考信号和扰动信号

Tstop = 30;模拟时间%Nf = round(Tstop/Ts);%模拟步数r = ones(Nf,1);输出参考信号%v = [0 (Nf/3,1); 1 (2*Nf/3,1)];%测量输入干扰信号

运行闭环模拟并绘制结果。中所指明的工厂mpcobj.Model.Plant既用作闭环仿真中的植物,也用作控制器用于预测预测范围内响应的内部植物模型。如果需要,对工厂模型进行离散化或重新采样,并且模拟在离散时间内运行,具有采样时间mpcobj。Ts

使用sim卡模拟闭环对参考的响应r测量的输入扰动v系统Nf步骤。

sim (Nf mpcobj, r, v)%闭环模拟装置和控制器

被操纵的变量最初达到上限,并在几秒钟内将植物输出带到参考值。然后,被操纵的变量稳定在其允许的最大值1。10秒后,测得的扰动信号从0上升到1,导致植物输出超过其参考值约30%。被操纵的变量达到下界,以努力拒绝扰动。控制器能够在几秒钟后将工厂输出恢复到参考值,并且被操纵的变量稳定在其最小值。未测扰动信号始终为零,因为尚未指定任何未测扰动信号。

您可以使用模拟选项对象来指定附加的模拟选项和附加的信号,例如输入到设备但控制器不知道的噪声和未测量的干扰。对于本例,使用模拟选项对象将未测量的输入扰动信号添加到被操纵变量,并在测量的输出信号上添加噪声。创建一个带有默认选项的模拟选项对象。

SimOptions = mpcsimopt;%创建对象

创建一个干扰信号,并在模拟选项对象中指定它。

d = [0 (2*Nf/3,1);-0.5*ones(Nf/3,1)];阶跃干扰SimOptions。未测量扰动= d;%未测量输入干扰

在模拟选项对象中指定噪声信号。在仿真时,仿真函数在将测量输出馈送给控制器之前,直接将指定的输出噪声加到测量输出中。它还直接将指定的输入噪声添加到被操纵的变量(而不是任何干扰信号),然后将其馈送到植物。

SimOptions.OutputNoise =措施*(兰德(Nf, 1)闲置);输出测量噪声SimOptions.InputNoise = . 05 *(兰德(Nf, 1)闲置);%操纵变量的噪声

你也可以使用OutputNoise字段的模拟选项对象,以在被测装置输出上指定更一般的附加输出扰动信号(如步长)。

模拟闭环系统并将结果保存到工作空间变量中ytu,xp.保存这些变量可以让您有选择地在新的图形窗口中以任何给定的颜色和顺序绘制信号。

[y,t,u,xp] = sim(mpcobj,Nf,r,v,SimOptions);

画出结果。

数字%创建新图形次要情节(2,1,1)%创建上子图情节(0:Nf-1, y, 0: Nf-1, r)%图植物产量和参考标题(“输出”%添加标题,所以上subplotylabel (“MO1”%在y轴上添加一个标签网格在上面的子图中添加一个网格次要情节(2,1,2)%创建较低的子图情节(0:Nf-1, u)百分比图操纵变量标题(“输入”);%添加标题,所以较低的subplot包含(“模拟步骤”%在下x轴上添加一个标签ylabel (“1/2 MV1”%在下y轴上添加一个标签网格添加一个网格到较低的子图

尽管增加了噪声,这在被操纵的变量图上尤其明显,尽管分别在50步和100步后开始有测量和未测量的干扰,控制器能够实现良好的跟踪。在模拟的初始部分(从20到50的步骤)之后,被操纵的变量稳定在大约1,在大约0的时候拒绝测量的扰动(从70到100的步骤),在大约0.5的时候拒绝两个扰动(从120到150的步骤)。

用模型失配模拟闭环响应

测试MPC控制器对模型不匹配的鲁棒性。指定要在模拟中使用的真实植物为truePlantCSS.对于本例,三个植物传递函数的每个分母都有一个或两个系数,这些系数与前面定义植物模型部分中定义的植物中的相应系数不同,MPC控制器将其用于预测。

truePlantTF特遣部队(={1 1 1}、{[1。8],[1 - 2],[。6 .6 1]})指定并显示传递函数truePlantCSS = ss(truePlantTF);%转换为连续状态空间truePlantCSS = setmpcsignals(truePlantCSS,“MV”, 1“医学博士”2,“UD”3);指定信号类型
truePlantTF =从输入1到输出:1 --------------- s²+ 0.8 s + 1从输入2到输出:1 ----- s + 2从输入3到输出:1 ------------------- 0.6 s²+ 0.6 s + 1连续时间传递函数。

通过指定更新模拟选项对象SimOptions。模型作为一个有两个字段的结构,植物(包含真实的植物模型)和名义上的(包含真实工厂的工作点值)。对于这个例子,没有指定状态导数和输入的标称值,因此假设它们为零,导致y = simoptions . model . nomial . y + C*(x- simoptions . model . nomial . x),在那里x而且y分别是工厂的状态和测量产量。

%创建结构并分配'Plant'字段SimOptions。模型= struct(“植物”, truePlantCSS);%创建并分配'Nominal. %Y '字段SimOptions.Model.Nominal.Y = 0.1;%创建并分配'Nominal. %X”字段model . nominal . x = -。1*[1 1 1 1 1 1];指定真实植物的初始状态SimOptions。植物InitialState = [0.1 0 -0.1 0 .05];

删除已添加到测量输出和操作变量的任何信号。

SimOptions。OutputNoise= [];去除输出测量噪声SimOptions。InputNoise = [];去除操纵变量上的噪声

运行闭环模拟并绘制结果。自SimOptions。模型不是空的,SimOptions.Model.Plant转换为离散时间(使用零阶保持器)并用作闭环模拟中的植物,而在mpcobj.Model.Plant仅由控制器用于预测在预测范围内的响应。

sim (mpcobj Nf, r, v, SimOptions)%模拟闭环
——>转换模型到离散时间。

由于模型不匹配,响应中的一些退化是可见的;值得注意的是,控制器需要更多一点的时间来实现跟踪,被操纵的变量现在稳定在0.5左右以拒绝测量的扰动(参见5到10秒的值),并稳定在0.9左右以拒绝两个输入扰动(从25到30秒)。尽管有这种退化,控制器仍然能够跟踪输出引用。

模拟开环响应

控件,还可以在开环中测试设备和控制器的行为sim卡命令。设置OpenLoop旗帜,并提供一个被操纵的变量值序列来激励系统(如果OpenLoop设置为).

SimOptions。OpenLoop =“上”%设置开环选项SimOptions。MVSignal = sin((0:Nf-1)'/10);%定义mv信号

模拟真实的工厂(先前在SimOptions。模型)在开环。因为参考信号在开环仿真中被忽略,所以指定它为[]。

sim (mpcobj Nf, [], v, SimOptions)%模拟开环系统
——>转换模型到离散时间。

软化的约束

对于MPC控制器,每个约束都有一个相关的无量纲ECR值。具有较大ECR值的约束比具有较小ECR值的约束更容易被违反。默认情况下,操纵变量上的所有约束的ECR值都为0,这使得它们很难执行。可以为约束指定非零的ECR值,使其成为软约束。

放宽对操作变量的约束,从硬到软。

mpcobj.ManipulatedVariables.MinECR = 1;% ECR为MV下界mpcobj.ManipulatedVariables.MaxECR = 1;% ECR为MV上界

定义输出约束。默认情况下,所有对输出变量(测量输出)的约束都有一个ECR值为1,这使得它们很软。您可以降低输出约束的ECR值,使其更难执行,但最佳实践是保持输出约束较软。软输出约束是首选的,因为植物输出取决于植物状态和测量扰动;因此,如果发生了足够大的扰动,无论设备状态如何(因此无论MPC控制器采取任何控制动作),都可以违反设备输出约束。当被操纵的变量具有硬约束时,这种违反尤其有可能发生。这种对硬约束的不可避免的违反导致了不可行的MPC问题,没有可操纵的变量可以计算出来。

mpcobj.OutputVariables.Max = 1.1;%定义(软)输出约束

运行一个新的闭环仿真,不包括仿真选项对象,因此没有任何模型不匹配、未测量的扰动或添加到被操纵变量或测量输出的噪声。

sim (Nf mpcobj, r, v)%模拟闭环
假设测量的输出通道1没有任何扰动。——>”模式。噪音" property is empty. Assuming white noise on each measured output.

为了抑制测量扰动,实现跟踪,防止输出超过其软约束1.1,控制器轻微违反了对被操纵变量的软约束,在第10秒到第11秒达到较小的负值。控制器违反对测量输出的约束多于对被操纵变量的约束。

加强对输出变量的约束并重新运行模拟。

mpcobj.OV.MaxECR = 0.001;%越接近0,约束越困难sim (Nf mpcobj, r, v)%运行一个新的闭环模拟。
假设测量的输出通道1没有任何扰动。——>”模式。噪音" property is empty. Assuming white noise on each measured output.

现在控制器只稍微违反了输出约束。这种输出性能的改进是以更多地违反被操纵变量约束为代价的(被操纵变量的值达到-3)。

改变内置状态估计器卡尔曼增益

在每个时间步中,MPC控制器通过求解依赖于工厂当前状态的约束二次优化问题来计算被操纵变量。由于植物状态通常不能直接测量,默认情况下,控制器使用线性卡尔曼滤波器作为观测器来估计植物状态以及扰动和噪声模型。因此,控制器的状态就是卡尔曼滤波器的状态,而卡尔曼滤波器又是增广离散时间对象状态的估计。使用默认估计器,在模型不匹配和未测量扰动的情况下运行闭环仿真,并返回控制器状态结构xc

SimOptions。OpenLoop =“关闭”%设置闭环选项[y,t,u,xp,xc] = sim(mpcobj,Nf,r,v,SimOptions);%运行模拟
——>模拟处于闭环状态(“mpcsimopt”对象的“OpenLoop”属性为“off”),“mpcsimopt”对象的“MVSignal”属性被忽略。——>转换模型到离散时间。
xc
xc = struct with fields: Plant: [150x5 double] Disturbance: [150x1 double] Noise: [150x0 double] LastMove: [150x1 double]

绘制由默认观察器估计的工厂输出响应和工厂状态。

图;%创建数字次要情节(2,1,1)%创建上子图轴情节(t, y)% plot y随时间的变化标题(“植物输出”);将标题添加到上部绘图ylabel (“y”%在y轴上添加一个标签网格将网格添加到上图次要情节(2,1,2)%创建较低的子图轴情节(t, xc.Plant)% plot xc。植物versus time标题(“估计植物状态”);将标题添加到较低的地块包含(的时间(秒)%在下x轴上添加一个标签ylabel (“我”%在下y轴上添加一个标签网格%将网格添加到较低的图形

正如预期的那样,测量和未测量的扰动分别在10秒和20秒引起突然的变化。

你可以改变卡尔曼滤波器的增益。为此,首先检索默认的卡尔曼增益和状态空间矩阵。

[L,M,A1,Cm1] = getEstimator(mpcobj);%检索观察者矩阵

计算并显示默认观测器的极点。它们都在单位圆内,尽管其中一些似乎相对靠近边界。注意这六种状态,前五种属于植物模型,第六种属于输入扰动模型。

e = eig(A1-A1*M*Cm1)%的特征值
E = 0.5708 + 0.4144i 0.5708 - 0.4144i 0.4967 + 0.0000i 0.9334 + 0.1831i 0.9334 - 0.1831i 0.8189 + 0.0000i

设计了一种新的极点配置状态估计器。快的极点稍微向原点移动,慢的极点稍微远离原点。在其他条件相同的情况下,这种极点位置应该会导致观测者的速度稍微慢一些。

波兰人=[。8 .75 .7 .85 .6 .81];指定新极点所需的位置L =位置(A1',Cm1',极点)';%计算卡尔曼增益用于时间更新M = a1 \ l;%计算卡尔曼增益进行测量更新

在MPC控制器对象中设置新的矩阵增益。

setEstimator (mpcobj, L, M);%设置新的估计增益

重新运行闭环模拟。

[y,t,u,xp,xc] = sim(mpcobj,Nf,r,v,SimOptions);
假设测量的输出通道1没有任何扰动。——>”模式。噪音" property is empty. Assuming white noise on each measured output. -->Simulation is in closed-loop (the "OpenLoop" property of "mpcsimopt" object is "off") and the "MVSignal" property of "mpcsimopt" object is ignored. -->Converting model to discrete time.

画出由新观测器估计的植物产量响应和植物状态。

图;%创建数字次要情节(2,1,1)%创建上子图轴情节(t, y)% plot y随时间的变化标题(“植物输出”);将标题添加到上部绘图ylabel (“y”%在y轴上添加一个标签网格将网格添加到上图次要情节(2,1,2)%创建较低的子图轴情节(t, xc.Plant)% plot xc。植物versus time标题(“估计植物状态”);将标题添加到较低的地块包含(的时间(秒)%在下x轴上添加一个标签ylabel (“我”%在下y轴上添加一个标签网格%将网格添加到较低的图形

正如预期的那样,控制器状态与先前绘制的状态不同,总体闭环响应有点慢。

闭环控制器仿真mpcmove

对于更通用的应用程序,可以在For循环中使用mpcmove函数。使用此函数,您可以使用以下特性运行模拟。

  • 非线性或时变植物

  • 在运行时变化的约束或权重

  • 运行模拟前不知道的干扰或参考信号

如果您的植物是连续的,您可以在模拟之前将其转换为离散时间,或者您可以使用数值积分算法(例如前向欧拉或数值)在闭环中使用mpcmove.例如,您可以使用以下方法计算下一个控制间隔的工厂状态:

  • 离散时间植物x(t+1)=f(x(t),u(t)):X = f(X,u)(通常x = A*x + B*u线性植物模型)

  • 连续时间植物dx(t)/dt=f(x(t) u(t)),采样时间Ts,欧拉法:x = x + f(x,u)*Ts

  • 连续时间植物如上所述,使用数值[~,xhist] = ode45(@(t,xode) f(xode,u),[0 Ts],x);X = xhist(end);

在第三种情况下,数值从初始条件开始x并模拟植物为Ts秒,在恒定的控制信号下u.结果状态信号的最后一个值xhist下一个控制间隔的设备状态。

首先,得到对象的离散状态空间矩阵,并定义对象和控制器的仿真时间和初始状态。

[A,B,C,D] = ssdata(plantDSS);%离散时间植物植物矩阵Tstop = 30;模拟时间%X = [0 0 0 0 0]';工厂的初始状态XMPC = mpcstate(mpcobj);获取控制器状态句柄R = 1;输出参考信号%

显示控制器初始状态。状态是mpcstate对象,仅包含当前时间的控制器状态。具体来说:*xmpc。植物是估计的工厂状态的当前值。*xmpc。干扰是扰动模型状态的当前值。*xmpc。噪音是噪声模型状态的当前值。*xmpc。LastMove操作变量的最后一个值。*xmpc。协方差是估计量协方差矩阵的当前值。

xmpc显示控制器状态
MPCSTATE对象与字段Plant:[0 0 0 0 0 0]扰动:0噪声:[1x0 double] LastMove: 0协方差:[]

请注意,xmpc句柄对象,它总是指向控制器的当前状态。自mpcmove当计算新的控制移动时更新内部植物状态,您不需要更新xmpc,它总是指向当前(因此是更新的)状态。

isa (xmpc“处理”
Ans =逻辑1

定义工作空间数组YY而且UU分别存储输出和输入信号,以便在模拟后绘制它们。

YY = [];UU = [];

运行模拟循环。

k = 0:圆形(Tstop / Ts) 1定义测量的干扰信号v(k)。您可以指定更多%复杂的依赖于时间或以前的状态,如果需要。V = 0;如果k * Ts > = 1010秒后%上升到1V = 1;结束定义未测干扰信号d(k)。您可以指定更多%复杂的依赖于时间或以前的状态,如果需要。D = 0;如果k * Ts > = 20%在20秒后下降到-0.5D = -0.5;结束%植物方程式:电流输出%如果你有一个更复杂的植物输出行为(包括,例如,%模型不匹配或非线性)你可以在这里模拟它。注意,在u和y之间不能有任何直接的馈通。y = C*x + D(:,2)*v + D(:,3)* D;%计算电流输出(D(:,1)=0)YY = [YY,y];%存储电流输出注意,如果工厂有非零工作点,输出为:% y = mpcobj.Model.Nominal.Y + C * (x-mpcobj.Model.Nominal.X) + D (:, 2) * v + D (:, 3) * D;计算MPC动作(u)并更新内部控制器状态。注意,您不需要更新xmpc,因为它总是指向%到当前控制器状态。U = mpcmove(mpcobj,xmpc,y,r,v);% xmpc,y,r,v是当前第k步的值UU = [UU,u];%存储电流输入%植物方程式:状态更新如果需要,您可以在这里模拟更复杂的植物状态行为。。x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d;%更新状态注意,如果工厂有非零工作点,状态更新将为:% x = mpcobj.Model.Nominal.X + mpcobj.Model.Nominal.DX +…% * (x-mpcobj.Model.Nominal.X) + B (: 1) * (u-mpcobj.Model.Nominal.U(1) +…% B(:,2)*v + B(:,3)*d;结束

画出结果。

数字%创建数字次要情节(2,1,1)%创建上子图轴情节(0:Ts: Tstop-Ts YY)% plot YY与时间ylabel (“y”%在y轴上添加一个标签网格将网格添加到上图标题(“输出”将标题添加到上部绘图次要情节(2,1,2)%创建较低的子图轴情节(0:Ts: Tstop-Ts UU)% plot UU随时间变化ylabel (“u”%在下y轴上添加一个标签包含(的时间(秒)%在下x轴上添加一个标签网格%将网格添加到较低的图形标题(“输入”将标题添加到较低的地块

要检查模拟过程中任意点的最佳预测轨迹,可以使用的第二个输出参数mpcmove.对于本例,假设您从当前状态(x而且xmpc).还假设,从这一点到视界的尽头,参考设定点为0.5扰动是0.模拟控制器并返回info结构。

R = 0.5;%的参考V = 0;%干扰[~,info] = mpcmove(mpcobj,xmpc,y,r,v);%解决超过预测水平

显示info变量。

信息
info = struct with fields: Uopt: [11x1 double] Yopt: [11x1 double] Xopt: [11x6 double] Topt: [11x1 double] Slack: 0迭代:1 QPCode: '可行'成本:0.1399

信息是一个结构,包含在预测范围内的操作变量、植物状态和输出的预测最佳序列。mpcmove通过求解二次优化问题,使代价函数最小,计算出该序列,以及最优的第一步。工厂状态和输出信息将最优操作变量序列直接应用于mpcobj.Model.Plant,以开环方式。由于噪声、不可测扰动和不确定性的存在,这种开环优化过程并不等同于用任意一种方法来模拟由装置、估计器和控制器组成的闭环sim卡命令或mpcmove在for循环中迭代。

提取预测的最优轨迹。

topt = info.Topt;%的时间yopt = info.Yopt;%预测最佳的工厂模型输出uopt = info.Uopt;%预测最优mv序列

由于每个控制步骤的最佳序列值都是恒定的,因此使用阶梯图绘制轨迹。

数字%创建新图形次要情节(2,1,1)%创建上子图楼梯(topt yopt)在阶梯图中绘制yopt标题(“预测输出的最佳序列”将标题添加到上部子图网格将网格添加到上部子图次要情节(2,1,2)%创建较低的子图楼梯(topt uopt)% plot uopt在一个阶梯图标题(“操纵变量的最优序列”将标题添加到上部子图网格将网格添加到上部子图

MPC控制器的线性表示

当约束不活跃时,MPC控制器表现得像一个线性控制器。注意,对于具有有限非后退视界的有限时间无约束线性二次型调节器问题,其值函数是时变的,这使得最佳反馈增益是时变的。相比之下,在MPC中,视界具有恒定长度,因为它总是在后退,从而产生时不变值函数,从而获得时不变的最优反馈增益。

你可以得到MPC控制器的状态空间形式。

LTI = ss(mpcobj,“房车”);获得状态空间表示

得到模拟线性化控制器的状态空间矩阵。

[AL,BL,CL,DL] = ssdata(LTI);得到状态空间矩阵

初始化变量,对原始无约束MPC控制器和线性化控制器进行闭环仿真。

mpcobj。Mv = [];移除输入限制mpcobj。Ov = [];移除输出限制Tstop = 5;%设定模拟时间Y = 0;设定初始测量输出R = 1;%设置输出参考设定点(常量)U = 0;设置先前(初始)输入命令X = [0 0 0 0 0]';设置工厂的初始状态XMPC = mpcstate(mpcobj);%设置无约束MPC控制器初始状态xL = 0 (size(BL,1),1);设置线性化MPC控制器的初始状态Yy = [];定义工作区数组来存储植物输出
假设测量的输出通道1没有任何扰动。——>”模式。噪音" property is empty. Assuming white noise on each measured output.

用相同的工厂模型在一个闭环中模拟两个控制器。

k = 0:round(Tstop/Ts)-1 YY = [YY,y];%存储当前输出用于绘图定义测量的干扰信号v(k)。V = 0;如果k*Ts>= 10v =1;10秒后%上升到1结束定义未测干扰信号d(k)。D = 0;如果k*Ts>=20 d = -0.5;%在20秒后下降到-0.5结束计算(无约束)MPC和线性化MPC的控制动作uMPC = mpcmove(mpcobj,xmpc,y,r,v);% unconstrained MPC(也更新xmpc)u = CL*xL + DL*[y;r;v];%无约束线性化MPC比较两个控制动作dispatstr (k+1) = {sprintf(['t=%5.2f, u=%7.4f(由LTI提供),u=%7.4f'(MPCOBJ提供)), k * t, u, uMPC)};% #好< * SAGROW >无约束线性化MPC控制器更新状态xL = AL*xL + BL*[y;r;v];更新工厂状态x = A*x + B(:,1)*u + B(:,2)*v + B(:,3)*d;计算工厂产量y = C*x + D(:,1)*u + D(:,2)*v + D(:,3)* D;% D (: 1) = 0结束

显示包含控制动作的字符数组。

k = 0:圆形(Tstop / Ts) 1 disp (dispStr {k + 1});%当k增加时显示每个字符串结束
t= 0.00, u= 5.2478 (LTI提供),u= 5.2478 (MPCOBJ提供)t= 0.20, u= 3.0134 (LTI提供),u= 3.0134 (MPCOBJ提供)t= 0.40, u= 0.2281 (LTI提供),u= 0.2281 (MPCOBJ提供)t= 0.60, u=-0.9952 (LTI提供),u=-0.9952 (MPCOBJ提供)t= 0.80, u=-0.8749 (LTI提供),u=-0.8749 (MPCOBJ提供)t= 1.00, u=-0.2022 (LTI提供),u=-0.2022 (MPCOBJ提供)t= 1.20, u= 0.4459 (LTI提供),u= 0.4459 (MPCOBJ提供)t= 1.40,u = 0.8489 (LTI)提供的,u = 0.8489 MPCOBJ)提供的(t = 1.60, 1.0192 u = (LTI)提供的,u = 1.0192 MPCOBJ)提供的(t = 1.80, 1.0511 u = (LTI)提供的,u = 1.0511 MPCOBJ)提供的(t = 2.00, 1.0304 u = (LTI)提供的,u = 1.0304 MPCOBJ)提供的(t = 2.20, 1.0053 u = (LTI)提供的,u = 1.0053 MPCOBJ)提供的(t = 2.40, 0.9920 u = (LTI)提供的,u = 0.9920 MPCOBJ)提供的(t = 2.60, 0.9896 u = (LTI)提供的,u = 0.9896 MPCOBJ)提供的(t = 2.80,u = 0.9925 (LTI)提供的,u = 0.9925 MPCOBJ)提供的(t = 3.00, 0.9964 u = (LTI)提供的,u = 0.9964 MPCOBJ)提供的(t = 3.20, 0.9990 u = (LTI)提供的,u = 0.9990 MPCOBJ)提供的(t = 3.40, 1.0002 u = (LTI)提供的,u = 1.0002 MPCOBJ)提供的(t = 3.60, 1.0004 u = (LTI)提供的,u = 1.0004 MPCOBJ)提供的(t = 3.80, 1.0003 u = (LTI)提供的,u = 1.0003 MPCOBJ)提供的(t = 4.00, 1.0001 u = (LTI)提供的,u = 1.0001 MPCOBJ)提供的(t = 4.20,u= 1.0000(由LTI提供),u= 1.0000(由MPCOBJ提供)t= 4.40, u= 0.9999(由LTI提供),u= 0.9999(由MPCOBJ提供)t= 4.60, u= 1.0000(由LTI提供),u= 1.0000(由MPCOBJ提供)t= 4.80, u= 1.0000(由LTI提供),u= 1.0000(由MPCOBJ提供)

画出结果。

数字%创建数字情节(0:Ts: Tstop-Ts YY)小区植物产量%网格%添加网格标题(“无约束MPC控制:工厂产量”%添加标题包含(的时间(秒)将标签添加到x轴ylabel (“y”%将标签添加到y轴

运行一个关闭所有控制器约束的闭环模拟更容易使用sim卡,因为您只需要指定“关闭”约束相关字段mpcsimopt模拟选项对象。

SimOptions = mpcsimopt;创建模拟选项对象SimOptions。约束s =“关闭”移除所有MPC约束SimOptions。未测量扰动= d;%未测量输入干扰sim (mpcobj Nf, r, v, SimOptions);%运行闭环模拟

使用Simulink进行模拟金宝app

您还可以在Simulink中模拟MPC控制器。金宝app

要比较结果,请使用在设计MPC控制器部分中使用的约束和默认估计器重新创建MPC对象。

mpcobj = mpc(plantDSS,Ts,10,3);mpcobj。MV = struct(“最小值”,0,“马克斯”, 1“杀鼠灵”, -10,“RateMax”10);mpcobj. model .扰动= tf(平方根(1000),[1 0]);
- - - >“权重。属性为空。假设默认值为0.00000。- - - >“权重。属性为空。假设默认为0.10000。- - - >“权重。OutputVariables属性为空。假设默认值为1.00000。

得到连续时间植物的状态空间矩阵。

[A,B,C,D] = ssdata(plantCSS);获得状态空间实现

打开mpc_miso金宝appSimulink模型进行闭环仿真。植物模型是用一个连续的状态空间块实现的。

open_system (“mpc_miso”

其中,植物输入信号u(t)、v(t)、d(t)分别表示被操作变量、测量输入扰动、未测量输入扰动,y(t)为测量输出。块参数是构成连续时间对象状态空间实现的矩阵,是五种状态的初始条件。MPC控制器是用MPC控制器块实现的,它有工作区MPC对象mpcobj作为参数,被操纵变量作为输出,被测植物输出、参考信号和被测植物输入扰动分别作为输入。四个Scope块描绘了五个循环信号,这些信号也由四个To-Workspace块保存(除了参考信号)。

利用simulink对闭环系统进行仿真金宝appsim卡命令。注意,此命令(模拟Simulink模型,相当于单击模型中的“Run”按钮)不同于金宝appsim卡MPC工具箱提供的命令(而不是用LTI工厂在一个循环中模拟MPC控制器)。

sim卡(“mpc_miso”
假设测量的输出通道1没有任何扰动。——>”模式。噪音" property is empty. Assuming white noise on each measured output.

要显示模拟结果,请打开四个Scope窗口

open_system (“mpc_miso / MV”) open_system (“mpc_miso /输出/ /引用”) open_system (“mpc_miso / MD”) open_system (“mpc_miso / UD”

作用域窗口中的图等效于“使用sim卡命令和模拟闭环响应与模型不匹配部分,由于在模拟闭环响应中使用sim卡命令未测量的干扰信号为零,并且在模型失配的模拟闭环响应中,将噪声添加到设备输入和输出中。还要注意的是,货币政策委员会sim卡命令内部使用ZOH方法离散任何连续的植物模型,Simulink通常使用集成算法(在本例中金宝app数值)来模拟连续时间块存在时的闭环。

运行模拟与正弦输出噪声。

假设输出测量受到频率为0.1 Hz的正弦干扰(单音传感器噪声)的影响。

= 2* /10;干扰径向频率%

打开mpc_misonoise金宝appSimulink模型,类似于mpc_miso模型除了正弦扰动添加到测量输出。仿真时间较长,且未测扰动先于实测扰动出现。

open_system (“mpc_misonoise”打开新的Simulin金宝appk模型

由于这个噪声是预期的,您可以指定一个噪声模型来帮助状态估计器忽略它。这样可以提高控制器的抗干扰能力。

mpcobj.Model.Noise = 0.5*tf(ω ^2,[1 0 ω ^2]);%测量噪声模型

修改MPC设计,将未测量输入上的扰动模型指定为均值和方差为零的高斯白噪声0.1

setindist (mpcobj特遣部队(0.1));%静态增益

在这种情况下,你不能在未测量的输入和输出上都使用积分器作为扰动模型,因为这违反了状态可观察性。因此,当为输入扰动模型指定静态增益时,由离散积分器组成的输出扰动模型将自动添加到控制器中。这种输出扰动模型有助于控制器在输出端抑制阶跃式和缓慢变化的扰动。

getoutdist (mpcobj)
假设添加到测量输出通道#1的输出扰动是集成白噪声。在NoiseModel中插入了一个馈通通道,以防止估计器设计的问题。ans = A = x1 x1 1 B = u1 x1 0.2 C = x1 MO1 1 D = u1 MO1 0采样时间:0.2秒离散时间状态空间模型。

较大的测量噪声会降低状态估计的精度。为了使控制器不那么激进,并降低其噪声敏感性,减少输出变量跟踪的权重。

mpcobj。权重= struct(“MV”,0,“MVRate”, 0.1,机汇的, 0.005);新重量%

为了给卡尔曼滤波器更多的时间来成功估计状态,将预测视界增加到40。

mpcobj。Predictionhorizon = 40;%新预测层

运行模拟145秒。

sim卡(“mpc_misonoise”, 145)第二个参数是模拟持续时间
假设添加到测量输出通道#1的输出扰动是集成白噪声。在NoiseModel中插入了一个馈通通道,以防止估计器设计的问题。

要显示模拟结果,请打开四个Scope窗口

open_system (“mpc_misonoise / MV”) open_system (“mpc_misonoise /输出/ /引用/ /噪音”) open_system (“mpc_misonoise / MD”) open_system (“mpc_misonoise / UD”

卡尔曼滤波器在50秒后成功地学会忽略测量噪声。未测扰动和已测扰动在10到20秒的时间跨度内被拒绝。正如预期的那样,被操纵的变量保持在0到1之间的区间内。

bdclose所有%关闭所有打开的Simulink模金宝app型而不保存任何更改关闭所有%关闭所有打开的数字

另请参阅

对象

功能

应用程序

相关的话题