【数值计算方法(黄明游)】函数插值与曲线拟合(二):三次 Hermite 插值【理论到程序】

2024-07-30 10:47:46 浏览数 (1)

一、近似表达方式

  插值、拟合和投影都是常用的近似表达方式,用于对数据或函数进行估计、预测或表示。

1. 插值(Interpolation)

  指通过已知数据点之间的插值方法,来估计或推算出在这些数据点之间的数值。插值可以用于构建平滑的曲线或曲面,以便在数据点之间进行预测或补充缺失的数据。

2. 拟合(Fitting)

  指通过选择合适的函数形式和参数,将一个数学模型与已知数据点拟合得最好的过程。拟合的目标是找到一个函数,使其在数据点附近的值与实际观测值尽可能接近。拟合可以用于数据分析、曲线拟合、回归分析等领域。

3. 投影(Projection)

  指将一个向量或一组向量映射到另一个向量空间或子空间上的过程。在线性代数中,投影可以用来找到一个向量在另一个向量或向量空间上的投影或投影分量。投影可以用于降维、数据压缩、特征提取等领域,以及计算机图形学中的投影变换。

二、Lagrange插值

【数值计算方法(黄明游)】函数插值与曲线拟合(一):Lagrange插值【理论到程序】    Lagrange插值是一种用于通过已知数据点构造一个多项式函数的方法基于拉格朗日插值多项式的原理(该多项式通过每个数据点并满足相应的条件),拉格朗日插值可用于估计数据点之间的值,而不仅仅是在给定数据点上进行插值。

1. 拉格朗日插值方法

  1. 拉格朗日基函数: 对于给定的插值节点
x_0, x_1, ldots, x_n

,拉格朗日插值使用如下的拉格朗日基函数:

L_i(x) = prod_{j=0, jneq i}^{n} frac{x - x_j}{x_i - x_j}
  1. 插值条件: 拉格朗日插值要求插值多项式满足插值条件:对所有
i

P(x_i) = y_i
  1. 插值多项式: 构造插值多项式为:
P(x) = sum_{i=0}^{n} y_i L_i(x)

  通过这种方法,可以在给定的数据点上获得一个平滑的插值函数,使得在这些数据点之间的任何位置上都可以估计函数的值。Lagrange插值在数据点较少或数据点之间存在较大间隔时可能会出现一些问题,例如插值多项式可能会产生振荡现象,这被称为Runge现象

2. Lagrange插值公式

L_i(x) = prod_{j=0, jneq i}^{n} frac{x - x_j}{x_i - x_j}
P(x) = sum_{i=0}^{n} y_i L_i(x)
a. 线性插值(n=1)
P(x) = y_0 frac{(x - x_1)}{(x_0 - x_1)} y_1 frac{(x - x_0)}{(x_1 - x_0)}
b. 抛物插值(n=2)
P(x) = y_0 frac{(x - x_1)(x - x_2)}{(x_0 - x_1)(x_0 - x_2)} y_1 frac{(x - x_0)(x - x_2)}{(x_1 - x_0)(x_1 - x_2)} y_2 frac{(x - x_0)(x - x_1)}{(x_2 - x_0)(x_2 - x_1)}

三、Newton插值

【数值计算方法(黄明游)】函数插值与曲线拟合(二):Newton插值【理论到程序】

四、三次 Hermite 插值

1. 天书

2. 人话

  我们有两个插值节点

x_0

x_1

,已知在这些节点上的函数值

y_0 = f(x_0)

y_1 = f(x_1)

和导数值

m_0 = f'(x_0)

m_1 = f'(x_1)

。要求一个三次多项式

H(x)

,满足以下插值条件:

H(x_0) = y_0

,即在

x_0

节点上的函数值相等。

H'(x_0) = m_0

,即在

x_1

节点上的导数值相等。

H(x_1) = y_1

,即在

x_1

节点上的函数值相等。

H'(x_1) = m_1

,即在

x_1

节点上的导数值相等。

这样的插值问题可以通过构造一个三次多项式

H(x)

来解决。一般而言,Hermite插值的基本形式为:

H(x) = h_0(x) y_0 h_1(x) m_0 h_2(x) y_1 h_3(x) m_1

  其中

h_0(x), h_1(x), h_2(x), h_3(x)

是一组基函数,它们的形式可以通过需求的导数条件来确定。由于我们要求满足函数值和一阶导数值的条件,基函数的形式可以通过Lagrange插值多项式的导数来得到。

待完善……

3. 例题

4. python实现

代码语言:javascript复制
def hermite_interpolation(x, y, m, xi):
    """
    三次 Hermite 插值

    Parameters:
    - x: 插值节点的 x 坐标
    - y: 插值节点的函数值
    - m: 插值节点的一阶导数值
    - xi: 要进行插值的点的 x 坐标

    Returns:
    - interpolated_value: 在 xi 处的插值结果
    """
    t = (xi - x[0]) / (x[1] - x[0])

    h0 = (1 - 3 * t**2   2 * t**3)
    h1 = t * (1 - t)**2
    h2 = xi * (1 - t)**2
    h3 = xi**2 * (3 - 2 * t)

    interpolated_value = h0 * y[0]   h1 * y[1]   h2 * m[0]   h3 * m[1]

    return interpolated_value


# 示例数据
x_nodes = [1, 2]
y_values = [2, 3]
derivatives = [1, 2]
xi_value = 1.5

# 进行三次 Hermite 插值
interpolated_result = hermite_interpolation(x_nodes, y_values, derivatives, xi_value)

# 打印插值结果
print("插值结果:", interpolated_result)

输出:

代码语言:javascript复制
插值结果: 10.75

0 人点赞