﻿功能:采用另一种算法求解非线性方程组

格式:
[ax,error]=nlinSolve(f,Xname,x0,NBird,LoopSum,Error0,MaxX,MinX)
[ax,error]=nlinSolve(f,Xname,x0,NBird,LoopSum,Error0,MaxX)
[ax,error]=nlinSolve(f,Xname,x0,NBird,LoopSum,Error0)
[ax,error]=nlinSolve(f,Xname,x0,NBird,LoopSum)
[ax,error]=nlinSolve(f,Xname,x0,NBird)
[ax,error]=nlinSolve(f,Xname,x0)
[ax,error]=nlinSolve(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:返回的残差平方和

原理:
1、本函数求解思想是仿遗传算法,但非常规的遗传算法(因为本算法思想是,所有个体均需要且仅需要进行交叉.其实某种意义上来说,交叉和变异是一回事,所以我只选择一种操作本).再者本算法有点类似粒子群算法,但又非粒子群算法.总体思想是,每个个体只保留最好的,所有个体且都向最好的个体看齐.

2、步骤如下:
(1)初始化一个种群,且找出当中最好的一个解
(2)进入循环部分:
A、让种群每个个体均与当前系统中最好的解进行杂交,其杂交采用如下3种算法(r为[0,1]之间的随机数,y0当前系统最好解,x0个体当前解)
2.1、启发式交叉
    x1=x0-(2r-1)*(x0-y0)
2.2、一种可尝试的交叉
    x1=x0*(0.5-r)+y0*(0.5+r)
2.3、算术交叉
    x1=r*x0+(1-r)*y0
B、个体杂交产生的后代如果不优于前代,则上面三种杂交方式均需要杂交一次,如果3种杂交方式进行完毕均未找到优于前代的个体,则下一代直接克隆上一代;否则用杂交出较好的后代继承上一代
C、是否满足终止条件,不满足继续回到步骤A

例子:

/*
求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]=nlinSolve(f,x)//回车后得到如下的解,
ax =
[ 0.99999003874813    0.99998575899069    0.99997635012824    0.99995570830157    0.99991240551771  ]
er =
[ 8.8127071134E-17 ]

//By2014/3/22
