﻿功能:多元非线性函数拟合(Nonlinear Fitting)

格式:
[ax,error]=nlinfit(f,a,x,ydata,xdata,a0,d,erro,loop)
[ax,error]=nlinfit(f,a,x,ydata,xdata,a0,d,erro)
[ax,error]=nlinfit(f,a,x,ydata,xdata,a0,d)
[ax,error]=nlinfit(f,a,x,ydata,xdata,a0)
[ax,error]=nlinfit(f,a,x,ydata,xdata)
f:要拟合的函数表达式,一般用符号变量来储存表达式
a:要拟合的变量名称集合,一般为符号变量来储存变量名称,每个变量名称之间用逗号分隔
x:多元函数对应的变量名称的集合,一般用符号变量来储存变量名称,每个变量名称之间用逗号分隔
ydata:矩阵变量,即x变量对应的函数f值的数据,如果xdata为m*n的矩阵,则ydata应该为m*1的矩阵,ydata每一行对应xdata每一行的数据
xdata:矩阵变量,即x变量对应的原始数据,如果xdata为m*n的矩阵,则x为n元变量,且每个x对应于xdata的每一列的数据
a0:a0可以为数据可以为矩阵,当a0为数据的时候,a中每一个初始值均为a,否则从a0矩阵中依次取出数据来作为a的初始值,其它a0默认为0
d:数据或者矩阵变量,如果为矩阵变量一般为k*1的矩阵(k代表a变量名称的个数)阻尼因子,这个参数主要防止矩阵奇异求解时浮动太大,其默认为0
erro:大于0的误差控制变量
Loop:迭代的最大次数

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

原理:本函数采用Newton-Rapson迭代算法拟合数据,其中考虑到求解时矩阵遇到奇异性的问题,特考虑麦夸尔特(Marqurlt)思想,增加了阻尼因子d的参变量.

参考:《χ²检验非线性回归的Newton-Rapson优化算法》徐少锋.上海交通大学物理系.2011.7.28

例子:
x =
[ 98.2496723058865     58.6197562788705     46.4706287004382
  49.9288517748606     31.3411922340007     59.9085562675766
  10.5769266423662     86.6714574334544     64.2244769559356
  52.2178927679630     48.9052814659221     82.7272524045441
  2.90479846433960     17.2000807790086     70.7271938541565
  41.1435616859903     20.3991532886397     33.8813519263088
  30.2256995952808     67.1367097492966     30.5053848449632
  62.7563426097652     56.3990648167203     52.4518820235747
  23.9934131614833     78.8292296132209     70.3480669624862
  70.1682779799068     64.3237165940570     26.3066626276386
  65.5557892590555     61.5972670547651     24.1393888947272
  82.8458744487008     5.85097126003866     43.9912629518617
  6.36054347565423     1.74322454339975     16.5295636824004
  64.7784831304003     47.4993679428005     37.6909367915666
  72.1403494813202     86.9469706839635     82.7224125073861
  44.1028767005088     93.6793267231804     81.4969421743867
  55.3637486674654     86.2879557471201     79.0608721222081
  41.1391127580493     33.9911680361215     22.5875386142114
  73.7322528258582     35.4933296961213     2.22069146215017
  94.0187466768635     25.9354386133772     52.5119626207798 ]
x1=get(x,0,1)//这里没有直接显示x1的值,相当于是获取x里的第1列数据
x2=get(x,0,2)//这里没有直接显示x2的值,相当于是获取x里的第2列数据
x3=get(x,0,3)//这里没有直接显示x3的值,相当于是获取x里的第3列数据
y=2*x1+3*sin(x2)+4*x3^2+5//这里没有直接显示y的值,注意这个函数2*x1+3*sin(x2)+4*x3^2+5就是我们最原始的函数,假如事先我们是不知道的,

//即现在的问题是,已知y,x1,x2,x3的m组数据,现在我已经知道他们之间有y=a1*x1+a2*sin(x2)+a3*x3^2+a4这种关系,我们现在要求最佳的系数a1,a2,a3,a4,则我们继续输入如下的命令,注意下面输入每一行后得按回车程序才能获取变量.请仔细看下面的输入格式

f="a1*x1+a2*sin(x2)+a3*x3^2+a4";
xname="x1,x2,x3";
a="a1,a2,a3,a4";
a0=[1 1 1 1];//假如我们的初始迭代值均为1
[an,er]=nlinfit(f,a,xname,y,x,a0)//回车后得到如下结果
an =
[ 2.00000000000008     3.00000000000203     4.00000000000000     4.99999999999121 ]
er =
[  7.1725477149E-21 ]

//By 2012/6/19