徐嬌艷
摘要:近年來利用Matlab進行曲線擬合解決問題的情況較多。本文通過比較介紹了Matlab在曲線擬合中的常見應(yīng)用方法 。
關(guān)鍵詞:數(shù)據(jù) 曲線擬合 誤差
曲線擬合是用連續(xù)曲線近似地描述平面上離散點組所表示的坐標之間函數(shù)關(guān)系或內(nèi)在規(guī)律的一種數(shù)據(jù)處理方法。在實際工作中,通過實驗或觀測到x與y的一組數(shù)據(jù)對(xi,yi),i=l,2,…,m,其中各xi是不同的。人們希望用一類與數(shù)據(jù)規(guī)律相切合的函數(shù)表達式y(tǒng)=f(x,c)來反映量x與y之間的關(guān)系,即在某種程度上"最佳"地擬合已知數(shù)據(jù)。f(x,c)稱作擬合函數(shù),其圖像稱作擬合曲線,c為待定參數(shù)[1]。C++和Fortran等傳統(tǒng)的語言編程也能實現(xiàn)擬合算法,但工作量大且繁瑣。Matlab提供了強大的矩陣處理和繪圖功能,操作簡便,能高效求解各種復(fù)雜工程問題并實現(xiàn)計算結(jié)果的可視化。Matlab本身有擬合函數(shù),還有一個曲線擬合工具箱[2]。
擬合求得數(shù)學(xué)模型后要將實際測定的數(shù)據(jù)與用公式求出的理論值進行比較,判定其誤差程度[1]。根據(jù)這個誤差衡量擬合曲線的優(yōu)劣。
以90系列液壓泵在工作壓力210bar及420bar下的典型容積效率曲線(圖1)為例來求解泵的轉(zhuǎn)速與容積效率函數(shù)關(guān)系式。從圖上取幾組數(shù)據(jù)來研究泵的轉(zhuǎn)速與容積效率關(guān)系(相同壓力下機械效率ηt可視為定值,當p=420bar時):
先在Matlab工作窗口中輸入下面程序,將已有數(shù)據(jù)繪在坐標圖上,如圖2。
x=[585 663 975 1365 1716 2340 2925 3510 3900];
y=[0.83 0.85 0.875 0.89 0.90 0.91 0.914 0.917 0.915];
plot(x,y,'r*'),legend('實際數(shù)據(jù)(n,ηv)'),xlabel('n(r/min))'),ylabel('ηv ')
Matlab中求擬合的方法較多,下面對幾種常見的方法進行介紹。
1.線性最小二乘法
基本思路是選定一個含有待定系數(shù)的函數(shù),使已有數(shù)據(jù)點與此函數(shù)曲線的距離平方和最小,再求出待定系數(shù)。此處以三階函數(shù)為例(轉(zhuǎn)速和效率分別用x、y表示):
1)編程法
fi=a1.*x.^3+a2.*x.^2+a3.*x+a4
解得擬合函數(shù)f及其系數(shù)如下:
f=7078176274323559/1237940039285380274899124224*x^3-
7683900961798595/151115727451828646838272*x^2+
5538405443557303/36893488147419103232*x+
3449538203694265/4503599627370496
運行后顯示數(shù)據(jù)與擬合函數(shù)f的最大誤差Ew=0.0075,平均誤差E1=0.0034和均方根誤差E2=0.0040及數(shù)據(jù)點與擬合曲線的圖形,如圖3所示。
可見,所得擬合曲線基本符合數(shù)據(jù)點的變化規(guī)律,最大誤差、平均誤差和均方根誤差都比較小,但精度不是很好。
2)內(nèi)建函數(shù)法
前面提到過Matlab本身有用于曲線擬合的內(nèi)建函數(shù),例如polyfit函數(shù),命令polyfit(x,y,n)就是用最小二乘法對所給數(shù)據(jù)進行n階多項式擬合,返回擬合多項式p(x),使得p(x(i))~=y(i)。用polyfit函數(shù)對所取數(shù)據(jù)進行曲線擬合[2],發(fā)現(xiàn)采用內(nèi)建函數(shù)法所得3階多項式的系數(shù)與編程法一樣。但前者程序復(fù)雜,數(shù)據(jù)很大,運行時對計算機的要求高。相比后者就顯得非常簡便,只需調(diào)用一個命令。但擬合精度都不太高。并且我們還計算了4階、5階、6階的擬合曲線,發(fā)現(xiàn)階數(shù)越高,擬合曲線經(jīng)過的數(shù)據(jù)點就越多。且擬合的階數(shù)太高,Matlab系統(tǒng)自動給出警告信息,提醒過高的階數(shù)會產(chǎn)生不太好的結(jié)果。
2.插值逼近法
插值法是根據(jù)數(shù)據(jù)的分布規(guī)律,找到一個函數(shù)來連接已知的各點。這里介紹一維插值, Matlab中一維插值可由interpl()函數(shù)求解。例如y1= interpl(x,y,x1,方法),其中x、y分別表示給定的一組自變量和函數(shù)值,x1為一組新的插值點,得出的y1是在插值點處的結(jié)果。常用的插值函數(shù)有:分段線性插值、Hermite插值及三次樣條插值等。下面用三種插值方法進行擬合。輸入x、y對應(yīng)的數(shù)據(jù)組及方法后,運行結(jié)果如圖5所示。
總體上看:分段線性插值曲線不太光滑;三次樣條插值運行時間很長;三次Hermite插值占用內(nèi)存最大。實際問題中,應(yīng)綜合考慮插值函數(shù)的收斂性、穩(wěn)定性以及光滑性的來選擇。
3.曲線擬合工具箱
曲線擬合工具箱是專門為數(shù)據(jù)集合進行曲線擬合而設(shè)計的。它集成了用Matlab建立的圖形用戶界面和M文件函數(shù)。利用工具箱的庫方程(如線性,二次,高階多項式,指數(shù),傅立葉等)或是用戶自定義函數(shù)進行參數(shù)擬合。在Matlab的命令窗口里輸入 x和y的數(shù)據(jù)組,接著輸入"cftool"命令,進入曲線擬合工具箱界面。
1)點擊"Data"按鈕,修改數(shù)據(jù)集名將曲線命名為ηv vs. n,然后點擊"Create data set"按鈕,返回工具箱界面,這時發(fā)現(xiàn)已經(jīng)自動畫出數(shù)據(jù)集的曲線圖[3];
2)點擊"Fitting"按鈕,修改擬合項目名稱為ηv vs. n。然后選擇擬合曲線的類型,工具箱提供的類型有:用戶自定義的函數(shù)類型、指數(shù)、傅立葉、高斯、插值和多項式等11種[3]。
選好后點擊"Apply"按鈕,在Results框中得到如下擬合結(jié)果:
對比發(fā)現(xiàn),有理數(shù)分子分母為線性的擬合曲線最接近已知泵的轉(zhuǎn)速效率曲線,其擬合結(jié)果為:
函數(shù)形式 f(x) = (p1*x + p2) / (x + q1)
其方差3.851e-005,決定系數(shù)0.9951,校正后的決定系數(shù)0.9935,標準差0.002533,方差和標準差接近0、決定系數(shù)和校正后的決定系數(shù)接近1表示較好的擬合結(jié)果。而有理數(shù)分子分母為線性的擬合方差和標準差最小,兩個系數(shù)最接近1。故p=420bar時,泵的轉(zhuǎn)速和容積效率函數(shù)關(guān)系式近似為:
ηv= (0.9293n-143)/(n-103.7)
此時直接選用有理數(shù)分子分母為線性的曲線擬合,得出p=210bar時,泵的轉(zhuǎn)速和容積效率函數(shù)關(guān)系式近似為:
ηv= (0.9685n-202.4)/(n-196.8)
此處所選有理數(shù)分子分母為線性的曲線擬合只在本例中為最佳曲線擬合,不代表所以情況,不同情況要經(jīng)過計算比較后確定。
參考文獻
[1]申紅蓮. Matlab中曲線擬合的方法[J]. 福建電腦, 2010(7): 10-11
[2]百度文庫. matlab曲線擬合. http://wenku.baidu.c, 2012-11-26
[3]晨宇思遠. Matlab的曲線擬合工具箱CFtool使用簡介.