﻿功能:采用进化差分算法进行多元非线性拟合

格式:
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,Zoon,MaxA,MinA)
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,Zoon,MaxA)
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,Zoon)
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0)
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0,NBird,LoopSum)
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0,NBird)
[an,error]=nlinFitDE(f,Aname,Xname,Y,X,a0)
[an,error]=nlinFitDE(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
Zoon:放大系数,默认为2
MaxA:矩阵变量,如果Aname有n个变量,则MaxA也包含n个数据,每个数据对应Aname里的各个变量,此值表示拟合参数的上限值.如果此值为常数,则各个拟合变量的上限值均为此值.默认为10000
MinA:矩阵变量,如果Aname有n个变量,则MinA也包含n个数据,每个数据对应Aname里的各个变量,此值表示拟合参数的下限值.如果此值为常数,则各个拟合变量的下限值均为此值.默认为-10000

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

例子:

//已知有如下一组数据,其中数据表达式满足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]=nlinFitDE(f,xn,zn,b,z)//回车后得到如下结果
an =
[ 4.99999999615097    4.00000000082835    1.00000000002484    7.99999999913377 ]
er =
[ 3.2507621350E-17 ]