matlab中的曲線擬合與插值

2022-02-20 11:03:07 字數 4822 閱讀 4886

曲線擬合與插值

在大量的應用領域中,人們經常面臨用乙個解析函式描述資料(通常是測量值)的任務。對這個問題有兩種方法。在插值法裡,資料假定是正確的,要求以某種方法描述資料點之間所發生的情況。這種方法在下一節討論。這裡討論的方法是曲線擬合或回歸。人們設法找出某條光滑曲線,它最佳地擬合資料,但不必要經過任何資料點。圖11.1說明了這兩種方法。標有'o'的是資料點;連線資料點的實線描繪了線性內插,虛線是資料的最佳擬合。

11.1 曲線擬合

曲線擬合涉及回答兩個基本問題:最佳擬合意味著什麼?應該用什麼樣的曲線?可用許多不同的方法定義最佳擬合,並存在無窮數目的曲線。所以,從這裡開始,我們走向何方?正如它證實的那樣,當最佳擬合被解釋為在資料點的最小誤差平方和,且所用的曲線限定為多項式時,那麼曲線擬合是相當簡捷的。數學上,稱為多項式的最小二乘曲線擬合。如果這種描述使你混淆,再研究圖11.1。虛線和標誌的資料點之間的垂直距離是在該點的誤差。對各資料點距離求平方,並把平方距離全加起來,就是誤差平方和。這條虛線是使誤差平方和盡可能小的曲線,即是最佳擬合。最小二乘這個術語僅僅是使誤差平方和最小的省略說法。

在matlab中,函式polyfit求解最小二乘曲線擬合問題。為了闡述這個函式的用法,讓我們以上面圖11.1中的資料開始。

x=[0.1.2.3.4.5.6.7.8.91];

y=[-.4471.9783.286.167.087.347.669.569.489.3011.2];

為了用polyfit,我們必須給函式賦予上面的資料和我們希望最佳擬合資料的多項式的階次或度。如果我們選擇n=1作為階次,得到最簡單的線性近似。通常稱為線性回歸。相反,如果我們選擇n=2作為階次,得到乙個2階多項式。現在,我們選擇乙個2階多項式。

n=2;%polynomial order

p=polyfit(x, y, n)

p =-9.810820.1293-0.0317

polyfit 的輸出是乙個多項式係數的行向量。其解是y = -9.8108x2 +20.1293x-0.0317。為了將曲線擬合解與資料點比較,讓我們把二者都繪成圖。

xi=linspace(0, 1, 100);%x-axis data for plotting

z=polyval(p, xi);

為了計算在xi資料點的多項式值,呼叫matlab的函式polyval。

plot(x, y, ' o ' , x, y, xi, z, ' : ' )

畫出了原始資料x和y,用'o'標出該資料點,在資料點之間,再用直線重畫原始資料,並用點' : '線,畫出多項式資料xi和z。

xlabel(' x '), ylabel(' y=f(x) '), title(' second order curve fitting ')

將圖作標誌。這些步驟的結果表示於前面的圖11.1中。

多項式階次的選擇是有點任意的。兩點決定一直線或一階多項式。三點決定乙個平方或2階多項式。按此進行,n+1資料點唯一地確定n階多項式。於是,在上面的情況下,有11個資料點,我們可選乙個高達10階的多項式。然而,高階多項式給出很差的數值特性,人們不應選擇比所需的階次高的多項式。此外,隨著多項式階次的提高,近似變得不夠光滑,因為較高階次多項式在變零前,可多次求導。例如,選乙個10階多項式

pp=polyfit(x, y, 10) ;

format short e%change display format

pp.'%display polynomial coefficients as a column

ans =

-4.6436e+005

2.2965e+006

-4.8773e+006

5.8233e+006

-4.2948e+006

2.0211e+006

-6.0322e+005

1.0896e+005

-1.0626e+004

4.3599e+002

-4.4700e-001

要注意在現在情況下,多項式係數的規模與前面的2階擬合的比較。還要注意在最小(-4.4700e-001)和最大(5.8233e+006)係數之間有7個數量級的幅度差。將這個解作圖,並把此圖與原始資料及2階曲線擬合相比較,結果如何呢?

zz=polyval(pp, xi);%evaluate 10th order polynomial

plot(x, y, ' o ' , xi, z, ' : ' , xi, zz)%plot data

xlabel(' x '),ylabel(' y=f(x) '),title(' 2nd and 10th order curve fitting ')

在下面的圖11.2中,原始資料標以'o',2階曲線擬合是虛線,10階擬合是實線。注意,在10階擬合中,在左邊和右邊的極值處,資料點之間出現大的紋波。當企圖進行高階曲線擬合時,這種紋波現象經常發生。根據圖11.2,顯然,『 越多就越好 』的觀念在這裡不適用。

11.2 一維插值

正如在前一節對曲線擬合所描述的那樣,插值定義為對資料點之間函式的估值方法,這些資料點是由某些集合給定。當人們不能很快地求出所需中間點的函式值時,插值是乙個有價值的工具。例如,當資料點是某些實驗測量的結果或是過長的計算過程時,就有這種情況。

或許最簡單插值的例子是matlab的作圖。按預設,matlab用直線連線所用的資料點以作圖。這個線性插值猜測中間值落在資料點之間的直線上。當然,當資料點個數的增加和它們之間距離的減小時,線性插值就更精確。例如,

x1=linspace(0, 2*pi, 60);

x2=linspace(0, 2*pi, 6);

plot(x1, sin(x1), x2, sin(x2), ' - ')

xlabel(' x '),ylabel(' sin(x) '),title(' linear interpolation ')

如曲線擬合一樣,插值要作決策。根據所作的假設,有多種插值。而且,可以在一維以上空間中進行插值。即如果有反映兩個變數函式的插值,z=f(x, y),那麼就可在x之間和在y之間,找出z的中間值進行插值。matlab在一維函式interp1和在二維函式interp2中,提供了許多的插值選擇。其中的每個函式將在下面闡述。

為了說明一維插值,考慮下列問題,12小時內,一小時測量一次室外溫度。資料儲存在兩個matlab變數中。

hours=1:12;%index for hour data was recorded

temps=[5 89152529313022252724]; %recorded temperatures

plot(hours, temps, hours, temps,' + ')%view temperatures

title(' temperature ')

xlabel(' hour '),ylabel(' degrees celsius ')

matlab畫出了資料點線性插值的直線。為了計算在任意給定時間的溫度,人們可試著對可視的圖作解釋。另外一種方法,可用函式interp1。

t=interp1(hours, temps, 9.3)%estimate temperature at hour=9.3

t =22.9000

t=interp1(hours, temps, 4.7)%estimate temperature at hour=4.7

t =22

t=interp1(hours, temps, [3.26.57.111.7])%find temp at many points!

t =10.2000

30.0000

30.9000

24.9000

interp1的預設用法是由interp1(x, y, xo)來描述,這裡x是獨立變數(橫座標),y是應變數(縱座標),xo是進行插值的乙個數值陣列。另外,該預設的使用假定為線性插值。

若不採用直線連線資料點,我們可採用某些更光滑的曲線來擬合資料點。最常用的方法是用乙個3階多項式,即3次多項式,來對相繼資料點之間的各段建模,每個3次多項式的頭兩個導數與該資料點相一致。這種型別的插值被稱為3次樣條或簡稱為樣條。函式interp1也能執行3次樣條插值。

t=interp1(hours, temps, 9.3, ' spline ')%estimate temperature at hour=9.3

t =21.8577

t=interp1(hours, temps, 4.7, ' spline ')%estimate temperature at hour=4.7

t =22.3143

t=interp1(hours, temps, [3.26.57.111.7], ' spline ')

t =9.6734

30.0427

31.1755

25.3820

注意,樣條插值得到的結果,與上面所示的線性插值的結果不同。因為插值是乙個估計或猜測的過程,其意義在於,應用不同的估計規則導致不同的結果。

乙個最常用的樣條插值是對資料平滑。也就是,給定一組資料,使用樣條插值在更細的間隔求值。例如,

h=1:0.1:12;%estimate temperature every 1/10 hour

t=interp1(hours, temps, h, ' spline ') ;

plot(hours, temps, ' - ' , hours, temps, ' + ' , h, t)%plot comparative results

title(' springfield temperature ')

xlabel(' hour '),ylabel(' degrees celsius ')

在圖11.5中,虛線是線性插值,實線是平滑的樣條插值,標有' + '的是原始資料。如要求在時間軸上有更細的解析度,並使用樣條插值,我們有乙個更平滑、但不一定更精確地對溫度的估計。尤其應注意,在資料點,樣條解的斜率不突然改變。作為這個平滑插值的回報,3次樣條插值要求更大量的計算,因為必須找到3次多項式以描述給定資料之間的特徵。

MATLAB資料插值和曲線擬合

在工程測量和科學實驗中,所得到的資料通常是離散的。如果要得到這些離散點以外的其他點的數值,就需要根據這些已知資料進行插值。根據被插值函式的自變數個數,插值問題分為一維插值 二維插值和多維插值等 根據是用分段直線 多項式或樣條函式來作為插值函式,插值問題又分為線性插值 多項式插值和樣條插值等。如果被插...

MATLAB 曲線擬合

x0.1 0.20.15 0.0 0.2 0.3y 0.95 0.84 0.86 1.06 1.50 0.72 函式功能多項式的擬合運算 呼叫方法polyfit x,y,n x為橫座標,y為縱座標,n為擬合階數。例子x 0 0.1 2.5 1y erf x p polyfit x,y,6 p 0.0...

matlab 曲線擬合

在matlab中經常需要對資料進行曲線擬合,如最常見的多項式擬合,一般可以通過cftool呼叫曲線擬合工具 curve fit tool 通過圖形介面可以很方便的進行曲線擬合,但是有些時候也會遇到不方便用圖形工具。因此這裡簡單的記下兩種常用的擬合方法。1 多項式擬合 polyfit和polyval ...