当前位置: 首页 > news >正文

一文带你深度了解“模糊控制器”的实现原理及C语言实现代码

本篇文章记录分享模糊控制器的算法原理和C语言实现代码,由于模糊控制经常可以代替传统的PID控制算法,且能达到较好的控制效果,故在此同大家分享。希望我的分享能够给你带来不一样的收获。有关PID算法的知识,大家可以参考以下文章:

(1)、PID算法详解(精华知识汇总)-CSDN博客

(2)、PID算法详解(代码详解篇),位置式PID、增量式PID(通用)_pid代码-CSDN博客

目录

一、什么是模糊控制器 

1、模糊控制器的核心概念

(1)、模糊集合

(2)、 隶属度函数:

(3)、模糊化(Fuzzification)

 (4)、模糊规则库:

(5)、 规则推理(Inference)

(6)、 去模糊化(Defuzzification)

 2、模糊控制器的原理

3、模糊控制器的应用场景

 4、应用示例

二、C语言模糊控制器算法实现 

1、模糊集合的隶属度函数

2、模糊化过程

3、规则推理过程

4、去模糊化过程

5、完整模糊控制器实现

 6、使用模糊控制器

7、原理解释

8、归纳说明

三、结语 


一、什么是模糊控制器 

模糊控制器(Fuzzy Controller)是一种基于模糊逻辑的控制系统。它与传统的控制系统不同,不依赖精确的数学模型,而是使用模糊集合和模糊逻辑来处理不确定性和模糊信息,从而在非线性、时变或难以建模的系统中实现有效的控制。

1、模糊控制器的核心概念

(1)、模糊集合

模糊集合与传统的集合不同,传统集合中的元素要么属于该集合,要么不属于;而在模糊集合中,元素可以部分地属于集合,隶属度(Membership Degree)是用来表示元素属于集合的程度,值在0到1之间。

这里引入一个新的名词——“隶属度”

隶属度(Membership Degree 或 Degree of Membership)是模糊集合理论中的一个核心概念。它表示一个元素属于某个模糊集合的程度或可信度,用数学术语来描述,就是表示某个输入在模糊集合中的隶属程度。

在模糊集合中,隶属度是一个介于0到1之间的值:

  • 隶属度为1 表示元素完全属于这个模糊集合。
  • 隶属度为0 表示元素完全不属于这个模糊集合。
  • 介于0到1之间的值 表示元素部分属于这个模糊集合,值越接近1,表示隶属程度越高。

举个例子:

假设我们有一个模糊集合 "温暖" 用来表示温度。根据定义,20°C可能是一个非常典型的温暖温度(隶属度接近1),15°C是有点温暖(隶属度为0.5),而10°C则不被认为是温暖(隶属度接近0)。

隶属度函数

隶属度函数(Membership Function)用来确定输入值的隶属度。它通常是一个曲线,可以是三角形、梯形、Gaussian(高斯)、sigmoid等形式。隶属度函数为每个输入值分配一个隶属度,从而将输入值映射到模糊集合。

举个简单的例子

  • 对于20°C,隶属度为1(完全温暖)。
  • 对于15°C,隶属度为0.5(有点温暖)。
  • 对于10°C,隶属度为0(完全不温暖)。

隶属度的应用

隶属度广泛应用于模糊逻辑控制系统中,用于处理模糊、不确定的信息。在模糊控制器中,输入值被模糊化为隶属度值,基于这些隶属度值进行模糊推理,最后通过去模糊化过程生成实际控制输出。

隶属度的概念使得模糊控制器能够在面对非线性、时变或不确定性较高的系统时,仍能有效地处理控制任务。

(2)、 隶属度函数

隶属度函数定义了一个输入值属于模糊集合的隶属度。例如,对于“温暖”这个模糊集合,20°C可能对应高隶属度,而10°C对应低隶属度。

(3)、模糊化(Fuzzification)

模糊化是将输入的精确数值转换为模糊集合的隶属度值的过程。通过模糊化,系统将真实的输入数据转换为模糊信息,以便后续处理。

 (4)、模糊规则库

模糊控制器的核心是规则库,它定义了控制策略。规则库由一组模糊“如果-那么”规则组成。例如:“如果温度低并且湿度高,那么风扇速度慢”。

(5)、 规则推理(Inference)

规则推理是根据模糊规则库对输入进行推理,生成模出的过程糊输。它通过模糊逻辑操作(如模糊逻辑AND、OR等)对输入隶属度进行组合,生成输出的隶属度。

(6)、 去模糊化(Defuzzification)

去模糊化是将模糊推理的结果转换为精确控制输出的过程。常见的去模糊化方法有加权平均法、最大隶属度法等。

 2、模糊控制器的原理

模糊控制器的基本原理是通过模糊集合、隶属度函数和模糊规则来模拟人类的推理过程。例如,当驾驶汽车时,人类会根据路况、速度、距离等模糊信息做出“慢下来”、“加速”或“保持速度”的决策,模糊控制器则模拟这一过程。

3、模糊控制器的应用场景

由于模糊控制器不需要精确的数学模型,特别适合以下场景:

  • 非线性系统:传统控制器难以处理的系统,模糊控制器可以通过模糊逻辑有效地进行控制。
  • 复杂系统:对于难以建立数学模型的复杂系统,模糊控制器能依靠经验规则进行控制。
  • 时变系统:系统参数随时间变化的系统,模糊控制器可以适应这种变化。
  • 多变量系统:处理多个输入输出的复杂系统时,模糊控制器能够处理多维度的信息。

 4、应用示例

一个典型的模糊控制器应用是家用电饭煲,它根据温度、湿度等输入条件的模糊信息,通过模糊规则调节加热功率,保证米饭煮得恰到好处,而不需要精确计算加热时间和功率。

二、C语言模糊控制器算法实现 

1、模糊集合的隶属度函数

#include <stdio.h>// 模糊集合的隶属度函数,用于计算输入值在模糊集合中的隶属度。
// 模糊集合 "Negative" 的隶属度函数
double fuzzy_negative(double x) {if (x <= -1.0) return 1.0;    // 当输入值小于或等于-1时,完全属于"Negative"集合,隶属度为1else if (x > -1.0 && x < 0.0) return -x;  // 当输入值在-1到0之间,隶属度随x增加而减小else return 0.0;    // 当输入值大于或等于0时,完全不属于"Negative"集合,隶属度为0
}// 模糊集合 "Zero" 的隶属度函数
double fuzzy_zero(double x) {if (x <= -1.0 || x >= 1.0) return 0.0;  // 当输入值小于-1或大于1时,完全不属于"Zero"集合,隶属度为0else if (x > -1.0 && x < 0.0) return x + 1.0;  // 当输入值在-1到0之间,隶属度随x增加而增加else if (x >= 0.0 && x < 1.0) return 1.0 - x;  // 当输入值在0到1之间,隶属度随x增加而减小else return 0.0;  // 其他情况下隶属度为0(理论上不会进入此分支)
}// 模糊集合 "Positive" 的隶属度函数
double fuzzy_positive(double x) {if (x >= 1.0) return 1.0;    // 当输入值大于或等于1时,完全属于"Positive"集合,隶属度为1else if (x > 0.0 && x < 1.0) return x;  // 当输入值在0到1之间,隶属度随x增加而增加else return 0.0;    // 当输入值小于或等于0时,完全不属于"Positive"集合,隶属度为0
}

2、模糊化过程

// 模糊集合的结构体,用于存储每个模糊集合的隶属度值
typedef struct {double negative;  // "Negative"集合的隶属度double zero;      // "Zero"集合的隶属度double positive;  // "Positive"集合的隶属度
} FuzzySet;// 模糊化函数,将输入值转换为模糊集合的隶属度值
FuzzySet fuzzify(double input) {FuzzySet fuzzy_set;fuzzy_set.negative = fuzzy_negative(input);  // 计算输入值在"Negative"集合中的隶属度fuzzy_set.zero = fuzzy_zero(input);          // 计算输入值在"Zero"集合中的隶属度fuzzy_set.positive = fuzzy_positive(input);  // 计算输入值在"Positive"集合中的隶属度return fuzzy_set;
}

3、规则推理过程

// 模糊推理函数,根据输入误差和误差变化率的模糊集合隶属度进行推理,计算控制输出
double fuzzy_inference(FuzzySet fuzzy_error, FuzzySet fuzzy_delta_error) {double output_negative = 0.0;  // "Negative"输出的隶属度double output_zero = 0.0;      // "Zero"输出的隶属度double output_positive = 0.0;  // "Positive"输出的隶属度// 规则1: 如果误差是Negative且误差变化率是Negative,则输出为Positiveoutput_positive = fmax(output_positive, fmin(fuzzy_error.negative, fuzzy_delta_error.negative));// 规则2: 如果误差是Negative且误差变化率是Zero,则输出为Positiveoutput_positive = fmax(output_positive, fmin(fuzzy_error.negative, fuzzy_delta_error.zero));// 规则3: 如果误差是Zero且误差变化率是Zero,则输出为Zerooutput_zero = fmax(output_zero, fmin(fuzzy_error.zero, fuzzy_delta_error.zero));// 规则4: 如果误差是Positive且误差变化率是Positive,则输出为Negativeoutput_negative = fmax(output_negative, fmin(fuzzy_error.positive, fuzzy_delta_error.positive));// 综合输出结果,使用加权平均法对隶属度进行计算double output = (output_negative * -1.0 + output_zero * 0.0 + output_positive * 1.0) /(output_negative + output_zero + output_positive);return output;  // 返回控制输出
}

4、去模糊化过程

// 去模糊化函数,将模糊推理结果转换为实际输出值
double defuzzify(double fuzzy_output) {// 简单的去模糊化方法:直接返回模糊推理的加权平均值return fuzzy_output;
}

5、完整模糊控制器实现

// 完整的模糊控制器函数,实现模糊化、规则推理和去模糊化的全部过程
double fuzzy_control(double error, double delta_error) {// 1. 模糊化:将误差和误差变化率转换为模糊集合的隶属度值FuzzySet fuzzy_error = fuzzify(error);FuzzySet fuzzy_delta_error = fuzzify(delta_error);// 2. 规则推理:根据模糊规则计算控制输出的模糊结果double fuzzy_output = fuzzy_inference(fuzzy_error, fuzzy_delta_error);// 3. 去模糊化:将模糊输出结果转换为实际控制信号double output = defuzzify(fuzzy_output);return output;  // 返回最终控制输出
}

 6、使用模糊控制器

int main() {double setpoint = 1.0;        // 目标值double measured_value = 0.8;  // 实际测量值double previous_value = 0.7;  // 上一次的测量值// 计算误差及误差变化率double error = setpoint - measured_value;double delta_error = measured_value - previous_value;// 计算模糊控制输出double control_signal = fuzzy_control(error, delta_error);// 打印控制信号printf("Control Signal: %f\n", control_signal);return 0;
}

7、原理解释

  1. 模糊化(Fuzzification)将输入值(如误差和误差变化率)转换为模糊集合中的隶属度值。隶属度函数根据输入值的大小,计算其在不同模糊集合中的隶属度,隶属度值范围为0到1之间,表示输入值属于某个集合的程度。

  2. 规则推理(Rule Inference):根据定义好的模糊规则,将输入的模糊集合隶属度进行推理计算,得到控制输出的模糊集合。每条规则使用“如果-那么”形式,如“如果误差为负且误差变化率为负,则输出为正”,表示在这种情况下输出应为正。

  3. 去模糊化(Defuzzification)将模糊集合的输出转换为实际的控制输出值。去模糊化通常使用加权平均法,将所有可能输出值的隶属度加权平均后得到最终的输出值。

8、归纳说明

通过这些步骤,模糊控制器能够处理复杂和不确定性较高的控制问题,相比传统的PID控制器,模糊控制器在处理非线性、时变和不确定系统时可能更为有效。

三、结语 

关于模糊控制器的算法原理及C语言实现过程就分享到此了,希望我的分享能给你带来不一样的收获!

愿与诸君共勉,砥砺前行,逐梦不止~~~


http://www.mrgr.cn/news/783.html

相关文章:

  • 白骑士的C#教学实战项目篇 4.3 Web开发
  • 高可用集群keepalived的应用以及部署
  • 隧道定位导航技术主要依赖于哪些原理或技术
  • 6路220V交流电通断监测采集,继电器报警输出模块DAM-3020R
  • 【CSS】数字英文css没有转换成...换行点、没有换行、拆分的问题(非常常见的需求)
  • redis字符串若干记录
  • CPU缓存一致性机制详解
  • css如何使一个盒子水平垂直居中
  • 鸿蒙关于可以实现滚动效果的容器组件的相关知识
  • 《广东省消费品召回管理办法》所称的消费品缺陷,是指因设计、制造、警示等原因,致使同一批次、型号或者类别的消费品中___的危及人身、财产安全的不合理危险。()
  • 和等于 k 的最长子数组长度(LeetCode)
  • SpringMVC
  • 二、开发环境和第一个OpenTK程序
  • Mininet应用实践
  • RedisTempate序列化的json字符串,如何反序列化
  • 【SpringBoot】SpringBoot中的异常处理和异常跳转页面
  • 【Python爬虫】技术深度探索与实践
  • C#学习总结
  • SQL基础——MySQL的索引
  • 这是啥设计模式-组合模式