主要内容

getSimulationData

创建数据结构来模拟多级MPC控制器nlmpcmove

自从R2021a

描述

使用这个函数创建一个默认的数据结构来模拟的多级MPC控制器nlmpcmove函数。

对生成的数据结构的信息mpcmoveCodeGeneration,请参阅getCodeGenerationData

例子

simdata= getSimulationData (nlmpcMSobj)创建一个初始模拟数据结构的使用nlmpcmove

例子

全部折叠

这个例子展示了如何创建和模拟一个简单的多级MPC控制器闭环使用初始猜测,用MATLAB®函数nlmpcmove

创建多级MPC控制器

创建一个多级MPC对象的七个步骤,一个国家,一个操纵变量。

msobj = nlmpcMultistage (7, 1, 1);

定义您的状态和成本函数作为单独的文件在当前文件夹在文件夹在MATLAB路径建议,作为本地函数不支持C / c++的生成部署代码。金宝app但是,对于这个示例,状态,成本,和州雅可比矩阵函数被定义为本地函数结束时的例子。

指定的状态转换函数预测模型。

msobj.Model。StateFcn = @mystatefcn;

作为一项最佳实践,解决使用雅克比当他们是可用的,否则必须数值计算。你也可以自动生成一个雅可比矩阵函数使用generateJacobianFunction

指定状态转换函数的雅可比矩阵。

msobj.Model。StateJacFcn = @mystatejac;

指定除第一次调用外的所有阶段的成本函数

i = 2:8 msobj.Stages(我)。CostFcn = @mycostfcn;结束

定义初始条件,创建数据结构,并验证功能

初始化植物状态和输入。

x = 3;mv = 0;

创建初始模拟数据结构。

simdata = getSimulationData (msobj)
simdata =结构体字段:InitialGuess: []

验证函数和数据结构。

validateFcns (msobj x, mv, simdata);
Model.StateFcn是OK. Model.StateJacFcn is OK. "CostFcn" of the following stages [2 3 4 5 6 7 8] are OK. Analysis of user-provided model, cost, and constraint functions complete.

在闭环模拟控制器

模拟控制回路5步骤。

k = 1:5 (mv, simdata) = nlmpcmove (msobj x, mv, simdata);%计算和更新simdata移动[~,xhist] =数值(@ (t, xode) mystatefcn (xode mv) [0 msobj.Ts], x);%模拟植物样品的时间x = xhist(结束);%更新植物状态结束

自更新初始猜测提供作为输入参数内simdata结构,nlmpcmove不需要重新计算他们在每个时间步,节省了计算时间,提高了性能。更新初始猜测在每一个时间步是一个最佳实践。

显示最后的状态和操作变量值。

disp ([“x =最终值”num2str (x)))
x = -0.039868的最终值
disp ([“mv =最终值”num2str (mv)))
最终值的mv = -0.067044

金宝app支持功能

状态转换函数。

函数xdot = mystatefcn (x, u) xdot = u-sin (x);结束

雅可比矩阵的状态转换函数。

函数[A, B] = mystatejac (x, ~) = cos (x);B = 1;结束

阶段成本函数。

函数j = mycostfcn (s, x, u) j = abs (u) / s + s * x ^ 2;结束

输入参数

全部折叠

多级非线性MPC控制器,指定为一个nlmpcMultistage对象。

输出参数

全部折叠

运行时仿真数据,指定为以下字段的结构。

测量扰动值,指定为一个行向量的长度N医学博士或数组N医学博士列,N医学博士是测量扰动的数量。如果你的多级MPC对象有任何干扰测量通道定义,您必须指定MeasuredDisturbance。如果你的控制器没有测量干扰,你可以省略结构或指定它作为这个领域[]

使用相同的扰动值预测地平线,指定一个行向量。

不同的扰动值预测地平线k时间k+p,指定数组p+ 1行。在这里,k当前时间和吗p是预测地平线。每行包含一个预测地平线的扰动值的步骤。如果你指定不到p行,nlmpcmove使用最后一行中的值来预测地平线的其余步骤。

如果您定义测量扰动输入对象,你必须提供他们通过simdata在运行时。

操纵变量下界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVMin(:,我)取代了ManipulatedVariables .Min(我)在运行时控制器的属性。

使用相同的范围在整个预测地平线,指定一个行向量。

不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。

如果simdata不包含MVMin场,然后操纵变量下界输入对象(如果存在)在运行时不会改变。

操纵变量上界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVMax(:,我)取代了ManipulatedVariables .Max(我)在运行时控制器的属性。

使用相同的范围在整个预测地平线,指定一个行向量。

不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。

如果simdata不包含MVMax场,然后操纵变量上界输入对象(如果存在)在运行时不会改变。

被控变量率下界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVRateMin(:,我)取代了ManipulatedVariables .RateMin(我)在运行时控制器的属性。MVRateMin范围必须是负的。

使用相同的范围在整个预测地平线,指定一个行向量。

不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。

如果simdata不包含MVRateMin字段,然后操纵可变利率下限输入对象(如果存在)在运行时不会改变。

被控变量率上界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVRateMax(:,我)取代了ManipulatedVariables .RateMax(我)在运行时控制器的属性。MVRateMax范围必须是负的。

使用相同的范围在整个预测地平线,指定一个行向量。

不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。

如果simdata不包含MVRateMax场,然后操纵变量率上界输入对象(如果存在)在运行时不会改变。

州下界,指定为一个行向量的长度Nx或一个矩阵Nx列,Nx的状态数。StateMin(:,我)取代了州.Min(我)在运行时控制器的属性。

使用相同的范围在整个预测地平线,指定一个行向量。

不同范围的预测地平线k+ 1,k+p,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。

如果simdata不包含StateMin字段,那么国家下界输入对象(如果存在)在运行时不会改变。

州上界,指定为一个行向量的长度Nx或一个矩阵Nx列,Nx的状态数。StateMax(:,我)取代了州.Max(我)在运行时控制器的属性。

使用相同的范围在整个预测地平线,指定一个行向量。

不同范围的预测地平线k+ 1,k+p,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。

如果simdata不包含StateMax字段,那么国家上界输入对象(如果存在)在运行时不会改变。

态函数参数值,指定为一个向量的长度等于价值Model.ParameterLength多级控制器对象的属性。如果Model.StateFcn需要一个参数向量,您必须提供其值在运行时使用这个字段,否则你可以省略这一领域或设置它[]

阶段函数参数值,指定为一个向量长度等于中的所有值的总和(我).ParameterLength阶段多级控制器对象的属性。如果任何成本或约束函数中定义阶段房地产需求参数向量,在运行时必须提供所有参数向量(堆叠在一列)使用这个字段,否则你可以省略这一领域或设置它[]

你必须栈参数向量列向量的所有阶段StageFcnParameters如下。

阶段1(参数向量;参数向量为第二阶段;…参数向量阶段p + 1;]

终端状态,指定为一个列向量和尽可能多的元素的数量。终端状态所需的状态在最后预测步骤。指定所需的终端状态通过这个领域在运行时,您必须指定的有限值TerminalState场的模型的属性nlmpcMSobj。指定你不需要的国家限制终端价值。在运行时,nlmpcmove忽略任何值TerminalState领域的simdata对应于nlmpcMSobj。如果你不指定任何终值条件nlmpcMSobj,这个领域不是中创建simdata

如果simdata不包含TerminalState场,那么终端状态约束输入对象(如果存在)在运行时不会改变。

决策变量的初始猜测,指定为一个行向量的长度等于长度之和为每个阶段的所有决策变量向量。

你一定是堆栈的初始猜测所有阶段的列向量InitialGuess如下。

阶段1(状态向量的估计;被控变量向量猜第一阶段;被控变量向量率猜第一阶段;%如果使用松弛变量向量猜第一阶段;%如果状态向量估计用于第二阶段;被控变量向量猜第二阶段;被控变量向量率猜第二阶段;%如果猜松弛变量向量用于第二阶段;%如果使用…状态向量估计阶段p + 1; manipulated variable vector guess for stage p+1; manipulated variable vector rate guess for stage p+1; % if used slack variable vector guess for stage p+1; % if used ]

如果InitialGuess[],然后nlmpcmove计算的初始猜测xlastmv参数。

一般来说,在闭环仿真,您没有指定InitialGuess你自己。相反,当调用nlmpcmove,返回simdata输出参数,其中包含计算初始猜测下一个控制间隔。然后您可以通过simdata作为输入参数nlmpcmove在接下来的控制区间。这些步骤是一个最佳实践,即使你不指定任何其他运行时选项。

版本历史

介绍了R2021a