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

devtools/2024/11/23 19:34:13/
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() {// 初始化 DRNNDRNN 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.ppmy.cn/devtools/136361.html

相关文章

VITE 忽略指定路径的资源

前言 问题起因是因为项目需要引入服务器端的网络图片 而在编写配置时发现&#xff0c;Vite并不支持排除指定前缀的资源 唯一可以排外的只有 Rollup 的 external 选项可以排除外部依赖&#xff0c;但他只能排除外部依赖&#xff0c;不支持指定路径资源或指定前缀的资源&#…

FreeRTOS信号量(一)

目录 什么是信号量&#xff1f; 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先&#xff0c;创建时&#xff0c;二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

FreeRTOS:事件标志组与任务通知

目录 一、事件标志组&#xff08;Event Groups&#xff09; 1、事件标志组的特点 2、事件标志组与队列、信号量的区别 3、关键API函数 4、示例代码 5、优缺点 6、总结 二、任务通知&#xff08;Task Notifications&#xff09; 1、任务通知的特点 2、关键API函数 3、…

MYSQL——数据更新

一、插入数据 1.插入完整的数据记录 在MYSQL中&#xff0c;使用SQL语句INSERT插入一条完整的记录&#xff0c;语法如下&#xff1a; INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…

python语言基础-5 进阶语法-5.4 正则表达式

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.4 正则表达式 5.4.1 正则表达式 正则表达式的概念&#xff1a; 正则表达式是用来…

Docker 容器自动启动设置

在 Docker 中&#xff0c;可以通过设置容器的重启策略来实现容器的自动启动。这意味着&#xff0c;当 Docker 守护进程启动时&#xff0c;它可以自动启动特定的容器&#xff0c;无论是因为系统重启还是 Docker 服务本身的重启。 设置容器自动启动 要设置容器自动启动&#xf…

Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)

Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作&#xff08;三&#xff09; py2neo 删除 1、连接数据库 from py2neo import Graph graph Graph("bolt://xx.xx.xx.xx:7687", auth(user, pwd), nameneo4j)2、删除节点 # 删除单个节点 node graph.node…