啊好像距離上次寫作又過了七天,啊好像我之前計劃的一周兩三篇善炫,啊辣雞小說毀我青春撩幽,啊我是一只可憐的鴿子库继。
不管怎樣箩艺,我又回來了,并堅定地更新著hhh宪萄。再過兩三天就是我們學(xué)校數(shù)學(xué)建模選拔艺谆,再過八九天就是期末考試。所以這兩天還是一樣拜英,寫勤快一點兒静汤,之后可能時不時就要斷更一周了,八月十九最后一門考完后才能繼續(xù)安安穩(wěn)穩(wěn)地寫文章了居凶。沒辦法虫给,這個暑假實在是不夠舒心。
好的侠碧,今天我來談一談插值和擬合抹估。插值和擬合是兩種不同的數(shù)值計算方法,分別又有著許多不同的插值算法和擬合算法弄兜。在我學(xué)習(xí)的《數(shù)值計算》課中药蜻,這兩部分好像是講了三四節(jié)課。因為課堂教學(xué)的時候替饿,需要對各種算法進行嚴(yán)格的證明和數(shù)學(xué)推導(dǎo)语泽。
限于篇幅以及個人能力的原因,本文不涉及太多的數(shù)學(xué)證明與推導(dǎo)(好吧视卢,基本上不推導(dǎo))踱卵。事實上許多經(jīng)典的建模教材,也不怎么進行推導(dǎo)据过,主要還是著重于介紹與應(yīng)用惋砂。因此想要對插值和擬合進行深入了解的同學(xué),歡迎自學(xué)《數(shù)值計算》類課程蝶俱。
插值
首先談一談插值班利。為什么需要插值呢?因為在許多的實際問題中榨呆,我們想要研究一個變量相對于另一個變量的關(guān)系罗标,往往只能通過觀測得出一組一組的值庸队。而兩個變量之間的函數(shù)關(guān)系,我們往往是難以通過某種解析式或者某種圖像來表達的闯割。也就是說彻消,我們只有一組一組的數(shù)據(jù),壓根不曉得變量之間具體的函數(shù)關(guān)系宙拉。
這就帶來了一個難題宾尚。舉個例子,假設(shè)我們觀測的是“離海岸距離”與“海水深度”的關(guān)系⌒怀海現(xiàn)在我們將海岸線的位置作為0煌贴,每隔50米或者100米測量一次海水的深度,便得到了許多組數(shù)據(jù)锥忿。那現(xiàn)在的問題就是牛郑,如果我們想知道距離海岸線326米處的海水深度,怎么求呢敬鬓?
嗯淹朋,最簡單的方法就是跑到326米的位置測量一下啦。這確實是最為準(zhǔn)確的方法钉答。但是如果有許許多多的點都有待測量础芍,考慮到時間以及其他成本,一個一個測量可能不太現(xiàn)實数尿。因此仑性,我們需要不同的方法來解決這類問題。即已知在
之間一些點所對應(yīng)的值:
砌创,我們想要求出節(jié)點
之間某個位置
的函數(shù)值虏缸。插值就是解決這類問題的一個合適的方法。
插值是什么呢嫩实?很簡單刽辙,插值就是找到一個比較簡單的函數(shù),滿足
甲献,之后使用
這個函數(shù)來求得
之間某個位置
的函數(shù)值宰缤。也就是找一個函數(shù)來代替
,作為
的一個合理近似晃洒。
首先舉個例子慨灭。
上圖是我取出了函數(shù)中的7個點。現(xiàn)在假裝我們不知道這是個正弦函數(shù)球及,我們只知道這7個點的坐標(biāo)氧骤,那如何求得
的函數(shù)值呢?求是求不出來的吃引,不知道函數(shù)怎么可能求得出來筹陵,但我們可以使用插值求一個近似的解刽锤。
一種很簡單的想法就是分段線性插值,即將相鄰的兩個點之間用直線進行連接朦佩。這種方法應(yīng)該很容易理解并思。我們期望用簡單的函數(shù)來代替,最簡單的一種函數(shù)應(yīng)該就是線性函數(shù)了吧语稠。嗯宋彼,進行一下插值。
諾仙畦,這就是分段線性插值的結(jié)果输涕。假如我們現(xiàn)在想要求出時的值,就比較簡單议泵。將
和
這兩點之間的直線方程解出來占贫,再把
代入,就ok了先口。
可以看到,上述的插值方法太過簡單了瞳收,很可能與實際曲線不太相符碉京。在實際問題中,也很少有這種純線性的的函數(shù)關(guān)系螟深。因此我們可以使用一些較高階的多項式進行插值谐宙,例如分段三次Hermite插值。直接看看結(jié)果界弧。
是不是感覺光滑了很多凡蜻?其實還可以更加光滑一點,我們使用三次樣條插值試一試垢箕。也是直接放結(jié)果划栓。
最后我們把上面提到的三種插值以及原函數(shù)放在一起看看結(jié)果。
可以看到条获,三次樣條插值最接近原曲線忠荞,分段線性插值與原曲線相差最遠。這是不是說明三次樣條插值一定優(yōu)于三次Hermite插值與線性插值呢帅掘?當(dāng)然不是委煤,具體的問題還是要具體分析。如果兩個變量之間的線性相關(guān)性高達99%了修档,那何必還要進行三次插值呢碧绞?不過自然界以及工業(yè)界的多種曲線,往往都是較為光滑的吱窝,因此我們使用三次樣條插值函數(shù)較多讥邻。
上面只是一個簡單的例子寓免,讓大家對于插值有一個較為直觀的印象。其實很簡單计维,就是找到一個函數(shù)袜香,要求該函數(shù)曲線必須經(jīng)過已知點,之后再使用這樣一個函數(shù)代替原函數(shù)鲫惶,求出某個位置對應(yīng)的函數(shù)值蜈首,用這個近似值來代表真實值。接下來簡單介紹幾種插值算法以及在matlab中的相應(yīng)函數(shù)欠母。
插值的算法還挺多的欢策,例如拉格朗日插值,牛頓插值赏淌,最鄰近插值等等踩寇。不過這里我就介紹比較常用的插值方法,也就是上面提到的分段線性插值六水,分段三次Hermite插值以及三次樣條插值俺孙。這三種插值方法有一個共同的特點,即它們是在給定點的每一個小段都確定一個函數(shù)表達式掷贾,疊加起來作為最終的表達式睛榄。嗯,也就是說這是一個分段函數(shù)想帅,在之間求一個函數(shù)场靴,在
求一個函數(shù),依次類推……
為什么不求出一個單一的函數(shù)表達式呢港准?因為當(dāng)插值點越多旨剥,我們不進行分段時,最終得出來的函數(shù)的次數(shù)越高浅缸,而高次多項式會在插值的區(qū)間內(nèi)發(fā)生嚴(yán)重的震蕩現(xiàn)象轨帜,稱之為“龍格現(xiàn)象”。因此我們往往更傾向于使用分段低次多項式來近似原函數(shù)疗杉。拉格朗日插值以及牛頓插值阵谚,最終都是求出一個函數(shù),因此這里不予介紹烟具,有興趣可以自行了解梢什。嗯,下圖是展示龍格現(xiàn)象的一張圖朝聋。其中黑色實線代表原函數(shù)嗡午,n代表插值多項式的次數(shù),顯而易見冀痕,次數(shù)越高時荔睹,震蕩越明顯狸演。想要深入了解請自行學(xué)習(xí)相關(guān)內(nèi)容。
分段線性插值
分段線性插值不必多說了僻他,很簡單宵距,就是在相鄰的區(qū)間內(nèi),用直線來近似原函數(shù)吨拗。用分段線性插值計算點的近似函數(shù)值時满哪,只用到
左右的兩個節(jié)點,與其他節(jié)點無關(guān)劝篷。當(dāng)然啦哨鸭,
越大,分段越多娇妓,插值的誤差也就越小像鸡。實際使用中往往用來計算數(shù)學(xué)、物理中的特殊函數(shù)表哈恰,數(shù)理統(tǒng)計中的概率分布表等等只估。在建模過程中,也可以用來進行缺失數(shù)據(jù)的填補蕊蝗。
matlab中仅乓,插值使用到的函數(shù)是函數(shù),最后一個是數(shù)字
不是字母
蓬戚。
代表著一維數(shù)據(jù)。
通過help命令宾抓,我們可以看到interp1的使用形式子漩。點擊下方“interp1的參考頁”,可以進入該函數(shù)的幫助文檔頁面石洗。vq = interp1(x,v,xq,method)中幢泼,向量 x 包含樣本點,v 包含對應(yīng)值 v(x)讲衫。向量 xq 包含查詢點的坐標(biāo)缕棵,vq則返回相應(yīng)的插值結(jié)果。method指定插值方法涉兽,如'linear'招驴、'nearest'、'next'枷畏、'previous'别厘、 'spline'。默認(rèn)方法為 'linear'拥诡。因此触趴,如果我們想要進行線性插值就很簡單氮发,代碼如下。
x = 0:2*pi; %生成[0,2*pi]之間的整數(shù)值
y = sin(x); %生成相應(yīng)的函數(shù)值
plot(x,y,"or");%繪制一下點
xx = 0:0.01:2*pi;%這個是查詢點的坐標(biāo)向量
yy = interp1(x,y,xx,'linear'); %yy就是查詢點向量對應(yīng)的函數(shù)值向量了
plot(x,y,"o",xx,yy,"r");%畫圖畫圖
xx=1.23;%只查詢一個元素也是可以的
yy = interp1(x,y,xx,'linear');%嗯冗懦,還是這樣
plot(x,y,"o",xx,yy,"or");%畫圖畫圖
嗯嗯爽冕,很簡單是吧。對了披蕉,線性插值至少需要兩個點颈畸。我們也可以看到線性插值有一個很明顯的缺點,不夠光滑嚣艇。沒辦法承冰,畢竟是直線。
分段三次Hermite(埃爾米特)插值
分段三次埃爾米特插值比分段線性插值對數(shù)據(jù)的要求更高一點兒食零。假設(shè)是[a,b]之間的互異節(jié)點困乒,且
。嗯贰谣,也就是我們不僅要知道
處對應(yīng)的函數(shù)值
娜搂,我們也需要知道
處對應(yīng)的函數(shù)導(dǎo)數(shù)值
。
因此我們對相應(yīng)的插值函數(shù)有以下三個要求:
-
在
上一階可導(dǎo)吱抚;
-
百宇;
-
在每個
上都是三次函數(shù)。
滿足以上三個條件的插值函數(shù)秘豹,我們稱之為分段三次埃爾米特插值函數(shù)携御。
可以發(fā)現(xiàn),三次埃爾米特插值相較于線性插值有兩個特點既绕。一是它不僅要求插值函數(shù)過相應(yīng)的已知點啄刹,還要求函數(shù)曲線在已知點處一階導(dǎo)數(shù)值等于原函數(shù)的導(dǎo)數(shù)值,這也是為什么三次埃爾米特在已知點處更為平滑凄贩,且與原曲線更為相近誓军。二是它使用三次多項式作為每一個小段的插值多項式,相對于線性函數(shù)疲扎,三次多項式更為平滑昵时。綜上,三次埃爾米特插值相對于線性插值椒丧,得到的函數(shù)曲線更為平滑且接近原曲線壹甥。
matlab之中用于三次埃爾米特插值的函數(shù)是,當(dāng)然也可以使用上面提到的
加上
參數(shù)瓜挽。
x = 0:2*pi; %生成[0,2*pi]之間的整數(shù)值
y = sin(x); %生成相應(yīng)的函數(shù)值
plot(x,y,"or");%繪制一下點
xx = 0:0.01:2*pi;%這個是查詢點的坐標(biāo)向量
yy = interp1(x,y,xx,'pchip'); %yy就是查詢點向量對應(yīng)的函數(shù)值向量了,注意最后的參數(shù)
plot(x,y,"o",xx,yy,"r");%畫圖畫圖
xx=1.23;%只查詢一個元素也是可以的
yy = pchip(x,y,xx);%嗯盹廷,也可以這樣
plot(x,y,"o",xx,yy,"or");%畫圖畫圖
對了,三次埃爾米特插值函數(shù)在matlab中使用時,最少需要四個插值點俄占。
三次樣條插值
所謂樣條曲線管怠,就是把一根具有彈性的細(xì)長木條(樣條)在幾個樣點處用壓鐵壓住,其余位置自由彎曲缸榄。這樣子渤弛,由樣條形成的曲線就稱之為樣條曲線。樣條曲線實際上是由分段三次曲線連接而成甚带,且在連接點處具有連續(xù)的二階導(dǎo)數(shù)她肯,從數(shù)學(xué)上加以概括就得到三次樣條的概念。
三次樣條函數(shù)相對于三次埃爾米特插值鹰贵,又增加了一些條件晴氨。假設(shè)三次樣條函數(shù)。那它除了滿足
碉输,也就是經(jīng)過已知點之外籽前,還需要滿足
,也就是每一段的端點重合敷钾。
除此之外枝哄,還需要滿足,也就是在端點處一階光滑阻荒。以及
债鸡,也就是端點處二階光滑嗦玖。我們可以看出,相對于埃爾米特插值氛魁,不僅有一階導(dǎo)數(shù)的要求稻艰,也有二階導(dǎo)數(shù)的要求汛闸。因此相對于埃爾米特插值跟匆,樣條插值得到的曲線更加光滑怪得。
以上這些等式條件,提供了個方程(可以自己數(shù)數(shù))舶掖,但如果我們需要
個三次多項式,就需要解出
個未知數(shù)尔店,也就是需要
個方程眨攘。剩下的兩個方程,我們稱之為邊界條件嚣州。
邊界條件主要有三類:
- 第一類邊界條件:給定函數(shù)在端點處的一階導(dǎo)數(shù)鲫售,即
。
- 第二類邊界條件:給定函數(shù)在端點處的二階導(dǎo)數(shù)该肴,即
情竹。當(dāng)
時,該條件稱之為自然邊界條件匀哄。
- 第三類邊界條件:若
是一個周期函數(shù)秦效,且
是一個周期雏蛮,則要求
也是一個周期函數(shù),滿足
阱州。
在matlab中挑秉,如果三次樣條插值沒有邊界條件,最常用的方法就是采用非結(jié)終止條件進行插值苔货。該條件要求第一個和第二個三次多項式的三階導(dǎo)數(shù)相同犀概,以及倒數(shù)第一個和倒數(shù)第二個三次多項式的三階導(dǎo)數(shù)值相同。使用的函數(shù)可以是夜惭,也可以是
姻灶。同樣的,至少要求四個點已知诈茧。
x = 0:2*pi; %生成[0,2*pi]之間的整數(shù)值
y = sin(x); %生成相應(yīng)的函數(shù)值
plot(x,y,"or");%繪制一下點
xx = 0:0.01:2*pi;%這個是查詢點的坐標(biāo)向量
yy = interp1(x,y,xx,'spline'); %yy就是查詢點向量對應(yīng)的函數(shù)值向量了,注意最后的參數(shù)
plot(x,y,"o",xx,yy,"r");%畫圖畫圖
xx=1.23;%只查詢一個元素也是可以的
yy = spline(x,y,xx);%嗯产喉,也可以這樣
plot(x,y,"o",xx,yy,"or");%畫圖畫圖
(一段代碼用了三次hhh)
如果存在邊界條件,則我們使用函數(shù)進行三次樣條插值若皱。
不過具體建模中镊叁,往往不會直接給出邊界條件,因此函數(shù)使用的次數(shù)最多走触。事實上晦譬,我們可以發(fā)現(xiàn)它的效果還是蠻好的。至于函數(shù)的使用互广,自行查閱啦~
此外敛腌,還有維數(shù)據(jù)插值,使用到的函數(shù)是
惫皱,這里我就不講了像樊,大家自行了解一下。
以上就是插值我想分享的全部內(nèi)容了旅敷,其實沒有太多的數(shù)學(xué)推導(dǎo)以及證明生棍,只進行了簡單的介紹以及使用。嗯媳谁,如果想知道更加詳細(xì)的內(nèi)容涂滴,例如拉格朗日插值,牛頓插值法等等晴音,還是自行學(xué)習(xí)吧~如果想知道具體的推導(dǎo)柔纵,也可以參考相應(yīng)的資料。這里我就不說了锤躁。
本來想著能把插值和擬合放在一篇的搁料,不過好像已經(jīng)寫了幾個小時了,實在是不想繼續(xù)了,那擬合就放在之后的篇章里吧郭计。hhh就這樣霸琴。
最后,關(guān)注公眾號“我是陳小白”回復(fù)“數(shù)學(xué)建模書籍”可以領(lǐng)取相關(guān)數(shù)學(xué)建模資料拣宏。我是打算放一些資源上去的沈贝,因此看到這里的同學(xué),如果有什么想要的資源勋乾,歡迎在留言區(qū)留言宋下。嗯,如果我能搜集得到就會放到公眾號上辑莫。(傾向于計算機類学歧,數(shù)據(jù)類,金融類等等……)