﻿功能:采用另一种算法进行多元非线性拟合

格式:
[an,error]=nlinFit2(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,MaxA,MinA)
[an,error]=nlinFit2(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,MaxA)
[an,error]=nlinFit2(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0)
[an,error]=nlinFit2(f,Aname,Xname,Y,X,a0,NBird,LoopSum)
[an,error]=nlinFit2(f,Aname,Xname,Y,X,a0,NBird)
[an,error]=nlinFit2(f,Aname,Xname,Y,X,a0)
[an,error]=nlinFit2(f,Aname,Xname,Y,X)

f:存储拟合的符号表达式
Aname:以符号变量存储的需要拟合的变量名称,每个名称以逗号分隔
Xname:以符号变量存储的实验采集数据的变量名称,每个名称以逗号分隔
Y:矩阵变量,存储实验采集的等式右边的常数项
X:矩阵变量,存储对应Xname名称的数据,如果Y矩阵是m×1,Xname有n个变量,则X矩阵为m×n
a0:矩阵变量,存储Aname初始估计值,程序默认自动获取。如果此值为一个常数,则每个初值均初始化为此值。
NBird:默认种群数,默认为100
LoopSum:程序循环最大次数,默认为3000
Error0:误差控制参数,默认为1E-16
MaxA:矩阵变量,如果Aname有n个变量,则MaxA也包含n个数据,每个数据对应Aname里的各个变量,此值表示拟合参数的上限值.如果此值为常数,则各个拟合变量的上限值均为此值.默认为10000
MinA:矩阵变量,如果Aname有n个变量,则MinA也包含n个数据,每个数据对应Aname里的各个变量,此值表示拟合参数的下限值.如果此值为常数,则各个拟合变量的下限值均为此值.默认为-10000

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

说明:此函数与{nlinFit<矩阵运算\nlinFit>}、{nlinFitPSO<矩阵运算\nlinFitPSO>}、{nlinFitPSO2<矩阵运算\nlinFitPSO2>}函数不同的是,本函数可以设定各个拟合变量的上下限

原理:

1、本函数求解思想是仿遗传算法,但非常规的遗传算法(因为本算法思想是,所有个体均需要且仅需要进行交叉.其实某种意义上来说,交叉和变异是一回事,所以我只选择一种操作本).再者本算法有点类似粒子群算法,但又非粒子群算法.总体思想是,每个个体只保留最好的,所有个体且都向最好的个体看齐.

2、步骤如下:
(1)初始化一个种群,且找出当中最好的一个解
(2)进入循环部分:
A、让种群每个个体均与当前系统中最好的解进行杂交,其杂交采用如下3种算法(r为[0,1]之间的随机数,y0当前系统最好解,x0个体当前解)
2.1、启发式交叉
    x1=x0-(2r-1)*(x0-y0)
2.2、一种可尝试的交叉
    x1=x0*(0.5-r)+y0*(0.5+r)
2.3、算术交叉
    x1=r*x0+(1-r)*y0
B、个体杂交产生的后代如果不优于前代,则上面三种杂交方式均需要杂交一次,如果3种杂交方式进行完毕均未找到优于前代的个体,则下一代直接克隆上一代;否则用杂交出较好的后代继承上一代
C、是否满足终止条件,不满足继续回到步骤A

例子:

//已知有如下一组数据,其中数据表达式满足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]=nlinFit2(f,xn,zn,b,z)//回车后得到如下结果
an =
[ 5.00000000083231    3.99999999937201    0.99999999979372    8.00000000173848 ]
er =
[ 8.4180562062E-17 ]