楊 洪,林大偉,張宏禮
(黑龍江八一農墾大學 文理學院,黑龍江 大慶 163319)
在科學數據的處理過程中,常常需要建立變量之間的數學模型。所建立的數學模型往往是非線性的,因為在實際應用中非線性模型常常比線性模型更能反映變量之間的關系。數據擬合是一種重要的建立變量之間數學模型的方法,其求解方法通常是對給定的含有待定參數的數學模型應用最小二乘法求解。隨著研究的不斷深入,非線性數據擬合問題越來越受到重視。
在Matlab下有三個適于數據擬合的命令,它們分別是統計工具箱下的nlinfit()、優化工具箱下的 lsqnonlin()、優化工具箱下的lsqcurvefit(),這三個命令都依據最小二乘法求解[1]。
最小二乘法一般是求解最小二乘問題,最小二乘問題就是對由若干個函數的平方和構成的目標函數求極小值的問題。目標函數一般可以寫成
其中,x=(x1,x2,…xn)是集合En中的點,一般m≥n。目標函數極小化可以表示成
特別地,當fi(x),i=1,2,…m中至少有一個是x的非線性函數時,稱為非線性最小二乘問題。

nlinfit()實際上是非線性回歸函數,一般用非線性最小二乘法確定回歸方程中的系數[3],其基本算法是Guass-Newton法。
Guass-Newton法可以非常方便地求解最小二乘問題。在Guass-Newton法中需要求解牛頓方程
2f(x(k))d=f(x(k))
由Hesse矩陣

可知,這里需要計算ri(x)(i=1,2,…m),計算量大。為了簡化計算,省略Hesse矩陣的第二項,即求解方程組
J(x(k))TJ(x(k))d=-J(x(k))Tr(x(k))
得d(k),然后置
x(k+1)=x(k)+d(k)
這樣就得到了Guass-Newton法[4]。
該函數主要的算法是Guass-Newton法和Levenberg-Marquardt法。
lsqnonlin函數求解非線性數據擬合問題,不僅僅要計算目標函數f(x)(平方和),lsqnonlin函數還需要用戶指定函數來計算向量值函數
然后,將優化問題重新寫成向量的形式:
式中,x為一向量,F(x)為一返回向量值的函數。
用lsqnonlin函數求解數據擬合問題,其調用格式為:
x = lsqnonlin(fun,x0)
x = lsqnonlin(fun,x0,lb,ub)
x = lsqnonlin(fun,x0,lb,ub,options)
x = lsqnonlin(fun,x0,lb,ub,options,P1,P2,…)
[x,resnorm] = lsqnonlin(...)
[x,resnorm,residual] = lsqnonlin(...)
[x,resnorm,residual,exitflag] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(...)
lsqcurvefit函數的基本算法與lsqnonlin函數基本相同。同樣是應用了Guass-Newton法和Levenberg-Marquardt法。
lsqcurvefit解決非線性數據擬合問題的數學模型為
其中xdata和ydata為向量,F(x,xdata)為向量值函數。
用lsqcurvefit函數求最小二乘意義上的非線性數據擬合問題。即根據輸入數據xdata和得到的輸出數據ydata,找到與方程F(x,xdata)最佳的擬合系數。
lsqcurvefit求解非線性數據擬合問題。lsqcurvefit需要一個用戶定義函數來計算向量值函數F(x,xdata)。用戶定義的函數的向量的大小必須與ydata的大小相同。
該函數的調用格式為:
x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
[x,resnorm] = lsqcurvefit(...)
[x,resnorm,residual] = lsqcurvefit(...)
[x,resnorm,residual,exitflag] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(...)
nilinfit()函數是應用了Guass-Newton法進行求解的,在Guass-Newton法中,當J(x(k))的各列是線性相關,或接近線性相關,換句話說,矩陣J(x(k))TJ(x(k))奇異或是病態的,那么求解線性方程組就會出現一點困難,而lsqnonlin命令是基于Guass-Newton法和Levenberg-Marquardt法進行求解。從而利用Levenberg-Marquardt法設置參數即可完成。已知數據如表1所示

表1 數據表
在Matlab中輸入
x=[0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10];
y=[76 47 97 107 123 139 159 152 191 201 207 200];
f=inline('p(1)*x./(p(2)+x)','p','x');
[p,r]=nlinfit(x,y,f,[200,0.1])
運行結果為
p = 212.6826 0.0641
r =25.4332 -3.5668 -5.8119 4.1881 -11.3623 4.6377 -5.6848 -12.6848 0.1676 10.1676 6.0319 -0.9681
下面畫出由擬合得到的數據及已知的數據散點圖。
x1=0:0.02:1.10; y1=212.6826*x1./(0.0641+x1); plot(x,y, 'o',x1,y1)

圖1利用nlinfit( )數據擬合生成圖
在[p,r]=nlinfit(x,y,f,[200,0.1])中,“r”為殘差。殘差是通過建立的擬合函數求出的值和實際值之間的差值。
下面應用lsqnonlin函數進行擬合,首先編寫目標函數 (curve_fun.m)
function y=curve_fun(p)%非線性最小二乘擬合函數
x=[0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10];
y=[76 47 97 107 123 139 159 152 191 201 207 200];
y=p(1)*x./(p(2)+x)-y;
再用lsqnonlin()函數求解,輸入
[p,resnorm,residual]=lsqnonlin(@curve_fun,[200,0.1])
運行結果為
p =212.6836 0.0641
resnorm =1.1954e+003
residual =
Columns 1 through 11
-25.4339 3.5661 5.8111 -4.1889 11.3617 -4.6383 5.6847 12.6847 -0.1671 -10.1671 -6.0313
Column 12 0.9687
作圖如下:
x=[0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10];
y1=212.6836*x1./(0.0641+x1); plot(x,y,'o',x1,y1)

圖2 利用lsqnonlin ( )數據擬合生成圖
雖然lsqnonlin函數較nlinfit函數全面,但在一些基本數據擬合問題上特別在不是解病態奇異的方程組的情況下,應用nlinfit函數與lsqnonlin函數擬合沒有明顯的差別,幾乎可以省略。Matlab用lsqcurvefit函數進行非線性數據擬合,其算法與lsqnonlin函數的算法相同。
基于最小二乘法闡述了MATLAB中三個適于數據擬合命令的算法原理、格式,并通過應用實例對這三個命令的異同進行了比較分析。nlinfit()函數實際上是非線性回歸函數,其基本原理是Guass-Newton法,它的擬合結果比lsqurvefit()函數的默認控制結果更精確,但是因為其不允許給出像lsqurvefit()函數的精度控制選項,在某方面不能進一步精確。用lsqcurvefit()函數進行非線性數據擬合,設置該函數的目的是提供一個更方便于進行數據擬合的方法,其算法與lsqnonlin()函數的算法相同,都是Guass-Newton法和Levenberg-Marquardt法。但在一些特定的環境不能用lsqnonlin()函數,比如由于大型算法不能求解待定系統,中型算法不能求解有邊界約束的問題等,這樣的問題應用lsqurvefit()函數更適用更精確些。
[參考文獻]
[1] 羅成漢,劉小山.曲線擬合法的Matlab實現[J].現代電子技術,2003,20:16-18.
[2] 薛毅.最優化理論與算法[M].北京:北京工業大學出版社,2004:201-202.
[3] 包翠蓮,開小明.Matlab語言在多元線性回歸中的應用[J]. 安徽教育學院學報,2005,23(3):55.
[4] 禇洪生,杜增吉,閻金華.Matlab7.2優化設計實例指導教程[M].北京:機械工業出版社,2007:117.