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#窗体全屏功能实例代码

    下面我会给出详细的“C#窗体全屏功能实例代码”的攻略,包含以下几个部分: 代码片段:让窗体全屏的代码片段; 代码注释:对代码片段中的代码进行详细的注释说明; 应用示例:利用代码片段实现窗体全屏的两个示例; 常见问题及解决方案:列出常见问题以及相应的解决方案。 1. 代码片段 下面是使窗体全屏的代码片段: // 窗体全屏 this.WindowState = …

    C# 2023年5月31日
    00
  • python接口自动化(十六)–参数关联接口后传(详解)

    Python接口自动化–参数关联接口后传 在接口自动化测试中,有时需要在一个接口的返回结果中提取某些参数,并将这些参数传递给后续的接口。这个过程称为参数关联。本攻略将介绍如何在 Python 接口自动化测试中实现参数关联接口后传。 参数关联 参数关联是指在一个接口的返回结果中提取某些参数,并将这些参数传递给后续的接口。参数关联通常用于测试场景中,例如登录接…

    C# 2023年5月17日
    00
  • C# 键值对数据排序代码

    下面我为大家详细讲解 “C# 键值对数据排序代码”的完整攻略: 1. Sort方法的基本使用 C#中的Dictionary是一个非泛型的键/值对集合,它使用哈希表来实现。由于哈希表的一个重要特性是元素的顺序无法保证,因此在某些情况下,我们可能需要像对List< T>那样对Dictionary进行排序。 Dictionary没有提供Sort或Sor…

    C# 2023年6月8日
    00
  • C#中获取文件大小问题

    C#中获取文件大小是一项比较基础的操作,可以通过 System.IO 命名空间下的 FileInfo 类来实现。下面是具体的操作步骤: 引入命名空间 首先,需要在代码文件中引入 System.IO 命名空间,可以使用以下代码: using System.IO; 实例化 FileInfo 对象 在 FileInfo 类中,有一个 Length 属性可以获取文件…

    C# 2023年5月14日
    00
  • C#将配置文件appsetting中的值转换为动态对象调用

    将配置文件appsettings中的值转换为动态对象调用,可以使用C#中的Configuration API和ExpandoObject类。 以下是具体实现步骤: 1、添加配置文件 在项目的根目录下,添加一个名为appsettings.json的文件,用于存储应用程序的配置信息: { "AppSettings": { "MyKe…

    C# 2023年5月31日
    00
  • C# AutoMapper 使用方法总结

    C# AutoMapper 使用方法总结 什么是AutoMapper AutoMapper 是一个能够自动将对象中属性映射到另一个对象的属性的开源库。 例如,你可能有一个 Domain 对象,这个对象拥有很多属性。而在你的应用程序的某些位置,你需要传递该对象到 MVC 模型或表示图形,而这个位置需要该 Domain 对象中仅一部分属性。AutoMapper …

    C# 2023年6月3日
    00
  • C#中foreach原理以及模拟的实现

    C#中foreach原理以及模拟的实现 foreach是C#中常用的循环结构之一,也是一种高效而方便的迭代方式。本文将详细讲解foreach的原理以及如何模拟其行为。 foreach的原理 foreach循环类似于for循环,但是更加简洁明了,其语法如下: foreach (var item in collection) { // 处理item } 其中co…

    C# 2023年6月6日
    00
  • ASP.NET 2.0中的数据操作之八:使用两个DropDownList过滤的主/从报表

    下面我将详细讲解“ASP.NET 2.0中的数据操作之八:使用两个DropDownList过滤的主/从报表”攻略: 简介 在ASP.NET 2.0中,使用两个DropDownList过滤的主/从报表非常常见。这种形式的报表,允许用户通过选择主报表中的某个选项,从而动态变更从报表中的数据。本文将介绍如何使用两个DropDownList来过滤和呈现报表数据。 步…

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