文章目錄
- 原理
- 使用分段Hermite插值多項式原因
- 公式
- 第一類的兩個插值積函數
- 第二類的兩個插值積函數
- 例題
- 法一
- 法二
- 代碼
- 分段 Hermite 插值的思路:
- 分段 Hermite 插值多項式的構造:
- MATLAB 實現代碼:
- 結果如圖:
- 注
- 歸一化變量的作用:
原理
使用分段Hermite插值多項式原因
對牛頓插值多項式和拉格朗日插值多項式分析的時候,我們發現當我們用高次插值多項式逼近 f ( x ) f(x) f(x)時候,會發生龍格現象,為克服這種現象,我們引入分段線性,分段二次拉格朗日插值多項式,可以看出這兩種插值函數,具有良好的一致收斂性。
但是他有個致命的缺點,呢就是它不是光滑的。即它在節點處的左右導數不相同。在插值條件中引入導數的條件,即分段Hermite插值多項式。
公式
第一類的兩個插值積函數
第二類的兩個插值積函數
如果要求插值函數具有連續性時候,我們既可以用分段拉格朗日也可以用分段Hermite,但是如果我們要求插值函數必須具有一階連續導數,來近似 f ( x ) f(x) f(x)時候,我們只能采用三次Hermite插值,而不能用三次拉格朗日插值,
例題
法一
法二
代碼
在 MATLAB 中編寫 分段 Hermite 插值多項式,可以利用給定的節點以及每個節點的函數值和導數值來構造插值多項式。分段 Hermite 插值多項式不僅通過數據點(( x_i, y_i ))進行插值,而且還通過節點的導數信息進行插值,能夠提供更平滑的插值曲線。
分段 Hermite 插值的思路:
假設給定的插值數據為:
[ x 0 , x 1 , … , x n ] [x_0, x_1, \dots, x_n] [x0?,x1?,…,xn?]
對應的函數值是:
[ y 0 , y 1 , … , y n ] [ y_0, y_1, \dots, y_n ] [y0?,y1?,…,yn?]
對應的導數值是:
[ y 0 ′ , y 1 ′ , … , y n ′ ] [ y'_0, y'_1, \dots, y'_n ] [y0′?,y1′?,…,yn′?]
Hermite 插值多項式可以通過每對相鄰的節點 ( ( x i , x i + 1 ) ) (( x_i, x_{i+1} )) ((xi?,xi+1?))構建一個二次多項式 ( H i ( x ) ) ( H_i(x) ) (Hi?(x)),而最終的插值多項式 ( P(x) ) 是這些二次多項式的分段拼接。
分段 Hermite 插值多項式的構造:
對于兩個相鄰的節點 ( ( x i , y i ) ) ( (x_i, y_i) ) ((xi?,yi?))和 ( x i + 1 , y i + 1 ) (x_{i+1}, y_{i+1}) (xi+1?,yi+1?),其對應的 Hermite 插值多項式為:
即:
H i ( x ) = ( 2 ( x ? x i ) 3 ? 3 ( x ? x i ) 2 + 1 ) y i + ( ( x ? x i ) 3 ? 2 ( x ? x i ) 2 + ( x ? x i ) ) h i + ( ? 2 ( x ? x i + 1 ) 3 + 3 ( x ? x i + 1 ) 2 ) y i + 1 + ( ( x ? x i + 1 ) 3 ? ( x ? x i + 1 ) 2 ) h i + 1 H_i(x) = (2(x - x_i)^3 - 3(x - x_i)^2 + 1) y_i + ((x - x_i)^3 - 2(x - x_i)^2 + (x - x_i)) h_i\\+ (-2(x - x_{i+1})^3 + 3(x - x_{i+1})^2) y_{i+1} + ((x - x_{i+1})^3 - (x - x_{i+1})^2) h_{i+1} Hi?(x)=(2(x?xi?)3?3(x?xi?)2+1)yi?+((x?xi?)3?2(x?xi?)2+(x?xi?))hi?+(?2(x?xi+1?)3+3(x?xi+1?)2)yi+1?+((x?xi+1?)3?(x?xi+1?)2)hi+1?
其中,$( h_i ) $和 $( h_{i+1} ) $分別是導數值 ( y i ′ ) ( y'_i ) (yi′?) 和 ( y i + 1 ′ ) ( y'_{i+1} ) (yi+1′?) 的權重。
滿足:
MATLAB 實現代碼:
x = [0, 1, 2]; % x 坐標
y = [1, 2, 0]; % y 坐標
dy = [1, -1, 2]; % 導數值
X = linspace(0, 2, 100); % 生成 100 個插值點n = length(x); % 數據點的個數m = length(X); % 插值點的個數H = zeros(1, m); % 用于存儲結果for k = 1:mxi = X(k); % 當前插值點% 計算每個分段的插值sum_val = 0;for i = 1:n-1% 構造 Hermite 插值的每一段if xi >= x(i) && xi <= x(i+1)% 計算 Hermite 插值多項式t = (xi - x(i)) / (x(i+1) - x(i)); % 歸一化變量% Hermite插值的基函數h00 = 2*t^3 - 3*t^2 + 1;h10 = t^3 - 2*t^2 + t;h01 = -2*t^3 + 3*t^2;h11 = t^3 - t^2;% 計算當前段的插值sum_val = y(i)*h00 + dy(i)*(x(i+1)-x(i))*h10 + y(i+1)*h01 + dy(i+1)*(x(i+1)-x(i))*h11;endendH(k) = sum_val;end
x = [0, 1, 2]; % x 坐標
y = [1, 2, 0]; % y 坐標
結果如圖:
H ( x ) H(x) H(x)有一階導數
注
進行歸一化不影響函數值:
t = (xi - x(i)) / (x(i+1) - x(i));
在分段 Hermite 插值多項式 中的作用是將插值點 ( x_i ) 和 ( x_{i+1} ) 之間的區間線性化,使得插值的計算變得更加簡單和規范。這一過程的主要目的是 將原始區間 ( [x_i, x_{i+1}] ) 映射到標準化的單位區間 ( [0, 1] ),便于后續的插值運算。
歸一化變量的作用:
歸一化變量 ( t = x i ? x ( i ) x ( i + 1 ) ? x ( i ) ) ( t = \frac{xi - x(i)}{x(i+1) - x(i)} ) (t=x(i+1)?x(i)xi?x(i)?) 的目的是將原始區間 ( [ x i , x i + 1 ] ) ( [x_i, x_{i+1}] ) ([xi?,xi+1?]) 轉換到標準化的區間 ( [0, 1] )。這樣做的好處是:
- 使得插值多項式的計算不依賴于原始數據的尺度或位置。
- 使得插值公式在不同區間之間的一致性得以保持,便于構建和計算 Hermite 插值多項式。