数学建模学习笔记(三)——插值算法
插值算法簡(jiǎn)介
數(shù)據(jù)分析是在大數(shù)據(jù)時(shí)代下不可獲取的一環(huán),合理、全面地分析數(shù)據(jù),能夠使得決策者在決策時(shí)作出最為明智的決定。在數(shù)據(jù)分析過程中,常常可以使用插值算法來根據(jù)已知的數(shù)據(jù)估算出未知的數(shù)據(jù),從而模擬產(chǎn)生一些新的值來滿足要求。
一維插值
在許多插值問題中,我們常常研究的是一維插值:
設(shè)函數(shù) y=f(x)y=f(x)y=f(x) 在區(qū)間 [a,b][a, b][a,b] 上有定義,且已知在點(diǎn) a≤x0<x1<?<xn≤ba \leq x_0 < x_1 < \cdots < x_n \leq ba≤x0?<x1?<?<xn?≤b 上的值分別為:y0,y1,?,yn,y_0, y_1, \cdots, y_n,y0?,y1?,?,yn?,
若存在一簡(jiǎn)單函數(shù)P(x)P(x)P(x),使 P(xi)=yi(i=0,1,2,?,xn)P(x_i) = y_i (i = 0, 1, 2, \cdots, x_n)P(xi?)=yi?(i=0,1,2,?,xn?)則稱 P(x)P(x)P(x) 為f(x)f(x)f(x) 的插值函數(shù),點(diǎn) x0,x1,?,xnx_0, x_1, \cdots, x_nx0?,x1?,?,xn? 稱為插值節(jié)點(diǎn),包含插值節(jié)點(diǎn)的區(qū)間 [a,b][a, b][a,b] 稱為插值區(qū)間,求插值函數(shù) P(x)P(x)P(x) 的方法稱為插值法。
主要插值法
插值算法
拉格朗日插值法
?\bullet? 兩個(gè)點(diǎn):(x0,y0)(x1,y1)(x_0, y_0)(x_1, y_1)(x0?,y0?)(x1?,y1?)
可以設(shè)出插值函數(shù)為:f(x)=x?x0x0?x1y0+x?x0x1?x0y1f(x)=\frac{x-x_0}{x_0-x_1}y_0 + \frac{x-x_0}{x_1-x_0}y_1f(x)=x0??x1?x?x0??y0?+x1??x0?x?x0??y1?
?\bullet? 三個(gè)點(diǎn):(x0,y0)(x1,y1)(x2,y2)(x_0, y_0)(x_1, y_1)(x_2, y_2)(x0?,y0?)(x1?,y1?)(x2?,y2?)
可以設(shè)出插值函數(shù)為:f(x)=(x?x1)(x?x2)(x0?x1)(x0?x2)y0+(x?x0)(x?x2)(x1?x0)(x1?x2)y1+(x?x0)(x?x1)(x2?x0)(x2?x1)y2f(x) = \frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}y_0 + \frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}y_1 \\ + \frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}y_2f(x)=(x0??x1?)(x0??x2?)(x?x1?)(x?x2?)?y0?+(x1??x0?)(x1??x2?)(x?x0?)(x?x2?)?y1?+(x2??x0?)(x2??x1?)(x?x0?)(x?x1?)?y2?
以此類推,可以得出4個(gè)、5個(gè)……點(diǎn)的拉格朗日插值函數(shù)。
然而,拉格朗日插值法在平常的插值問題分析中并不常用,原因是會(huì)產(chǎn)生龍格現(xiàn)象(即多項(xiàng)式的次數(shù)越高,函數(shù)兩端的波動(dòng)便會(huì)越大,越不準(zhǔn)確)。
分段線性以及分段二次插值
顧名思義,就是將函數(shù)分為一段一段的,每一段都是用線性函數(shù)或者二次函數(shù)來進(jìn)行估計(jì)。
牛頓插值
f(x)=f(x0)+f[x0,x1](x?x0)+f[x0,x1,x2](x?x0)(x?x1)+?+f[x0,x1,?,xn?2,xn?1](x?x0)(x?x1)?(x?xn?3)(x?xn?2)+f[x0,x1,?,xn?1,xn](x?x0)(x?x1)?(x?xn?2)(x?xn?1)\begin{aligned}f(x) = &f(x_0) + f[x_0, x_1](x-x_0) \\ &+f[x_0, x_1, x_2](x-x_0)(x-x_1) + \cdots \\ &+f[x_0, x_1, \cdots, x_{n-2}, x_{n-1}](x-x_0)(x-x_1)\cdots(x-x_{n-3})(x-x_{n-2}) \\ &+f[x_0, x_1, \cdots, x_{n-1}, x_n](x-x_0)(x-x_1)\cdots(x-x_{n-2})(x-x_{n-1}) \end{aligned}f(x)=?f(x0?)+f[x0?,x1?](x?x0?)+f[x0?,x1?,x2?](x?x0?)(x?x1?)+?+f[x0?,x1?,?,xn?2?,xn?1?](x?x0?)(x?x1?)?(x?xn?3?)(x?xn?2?)+f[x0?,x1?,?,xn?1?,xn?](x?x0?)(x?x1?)?(x?xn?2?)(x?xn?1?)?
其中 f[x0,x1]f[x_0, x_1]f[x0?,x1?] 是指 f(x)f(x)f(x) 關(guān)于點(diǎn) x0,x1x_0, x_1x0?,x1? 的差商。
一階差商:f[x0,xk]=f(xk)?f(x0)xk?x0f[x_0, x_k] = \frac{f(x_k)-f(x_0)}{x_k-x_0}f[x0?,xk?]=xk??x0?f(xk?)?f(x0?)?
二階差商:f[x0,x1,x2]=f[x1,x2]?f[x0,x1]x2?x0f[x_0, x_1, x_2] = \frac{f[x_1, x_2]-f[x_0, x_1]}{x_2 - x_0}f[x0?,x1?,x2?]=x2??x0?f[x1?,x2?]?f[x0?,x1?]?
?\cdots?
k階差商:f[x0,x1,?,xk]=f[x1,?,xk?1,xk]?f[x0,x1,?,xk?1]xk?x0f[x_0, x_1, \cdots, x_k] = \frac{f[x_1, \cdots, x_{k-1}, x_{k}]-f[x_0, x_1, \cdots, x_{k-1}]}{x_k-x_0}f[x0?,x1?,?,xk?]=xk??x0?f[x1?,?,xk?1?,xk?]?f[x0?,x1?,?,xk?1?]?
但是,牛頓插值法也會(huì)存在龍格現(xiàn)象的問題。
最為常用的兩種插值方法:三次埃爾米特插值以及三次樣條插值
4.1 三次埃爾米特插值
?\bullet? 埃爾米特插值原理
設(shè)函數(shù)f(x)f(x)f(x)在區(qū)間[a,b][a, b][a,b]上有 n + 1 個(gè)互異節(jié)點(diǎn) a=x0<x1<x2<?<xn=ba=x_0 < x_1 < x_2 < \cdots < x_n=ba=x0?<x1?<x2?<?<xn?=b,定義在[a,b][a, b][a,b]上函數(shù)f(x)f(x)f(x)在節(jié)點(diǎn)上滿足:
f(xi)=yi,f′(xi)=yi′(i=0,1,2,?,n)(2n+2個(gè)條件)f(x_i)=y_i, f'(x_i)=y_i'(i=0, 1, 2, \cdots, n)(2n+2\text{個(gè)條件})f(xi?)=yi?,f′(xi?)=yi′?(i=0,1,2,?,n)(2n+2個(gè)條件)
可唯一確定一個(gè)次數(shù)不超過2n+12n+12n+1的多項(xiàng)式H2n+1(x)=H(x)H_{2n+1}(x)=H(x)H2n+1?(x)=H(x)滿足:
H(xj)=yj,H′(xj)=mj(j=0,1,?,n)H(x_j)=y_j, H'(x_j)=m_j(j=0, 1, \cdots, n)H(xj?)=yj?,H′(xj?)=mj?(j=0,1,?,n)其余項(xiàng)為:R(x)=f(x)?H(x)=f2n+2(ξ)(2n+2)!ω2n+2(x)R(x)=f(x)-H(x)=\frac{f^{2n+2}(\xi)}{(2n+2)!}\omega_{2n+2}(x)R(x)=f(x)?H(x)=(2n+2)!f2n+2(ξ)?ω2n+2?(x)
三次埃爾米特插值可在 MatlabMatlabMatlab 中調(diào)用 phipphipphip 函數(shù)進(jìn)行直接求取,詳見后面的例題。
4.2 三次樣條插值
?\bullet? 三次樣條插值條件
設(shè) y=f(x)y=f(x)y=f(x) 在點(diǎn) x0,x1,?,xnx_0, x_1, \cdots, x_nx0?,x1?,?,xn? 的值為 y0,y1,?,yny_0, y_1, \cdots, y_ny0?,y1?,?,yn?,若函數(shù) S(x)S(x)S(x) 滿足下列條件:
△\triangle△ S(xi)=f(xi)=yi,i=0,1,2,?,nS(x_i) = f(x_i) = y_i, i = 0, 1, 2,\cdots,nS(xi?)=f(xi?)=yi?,i=0,1,2,?,n;
△\triangle△ 在每個(gè)子區(qū)間 [xix_ixi?,xi+1x_{i+1}xi+1?](i=0,1,2,?,n?1i=0,1,2,\cdots,n-1i=0,1,2,?,n?1)上S(x)S(x)S(x)是三次多項(xiàng)式;
△\triangle△ S(x)S(x)S(x)在[a,b]上二階連續(xù)可微,則稱S(x)S(x)S(x)為函數(shù)f(x)f(x)f(x)的三次樣條插值函數(shù);
同樣,三次樣條插值也可在 MatlabMatlabMatlab 中調(diào)用 splinesplinespline 函數(shù)進(jìn)行直接求取,詳見后面的例題。
例題:淡水養(yǎng)殖中池塘水體質(zhì)量的評(píng)估
原始數(shù)據(jù)
三次埃爾米特插值
MatlabMatlabMatlab代碼為:
數(shù)據(jù)處理結(jié)果:
可以看到,原始數(shù)據(jù)只有15周內(nèi)奇數(shù)周的數(shù)據(jù),經(jīng)過插值過后,獲得了完整的15周池塘水體質(zhì)量的數(shù)據(jù)。
三次樣條插值
MatlabMatlabMatlab代碼為:
數(shù)據(jù)處理結(jié)果為:
同樣也獲得了15周內(nèi)完整的池塘水體質(zhì)量數(shù)據(jù)。
注意,這樣的插值方法還可以對(duì)未來進(jìn)行短期的預(yù)測(cè)。方法不同,預(yù)測(cè)結(jié)果同樣會(huì)有些差異。
如果想要深入了解插值算法,推薦
劉春鳳教授:中國大學(xué)MOOC數(shù)值計(jì)算方法
這本書。
有什么好的建議,請(qǐng)一定告訴我哦~~~
總結(jié)
以上是生活随笔為你收集整理的数学建模学习笔记(三)——插值算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基础入门(2)
- 下一篇: mysql table fetching