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

格式:
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1,c2,X2,LoopN,Error0,NBird,Randn)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1,c2,X2,LoopN,Error0,NBird)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1,c2,X2,LoopN,Error0)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1,c2,X2,LoopN)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1,c2,X2)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1,c2)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min,c1)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max,w_Min)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min,w_Max)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max,v_min)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0,v_Max)
[an,error]=nlinFitPSO2(f,x,a,b0,a0,x0)
[an,error]=nlinFitPSO2(f,x,a,b0,a0)

f:符号变量存储的符号表达式,每个表达式表示非线性方程组的非0项,每个表达式之间以逗号分隔
x:符号变量存储的需要拟合的变量名称,每个名称间以逗号分隔
a:符号变量存储的已知数据点的变量名称,每个名称以逗号分隔
b0:等式对应的数据,这个变量为矩阵变量
a0:对应a的已经数据的矩阵变量,如果bo是1*m的矩阵,那么a0就必须是n*m的矩阵,其中n为a中变量的个数;如果b0为m*1的矩阵,那么a0就应该是m*n的矩阵
x0:对应x变量的初始值.如果x0为符号变量,则每个初始值以逗号分隔;如果为矩阵变量,则矩阵变量个数必须与x变量一致;如果x0为一个数据,则x变量每个值初始化同一个值。系统默认在0到100内为x0随机赋值。
v_Max:最大速度变量,默认为10
v_min:最小速度变量,默认-10
w_Max:最大速度权重系数,默认为1
w_Min:最小权重系数,默认为0.4
c1:个体加速系数,默认为2,最好在0与4之间取值
c2:整体加速系数,默认为2,最好在0与4之间取值
X2:速度压缩因子,当此值为非正数或者默认情况下X2=2/|2-(c1+c2)-((c1+c2)*(c1+c2-4)^0.5|,c1+c2>4;X2=1,c1+c2≤4
LoopN:最大迭代次数,默认为3000
Error0:控制的残差平方和,默认为1E-14
NBird:粒子数,默认为200
Randn:每次迭代时产生随机数函数的种子,系统默认随机设置

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

原理:本函数计算采用{nlinSolvePSO2<矩阵运算\nlinSolvePSO2>}函数进行求解.本算法虽然属于全局最优算法,但是一些原因,不能保证计算的结果一定收敛到最佳值!在实际计算的时候,为了防止局部收敛,可以尝试将v_Max的值调大

例子:

//已知有如下一组数据,其中数据表达式满足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]=nlinFitPSO2(f,xn,zn,b,z)//回车得到如下结果
an =
[ 5.00000006889797    3.99999998651866    0.99999999823252    8.00000000941127 ]
er =
[  8.2701222876E-15 ]