c# 实现模糊PID控制算法

c# 实现模糊PID控制算法攻略

什么是PID控制?

PID控制是指通过对被控对象给出适当的控制量来使被控对象的输出接近于所要求的期望输出,并且能够根据被控对象给出的反馈信息来调整控制量,从而提高控制的精度。PID控制算法包含三个部分,分别是比例控制、积分控制、微分控制。

什么是模糊PID控制?

对于一些非线性或者模糊的系统,传统PID控制算法无法处理。此时可以使用模糊PID控制算法,它利用模糊推理方法来实现对模糊系统的控制。

c#实现模糊PID控制的步骤

为了实现模糊PID控制,需要对算法进行如下几步操作:

  1. 首先需要对模糊PID控制的变量进行模糊化。这一过程可以使用模糊逻辑运算符,将变量转换为模糊集。
  2. 接下来需要对输入和输出进行模糊化和反模糊化。这一过程可以使用模糊推理来实现。
  3. 在完成前两步操作后,我们就可以利用PID控制算法进行计算。针对每个控制信号,我们需要计算其比例、积分和微分部分,并将三部分结果加起来得到最终的控制信号。

c#代码示例

模糊PID控制是一种比较复杂的算法, c#代码示例如下:

  1. 首先需要定义输入变量、输出变量以及模糊集。
FuzzySet fsE = new FuzzySet("Error");
FuzzySet fsEC = new FuzzySet("EC");
FuzzySet fsECC = new FuzzySet("ECC");
FuzzySet fsCE = new FuzzySet("CE");
FuzzySet fsCCC = new FuzzySet("CCC");
FuzzySet fsC = new FuzzySet("C");

// 定义输出变量
FuzzySet[] fsZ = new FuzzySet[5];
fsZ[0] = new FuzzySet("VL");
fsZ[1] = new FuzzySet("L");
fsZ[2] = new FuzzySet("M");
fsZ[3] = new FuzzySet("H");
fsZ[4] = new FuzzySet("VH");
MembershipFunction mf = new MembershipFunction();
  1. 完成模糊化
fsE.Add(new FuzzySets.TriangularFuzzySet(-10, -10, 0));
fsE.Add(new FuzzySets.TriangularFuzzySet(-10, 0, 10));
fsE.Add(new FuzzySets.TriangularFuzzySet(0, 10, 10));

fsEC.Add(new FuzzySets.TriangularFuzzySet(-10, -10, 0));
fsEC.Add(new FuzzySets.TriangularFuzzySet(-10, 0, 10));
fsEC.Add(new FuzzySets.TriangularFuzzySet(0, 10, 10));

fsECC.Add(new FuzzySets.TriangularFuzzySet(-20, -20, 0));
fsECC.Add(new FuzzySets.TriangularFuzzySet(-20, 0, 20));
fsECC.Add(new FuzzySets.TriangularFuzzySet(0, 20, 20));

fsCE.Add(new FuzzySets.TriangularFuzzySet(-10, -10, 0));
fsCE.Add(new FuzzySets.TriangularFuzzySet(-10, 0, 10));
fsCE.Add(new FuzzySets.TriangularFuzzySet(0, 10, 10));

fsCCC.Add(new FuzzySets.TriangularFuzzySet(-20, -20, 0));
fsCCC.Add(new FuzzySets.TriangularFuzzySet(-20, 0, 20));
fsCCC.Add(new FuzzySets.TriangularFuzzySet(0, 20, 20));

// 模糊集映射
foreach (FuzzyElement fe in fsE)
{
    mf.Add(fe, fsE.Evaluate(fe));
}

// 模糊推理
InferenceEngine ie = new InferenceEngine();
ie.AddRule(new FuzzyRule(new FuzzyElement[]
{
new FuzzyElement(FuzzyElement.Parse("Error is L")),
new FuzzyElement(FuzzyElement.Parse("EC is L"))
}, 
new FuzzyElement(FuzzyElement.Parse("C is L"))));
  1. 实现模糊PID控制
double u, e = 0, ec, ecc, ce, ccc;
double up, ui, ud, sum;

// 输入信号
double[] input = new double[] { 0, 5, 10, 20, 30 };
// 输出信号
double[] output = new double[] { 0, 2, 4, 8, 10 };

// 控制信号
double[] z_output = new double[] { -2, -1, 0, 1, 2 };
// 初始化模糊控制器
FSController fsc = new FSController(input, output, z_output);

for (int i = 0; i < 100; i++)
{
    // 计算误差
    e = 10 - u;

    // 计算EC, ECC, CE, CCC
    ec = ie.Evaluate(new FuzzyElement[] { new FuzzyElement(FuzzyElement.Parse(string.Format("Error is {0}", fsc.InputToFS(e, fsE, mf)))) });
    ecc = ie.Evaluate(new FuzzyElement[] { new FuzzyElement(FuzzyElement.Parse(string.Format("Error is {0}", fsc.InputToFS(e, fsECC, mf))),
                                            new FuzzyElement(FuzzyElement.Parse(string.Format("EC is {0}", fsc.InputToFS(ec, fsEC, mf)))) });
    ce = ie.Evaluate(new FuzzyElement[] { new FuzzyElement(FuzzyElement.Parse(string.Format("EC is {0}", fsc.InputToFS(ec, fsEC, mf)))),
                                            new FuzzyElement(FuzzyElement.Parse(string.Format("ECC is {0}", fsc.InputToFS(ecc, fsECC, mf)))) });
    ccc = ie.Evaluate(new FuzzyElement[] { new FuzzyElement(FuzzyElement.Parse(string.Format("EC is {0}", fsc.InputToFS(ec, fsEC, mf)))),
                                            new FuzzyElement(FuzzyElement.Parse(string.Format("ECC is {0}", fsc.InputToFS(ecc, fsECC, mf)))),
                                            new FuzzyElement(FuzzyElement.Parse(string.Format("CE is {0}", fsc.InputToFS(ce, fsCE, mf)))) });

    // 计算比例部分
    up = z_output[(int)fsc.OutputFromFS(ce, fsCCC, mf)] * e;
    // 计算积分部分
    ui = 0.01 * z_output[(int)fsc.OutputFromFS(ccc, fsCCC, mf)] * e;
    // 计算微分部分
    ud = 0.01 * z_output[(int)fsc.OutputFromFS(ec, fsCCC, mf)] * (e - fsc.LastError);

    // 计算控制信号
    sum = up + ui + ud;
    if (sum > 10) sum = 10;
    if (sum < -10) sum = -10;
    u = sum;
}

总结

以上就是采用c#实现模糊PID控制算法的步骤和c#代码示例,模糊PID控制算法适用于非线性或者模糊系统的控制,能够实现更加精准的控制效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 实现模糊PID控制算法 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C# 利用Selenium实现浏览器自动化操作的示例代码

    下面是“C#利用Selenium实现浏览器自动化操作”的完整攻略和两个示例代码。 概述 Selenium是一个开源的自动化测试工具,它可以模拟用户在网站上的各种交互操作,比如输入文字、点击链接、提交表单等。Selenium主要有三个组件:Selenium WebDriver、Selenium IDE和Selenium Grid。其中,Selenium Web…

    C# 2023年5月15日
    00
  • C#生成带注释的dll并引用实现

    生成带注释的dll并引用实现的完整攻略如下: 1. 创建Class Library项目 首先,我们需要在Visual Studio中创建一个Class Library项目,命名为”MyLibrary”(或其他你希望名字)。 2. 编写代码并添加注释 编写一个简单的类,并为类、属性和方法添加注释。代码如下: /// <summary> /// My…

    C# 2023年6月7日
    00
  • springboot2.2 集成 activity6实现请假流程(示例详解)

    springboot2.2集成activity6实现请假流程是一个比较复杂的操作,需要经过以下步骤: 1. 搭建springboot项目环境 首先,我们需要搭建一个基于springboot的项目环境,可以使用如下命令生成一个新项目: $ spring init demo –dependencies=web 其中,–dependencies=web 表示我…

    C# 2023年6月6日
    00
  • C#中dotnetcharting的用法实例详解

    C#中dotnetcharting的用法实例详解 简介 DotNetCharting 是基于 .NET 平台的一个强大的图表绘制组件。它可以帮助开发人员快速地在自己的 Web 应用程序中添加各种类型的图表,如 2D 和 3D 图表、仪表盘、实时图表和地图。DotNetCharting 对于那些需要快速建立强大图表的开发人员来说,是一个非常有用的工具。 安装 …

    C# 2023年6月1日
    00
  • 基于SqlSugar的开发框架循序渐进介绍(28)– 快速构建系统参数管理界面

    在参照一些行业系统软件的时候,发现一个做的挺不错的系统功能-系统参数管理,相当于把任何一个基础的系统参数碎片化进行管理,每次可以读取一个值进行管理,这样有利于我们快速的处理业务需求,是一个挺好的功能。本篇随笔模拟这个功能,基于SqlSugar开发框架的基础上,利用代码生成工具快速生成系统参数管理界面和相关的业务类生成。 1、参考和具体实现的效果对比 参照的界…

    C# 2023年4月27日
    00
  • C#开发之int与string转化操作

    让我详细讲解一下“C#开发之int与string转化操作”的完整攻略。 1. 将int类型转为string类型 要将int类型转为string类型,我们可以使用ToString()方法,将整数转为字符串,具体示例如下: int num = 123; string str = num.ToString(); Console.WriteLine(str); //…

    C# 2023年6月8日
    00
  • .NET Core中使用Redis与Memcached的序列化问题详析

    .NET Core 中使用 Redis 与 Memcached 的序列化问题详析 在 .NET Core 中,Redis 和 Memcached 是两个非常流行的缓存解决方案。在使用 Redis 和 Memcached 时,序列化是一个非常重要的问题。本攻略将详细介绍在 .NET Core 中使用 Redis 和 Memcached 时的序列化问题,并提供多…

    C# 2023年5月17日
    00
  • C#控制台程序使用Log4net日志组件详解

    C#控制台程序使用Log4net日志组件详解 Log4net是一个用于记录日志的流行的开源框架,它可以帮助开发者方便地记录应用程序的运行日志,并且支持在运行时动态地控制日志等级和输出目标。本篇攻略将从以下几个方面详细讲解如何在C#控制台程序中使用Log4net日志组件: 安装Log4net并添加配置文件 创建Logger对象 记录日志信息 控制日志等级和输出…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部