主要内容

为非线性MPC指定预测模型

非线性MPC控制器的预测模型包括以下用户定义的功能:

  • 状态函数-预测植物状态随时间的变化

  • 输出函数-根据状态和输入变量计算植物的输出

您可以指定连续时间或离散时间预测模型。

在模拟控制器之前,最好的做法是验证自定义函数,包括状态函数、输出函数和它们的雅可比矩阵validateFcns命令。

态函数

你可以指定连续时间或离散时间状态函数。为:

  • 连续时间预测模型,状态函数是状态衍生函数。

    D. X / D. T. = F X

  • 离散时间预测模型,状态函数是状态更新函数。

    X K. + 1 = F X K. K.

由于非线性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
参数个数 输入

可选参数,以逗号分隔的列表指定(例如p1, p2, p3).将相同的参数传递给预测模型、自定义代价函数和控制器自定义约束函数。

如果您的模型使用可选参数,则必须使用该选项指定参数的数量模型。N你mberOfParameters属性。

Z. 输出 状态函数输出,作为长度的列向量返回NX.对于连续时间预测模型,Z.包含状态导数,DX / DT.,对于离散时间预测模型,Z.包含下一个州,x (k + 1)

作为状态功能的示例,考虑具有以下状态方程的连续时间模型:

X ˙ 1 = X 4. X ˙ 2 = X 5. X ˙ 3. = X 6. X ˙ 4. = 1 - 2 + 3. - 4. 因为 X 3. X ˙ 5. = 1 - 2 + 3. - 4. X 3. X ˙ 6. = 0.2 1 - 2 - 3. + 4.

您可以通过如下方式指定状态函数:

z = 0 (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.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)

状态雅可比函数的输入参数与状态函数的输入参数相同。下表描述了雅可比函数的输出,其中:

  • NX是州的数量,等于尺寸.Numberofstates.控制器属性

  • N输入的数量,包括所有操纵变量,测量扰动和未测量扰动,是否等于维度。N你mberOfInputs控制器属性

论点 描述
一种 状态函数输出的雅可比矩阵,Z.关于X,返回为NX——- - - - - -NX阵列,其中 一种 一世 j = Z. 一世 / X j
Bmv jacobian的状态功能输出相对于被操纵的变量,指定为一个NX——- - - - - -Nmv阵列,其中 Bmv 一世 j = Z. 一世 / m V. j MVj)是j的MV指数维度。MVIndex控制器属性。Bmv中仅包含相对于操作变量的梯度,由于测量和未测量的扰动不是决策变量。

再次考虑,状态函数具有以下状态方程:

X ˙ 1 = X 4. X ˙ 2 = X 5. X ˙ 3. = X 6. X ˙ 4. = 1 - 2 + 3. - 4. 因为 X 3. X ˙ 5. = 1 - 2 + 3. - 4. X 3. X ˙ 6. = 0.2 1 - 2 - 3. + 4.

为了找到雅可比人,假设所有四个输入都是被操纵变量的,计算状态方程的部分导数和被操纵的变量。

一个= 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
参数个数 输入

可选参数,以逗号分隔的列表指定(例如p1, p2, p3).将相同的参数传递给预测模型、自定义代价函数和控制器自定义约束函数。

如果您的模型使用可选参数,您必须指定使用参数的数量模型。N你mberOfParameters

y 输出 当前输出,作为长度的列向量返回Ny

作为一个输出函数的例子,考虑下面的输出方程。回想一下,您的输出函数在任何时候都不能直接从任何操纵变量传递到任何输出。

y 1 = X 1 y 2 = X 2 + 0.2 X 3. y 3. = X 3. X 4.

你可以指定输出函数如下:

y = 0 (6,1);y = x (1) (1);y (2) = (2) + 0.2 * x (3);y (3) = x (3) * (4);

输出函数Jacobians.

为了提高计算效率,最好的做法是为输出函数指定分析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 输出函数的雅可比矩阵,返回为Ny——- - - - - -NX阵列,其中 C 一世 j = y 一世 / X j

再次考虑,该模型具有以下输出方程式:

y 1 = X 1 y 2 = X 2 + 0.2 X 3. y 3. = X 3. X 4.

为了找到雅可比矩阵,计算输出方程对状态的偏导数。由于输出函数在任何时候都不能从任何被操纵的变量直接反馈到任何输出,所以你不需要计算关于被操纵变量的雅可比矩阵。

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、纽约、'mv'(1 - 2),“UD”3);

在预测模型的状态和输出功能中指定未测量的扰动模型。该未测量的扰动模型可以是任何任意模型,可准确地捕捉植物对造型的干扰效果。例如:

  • 如果您希望在工厂输出处于阶梯式UD,则将UD模型指定为状态功能中的集成器,并将Integrator State添加到输出功能中的工厂输出。

  • 如果您希望在工厂输入处的斜坡上的UD,则将UD模型指定为集成器,并将Integrator输出添加到状态功能中的输入信号。

在指定非测量扰动模型时添加的任何状态都包含在预测模型状态向量中。这些非测量扰动模型状态的值反映了仿真过程中的扰动行为。这个状态向量对应于X状态函数的输入参数和X输入您的自定义成本和约束函数的参数。

增加随机阶跃输出扰动预测模型的例子,见放热化学反应器的非线性模型预测控制

也可以看看

相关的话题