文章目录
- 原理
- 使用分段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 插值多项式。