基于 DRNN 神经网络整定的 PID 解耦控制

news2024/11/23 5:31:02
1. 基本原理

DRNN(Dynamic Recurrent Neural Network, 动态递归神经网络)是一种带有时间反馈的神经网络,能够建模系统的动态特性,适用于非线性、多变量、时变系统的控制。结合 PID 解耦控制,利用 DRNN 进行动态建模和在线参数整定,可以实现精确的多变量解耦控制。


2. 方法原理

5. C++ 实现

5.1 DRNN 模型
#include <iostream>
#include <vector>
#include <cmath>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

class DRNN {
private:
    MatrixXd Wx, Wy; // 权值矩阵
    VectorXd b;      // 偏置
    VectorXd state;  // 状态变量
    double learningRate;

public:
    DRNN(int inputSize, int outputSize, double lr)
        : Wx(MatrixXd::Random(outputSize, inputSize)),
          Wy(MatrixXd::Random(outputSize, outputSize)),
          b(VectorXd::Random(outputSize)),
          state(VectorXd::Zero(outputSize)),
          learningRate(lr) {}

    // 前向计算
    VectorXd forward(const VectorXd& input) {
        state = tanh(Wx * input + Wy * state + b);
        return state;
    }

    // 训练更新
    void train(const VectorXd& input, const VectorXd& target) {
        VectorXd output = forward(input);
        VectorXd error = target - output;

        // 更新权值
        Wx += learningRate * error * input.transpose();
        Wy += learningRate * error * state.transpose();
        b += learningRate * error;
    }
};

5.2 PID 控制器

class PID {
private:
    double Kp, Ki, Kd;
    double prevError, integral;

public:
    PID(double initKp, double initKi, double initKd)
        : Kp(initKp), Ki(initKi), Kd(initKd), prevError(0.0), integral(0.0) {}

    void updateGains(double newKp, double newKi, double newKd) {
        Kp = newKp;
        Ki = newKi;
        Kd = newKd;
    }

    double compute(double error, double dt) {
        integral += error * dt;
        double derivative = (error - prevError) / dt;
        prevError = error;

        return Kp * error + Ki * integral + Kd * derivative;
    }
};

5.3 主程序

int main() {
    // 初始化 DRNN
    DRNN drnn(2, 2, 0.01);

    // 初始化解耦器
    MatrixXd G(2, 2);
    G << 2.0, 0.5,
         0.3, 1.0;
    MatrixXd D = G.inverse();

    // 初始化 PID 控制器
    PID pid1(1.0, 0.1, 0.01);
    PID pid2(1.0, 0.1, 0.01);

    // 输入和输出
    VectorXd input(2), output(2), setpoint(2);
    setpoint << 1.0, 0.5;
    input.setZero();
    output.setZero();

    double dt = 0.1;

    for (int t = 0; t < 100; ++t) {
        // DRNN 预测
        VectorXd predictedOutput = drnn.forward(input);

        // 解耦误差
        VectorXd error = setpoint - predictedOutput;
        VectorXd decoupledError = D * error;

        // 更新 PID 参数
        pid1.updateGains(1.0 + 0.1 * error[0], 0.1, 0.01);
        pid2.updateGains(1.0 + 0.1 * error[1], 0.1, 0.01);

        // 计算控制输入
        input[0] = pid1.compute(decoupledError[0], dt);
        input[1] = pid2.compute(decoupledError[1], dt);

        // 系统输出模拟
        output = G * input;

        // DRNN 训练
        drnn.train(input, output);

        cout << "Time: " << t * dt << ", Output: " << output.transpose() << endl;
    }

    return 0;
}

6. 应用场景

  • 化工过程控制:复杂的多变量耦合系统;
  • 机器人运动控制:机械臂多自由度解耦控制;
  • 能源管理:风力发电多变量动态解耦;
  • 飞行控制:飞行器姿态解耦控制。

7. 总结

  • 优点
    • DRNN 具有在线辨识和动态调整能力,适应复杂时变系统;
    • 解耦与 PID 整定结合,提高了系统鲁棒性和响应速度。
  • 挑战
    • DRNN 的训练复杂度较高;
    • 解耦器设计依赖系统建模精度。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Boot】用 MyBatis 实现数据的 CRUD

用 MyBatis 实现数据的 CRUD 1.创建项目 & 引入依赖2.实现数据表的自动初始化3.实现实体对象建模4.实现实体和数据表的映射关系5.实现增加、删除、修改和查询功能6.配置分页功能6.1 增加分页支持6.2 创建分页配置类 7.实现分页控制器8.创建分页视图 本篇博客将通过 MyBatis…

极坐标气泡图:医学数据分析的可视化新视角

在医学研究中&#xff0c;数据的可视化是至关重要的。它不仅能帮助我们更直观地理解数据&#xff0c;还能揭示数据中隐藏的模式和趋势。今天&#xff0c;我们要介绍一种独特的数据可视化工具——极坐标气泡图&#xff0c;以及它在医学中的重要作用。 什么是极坐标气泡图&#…

Cmakelist.txt之Liunx-rabbitmq

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(rabbitmq_linux_test LANGUAGES C) ​ add_library(examples-common OBJECT) target_sources(examples-common PRIVATEutils.hutils.c) if(WIN32)target_sources(examples-common PRIVATE win32/platform_ut…

【AIGC】ChatGPT提示词Prompt解析:拒绝的艺术:如何优雅地说“不“

引言 在人际交往的复杂网络中,学会优雅地拒绝是一种至关重要的社交智慧。很多人往往因为害怕伤害他人的感受,而选择敷衍、拖延或不置可否。 然而,真正的智慧在于如何用尊重和同理心传达"不"的信息。 本文将深入探讨优雅拒绝的艺术,帮助你在维护自身边界的同时,…

《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

简介&#xff1a;本文详细阐述了 OpenCV 在图像操作中的关键技术&#xff0c;包括缩放&#xff08;确定尺寸缩放与按比例缩放&#xff09;、翻转&#xff08;沿不同轴的翻转方式&#xff09;以及变换&#xff08;平移、旋转、三点确定变换和四点确定变换即透视变换&#xff09;…

蓝桥杯每日真题 - 第21天

题目&#xff1a;(空间) 题目描述&#xff08;12届 C&C B组A题&#xff09; 解题思路&#xff1a; 转换单位&#xff1a; 内存总大小为 256MB&#xff0c;换算为字节&#xff1a; 25610241024268,435,456字节 计算每个整数占用空间&#xff1a; 每个 32 位整数占用…

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…

HCIA考试内容多吗?HCIA数通学什么?

HCIA(Huawei Certified ICT Associate)考试的具体内容因华为公司技术发展与考试更新而有所调整。 一般而言&#xff0c;HCIA考试内容涵盖了计算机网络基础知识、设备配置技巧、网络协议理解、安全与管理实践等方面。 HCIA考试内容有什么 具体而言&#xff0c;HCIA考试内容包…

【MySQL实战45讲笔记】基础篇——深入浅出索引(上)

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 基础篇——事务隔离 目录 系列文章深入浅出索引&#xff08;上&#xff09;4.1 索引的常见模型4.2 InnoDB 的索引模型4.3 索引维护4.4 思考&#xff1a;为什么要重建索引以及如何做&#xff1f; 深入浅出索…

技术美术百人计划 | 《2.1 色彩空间介绍》笔记

总览 一、色彩发送器 色彩认知&#xff1a; 光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑&#xff0c;最终大脑对颜色产生了认…

无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)

在数字化时代&#xff0c;流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合&#xff0c;流媒体播放器的核心技术不断演进&#xff0c;为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、…

Cannal实现MySQL主从同步环境搭建

大家好&#xff0c;我是袁庭新。 在多数情况下&#xff0c;客户端往往会优先获取缓存中的数据。然而&#xff0c;当缓存数据与数据库中的实际数据存在显著不一致时&#xff0c;可能会导致严重的后果。因此&#xff0c;确保数据库与缓存数据之间的一致性变得至关重要&#xff0c…

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项&#xff08;曼哈顿距离&#xff09; 2.3.2…

探索ASP.NET Core 6 MVC与SqlServer的完美结合:一个开源示例项目

探索ASP.NET Core 6 MVC与SqlServer的完美结合&#xff1a;一个开源示例项目 【下载地址】ASP.NETCore6MVCSqlServer示例项目 ASP.NET Core 6 MVC SqlServer 示例项目本仓库提供了一个基于 ASP.NET Core 6 的 MVC 应用程序示例&#xff0c;使用 SqlServer 数据库 项目地址: …

LLM | 论文精读 | CVPR | Alpha-CLIP —— 一个聚焦目标区域的CLIP模型

论文标题&#xff1a;Alpha-CLIP: A CLIP Model Focusing on Wherever You Want 作者&#xff1a;Zeyi Sun, Ye Fang, Tong Wu, Pan Zhang, Yuhang Zang等 期刊&#xff1a;CVPR 2024 DOI&#xff1a;http://arxiv.org/pdf/2312.03818v2 email&#xff1a;yuhan.huangwhu.ed…

MySQL 的 Change Buffer 是什么?它有什么作用?

MySQL 的 Change Buffer 是什么&#xff1f;它有什么作用&#xff1f; MySQL 是目前广泛使用的开源数据库管理系统&#xff0c;其中的 InnoDB 存储引擎凭借其高性能、高可靠性以及强大的事务支持&#xff0c;成为了默认的存储引擎。在 InnoDB 的众多优化机制中&#xff0c;Cha…

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…

VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送

因为开发钉钉H5微应用在手机上一直查看不到日志等&#xff0c;出现安卓和苹果上传图片一边是成功的&#xff0c;一边是失败的&#xff0c;所以找了这个&#xff0c;之前在开发微信小程序进行调试的时候能看到&#xff0c;之前没想到过&#xff0c;这次被人提点发现可以单独使用…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波&#xff08;Ensemble Kalman Filter&#xff09; 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;是…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…