DL-MPC (deep learning model predictive control)python 实现

DL-MPC(Deep Learning Model Predictive Control)是一种结合深度学习和模型预测控制的先进控制策略。其核心思想是利用深度学习模型来预测系统的未来行为,并通过模型预测控制来优化控制输入,从而实现对复杂系统的高效控制。

深度学习模型预测控制

参考链接:WangXiaoMingo/TensorDL-MPC:DL-MPC(深度学习模型预测控制)是基于 Python 和 TensorFlow 框架开发的软件工具包,旨在通过深度学习技术增强传统模型预测控制 (MPC) 的性能。该工具包提供模型训练、仿真、参数优化等核心功能。 (github.com)

在TensorFlow中实现DL-MPC的具体步骤如下:
  1. 定义预测模型

    • 使用深度学习框架(如TensorFlow或PyTorch)定义一个神经网络模型,该模型用于预测系统的未来状态。这通常包括输入当前状态和控制输入,输出未来状态的预测。
    • 在TensorFlow中,可以使用tf.keras 模块来定义和构建神经网络模型。
  2. 实现MPC算法

    • 实现模型预测控制(MPC)算法,包括预测模型、滚动优化和控制律更新。
    • 预测模型:使用定义的神经网络模型进行状态预测。
    • 滚动优化:在每个时间步,使用预测模型进行多步预测,并通过优化目标函数来计算最优控制输入。
    • 控制律更新:根据优化结果更新控制律,以实现对系统的控制。
  3. 训练神经网络模型

    • 使用历史数据训练神经网络模型,使其能够准确预测系统的未来状态。
    • 在TensorFlow中,可以使用tf.keras fit方法进行训练。
  4. 集成到控制系统

    • 将训练好的神经网络模型和MPC算法集成到控制系统中。
    • 在每个时间步,使用当前状态和控制输入,通过神经网络模型进行状态预测,并通过MPC算法计算最优控制输入。
    • 更新系统状态并重复上述过程。

代码:


''' test bp-mpc'''
import pandas as pd



if __name__ == '__main__':
    import numpy as np
    import matplotlib.pyplot as plt
    from tensorflow.keras.models import load_model
    import tensorflow as tf
    from src.dlmpc import SimSISO
    from src.dlmpc import MPCController
    from src.dlmpc import calculate_performance_metrics
    from src.dlmpc import optimizer
    from src.dlmpc import OnlineOptimize
    import time
    import os
    import matplotlib as mpl
    mpl.use('TkAgg')
    os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
    plt.tick_params(labelsize=12)

    # TODO: Step1: parameters Settings
    #  NN parametes Settings
    # 窗口大小
    input_window_dy = 2
    input_window_du = 2
    ly = input_window_dy  # y的历史状态的长度
    lu = input_window_du-1  # u的历史输入的长度
    dim = ly+lu

    # MPC parameters Settings
    # Train_NN = True
    Train_NN = False
    mpc = True
    predict_horizon = 4 #10  # 预测时域  (2,1), (4,2 *),(3,3)
    control_horizon = 2 #5   # control_horizon
    dim_u = 1             # control variable dimension = 1
    du_bounds = 10       # control variable constraints (delta u)
    u_bounds = [-5,5]          # control variable constraints (u)
    opt = optimizer(optimizer_name='sgd', learning_rate=0.1, du_bound=None, exponential_decay=False)
    error = 0

    # 定义权重矩阵
    Q = np.eye(predict_horizon) * 0.1   # 跟踪误差的权重矩阵  # 0.1
    R = np.eye(control_horizon) * 0.01  # 控制输入的权重矩阵 # 0.01

    N = 150  # 运行周期
    y_ref = 10  # 参考轨迹值
    # 初始化系统状态
    '''
    initial_state = np.array([1, 1.2])    # 初始状态可以自定义,y[0],y[1]
    initial_input = np.array([0.1, 0.2])  # 初始状态可以自定义,u[0],u[1]
    '''
    state_y = tf.constant([[1], [1.2]], dtype=tf.float32)
    state_u = tf.constant([[0.1]], dtype=tf.float32)
    u0 = tf.constant([0.2], dtype=tf.float32)


    # TODO: Step2: load plant and parameters
    '''return plant: simulation'''
    simulation = SimSISO(noise_amplitude=0)

    # TODO: Step3: Load  NN model and training
    if Train_NN:
        '''get trained model'''
        import os
        script_path = 'test_models_bp_regressor.py'
        os.system(f'python {script_path}')

    model = load_model(f'models_save/BP_predictor.h5')
    # model.summary()

    # TODO: Step4: mpc training

    if mpc:
        # 创建MPC控制器实例
        mpc_controller = MPCController(model, predict_horizon, control_horizon, Q, R, ly, lu, dim_u, [-du_bounds,du_bounds],u_bounds, opt)
        data = np.zeros((N-2,7))
        result = pd.DataFrame(data,columns=['Time','reference', 'System output','u','solving_time', 'epoch','error'])
        # 初始化图表
        plt.close()
        fig, ax = plt.subplots(3, 1)
        plt.ion()  # 打开交互模式
        # MPC控制循环
        for i in range(2,N):
            if i > 30:
                y_ref = 5  # 参考轨迹值
            if i > 70:
                y_ref = 10  # 参考轨迹值
            mpc = OnlineOptimize(mpc_controller,state_y, state_u, use_online_correction=True)
            # controller computation
            parameter = mpc.make_step(error, y_ref, iterations=100, tol=1e-6)  #
            u0 = parameter['u0']
            # system output
            plant_output = simulation.plant(np.append(tf.squeeze(state_u), parameter['u0']),tf.squeeze(state_y))
            # estimate state
            state_y, state_u, error = mpc.estimate(parameter['u0'], plant_output)

            print(f">>> Current Time: {i},\t Object J: {parameter['solving_J']:>=.4f}, \t Current u:{parameter['u0'][0]:>=.4f}, \t Current System output: {plant_output[0]:>=.4f}, \t Optimization epoch: {parameter['solving_epoch']}, \t Solving time:{parameter['solving_time']:>=.4f} s")

            result.at[i, 'Time'] = i
            result.at[i, 'reference'] = y_ref
            result.at[i, 'System output'] = plant_output
            result.at[i, 'u'] = parameter['u0']
            result.at[i, 'epoch'] = parameter['solving_epoch']
            result.at[i, 'solving_time'] = parameter['solving_time']
            result.at[i, 'error'] = y_ref - plant_output

            # 动态更新图表
            for a in ax:
                a.clear()
            ax[0].plot(result['reference'][:i],'-',label='reference')    # 绘制当前变量的数据
            ax[0].plot(result['System output'][:i],'--',label='System output')  # 绘制当前变量的数据
            ax[0].legend(loc='upper right')

            ax[1].plot(result['u'][:i],'--',label='u') #
            ax[1].legend(loc='upper right')

            ax[2].plot(result['error'][:i],'--',label='error')
            ax[2].legend(loc='upper right')

            ax[0].set_ylabel('y') #fontdict= font2
            ax[0].set_xlabel('Time')

            ax[1].set_ylabel('u') #fontdict= font2
            ax[1].set_xlabel('Time')

            ax[2].set_ylabel('error') #fontdict= font2
            ax[2].set_xlabel('Time')
            # Set the font for tick labels to Times New Roman
            labels = ax[0].get_xticklabels() + ax[1].get_xticklabels() + ax[2].get_xticklabels() + ax[0].get_yticklabels() + ax[1].get_yticklabels() + ax[2].get_yticklabels()
            for label in labels:
                label.set_fontname('Times New Roman')
            # Adjust the layout
            plt.tight_layout()
            plt.draw()  # 绘制更新
            plt.pause(0.01)  # 暂停短时间,等待更新

        # 控制循环结束后,关闭图表
        plt.ioff()
        plt.close(fig)

        # plt.figure()
        plt.plot(result['reference'], '-', label='reference')  # 绘制当前变量的数据
        plt.plot(result['System output'], '--', label='System output')  # 绘制当前变量的数据
        plt.legend(loc='upper right')
        plt.show(block=False)

        plt.close()


        time = np.array(result['Time'])
        setpoint = np.array(result['reference'])
        sys_out = np.array(result['System output'])

        performance_metrics = calculate_performance_metrics([f'{model.name}_MPC'], sys_out, setpoint, time, percent_threshold=0.02,
                                               ise=True,
                                               iae=True,
                                               overshoot=False,
                                               peak_time=False,
                                               rise_time=False,
                                               rise_time1=False,
                                               settling_time=False,
                                               steady_state_error=False)
        # print(result)

        plt.figure()
        plt.plot(np.array(result['u']), label='input_u')
        plt.show()

        performance_metrics['mean_epoch'] = result['epoch'].mean()
        performance_metrics['mean_solving_time'] = result['solving_time'].mean()
        performance_metrics['mean_error'] = result['error'].mean()
        print(performance_metrics)



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7镜像下载

新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64/ http://mirror.centos.org/centos/7/isos/ 国内的华为云,超级快:https://mirrors.huaweiclou…

Linux TCP CC状态机

万字详文:TCP 拥塞控制详解 - 知乎bcc/tools/tcpcong.py at master iovisor/bccbcc/tools/tcpcong_example.txt at master iovisor/bcc 1.状态机 2.tcp map

认识类与对象(上)

目录 何为类,何为对象? 一.对于类 1.idea修改文件类名 二.对于对象 三.this关键字 1.区分成员变量和局部变量 2.引用当前对象 3.调用当前对象的其他构造方法 4.总结 四.构造方法 1.利用idea特性快速写出构造方法 五.封装 1.利用idea特性快速写出set和…

鸿蒙网络编程系列32-基于拦截器的性能监控示例

1. 拦截器简介 在Web开发中拦截器是一种非常有用的模式,它允许开发者在请求发送到服务器之前或响应返回给客户端之前执行一些预处理或后处理操作。这种机制特别适用于需要对所有网络请求或响应进行统一处理的情况,比如添加全局错误处理、请求头的修改、…

【深度学习】【OpenVINO】【C++】模型转化、环境搭建以及模型部署的详细教程

【深度学习】【OpenVINO】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【OpenVINO】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转onnxWindows平台搭建…

我们可以用微服务创建状态机吗?

大家好,我是锋哥。今天分享关于【我们可以用微服务创建状态机吗?】面试题?希望对大家有帮助; 我们可以用微服务创建状态机吗? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 是的,微服务架构可…

为什么选择 Spring data hadoop

👉 请点赞支持这款 全新设计的脚手架 ,让 Java 再次伟大! spring-data-hadoop hbase 常见的操作方式有以下三种: Native Api 原生 api 操作繁琐,就像用 JDBC 操作关系型数据库一样,类似 flush、submit、…

Windows系统启动MongoDB报错无法连接服务器

文章目录 发现问题解决办法 发现问题 1)、先是发现执行 mongo 命令,启动报错: error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017; 2)、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…

【最全基础知识2】机器视觉系统硬件组成之工业相机镜头篇--51camera

机器视觉系统中,工业镜头作为必备的器件之一,须和工业相机搭配。工业镜头是机器视觉系统中不可或缺的重要组成部分,其质量和性能直接影响到整个系统的成像质量和检测精度。 目录 一、基本功能和作用 二、分类 1、按成像方式分 2、按焦距分 3、按接口类型分 4、按应用…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门(Update Gate):决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门(Reset Gate):用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…

STM32实现毫秒级时间同步

提起“时间同步”这个概念,大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题,让多个传感器同时采集数据。 打个比方。两个人走路,都是100毫秒走一步(频率相同是前提&…

2024数学分析【南昌大学】

计算极限 lim ⁡ n → ∞ 2024 n ( 1 − cos ⁡ 1 n 2 ) n 3 1 + n 2 − n \mathop {\lim }\limits_{n \to \infty } \frac{{\sqrt[n]{{2024}}\left( {1 - \cos \frac{1}{{{n^2}}}} \right){n^3}}}{{\sqrt {1 + {n^2}} - n}} n→∞lim​1+n2 ​−nn2024 ​(1−cosn21​)n3​ …

XJ02、消费金融|消费金融业务模式中的主要主体

根据所持有牌照类型的不同,消费金融服务供给方主要分为商业银行、汽车金融公司、消费金融公司和小贷公司,不同类型机构定位不同、提供消费金融服务与产品类型也各不相同。此外,互联网金融平台也成为中国消费金融业务最重要的参与方之一,虽其并非持牌金融机构,但借助其流量…

React 分装webSocket

背景 AI 实时对话 需要流式数据 React Hooks 写法。新建WebSocket.tsx 放在根目录components import { useCallback, useRef, useState } from react;type MessageHandler (message: MessageEvent) > void; type ErrorHandler (event: Event) > void;export functi…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础:神经网络、训练过程与激活函数 引言: 深度学习作为机器学习的一个子领域,近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构,使得计算机能够从数据中学习复杂的模式和特征,…

List、Set、数据结构、Collections

一、数据结构 1.1 常用的数据结构 栈 栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 简单的说:采用该结构的集合&#…

【网络协议栈】Tcp协议(下)的可靠性和高效性(超时重传、快速重传、拥塞控制、流量控制)

绪论: 承接上文,上文写到Tcp协议的结构以及对tcp协议的性能优化的滑动窗口,本章我们将继续了解Tcp协议的可靠性和高效性的具体展示。后面我将继续完善网络协议栈的网络层协议敬请期待! 话不多说安全带系好,发车啦(建议…

【AI绘画】Midjourney进阶:对角线构图详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯什么是构图为什么Midjourney要使用构图 💯对角线构图特点应用场景提示词书写技巧测试 💯小结 💯前言 【AI绘画】Midjourney进阶&a…

Linux常用命令1

切换目录 cd [rootlocalhost menge]# cd /[rootlocalhost /]# cd: cd [-L|[-P [-e]] [-]] [目录] 查看当前的目录 pwd 浏览目录内容 ls ls浏览后颜色表示 白色:普通文件 蓝色:目录 红色:压缩包文件 黄色:设备文件 绿…

以 6502 为例讲讲怎么阅读 CPU 电路图

开篇 你是否曾对 CPU 的工作原理充满好奇,以及简单的晶体管又是如何组成逻辑门,进而构建出复杂的逻辑电路实现?本文将以知名的 6502 CPU 的电路图为例,介绍如何阅读 CPU 电路图,并向你演示如何从晶体管电路还原出逻辑…