MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数(上)+https://developer.aliyun.com/article/1585319
- Unit - OV 单位 —— ""(默认) | 字符串 | 字符向量
OV 单位,以字符串或字符向量形式指定。这是一个只读属性。要修改扰动变量的单位,请使用 mpcobj.Model.Plant.InputUnit。
示例:mpcobj.DisturbanceVariables(1).Units
- ScaleFactor - DV 比例因子 —— 1(默认) | 正有限标量
DV 比例因子,指定为正有限标量。指定适当的比例因子可以改善优化的数值条件。更多信息,请参阅指定比例因子。
示例:mpcobj.DisturbanceVariables(1).ScaleFactor = 15
Weights - 标准成本函数调整权重 —— 结构体
以结构形式指定的标准代价函数调整权重。控制器将这些权重应用于比例变量。因此,调整权重是无量纲值。
输出权重的格式必须与控制器对象的 Weights.OutputVariables 属性的格式一致。例如,不能在控制器对象中指定整个预测范围内的恒定权重,然后再使用 mpcmoveopt 指定随时间变化的权重。
权重具有以下字段。这些字段的值取决于使用的是标准成本函数还是替代成本函数。有关这些成本函数的更多信息,请参阅优化问题。
- ManipulatedVariables - 受操纵的变量调整权重 —— 行向量数组
操纵变量调整权重,用于惩罚偏离 MV 目标的变量,指定为非负值行向量或数组。所有操纵变量的默认权重都是 0。
如果要在整个预测范围内使用相同的权重,可以指定一个长度为 Nmv 的行向量,其中 Nmv 是操纵变量的个数。
要在时间 k 到时间 k+p-1 的预测范围内改变调整权重,可指定一个 Nmv 列、最多 p 行的数组。这里,k 是当前时间,p 是预测范围。每行包含一个预测跨度步长的受控变量调整权重。如果指定的行数少于 p,最后一行的权重将用于预测跨度的剩余步长。
如果使用替代代价函数,请将 Weights.ManipulatedVariables 指定为包含 Nmv-by-Nmv Ru 矩阵的单元格数组。例如,mpcobj.Weights.ManipulatedVariables = {Ru}。Ru 必须是正半inite 矩阵。不支持在整个预测范围内改变 Ru 矩阵。更多信息,请参阅替代成本函数。
示例:mpcobj.Weights.ManipulatedVariables = [0.1 0.2] (0.1 0.2)
- ManipulatedVariablesRate - 受操纵的变量速率调整权重 —— 行向量 | 数组 | 单元数组
操纵可变速率调整权重,用于惩罚控制移动中的大幅变化,指定为行向量或非负值数组。所有操纵变量率的默认权重为 0.1。
要在整个预测范围内使用相同的权重,可指定长度为 Nmv 的行向量,其中 Nmv 为操作变量的数量。
要在时间 k 至时间 k+p-1 的预测范围内改变调整权重,可指定一个 Nmv 列、最多 p 行的数组。这里,k 是当前时间,p 是预测范围。每行包含一个预测跨度步长的可变速率调整权重。如果指定的行数少于 p,最后一行的权重将用于预测跨度的剩余步长。
注意
最佳做法是使用非零操纵可变比率权重。如果所有操纵可变费率权重都是严格正值,则所产生的 QP 问题是严格凸的。如果某些权重为零,则 QP 的 Hessian 可能是正半有限的。为了保持 QP 问题的严格凸性,当 Hessian 矩阵 KΔU 的条件数大于 1012 时,每个对角项都要加上 10*sqrt(eps) 的量。参见成本函数。
如果使用替代代价函数,请将 Weights.ManipulatedVariablesRate 指定为包含 Nmv-by-Nmv RΔu 矩阵的单元格数组。例如,mpcobj.Weights.ManipulatedVariablesRate = {Rdu}。RΔu 必须是正半定量矩阵。不支持在整个预测范围内改变 RΔu 矩阵。更多信息,请参阅替代成本函数。
示例:mpcobj.Weights.ManipulatedVariablesRate = [0.1 0.1]
- OutputVariables - 输出变量调整权重 —— 向量 | 数组
输出变量调整权重,用于惩罚偏离输出参考值的行为,指定为非负值的行向量或数组。所有输出变量的默认权重都是 1。
要在整个预测范围内使用相同的权重,可以指定一个长度为 Ny 的行向量,其中 Ny 是输出变量的个数。
要在时间 k+1 到时间 k+p 的预测范围内改变调整权重,可指定一个 Ny 列、最多 p 行的数组。这里,k 是当前时间,p 是预测范围。每行包含一个预测跨度步长的输出变量调整权重。如果指定的行数少于 p,最后一行的权重将用于预测跨度的剩余步长。
如果使用替代代价函数,请将 Weights.OutputVariables 指定为包含 Ny-by-Ny Q 矩阵的单元格数组。例如,mpcobj.Weights.OutputVariables = {Q}。Q 必须是正半inite 矩阵。不支持在整个预测范围内改变 Q 矩阵。更多信息,请参阅替代成本函数。
示例:mpcobj.Weights.OutputVariables = [1 1]
- ECR - 松弛变量调整权重 —— 1e5(默认值) | 正标量
松弛变量调整权重,指定为正标量。增大或减小等量松弛(ECR)权重,分别使所有柔性约束变硬或变软。
示例:mpcobj.Weights.ECR = 1e4
Optimizer - 优化信息 —— 结构体
优化信息是一个包含以下字段的结构。前三个字段(OptimizationType、Solver 和 SolverOptions)只与内置求解器有关。如果使用自定义求解器进行仿真(将 CustomSolver 设置为 true),仿真时将忽略这三个字段。同样,如果使用自定义求解器进行代码生成(将 CustomSolverCodeGen 设置为 true),代码生成时也会忽略这三个字段。
有关支持的 QP 求解器的更多信息,请参阅 QP 求解器。
- OptimizationType - 优化类型—— "QP"(默认) | "MIQP
此属性为只读。
优化类型,对于连续问题,返回 "QP";对于有限集问题,返回 "MIQP"。该属性由软件根据 mpc 对象的 ManipulatedVariables.Type 属性自动选择。有关有限集 MPC 的更多信息,请参阅有限控制集 MPC。
示例:"MIQP"
- Solver - 求解器算法 —— "主动集"(默认) | "内点" | "admm" | "分支边界"
求解器算法,指定为以下算法之一:
"主动集"- 使用 KWIK 主动集算法求解 QP 问题。
"内点"- 使用带有 Mehrotra 预测校正器的原始双内部点算法求解 QP 问题。
"admm"--使用一阶交替乘法(ADMM)求解器求解 QP 问题。
"分支与边界"- 使用带分支与边界的 KWIK 算法解决 MIQP 问题。当任何操作变量的类型属性设置为 "连续 "以外的其他属性时,将自动选择此方法。
对于需要解决 QP 问题的自定义应用程序,还可以分别使用 mpcActiveSetSolver 和 mpcInteriorPointSolver 函数访问主动集算法和内点算法。
示例:mpcobj.Optimizer.Solver = "interior-point"
- SolverOptions - 求解器选项 —— ActiveSet 对象(默认) | InteriorPoint 对象 | ADMM 对象 | BranchBound 对象
以 ActiveSet、InteriorPoint、ADMM 或 BranchBound 选项对象形式指定的求解器选项。适用的选项对象与优化器属性的求解器字段中选择的求解器相对应。更多信息,请参阅优化问题和 QP 求解器。
- MinOutputECR - 输出约束 ECR 值允许的最小值 —— 0(默认) | 非负标量
允许的输出约束等同松弛(ECR)值的最小值,指定为非负标量。值为 0 表示允许硬输出约束。如果 MPC 控制器的 OutputVariables.MinECR 或 OutputVariables.MaxECR 属性中的任何一个小于 MinOutputECR,则会显示警告,并在计算过程中将该值提高到 MinOutputECR。
示例:mpcobj.Optimizer.MinOutputECR = 1e-10
- UseSuboptimalSolution - 表示是否接受次优解的选项 —— 假(默认) | 真
表示是否接受次优解的选项,以逻辑值指定。当 QP 求解器迭代次数达到最大值但未找到解决方案时(退出选项为 0),控制器会:
如果使用次优解为假,则冻结 MV 值
如果使用次优解为 true,则在最后一次迭代后应用求解器找到的次优解
要根据算法值指定最大迭代次数,请使用 ActiveSetOptions.MaxIterations 或 InteriorPointOptions.MaxIterations。
示例:mpcobj.Optimizer.UseSuboptimalSolution = true
- CustomSolver - 表示是否使用自定义 QP 求解器进行仿真的选项 —— false(默认) | true
表示是否使用自定义 QP 求解器进行仿真的选项,以逻辑值指定。如果 CustomSolver 为 true,用户必须在 MATLAB® 路径上提供 mpcCustomSolver 函数。
该自定义求解器不用于生成代码。要使用自定义求解器为控制器生成代码,请使用 CustomSolverCodeGen。
如果 CustomSolver 为真,控制器会忽略仿真的 OptimizationType、Solver 和 SolverOptions 属性。
您还可以使用函数 setCustomSolver 自动配置 mpcobj,将 quadprog(优化工具箱)的 active-set 算法用作仿真和代码生成的自定义 QP 求解器。
有关使用自定义 QP 求解器的更多信息,请参阅 QP 求解器。
示例:mpcobj.Optimizer.CustomSolver = true
- CustomSolverCodeGen - 表示是否使用自定义 QP 求解器生成代码的选项 —— false(默认) | true
表示是否使用自定义 QP 求解器生成代码的选项,以逻辑值指定。如果 CustomSolverCodeGen 为 true,则必须在 MATLAB 路径上提供 mpcCustomSolverCodeGen 函数。
此自定义求解器不用于仿真。要使用自定义求解器仿真控制器,请使用 CustomSolver。
您还可以使用函数 setCustomSolver 自动配置 mpcobj,将 quadprog(优化工具箱)的 active-set 算法用作仿真和代码生成的自定义 QP 求解器。
有关使用自定义 QP 求解器的更多信息,请参阅 QP 求解器。
示例:mpcobj.Optimizer.CustomSolverCodeGen = true
Notes - 用户备注 —— {}(默认) | 单元字符向量数组
与 MPC 控制器相关的用户注释,以字符矢量单元数组的形式指定。
示例:mpcobj.Notes = {'纵向控制器'; '版本 2.1'}
UserData - 用户数据 —— [](默认) | 任何 MATLAB 数据
与 MPC 控制器相关的用户数据,指定为任何 MATLAB 数据,如单元数组或结构。
示例:mpcobj.UserData = {'参数',0.2,[3 4]'}
History - 控制器创建日期和时间 —— 矢量
此属性为只读。
控制器创建日期和时间,指定为包含以下元素的向量:
History(1) - 年
History(2) - 月
历史记录(3) - 日
History(4) - 小时
历史记录(5) - 分钟
历史记录(6) - 秒
使用 datestr(mpcobj.History) 以字符向量形式显示控制器创建日期。
示例: mpcobj.History = datevec(now)
四、对象函数
buildMEX | 建立 MEX 文件,解决 MPC 控制问题 |
cloffset | 从输出干扰到测量输出计算闭环直流增益,假定约束在稳态时无效 |
compare | 比较两个 MPC 对象 |
generateExplicitMPC | 将隐式 MPC 控制器转换为显式 MPC 控制器 |
generatePlotParameters | plotSection 的参数 |
generateExplicitOptions | 显式 MPC 生成的优化选项 |
generateExplicitRange | 显式 MPC 控制法参数的约束 |
get | 从 MPC 对象获取属性值 |
getCodeGenerationData | 为 mpcmoveCodeGeneration 创建数据结构 |
getEstimator | 为估计器设计获取卡尔曼增益和模型 |
getconstraint | 从模型预测控制器获取混合输入/输出约束条件 |
getindist | 检索未测量的输入干扰模型 |
getname | 从 MPC 工厂模型中检索 I/O 信号名称 |
getoutdist | 检索未测量的输出干扰模型 |
mpcmove | 计算最优控制操作并更新控制器状态 |
mpcmoveAdaptive | 计算最佳控制,更新预测模型 |
plot | 绘制 MPC 仿真生成的响应图 |
review | 在运行时检查 MPC 控制器是否存在设计错误和稳定性问题 |
sensitivity | 计算性能指标值及其对 MPC 控制器对角线权重的敏感性 |
set | 设置或修改 MPC 对象属性 |
setCustomSolver | 将 MPC 对象配置为使用优化工具箱中的 QP 求解器作为自定义求解器 |
setEstimator | 修改模型预测控制器的状态估计器 |
setconstraint | 为模型预测控制器设置混合输入/输出约束条件 |
setindist | 修改未测量的输入干扰模型 |
setname | 在 MPC 工厂模型中设置 I/O 信号名称 |
setoutdist | 修改未测量的输出干扰模型 |
setterminal | 终端权重和约束 |
sim | 用线性工厂仿真闭环中的 MPC 控制器 |
size | MPC 控制器的大小和阶数 |
ss | 将无约束 MPC 控制器转换为状态空间线性系统形式 |
tf | 将无约束 MPC 控制器转换为线性传递函数形式 |
trim | 针对给定的输入和输出,计算 MPC 控制器工厂模型状态的稳态值 |
五、示例
创建具有指定预测和控制范围的 MPC 控制器
创建具有传递函数的工厂模型
Plant = tf([1 1],[1 2 0]);
该设备是 SISO 设备,因此其输入必须是可操作的变量,输出必须是可测量的。一般来说,好的做法是使用 setmpcsignals 命令或 LTI InputGroup 和 OutputGroup 属性指定所有工厂信号类型。
指定控制器的采样时间。
Ts = 0.1;
定义被操作变量的边界,u,
MV = struct(Min=-1,Max=1);
MV 仅包含被操作变量的上下限。一般来说,您可以指定其他 MV 属性。如果不指定其他属性,则将使用默认值。
指定 20 步预测跨度和 3 步控制跨度。
p = 20; m = 3;
使用指定值创建 MPC 控制器。第五个输入参数为空,因此使用默认的调整权重。
mpcobj = mpc(Plant,Ts,p,m,[],MV);
-->"Weights.ManipulatedVariables" is empty. Assuming default 0.00000. -->"Weights.ManipulatedVariablesRate" is empty. Assuming default 0.10000. -->"Weights.OutputVariables" is empty. Assuming default 1.00000.
六、算法
为尽量减少计算开销,模型预测控制器的创建分为两个阶段。第一个阶段是在使用 mpc 函数或更改控制器属性时创建控制器。创建包括基本的有效性和一致性检查,如信号维度和权重的非负性。
第二个阶段是初始化,即在仿真或分析程序中首次使用对象时进行初始化。初始化会计算高效数值计算所需的所有常量属性,如定义最优控制问题的矩阵和状态估计增益。初始化过程中还会进行其他诊断性检查,例如验证控制器状态是否可观测。
默认情况下,这两个阶段都会在命令窗口中显示信息消息。您可以使用 mpcverbosity 函数打开或关闭这些消息。
七、其他功能
您还可以使用 MPC Designer 应用程序创建模型预测控制器。