nlmpcmove
语法
描述
非线性MPC
多级非线性MPC
例子
计划使用非线性MPC最优轨迹
创建一个非线性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(信息,Ts)
最佳的燃油消耗= 1.884953
使用非线性MPC控制器模拟闭环控制
创建一个非线性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
秒。在每个控制周期:
纠正之前的预测使用当前的测量。
计算最优控制移动使用
nlmpcmove
。这个函数返回计算最优序列nloptions
。通过更新的选择对象nlmpcmove
在接下来的控制区间为最优序列提供了最初的猜测。预测模型。
应用第一个计算最优控制移动到工厂,工厂更新状态。
生成与白噪声传感器数据。
保存植物状态。
时间= 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”)标题(“摆速度”)
创建和模拟多级非线性MPC控制器
这个例子展示了如何创建和模拟一个简单的多级MPC控制器闭环,不使用初始猜测,MATLAB®函数nlmpcmove
。
创建多级MPC控制器
创建一个多级非线性MPC对象五步地平线,一个国家,一个操纵变量。
msobj = nlmpcMultistage (5、1、1);
编写一个简单的状态函数作为一个字符串。
sstr =“函数xdot = mystatefcn (x, u)”+换行符+…“xdot = u-sin (x);“+换行符+“结束”;
写的字符串mystatefcn.m
文件。
sfid = fopen (“mystatefcn.m”,“w”);写入文件(sfid sstr,“字符”);文件关闭(sfid);
编写一个简单的成本函数为字符串。
装运箱=“函数c = mycostfcn (k, x, u)”+换行符+…“c = abs (u) / k + k * x ^ 2;”+换行符+“结束”;
写的字符串mycostfcn.m
文件。
cfid = fopen (“mycostfcn.m”,“w”);写入文件(cfid装运箱,“字符”);文件关闭(cfid);
或者,您可以编写您的状态和成本MATLAB函数在当前文件夹(推荐因为不支持本地函数生成部署代码)。万博1manbetx
如果文件还没有被写入硬盘停顿五秒之前访问它们。
如果~ (“mystatefcn”,“文件”)暂停(5)结束
指定的状态转换函数预测模型。
msobj.Model。StateFcn =“mystatefcn”;
去年三个阶段指定的成本函数。
为i =三6 msobj.Stages(我)。CostFcn =“mycostfcn”;结束
注意,因为国家的雅可比矩阵函数提供的不是在这里,nlmpcmove
需要在每个时间步,数值计算的负面影响性能。作为一项最佳实践,供应状态函数的雅可比矩阵,如图所示模拟多级非线性MPC控制器使用初始猜测。你也可以自动生成一个雅可比矩阵函数使用generateJacobianFunction
。
在闭环模拟控制器
初始化植物状态和输入。
x = 3;mv = 0;
验证功能。
validateFcns (msobj x, mv);
Model.StateFcn是OK. "CostFcn" of the following stages [3 4 5 6] are OK. Analysis of user-provided model, cost, and constraint functions complete.
模拟控制回路5步骤,没有更新初始猜测。使用欧拉方法dx (t) / dt ~ (x (t + 1) - x (t)) / Ts
模拟植物。
为k = 1:5 mv = nlmpcmove (msobj x, mv);%计算移动(没有最初的猜测)x = x + 0.2 * mystatefcn (x, mv);%更新植物状态假设Ts = 0.2 s结束
注意,因为最初的猜测并不提供作为输入参数,nlmpcmove
需要重新计算他们在每个时间步,消极地影响性能。不提供初始猜测可能是一个可以接受的起点,但一般不建议。作为一项最佳实践,在每个时间步,使用更新后的初始猜测所示模拟多级非线性MPC控制器使用初始猜测,所以nlmpcmove
不需要重新计算在每个时间步(在相同的示例还使用吗数值
植物的进化计算状态,直到下一个控制间隔)。
显示最终状态和操作变量的值。
disp ([“x =最终值”num2str (x)))
x = 1.3074的最终值
disp ([“mv =最终值”num2str (mv)))
最终值的mv = -0.35102
模拟多级非线性MPC控制器使用初始猜测
这个例子展示了如何创建和模拟一个简单的多级MPC控制器闭环使用初始猜测,用MATLAB®函数nlmpcmove
。
创建多级MPC控制器
创建一个多级MPC对象的七个步骤,一个国家,一个操纵变量。
msobj = nlmpcMultistage (7, 1, 1);
定义您的状态和成本函数作为单独的文件在当前文件夹在文件夹在MATLAB路径建议,作为本地函数不支持C / c++的生成部署代码。万博1manbetx但是,对于这个示例,状态,成本,和州雅可比矩阵函数被定义为本地函数结束时的例子。
指定的状态转换函数预测模型。
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
万博1manbetx支持功能
状态转换函数。
函数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;结束
输入参数
nlobj
- - - - - -非线性MPC控制器
nlmpc
对象
非线性MPC控制器,指定为一个nlmpc
对象。
x
- - - - - -当前状态预测模型
向量
目前的预测模型,指定为一个向量的长度Nx,在那里Nx预测模型的状态数。由于非线性MPC控制器不执行状态估计,您必须测量或估计当前状态预测模型在每个时间间隔的控制。关于非线性MPC预测模型的更多信息,请参阅为非线性MPC指定预测模型。
lastmv
- - - - - -控制信号用于工厂之前的控制区间
向量
控制信号用于控制区间,以前工厂指定为一个向量的长度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
对象
运行时选项,指定为一个nlmpcmoveopt
对象。使用这些选项,您可以:
调整控制器权重
更新线性约束
设置控制变量的目标
指定预测模型参数
为国家提供初始猜测和操纵变量轨迹
这些选项只适用于当前nlmpcmove
瞬间的时间。
提高求解效率,最佳实践为国家指定初始猜测和操纵变量轨迹。
msobj
- - - - - -非线性多级MPC控制器
nlmpcMultistage
对象
多级非线性MPC控制器,指定为一个nlmpcMultistage
对象。
simdata
- - - - - -运行时仿真数据
结构
运行时仿真数据,指定为结构。它必须是最初创建的getSimulationData
,然后填充被传递给前(如果需要)nlmpcmove
作为输入参数。更新版本然后总是作为第二输出参数返回nlmpcmove
。请注意,MVMin
,MVMax
,StateMin
,StateMax
,MVRateMin
,MVRateMax
字段只有如果你想需要在运行时更改这些界限。这些字段存在于返回的结构getSimulationData
只有当你让他们明确当调用getSimulationData
。的simdata
结构有以下字段。
MeasuredDisturbance
——测量扰动值
[]
(默认)| |行向量数组
测量扰动值,指定为一个行向量的长度N医学博士或数组N医学博士列,N医学博士是测量扰动的数量。如果你的多级MPC对象有任何干扰测量通道定义,您必须指定MeasuredDisturbance
。如果您的控制器没有测量干扰,这个领域不存在所产生的结构getSimulationData
。
使用相同的扰动值预测地平线,指定一个行向量。
不同的扰动值预测地平线k时间k+p,指定数组p+ 1行。在这里,k当前时间和吗p是预测地平线。每行包含一个预测地平线的扰动值的步骤。如果你指定不到p行,最后一行中的值用于预测地平线的其余步骤。
MVMin
——被控变量下界
[]
(默认)| |矩阵行向量
操纵变量下界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVMin(:,我)
取代了ManipulatedVariables .Min(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
MVMax
——操纵变量上界
[]
(默认)| |矩阵行向量
操纵变量上界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVMax(:,我)
取代了ManipulatedVariables .Max(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
MVRateMin
——被控变量率下界
[]
(默认)| |矩阵行向量
被控变量率下界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVRateMin(:,我)
取代了ManipulatedVariables .RateMin(我)
在运行时控制器的属性。MVRateMin
范围必须是负的。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
MVRateMax
——被控变量率上界
[]
(默认)| |矩阵行向量
被控变量率上界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVRateMax(:,我)
取代了ManipulatedVariables .RateMax(我)
在运行时控制器的属性。MVRateMax
范围必须是负的。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
StateMin
——国家下界
[]
(默认)| |矩阵行向量
州下界,指定为一个行向量的长度Nx或一个矩阵Nx列,Nx的状态数。StateMin(:,我)
取代了州.Min(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k+ 1,k+p,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
StateMax
——国家上界
[]
(默认)| |矩阵行向量
州上界,指定为一个行向量的长度Nx或一个矩阵Nx列,Nx的状态数。StateMax(:,我)
取代了州.Max(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k+ 1,k+p,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
StateFcnParameters
——状态函数参数值
[]
(默认)|向量
态函数参数值,指定为一个向量的长度等于价值Model.ParameterLength
多级控制器对象的属性。如果Model.StateFcn
需要一个参数向量,你必须在运行时使用这个字段提供值。如果Model.ParameterLength
是0
这个领域不存在返回的结构getSimulationData
。
StageFcnParameters
——阶段函数参数值
[]
(默认)|向量
阶段函数参数值,指定为一个向量长度等于中的所有值的总和(我).ParameterLength阶段
多级控制器对象的属性。如果任何成本或约束函数中定义阶段
房地产需求参数向量,在运行时必须提供所有参数向量(堆叠在一列)使用这个字段。如果没有你的舞台函数参数,这个领域不存在返回的结构getSimulationData
。
你必须栈参数向量列向量的所有阶段StateFcnParameters
如下。
阶段1(参数向量;参数向量为第二阶段;…参数向量阶段p + 1;]
InitialGuess
——决策变量的初始猜测
[]
(默认)|向量
决策变量的初始猜测,指定为一个列向量的长度等于所有决策变量向量的长度之和为每个阶段。良好的初始猜测是重要的,因为他们帮助解决者更快地收敛到一个解决方案。因此,当模拟控制回路通过调用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
是[]
,默认的初始猜测的计算x
和lastmv
参数传递给nlmpcmove
。
一般来说,在闭环仿真,您没有指定InitialGuess
你自己。相反,当调用nlmpcmove
,返回simdata
输出参数,其中包含计算初始猜测下一个控制间隔。然后您可以通过simdata
作为输入参数nlmpcmove
在接下来的控制区间。这些步骤是一个最佳实践,即使你不指定任何其他运行时选项。
输出参数
mv
——最优操纵变量控制行动
列向量
最优操纵变量控制行动,作为一个列向量的长度返回Nmv,在那里Nmv是操纵变量的数量。
如果解决收敛于局部最优的解决方案(info.ExitFlag
是积极的),然后呢mv
包含最优解。
如果解算器达到最大迭代次数没有找到一个最佳的解决方案(info.ExitFlag= 0
):
nlobj.Optimization.UseSuboptimalSolution
是真正的
,然后mv
包含了次优的解决方案nlobj.Optimization.UseSuboptimalSolution
是假
,然后mv
包含lastmv
如果解决失败(info.ExitFlag
是负的),然后呢mv
包含lastmv
。
选择
——运行时选项初始猜测
nlmpcmoveopt
对象
运行时选项与初始猜测状态和操纵变量轨迹用于下一个控制区间,作为一个返回nlmpcmoveopt
对象。任何您指定使用的运行时选项选项
,如重量、约束或参数,复制选择
。
最初的猜测州(opt.X0
)和操纵变量(opt.MV0
最优轨迹计算nlmpcmove
和对应于最后p1行info.Xopt
和info.MVopt
,分别。
使用这些初始猜测未来控制区间,指定选择
随着选项
输入参数nlmpcmove
。
信息
——解决方案细节
结构
解决方案的细节,作为结构与以下字段返回。
MVopt
——最优操纵变量序列
数组
最优操纵变量序列,作为(返回p+ 1)——-Nmv数组,p预测地平线和吗Nmv是操纵变量的数量。
MVopt(我,:)
包含了计算最优操纵变量值k +张
,因为我= 1,…,p
,在那里k
是当前时间。:MVopt (1)
包含相同的操纵变量值作为输出参数mv
。由于控制器不计算最优控制移动k + p
,:MVopt (p + 1)
等于MVopt (p,:)
。
Xopt
——最优预测模型状态序列
数组
最优预测模型状态序列,作为(返回p+ 1)——-Nx数组,p预测地平线和吗Nx在预测模型的状态数。
Xopt(我,:)
包含计算状态值k +张
,因为我= 2,…,p + 1
,在那里k
是当前时间。:Xopt (1)
目前的状态是一样的吗x
。
Yopt
——最优输出变量序列
数组
最优输出变量序列,作为(返回p+ 1)——-Ny数组,p预测地平线和吗Ny是输出的数量。
Yopt(我,:)
包含计算输出值k +张
,因为我= 2,…,p + 1
,在那里k
是当前时间。:Yopt (1)
计算基于当前状态x
和当前测量的干扰医学博士
,如果任何。
Topt
——预测时间序列
列向量
预测地平线时间序列,返回一个列向量的长度p+ 1,p是预测地平线。Topt
包含了时间序列k时间k+p,在那里k是当前时间。
Topt (1)
= 0表示当前时间。随后的时间步长Topt(我)
是Ts *(张)
,在那里Ts
是控制器样品时间。
使用Topt
当策划MVopt
,Xopt
,或Yopt
序列。
松弛
——堆积松弛变量向量
负的向量
堆叠松弛变量向量,用于约束软化。如果所有元素为零,那么所有软约束满足整个预测地平线。如果任何元素大于零,那么至少有一个软约束违反。
所有阶段堆积的松弛变量向量为:
第一阶段(松弛变量向量;%如果松弛变量向量用于第二阶段;%如果使用…松弛变量向量阶段p + 1;%如果使用)
ExitFlag
——优化退出代码
整数
优化退出代码,返回以下之一:
正整数,找到最优解
0
——可行的次优解发现后的最大迭代数负整数——没有找到可行的解决方案
迭代
——迭代次数
正整数
非线性规划求解器使用的迭代次数,作为一个正整数返回。
成本
——目标函数成本
负的标量
目标函数成本,作为一个负的标量值返回。成本量化程度控制器实现其目标。
成本值才有意义ExitFlag
是负的。
simdata
——运行时仿真数据结构
结构
运行时仿真数据更新,返回为一个结构,包含新的初始猜测状态和操作轨迹用于下一个控制间隔。这是一个与以下领域的结构。
MeasuredDisturbance
——测量扰动值
[]
(默认)| |行向量数组
测量扰动值,指定为一个行向量的长度N医学博士或数组N医学博士列,N医学博士是测量扰动的数量。如果你的多级MPC对象有任何干扰测量通道定义,您必须指定MeasuredDisturbance
。如果您的控制器没有测量干扰,这个领域不存在所产生的结构getSimulationData
。
使用相同的扰动值预测地平线,指定一个行向量。
不同的扰动值预测地平线k时间k+p,指定数组p+ 1行。在这里,k当前时间和吗p是预测地平线。每行包含一个预测地平线的扰动值的步骤。如果你指定不到p行,最后一行中的值用于预测地平线的其余步骤。
MVMin
——被控变量下界
[]
(默认)| |矩阵行向量
操纵变量下界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVMin(:,我)
取代了ManipulatedVariables .Min(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
MVMax
——操纵变量上界
[]
(默认)| |矩阵行向量
操纵变量上界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVMax(:,我)
取代了ManipulatedVariables .Max(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
MVRateMin
——被控变量率下界
[]
(默认)| |矩阵行向量
被控变量率下界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVRateMin(:,我)
取代了ManipulatedVariables .RateMin(我)
在运行时控制器的属性。MVRateMin
范围必须是负的。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
MVRateMax
——被控变量率上界
[]
(默认)| |矩阵行向量
被控变量率上界,指定为一个行向量的长度Nmv或一个矩阵Nmv列,Nmv是操纵变量的数量。MVRateMax(:,我)
取代了ManipulatedVariables .RateMax(我)
在运行时控制器的属性。MVRateMax
范围必须是负的。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k时间k+p1,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
StateMin
——国家下界
[]
(默认)| |矩阵行向量
州下界,指定为一个行向量的长度Nx或一个矩阵Nx列,Nx的状态数。StateMin(:,我)
取代了州.Min(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k+ 1,k+p,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
StateMax
——国家上界
[]
(默认)| |矩阵行向量
州上界,指定为一个行向量的长度Nx或一个矩阵Nx列,Nx的状态数。StateMax(:,我)
取代了州.Max(我)
在运行时控制器的属性。
使用相同的范围在整个预测地平线,指定一个行向量。
不同范围的预测地平线k+ 1,k+p,指定一个矩阵p行。在这里,k当前时间和吗p是预测地平线。每一行包含一个预测地平线的界限一步。如果你指定不到p行,最后边界用于预测地平线的其余步骤。
StateFcnParameters
——状态函数参数值
[]
(默认)|向量
态函数参数值,指定为一个向量的长度等于价值Model.ParameterLength
多级控制器对象的属性。如果Model.StateFcn
需要一个参数向量,你必须在运行时使用这个字段提供值。如果Model.ParameterLength
是0
这个领域不存在返回的结构getSimulationData
。
StageFcnParameters
——阶段函数参数值
[]
(默认)|向量
阶段函数参数值,指定为一个向量长度等于中的所有值的总和(我).ParameterLength阶段
多级控制器对象的属性。如果任何成本或约束函数中定义阶段
房地产需求参数向量,在运行时必须提供所有参数向量(堆叠在一列)使用这个字段。如果没有你的舞台函数参数,这个领域不存在返回的结构getSimulationData
。
你必须栈参数向量列向量的所有阶段StateFcnParameters
如下。
阶段1(参数向量;参数向量为第二阶段;…参数向量阶段p + 1;]
InitialGuess
——决策变量的初始猜测
[]
(默认)|向量
决策变量的初始猜测,指定为一个列向量的长度等于所有决策变量向量的长度之和为每个阶段。良好的初始猜测是重要的,因为他们帮助解决者更快地收敛到一个解决方案。因此,当模拟控制回路通过调用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
是[]
,默认的初始猜测的计算x
和lastmv
参数传递给nlmpcmove
。
一般来说,在闭环仿真,您没有指定InitialGuess
你自己。相反,当调用nlmpcmove
,返回simdata
输出参数,其中包含计算初始猜测下一个控制间隔。然后您可以通过simdata
作为输入参数nlmpcmove
在接下来的控制区间。这些步骤是一个最佳实践,即使你不指定任何其他运行时选项。
提示
在闭环仿真,这是最佳实践温暖的开始非线性解算器通过使用状态和操纵变量轨迹预测从先前的控制区间作为初始猜测当前控制区间。使用这些轨迹作为初始猜测:
返回
选择
输出参数时调用nlmpcmove
。这nlmpcmoveopt
对象包含任何运行时选项你前面调用中指定nlmpcmove
与最初的猜测状态(opt.X0
)和操纵变量(opt.MV0
)轨迹。通过这个对象中
选项
输入参数nlmpcmove
在接下来的控制区间。
这些步骤是一个最佳实践,即使你不指定任何其他运行时选项。
版本历史
介绍了R2018b
MATLAB命令
你点击一个链接对应MATLAB命令:
运行该命令通过输入MATLAB命令窗口。Web浏览器不支持MATLAB命令。万博1manbetx
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。