模糊PID控制算法实战讲解-案例温度控制(附C语言实现)

news2024/11/20 14:27:35

 可结合之前的文章一起理解:

控制算法-PID算法总结-从公式原理到参数整定解析(附C源码)_pid自整定算法-CSDN博客

模糊控制算法实战讲解-案例温度控制(附C语言实现)-CSDN博客 

 

目录

一、模糊PID控制的原理

1.1 模糊化

1.2 模糊规则库

1.3 模糊推理

1.4  去模糊化

1.5 PID控制输入计算

二、特点和应用场景

三、案例温度控制

简化版本:

加入重心法后的模糊PID版本:


模糊PID控制算法是将传统的PID控制与模糊逻辑控制相结合的一种控制策略。这种算法尝试通过模糊逻辑系统来自动调整PID控制器的参数(比例系数Kp​、积分系数Ki​、微分系数Kd​),以适应系统动态变化的需求,从而提高控制系统的性能。模糊PID控制在处理非线性、时变系统或者模型不完全已知的系统时尤其有效。

一、模糊PID控制的原理

传统的PID控制器根据偏差e(t)(期望输出与实际输出之间的差值)和偏差的变化率e1(t)来计算控制输入。PID控制器的输出由三部分组成:比例(P)、积分(I)和微分(D)项,计算公式为:

                               

在模糊PID控制中,系统利用模糊逻辑根据当前的偏差e(t)和偏差变化率e1(t)来动态调整Kp​、Ki​、Kd​的值,以适应系统的变化。

1.1 模糊化

将偏差e(t)和偏差变化率e1(t)的精确值转换为模糊值,这些模糊值对应于模糊集合中的语言变量,例如“正大”、“正小”、“零”、“负小”、“负大”。

1.2 模糊规则库

建立一个模糊规则库,这些规则基于专家知识或经验,描述了在特定偏差和偏差变化率的情况下如何调整PID参数。例如:如果偏差是正大,且变化率是正小,则增大比例系数Kp​。

1.3 模糊推理

根据模糊化的输入e(t)和e1(t))和模糊规则库,通过模糊推理得出每个PID参数的调整策略。

1.4  去模糊化

将模糊推理的结果转换为精确的PID参数值。

1.5 PID控制输入计算

使用调整后的PID参数计算控制输入u(t)

二、特点和应用场景

模糊PID控制器的主要优点是它结合了PID控制的直观性和模糊控制的适应性,能够在系统模型不完全已知或存在较大不确定性时提供良好的控制性能。控制更平稳。

应用场景:工业控制系统、机器人、汽车电子控制等领域

三、案例温度控制

考虑一个温度控制系统,其中模糊PID控制器用于调整加热器的功率输出,以维持设定的温度。根据温度偏差和偏差变化率的不同,模糊控制器会动态调整Kp​、Ki​、Kd​,以快速响应温度变化并减小超调,提高系统的稳定性和响应速度。

简化版本:

控制目标是使系统温度维持在一个设定值(比如25°C)。

PID参数(Kp​,Ki​,Kd​)需要根据温度偏差e(t)和偏差变化率e1(t)动态调整。

 PID控制器的结构体:

typedef struct {
    float Kp, Ki, Kd; // PID参数
    float integral;   // 积分项累计值
    float prev_error; // 上一次的偏差
} PIDController;

模糊规则:

void adjustPIDParams(PIDController* pid, float error, float delta_error) {
    // 假设根据偏差的大小和变化率调整PID参数
    // 这里的逻辑非常简化,实际应用中应该基于详细的模糊规则

    // 如果偏差大,增加Kp来快速减少偏差
    if (error > 5.0) pid->Kp += 0.1;
    else if (error < -5.0) pid->Kp -= 0.1;

    // 如果偏差变化快,增加Kd来减少超调
    if (delta_error > 0.5) pid->Kd += 0.05;
    else if (delta_error < -0.5) pid->Kd -= 0.05;

    // 保证PID参数在合理范围内
    if (pid->Kp < 0) pid->Kp = 0;
    if (pid->Kd < 0) pid->Kd = 0;
}

控制逻辑:

float computePIDOutput(PIDController* pid, float setpoint, float measured) {
    float error = setpoint - measured;
    float delta_error = error - pid->prev_error;

    // 简单的模糊逻辑调整PID参数
    adjustPIDParams(pid, error, delta_error);

    // 计算PID输出
    float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * delta_error;

    // 更新状态
    pid->integral += error;
    pid->prev_error = error;

    return output;
}
int main() {
    PIDController pid = {0.1, 0.01, 0.05, 0, 0}; // 初始化PID参数和状态
    float setpoint = 25.0; // 目标温度
    float measured_temp = 20.0; // 测量温度,示例值

    // 模拟控制循环
    for (int i = 0; i < 100; ++i) {
        float control_signal = computePIDOutput(&pid, setpoint, measured_temp);
        // 应用control_signal到加热器...
        // 更新measured_temp...
        
        printf("Control Signal: %f\n", control_signal)

加入重心法后的模糊PID版本:

1)定义输入输出的模糊集合:

输入:温度误差e和误差变化率de

每个输入都可以定义为几个模糊集合,例如:负大(NB),负小(NS),零(ZE),正小(PS),正大(PB)。

输出:PID参数的调整量,包括ΔKpΔKiΔKd。输出也可以定义为类似的模糊集合。

 2)定义隶属度函数:

   对于每个模糊集合,定义一个隶属度函数来量化一个具体的输入值属于该模糊集合的程度。隶属度函数可以是三角形、梯形或是其他形状。

3)模糊规则

  • 基于经验或专家知识制定一组模糊规则,用于描述输入模糊集合之间的关系以及它们如何影响输出模糊集合。
  • 例如:“如果e是PB并且de是ZE,则ΔKp是PB”。

4)去模糊化

 使用重心法(或其他去模糊化方法)将模糊输出转换为一个具体的数值,用于调整PID参数。

 只考虑e的影响,以kp的变化量调整为例:

#include <stdio.h>

// 示例:简化的隶属度计算函数
float calculateMembership(float value, float min, float max) {
    if (value <= min) return 0;
    else if (value >= max) return 1;
    else return (value - min) / (max - min);
}

// 示例:计算ΔKp的重心
float calculateDeltaKp(float e, float de) {
    // 示例:隶属度值计算(这里仅为示例,实际情况下更复杂)
    float eNB = calculateMembership(e, -10, -5);
    float eNS = calculateMembership(e, -5, -2);
    float eZE = calculateMembership(e, -2, 2);
    float ePS = calculateMembership(e, 2, 5);
    float ePB = calculateMembership(e, 5, 10);
    
    // 示例:简化的模糊规则处理,假设只根据e的模糊集合调整Kp
    float deltaKp = (eNB * -2) + (eNS * -1) + (eZE * 0) + (ePS * 1) + (ePB * 2);
    float totalMembership = eNB + eNS + eZE + ePS + ePB;
    
    // 重心法去模糊化
    return totalMembership > 0 ? deltaKp / totalMembership : 0;
}

int main() {
    float e = -3;  // 示例误差值
    float de = 0;  // 示例误差变化率
    
    float deltaKp = calculateDeltaKp(e, de);
    printf("Calculated ΔKp: %f\n", deltaKp);
    
    return 0;
}

考虑e和de影响:

#include <stdio.h>

// 示例:隶属度计算函数
float calculateMembership(float value, float min, float max) {
    if (value < min) return 0;
    else if (value > max) return 1;
    else return (value - min) / (max - min);
}

// 示例:根据e和de的模糊规则计算ΔKp
float calculateDeltaKp(float e, float de) {
    // 隶属度值计算
    float eNB = calculateMembership(e, -10, -5);
    float deNB = calculateMembership(de, -10, -5);

    float eNS = calculateMembership(e, -5, -2);
    float deNS = calculateMembership(de, -5, -2);

    float eZE = calculateMembership(e, -2, 2);
    float deZE = calculateMembership(de, -2, 2);

    float ePS = calculateMembership(e, 2, 5);
    float dePS = calculateMembership(de, 2, 5);

    float ePB = calculateMembership(e, 5, 10);
    float dePB = calculateMembership(de, 5, 10);

    float deltaKpValues[] = {-2, -1, 0, 1, 2}; // 对应NB, NS, ZE, PS, PB
    // 模糊规则处理
    float rule1Output = eNB * deNB  * deltaKpValues[0]; // 
    float rule2Output = eNS * deNS * deltaKpValues[1]; // 
    float rule3Output = eZE * deZE * deltaKpValues[2]; // 如果e和de都是ZE,则ΔKp保持不变
    float rule4Output = ePS * dePS  * deltaKpValues[3]; //
    float rule5Output = ePB * dePB * deltaKpValues[4]; //


    // 假设这是根据所有规则计算出的ΔKp总和
    float deltaKpTotal = rule1Output+rule2Output +rule3Output 
        +rule4Output +rule5Output ; 
    float totalMembership = eNB +deNB +eNS + deNS +eZE + deZE+ePB +dePB ; 

    // 重心法去模糊化
    return totalMembership > 0 ? deltaKpTotal / totalMembership : 0;
}

int main() {
    float e = -1;  // 示例误差值
    float de = 1;  // 示例误差变化率
    
    float deltaKp = calculateDeltaKp(e, de);
    printf("Calculated ΔKp: %f\n", deltaKp);
    
    return 0;
}

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

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

相关文章

【程序员是如何看待“祖传代码”的?】《代码的遗产:探索程序员眼中的“祖传代码”》

程序员是如何看待“祖传代码”的&#xff1f; 在程序员的世界里&#xff0c;代码不仅仅是构建软件的基石&#xff0c;它们也承载着历史、智慧和技术的演变。在我的编程生涯中&#xff0c;我遇到过许多神奇而独特的“祖传代码”&#xff0c;这些代码如同古老的魔法书&#xff0…

网络协议栈和os的关系(网络协议栈和计算机体系结构图相结合),用户如何从网络获取数据+本质,简述网络通信的本质

目录 网络协议栈和os的关系 思考联系 实际 用户从网络获取数据的过程 本质 如何获取 -- 系统调用 图示 不同的os 网络通信的本质 两台主机通信流程 网络协议栈和os的关系 思考联系 网络协议栈涵盖了硬件和软件,而os正是管理软硬件资源的中枢 os是计算机体系结构的一…

python自动化学习--3.8python操作EXCEL文件python日志收集处理

1、Excel文件处理 安装 openpxl 第三方库 openpxl 模块三大组件: 1、工作簿 &#xff08;包含多个sheet工作表&#xff09; 2、工作表 &#xff08;某个数据包含在某个工作表&#xff09; 3、单元格 1、创建excel工作簿 import openpyxl"""Excel表格的创建…

存内计算技术大幅提升机器学习算法的性能—挑战与解决方案探讨

一.存内计算技术大幅机器学习算法的性能 1.1背景 人工智能技术的迅速发展使人工智能芯片成为备受关注的关键组成部分。在人工智能的构建中&#xff0c;算力是三个支柱之一&#xff0c;包括数据、算法和算力。目前&#xff0c;人工智能芯片的发展主要集中在两个方向&#xff1…

好物周刊#42:国产项目管理软件

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. 菠萝博客 基于 Java 的菠萝博客系统&#xff0c;简单易部署&#xff0c;精致主题&#xff0c;贴心服务&#xf…

1 数据分析概述与职业操守

1、 EDIT数字化模型 E——exploration探索 &#xff08;是什么&#xff09; 业务运行探索&#xff1a;探索关注企业各项业务的运行状态、各项指标是否合规以及各项业务的具体数据情况等。 指标体系——目标&#xff08;O&#xff09;、策略&#xff08;S&#xff09;、指标&a…

推荐系统经典模型YouTubeDNN代码

文章目录 前言数据预处理部分模型训练预测部分总结与问答 前言 上一篇讲到过YouTubeDNN论文部分内容&#xff0c;但是没有代码部分。最近网上教学视频里看到一段关于YouTubeDNN召回算法的代码&#xff0c;现在我分享一下给大家参考看一下&#xff0c;并附上一些我对代码的理解…

C++——类和对象(1)

1. 类 我们之前提及过C语言是面向过程的语言&#xff0c;其解决问题的方式是关注问题过程&#xff0c;然后逐步解决。而C是面向对象编程&#xff0c;聚焦于对象&#xff0c;依靠多个对象之间的交互关系解决问题。而类这个概念的引入则是面向对象的最深刻体现。 1.1 C中的结构体…

二叉树的增删查改

本节复习二叉树的增删查改&#xff0c; 二叉树的知识相对于前面的循序表&#xff0c; 链表&#xff0c; 以及栈和队列都要多一些。 同时二叉树的增删查改理解起来相对来说要困难一些。 本节来好好复习一下二叉树的增删查改。 目录 准备文件 创建结构体蓝图 二叉树的前序遍历…

【数据分享】2001-2022年我国省市县镇四级的逐日平均降水量数据(免费获取\excel\shp格式)

降水数据是我们在各项研究中最常用的气象指标之一&#xff01;之前我们给大家分享过来源于国家青藏高原科学数据中心发布的1961—2022年全国范围的逐日降水栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是2001-2002年我国省市县镇四个…

【中科院计算所】WSDM 2024冠军方案:基于大模型进行多文档问答

作者&#xff1a;李一鸣 张兆 中科院计算所 会话式多文档问答旨在根据检索到的文档以及上下文对话来回答特定问题。 在本文中&#xff0c;我们介绍了 WSDM Cup 2024 中“对话式多文档 QA”挑战赛的获胜方法&#xff0c;该方法利用了大型语言模型 (LLM) 卓越的自然语言理解和生…

Pyhton的组合数据类型

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命对某些人来说是美丽的&#xff0c…

二分查找讲解

关于我为什么要写单独开一篇文章写二分,实际上那么多困难的算法,比如线段树,并查集等等都没有难倒我,我最近却被二分难倒了,而且是两次,两次在赛场上做不出来二分的应用题,于是我决定写一篇二分查找的算法总结.刚接触算法的时候本来是要写一篇的,但后面因为各种原因搁置了,现在…

lv20 QT主窗口

熟悉创建主窗口项目 1 QAction 2 主窗口 菜单栏&#xff1a;fileMenu menuBar()->addMenu(tr("&File")); 工具栏&#xff1a;fileToolBar addToolBar(tr("File")); 浮动窗&#xff1a;QDockWidget *dockWidget new QDockWidget(tr("Dock W…

云上攻防-云服务篇弹性计算服务器云数据库实例元数据控制角色AK控制台接管

知识点: 1、云服务-弹性计算服务器-元数据&SSRF&AK 2、云服务-云数据库-外部连接&权限提升 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&am…

Pytorch学习 day01(Jupyter安装

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

深度学习 精选笔记(8)梯度消失和梯度爆炸

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

微信小程序 vs 公众号商城:亿发解密线上业务的最佳选择之道

在拓展线上业务的道路上&#xff0c;搭建线上商城成为企业首要选择。然而&#xff0c;在选择小程序商城和公众号商城时&#xff0c;很多企业陷入了两者之间的纠结。本文将深入解答小程序商城和公众号商城的概念、区别&#xff0c;并为您提供明智的选择建议。 一、小程序商城和公…

Flutter开发之Slider

Flutter开发之Slider 本文是关于介绍Slider相关属性的含义。 class SliderThemeData {/// slider轨道的高度 final double? trackHeight; /// 滑块滑过的轨道颜色 final Color? activeTrackColor; /// 滑块未滑过的轨道颜色 final Color? inactiveTrackColor; /// 滑块滑过…

多人同时导出 Excel 干崩服务器?我们来实现一个排队导出功能!

考虑到数据库数据日渐增多&#xff0c;导出会有全量数据的导出&#xff0c;多人同时导出可以会对服务性能造成影响&#xff0c;导出涉及到mysql查询的io操作&#xff0c;还涉及文件输入、输出流的io操作&#xff0c;所以对服务器的性能会影响的比较大&#xff1b; 结合以上原因…