模型预测控制(Model predictive control,MPC)

2023-05-16

模型预测控制MPC ) 是一种先进的过程控制方法,用于在满足一组约束条件的同时控制过程。自 1980 年代以来,它一直在化工厂和炼油厂的加工工业中使用。近年来,它还被用于电力系统平衡模型[1]和电力电子学中。[2]模型预测控制器依赖于过程的动态模型,通常是通过系统识别获得的线性经验模型. MPC 的主要优势在于它允许优化当前时隙,同时考虑未来时隙。这是通过优化有限时间范围来实现的,但仅实现当前时隙,然后再次反复优化,因此与线性二次调节器 ( LQR ) 不同。MPC 还具有预测未来事件的能力,并可以相应地采取控制措施。PID控制器不具备这种预测能力。MPC 几乎普遍作为数字控制实现,尽管有研究通过专门设计的模拟电路实现更快的响应时间。[3]

广义预测控制(GPC) 和动态矩阵控制(DMC) 是 MPC 的经典示例。

MPC 与 LQR 

模型预测控制和线性二次调节器都是最优控制的表达,具有不同的设置优化成本的方案。

模型预测控制器通常着眼于固定长度、通常逐渐加权的误差函数集,而线性二次调节器则着眼于所有线性系统输入并提供传递函数,该传递函数将减少整个频谱的总误差,权衡状态误差针对输入频率。

由于这些根本差异,LQR 具有更好的全局稳定性属性,但 MPC 通常具有更多的局部最优 [?] 和复杂性能。

MPC 和LQR之间的主要区别在于LQR 在整个时间窗口(水平)上进行优化,而 MPC 在后退时间窗口中进行优化,[4]并且使用 MPC 经常计算新的解决方案,而 LQR 使用相同的单个(最佳)整个时间范围的解决方案。因此,MPC 通常在比整个范围更小的时间窗口内解决优化问题,因此可能会获得次优解决方案。然而,由于 MPC 不对线性度做任何假设,它可以处理硬约束以及非线性系统从其线性化操作点的迁移,这两者都是 LQR 的主要缺点。

这意味着 LQR 在远离稳定不动点运行时会变弱。MPC 可以在这些固定点之间绘制一条路径,但不能保证解决方案的收敛性,特别是如果考虑到问题空间的凸性和复杂性已被忽略。

def main():
    # Define x0 -a [1x4] array and then transpose it to be a [4x1]
    x0 = np.array([[0.0, 0.0, 0.0, 0.0]]).T  # [x,y,v theta]
    # Print x0. It's our initial state- [xPos, yPos, Velocity and Angle in radians w.r.t +yPos]
    # Customise this as an input to see how different initial trajectories converge to the optimised path
    #
    print(x0)
    x = x0

    # Define Input - [2x1] array
    # u - [accelerator, steering_wheel_rate]
    u = np.array([[0.0, 0.0]]).T  # [a,beta]
    plt.figure(num=None, figsize=(12, 12))

    mincost = 100000

    for i in range(1000):
        A, B, C = LinealizeCarModel(x, u, dt, lr)
        ustar, xstar, cost = CalcInput(A, B, C, x, u)

        u[0, 0] = GetListFromMatrix(ustar.value[0, :])[0]
        u[1, 0] = float(ustar[1, 0].value)

        x = A @ x + B @ u

        plt.subplot(3, 1, 1)
        plt.plot(target[0], target[1], "xb")
        plt.plot(x[0], x[1], ".r")
        plt.plot(GetListFromMatrix(xstar.value[0, :]), GetListFromMatrix(
            xstar.value[1, :]), "-b")
        plt.axis("equal")
        plt.xlabel("x[m]")
        plt.ylabel("y[m]")
        plt.grid(True)

        plt.subplot(3, 1, 2)
        plt.cla()
        plt.plot(GetListFromMatrix(xstar.value[2, :]), "-b")
        plt.plot(GetListFromMatrix(xstar.value[3, :]), "-r")
        plt.ylim([-1.0, 1.0])
        plt.ylabel("velocity[m/s]")
        plt.xlabel("horizon")
        plt.grid(True)

        plt.subplot(3, 1, 3)
        plt.cla()
        plt.plot(GetListFromMatrix(ustar.value[0, :]), "-r", label="a")
        plt.plot(GetListFromMatrix(ustar.value[1, :]), "-b", label="b")
        plt.ylim([-0.5, 0.5])
        plt.legend()
        plt.grid(True)

        #  plt.pause(0.0001)

        #  raw_input()

        # check goal
        dis = np.linalg.norm([x[0] - target[0], x[1] - target[1]])
        if dis < 0.1:
            print("Goal")
            break

Model predictive controller - MATLAB- MathWorks 中国A model predictive controller uses linear plant, disturbance, and noise models to estimate the controller state and predict future plant outputs.icon-default.png?t=M85Bhttps://ww2.mathworks.cn/help/mpc/ref/mpc.html?searchHighlight=MPC&s_tid=srchtitle_MPC_1

Design and simulate model predictive controllers - MATLAB- MathWorks 中国The MPC Designer app lets you design and simulate model predictive controllers in MATLAB and Simulink.icon-default.png?t=M85Bhttps://ww2.mathworks.cn/help/mpc/ref/mpcdesigner-app.html?searchHighlight=MPC&s_tid=srchtitle_MPC_2

Simulate model predictive controller - Simulink- MathWorks 中国The MPC Controller block receives the current measured output signal (mo), reference signal (ref), and optional measured disturbance signal (md).icon-default.png?t=M85Bhttps://ww2.mathworks.cn/help/mpc/ref/mpccontroller.html?searchHighlight=MPC&s_tid=srchtitle_MPC_3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模型预测控制(Model predictive control,MPC) 的相关文章

  • 为什么有两个类:视图模型和域模型?

    我知道使用域模型作为视图模型可能很糟糕 如果我的域模型有一个名为 IsAdmin 的属性 并且我有一个创建控制器操作来创建用户 那么有人可以更改我的表单并使其 POST IsAdmin true 表单值 即使我没有在视图中公开这样的文本字段
  • 从 C# 对象自动生成 javascript 对象模型

    寻找现有的 经过验证的解决方案来快速生成客户端JavaScript 对象模型代表一个现有的 C 对象 我想象有一个 T4 模板或其他一些方法 但我缺乏找到它的术语 我不是在讨论序列化以获取现有 C 对象实例的 JSON 表示形式或任何与反序
  • 我需要双向创建 automapper createmap 吗?

    这可能是一个愚蠢的问题 n00b 到 AutoMapper 并且时间很短 我想使用 AutoMapper 从 EF4 实体映射到 ViewModel 类 1 如果我打电话 CreateMap
  • 反转博客条目和评论的显示顺序,Ruby on Rails

    我是 Rails 新手 所以可以在这里使用一些帮助 我已经按照几个教程创建了一个博客 其中包含评论 甚至还有一些 AJAX 花哨的内容 但我仍然坚持一些我希望很简单的事情 博客和评论的默认显示是首先列出最旧的 我如何反转它以在顶部显示最新条
  • zend 模型架构

    假设我的数据库中有两个表 项目和用户 我创建了两个扩展 Zend Db Table Abstract 的模型 Model DbTable Users and Model DbTable Projects 现在 创建一个实例是一个好的模式吗
  • Java 的 C++ 解析器/模型

    我想知道是否有人知道可以在 Java 中以编程方式使用的现有 C 解析器 代码模型 我正在寻找类似于 Eclipse CDT 的东西 它可以用作 Java 的库 并且不依赖于 Eclipse 提前致谢 您不想构建自己的 C 解析器 它会杀了
  • Django,多表继承有那么糟糕吗?

    这并不是 django 特有的 一罐模型 Place with location name and other common attributes Restaurant menu ConcertHall hall size 在两个单独的表中
  • Kohana 3:经过验证的模型示例

    我找到有关模型和验证的示例和教程 我说验证 或至少大部分 应该在模型中 我同意这一点 但我无法提供任何示例或教程来说明应该如何完成此操作 谁能帮我举一个简单的例子来说明如何做到这一点 模型中的规则在哪里 验证将在哪里进行 控制器如何知道验证
  • 多表继承模型和相同两个模型之间的简单一对一关系有什么区别?

    这些实现之间有什么区别 Django 有何不同 除了继承 Metaordering and get latest by属性 1 models py from django db import models class Place model
  • 使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

    使用一个简单的示例进行设置 我有 1 张桌子 Totals 保存了总和amount第二个表中每条记录的列 Things When a thing amount更新后 我想简单地将旧值和新值之间的差异添加到total sum 现在我正在减去s
  • Django 中级模型用户

    我想创建一个模型 其中用户拥有多家公司一定数量的股份 看来我应该使用 Django 中间模型关系 但我不确定如何将中间模型应用到内置 Django 用户模型 目前 公司与股东 用户 之间存在多对多关系 如何为每个特定的公司股东关系添加股份数
  • 使用 sunspot/solr 搜索多个模型

    我已经能够成功地实现基本的全文搜索 但是当我尝试使用范围 with statements 时 任何涉及多对多关系模型的查询似乎都不适合我 我知道相关行位于数据库中 因为我的 sql 语句确实返回了数据 然而 太阳黑子查询不会返回任何结果 我
  • 过滤 Django 管理选择框的模型结果

    我今天刚开始使用 Django 到目前为止发现做简单的事情相当困难 我现在正在努力解决的是过滤状态类型列表 StatusTypes 模型是 class StatusTypes models Model status models CharF
  • 使用枚举名称而不是值对 Pydantic 字段进行编码

    我有一个枚举类 class Group enum Enum user 0 manager 1 admin 2 我有一个 pydantic 模型 class User BaseModel id int username str group G
  • 在 Django 视图中访问其他项目中的模型导致“表不存在”错误

    基地项目结构 baseproject baseapp models py class BaseModel models Model 其他项目结构 project app views py urls py 项目 app views py im
  • {“error”:“服务签名名称:在签名定义中找不到“serving_default””}

    我使用GCP 谷歌云平台 来训练我的模型 我可以导出导出的模型 我使用了该模型并使用了服务 1 8 CPU 的 Tensorflow 的本地 docker 映像 我得到以下结果作为 REST 后调用的输出 错误 服务签名名称 serving
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • MVVM 在 iOS 中的使用

    我是一名 iOS 开发人员 我对我的项目中存在大量视图控制器感到内疚 因此我一直在寻找更好的方法来构建我的项目 并遇到了 MVVM 模型 视图 视图模型 架构 我读了很多关于 iOS 的 MVVM 文章 但有几个问题 我将用一个例子来解释我
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中

随机推荐

  • PDU 发送短信1

    使用PDU模式 xff0c 包含UDH头信息分割短信 xff0c 用户数据头UDH 61 00表示长短信拆分 贴一个转来的PDU学习笔记 xff0c 网上收藏的 关于PDU其实并不难 xff0c 至于PDU是什么 xff0c 不管它 xff
  • 在elementUI中格式化信息几种方式

    1 组件自带的格式化方法 2 全局注册过滤器 3 用el switch 这三列的数据需要格式化 lt el table border data 61 34 list 34 gt lt el table column label 61 34
  • 第八届蓝桥杯客观题答案

    解析 2 OC门又叫集电极开路门 5 地线也算信号线 6 RS232 不能调试下载吧 xff1f JATG 4线 xff08 不用VCC xff09 SWJ 5线 SPI 不是下载线 xff0c 通信用的 xff0c 而且也有五根 7 答案
  • Python学习笔记:Pyqt5鼠标键盘事件处理

    import sys from PyQt5 QtCore import from PyQt5 QtGui import from PyQt5 QtWidgets import class windows QMainWindow def in
  • c++成员函数后面加一个冒号:

    冒号后跟着的是赋值操作 xff0c 这种写法是c 43 43 的特性 比如 xff0c LRUcache int capacity cap capacity 相当于 LRUcache int capacity cap 61 capacity
  • python---布谷鸟搜索算法

    布谷鸟搜索算法 xff08 Cuckoo Search xff0c CS xff09 布谷鸟算法的启发当然来自于布谷鸟 xff0c 因为布谷鸟这种鸟很有意思 xff0c 生出来的孩子自己不养 xff0c 直接被扔到其他鸟的鸟巢中去了 xff
  • THRESH_OTSU mode: > ‘src_type == CV_8UC1 || src_type == CV_16UC1‘ > where > ‘src_type‘ is 6

    问题 xff1a python cv2 报错 xff1a 原因 OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法 xff0c 是一种自适应的阈值确定的方法 xff0c 又称大津阈值分割法 xff0c 是最小二
  • 树莓派4B安装ubuntu mate崩溃(卡死)解决办法

    初次安装过程中 不要连WIFI xff01 xff01 xff01 不要接网线 xff01 xff01 xff01 我重装了不下15次所得来的惨痛教训 xff01 xff01 xff01
  • ubuntu20.04配置FrankMocap实现3D人体姿态估计

    一 初始环境配置 1 ubuntu20 04配置显卡驱动 以我的这篇文章为例子 xff0c 显卡RTX2060及以下的都可以使用我的方法快速完成配置 xff0c RTX2060以上的我尚未进行尝试 xff0c 请自行斟酌尝试 联想拯救者R7
  • 使用VNC远程控制树莓派的Ubuntu20.04(arm)

    一 将PC与树莓派连接到同一个局域网内 比如 xff1a 将树莓派和PC连接到同一个wifi中 xff0c 方法一 xff1a 如果是家用wife发射器 xff0c 则可以在浏览器中输入 xff1a http 192 168 0 1 来查询
  • vue笔记

    ES6相关补充 var 没有块级作用域 let 有块级作用域 ES5之前因为if和for都没有块级作用域的概念 xff0c 只能借助function的作用域来解决应用外面变量的问题 let有if和for的块级作用域 变量作用域 xff1a
  • python3字符串

    Python3 字符串 字符串是 Python 中最常用的数据类型 我们可以使用引号 或 来创建字符串 创建字符串很简单 xff0c 只要为变量分配一个值即可 例如 xff1a var1 61 Hello World var2 61 Run
  • html思维导图

    标题标签 标题标签 h1 h5 xff0c 字体从大到小 对应英文语义headline 使用注意 xff1a 标题里的文字要xian想水平居中或者垂直居中得用text align和line height来做 xff0c 内外边距不行 xff
  • 什么是MVVM?

    什么是MVVM MVVM是Model View ViewModel的缩写 MVVM是一种设计思想 View层是视图层 xff0c 也就是用户界面 前端主要由HTML和CSS来构建 xff1b Model层 是指数据模型 xff0c 泛指后端
  • Docker——Windows版本Docker安装

    目录 一 简介 1 1 Docker如何解决大型项目依赖关系复杂 xff0c 不同组件依赖的兼容性问题 xff1f 1 2 Docker如何解决开发 测试 生产环境有差异的问题 1 3 Docker 和 虚拟机的区别 1 4 Docker架
  • 细说C++中的 :: 和 : 的区别

    C 43 43 中的 1 类的作用域 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 假如 xff1a A B表示两个类 xff0
  • 扰动观测器(DOB)设计

    snf 机器人机械手可能会受到不同类型的干扰 例如未知的有效载荷 未建模的动力学和环境相互作用力 观察机器人操纵器中的这些未知干扰是许多机器人应用的基础 例如干扰抑制和无传感器力控制 机械手在进行正常操作时可能会受到不同类型的干扰 粗略地说
  • Gazebo安装教程——在 Ubuntu 上安装Gazebo的源代码

    安装工具 建议使用一些额外的工具来帮助编译源代码 xff0c 尽管其他正确获取和构建源代码的方法也是可能的 获取所有库的源代码的最简单方法是使用 vcstool 要以正确的顺序编译所有不同的库和 ign gazebo xff0c 建议使用c
  • 线性与非线性控制

    控制理论领域可以分为两个分支 xff1a 线性控制理论 这适用于由遵循叠加原理的设备组成的系统 xff0c 这大致意味着输出与输入成正比 它们由线性微分方程控制 一个主要的子类是另外具有不随时间变化的参数的系统 xff0c 称为线性时不变
  • 模型预测控制(Model predictive control,MPC)

    模型预测控制 MPC 是一种先进的过程控制方法 xff0c 用于在满足一组约束条件的同时控制过程 自 1980 年代以来 xff0c 它一直在化工厂和炼油厂的加工工业中使用 近年来 xff0c 它还被用于电力系统平衡模型 1 和电力电子学中