【数値計算法(黄明佑)】関数補間とカーブフィッティング(2):3次エルミート補間【理論からプログラムまで】


1. 近似式

  補間、フィッティング、射影は、データや関数を推定、予測、または表現するために一般的に使用される近似式です。

1.補間

  既知のデータ ポイント間の値を、これらのデータ ポイント間を補間することによって推定または導出することを指します。補間を使用すると、滑らかな曲線や曲面を構築して、データ ポイント間の予測を行ったり、欠落しているデータを補ったりすることができます。

2.フィッティング

  適切な関数形式とパラメータを選択することによって、数学的モデルを既知のデータ点に最適に適合させるプロセスを指します。フィッティングの目的は、データ ポイント付近の値が実際の観測値にできるだけ近い関数を見つけることです。フィッティングは、データ分析、カーブ フィッティング、回帰分析などの分野で使用できます。

3. 投影

  ベクトルまたはベクトルの集合を別のベクトル空間または部分空間にマッピングするプロセスを指します。線形代数では、射影を使用して、ベクトルの別のベクトルまたはベクトル空間への射影または射影された成分を見つけることができます。投影は、コンピュータ グラフィックスの投影変換だけでなく、次元削減、データ圧縮、特徴抽出などの分野でも使用できます。

2. ラグランジュ補間

【数値計算法(黄明佑)】関数補間とカーブフィッティング(1):ラグランジュ補間【理論からプログラムへ】
   ラグランジュ補間は使用される手法です < a i=2>既知のデータ ポイントを使用して多項式関数を構築する方法ラグランジュ補間多項式の原理に基づく (多項式は各データ ポイントを通過し、対応する条件を満たす)、ラグランジュ補間は、特定のデータ ポイントで単に補間するのではなく、データ ポイント間の値を推定するために使用できます。

1. ラグランジュ補間法

  1. ラグランジュ基底関数: 指定された内挿ノードの x 0 , x 1 , … , x n x_0, x_1, \ ldots, x_n < /span>バツ0 バツ1 バツn , ラグランジュ補間では、次のラグランジュ基底関数が使用されます。

    L i ( x ) = ∏ j = 0 , j ≠ i n x − x j x i − x j L_i(x) = \prod_{j=0, j\neq i}^{n} \frac{x - x_j}{x_i - x_j }Li (x)=j=0j=in バツi バツj バツバツj

  2. 内挿条件: ラグランジュ内挿では、内挿多項式が内挿条件を満たす必要があります。すべての i i i P ( x i ) = y i P(x_i) = y_i P(xi )=そしてi

  3. 内挿多項式: 次のように内挿多項式を構築します。 P ( x ) = ∑ i = 0 n y i L i ( x ) P(x ) = \sum_{i=0}^{n} y_i L_i(x) P(x)=i=0n そしてi Li (x)

  この方法では、与えられたデータ点で滑らかな補間関数が得られるので、これらのデータ点の間の任意の位置で関数の値を推定することができます。データ ポイントが少ない場合、またはデータ ポイント間のギャップが大きい場合、ラグランジュ内挿では問題が発生することがあります。たとえば、内挿多項式が振動を引き起こす可能性があります。これはルンゲ現象と呼ばれます。 。

2. ラグランジュ補間式

L i ( x ) = ∏ j = 0 , j ≠ i n x − x j x i − x j L_i(x) = \prod_{j=0, j\neq i}^{n} \frac{x - x_j}{x_i - x_j }Li (x)=j=0j=in バツi バツj バツバツj P ( x ) = ∑ i = 0 n y i L i ( x ) P(x) = \sum_{i=0}^{n} y_i L_i(x)P(x)=i=0n そしてi Li (x)

a. 線形補間 (n=1)

P ( x ) = y 0 ( x − x 1 ) ( x 0 − x 1 ) + y 1 ( x − x 0 ) ( x 1 − x 0 ) P(x) = y_0 \frac{(x - x_1) }{(x_0 - x_1)} + y_1 \frac{(x - x_0)}{(x_1 - x_0)}P(x)=そして0 (x0 バツ1 )(xバツ1 ) +そして1 (x1 バツ0 )(xバツ0 )

b. 放物線補間 (n=2)

P ( x ) = y 0 ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) + y 1 ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) + y 2 ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) 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)}P(x)=そして0 (x0 バツ1 )(x0 バツ2 )(xバツ1 )(xバツ2 ) +そして1 (x1 バツ0 )(x1 バツ2 )(xバツ0 )(xバツ2 ) +そして2 (x2 バツ0 )(x2 バツ1 )(xバツ0 )(xバツ1 )

3. ニュートン補間

【数値計算法(黄明佑)】関数補間とカーブフィッティング(2):ニュートン補間【理論からプログラムまで】

4. 3次エルミート補間

1. 天の書

ここに画像の説明を挿入します
ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 人間の言語

  2 つの補間ノードがあります x 0 x_0 バツ0 x 1 x_1 バツ1 、これらのノードの関数値は既知です y 0 = f ( x 0 ) y_0 = f(x_0) そして0 =f(x0 ) y 1 = f ( x 1 ) y_1 = f(x_1) そして1 =f(x1 ) 和导数值 m 0 = f ' ( x 0 ) m_0 = f'(x_0) メートル0 =f'(x0 ) m 1 = f ' ( x 1 ) m_1 = f'(x_1) メートル1 =f'(x1 )。 3 次多項式が必要です H ( x ) H(x) H(x),满足以下插值条件:

  1. H ( x 0 ) = y 0 H(x_0) = y_0H(x0 )=そして0 ,即在 x 0 x_0 バツ0 ノード上の関数値は等しいです。
  2. H ' ( x 0 ) = m 0 H'(x_0) = m_0H'(x0 )=メートル0 ,即在 x 1 x_1 バツ1 ノードでの微分値は等しいです。
  3. H ( x 1 ) = y 1 H(x_1) = y_1H(x1 )=そして1 ,即在 x 1 x_1 バツ1 ノード上の関数値は等しいです。
  4. H ' ( x 1 ) = m 1 H'(x_1) = m_1H'(x1 )=メートル1 ,即在 x 1 x_1 バツ1 ノードでの微分値は等しいです。

このような補間問題は、3 次多項式を作成することで解決できます H ( x ) H(x) H(x) を解決します。一般に、エルミート補間の基本形式は次のとおりです。

H ( x ) = h 0 ( x ) y 0 + h 1 ( x ) m 0 + h 2 ( x ) y 1 + h 3 ( x ) m 1 H(x) = h_0(x) y_0 + h_1(x ) m_0 + h_2(x) y_1 + h_3(x) m_1H(x)=h0 (x)y0 +h1 (x)m0 +h2 (x)y1 +h3 (x)m1

  其中 h 0 ( x ) , h 1 ( x ) , h 2 ( x ) , h 3 ( x ) h_0(x), h_1(x), h_2(x), h_3(x) h0 (x),h1 (x),h2 (x),h3 (x) は、導関数条件を介してその形式を渡すことができる一連の基底関数です。要件を確認してください。関数値と一次微分値の条件を満たす必要があるため、基底関数の形はラグランジュ補間多項式の導関数によって得ることができます。

改善されるべき...

3. 質問例

ここに画像の説明を挿入します

4.Pythonの実装

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)

出力:

插值结果: 10.75

おすすめ

転載: blog.csdn.net/m0_63834988/article/details/134915332