﻿功能:采用BFS(Broyden-Flether-Shanno)算法求解非线性方程组

格式:
[ax,error]=nlinSolveBFS(f,x,x0,erro,loop)
[ax,error]=nlinSolveBFS(f,x,x0,erro)
[ax,error]=nlinSolveBFS(f,x,x0,erro)
[ax,error]=nlinSolveBFS(f,x,x0)
[ax,error]=nlinSolveBFS(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.默认初始迭代值均为1.369857425
erro:不小于0的误差控制变量,默认为1e-7
loop:迭代的次数上限,此值必须大于0,默认为3000

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

备注:
1、这里方程的个数不一定要等于变量的个数
2、本算法属于局部非线性收敛的算法,因此,如果初始迭代值不太靠近真实值的话,很可能迭代发散.但即使是发散,本程序也会返回计算中算出的误差最小的解.个人使用后,感觉还是使用{nlinsolveLM<矩阵运算\nlinsolveLM>}函数的算法比较可靠

参考:《Fortran 95/2003 科学计算与工程》-宋叶志-清华大学出版社-243页至244页

例子:

//请求解如下的方程组
//sin(x)*5+cos(y*z)+5=8.36828339496303
//log(x^2+1)*5+y*sin(z)*4=-4.2056582945053
//则按如下方法求解,注意f里的函数的填写格式

f="sin(x)*5+cos(y*z)+5-8.36828339496303,log(x^2+1)*5+y*sin(z)*4+4.2056582945053";
x="x,y,z";
[an,er]=nlinSolveBFS(f,x)//回车得到如下结果
an =
[ 1.02983176302132     -1.9952785353612      1.36985742500000  ]
er =
[ 9.4578654419E-07 ]