c# 实现模糊PID控制算法攻略
什么是PID控制?
PID控制是指通过对被控对象给出适当的控制量来使被控对象的输出接近于所要求的期望输出,并且能够根据被控对象给出的反馈信息来调整控制量,从而提高控制的精度。PID控制算法包含三个部分,分别是比例控制、积分控制、微分控制。
什么是模糊PID控制?
对于一些非线性或者模糊的系统,传统PID控制算法无法处理。此时可以使用模糊PID控制算法,它利用模糊推理方法来实现对模糊系统的控制。
c#实现模糊PID控制的步骤
为了实现模糊PID控制,需要对算法进行如下几步操作:
- 首先需要对模糊PID控制的变量进行模糊化。这一过程可以使用模糊逻辑运算符,将变量转换为模糊集。
- 接下来需要对输入和输出进行模糊化和反模糊化。这一过程可以使用模糊推理来实现。
- 在完成前两步操作后,我们就可以利用PID控制算法进行计算。针对每个控制信号,我们需要计算其比例、积分和微分部分,并将三部分结果加起来得到最终的控制信号。
c#代码示例
模糊PID控制是一种比较复杂的算法, c#代码示例如下:
- 首先需要定义输入变量、输出变量以及模糊集。
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();
- 完成模糊化
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"))));
- 实现模糊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技术站