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日

相关文章

  • ASP.NET通用权限验证的实现代码思路

    ASP.NET通用权限验证的实现代码思路 在ASP.NET网站开发中,我们经常需要实现用户权限验证。本文将介绍一种通用的权限验证实现方法,包括具体的代码实现思路以及示例说明。 思路 通用权限验证实现的基本思路是,在每个需要验证权限的页面,判断当前用户是否具有相应的权限,如果没有,则跳转到权限不足页面。具体实现步骤如下: 配置Web.config 在Web.c…

    C# 2023年5月31日
    00
  • 使用VS2022在ASP.NET Core中构建轻量级服务

    下面是使用VS2022在ASP.NET Core中构建轻量级服务的完整攻略: 简介 ASP.NET Core是一个跨平台的开源框架,它提供了构建 Web 应用程序和服务的工具和框架。本攻略将带你使用VS2022在ASP.NET Core中构建轻量级服务。 步骤一:创建 ASP.NET Core 项目 打开 Visual Studio 2022,选择“创建新项…

    C# 2023年6月3日
    00
  • Json.Net6.0用法介绍

    Json.Net6.0用法介绍 简介 Json.Net是一个开源的、高性能的Json框架,支持将Json与.Net对象相互转换。本篇攻略将讲述Json.Net6.0的用法介绍。 安装 可以通过NuGet进行安装,或者从官网下载最新的安装程序。 在Visual Studio中可以通过NuGet控制台输入以下命令进行安装: Install-Package New…

    C# 2023年5月31日
    00
  • .net后台代码调用前台JS的两种方式

    你可以按照以下步骤来进行。 步骤一:引入前端JS文件 在实现后台调用前台JS的功能之前,首先需要在HTML页面引入JS文件。我们可以使用以下代码引入JS文件: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo…

    C# 2023年5月31日
    00
  • asp.net得到本机数据库实例的两种方法代码

    下面我将详细讲解如何在ASP.NET中得到本机数据库实例的两种方法代码。 方法一:使用LocalDB连接数据库 1. 安装LocalDB 首先,我们需要在本机安装LocalDB。可以在微软的官方网站上下载并安装:https://www.microsoft.com/en-us/sql-server/sql-server-downloads 2. 创建数据库 安…

    C# 2023年5月31日
    00
  • C#泛型类型知识讲解

    C#泛型类型是一种高效、强类型和可重用的代码编写方式,其中泛型类型参数可以在运行时指定,达到代码重用和类型安全的目的。 常见的泛型类型 C#泛型类型中常见的有以下几种: 泛型类:在类定义时使用泛型类型参数,可以在运行时指定具体类型,使得类具有高复用性和通用性。 示例代码: public class GenericClass<T> { privat…

    C# 2023年6月7日
    00
  • C# 创建Excel气泡图的实例代码

    下面是详细的讲解。 1.前言 在使用软件的过程中,Excel无疑是一个非常常用的工具。其中,Excel中的图表功能可以让我们在数据分析的时候更加直观。 很多时候,我们需要通过程序生成Excel中的图表。本篇文章,将介绍如何使用C#代码创建Excel中的气泡图。 2.实现思路 气泡图是一种比较常用的图表形式,通过圆形的大小和位置表现数据,非常能够清晰地展示各个…

    C# 2023年6月3日
    00
  • C#自定义签名章实现方法

    C#自定义签名章实现方法 在C#中,自定义签名章可以用于电子文档的签名或者证明身份等,下面将讲解如何实现C#自定义签名章。 步骤一:创建嵌入资源文件夹 首先需要创建一个嵌入资源文件夹,用于存放自定义签名章的相关图片和字体文件等。创建方式如下: 右键点击项目名称,选择“添加” > “新建文件夹”; 输入文件夹名称,例如“Resources”; 右键点击新…

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