关键词 最小二乘法;参数辨识;遗传算法
0 引言
对T-S模糊系统参数辨识的过程大致分为结构辨识和参数辨识,而参数辨识则是整个系统辨识的关键所在。遗传算法以其在解空间内进行高效启发式搜索,寻优速度快,不易陷入局部最优解等优点成为近来应用较多的优化方法。将遗传算法用于解决T-S模糊模型的参数辨识问题,在应用最小二乘法进行粗略辨识的前提下,用遗传算法对结论参数进行寻优,用MATLAB进行仿真,取得了较好的效果。
1 用最小二乘法对T-S模糊模型参数的初步辨识
T-S模糊模型辨识的过程一般分为以下几个阶段:前提结构辨识;前提参数辨识;结论结构辨识;结论参数辨识,直到模型满足要求为止。结构辨识的方法,在此不再详细说明,只对结论参数辨识问题展开讨论。
在确定了前提结构和结论结构之后,对模糊模型的结论参数进行粗略的辨识,以确定遗传算法寻优的范围。在众多的参数辨识方法中,最小二乘法是最基本的一种,Gauss于1795年就用最小二乘法,由观测结果估算了行星的运行轨道。此后,这种方法被广泛应用,并根据实际问题提出了许多改进的最小二乘法,如正交最小二乘法,广义最小二乘法,增广最小二乘法等。这里所用的是线性最小二乘法,将前提结构划分的各个范围中的输入输出数据拟合为一次多项式函数。从而得出粗略的结论参数。以此来大致确定遗传算法要优化的结论参数范围。前提参数的大致范围可根据所选的隶属函数来确定。
为简单起见,考虑一维的单输入非线性系统。对下列函数进行逼近[1]:
设定输入范围为[-1,1],将它模糊分割为五个区,隶属度函数采用广义的钟形函数,这里只有一个输入变量,输出为y = a x + b的线性方程,待优化的结论参数有2×5 = 10个,用MATLAB编程来初步得出待优化的结论参数,主要代码如下:
data_n=100;newdata_n=1001;x=linspace(-1,-0.6,data_n);
y=0.7*sin(pi*x)+0.3*sin(3*pi*x)+0.1*sin(5*pi*x);
polyfit(x,y,1)
由上述方法仿真可得出的10个参数,确定参数范围,如表1中所示:
表1 用最小二乘法估计的参数及优化所选的参数范围
|
参数 |
a1 |
b1 |
a2 |
b2 |
a3 |
b3 |
a4 |
b4 |
a5 |
b5 |
|
估计参数 |
-0.6499 |
-1.0459 |
0.9010 |
0.0518 |
8.3065 |
0.0000 |
0.9010 |
-0.0518 |
-0.6499 |
1.0459 |
|
参数范围 |
[-5,5] |
[-5,5] |
[-5,5] |
[-5,5] |
[-2,15] |
[-5.5, 5.5] |
[-5,5] |
[-5, 5] |
[-5.5, 5.5 ] |
[-1,5 ] |
由于同时优化的参数的数量较多,故采用实数编码的方式对参数进行编码。编码过程是通过计算机产生所要优化的参数范围内的随机数,对每一个参数进行编码后,连接在一起形成一条染色体,然后就可以对它进行遗传操作。用MATLAB编程,确定寻优范围的主要代码如下:
MinX(1)=-5.0*ones(1);
MaxX(1)=5.0*ones(1);
MinX(2)=-5.0*ones(1);
MaxX(2)=5.5*ones(1);
......
MinX(10)=-1*ones(1);
MaxX(10)=5*ones(1);
Kpar(:,1)=MinX(1)+(MaxX(1)-MinX(1))*rand(Size,1);
Kpar(:,2)=MinX(2)+(MaxX(2)-MinX(2))*rand(Size,1);
......
Kpar(:,9)=MinX(9)+(MaxX(9)-MinX(9))*rand(Size,1);
Kpar(:,10)=MinX(10)+(MaxX(10)-MinX(10))*rand (Size,1);
在产生大种群后,对个体进行初步筛选,去掉一些适应度差的个体,剩下的作为初始种群进行遗传操作,这种方法可以使种群在保持多样性的同时,节省计算时间。进化代数的确定,一般是根据问题所要求的精度来确定,精度低,进化的代数就可以少一些,反之则多一些。
适应度函数是衡量个体优劣的指标,为了达到寻优的目标,适应度函数一般是通过目标函数变换而来的,这里对T-S模型的参数进行辨识,采用的目标函数为均方误差:
(1) 其中:t(k)为由辨识的模糊模型计算出的第k个采样时刻的输出值,α(k)为第k 个采样时刻的实际输出值,Q为总的采样次数。
在进行选择操作时,是按照适应度越大,被选择的概率越大,所以,这里选用的适应度函数为:
(2) 其中ε是一个较小的正实数,目的是为了避免除数为零的情况发生[3]。其主要代码如下:
for i=1:1:Size %以下为初始筛选
cansu=Kpar(i,:);
code=cansu;
rmse=computeitae(code);%计算均方误差;
BsJ=rmse;
BsJi(i)=BsJ;%将均误差赋给BsJi
end
fi=1./BsJi;% 求适应度的值
[Oderfi,Indexfi]=sort(fi)%对适应度值由小到大排列
sortrsa=Kpar(Indexfi(Size),:);
for s=2:1:selectsize
shuijirsa=Kpar(Indexfi(Size-s+1),:);
sortrsa=[sortrsa shuijirsa];
end
sortrsa
Kpar=sortrsa
Size=selectsize
遗传操作一般包括选择,交叉和变异。选择方法采用蒙特卡罗法,按比例的适应度分配。若某个个体i ,其适应度为f i , 则其被选择的概率表示为:
(3) 由于在进行遗传操作前,已经对个体进行了初步的筛选,所以为了避免对种群中优良个体的破坏,这里采用单点交叉的方法,随机选择交叉点之后,将两个个体的交叉点后面的基因进行交换。变异采用实值变异的方法,随机选择染色体的某个基因,由于用实数编码的方法,每个基因就是一个要辨识的参数值,所以可以用一个函数实现在参数范围内适当改变该参数值的大小,从而达到保持种群多样性的目的。为了使寻优不过早的收敛到次优解,随着进化代数的增加,需要适当增大变异率,其实现方法只需用一个函数来表示变异率:
pm=0.1 + [1:1:G]×0.1/G (4)
式中:pm表示变异率,G代表进化代数。[1:1:G]表示一个数组,变化的范围为[1,G],步长为1。为了避免破坏优良个体,变异率不宜取的过大。通过实验得知,在第一代时,可取变异率pm=0.1+1×0.1/G,第二代时,变异率pm=0.1+2×0.1/G,以此类推。这样随着进化代数的增加,pm也随着增加。
另外,为了防止遗传操作对最优个体的破坏,采取保留最优个体的方法。将每一代产生的最优个体放在该种群的最后,再继续进行下一代的操作。整个算法的流程图如图1所示。具体实现的遗传操作的主要代码如下:
G=300;%进化的代数
BsJ=0;
for kg=1:1:G
time(kg)=kg;
%*******step 1:计算误差****************
for i=1:1:Size
cansu1=Kpar(i,:);
selectcode=cansu1;
error=computeitae(selectcode);%计算均方误差;
BsJ1=error;
BsJi1(i)=BsJ1;
end
[OderJi,IndexJi]=sort(BsJi1);
BestJ(kg)=OderJi(1);
BJ=BestJ(kg);
Ji=BsJi1+1e-10;%避免除零
fi=1./Ji;% 求适应度的值