非线性MPC控制器的预测模型包括以下用户定义的功能:
状态功能 - 预测植物状态如何随着时间的推移而发展
输出函数-根据状态和输入变量计算植物的输出
您可以指定连续时间或离散时间预测模型。
在模拟控制器之前,最好的做法是验证自定义函数,包括状态函数、输出函数和它们的雅可比矩阵validateFcns
命令。
你可以指定连续时间或离散时间状态函数。为:
连续时间预测模型,状态函数是状态衍生函数。
离散时间预测模型,状态功能是状态更新功能。
由于非线性MPC控制器是离散时间控制器,因此如果您的状态功能是连续的时间,则控制器使用隐式梯形规则自动离散模型。该方法可以处理中度硬模型,其预测精度取决于控制器采样时间;也就是说,大的采样时间可能导致不准确的预测。
如果默认的离散化方法不能为您的应用程序提供满意的预测,您可以指定使用不同方法的自己的离散时间预测模型。要做到这一点,你可以从给定的初始条件对连续时间状态函数积分,XK.到下一个州,Xk + 1.在数值上进行这样做时,避免需要迭代的方法,例如某种可变阶梯大小方法,因为这些方法引入了降低求解器性能的数值噪声。具有足够小的阶梯尺寸的显式多步欧拉方法通常是首先尝试的最佳方法。例如,看到非线性模型预测控制的摆动控制.
您可以通过以下方式之一指定状态功能。
当前工作文件夹或MATLAB上的函数的名称®路径,指定为字符串或字符向量
model.statefcn =.“mystatefunction”;
处理当前工作文件夹或MATLAB路径上的函数
model.statefcn = @mystatefunction;
匿名函数
model.statefcn = @(x,u,params)mystatefunction(x,u,params)
您的状态功能必须具有以下签名之一。
如果您的控制器不使用可选参数:
功能z = mystatefunction(x,u)
如果您的控制器使用参数。这里,参数个数
是一个分隔的参数列表:
功能z = myStateFunction (x, u, params)
此表介绍了此功能的输入和输出,其中:
NX是州的数量,等于尺寸.Numberofstates.
控制器的财产。
N你输入的数量,包括所有操纵变量,测量扰动和未测量扰动,是否等于维度。N你mberOfInputs
控制器的财产。
争论 | 输入输出 | 描述 |
---|---|---|
X |
输入 | 当前状态,指定为长度的列向量NX. |
你 |
输入 | 当前输入,指定为长度的列向量N你. |
参数个数 |
输入 | 可选参数,指定为逗号分隔列表(例如 如果您的模型使用可选参数,则必须使用该选项指定参数的数量 |
Z. |
输出 | 状态函数输出,作为长度的列向量返回NX.对于连续时间预测模型,Z. 包含状态导数,DX / DT. ,对于离散时间预测模型,Z. 包含下一个州,x (k + 1) . |
作为状态功能的示例,考虑具有以下状态方程的连续时间模型:
您可以指定状态函数,如下所示:
z =零(6,1);z(1)= x(4);z(2)= x(5);z(3)= x(6);Z(4)=(U(1) - U(2)+ U(3) - U(4))* COS(x(3));Z(5)=(U(1) - U(2)+ U(3) - U(4))* SIN(X(3));Z(6)= 0.2 *(U(1) - U(2) - U(3)+ U(4));
为了提高计算效率,最好的做法是为您的州功能指定分析雅加索。如果您未指定雅可比,则控制器使用数值扰动计算Jacobian。为您的状态功能指定jacobian,请设置jacobian.statefcn.
控制器的属性到以下选项之一。
当前工作文件夹或MATLAB路径上的函数名,指定为字符串或字符向量
model.statefcn =.“myStateJacobian”;
处理当前工作文件夹或MATLAB路径上的函数
model.statefcn = @mystatejacobian;
匿名函数
model.statefcn =.@(x,u,params) myStateJacobian(x,u,params)
状态雅可比函数必须有以下特征之一。
如果您的控制器不使用可选参数:
功能[A, Bmv] = myStateJacobian (x, u)
如果您的控制器使用参数。这里参数个数
是一个分隔的参数列表:
功能[a,bmv] = mystatejacobian(x,u,params)
状态Jacobian函数的输入参数与状态函数的输入相同。此表介绍了Jacobian函数的输出,其中:
NX是州的数量,等于尺寸.Numberofstates.
控制器属性
N你输入的数量,包括所有操纵变量,测量扰动和未测量扰动,是否等于维度。N你mberOfInputs
控制器属性
争论 | 描述 |
---|---|
一种 |
状态函数输出的雅可比矩阵,Z. , 关于X ,返回一个NX-经过-NX阵列,其中
. |
BMV |
jacobian的状态功能输出相对于被操纵的变量,指定为一个NX-经过-Nm阵列,其中
和m(j)是j在mv指数中维度。MVIndex 控制器属性。BMV 仅包含仅用于操纵变量的梯度你 ,由于测量和未测量的扰动不是决策变量。 |
再次考虑,状态函数具有以下状态方程:
为了找到雅可比人,假设所有四个输入都是被操纵变量的,计算状态方程的部分导数和被操纵的变量。
一个= 0 (6,6);(4) = 1;(2、5)= 1;(3、6)= 1;A(4,3) = -(u(1) - u(2) + u(3) - u(4))*sin(x(3));A(5,3) = (u(1) - u(2) + u(3) - u(4))*cos(x(3));B = 0 (4);B(4,:) = cos(x(3))*[1 -1 1 -1];B(5,:) = sin(x(3))*[1 -1 1 -1];B(6,:) = 0.2*[1 -1 -1 1];
预测模型的输出函数将当前控制区间的状态和输入与输出联系起来。如果预测模型的状态和输出数量相同,则可以省略outputfcn.
,这意味着所有国家都是可衡量的;也就是说,每个输出对应于一个状态。
outputfcn.
不能随时从任何操纵变量直接馈通。换句话说,非线性MPC总是假设Dmv = 0
.
您可以通过以下方式之一指定输出函数。
当前工作文件夹或MATLAB路径上的函数名,指定为字符串或字符向量
模型。OutputFcn =“myOutputFunction”;
处理当前工作文件夹或MATLAB路径上的函数
model.outputfcn = @myoutputfunction;
匿名函数
model.outputfcn = @(x,u,params)myoutputfunction(x,u,params)
您的输出函数必须具有以下签名之一。
如果您的控制器不使用可选参数:
功能y = myoutputfunction(x,u)
如果您的控制器使用参数。这里,参数个数
是一个分隔的参数列表:
功能y = myoutputfunction(x,u,params)
此表介绍了此功能的输入和输出,其中:
NX是州的数量,等于尺寸.Numberofstates.
控制器的财产。
N你输入的数量,包括所有操纵变量,测量扰动和未测量扰动,是否等于维度。N你mberOfInputs
的控制器。
Ny输出的数量和是否等于维度。N你mberOfOutputs
控制器的财产。
争论 | 输入输出 | 描述 |
---|---|---|
X |
输入 | 当前状态,指定为长度的列向量NX. |
你 |
输入 | 当前输入,指定为长度的列向量N你. |
参数个数 |
输入 | 可选参数,指定为逗号分隔列表(例如 如果您的模型使用可选参数,您必须指定使用参数的数量 |
y |
输出 | 当前输出,作为长度的列向量返回Ny. |
作为一个输出函数的例子,考虑下面的输出方程。回想一下,您的输出函数在任何时候都不能直接从任何操纵变量传递到任何输出。
您可以指定输出函数,如下所示:
y =零(6,1);Y(1)= x(1);Y(2)= x(2)+ 0.2 * x(3);Y(3)= x(3)* x(4);
为了提高计算效率,最好的做法是为输出函数指定分析jacobian。如果您未指定雅可比,则控制器使用数值扰动计算Jacobian。为输出函数指定jacobian,请设置jacobian.outputfcn.
控制器的属性到以下选项之一。
当前工作文件夹或MATLAB路径上的函数名,指定为字符串或字符向量
model.statefcn =.“myOutputJacobian”;
处理当前工作文件夹或MATLAB路径上的函数
model.statefcn =.@myOutputJacobian;
匿名函数
model.statefcn = @(x,u,params)myoutputjacobian(x,u,params)
您的输出jacobian函数必须具有以下签名之一。
如果您的控制器不使用可选参数:
功能c = myoutputjacobian(x,u)
如果您的控制器使用参数。这里,参数个数
是一个分隔的参数列表:
功能c = myoutputjacobian(x,u,params)
输出雅可比函数的输入参数与输出函数的输入参数相同。这个表描述了雅可比函数的输出。由于输出函数不能直接从任意操纵变量传递到任意输出,因此输出雅可比函数仅返回输出函数相对于模型状态的梯度。
争论 | 描述 |
---|---|
C |
jacobian的输出函数,作为一个返回Ny-经过-NX阵列,其中 . |
再次考虑,该模型具有以下输出方程式:
要查找雅可比人,计算输出方程的部分导数相对于状态。由于输出函数在任何时间从任何操作变量都具有直接馈通,因此您不会在任何输出中都不会相对于被操纵变量计算雅加诺。
c =零(3,4);c(1,1)= 1;C(2,2)= 1;C(2,3)= 0.2;C(3,3)= x(4);C(3,4)= x(3);
您可以为非线性MPC预测模型,成本函数和自定义约束指定可选参数。为此,将逗号分隔的参数参数列表传递给自定义函数(例如P1,P2,P3
)。这些参数必须是数值。此外,您必须使用该参数指定模型参数的数量模型。N你mberOfParameters
控制器的财产。
将相同的参数传递给预测模型、自定义代价函数、自定义约束函数以及它们各自的雅可比矩阵。例如,即使状态函数只使用参数P1.
,约束函数仅使用参数P2.
,且代价函数仅使用参数P3.
,您仍然必须定义三个参数。所有这些参数都传递给所有这些函数,并且您必须选择在每个功能中使用的正确参数。
有关指定离散时间状态函数的示例时间作为参数的示例,请参阅非线性模型预测控制的摆动控制.
您可以扩大您的预测模型,以包括未测量的干扰。例如,如果您的工厂没有积分器,而您想要拒绝某种不可测量的干扰,那么使用干扰模型来增加您的计划。这样做允许外部状态估计器检测干扰,从而给非线性MPC控制器足够的信息来拒绝它。
在仿真过程中,控制器给每个未测量的干扰输入通道传递一个零,因为信号是未测量的,默认为零均值。
为了增强预测模型,必须在使用控制器时将一个或多个输入信号指定为未测量的干扰nlmpc
.例如,创建一个控制器,其中操纵前两个输入变量,第三输入是一个未测量的干扰(UD)。
nlobj = nlmpc(nx,ny,'mv',[1 2],'ud'3);
在预测模型的状态和输出功能中指定未测量的扰动模型。该未测量的扰动模型可以是任何任意模型,可准确地捕捉植物对造型的干扰效果。例如:
如果您希望在工厂输出处于阶梯式UD,则将UD模型指定为状态功能中的集成器,并将Integrator State添加到输出功能中的工厂输出。
如果您希望在工厂输入处的斜坡上的UD,则将UD模型指定为集成器,并将Integrator输出添加到状态功能中的输入信号。
在指定未测量的干扰模型时添加的任何状态都包括在预测模型状态向量中。这些未测量的扰动模型状态中的值反映了模拟期间的干扰行为。该状态矢量对应于X
状态函数的输入参数和X
输入您的自定义成本和约束函数的参数。
增加随机阶跃输出扰动预测模型的例子,见放热化学反应器的非线性模型预测控制.