﻿功能:采用遗传算法拟合非线性表达式

格式:
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw,xMax,xMin,N,LoopN,Error0,Rand)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw,xMax,xMin,N,LoopN,Error0)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw,xMax,xMin,N,LoopN)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw,xMax,xMin,N)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw,xMax,xMin)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw,xMax)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d,dw)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0,d)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm,x0)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc,pm)
[an,error]=nlinFitGA(f,x,a,b0,a0,pc)
[an,error]=nlinFitGA(f,x,a,b0,a0)

f:符号变量存储的需要拟合的表达式,其中每个表达式以逗号分隔
x:符号变量存储的需要拟合变量的名称,每个变量以逗号分隔
a:符号变量存储的采集到数据的变量名称,每个名称以逗号分隔
b0:等式对应的数据,这个变量为矩阵变量
a0:对应a的已经数据的矩阵变量,如果bo是1*m的矩阵,那么a0就必须是n*m的矩阵,其中n为a中变量的个数;如果b0为m*1的矩阵,那么a0就应该是m*n的矩阵
pc:交叉概率,默认为0.9
pm:变异概率,默认0.2
x0:对应x变量的初始值,如果x0为矩阵变量,则矩阵变量里的数据依依与x里变量对应；如果x0为一个数据，则每个x变量均初始化此值；如果x0为符号变量，则每个初始值以逗号分隔。程序默认在100以内随机初始化x0
d:每次变异时扰动的最大幅度。d是一个矩阵变量或者符号变量或数据，其中d当中的每一个值对应x里的每一个变量
dw:控制d变化的量，一般取值小于1。其表示扰动幅度d每循环一次，将变成d=d*dw，这样达到扰动幅度可变，可以更好的得到结果。程序默认取值dw=exp(-ln(50)/LoopN)
xMax:一个矩阵变量或者符号变量或数据，其中xMax对应x里的每一个变量，表示x变量的最大值为xMax。程序默认每个变量最大值为10000
xMin:一个矩阵变量或者符号变量或数据，其中xMin对应x里的每一个变量，表示x变量的最小值为xMin。程序默认每个变量最小值为-10000
N:群体大小,默认为200
LoopN:程序最大循环次数,默认为4000
Error0:终止循环的残差条件，默认为1E-15
Rand:初始随机数的种子，默认由系统自动生成

an:返回的拟合系数
error:返回的残差平方和

原理:本函数计算采用{nlinSolveGA<矩阵运算\nlinSolveGA>}函数进行求解.

例子:

//已知有如下一组数据,其中数据表达式满足sin(z(1))*a+b*z(2)+c*z(3)-d+z(4)=0,其中z(1)、z(2)、z(3)、z(4)分别对应z数据的第1、2、3、4列数据,现在要求拟合出最佳系数a、b、c、d

z =
[ 1.00000000000000    0.84147098480789    0.54030230586814   -0.11354116913921
  2.00000000000000    1.81859485365136   -0.83229367309428   -2.98857287563957
  3.00000000000000    0.42336002417960   -2.96997748980134    8.57093735278360
  4.00000000000000   -3.02720998123171   -2.61457448345445    26.5074268849209
  5.00000000000000   -4.79462137331569    1.41831092731613    30.5547959392623
  6.00000000000000   -1.67649298919356    5.76102171990220    10.3420277278667
  7.00000000000000    4.59890619103152    5.27731578040313   -18.9578735381232
  8.00000000000000    7.91486597298705   -1.16400027046891   -27.4422548545962
  9.00000000000000    3.70906636717581   -8.20017235696209   -0.69668553794993
  10.0000000000000   -5.44021110889370   -8.39071529076452    40.8716652807862 ]

b=Zeros(10,1);f="sin(z1)*a+b*z2+c*z3-d+z4";zn="z1,z2,z3,z4";xn="a,b,c,d";
[an,er]=nlinFitGA(f,xn,zn,b,z,0.8,0.2)//回车得到如下结果
an =
[ 5.00000001689877    3.99999999688350    1.00000000061332    8.00000000641862 ]
er =
[ 8.1138291556E-16 ]