﻿功能:采用改进的粒子群优化算法求解非线性方程组

格式:

[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c2,X2,LoopN,Error0,NBird,Randn)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c2,X2,LoopN,Error0,NBird)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c2,X2,LoopN,Error0)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c2,X2,LoopN)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c2,X2)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c2)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min,c1)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max,w_Min)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min,w_Max)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max,v_min)
[ax,error]=nlinSolvePSO(f,x,x0,v_Max)
[ax,error]=nlinSolvePSO(f,x,x0)
[ax,error]=nlinSolvePSO(f,x)

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

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

原理:

/*本算法不一样的是,每一个个体在产生下一代的时候,下一代的优良性不能低于父代,否则直接将父代遗传下去
v[k]代表第k次的速度,x[k]代表第k此变量的值,x0代表个体最优值,x代表整体最优值,rand1与rand2是随机产生的0到1之间的数据,则v与x其对应更新满足如下关系式
v[k+1]=X2*(w*v[k]+c2*rand2*(x-x[k]))
x[k+1]=x[k]+v[k+1]
w=w_Max-(w_Max-w_Min)*k/LoopN
*/

参考:张可村,李换琴.工程优化方法及其应用[M].西安交通大学出版社,西安,2007:247-250

例子:

/*
请求解下面的方程组
sin(x)*8+4*y^2-z=10
x^2-cos(z)*7=1.235
log(x^2+4)*7-y*z+7=12.78
依次执行下面的代码后得到最好Ans的结果
*/
f="sin(x)*8+4*y^2-z-10,x^2-cos(z)*7-1.235,log(x^2+4)*7-y*z+7-12.78";x="x,y,z";
[ax,er]=nlinSolvePSO(f,x)//回车后得到如下的结果
ax =
[ 0.28577245392655   -0.89413906831114   -4.54687231076377  ]
er =
[ 3.3045906692E-13 ]