﻿功能:采用遗传算法求解非线性方程组

格式:
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw,xMax,xMin,N,LoopN,Error0,Rand)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw,xMax,xMin,N,LoopN,Error0)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw,xMax,xMin,N,LoopN)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw,xMax,xMin,N)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw,xMax,xMin)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw,xMax)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d,dw)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm,d)
[ax,error]=nlinSolveGA(f,x,x0,pc,pm)
[ax,error]=nlinSolveGA(f,x,x0,pc)
[ax,error]=nlinSolveGA(f,x,x0)
[ax,error]=nlinSolveGA(f,x)

f:符号变量存储的方程组表达式,其中每个表达式以逗号分隔
x:符号变量存储的方程组里求解变量的名称,每个变量以逗号分隔
x0:对应x变量的初始值,如果x0为矩阵变量,则矩阵变量里的数据依依与x里变量对应；如果x0为一个数据，则每个x变量均初始化此值；如果x0为符号变量，则每个初始值以逗号分隔。程序默认在100以内随机初始化x0
pc:交叉概率,默认为0.9
pm:变异概率,默认0.2
d:每次变异时扰动的最大幅度。d是一个矩阵变量或者符号变量或数据，其中d当中的每一个值对应x里的每一个变量
dw:控制d变化的量，一般取值小于1。其表示扰动幅度d每循环一次，将变成d=d*dw，这样达到扰动幅度可变，可以更好的得到结果。程序默认取值dw=exp(-ln(50)/LoopN)
xMax:一个矩阵变量或者符号变量或数据，其中xMax对应x里的每一个变量，表示x变量的最大值为xMax。程序默认每个变量最大值为10000
xMin:一个矩阵变量或者符号变量或数据，其中xMin对应x里的每一个变量，表示x变量的最小值为xMin。程序默认每个变量最小值为-10000
N:群体大小,默认为200
LoopN:程序最大循环次数,默认为4000
Error0:终止循环的残差条件，默认为1E-15
Rand:初始随机数的种子，默认由系统自动生成

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

说明:

1、如果效果不好，请调动一下扰动区间d大小，以及dw的大小。一般情况下，可以先把dw设置为1然后设置d看下效果，一般越接近结果，d必须设置得越小才好
2、如果确定了区间，最好将xMax与xMIn设置到相应的区间最好
3、因为对遗传算法了解得不深,按照自己理解的方法写代码时，结果总是相差特别大，因此本函数的方法与书本上有点区别。其原理如下：

设总共有n个个体，则每一个循环进行如下操作

A:k=1
B、k≤n吗,是的话转到C,否则循环结束
C、pc满足吗?满足的话对x[k]进行交叉操作，否则直接将x[k]复制到下一代。//交叉操作采用x[k]=x[k]*(1-Rand)+X[Best]*Rand
D、k=k+1
E、pm满足吗?满足的话对x[k]进行变异操作,k=k+1//变异操作采用x[k]=x[k]+(1-Rand)*d[k],注意如果x由多个变量组成,则随机对n个变量进行变异
F、转到B

参考:
//1、张可村,李换琴.工程优化方法及其应用[M].西安交通大学出版社,西安,2007:238~244
//2、付振岳,王顺芳.改进的遗传退火算法在针对含有超越函数的非线性方程组中求解的应用[J].云南大学学报,2009:58

例子:

/*
求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
*/
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";
x0 =[100.000000000000    100.000000000000    100.000000000000    100.000000000000    100.000000000000 ];

[an,er]=nlinSolveGA(f,x,x0)//回车得到如下的解
an =
[ 0.99999824527562    0.99999193149912    0.99997129665622    0.99993427509676    0.99986964495280  ]
er =
[ 9.0729449623E-16 ]