﻿功能:非线性数据拟合

格式:
[an,error]=nlinFitLM(f,a,x,x_Data,a0,d,loop,error,v)
[an,error]=nlinFitLM(f,a,x,x_Data,a0,d,loop,error)
[an,error]=nlinFitLM(f,a,x,x_Data,a0,d,loop)
[an,error]=nlinFitLM(f,a,x,x_Data,a0,d)
[an,error]=nlinFitLM(f,a,x,x_Data,a0)
[an,error]=nlinFitLM(f,a,x,x_Data)

f:为符号存储的表达式,即需要拟合的函数表达式.注意表达式的构造形式,比如需要拟合的表达式为 g(x1,x2,……)=y,则f的表达式必须是g(x1,x2,……)-y的形式。
a:包含需要拟合参数的变量名称
x:包含实验数据的变量名称,每个名称以逗号分隔.注意名称必须遵守命名规则
x_Data:与x变量名称对应的矩阵变量,这里面每一列的数据对应x里对应变量
a0:与a变量对应的初始猜测值.可以为数据也可以是矩阵变量,如果为数据,则每个初始值均为此数据.程序默认在-10到10之间随机初始化
d:阻尼因子.可以为数据也可以是矩阵变量,如果为数据,则每个阻尼值均为此数据.程序默认为0
loop:循环次数,默认为5000
error:误差控制变量,默认为1E-12
v:放大因子,默认为2.5

an:返回的拟合系数
error:返回的残差平方和

说明:
1、程序执行成功返回n+1个数据,其中前n个数据分别对应a中变量拟合出的值,最后一个值为反应拟合效果的残差平方和.
2、本程序拟合采用{nlinSolveLM2<矩阵运算\nlinSolveLM2>}函数进行求解,这一点与{nlinFit<矩阵运算\nlinFit>}是有所不同的.
3、拟合效果不佳,建议调动一下阻尼因子,放大因子,或者初始值试一试

例子:

//已知有如下一组数据,其中数据表达式满足sin(z(1))*a+b*z(2)+c*z(3)-d+z(4)=0,其中z(1)、z(2)、z(3)、z(4)分别对应z数据的第1、2、3、4列数据,现在要求拟合出最佳系数a、b、c、d

z =[ 1.000000000000000     0.841470984807897     0.540302305868140     -0.11354116913921
     2.000000000000000     1.818594853651360     -0.83229367309428     -2.98857287563957
     3.000000000000000     0.423360024179602     -2.96997748980134     8.570937352783600
     4.000000000000000     -3.02720998123171     -2.61457448345445     26.50742688492090
     5.000000000000000     -4.79462137331569     1.418310927316130     30.55479593926230
     6.000000000000000     -1.67649298919356     5.761021719902200     10.34202772786670
     7.000000000000000     4.598906191031520     5.277315780403130     -18.9578735381232
     8.000000000000000     7.914865972987050     -1.16400027046891     -27.4422548545962
     9.000000000000000     3.709066367175810     -8.20017235696209     -0.69668553794993
     10.00000000000000     -5.44021110889370     -8.39071529076452     40.87166528078620 ]

//求解如下.注意执行下面的命令前确定系统已经存在上面z这个数组

f = "sin(z1)*a+b*z2+c*z3-d+z4";zn="z1,z2,z3,z4";xn="a,b,c,d";
[an,er]=nlinFitLM(f,xn,zn,z)//回车后得到如下的结果
an =
[ 5.000000000000040     4.000000000000000     1.000000000000000     8.000000000000000   ]
er =
[ 8.36574741072E-27 ]

//By 2013/10/9
