前言
插值不僅僅用在數(shù)值積分,更是有限元和譜元法的基礎(chǔ)睡腿!在多種多樣的插值方法中康谆,首先推薦的是分段線性(拉格朗日)插值,在后文我們就會(huì)看到它的通用性和近似的精確性嫉到。在開始之間,要首先明確"插值與擬合"的區(qū)別:
- 插值:尋找一個(gè)能反映函數(shù)
特性月洛,且形式簡單何恶、性質(zhì)良好的函數(shù)
來"近似"!必須滿足的條件:必過一系列插值點(diǎn)嚼黔。
- 擬合:同樣是為了"近似"原函數(shù)
细层,并反映其總體趨勢惜辑。但是擬合沒有強(qiáng)制必須過哪些點(diǎn)。
多項(xiàng)式插值原理
一句話總結(jié):拉格朗日插值疫赎,就是用"一系列多項(xiàng)式相加"來近似原函數(shù)盛撑。即:
上式中的就叫做"原函數(shù)的插值多項(xiàng)式",對應(yīng)的方法就是"多項(xiàng)式插值法"捧搞!已經(jīng)證明:插值多項(xiàng)式具有"存在性"和"唯一性"抵卫,因此可以放心使用。各種不同的插值方法胎撇,只是實(shí)現(xiàn)的方式不同介粘,但是原理都是求解那唯一的插值多項(xiàng)式。
拉格朗日插值
一階拉格朗日插值:共2個(gè)插值節(jié)點(diǎn)晚树,這2點(diǎn)間(都經(jīng)過)用直線段代替姻采;
二階拉格朗日插值:共3個(gè)插值節(jié)點(diǎn),這2點(diǎn)間(都經(jīng)過)用二次函數(shù)代替爵憎;
n階拉格朗日插值:共n+1個(gè)插值節(jié)點(diǎn)慨亲,這n+1點(diǎn)間(都經(jīng)過)用n次函數(shù)代替刑棵。
規(guī)律:拉格朗日插值階數(shù) = 基函數(shù)個(gè)數(shù) = 區(qū)間分段總數(shù) = 總插值節(jié)點(diǎn)數(shù) - 1
下面先給出一階和二階的公式:
拉格朗日插值 | 2點(diǎn)一階(一次多項(xiàng)式) | 3點(diǎn)二階(二次多項(xiàng)式) |
---|---|---|
插值節(jié)點(diǎn) | ||
基函數(shù) |
|
|
插值函數(shù) | ||
說明 | 每2點(diǎn)間有2個(gè)基函數(shù) | 每3點(diǎn)間有3個(gè)基函數(shù) |
下面給出n階的插值基函數(shù)公式:
但是录煤,以上的這3種方法都不能用!一階和二階精度太低了嚎,n階("滿配"——有幾個(gè)插值點(diǎn)就用幾階多項(xiàng)式去近似)會(huì)出現(xiàn)"過度擬合"歪泳,也就是Runge現(xiàn)象(稍微復(fù)雜一點(diǎn)呐伞、有一些彎曲變換的函數(shù)在高階近似都會(huì)出現(xiàn)):
注意一點(diǎn):龍格現(xiàn)象都大的誤差/影響趟径,在函數(shù)的兩端鞍历!即圖中函數(shù)兩端的藍(lán)圈劣砍。
拉格朗日插值節(jié)點(diǎn)的選取
一般情況下,插值節(jié)點(diǎn)都是區(qū)間的等分點(diǎn)香嗓;但事實(shí)上靠娱,插值節(jié)點(diǎn)的選取完全可以任意像云!可以不遵循任何分布的規(guī)律蚂夕!一般情況下對區(qū)間的等分或等比劃分婿牍,只是為了編程方便而已等脂!本文采取的就是均分的情況。但是在有限元和譜元法中搏屑,一定不會(huì)再用均分了2桥铩R值场底靠!
在強(qiáng)調(diào)一遍:拉格朗日的插值節(jié)點(diǎn)是可以任意分布的暑中!
分段線性拉格朗日插值
當(dāng)插值點(diǎn)很多的時(shí)候鲫剿,上面的方法都不能用灵莲!此時(shí)我們最好的工具就是"分段線性拉格朗日插值"政冻!即:即使插值節(jié)點(diǎn)再多,每2個(gè)相鄰插值點(diǎn)間用一階拉格朗日插值汽摹,然后每一段加起來(分段函數(shù)表示也行)即可逼泣。這才是實(shí)際中會(huì)用到的筒溃。
下面給出分段線性插值的基函數(shù)公式:
基函數(shù)的圖像為:
我們發(fā)現(xiàn):各個(gè)基函數(shù)(一階/直線),它們的值域都是(這是一定的),并且斜率一樣(這不一定莺治,這里因?yàn)閰^(qū)間是等分的谣旁,所以各基函數(shù)的分母都是一樣的)。這一堆看似平凡砌们,并且值域和原函數(shù)的值域相差甚遠(yuǎn)的一群線性基函數(shù)浪感,怎么會(huì)拼湊在一起就能近似原函數(shù)呢?
因?yàn)椋好恳粋€(gè)基函數(shù)前面都會(huì)乘以一個(gè)揭斧,這個(gè)必過的插值點(diǎn)的y值與對應(yīng)的基函數(shù)合作峻堰,就可以把基函數(shù)的值給拉起來捐名!拉到和原函數(shù)一樣的高度镶蹋。
注意:中比如
,同樣的標(biāo)志
是有2個(gè)不同的表達(dá)式的U纭G砬弧踱葛!即:
根據(jù)公式可能不太好理解尸诽,只需記住其內(nèi)涵——每2個(gè)相鄰插值點(diǎn)間用一階拉格朗日插值即可性含。
實(shí)際操作,我們一般用分段函數(shù)表示叠萍。
下面給出matlab實(shí)現(xiàn)分段線性拉格朗日插值:
clear; clc;
xnum = [1 2 2.3 5.1 6.2 6.8 8 8.4 9.1];
ynum = sqrt(xnum); % 針對的sqrt(x)的函數(shù),其他函數(shù)都同理
n = length(xnum);
syms x L;
L_tmp = sym(zeros(1,n-1));
% 每一段(兩個(gè)相鄰點(diǎn))拉格朗日插值直線:
for m = 1:n-1
l0 = (x-xnum(m+1))/(xnum(m)-xnum(m+1));
l1 = (x-xnum(m))/(xnum(m+1)-xnum(m));
L_tmp(m) = ynum(m)*l0 + ynum(m+1)*l1;
end
% 分段函數(shù)做圖沒有問題:就是一段一段畫而已
figure(1);
for m = 1:n-1
x = [xnum(m),xnum(m+1)];
y = double(subs(L_tmp(m)));
plot(x,y);
hold on;
end
grid on;
% 原始函數(shù)圖像(畫到一起)
x1 = xnum(1):0.1:xnum(n);
y1 = sqrt(x1);
plot(x1,y1,'--k');
title('分段線性近似y=sqrt(x)函數(shù)');
xlabel('x'); ylabel('y');
效果如下:
其他插值方法
牛頓插值苛谷、埃爾米特插值(需要求一階導(dǎo)數(shù))格郁、三次樣條插值等独悴。我們最常用的刻炒,以及后面數(shù)值積分的各種方法落蝙,都是基于分段線性拉格朗日插值的!
所有插值方法的核心思路:用一個(gè)簡單的多項(xiàng)式去替代原函數(shù)移迫!要想提高插值函數(shù)近似的精度,只要增加插值節(jié)點(diǎn)邪媳。
所有插值方法的重要細(xì)節(jié):插值點(diǎn)完全可以是隨意分布的雨效!從未要求一定是區(qū)間的等分或等比點(diǎn)废赞。