循迹算法算法.docx
1路径识别算法1. 1抛物插值法拉格朗日插值多项式:yk当 n=2 时,0,j物插x , x0代入拉格朗日插值多项式可得抛物线方程, 对抛物线方程求导数,令导数等于零,xix0 h, xg可得:h y02。就是所要得到的车模偏离跑道中心的距离。1. 2最小二乘法Xix.ixi 2为保持精度已知xi n%”令m=4,选择函数类型x.inx.in ix.12 nxc,上上式可写成:a0aian4x.ixx.ixi2xxi 2xi3x234x0xixix0是偏移量,2控制算法2. 1数字PID控制2. 1. 1 PID控制规律:= Kph, x2x02 h, x;把上述式子的解代入化简得:ii Y。I0 y3 yiyiy4y4知)+ 普比例环节。跟随性好,能即时成比例地反映控制系统的偏差信号e(t), Kp增大,系统动作 灵敏。在系统稳定的情况下,增大Kp,有利于减小稳态误差,提高系统控制精度,但随着 Kp过大时,系统趋于不稳定。积分环节。由上式知,它是对误差e(t)进行积分,用于消除静差,提高系统的无差度。Ti过 小,积分作用强,系统将不稳定,振荡次数增多;Ti过大,积分作用小,影响控制精度。微分环节。反映偏差信号的变化速率,并能在偏差信号值变得太大之前,在系统中引入一个 有效的早期修正信号,从而加快系统的动作速度。对于滞后时间长的系统应增大微分的作用。2. 1. 2流程图增量式PID算法流程图#include<stdio.h>#include<math.h>main()float a,b,c,u=1,u1;int i;float e0,e1,e2,v;printf("input v:");/*程序中所用的输入输出函数都只是用于调试*/scanf("%f”,&v);a=1.01;b=0;c=0.01;e1=e2=0;e0=v;for(i=0;i<=20;i+)u1=a*e0+b*e1+c*e2;u=u+u1;e2=e1;e1=e0;printf("u=%-10f”,u);printf("i=%-10dn”,i);u=3*u+7;e0=v-u;A显然,PID的参数是非常难以确定的(当模型是不精确的时候)。积分分离PID算法2. 1. 3 PID参数的整定:(常用方法)1.扩充临界比例度法;2. 扩充响应曲线法;3. 归一参数整定法;利用人工智能方法将人工整定PID参数的调整经验作为知识和推理规则存入计算机系统中, 从而自动实现对PID参数的最佳调整。PID控制参数的自动整定:1. 初始确定PID控制参数;2. 在初定的PID控制参数上,根据系统的响应过程和控制目标期望值,自动修正初定的PID 参数,直至系统的控制指标符合要求。2. 2模糊控制2. 2. 1模糊化模糊化的主要功能是根据输入变量的隶属度函数,求出精确的输入值相对于输入变量各语言 值的隶属度。简单地说,模糊化过程就是在隶属度图形中,已知X轴值求Y轴值的过程。 最后得到一个集合,将它作为推理机的输入。其中,重要的一点是如何去确定隶属度函数。 通常有以下几种方法:(1) Delphii法;(2)模糊统计法;(3)增量法;(4)因素加权法。2.2.2 模糊规则推理模糊规则推理是模糊控制器的核心,它的输入输出都是模糊量。模糊化后得到的集合作为输 入,输出量是输出变量各语言值的隶属度。完成这一步骤的必要条件是确定输出模糊变量的 隶属度函数及建立模糊规则库。通常把规则库做成表格的形式。模糊推理的方法有多种,常用的MAXMIN法:(1)由于规则前件间用AND操作符连接,因此,每一条规则的强度等于前件中的最小 值。这个值就是此规则的强度。(2)没有相同后件的规则强度就是由(1)所得到的强度;当有相同后件时,模糊输出取 其最大值。2. 2. 3反模糊化模糊规则推理的输出是集合,必需经反模糊化,将模糊的控制量变为精确的控制量。常用方 法:最大隶属度法,重心法(加权平均法)。其中重心法能较多地反映有效信息。2. 2. 4模糊规则推理的数学理论当输入是在某一范围内时,可把它离散化(输入将被压缩或扩大),并将输入输出隶属度函数制成表格的形式(矩阵)。如果推理规则的形式是If A and B then U ,推理过程:(1)。笛卡尔积求模糊矩阵D=AxB;(2) 。将 D 改写为 D'=d11,d12,d1n,d21,d22,.dnm;(3)。求关系矩阵R=D'xC;若模糊化后得E,则输出的模糊量是E0C;如果论域较大,按这种形式编程,计算量将非常巨大。当硬件不高档时,实用性不强。所以 要预先计算出控制表,以此减少计算量。由于输入输出都经过了离散化,控制较生硬。#include<stdio.h>int R35=60,60,60,60,20,40,40,40,20,20,20,20;struct ttfloat t;float u;main()int i,j,p=0;float a=0.0,b=0.0;float r35;float xt5;float xm3;struct tt T4;float G=0.0,x1,x2;for(i=0;i<3;i+)for(j=0;j<5;j+)rij=0;for(i=0;i<5;i+)xti=0;for(i=0;i<3;i+)xm1=0;for(i=0;i<5;i+)Ti.u=0;Ti,t=0;printf("input temperature (0-120): scanf("%f”,&x1);printf("input moisture (0-100): scanf("%f”,&x2);printf("n");!);/*程序中所用的输入输出函数都只是用于调试*/");Fuzzy-Temperature.*/if(x1>=0.0&&x1<=35.0)/*xt0=1.0;if(x1>=35.0&&x1<=47.0)xt0=-1.0/12*(x1-47);if(x1>=40.0&&x1<=55.0) xt1=1.0/15*(x1-40);if(x1>=55.0&&x1<=70.0)xt1=-1.0/15*(x1-70);if(x1>=60.0&&x1<=72.0)xt =1.0/12*(x1-60);if(x1>=72.0&&x1<=84.0)xt=-1.0/12*(x1-84);if(x1>=75.0&&x1<=87.0)xt3=1.0/12*(x1-75);if(x1>=87.0&&x1<=99.0)xt3=-1.0/12*(x1-99);if(x1>=90.0&&x1<=102.0)xt4=1.0/12*(x1-90);else if(x1>=102.0) xt4=1.0;for(i=0;i<5;i+)printf("%-10f”,xti);printf("n");printf("n");if(x2>0.0&&x2<=9.0)/*Fuzzy-Moisture*/xm0=1.0; if(x2>=9.0&&x2<=18.0) xm0=-1.0/9*(x2-18); if(x2>=10.0&&x2<=16.0) xm1=1.0/7*(x2-10); if(x2>=18.0&&x2<=26.0) xm1=1.0; if(x2>=26.0&&x2<=30.0) xm1=-1.0/4*(x2-30); if(x2>=26.0&&x2<=40.0) xm=1.0/14*(x2-26); else if(x2>=40.0) xm2 =1.0;for(i=0;i<3;i+)printf("%-10f",xmi);printf("n");printf("n");for(i=0;i<=2;i+)/*MAX-MIN*/if(xmi!=0)for(j=0;j<=4;j+)if(xtj>=xmi)rij=xmi;elserij=xtj;for(i=0;i<3;i+)for(j=0;j<5;j+) printf("%-10f",rij); printf("n");printf("n");for(i=0;i<=2;i+)for(j=0;j<=4;j+) if(rij!=0) Tp.u=rij;Tp.t=Rij; p+;for(i=0;i<4;i+)printf("%-10f",Ti.u);printf("%-10f",Ti.t); printf("n");for(i=0;i<4;i+)if(Ti.u!=0)for(j=0;j<4;j+)if(Tj.t=Ti.t&&Tj.u>Ti.u)Ti,u=0;for(i=0;i<4;i+)printf("%-10f",Ti.u);printf("%-10f",Ti.t);for(i=0;i<4;i+)/*DeFuzzy-interface*/ a=a+Ti.u*Ti.t; b=b+Ti.u; G=a/b; printf("G=%-10fn”,G); A 用函数的方式进行模糊化,能得到连续的量,因此,输出也是连续的。缺点是计算量较大。2. 3基于单神经元的PID控制 #include<stdio.h> #include<math.h> main() int i=0;float k=0.8,ki=0.001,kd=0.00002,kp=3;float u=0,u0=0,e1=0,e0=0,e2;float p;float x1,x2,x3,A;float w1=0.01,w2=0.02,w3=0.01;printf("input P :");/*程序中所用的输入输出函数都只是用于调试*/scanf("%f”,&p);e2=p-u;while(fabs(e2)>=0.01) x1=e2; x2=e2-e1;x3=e2-2*e1+e0;A=fabs(w1+w2+w3);u=u0+k/A*(w1*x1+w2*x2+w3*x3);w1=w1+ki*x1*u*x1; w2=w2+kp*x1*u*x2; w3=w3+kd*x1*u*x3; u0=u; e0=e1; e1=e2;e2=p-u; i+;if(i<=20) printf("u=%-18f”,u);printf("e2=%-18f”,e2);printf("i=%dn”,i);A运行此程序,发现这种算法收敛速度很慢(当K,Kp,Kd,Ki,w1,w2,w3的取值不十分理想时, 其中w1,w2,w3常常是随机数),与传统PID相似,这些参数是很难确定的。由于学习时间 过长,不适合在时变的干扰较大的实时系统中直接使用。2. 4 BP神经网络