MATLAB - 模型预测控制(MPC)控制入门 —— 设计并仿真 MPC 控制器

系列文章目录

MATLAB 模型预测控制(MPC)


文章目录

  • 系列文章目录
  • 前言
  • 一、使用 MPC Designer 设计控制器
    • 1.1 CSTR 模型
    • 1.2 导入被控对象并定义 MPC 结构
    • 1.3 定义输入和输出通道属性
    • 1.4 配置仿真场景
    • 1.5 配置控制器水平线
    • 1.6 定义输入约束条件
    • 1.7 指定控制器调整权重
    • 1.8 消除输出超调
    • 1.9 测试控制器抗干扰能力
    • 1.10 指定浓度输出约束条件
    • 1.11 删除被控对象、控制器和场景
    • 二、使用步骤
      • 1.引入库
      • 2.读入数据
      • 总结

        前言

        模型预测控制工具箱™ 提供了用于开发模型预测控制 (MPC) 的函数、应用程序、Simulink® 模块和参考示例。对于线性问题,该工具箱支持设计隐式、显式、自适应和增益调度 MPC。对于非线性问题,您可以实现单级和多级非线性 MPC。该工具箱提供可部署的优化求解器,还能让您使用自定义求解器。

        您可以在 MATLAB® 和 Simulink 中通过运行闭环仿真来评估控制器性能。对于自动驾驶,您还可以使用提供的符合 MISRA C™ 和 ISO 26262 标准的模块和示例,快速开始车道保持辅助、路径规划、路径跟踪和自适应巡航控制应用。

        工具箱支持 C 和 CUDA® 代码以及 IEC 61131-3 结构化文本生成。


        一、使用 MPC Designer 设计控制器

        本例说明如何使用 MPC Designer 为连续搅拌槽反应器 (CSTR) 设计模型预测控制器。

        1.1 CSTR 模型

        连续搅拌罐反应器(CSTR)的线性化模型见 CSTR 模型。在该模型中,前两个状态变量分别是试剂浓度(此处称为 CA,单位为 kmol/m3)和反应器温度(此处称为 T,单位为 K),而前两个输入量分别是冷却剂温度(Tc,单位为 K,用于控制被控对象)和流入的进料试剂浓度 CAf,单位为 kmol/m3,(通常被视为未测量的干扰)。

        在本例中,冷却剂温度与标称值的变化范围为 ±10 度,变化速率为每秒 ±2 度。

        创建 CSTR 系统的状态空间模型。

        A = [   -5  -0.3427;
             47.68    2.785];
        B = [    0   1
               0.3   0];
        C = flipud(eye(2));
        D = zeros(2);
        CSTR = ss(A,B,C,D);
        

        1.2 导入被控对象并定义 MPC 结构

        mpcDesigner
        

        在 "MPC 设计器 "选项卡的 "结构 "部分,单击 “MPC 结构”。

        在 "通过导入定义 MPC 结构 "对话框中,在 "从 MATLAB 工作区选择一个被控对象模型或一个 MPC 控制器 "表中,选择 CSTR 模型。

        由于 CSTR 是一个稳定的连续时间 LTI 系统,因此 MPC Designer 将控制器采样时间设置为 0.1 Tr,其中 Tr 是 CSTR 的平均上升时间。在本例中,在指定 MPC 控制器采样时间字段中,输入 0.5 秒的采样时间。

        默认情况下,所有被控对象输入均定义为操纵变量,所有被控对象输出均定义为测量输出。在 "分配被控对象 i/o 通道 "部分,分配输入和输出通道索引,以便

        • 第一个输入,即冷却液温度,为操纵变量。

        • 第二个输入,进料浓度,是一个未测量的干扰。

        • 第一个输出,反应器温度,是一个测量输出。

        • 第二个输出,反应物浓度,是一个未测量的输出。

          单击导入。

          应用程序会将 CSTR 被控对象导入数据浏览器。以下内容也会添加到数据浏览器中:

          • mpc1 - 使用 CSTR 作为内部模型创建的默认 MPC 控制器。

          • scenario1 - 默认模拟场景。

            该程序运行默认模拟场景,并更新输入响应和输出响应图。闭环系统能够成功跟踪所需的测量输出,而未测量输出则不然。由于被控对象只有一个操纵变量,因此这种行为是意料之中的。

            一旦定义了 MPC 结构,就不能在当前的 MPC Designer 会话中进行更改。要使用不同的通道配置,请启动新的应用程序会话。

            1.3 定义输入和输出通道属性

            在 MPC Designer 选项卡上,选择 I/O Attributes。

            在 "输入和输出通道规格 "对话框的 "名称 "栏中,为每个输入和输出通道指定一个有意义的名称。

            在 "单位 "栏中,可选择指定每个通道的单位。

            由于状态空间模型是使用与标称工作点的偏差来定义的,因此请将每个输入和输出通道的标称值保持为 0。

            各通道的比例因子保持默认值 1。

            单击 “确定”。

            输入响应和输出响应绘图标签会更新,以反映新的信号名称和单位。

            1.4 配置仿真场景

            在 "MPC 设计器 "选项卡的 "场景 "部分,单击 “编辑场景”>“场景 1”。

            在 "模拟场景 "对话框中,将模拟持续时间设置为 20 秒。

            在参考信号表的第一行,指定步长为 2,时间为 5。

            在信号列第二行,选择常量参考,将浓度设定点保持在输入和输出通道规格对话框中定 义的标称值上(本例中标称值为零)。

            默认设置为模拟参考反应器温度 T 在 5 秒钟内发生 2 开尔文的阶跃变化。

            单击确定。

            响应图更新以反映新的模拟方案配置。CA 的参考值不再是阶跃值,而是等于零的常数。

            在 MPC Designer 左下方的 "情景 "部分,单击情景 1。第二次单击情景 1,并将情景重命名为 stepT。

            1.5 配置控制器水平线

            在 "调整 "选项卡的 "水平线 "部分,指定预测水平线为 15,控制水平线为 3。

            响应图更新以反映新的范围。输入响应图显示,控制操作违反了对冷却剂温度变化率的限制要求。

            1.6 定义输入约束条件

            在 "设计 "部分,单击 “约束”。

            在 "约束 "对话框的 "输入和输出约束 "部分的 "输入 "行中,分别在 "最小值 "和 "最大值 "列中输入冷却剂温度的上下限。

            在 RateMin 和 RateMax 栏中指定变化率限制。

            单击 “确定”。

            输入响应图显示了受控变量的控制行动。输入响应图显示了受控变量的控制行动。

            1.7 指定控制器调整权重

            在 "调整 "选项卡的 "设计 "部分,单击 “权重”。

            在输入权重表中,将操纵变量 (MV) 比率权重增加到 0.3。在控制器优化成本函数中,增加 MV 率权重可抑制 MV 的大幅变化。

            在输出权重表中,保留默认权重值。默认情况下,所有未测量的输出权重为零。

            由于只有一个受控变量,如果控制器试图将两个输出都保持在特定的设定点上,则一个或两个输出的响应都会出现稳态误差。由于控制器会忽略权重为零的输出设定点,因此将浓度输出权重设置为零可实现反应釜温度设定点跟踪,且稳态误差为零。

            单击 “确定”。

            输入响应图显示了较为保守的控制操作,这导致输出响应速度较慢。

            1.8 消除输出超调

            假设应用要求输出响应零过冲。在 "性能调整 "选项卡上,向左拖动 "闭环性能 "滑块,直到输出响应没有过冲。向左移动该滑块可同时增加控制器的操纵速率权重和减少输出变量权重,使控制器更加稳健。假设应用要求输出响应零过冲。在 "性能调整 "选项卡上,向左拖动 "闭环性能 "滑块,直到输出响应没有过冲。向左移动该滑块可同时增加控制器的操纵速率权重和减少输出变量权重,使控制器更加稳健。

            使用 "闭环性能 "滑块调整控制器调整权重时,MPC Designer 不会更改您在 "权重 "对话框中指定的权重。相反,滑块控制一个调整系数,该系数与用户指定的权重一起用于定义实际控制器权重。

            当滑块居中时,该系数为 1;当滑块向左移动时,其值减小;当滑块向右移动时,其值增大。权重系数乘以操纵变量和输出变量权重,再除以权重对话框中的操纵变量速率权重。因此,移动滑块增加鲁棒性会降低 OV 和 MV 权重,增加 MV 率权重,从而放宽对输出的控制,使控制动作更加保守。

            要查看实际控制器权重,请将控制器导出到 MATLAB® 工作区,然后查看导出控制器对象的权重属性。

            1.9 测试控制器抗干扰能力

            在过程控制应用中,干扰抑制往往比设定点跟踪更重要。模拟控制器对进料浓度阶跃变化(未测量干扰)的响应。

            在 "MPC 设计器 "选项卡的 "情景 "部分,单击 “绘制情景”>“新建情景”。

            在模拟场景对话框中,将模拟持续时间设为 20 秒。

            在参考信号表的第一行信号下拉列表中,选择步长,然后指定步长为 2,时间为 5。在第二行的信号列中,保持恒定参考以将浓度设定点保持在标称值上。

            在 "未测量的干扰 "行的信号下拉列表中,选择 “步长”,然后指定步长为 0.2,时间为 5。

            单击确定。

            应用程序会将新方案添加到数据浏览器中,并创建新的相应输入响应图和输出响应图。

            在数据浏览器的 "方案 "部分,将 NewScenario 重命名为 distReject。

            从输出响应图中可以看出,闭环系统仍能达到预期的反应器温度。在这种情况下,所需的控制动作加上输入干扰会导致输出浓度 CA 稳态下降 0.1 kmol/m3。

            1.10 指定浓度输出约束条件

            之前,您定义了控制器调整权重,以实现跟踪反应釜温度设定点且稳态误差为零的主要控制目标。这样做可以使未测量的反应器浓度自由变化。假设反应器浓度相对于其标称值降至 0.05 kmol/m3 以下时,会发生不必要的反应。要限制反应釜浓度,请指定输出限制。

            在 "设计 "部分的 "调谐 "选项卡上,单击 “约束”。

            在 "约束 "对话框的 "输入 "和 "输出约束 "部分的 "输出 "表第二行中,指定最小未测量输出 (UO) 值为 -0.05。

            默认情况下,所有输出约束都是软约束,即最小ECR 值和最大ECR 值都大于零。要进一步软化未测量输出 (UO) 约束,请增加其最大ECR 值。

            单击 “确定”。

            在输出响应图中,反应器浓度 CA 在 10 秒后稳定在-0.05 kmol/m3 的水平。由于只有一个控制变量,控制器在两个相互竞争的控制目标之间进行了折中: 温度跟踪和满足约束条件。较软的输出约束使控制器可以牺牲更多的约束要求来改善温度跟踪。

            由于输出约束条件较软,控制器可通过允许少量违反浓度约束条件来保持一定的温度控制水平。一般来说,根据您的应用要求,您可以尝试使用不同的约束设置来实现可接受的控制目标折衷。

            输出控制器

            在 "调谐 "选项卡的 "分析 "部分,单击 "导出控制器 "将调谐控制器 mpc1 保存到 MATLAB 工作区。

            1.11 删除被控对象、控制器和场景

            要删除被控对象、控制器或场景,请在 "数据浏览器 "中右键单击要删除的项目,然后选择 “删除”。

            不能删除当前控制器。此外,如果被控对象是唯一列出的工厂或方案,则无法删除。

            如果某个工厂被任何控制器或场景使用,则无法删除该工厂。

            要删除多个被控对象、控制器或场景,请按住 Shift 键并单击要删除的每个项目。

            二、使用步骤

            1.引入库

            代码如下(示例):

            import numpy as np
            import pandas as pd
            import matplotlib.pyplot as plt
            import seaborn as sns
            import warnings
            warnings.filterwarnings('ignore')
            import  ssl
            ssl._create_default_https_context = ssl._create_unverified_context
            

            2.读入数据

            代码如下(示例):

            data = pd.read_csv(
                'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
            print(data.head())
            

            该处使用的url网络请求的数据。


            总结

            提示:这里对文章进行总结:

            例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。