常用演算法 插值演算法

coyy發表於2024-07-12

零、寫在前面

本文主要講述三次Hermite插值和三次樣條插值。

對於一維插值演算法沒有詳細介紹,只是說明了彼此之間的區別和特點,並作出選擇。

隨後擴充了n維插值演算法,只作為了解。

最後,由於插值演算法本身的特性,其也可以用來預測。

一、作用

插值演算法,預測模型。

在建模過程中,需要一定量的資料作為分析的支撐,但有時資料較少,此時便需要使用一些數學手段,模擬產生一些可靠的新資料來滿足需求。

二、演算法

2.1介紹

設函式在上有定義,且定義域記憶體在n+1個點。

若恰好穿過n+1個點,則稱其為插值函式,不難發現,插值函式不唯一。

為插值節點,包含插值節點的稱作插值區間,即。

求出的過程稱之為插值法。

2.2詳細講述一維插值法

2.2.1runge現象(一切問題的本源)

runge現象,是指高次插值函式在邊界部分會出現震盪現象,其原因是次數太高會放大誤差。

2.2.2插值法的分類

拉格朗日插值,牛頓插值,分段插值,埃爾米特插值(Hermite),分段三次埃爾米特插值,三次樣條插值。

2.2.3插值法的選擇

其中建模過程中常用的是分段三次埃爾米特插值和三次樣條插值。

Q:這時候就有人要問了,作者作者,為什麼是這樣啊?

A:首先,所有的高次插值函式都會發生runge現象,這樣大規模的震盪是我們不希望看到的。

Q:哪些插值法會發生runge現象?

A:拉格朗日,牛頓,埃爾米特都會發生runge現象,因為他們本質是多項式插值函式,都是高次的,這三個插值法的表示式和原理我這裡不展開講,因為用不上。

Q:那麼怎麼避免發生runge現象?

A:runge現象發生在邊界,邊界越寬,震盪幅度越大,那麼我們把邊界變小,那就是分段插值了,與其說分段插值是插值法,更不如說是一種思想,就是把插值區間切成很多小段,大幅度緩解runge現象,然後在這些小段上放上合適的函式。所以分段插值是解決runge現象的一個好辦法。

Q:為什麼只有分段的埃爾米特插值(即分段三次埃爾米特插值),沒有分段拉格朗日插值和分段牛頓插值?

A:事實上也有分段拉格朗日插值和分段牛頓插值,但是為什麼不說,本質上是這倆插值是不夠完美的。因為拉格朗日插值和牛頓插值是源於函式值的,就是零階導數,這兩個插值法只關注零階導數,但對變化趨勢,即一階導數是欠缺考慮的。而埃爾米特插值法受到了零階導數和一階導數的約束,如此得到的插值函式是保留被插值函式的性態(可以膚淺的理解為一階導數)的,更接近完美,當然不是完美本身。所以我們在建模過程中會使用分段三次埃爾米特插值。

Q:什麼是三次樣條插值?

A:是分段三次埃爾米特插值+在插值區間上二階連續可微,其本質是三次多項式。由於多加了一個二階連續可微的條件,所以三次樣條插值是比分段三次埃爾米特插值更接近完美的存在。

S:總結

客觀出現runge現象,為了緩解runge現象,我們提出使用分段插值,分段插值具體要和哪個插值法結合,為了保留被插值函式的性態,我們使用埃爾米特插值,因為它保留了被插值函式的一階導數。

三、程式碼

3.1分段三次埃爾米特插值

%MATLAB內建函式
%分段三次Hermite插值多項式PCHIP

p = pchip(x,y,new_x)
%x已知樣本點的橫座標  y已知樣本點的縱座標 new_x要插入處對應的橫座標

%eg:
x = -pi:pi;%不寫步長預設1為步長,所以,-pi:pi=-pi:1:pi
y =  sin(x);
new_x = -pi:0.1:pi;  %0.1是步長
p = pchip(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')

3.2三次樣條插值

%MATLAB內建函式
%三次樣條插值spline
p = spline(x,y,new_x)
%x已知樣本點的橫座標  y已知樣本點的縱座標 new_x要插入處對應的橫座標

%eg:
x = -pi:pi;%不寫步長預設1為步長,所以,-pi:pi=-pi:1:pi
y =  sin(x);
new_x = -pi:0.1:pi;  %0.1是步長
p = spline(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')

四、擴充:n維插值演算法(瞭解)

4.1程式碼

p =  interpn(x1,x2,...,xn,y,new_x1,new_x2,...,new_xn,'methond')
%x1,x2,...,xn是已知樣本點的橫座標
%y是已知的樣本點的縱座標
%new_x1,new_x2,...,new_xn是要插入點的橫座標
%method是待選擇的插值方法
%linear線性插值,預設選項
%cubic三次插值
%spline三次樣條插值(最優選)
%nearest最鄰近插值

五、用於預測(創新)

前面在“一、作用”處提到過插值演算法是用來模擬產生一些可靠的新資料來滿足需求的,其實也就是預測嘛。
事實上,三次樣條插值演算法比灰色預測在理論上更完美。

% 人口預測
population=[133126,133770,134413,135069,135738,136427,137122,137866,138639, 139538];
year = 2009:2018;
p1 = pchip(year, population, 2019:2021)  %分段三次埃爾米特插值預測
p2 = spline(year, population, 2019:2021) %三次樣條插值預測
figure;
plot(year, population,'o',2019:2021,p1,'r*-',2019:2021,p2,'bx-')
legend('樣本點','三次埃爾米特插值預測','三次樣條插值預測','Location','SouthEast')

相關文章