为非线性MPC指定预测模型
预测模型的非线性MPC控制器由以下用户定义函数:
态函数——预测植物状态如何随时间而变化
输出函数,计算装置输出的状态和输入变量
您可以指定连续时间和离散时间预测模型。
模拟控制器之前,这是最佳实践来验证您的自定义功能,包括状态函数,输出函数和雅克比时使用validateFcns
命令。
态函数
您可以指定一个连续时间和离散时间状态函数。为:
连续时间预测模型,状态函数导数的函数。
离散时间预测模型,状态函数是状态更新功能。
由于非线性MPC控制器是一个离散时间控制器,如果你的态函数是连续时间时,控制器自动可使用隐式梯形积分法模型。该方法可以处理适度硬模型,其预测精度取决于控制器样品时间;也就是说,大样本的时间可能会导致不准确的预测。
如果默认的离散化方法不提供令人满意的预测对于您的应用程序,您可以指定自己的离散时间预测模型,使用不同的方法。这样做,您可以把一个连续时间状态函数从给定的初始条件,xk下一个状态,xk + 1。这样做数值时,避免需要迭代的方法,比如一些variable-step-size方法,因为这些方法引入降解解算器性能的数值噪声。显式欧拉方法和多步足够小步大小通常是最好的方法先试一试。例如,看到的摆起控制使用非线性模型预测控制的钟摆。
你可以指定你的态函数在下列方式之一。
一个函数的名称在当前工作目录或MATLAB®路径,指定为一个字符串或字符向量
模型。StateFcn =“myStateFunction”;
处理函数在当前工作目录中或MATLAB路径
模型。StateFcn = @myStateFunction;
匿名函数
模型。StateFcn = @ (x, u, params) myStateFunction (x, u, params)
你的状态函数必须有下列形式之一的签名。
如果你的控制器不使用可选参数:
函数z = myStateFunction (x, u)
如果您的控制器使用参数。在这里,
参数个数
是一个以逗号分隔的参数:函数z = myStateFunction (x, u, params)
此表描述了这个函数的输入和输出,地点:
Nx是州的数量等于
Dimensions.NumberOfStates
控制器的属性。Nu是输入的数量,包括所有操纵变量,测量干扰,和无边无际的干扰,等于
Dimensions.NumberOfInputs
控制器的属性。
论点 | 输入/输出 | 描述 |
---|---|---|
x |
输入 | 当前状态,指定为一个列向量的长度Nx。 |
u |
输入 | 当前的输入,指定为一个列向量的长度Nu。 |
参数个数 |
输入 | 可选参数,指定为一个以逗号分隔(例如 如果你的模型使用可选参数,您必须指定使用的参数的数量 |
z |
输出 | 态函数输出,返回一个列向量的长度Nx。对于一个连续时间的预测模型,z 包含国家衍生品,dx / dt 离散时间预测模型,z 包含下一个州,x (k + 1) 。 |
状态函数的一个例子,考虑到连续时间模型与状态方程如下:
您可以指定状态函数如下:
z = 0 (6,1);z (1) = x (4);z (2) = x (5);z (3) = x (6);z (4) = (u (1) - (2) + u (3) - (4)) * cos (x (3));z (5) = (u (1) - (2) + u (3) - (4)) * sin (x (3));z (6) = 0.2 * (u (1) - (2) - u (3) + (4));
态函数雅克比
为了提高计算效率,最佳实践是指定一个对你的态函数分析雅可比矩阵。如果你不指定一个雅可比矩阵,控制器使用数值摄动计算雅可比矩阵。对你的态函数,指定一个雅可比矩阵设置Jacobian.StateFcn
控制器的属性之一。
函数的名字在当前工作目录或MATLAB路径,指定为字符串或字符向量
Jacobian.StateFcn=“myStateJacobian”;
处理函数在当前工作目录中或MATLAB路径
Jacobian.StateFcn=@myStateJacobian;
匿名函数
Jacobian.StateFcn=@(x,u,params) myStateJacobian(x,u,params)
州雅可比矩阵函数必须有以下签名。
如果你的控制器不使用可选参数:
函数[A, Bmv] = myStateJacobian (x, u)
如果您的控制器使用参数。在这里
参数个数
是一个以逗号分隔的参数:函数[一个,Bmv] = myStateJacobian (x, u, params)
州雅可比矩阵函数的输入参数是一样的国家输入的函数。此表描述了雅可比矩阵的输出函数,地点:
Nx是州的数量等于
Dimensions.NumberOfStates
控制器的属性Nu是输入的数量,包括所有操纵变量,测量干扰,和无边无际的干扰,等于
Dimensions.NumberOfInputs
控制器的属性
论点 | 描述 |
---|---|
一个 |
雅可比矩阵的态函数输出,z 关于x ,作为一个返回Nx——- - - - - -Nx数组,
。 |
Bmv |
雅可比矩阵的态函数输出的操纵变量,作为指定Nx——- - - - - -Nmv数组,
和MV(j)是jMV指数Dimensions.MVIndex 控制器的财产。Bmv 只包含梯度对操纵变量u ,因为测量和不可测量的干扰不是决策变量。 |
再次考虑,状态函数与状态方程如下:
找到雅克比,计算状态方程的偏导数,对美国和操纵变量,假设所有四个输入操纵变量。
一个= 0 (6,6);(4)= 1;(2、5)= 1;(3、6)= 1;(4,3)= (u (1) - (2) + u (3) - (4)) * sin (x (3));(5,3)= (u (1) - (2) + u (3) - (4)) * cos (x (3));B = 0 (4);B (4) = cos (x (3)) * (1 1 1);:B(5日)= sin (x (3)) * (1 1 1);:B(6日)= 0.2 * (1 1 1);
输出函数
预测模型的输出函数相关的状态和输入输出电流控制间隔。如果州的数量和输出的预测模型是相同的,你可以省略OutputFcn
,这意味着所有国家是可测量的;也就是说,每个输出对应于一个状态。
请注意
OutputFcn
不能直接引线在任何时间从任何操纵变量输出;换句话说,非线性MPC总是假定Dmv = 0
。
您可以指定您的输出函数以以下方式之一。
函数的名字在当前工作目录或MATLAB路径,指定为字符串或字符向量
模型。输出Fcn =“myOutputFunction”;
处理函数在当前工作目录中或MATLAB路径
模型。输出Fcn = @myOutputFunction;
匿名函数
模型。输出Fcn = @(x,u,params) myOutputFunction(x,u,params)
你的输出函数必须有下列形式之一的签名。
如果你的控制器不使用可选参数:
函数y = myOutputFunction (x, u)
如果您的控制器使用参数。在这里,
参数个数
是一个以逗号分隔的参数:函数y = myOutputFunction (x, u, params)
此表描述了这个函数的输入和输出,地点:
Nx是州的数量等于
Dimensions.NumberOfStates
控制器的属性。Nu是输入的数量,包括所有操纵变量,测量干扰,和无边无际的干扰,等于
Dimensions.NumberOfInputs
的控制器。NY是输出的数量等于
Dimensions.NumberOfOutputs
控制器的属性。
论点 | 输入/输出 | 描述 |
---|---|---|
x |
输入 | 当前状态,指定为一个列向量的长度Nx。 |
u |
输入 | 当前的输入,指定为一个列向量的长度Nu。 |
参数个数 |
输入 | 可选参数,指定为一个以逗号分隔(例如 如果你的模型使用可选参数,您必须指定参数的数量 |
y |
输出 | 电流输出,返回一个列向量的长度Ny。 |
作为一个输出函数的一个例子,考虑以下输出方程。记得,你的输出函数不能直接引线从任何被控变量在任何时间任何输出。
您可以指定输出函数如下:
y = 0 (6,1);y = x (1) (1);y (2) = (2) + 0.2 * x (3);y (3) = x (3) * (4);
输出函数雅克比
为了提高计算效率,最佳实践是指定一个分析雅可比矩阵的输出函数。如果你不指定一个雅可比矩阵,控制器使用数值摄动计算雅可比矩阵。指定输出函数的雅可比矩阵,设置Jacobian.OutputFcn
控制器的属性之一。
函数的名字在当前工作目录或MATLAB路径,指定为字符串或字符向量
Jacobian.OutputFcn=“myOutputJacobian”;
处理函数在当前工作目录中或MATLAB路径
Jacobian.OutputFcn=@myOutputJacobian;
匿名函数
Jacobian.OutputFcn=@(x,u,params) myOutputJacobian(x,u,params)
你的雅可比矩阵输出函数必须有以下签名。
如果你的控制器不使用可选参数:
函数C = myOutputJacobian (x, u)
如果您的控制器使用参数。在这里,
参数个数
是一个以逗号分隔的参数:函数C = myOutputJacobian (x, u, params)
雅可比矩阵的输出函数的输入参数是一样的输入输出的功能。此表描述了雅可比矩阵函数的输出。因为输出函数不能直接从任何操纵变量输出引线,只输出雅可比矩阵函数返回的输出函数的梯度的模型。
论点 | 描述 |
---|---|
C |
雅可比矩阵的输出函数,作为一个返回Ny——- - - - - -Nx数组, 。 |
再次考虑,以下输出方程的模型:
找到雅克比,计算输出的偏微分方程的状态。因为输出函数不能直接引线从任何被控变量在任何时间任何输出,你不计算雅可比矩阵对操纵变量。
C = 0 (3、4);C (1, 1) = 1;C (2, 2) = 1;C (2、3) = 0.2;C (3) = x (4);C (3、4) = x (3);
指定可选的模型参数
你可以指定可选参数非线性MPC预测模型,成本函数和自定义约束。为此,通过一个以逗号分隔的参数参数(例如您的自定义函数p1, p2, p3
)。这些参数必须是数值。同时,你必须指定模型参数使用的数量Model.NumberOfParameters
控制器的属性。
相同的参数被传递到预测模型中,自定义代价函数,定义约束函数和各自的雅克比。例如,即使状态函数只使用参数p1
,约束函数仅使用参数p2
,成本函数只使用参数p3
,您还必须定义三个参数。所有这些参数传递到所有这些功能,你必须选择正确的参数在每个函数使用。
例如,指定的样品时间离散时间状态函数作为一个参数,看看摆起控制使用非线性模型预测控制的钟摆。
增加预测模型与无边无际的干扰
你可以增加你的预测模型包括不可测量的干扰。例如,如果你的工厂没有一个积分器和你想拒绝一个无边无际的干扰,增强你的计划与扰动模型。这样做允许外部状态估计量检测的干扰,从而使非线性MPC控制器足够的信息拒绝它。
在仿真过程中,控制器通过一个0到无边无际的扰动输入通道,由于信号是无限的和默认假定为零均值。
增加你的预测模型时,您必须指定一个或多个输入信号无节制的干扰在创建控制器使用nlmpc
。例如,创建一个控制器,前两个输入都是被操纵的变量和第三个输入是一个无边无际的干扰(UD)。
nlobj = nlmpc (nx、纽约、“MV”(1 - 2),“UD”3);
指定无边无际的扰动模型的状态和输出函数的预测模型。这无边无际的扰动模型可以任意模型,准确地捕捉扰动的影响在你的工厂。例如:
如果你期望一个梯状UD植物输出,然后指定UD模型作为积分器状态函数,并将积分器状态添加到植物输出在输出函数。
如果你期望ramp-like UD工厂输入,然后指定UD模型作为一个积分器和积分器的输出添加到输入信号状态函数。
任何州时添加指定无边无际的扰动模型预测模型中包含状态向量。的值在这无边无际的扰动模型状态反映在模拟干扰行为。这种状态向量对应x
输入参数的函数和状态X
输入参数来定制成本和约束功能。
为例,可以改进预测模型对随机状输出扰动,明白了非线性模型预测控制的放热化学反应堆。