﻿功能:非线性方程组求解(采用Levenberg-Marquardt算法进行求解)

格式:
[ax,error]=nlinsolveLM2(f,x,x0,d,erro,loop,v)
[ax,error]=nlinsolveLM2(f,x,x0,d,erro,loop)
[ax,error]=nlinsolveLM2(f,x,x0,d,erro)
[ax,error]=nlinsolveLM2(f,x,x0,d)
[ax,error]=nlinsolveLM2(f,x,x0)
[ax,error]=nlinsolveLM2(f,x)

f:符号变量,里面主要储存一连串的函数方程,每个方程用逗号分隔.注意如果方程为sin(x)-cos(y)*7=8,那么f里储存的就是sin(x)-cos(y)*-8,即要把方程右边的常数项变为0
x:储存f里变量的符号变量,每个变量名称以逗号分隔
x0:x对应变量的初始迭代值.x0为数据时,每个x的初始值均为x0,当x0为矩阵变量(1*m或者m*1的矩阵,其中m表示x变量的个数),则x0每个元素依次初始化给x.默认初始迭代值随机生成
d:为了防止矩阵奇异的阻尼因子,d为数据或者矩阵变量(1*m或者m*1的矩阵,其中m表示x变量的个数),其中d默认为0
erro:不小于0的误差控制变量,默认为1e-7
loop:迭代的次数上限,此值必须大于0,默认为3000
v:增长因子,这个值应该大于1.默认为2.5

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

原理:

1、总体采用L-M算法进行求解
2、方程组求解部分采用改进的平方根算法求解
3、程序返回的解是所有扫描到的解中残差平方和最小的解

注意:本函数求解的f里的表达式必须可导

参考:《非线性最优化计算方法》.张光澄.高等教育出版社.2006.6:159-168

例子:
//请求解下面的方程组
//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

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";
[an,er]=nlinsolveLM2(f,x)//回车后得到如下的结果
an =
[ 2.869238202779630     1.877805166707220     6.256607747550870  ]
er =
[ 4.84106282169E-18 ]

//By 2013/10/8