﻿功能:采用改进的粒子群优化算法进行多元非线性拟合

格式:
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2,w,cx,MaxSpeed,MinSpeed,MaxA,MinA)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2,w,cx,MaxSpeed,MinSpeed,MaxA)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2,w,cx,MaxSpeed,MinSpeed)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2,w,cx,MaxSpeed)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2,w,cx)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2,w)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1,c2)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0,c1)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum,Error0)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird,LoopSum)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0,NBird)
[an,error]=nlinFitPSO3(f,Aname,Xname,Y,X,a0)
[an,error]=nlinFitPSO3(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
c1:速度跟新加速度系数,默认为2,建议取值[0,4]之间
c2:速度跟新加速度系数,默认为2,建议取值[0,4]之间
w:惯性权重,默认为1
cx:压缩因子,默认根据c1、c2的值确定.默认情况下cx=2/|2-(c1+c2)-((2+c2)*(c1+c2-4)^0.5|,c1+c2>4;cx=1,c1+c2≤4
MaxSpeed:矩阵变量,如果Aname有n个变量,则MaxSpeed也包含n个数据,每个数据对应Aname里的各个变量,此值表示计算中速度可以达到的最大值.如果此值为常数,则各个速度的最大值均为此常数.默认为10.
MinSpeed:矩阵变量,如果Aname有n个变量,则MinSpeed也包含n个数据,每个数据对应Aname里的各个变量,此值表示计算中速度可以达到的最小值.如果此值为常数,则各个速度的最小值均为此常数.默认为-10.
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]=nlinFitPSO3(f,xn,zn,b,z)//回车得到如下结果
an =
[ 5.00000000461899    3.99999999901913    0.99999999968835    7.99999999875650  ]
er =
[  9.6752765818E-17 ]