主要内容

nlmpcmove

计算最优控制行动非线性MPC控制器

描述

非线性MPC

mv= nlmpcmove (nlmpcobj,x,lastmv)计算当前时间的最优控制行动。模拟闭环非线性MPC控制,电话nlmpcmove反复。

例子

mv= nlmpcmove (nlmpcobj,x,lastmv,裁判)指定工厂引用值输出。如果你不指定参考价值,nlmpcmove使用默认0。

mv= nlmpcmove (nlmpcobj,x,lastmv,裁判,医学博士)指定运行时测量干扰值。如果你的控制器测量干扰,你必须指定医学博士

例子

mv= nlmpcmove (nlmpcobj,x,lastmv,裁判,医学博士,选项)指定额外的运行时选项计算最优控制动作。使用选项,您可以指定初始猜测状态和操纵变量轨迹,更新优化权重约束,或修改预测模型参数。

例子

(mv,选择)= nlmpcmove (___)返回一个nlmpcmoveopt对象包含初始猜测状态和操作轨迹用于下一个控制间隔。

例子

(mv,选择,信息)= nlmpcmove (___)返回其他解决方案的细节,包括最后的优化代价函数值和最优操纵变量,状态,和输出轨迹。

多级非线性MPC

例子

mv= nlmpcmove (nlmpcMSobj,x,lastmv)计算当前时间的最优控制行动。模拟闭环非线性MPC控制,电话nlmpcmove反复。

mv= nlmpcmove (nlmpcobj,x,lastmv,simdata)指定额外的simdata结构,其中包含测量干扰,运行时,参数状态和阶段函数和初始猜测状态轨迹和操纵变量。一般来说重要的是返回一个新的simdata(包含更新初始猜测)作为第二输出参数,使用下面的语法。

(mv,simdata)= nlmpcmove (___)返回一个更新simdata结构,包含新的初始猜测状态和操作轨迹用于下一个控制间隔。良好的初始猜测是重要的,因为他们帮助解决者更快地收敛到一个解决方案。

(mv,simdata,信息)= nlmpcmove (___)返回其他解决方案的细节,包括最后的优化代价函数值和最优操纵变量,状态,和输出轨迹。

例子

全部折叠

创建非线性MPC控制器与六个州,六个输出,和四个输入。

nx = 6;纽约= 6;ν= 4;nlobj = nlmpc (nx、纽约、ν);
在标准成本函数、零重量默认应用到一个或多个ov因为有MVs比ov少。

指定控制器样品时间和视野。

t = 0.4;p = 30;c = 4;nlobj。Ts= Ts; nlobj.PredictionHorizon = p; nlobj.ControlHorizon = c;

指定预测模型状态函数和雅可比矩阵的状态函数。对于这个示例,使用模型的飞行机器人。

nlobj.Model。StateFcn =“FlyingRobotStateFcn”;nlobj.Jacobian。StateFcn =“FlyingRobotStateJacobianFcn”;

指定一个自定义代价函数控制器,取代了标准的成本函数。

nlobj.Optimization。CustomCostFcn = @ (X, U, e,数据)Ts *金额(金额(U (1: p)));nlobj.Optimization。ReplaceStandardCost = true;

指定一个自定义的约束函数控制器。

nlobj.Optimization。CustomEqConFcn = @ (X, U,数据)X(最终:)”;

指定线性约束的操纵变量。

ct = 1:νnlobj.MV (ct)。最小值= 0;nlobj.MV (ct)。Max = 1;结束

验证预测模型和自定义函数在初始状态(x0)和初始输入(情况)的机器人。

x0 =(-10; -10;π/ 2,0,0,0);情况= 0(ν,1);validateFcns (nlobj x0,情况);
Model.StateFcn是OK. Jacobian.StateFcn is OK. No output function specified. Assuming "y = x" in the prediction model. Optimization.CustomCostFcn is OK. Optimization.CustomEqConFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.

计算最优状态轨迹和操纵变量,返回的信息

[~,~,信息]= nlmpcmove (x0, nlobj情况);
松弛变量未使用或zero-weighted定制成本函数。所有约束将是非常困难的。

情节最优轨迹。

FlyingRobotPlotPlanning(信息)
最佳的燃油消耗= 4.712383

图包含6轴。轴1标题x包含一个类型的对象。y轴2标题包含一个类型的对象。θ轴3和标题包含一个类型的对象。4轴标题vx包含一个类型的对象。轴与标题5 v包含一个类型的对象。轴与标题ω6包含一个类型的对象。

图包含4轴。与标题推力轴1 u(1)包含一个楼梯类型的对象。与标题推力轴2 u(2)包含一个楼梯类型的对象。与标题推力轴3 u(3)包含一个楼梯类型的对象。与标题推力轴4 u(4)包含一个楼梯类型的对象。

图包含一个轴。轴与标题最优轨迹包含62个补丁类型的对象,线。

创建一个非线性MPC控制器有四个州,两个输出,和一个输入。

nlobj = nlmpc (4 2 1);
在标准成本函数、零重量默认应用到一个或多个ov因为有MVs比ov少。

指定控制器的样品时间和视野。

t = 0.1;nlobj。Ts= Ts; nlobj.PredictionHorizon = 10; nlobj.ControlHorizon = 5;

指定控制器的状态函数,在这个文件中pendulumDT0.m。离散时间模型集成了连续时间模型中定义pendulumCT0.m使用多步向前欧拉方法。

nlobj.Model。StateFcn =“pendulumDT0”;nlobj.Model。IsContinuousTime = false;

预测模型使用一个可选参数,Ts,代表样品时间。指定参数的数量。

nlobj.Model。NumberOfParameters = 1;

指定的输出函数模型,通过样本时间参数作为输入参数。

nlobj.Model。OutputFcn = @ (x, u, Ts) [x (1);x (3)];

控制器定义标准的约束。

nlobj.Weights。OutputVariables = 3 [3];nlobj.Weights。ManipulatedVariablesRate = 0.1;nlobj.OV (1)。最小值= -10;nlobj.OV (1)。Max = 10;nlobj.MV。最小值= -100;nlobj.MV。Max = 100;

验证预测模型的功能。

x0 =[0.1; 0.2; 0.3 -π/ 2,);情况= 0.4;validateFcns (nlobj x0,情况,[],{Ts});
Model.StateFcn是OK. Model.OutputFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.

只有两个植物状态是可衡量的。因此,创建一个扩展卡尔曼滤波估计的四个工厂。其状态转换函数中定义pendulumStateFcn.m和它的测量中定义的函数pendulumMeasurementFcn.m

EKF = extendedKalmanFilter (@pendulumStateFcn @pendulumMeasurementFcn);

为模拟定义初始条件,初始化扩展卡尔曼滤波器的状态,并指定一个零初始操纵变量值。

x =[0, 0, -π;0];y = x (x (1); (3)];卡尔曼滤波器。国家= x;mv = 0;

指定输出的参考价值。

yref = [0 0];

创建一个nlmpcmoveopt对象,并指定样本的时间参数。

nloptions = nlmpcmoveopt;nloptions。参数= {Ts};

运行仿真10秒。在每个控制周期:

  1. 纠正之前的预测使用当前的测量。

  2. 计算最优控制移动使用nlmpcmove。这个函数返回计算最优序列nloptions。通过更新的选择对象nlmpcmove在接下来的控制区间为最优序列提供了最初的猜测。

  3. 预测模型。

  4. 应用第一个计算最优控制移动到工厂,工厂更新状态。

  5. 生成与白噪声传感器数据。

  6. 保存植物状态。

时间= 10;xHistory = x;ct = 1(时间/ Ts):%纠正之前的预测xk =正确(卡尔曼滤波器,y);%计算最优控制动作[mv, nloptions] = nlmpcmove (yref nlobj xk, mv, [], nloptions);%为下一次迭代预测模型预测状态预测(卡尔曼滤波器,[mv;Ts]);%实现第一次最优控制移动x = pendulumDT0 (x, mv, Ts);%生成传感器数据3 y = x ([1]) + randn (2, 1) * 0.01;%保存植物状态xHistory = [xHistory x];结束

情节产生的状态轨迹。

图次要情节(2 2 1)情节(0:Ts:持续时间、xHistory(1:))包含(“时间”)ylabel (“z”)标题(“车位置”次要情节(2,2,2)情节(0:Ts:持续时间、xHistory(2:))包含(“时间”)ylabel (“zdot”)标题(“车速度”次要情节(2,2,3)图(0:Ts:持续时间、xHistory(3:))包含(“时间”)ylabel (“θ”)标题(“摆角”次要情节(2,2,4)图(0:Ts:持续时间、xHistory(4:))包含(“时间”)ylabel (“thetadot”)标题(“摆速度”)

图包含4轴。轴1标题车位置包含一个类型的对象。轴与标题2车速度包含一个类型的对象。轴3和标题摆角包含一个类型的对象。以标题摆速度轴4包含一个类型的对象。

这个例子展示了如何创建和模拟一个非常简单的多级闭环MPC控制器。

创建一个多级MPC控制器

创建一个多级mpc对象与地平线5步骤,一个州,一个操纵变量。

nlmsobj = nlmpcMultistage (5、1、1);

指定的状态转换函数预测模型(mystatefcn定义在文件的末尾)。

nlmsobj.Model。StateFcn =@mystatefcn;

为三个阶段(指定成本函数mycostfcn定义在文件的末尾)。

我= 3:6 nlmsobj.Stages (6)。CostFcn = @mycostfcn;结束

模拟闭环控制器

初始化植物状态和输入。

x = 3;mv = 0;

验证功能。

validateFcns (nlmsobj x, mv);
Model.StateFcn是OK. "CostFcn" of the following stages 6 are OK. Analysis of user-provided model, cost, and constraint functions complete.

模拟控制回路的10个步骤。

k = 1:10 mv = nlmpcmove (nlmsobj x, mv);%计算移动(没有最初的猜测)x = x + (mv-sqrt (x)) * 1;%更新x: x (t + 1) = x (t) + xdot * Ts结束

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

disp ([“x =最终值”num2str (x)))
x = 0.57118的最终值
disp ([“mv =最终值”num2str (mv)))
最终值的mv = 0.75571

金宝app支持功能

状态转换函数。

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

阶段成本函数。

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

这个例子展示了如何创建和模拟一个非常简单的多级闭环MPC控制器。

创建一个多级MPC控制器

创建一个多级mpc对象7步骤地平线,一个国家,一个操纵变量。

nlmsobj = nlmpcMultistage (7, 1, 1);

指定的状态转换函数预测模型(mystatefcn定义在文件的末尾)。

nlmsobj.Model。StateFcn =@mystatefcn;

最佳实践是使用雅克比时可用,否则解算器必须数值计算。

指定状态转换函数的雅可比矩阵(mystatejacobian定义在文件的末尾)。

nlmsobj.Model。StateJacFcn = @mystatejac;

指定所有阶段的成本函数除了前两个(mycostfcn定义在文件的末尾)。

i =三nlmsobj.Stages (6)。CostFcn = @mycostfcn;结束

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

初始化植物状态和输入。

x = 3;mv = 0;

创建初始模拟数据结构。

simdata = getSimulationData (nlmsobj)
simdata =结构体字段:StateMin: [] StateMax: [] MVMin: [] MVMax: [] InitialGuess: []

验证函数和数据结构。

validateFcns (nlmsobj x, mv, simdata);
Model.StateFcn是OK. Model.StateJacFcn is OK. "CostFcn" of the following stages 6 are OK. Analysis of user-provided model, cost, and constraint functions complete.

模拟闭环控制器

模拟控制回路的10个步骤。

k = 1:10 [mv, simdata] = nlmpcmove (nlmsobj x, mv, simdata);%计算移动x = x + (mv-sqrt (x)) * 1;%更新x: x (t + 1) = x (t) + xdot * Ts结束

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

disp ([“x =最终值”num2str (x)))
x = 1.6556的最终值
disp ([“mv =最终值”num2str (mv)))
最终值的mv = 1.2816

金宝app支持功能

状态转换函数。

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

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

函数[A, B] = mystatejac (x ~) = 1 / (2 * x ^ (1/2));B = 1;结束

阶段成本函数。

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

输入参数

全部折叠

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

目前的预测模型,指定为一个向量的长度Nx,在那里Nx预测模型的状态数。由于非线性MPC控制器不执行状态估计,您必须测量或估计当前状态预测模型在每个时间间隔的控制。关于非线性MPC预测模型的更多信息,请参阅为非线性MPC指定预测模型

控制信号用于控制区间,以前工厂指定为一个向量的长度Nmv,在那里Nmv是操纵变量的数量。

请注意

指定lastmv由于被控变量的信号应用于植物在前面的控制区间。通常,这些信号控制器所产生的价值,尽管这并非总是如此。例如,如果您的控制器是离线和跟踪模式下运行;即控制器输出不是开工厂,然后给实际控制信号last_mv可以帮助实现无扰转移时,控制器将重新上线。

植物输出参考价值,指定为一个行向量的长度Ny或数组Ny列,Ny输出变量的数量。如果你不指定裁判,默认引用值是零。

使用相同的参考价值在预测地平线,指定一个行向量。

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

测量扰动值,指定为一个行向量的长度N医学博士或数组N医学博士列,N医学博士是测量扰动的数量。如果你的控制器测量干扰,你必须指定医学博士。如果你的控制器没有测量干扰,指定医学博士作为[]

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

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

运行时选项,指定为一个nlmpcmoveopt对象。使用这些选项,您可以:

  • 调整控制器权重

  • 更新线性约束

  • 设置控制变量的目标

  • 指定预测模型参数

  • 为国家提供初始猜测和操纵变量轨迹

这些选项只适用于当前nlmpcmove瞬间的时间。

提高求解效率,最佳实践为国家指定初始猜测和操纵变量轨迹。

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

模拟运行时数据结构。它必须是最初创建的getSimulationData,然后填充被传递给前(如果需要)nlmpcmove作为输入参数。更新版本然后总是作为第二输出参数返回nlmpcmove。请注意,MVMin,MVMax,StateMin,StateMax,MVRateMin,MVRateMax字段只有如果你想需要在运行时更改这些界限。这些字段存在于返回的结构getSimulationData只有当你让他们明确当调用getSimulationData。的simdata结构有以下字段。

测量扰动值,指定为一个行向量的长度N医学博士或数组N医学博士列,N医学博士是测量扰动的数量。如果你的多级MPC对象有任何干扰测量通道定义,您必须指定MeasuredDisturbance。如果您的控制器没有测量干扰,这个领域不存在所产生的结构getSimulationData

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

态函数参数值,指定为一个向量的长度等于价值Model.ParameterLength多级控制器对象的属性。如果Model.StateFcn需要一个参数向量,你必须在运行时使用这个字段提供值。如果Model.ParameterLength0这个领域不存在返回的结构getSimulationData

阶段函数参数值,指定为一个向量长度等于中的所有值的总和(我).ParameterLength阶段多级控制器对象的属性。如果任何成本或约束函数中定义阶段房地产需求参数向量,在运行时必须提供所有参数向量(堆叠在一列)使用这个字段。如果没有你的舞台函数参数,这个领域不存在返回的结构getSimulationData

所有阶段的参数向量必须堆放在列向量StateFcnParameters为:

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

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

如果没有TerminalStatesimdata然后终端状态约束(如果存在)在运行时不会改变。

决策变量的初始猜测,指定为一个列向量的长度等于所有决策变量向量的长度之和为每个阶段。良好的初始猜测是重要的,因为他们帮助解决者更快地收敛到一个解决方案。当模拟控制回路通过调用nlmpcmove反复循环,因此,重要的是通过simdata作为一个输入参数(所以可以使用初始猜测),同时返回一个更新的版本simdata(新的初始猜测接下来的控制区间),作为输出参数。

的初始猜测所有阶段必须堆放在列向量InitialGuess为:

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

如果InitialGuess[],默认的初始猜测的计算xlastmv参数传递给nlmpcmove)。

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

输出参数

全部折叠

最优操纵变量控制行动,作为一个列向量的长度返回Nmv,在那里Nmv是操纵变量的数量。

如果解决收敛于局部最优的解决方案(info.ExitFlag是积极的),然后呢mv包含最优解。

如果解算器达到最大迭代次数没有找到一个最佳的解决方案(info.ExitFlag= 0):

  • nlmpcobj.Optimization.UseSuboptimalSolution真正的,然后mv包含了次优的解决方案

  • nlmpcobj.Optimization.UseSuboptimalSolution,然后mv包含lastmv

如果解决失败(info.ExitFlag是负的),然后呢mv包含lastmv

运行时选项与初始猜测状态和操纵变量轨迹用于下一个控制区间,作为一个返回nlmpcmoveopt对象。任何您指定使用的运行时选项选项,如重量、约束或参数,复制选择

最初的猜测州(opt.X0)和操纵变量(opt.MV0最优轨迹计算nlmpcmove和对应于最后p1行info.Xoptinfo.MVopt,分别。

使用这些初始猜测未来控制区间,指定选择随着选项输入参数nlmpcmove

解决方案的细节,作为结构与以下字段返回。

最优操纵变量序列,作为(返回p+ 1)——-Nmv数组,p预测地平线和吗Nmv是操纵变量的数量。

MVopt(我,:)包含了计算最优操纵变量值k +张,因为我= 1,…,p,在那里k是当前时间。:MVopt (1)包含相同的操纵变量值作为输出参数mv。由于控制器不计算最优控制移动k + p,:MVopt (p + 1)等于MVopt (p,:)

最优预测模型状态序列,作为(返回p+ 1)——-Nx数组,p预测地平线和吗Nx在预测模型的状态数。

Xopt(我,:)包含计算状态值k +张,因为我= 2,…,p + 1,在那里k是当前时间。:Xopt (1)目前的状态是一样的吗x

最优输出变量序列,作为(返回p+ 1)——-Ny数组,p预测地平线和吗Ny是输出的数量。

Yopt(我,:)包含计算输出值k +张,因为我= 2,…,p + 1,在那里k是当前时间。:Yopt (1)计算基于当前状态x和当前测量的干扰医学博士,如果任何。

预测地平线时间序列,返回一个列向量的长度p+ 1,p是预测地平线。Topt包含了时间序列k时间k+p,在那里k是当前时间。

Topt (1)= 0表示当前时间。随后的时间步长Topt(我)Ts *(张),在那里Ts是控制器样品时间。

使用Topt当策划MVopt,Xopt,或Yopt序列。

堆叠松弛变量向量,用于约束软化。如果所有元素为零,那么所有软约束满足整个预测地平线。如果任何元素大于零,那么至少有一个软约束违反。

所有阶段堆积的松弛变量向量为:

第一阶段(松弛变量向量;%如果松弛变量向量用于第二阶段;%如果使用…松弛变量向量阶段p + 1;%如果使用)

优化退出代码,返回以下之一:

  • 正整数,找到最优解

  • 0——可行的次优解发现后的最大迭代数

  • 负整数——没有找到可行的解决方案

非线性规划求解器使用的迭代次数,作为一个正整数返回。

目标函数成本,作为一个负的标量值返回。成本量化程度控制器实现其目标。

成本值才有意义ExitFlag是负的。

运行时仿真数据更新,包含新的初始猜测状态和操作轨迹用于下一个控制间隔。这是一个与以下领域的结构。

测量扰动值,指定为一个行向量的长度N医学博士或数组N医学博士列,N医学博士是测量扰动的数量。如果你的多级MPC对象有任何干扰测量通道定义,您必须指定MeasuredDisturbance。如果您的控制器没有测量干扰,这个领域不存在所产生的结构getSimulationData

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

态函数参数值,指定为一个向量的长度等于价值Model.ParameterLength多级控制器对象的属性。如果Model.StateFcn需要一个参数向量,你必须在运行时使用这个字段提供值。如果Model.ParameterLength0这个领域不存在返回的结构getSimulationData

阶段函数参数值,指定为一个向量长度等于中的所有值的总和(我).ParameterLength阶段多级控制器对象的属性。如果任何成本或约束函数中定义阶段房地产需求参数向量,在运行时必须提供所有参数向量(堆叠在一列)使用这个字段。如果没有你的舞台函数参数,这个领域不存在返回的结构getSimulationData

所有阶段的参数向量必须堆放在列向量StateFcnParameters为:

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

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

如果没有TerminalStatesimdata然后终端状态约束(如果存在)在运行时不会改变。

决策变量的初始猜测,指定为一个列向量的长度等于所有决策变量向量的长度之和为每个阶段。良好的初始猜测是重要的,因为他们帮助解决者更快地收敛到一个解决方案。当模拟控制回路通过调用nlmpcmove反复循环,因此,重要的是通过simdata作为一个输入参数(所以可以使用初始猜测),同时返回一个更新的版本simdata(新的初始猜测接下来的控制区间),作为输出参数。

的初始猜测所有阶段必须堆放在列向量InitialGuess为:

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

如果InitialGuess[],默认的初始猜测的计算xlastmv参数传递给nlmpcmove)。

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

提示

在闭环仿真,这是最佳实践温暖的开始非线性解算器通过使用状态和操纵变量轨迹预测从先前的控制区间作为初始猜测当前控制区间。使用这些轨迹作为初始猜测:

  1. 返回选择输出参数时调用nlmpcmove。这nlmpcmoveopt对象包含任何运行时选项你前面调用中指定nlmpcmove与最初的猜测状态(opt.X0)和操纵变量(opt.MV0)轨迹。

  2. 通过这个对象中选项输入参数nlmpcmove在接下来的控制区间。

这些步骤是一个最佳实践,即使你不指定任何其他运行时选项。

介绍了R2018b