主要内容

多输入单输出工厂的模型预测控制

这个例子展示了如何为具有一个测量输出、一个操纵变量、一个测量干扰和一个未测量干扰的对象设计模型预测控制器。

定义工厂模型

定义植物模型。对于此示例,请使用每个输入到输出的连续时间传输函数。在命令行中显示工厂模型。

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

对于此示例,在传递到MPC控制器创建功能之前,显式将工厂转换为离散时间的状态空间形式。

控制器创建功能可以接受连续时间或离散时间对象。当建立被操纵变量最优值的优化问题时,MPC控制器利用零阶保持器自动将连续时间对象(任何格式)转换为离散时间状态空间模型。

将工厂转换为离散时间是有用的,当您需要用于分析或模拟的离散时间系统矩阵(如本示例中)或希望控制器使用与ZOH之外的方法转换的离散时间工厂。

plantCSS=ss(plantTF);从传递函数转换%植物到连续时间状态空间t = 0.2;%指定样本时间为0.2秒plantDSS =汇集(plantCSS, Ts);使用零阶保持将植物转换为离散时间状态空间

默认情况下,所有的植物输入信号都被假定为被操纵的变量。使用setmpcsignal指定哪些信号是测量的,哪些是未测量的干扰。在本例中,第一个输入信号是操纵变量,第二个是测量的干扰,第三个是未测量的干扰。此信息存储在设备模型中plantDSS后来被MPC控制器使用。

Plantdss = setmpcsignals(Plantdss,'mv', 1'MD'2,'UD',3);%指定信号类型

MPC控制器设计

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

mpcobj = mpc (plantDSS Ts 10 3);
-->“mpc”对象的“Weights.manufacturedVariables”属性为空。假设默认值为0.00000。-->“mpc”对象的“Weights.manufacturedVariablesRate”属性为空。假设默认值为0.10000。-->“mpc”对象的“Weights.OutputVariables”属性为空。假设违约1.00000。

由于未指定控制器要最小化的二次成本函数的权重,因此假定其值为默认值(0表示操纵变量,0.1表示操纵变量,1表示输出变量)。此外,此时MPC问题仍然是无约束的,因为您尚未指定任何约束。

定义受操纵变量的硬约束。

mpcobj.MV=struct('min'0,'最大限度', 1'ratemin',-10,'ratemax'10);

输入和输出干扰模型分别指定了输入和输出上未测量干扰的动态特性,因此它们可以更好地拒绝。默认情况下,除非您否则指定它们,否则假设这些干扰模型是集成商。MPC对象还具有噪声模型,用于指定测量输出变量上的噪声的动态。默认情况下,假定这是一个单位静态增益,这相当于假设噪声是白色的。在该示例中,没有测量的输出干扰,因此不需要指定输出干扰模型,并且假设测量输出信号上的噪声是白色的。

指定因白噪声驱动的Intactiancator的未测量输入的干扰模型=1000

mpcobj.model.disturbance = tf(sqrt(1000),[1 0]);

显示MPC控制器对象mpcobj.检查其属性。

mpcobj.
MPC对象(于23:06:50创建):-------------------------------------------采样时间:0.2(秒)预测地平线:10控制地平线:3植物模型:------------- 1操纵变量- > |5州|||  - > 1测量输出1测量干扰(S) - > |3个输入|||  - > 0未测量的输出1个未测量的干扰(S) - > |1输出| -------------- Indices: (input vector) Manipulated variables: [1 ] Measured disturbances: [2 ] Unmeasured disturbances: [3 ] (output vector) Measured outputs: [1 ] Disturbance and Noise Models: Output disturbance model: default (type "getoutdist(mpcobj)" for details) Input disturbance model: user specified (type "getindist(mpcobj)" for more details) Measurement noise model: default (unity gain after scaling) Weights: ManipulatedVariables: 0 ManipulatedVariablesRate: 0.1000 OutputVariables: 1 ECR: 100000 State Estimation: Default Kalman Filter (type "getEstimator(mpcobj)" for details) Constraints: 0 <= MV1 <= 1, -10 <= MV1/rate <= 10, MO1 is unconstrained

显示输入干扰模型。正如预期的那样,将指定的积分器转换为离散时间。

getindist(mpcobj)
ans = A = x1 x1 1 B = Noise#1 x1 0.8 C = x1 UD1 7.906 D = Noise#1 UD1 0采样时间:0.2秒

显示输出扰动模型。正如所料,它是空的。

getoutdist (mpcobj)
假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量输出通道上都有白噪声。ANS =空状态空间模型。

检查稳态偏移

为了检查MPC控制器是否能够抑制恒定输出干扰和跟踪恒定偏移的恒定偏移恒定设定点,从输出干扰计算闭环直流增益以使用该输出的控制输出cloffset命令。这也被称为闭环的稳态输出灵敏度。

DC = cloffset(mpcobj);fprintf('DC增益从输出干扰输出=%5.8f(=%g)\ n',DC,DC);
从输出干扰到输出的DC增益= 0.00000000(= 5.77316E-15)

零增益(通常是控制器将积分器作为输入或输出扰动模型的结果)意味着被测对象的输出将跟踪期望的输出参考设定值。

模拟闭环响应使用模拟命令

模拟命令提供了一种快速的方法,在约束和权重保持不变的情况下,用线性定常对象在闭环中模拟MPC控制器,并且扰动和参考信号可以轻松地提前完全指定。

首先,确定仿真时间、参考信号和干扰信号

Tstop=30;%模拟时间nf =圆形(tstop / ts);%模拟步骤数r =那些(nf,1);%输出参考信号v = [0 (Nf / 3,1); 1 (2 * Nf / 3,1)];%测量输入干扰信号

运行闭环仿真和绘图结果。该植物指明mpcobj.Model.Plant在闭环中用作植物模型,并且作为控制器使用的内部工厂模型,以预测对预测地平线的响应。使用模拟使用参考R和测量的输入干扰v模拟NF步骤的闭环系统。

SIM(MPCOBJ,NF,R,V)%模拟闭环中的工厂和控制器

被操纵的变量最初会达到上限,并在几秒钟内使植物输出达到参考值。然后它在其允许的最大值1处稳定下来。10秒后,测量到的干扰信号从0上升到1,导致植物的输出超过其参考值约30%。被操纵的变量为了抵制扰动而达到下界。控制器能够在几秒钟后将被操纵变量的输出恢复到参考值,并且被操纵变量将处于其最小值。未测扰动信号始终为零,因为尚未指定未测扰动。

您可以使用模拟选项对象来指定额外的模拟选项以及馈送到工厂但对控制器未知的噪声和干扰信号。对于此示例,请使用模拟选项对象指定未测量的输入干扰信号以及在操纵变量和测量输出上的加性噪声​​。您还将稍后使用此选项对象指定用于模拟的工厂,其与控制器内部使用的工厂不同。使用默认选项和无信号创建模拟选项对象。

simoptions = mpcsimopt;%创建对象

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

d = [0 (2 * Nf / 3,1); -0.5 * 1 (Nf / 3,1)];%定义阶跃干扰信号SimOptions.unmeasureddisturance=d;%指定未测量的输入干扰信号

在模拟选项对象中指定噪声信号。在仿真时间,仿真功能在向控制器送到控制器之前直接将指定的输出噪声添加到测量的输出。在将其送到工厂之前,它还直接将指定的输入噪声添加到操纵变量(不到任何干扰信号)。

simoptions.outputnoise = .001 *(兰特(NF,1) - 。5);%指定输出测量噪声simoptions.inputnoise = .05 *(兰特(NF,1) - 。5);%指定噪声对被操纵变量的噪声

注意,你也可以使用OutputNoise仿真选项对象的字段,以在测量的工厂输出上指定更一般的添加剂输出干扰信号(例如,例如步骤)。

使用模拟有额外的辛伐斯参数来模拟闭环系统,并将结果保存到工作区中的变量Y,| t |,| U |,和XP..这使您可以选择在一个新的数字窗口,并在任何给定的颜色和顺序绘制信号。

[y, t, u, xp] = sim (Nf mpcobj, r, v, SimOptions);%模拟闭环

情节结果。

数字%创建新图次要情节(2,1,1)%创建上部子图绘图(0:NF-1,Y,0:NF-1,R)% plot plant output and reference plot plant output and reference标题('输出'%添加标题所以上的插曲ylabel('mo1'%添加一个标签到上y轴网格%添加网格到上限子图(2,1,2)%创建较低的子图情节(0:NF-1,U)%绘图操纵变量标题('输入');%添加标题以便降低子批次包含('模拟步骤'%将标签添加到较低x轴ylabel(“MV1”将标签添加到下y轴网格给下面的子图添加一个网格

尽管噪声(其在操纵的可变地块上特别可见)并且尽管分别在50和100个步骤后踢出测量和未测量的扰动,但是控制器能够实现和保持良好的跟踪。在初始模拟的初始部分(从20至50)的初始部分之后,操纵变量在约0上沉降,在约0处拒绝测量的扰动(步骤从70至100),并且在约0.5时拒绝两个干扰(步骤从120到150)。

模拟模型不匹配的闭环响应

测试MPC控制器对模型失配的鲁棒性。将模拟中要使用的真实设备指定为Trueplantcs.

truePlantTF = TF({1,1,1},{[1 0.8 1],[1 2],[6 0.6 1]})%指定和显示传输函数truePlantCSS = ss (truePlantTF);%转换为连续状态空间truePlantCSS=setmpcsignals(truePlantCSS,'mv', 1'MD'2,'UD',3);%指定信号类型
truePlantTF =从输入1输出:1 ---------------秒2 + 0.8 S + 1从输入2到输出:1 ----- S + 2从输入3输出:1 ------------------- 0.6秒^ 2个+ 0.6 S + 1连续时间的传递函数。

通过指定来更新模拟选项对象simoptions.model.为具有两个字段的结构,植物(包含真正的植物模型)和义务(包含真实工厂的操作点值)。对于此示例,未指定状态导数和输入的标称值,因此假设它们为零,导致y = simoptions.model.nominal.y + C *(x-simoptions.model.nominal.x)在哪里xY分别是状态和植物的测量的输出。

simoptions.model.= struct('植物',truePlantCSS);%创建的结构和分配“设备”字段simoptions.model.nominal.y = 0.1;%创建并分配“名称”字段SimOptions.Model.Nominal.X = -。1*[1 1 1 1];%create并分配“名词.x”字段SimOptions.PlantInitialState = [0.1 0 -0.1 0 0.05];%指定真实工厂的初始状态

移除先前添加到测量输出和操纵变量的任何信号

simoptions.outputnoise = [];%删除输出测量噪声simoptions.inputnoise = [];%在操纵变量上删除噪声

运行闭环仿真得出结果。自从simoptions.model.不是空的,,SimOptions.Model.Plant将其转换为离散时间(采用零阶保持器),作为闭环仿真中的被控对象模型,而mpcobj.Model.Plant仅用于控制器以预测对预测地平线的响应。

SIM(MPCobj,NF,R,V,SimOptions)%模拟闭环
——>模型转换为离散时间。

由于模型不匹配,响应中的一些劣化可见,值得注意的是,控制器需要多一段时间来实现跟踪,并且操纵变量现在在约0.5时沉淀以拒绝测量的干扰(从5到10秒看值)并在大约0.9定居以拒绝输入干扰(从25到30秒)。尽管如此,控制器仍然能够跟踪输出参考。

软化约束

每个约束都与称为ECR值的无量纲参数相关联。允许具有较大ECR值的约束违反具有较小ECR值的约束。默认情况下,被操纵变量上的所有约束都具有零的ECR值,使它们很难。您可以为约束指定非零ECR值以使其软。

注意,可以引用漫画variables.场也m.放松操纵变量的约束从难以柔软。

mpcobj.mv.minecr = 1;% ECR为被操纵变量的下界mpcobj.mv.maxecr = 1;% ECR为被操纵变量的上限值

定义输出约束。默认情况下,输出变量(测量输出)的所有约束都有一个ECR值为1,这使得它们很软。您可以降低输出约束的ECR值,以使其更加困难,但是总是建议保持输出约束的软性。这主要是因为植物的输出依赖于植物的状态以及测量到的干扰,因此,如果发生大的干扰,植物的输出可以独立地违反mpc控制器采取的任何控制行为的约束,特别是当操纵变量本身是硬有界的。这种不可避免的对硬约束的违背会导致不可行的MPC问题,对于这个问题无法计算出MV。

mpcobj.ov.max = 1.1;%定义(软)输出约束%注意,可以参考| OutputVariables |还字段| OV |。

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

SIM(MPCOBJ,NF,R,V)%模拟闭环
假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量输出通道上都有白噪声。

为了拒绝测量干扰,实现跟踪,并防止输出高于1.1软约束,控制器轻微违反了操作上的软约束变量,达到小负值从10秒11(你可以放大图片更清楚地看到这个违反)。对测量输出的约束比对操纵变量的约束更严重。

惩罚更多违反输出约束的行为并重新运行模拟。

mpcobj.ov.maxecr = 0.001;%越接近零,就越难约束SIM(MPCOBJ,NF,R,V)%运行新的闭环仿真。
假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量输出通道上都有白噪声。

现在,控制器仅很轻微地违反了输出约束。正如预期的那样,这种输出性能改进的代价是更多地违反操纵变量约束(操纵变量在几个步骤中达到-3)。

更改卡尔曼收益用于内置的状态估计

在每个时间步长,MPC控制器通过将离散时间对象状态(如果可用)乘以增益矩阵(通过求解约束二次优化问题计算)得到被操纵变量。由于对象状态通常是不可用的,默认情况下,控制器使用线性卡尔曼滤波器作为观测器来估计离散时间增广对象(即扰动和噪声模型的综合对象)的状态。因此,控制器的状态就是这个卡尔曼滤波器的状态,而这个卡尔曼滤波器的状态又是增广离散时间对象状态的估计。

在模型不匹配和未测量干扰的情况下,使用默认估计器进行闭环仿真,并返回控制器状态结构XC.在工作区中,以便稍后可以比较状态序列。

[y,t,u,xp,xc] = sim(mpcobj,nf,r,v,simoptions);
——>模型转换为离散时间。

显示控制器状态结构的组件

XC.
XC =带有字段的结构:工厂:[150x5双]干扰:[150x1双]噪声:[150x0双] Lastmove:[150x1双]

阴谋默认观察者估计将电站输出的响应以及植物状态

数字;%创建人物次要情节(2,1,1)%创建上部子图轴情节(t,y)%图y与时间的关系标题('植物输出');%添加标题到上图ylabel('是'%添加一个标签到上y轴网格%添加网格上图子图(2,1,2)%创建较低的子图轴plot(t,xc.plant)%plot xc.plant与时间标题(“推测机械设备状态”);%添加标题较低的阴谋包含(“时间(秒)”%将标签添加到较低x轴ylabel('XC'将标签添加到下y轴网格%添加网格下面的图

正如预期的那样,由于测量和未测量的扰动信号分别踢进了10和20秒的突然变化。

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

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

计算并显示默认观察者的极点。请注意,正如预期的那样,它们都在单位圆内,尽管其中一些似乎相对靠近边界。注意,有六种状态,五种属于工厂模型,第六种属于输入扰动模型。

e = eig (A1-A1 * M * Cm1)观察者状态矩阵的%特征值
e=0.5708+0.4144i0.5708-0.4144i0.4967+0.0000i0.9334+0.1831i0.9334-0.1831i0.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没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量输出通道上都有白噪声。——>模型转换为离散时间。

绘制植物输出响应以及新观察员估计的植物状态

数字;%创建人物次要情节(2,1,1)%创建上部子图轴情节(t,y)%图y与时间的关系标题('植物输出');%添加标题到上图ylabel('是'%添加一个标签到上y轴网格%添加网格上图子图(2,1,2)%创建较低的子图轴plot(t,xc.plant)%plot xc.plant与时间标题(“推测机械设备状态”);%添加标题较低的阴谋包含(“时间(秒)”%将标签添加到较低x轴ylabel('XC'将标签添加到下y轴网格%添加网格下面的图

正如预期的那样,控制器状态与先前绘制的不一样,而且整个闭环响应有点慢。

模拟开环响应

在开环中测试设备和控制器的行为模拟命令。设置开环旗帜到,并提供操纵变量序列以激发系统。

simoptions.openloop =.“开”%设置打开循环选项SimOptions。mSignal = sin((0:Nf-1)'/10);%定义了操纵可变信号

模拟包含真实工厂的开环系统(以前指定的simoptions.model.)然后是控制器。由于参考信号将被忽略,因此可以避免指定它。

SIM(MPCOBJ,NF,[],V,SIMOPTIONS)%模拟开环系统
——>模型转换为离散时间。

在闭环中使用mpcmove

在闭环的更一般情况下,其中控制器被应用于非线性或时间变化的工厂,约束或权重可以在运行时改变,或者干扰和参考信号很难提前完全指定,可以使用这mpcmove在For循环中的每个步骤中的功能,以模拟闭环中的MPC控制器。如果您的工厂是连续时间,则需要将其转换为离散时间(使用任何方法)以使用for循环模拟它。

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

[A, B, C, D] = ssdata (plantDSS);%离散时间植物植物SS矩阵Tstop=30;%的仿真时间X = [0 0 0 0]';%的植物的初始状态xmpc = mpcstate(mpcobj);MPC控制器的%初始状态r = 1;%输出参考信号

显示控制器的初始状态。注意这是一个MPCState.对象(不是简单的结构),仅包含当前时间的控制器状态(不是当前时间之前的整个历史,如sim返回的结构)。它还包含估计协方差矩阵。在每个模拟步骤中,都需要更新xmpc与新的控制器状态。

xmpc%控制器状态
MPCSTATE对象与字段Plant: [0 0 0 0] Disturbance: 0 Noise: [1x0 double] LastMove: 0 Covariance: []

定义工作空间阵列YYuu.存储闭环轨迹,使他们能够在模拟后绘制。

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];%存储电流输出%计算MPC动作(u)和更新控制器状态(xmpc)使用mpcmove%注意,即使它是一个输入参数,MPCMove也会更新XMPC!u = mpcmove(mpcobj,xmpc,y,r,v);%XMPC,Y,R,V是当前步骤k的值%植物方程式:状态更新你可能想在这里模拟一个更复杂的植物状态行为。x = a * x + b(:,1)* u + b(:,2)* v + b(:,3)* d;%计算下一个状态并更新当前状态UU=[UU,u];%储存电流输入结束

绘制的结果。

数字%创建人物次要情节(2,1,1)%创建上部子图轴情节(0:TS:TSTOP-TS,YY)%图YY与时间的关系ylabel('是'%添加一个标签到上y轴网格%添加网格上图标题('输出'%添加标题到上图子图(2,1,2)%创建较低的子图轴情节(0:Ts: Tstop-Ts UU)%plot uu与时间ylabel('是'将标签添加到下y轴包含(“时间(秒)”%将标签添加到较低x轴网格%添加网格下面的图标题('输入'%添加标题较低的阴谋

如果在模拟的任何时候你想检查从那个点开始的最佳预测轨迹,它们可以返回mpcmove也假设从当前状态(xxmpc),而参考设定点改变为0.5,并且扰动已经消失(在预测视界期间,两个信号保持不变)。

r = 0.5;% 参考v = 0;% 骚乱[〜,信息] = mpcmove(mpcobj,xmpc,Y,R,V);%解超预测层

显示info变量。

信息
info=带字段的结构:Uopt:[11x1 double]Yopt:[11x1 double]Xopt:[11x6 double]Topt:[11x1 double]Slack:0迭代次数:1 QPCode:“可行”成本:0.1399

信息是包含预测的操纵变量,植物状态和输出的预测地平线的结构。通过求解二次优化问题以最小化成本函数,将该序列与最佳移动一起计算。植物状态和产出信息导致直接应用最佳操纵变量序列mpcobj.Model.Plant,以开放的方式。因此,这种开环优化过程不等同于模拟由工厂,估算器和控制器组成的闭环,使用模拟命令或mpcmove迭代地在循环中。

提取预测的最佳轨迹。

TOPT = info.Topt;% 时间Yopt = Info.Opt;%预测最佳植物模型输出uopt = info.Uopt;%预测最佳MV序列

使用楼梯图绘制轨迹。使用阶梯图,因为使用直接直线,正常图可以简单地将每个计算点连接到以下一个,而最佳离散时间信号在每个步骤中立即跳跃并保持恒定,直到下一步。这种差异特别可见,因为植物输出仅绘制了10个间隔(并且仅为操纵变量为3)。

数字%创建新图次要情节(2,1,1)%创建上部子图楼梯(Topt,Yopt)%情节yopt在阶梯图形标题('预测输出的最佳序列'将标题添加到上部副图网格%将栅格添加到上部子地块子图(2,1,2)%创建较低的子图楼梯(TOPT,uopt)%plot Uopt在楼梯图中标题(“操纵变量的优化序列”将标题添加到上部副图网格%将栅格添加到上部子地块

MPC控制器的线性表示

当约束未激活时,MPC控制器的行为就像一个线性控制器。请注意,对于有限的非后退地平线的有限时间无约束线性二次调节器问题,值函数是时间依赖的,这导致最佳反馈增益是时变的。相比之下,在MPC中,地平线具有恒定的长度,因为它始终倒退,导致时间不变的值函数,因此在时间不变的最佳反馈增益中。

您可以获得MPC控制器的状态空间形式。

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

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

(铝、提单、CL, DL) = ssdata (LTI);%获取状态空间矩阵

初始化用于闭环模拟原始MPC控制器的闭环模拟,而没有约束和线性化控制器

mpcobj.mv = [];%删除输入约束mpcobj。OV = [];%删除输出约束tstop = 5;设定模拟时间%y = 0;%设置纽号测量输出r = 1;%设置输出参考设定点(常量)u = 0;%设置以前(初始)输入命令X = [0 0 0 0]';%植物的设置的初始状态xmpc = mpcstate(mpcobj);设定无约束MPC控制器的初始状态xL的=零(大小(BL,1),1);设定线性化MPC控制器的初始状态yy = [];%定义工作空间阵列以存储工厂输出
假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量输出通道上都有白噪声。

用相同的对象模型在闭环中模拟两个控制器

对于k = 0:圆形(tstop / ts)-1yy = [yy,Y];%储存电流输出以绘制目的%定义测量的扰动信号V(k)。v = 0;如果K * TS> = 10 V = 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);%不受约束的MPC(这也更新XMPC)U = CL * XL + DL * [Y; R; V];%不受约束的线性化MPC%比较两个控制动作dispStr(K + 1)= {sprintf的('t=%5.2f,u=%7.4f(由LTI提供),u=%7.4f(由MPCOBJ提供)',k*Ts,u,uMPC)};%#好的<*SAGROW>无约束线性化MPC控制器的%更新状态xL=AL*xL+BL*[y;Rv] );%更新工厂状态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,U = 1.0192(由LTI提供),U = 1.0192(由MPCOBJ提供)T = 1.80,U= 1.0511(由LTI提供),U = 1.0511(由MPCOBJ提供)T = 2.00,U = 1.0304(由LTI提供)中,u = 1.0304吨= 2.20(由MPCOBJ提供),U = 1.0053(由LTI提供),U = 1.0053(由MPCOBJ提供)T = 2.40,U = 0.9920(由LTI提供),U = 0.9920(由MPCOBJ提供)T = 2.60,U = 0.9896(由LTI提供),U = 0.9896(由MPCOBJ提供)T = 2.80,U = 0.9925(由LT提供I)中,U = 0.9925(由MPCOBJ提供)T = 3.00,U = 0.9964(由LTI提供),U =(由MPCOBJ提供)T = 3.20,U = 0.9990(由LTI提供),U = 0.9990(条件0.9964通过MPCOBJ)T = 3.40,U = 1.0002(由LTI提供),U = 1.0002(由MPCOBJ提供)T = 3.60,U = 1.0004(由LTI提供),U = 1.0004(由MPCOBJ提供)T = 3.80,U= 1.0003(由LTI提供),U = 1.0003(由MPCOBJ提供)T = 4.00,U = 1.0001(由LTI提供)中,u = 1.0001吨= 4.20(由MPCOBJ提供),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 (provided by LTI), u= 1.0000 (provided by MPCOBJ)

绘制的结果。

数字%创建人物情节(0:TS:TSTOP-TS,YY)%阴谋厂输出网格%添加网格标题('不受约束的MPC控制:植物输出'% 添加标题包含(“时间(秒)”%将标签添加到X轴ylabel('是'%将标签添加到y轴

运行闭环仿真,其中关闭所有控制器约束更容易使用模拟,正如您只需要指定“关闭”约束相关领域mpcsimopt模拟选择对象。

simoptions = mpcsimopt;%创建模拟选项对象simoptions.constraints =.“关闭”%删除所有MPC限制SimOptions.unmeasureddisturance=d;%未测量的输入干扰SIM(MPCobj,NF,R,V,SimOptions);%运行闭环仿真

使用Simulink®进行模拟金宝app

金宝appSimulink是一个用于多域系统仿真的图形框图环境。您可以连接表示动态系统的块(在这种情况下,工厂和MPC控制器)并模拟闭环。除了在视觉上表示系统及其互连的事实,一个关键差异是Simulink可以使用更广泛的集成算法来解决基础系统微分方程。金宝app金宝appSimulink还可以自动生成C(或PLC)代码并将其部署用于实时应用程序。

%要运行该示例的这一部分,需要Simulink(R)。金宝app检查一下安装金宝app%simulink,否则显示消息并返回如果〜mpcchecktoolboxinstalled('金宝appsimulink'%如果未安金宝app装simulinkdisp ('金宝app运行此部分示例需要Simulink(R)。'返回%执行到底这里结束

使用原始约束和原始默认估算器重新创建原始MPC对象,因此您可以轻松比较结果。

mpcobj = mpc (plantDSS Ts 10 3);mpcobj.MV=struct('min'0,'最大限度', 1'ratemin',-10,'ratemax',10); mpcobj.Model.扰动=tf(sqrt(1000),[10]);
-->“mpc”对象的“Weights.manufacturedVariables”属性为空。假设默认值为0.00000。-->“mpc”对象的“Weights.manufacturedVariablesRate”属性为空。假设默认值为0.10000。-->“mpc”对象的“Weights.OutputVariables”属性为空。假设违约1.00000。

提取要控制的(连续时间)工厂的状态空间矩阵,因为要打开的Simulink模型需要它们。金宝app

[a,b,c,d] = ssdata(plantcs);%获得状态空间实现

打开已有的Simulink模型进行闭环仿真。金宝app该模型采用连续状态空间块实现,并采用ode45积分算法计算其连续时间响应。

%块输入是u(t), v(t)和d(t)表示操纵%变量,测量的输入干扰和未测量的输入干扰,%, y(t)为测量输出。块的参数%构成连续时间的状态空间实现的矩阵%植物,以及5个州的初始条件。%的MPC控制器与MPC控制器块,实现该%将工作空间mpc对象| mpcobj |作为参数,则%变量作为输出,然后被测设备输出,参考信号,%和测量植物输入干扰分别为输入。%四个scopeblock绘制5个循环信号,它们也被保存%四到工作区的块(基准之外的信号)。Open_System(“mpc_miso”

模拟使用Simulink中系统金宝app模拟命令。请注意,此命令(模拟Simulink模型,等效单击模型中的“运行”按钮)与金宝app模拟MPC工具箱提供的命令(而是在带LTI工厂的循环中模拟MPC控制器)。

SIM(“mpc_miso”
假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量输出通道上都有白噪声。

这个地块范围块与图1、2和3中的块等效,由于第一次模拟(图1和图2)中未测量的干扰信号为零,即第二次模拟(图3)将噪声添加到设备输入和输出中,因此差异较小。还要注意的是,虽然MPC模拟命令在内部离散地离散使用ZOH的任何连续工厂模型,Simulink通常使用积分算法(在该示例oDe45中)来模拟当存在连续时间块时模拟闭环金宝app。

使用正弦输出噪声运行模拟。

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

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

打开mpc_misonoise金宝appSimulink模型。除了在测量输出上注入的正弦扰动之外,它类似于“MPC_MISO”模型。还有不同的是,模拟时间现在设置为150秒,并且未测量和测量的输入干扰分别在60和120秒之后起作用。注意,与先前的模拟不同,不测量的干扰首先启动。这允许响应未测量的干扰,从60到120秒进行绘制和分析更清晰。

Open_System('mpc_misonoise'%打开新的Simuli金宝appnk模型

由于预期该噪声,在测量噪声模型中将其指定将有助于状态估计器忽略它,从而提高状态估计的质量并允许整个控制器在跟踪输出参考时更好地拒绝干扰。

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

通过指定未测量输入的干扰模型来修改MPC设计,作为具有零均值和方差的白色高斯噪声0.1.这允许更好地拒绝通用非恒定干扰(以牺牲更差的输入恒定干扰为代价)。

mpcobj.Model.Disturbance =特遣部队(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。重量=结构('mv'0,'mvrate', 0.1,'ov',0.005);%新砝码

通过自己,新重量会惩罚操纵变量太大,导致带宽(慢速)控制器非常低。这将导致输出变量滞留在参考的后面,以获得许多步骤。将偏移范围增加至40允许控制器完全考虑输出误差的成本40步,而不是仅为10,从而放置一些强调跟踪。

mpcobj.predictionhorizo​​n = 40;%新的预测地平线

运行模拟145秒

SIM('mpc_misonoise',145)%第二个参数是模拟持续时间
——>假设添加到测量输出通道#1的输出扰动为集成白噪声。- >插入NoiseModel中的馈通通道,以防止估算器设计的问题。

卡尔曼滤波器成功学习在50秒后,以忽略测量噪声。未测量和测量的扰动被拒绝在10至20秒时间跨度。最后,如预期的那样,操纵在间隔可变停留在0和1之间。

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

另见

||

相关话题