主要内容

validateFcns

的预测模型和自定义函数nlmpcnlmpcMultistage潜在问题的对象

自从R2018b

描述

validateFunctions测试非线性MPC控制器的预测模型、自定义代价、自定义约束和雅可比函数的潜在问题,例如信息是否缺失,用户提供函数的输入和输出参数是否与对象设置不兼容,或用户提供的解析梯度/雅可比函数是否在数值上准确。当您首次设计非线性MPC控制器时,或当您对现有控制器进行重大更改时,验证控制器功能是最佳实践。

非线性MPC

例子

validateFcns (nlmpcobjxmv测试了非线性MPC控制器的功能nlmpcobj潜在的问题。函数使用指定的状态和操作变量值进行测试,x而且mv,分别。这些值可以表示标称条件或任意工作点。如果您的控制器没有测量到的扰动,也没有参数,请使用此语法。

例子

validateFcns (nlmpcobjxmv医学博士指定测量的扰动值。如果你的控制器测量了干扰通道,你必须指定医学博士.这些值可以表示标称条件或任意工作点。

例子

validateFcns (nlmpcobjxmv医学博士参数参数值。如果控制器有参数,则必须指定参数

validateFcns (nlmpcobjxmv医学博士参数裁判指定在标称条件下或任意工作点上的输出引用。

validateFcns (nlmpcobjxmv医学博士参数裁判mvtarget指定在标称条件下或为任意工作点操作的可变目标。

多级非线性MPC

validateFcns (nlmpcMSobjxmv测试了多级非线性MPC控制器的功能nlmpcMSobj潜在的问题。函数使用指定的状态和操作变量值进行测试,x而且mv,分别。这些值可以表示标称条件或任意工作点。如果您的控制器没有测量到的扰动,也没有参数,请使用此语法。

例子

validateFcns (nlmpcMSobjxmvsimdata指定附加的simdata结构。如果状态和阶段函数需要参数,则需要在simdata

例子

全部折叠

创建六状态,六输出,四输入的非线性MPC控制器。

Nx = 6;Ny = 6;Nu = 4;Nlobj = nlmpc(nx,ny,nu);
零权重应用于一个或多个ov,因为mv比ov少。

指定控制器采样时间和范围。

Ts = 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,data) Ts*sum(sum(U(1:p,:)));nlobj.Optimization.ReplaceStandardCost = true;

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

nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';

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

X0 = [-10;-10;pi/2;0;0;0];U0 = 0 (nu,1);validateFcns (nlobj x0,情况);
模型。StateFcn是OK的。雅可比矩阵。StateFcnis 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.

创建一个具有四个状态、两个输出和一个输入的非线性MPC控制器。

Nx = 4;Ny = 2;Nu = 1;Nlobj = nlmpc(nx,ny,nu);
零权重应用于一个或多个ov,因为mv比ov少。

指定控制器的采样时间和范围。

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

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

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

离散时间状态函数使用一个可选参数,采样时间Ts,对连续时间模型进行积分。因此,必须将可选参数的数量指定为1

nlobj.Model.NumberOfParameters = 1;

指定控制器的输出函数。在本例中,将第一和第三个状态定义为输出。即使这个输出函数没有使用可选的采样时间参数,也必须将该参数指定为输入参数(Ts).

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

验证标称状态的预测模型函数x0和名义输入情况.由于预测模型使用自定义参数,因此必须将此参数传递给validateFcns

X0 = [0.1;0.2;-pi/2;0.3];U0 = 0.4;validateFcns(nlobj, x0, u0, [], {Ts});
模型。StateFcn是OK的。模型。OutputFcn是OK。分析了用户提供的模型、成本和约束函数。

创建一个具有三种状态、一个输出和四个输入的非线性MPC控制器。前两个输入是测量的扰动,第三个输入是被操纵的变量,第四个输入是未测量的扰动。

Nlobj = nlmpc(3,1,“MV”3,“医学博士”(1 - 2),“UD”4);

控件可查看控制器状态、输出和输入维度和索引属性。

nlobj。维
ans =带字段的结构:NumberOfStates: 3 NumberOfOutputs: 1 NumberOfInputs: 4 MVIndex: 3 MDIndex: [1 2] UDIndex: 4

指定控制器采样时间和范围。

nlobj。Ts= 0.5; nlobj.PredictionHorizon = 6; nlobj.ControlHorizon = 3;

指定预测模型状态函数,该函数位于文件中exocstrStateFcnCT.m

nlobj.Model.StateFcn =“exocstrStateFcnCT”

指定预测模型输出函数,该函数在文件中exocstrOutputFcn.m

nlobj.Model.OutputFcn =“exocstrOutputFcn”

以初始工作点为标称条件,验证预测模型函数,测试并设置未测扰动状态,x0 (3),0.由于模型已经测量了扰动,您必须将它们传递给validateFcns

X0 = [311.2639;8.5698;0);U0 = [10;298.15;298.15);validateFcns (x0, nlobj情况(3),情况(1:2)');
模型。StateFcn是OK的。模型。OutputFcn是OK。分析了用户提供的模型、成本和约束函数。

输入参数

全部折叠

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

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

状态值,指定为长度向量Nx,在那里Nx等于nlmpcobj.Dimensions.NumberOfStates,或nlmpcMSobj.Dimensions.NumberOfStates.状态值可以表示标称条件或任意工作点。

被操纵的变量值,指定为长度向量Nmv,在那里Nmv等于的长度nlmpcobj.Dimensions.MVIndexnlmpcMSobj.Dimensions.MVIndex.被操纵的变量值可以表示标称条件或任意工作点。

测量的扰动值,以长度矢量表示N医学博士,在那里N医学博士等于的长度nlmpcobj.Dimensions.MDIndex.测量的扰动值可以表示标称条件或任意工作点。

如果你的控制器测量了干扰通道,你必须指定医学博士.如果您的控制器没有测量到的干扰通道,请指定医学博士作为[]

预测模型使用的参数值、自定义代价函数和自定义约束,指定为长度的单元格数组Np,在那里Np等于nlmpcobj.Model.NumberOfParametersnlmpcMSobj.Model.NumberOfParameters.参数的顺序必须与模型函数中指定的顺序匹配,并且每个参数必须是具有正确尺寸的数值参数。

如果控制器有参数,则必须指定参数.如果您的控制器没有参数,请指定参数作为[]

输出参考值,指定为长度向量Ny,在那里纽约等于nlmpcobj.Dimensions.NumberOfOutputsnlmpcMSobj.Model.NumberOfOutputs裁判传递给自定义代价和约束函数。输出参考值可以表示标称条件或任意工作点。

如果您没有指定裁判,控制器将一个零向量传递给自定义函数。

被操纵的可变目标,指定为长度矢量Nmv,在那里Nmv等于的长度nlmpcobj.Dimensions.MVIndexnlmpcMSobj.Dimensions.MVIndex.所操纵的可变目标值可以表示标称条件或任意工作点。

mvtarget传递给自定义代价和约束函数。如果您没有指定mvtarget,控制器将一个零向量传递给自定义函数。

运行时模拟数据,最初由getSimulationData,并指定为结构,其中字段详细描述在nlmpcmove.为validateFcns,只有以下字段是相关的。

测量的扰动值,指定为长度的行向量N医学博士或者一个数组N医学博士列,N医学博士是测量扰动的数量。如果多级MPC对象定义了任何测量扰动通道,则必须指定MeasuredDisturbance.如果您的控制器没有测量到扰动,则此场在返回的结构中不存在getSimulationData

状态函数参数值,指定为长度等于值的向量模型。ParameterLength多级控制器对象的属性。如果模型。StateFcn需要参数向量,必须在运行时使用此字段提供其值。如果状态函数没有参数,则返回的结构中不存在此字段getSimulationData

函数的参数值,指定为向量,其长度等于阶段(i)。ParameterLength多级控制器对象的属性。中定义的任何成本或约束函数阶段属性需要参数向量,您必须在运行时使用此字段提供所有参数向量(堆叠在单列中)。如果没有任何阶段函数需要任何参数,则此字段在返回的结构中不存在getSimulationData

提示

  • 当你提供自己的分析雅可比函数时,特别重要的是这些函数返回有效的雅可比值。如果validateFunctions检测用户定义的雅可比函数返回值与有限差分近似之间的巨大差异,验证雅可比实现中的代码。

算法

对于每个控制器函数,validateFunctions检查函数是否:

  • 存在于MATLAB中®路径

  • 输入参数的数量是否满足要求

  • 是否可以成功执行而没有错误

  • 返回具有正确大小和尺寸的输出参数

  • 返回有效的数值数据;也就是说,它不会返回

对于雅可比函数,validateFunctions检查返回值是否与雅可比矩阵值的有限差分近似相比较。这些有限差分值是用数值摄动计算的。

版本历史

在R2018b中引入