﻿功能:采用多种变异粒子群算法求解非线性方程组

格式:
[ax,error]=nlinSolve2(f,Xname,x0,NBird,LoopSum,Error0,MaxX,MinX)
[ax,error]=nlinSolve2(f,Xname,x0,NBird,LoopSum,Error0,MaxX)
[ax,error]=nlinSolve2(f,Xname,x0,NBird,LoopSum,Error0)
[ax,error]=nlinSolve2(f,Xname,x0,NBird,LoopSum)
[ax,error]=nlinSolve2(f,Xname,x0,NBird)
[ax,error]=nlinSolve2(f,Xname,x0)
[ax,error]=nlinSolve2(f,Xname)

f:符号变量存储的方程组表达式,其中每个表达式以逗号分隔
Xname:符号变量存储的方程组里求解变量的名称,每个变量以逗号分隔
x0:对应Xname变量的初始值,如果x0为矩阵变量,则矩阵变量里的数据依依与Xname里变量对应；如果x0为一个数据，则每个Xname变量均初始化此值；如果x0为符号变量，则每个初始值以逗号分隔。程序默认在100以内随机初始化x0
Nbird:种群数,默认为100
LoopSum:循环最大次数,默认为3000
Error0:误差控制变量,默认1E-16
MaxX:矩阵变量,如果Xname有n个变量,则MaxA也包含n个数据,每个数据对应Xname里的各个变量,此值表示拟合参数的上限值.如果此值为常数,则各个拟合变量的上限值均为此值.默认为10000
MinX:矩阵变量,如果Xname有n个变量,则MinA也包含n个数据,每个数据对应Xname里的各个变量,此值表示拟合参数的下限值.如果此值为常数,则各个拟合变量的下限值均为此值.默认为-10000

ax:返回求得的解
error:返回的残差平方和

原理:

在程序计算时,每个循环进行如下的更新,x0全局最好解,x当前解(注意此x不一定为历史最优解,但是大部分情况下却是历史最优解,这点和一般书上的有所不同),r1,r2,r3为0到1之间的随机数,v为粒子速度. w为系统随着循环次数增加逐渐减小的一个量,其值为1/n，其中n表示当前循环求解次数。d是一个区间伸张的量,其值根据你设置的边界值有关(如果边界超过一定范围,此值程序默认为100)
1、
v=v*r1+2*r2*(x0-x)
x=x+v

2、
v=v*r1+(2-r1)*(x0-x)
如果r1>=0.15,则x=x+v;否则x=x*(0.5+r2)+v

3、
v=v*r1+2*r2*(x0-x)+w*(r3-0.5)*d
x=x+v

4、
v=r1*(v+x0-x)
x=x+v


例子:

/*
求100*((x1^2-x2)^2+(x2^2-x3)^2+(x3^2-x4)^2+(x4^2-x5)^2)+(1-x1)^2+(1-x2)^2+(1-x3)^2+(1-x4)^2取最小值时的x1,x2,x3,x4,x5
*/
//依次执行如下3条命令

f = "100*((x1^2-x2)^2+(x2^2-x3)^2+(x3^2-x4)^2+(x4^2-x5)^2)+(1-x1)^2+(1-x2)^2+(1-x3)^2+(1-x4)^2";
x = "x1,x2,x3,x4,x5";
[ax,er]=nlinSolve2(f,x)//回车后得到如下的解,
ax =
[ 0.99999029646694    0.99998015169288    0.99995910301022    0.99991768602317    0.99983796378389 ]
er =
[ 9.5948834182E-17 ]
//By2014/3/22
