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 pdif __name__ == '__main__':import numpy as npimport matplotlib.pyplot as pltfrom tensorflow.keras.models import load_modelimport tensorflow as tffrom src.dlmpc import SimSISOfrom src.dlmpc import MPCControllerfrom src.dlmpc import calculate_performance_metricsfrom src.dlmpc import optimizerfrom src.dlmpc import OnlineOptimizeimport timeimport osimport matplotlib as mplmpl.use('TkAgg')os.environ['CUDA_VISIBLE_DEVICES'] = '-1'plt.tick_params(labelsize=12)# TODO: Step1: parameters Settings#  NN parametes Settings# 窗口大小input_window_dy = 2input_window_du = 2ly = input_window_dy  # y的历史状态的长度lu = input_window_du-1  # u的历史输入的长度dim = ly+lu# MPC parameters Settings# Train_NN = TrueTrain_NN = Falsempc = Truepredict_horizon = 4 #10  # 预测时域  (2,1), (4,2 *),(3,3)control_horizon = 2 #5   # control_horizondim_u = 1             # control variable dimension = 1du_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.1R = np.eye(control_horizon) * 0.01  # 控制输入的权重矩阵 # 0.01N = 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 trainingif Train_NN:'''get trained model'''import osscript_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 trainingif 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 computationparameter = mpc.make_step(error, y_ref, iterations=100, tol=1e-6)  #u0 = parameter['u0']# system outputplant_output = simulation.plant(np.append(tf.squeeze(state_u), parameter['u0']),tf.squeeze(state_y))# estimate statestate_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'] = iresult.at[i, 'reference'] = y_refresult.at[i, 'System output'] = plant_outputresult.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= font2ax[0].set_xlabel('Time')ax[1].set_ylabel('u') #fontdict= font2ax[1].set_xlabel('Time')ax[2].set_ylabel('error') #fontdict= font2ax[2].set_xlabel('Time')# Set the font for tick labels to Times New Romanlabels = 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 layoutplt.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)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理之 TCP解释超详细!!!

TCP 有连接的 可靠传输 面向字节流 全双工 其中最核心的是可靠传输 那么 TCP 如何使用可靠传输的 ??? 我们尽可能传过去, 如果传不过去,发送方至少知道自己没传过去, 所以在于接收方, 收到或者没有收到, 都会有应答的操作 1. 确认应答 实现可靠性最核心的机制!!! 引出 …

【2024最新】渗透测试工具大全(超详细),收藏这一篇就够了!

所有工具仅能在取得足够合法授权的企业安全建设中使用,在使用所有工具过程中,您应确保自己所有行为符合当地的法律法规。如您在使用所有工具的过程中存在任何非法行为,您将自行承担所有后果,所有工具所有开发者和所有贡献者不承担…

eks节点的网络策略配置机制解析

参考链接 vpc-cni网络策略最佳实践,https://aws.github.io/aws-eks-best-practices/security/docs/network/#additional-resourcesvpc cni网络策略faq,https://github.com/aws/amazon-vpc-cni-k8s/blob/0703d03dec8afb8f83a7ff0c9d5eb5cc3363026e/docs/…

IP数据报的 分片与组装技术 深度解析

🍑个人主页:Jupiter. 🚀 所属专栏:计算机网络高效通关之路 欢迎大家点赞收藏评论😊 目录 IP 分片和组装分片与组装的过程分片组装 分片与组装过程的示意图分片组装过程 IP 分片和组装 16 位标识(id): 唯一的标识主机发…

Redis 事务 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 事务 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 事务 & 总结》(学习总结/最新最准/持续更新)《Redis & 事务…

自旋锁原理及基于原子引用手写自旋锁

什么是自旋锁 自旋锁(Spinlock)是一种用于多线程同步的机制,在尝试获取锁时,如果锁已经被其他线程持有,则当前线程不会立即被阻塞,而是会进入一个循环中反复尝试获取锁,直到成功为止。这种机制通…

探索CRM功能:六个解决方案助力企业发展

在当前竞争激烈的市场环境中,企业面临着客户关系管理的诸多挑战,CRM(客户关系管理)系统能够有效解决客户数据孤岛、提升客户互动效率、增强销售预测准确性等问题。通过整合客户信息和优化业务流程,CRM帮助企业实现更高…

解决JeecgBoot微服务通过Gateway访问Swagger资源出现“Knife4j文档请求异常”

1.问题描述 基于jeecgboot单体版本,参照官方推荐的纯微服务项目拆分指南,对jeecgboot项目进行微服务拆分,将gateway和system模块启动成功后,通过gateway访问访问Swagger接口文档,出现“Knife4j文档请求异常”,如下图: 2.问题定位: 1.浏览器F12打开控制台,查看异常请…

Kafka-Eagle(可视化监控平台)安装教程

Kafka Eagle 1. Install Mysql Kafka-Eagle 的安装依赖于 MySQL,MySQL 主要用来存储可视化展示的数据。 2.Kafka 环境准备 调整Kafka内存占用等参数,暴露JMX JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和…

在GeoTools中的Shapefile属性表读取效率之Shp与Dbf对比

目录 前言 一、POI测试数据简介 1、选用的POI数据 2、关于数据的属性数据 二、属性数据读取的两种方式实现 1、基于DbaseFileReader的读取 2、基于SimpleFeatureSource的读取 三、实际运行对比 1、内存和CPU占用情况 2、运行耗时情况 四、总结 前言 众所周知&#x…

《向量数据库指南》——text-embedding-3-large与Mlivus Cloud打造语义搜索新纪元

使用text-embedding-3-large生成向量并将向量插入Mlivus Cloud实现高效语义搜索的深度解析与实战操作 在数字化时代,数据的处理和存储方式正在经历前所未有的变革。特别是随着大数据和人工智能技术的快速发展,向量数据库作为一种新型的数据存储和查询方式,正逐渐受到越来越…

系统架构设计师教程 第2章 2.6 计算机语言 笔记

2.6计算机语言 ★★★★☆ 2.6.1计算机语言的组成 计算机语言 (Computer Language) 是指用于人与计算机之间交流的一种语言,是人与计算机之间传递信息的媒介。 计算机语言主要由一套指令组成,指令一般包括表达式、流程控制和集合三大部分内容。 表达…

Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容

介绍 在当今数据驱动的世界中,抓取动态网页内容变得越来越重要,尤其是像抖音这样的社交平台,动态加载的评论等内容需要通过特定的方式来获取。传统的静态爬虫方法难以处理这些由JavaScript生成的动态内容,Selenium爬虫技术则是一…

测试造数,excel转insert语句

目录 excel转sql的insert语句一、背景二、直接上代码 excel转sql的insert语句 一、背景 在实际测试工作中,需要频繁地进行测试造数并插入数据库验证,常规的手写sql语句过于浪费时间,为此简单写个脚本,通过excel来造数&#xff0…

Flink CDC系列之:调研应用Flink CDC将 ELT 从 MySQL 流式传输到 StarRocks方案

Flink CDC系列之:调研应用Flink CDC将 ELT 从 MySQL 流式传输到 StarRocks方案 准备准备 Flink Standalone 集群准备 docker compose为 MySQL 准备记录使用 Flink CDC CLI 提交作业 同步架构和数据更改路由变更清理 本教程将展示如何使用 Flink CDC 快速构建从 MySQ…

Rust 力扣 - 1. 两数相加

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个全局的备忘录,然后我们遍历数组,如果当前元素在备忘录里面找到了,就返回备忘录里面记录的下标和当前下标记录,没找到就把当前元素匹配的元素和当前元素…

DEVOPS: 容器与虚拟化与云原生

概述 传统虚拟机,利用 hypervisor,模拟出独立的硬件和系统,在此之上创建应用虚拟机是一个主机模拟出多个主机虚拟机需要先拥有独立的系统docker 是把应用及配套环境独立打包成一个单位docker 是在主机系统中建立多个应用及配套环境docker 是…

【WiFi7】 支持wifi7的手机

数据来源 Smartphones with WiFi 7 - list of all latest phones 2024 Motorola Moto X50 Ultra 6.7" 1220x2712 Snapdragon 8s Gen 3 16GB RAM 1024 GB 4500 mAh a/b/g/n/ac/6e/7 Sony Xperia 1 VI 6.5" 1080x2340 Snapdragon 8 Gen 3 12GB RAM 512 G…

基于JAVASE的题

字符集合 描述: 每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。 每组数据一行,按字符串原有的字符顺序,输出字符集合,记重复出现并靠后的字…

【数学二】多元函数积分学-重积分-二重积分定义、性质、计算

考试要求 1、了解多元函数的概念,了解二元函数的几何意义. 2、了解二元函数的极限与连续的概念,了解有界闭区域上二元连续函数的性质. 3、了解多元函数偏导数与全微分的概念,会求多元复合函数一阶、二阶偏导数,会求全微分&#x…