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#批量抓取免费代理并且验证有效性的实战教程 代理服务器可以帮助我们解决一些访问问题,如境外IP访问等。但是,免费代理服务器资源不稳定,稳定的需要付费购买。本教程主要介绍如何使用C#语言进行批量抓取免费代理,并且验证代理有效性。 1. 获取免费代理网站 在开始之前,需要选择一个可靠的免费代理网站。以西刺代理网站为例,网址为:https://www.xicid…

    C# 2023年5月15日
    00
  • ASP.NET CORE读取json格式配置文件

    ASP.NET Core 读取 JSON 格式配置文件的流程: 在 appsettings.json 文件中定义所需的配置项。 在 Program.cs 文件中使用 CreateDefaultBuilder(args) 方法创建 IHostBuilder 对象,并在 ConfigureAppConfiguration(…) 方法中添加读取配置文件的功能。…

    C# 2023年6月3日
    00
  • FileShare枚举的使用小结(文件读写锁)

    下面是关于FileShare枚举的使用小结(文件读写锁)的完整攻略: 1. FileShare枚举概述 FileShare枚举用于指定在打开文件时是否允许其他进程对该文件的访问。例如,当一个进程尝试打开一个文件时,如果该文件被另一个进程独占打开,则会发生访问冲突。 FileShare枚举提供了一种更细粒度的文件读写锁,可以根据不同的需求指定不同的文件访问权限…

    C# 2023年5月14日
    00
  • .NET 实现 JWT 登录验证

    .NET 实现JWT登录认证 在ASP.NET Core应用程序中,使用JWT进行身份验证和授权已成为一种流行的方式。JWT是一种安全的方式,用于在客户端和服务器之间传输用户信息。 添加NuGet包 首先,我们需要添加一些NuGet包来支持JWT身份验证。在您的ASP.NET Core项目中,打开Startup.cs文件,并在ConfigureService…

    C# 2023年4月17日
    00
  • .NET Core简单读取json配置文件

    .NET Core简单读取json配置文件 在.NET Core应用程序中,我们可以使用json配置文件来存储应用程序的配置信息。本攻略将详细介绍如何在.NET Core中读取json配置文件。 创建json配置文件 首先,我们需要创建一个json配置文件。我们可以使用以下代码来创建一个名为appsettings.json的json配置文件: { &quot…

    C# 2023年5月17日
    00
  • ASP.NET Core按用户等级授权的方法

    以下是关于“ASP.NET Core 按用户等级授权的方法”的完整攻略: 1. ASP.NET Core 授权 ASP.NET Core 授权是一种用于限用户访问应用程序中某些资源的机制。通过授权,我们限制用户访问某些页面、API 或其他资源,以保护应用的安全性和完整性。 2. ASP.NET Core 按等级授权 ASP.NET Core 按用户等级授权是…

    C# 2023年5月12日
    00
  • ASP.NET网站导航及导航控件如何使用

    ASP.NET网站导航及导航控件是用于管理网站导航的重要控件。它可以帮助开发人员快速创建并维护网站导航。此处我将为您提供一份完整攻略,帮助您理解ASP.NET网站导航及导航控件的具体使用方法。 1. 引用导航控件 在ASP.NET网站中,使用导航控件需要在页面中添加导航控件。您可以通过在Web.config文件的配置节点中指定导航控件的信息,或通过标记的方式…

    C# 2023年5月31日
    00
  • c# 引用类型构造器

    当我们创建一个引用类型的实例时,我们需要使用构造器(Constructor),构造器的主要作用是对对象进行初始化操作。C#中的构造器有以下特点: 构造器的名称与类名相同 构造器没有返回类型,也不能引用(可通过out/ref实现对引用类型的引用) 构造器可以有一个或多个参数,用于向对象中传入数据 构造器可以重载,以允许需要不同参数的类型实例化 下面我们将学习C…

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