一般用語#
用語集#
スプラインを使用して [a, b) 区間で関数 f(x) を補間する必要があるとします。
[a, b) を n 個の点 \(x_i\) で部分区間に分割します。これを分割点または単にパーティションと呼びます。これらの点 (\(y_i = f(x_i), i=1,\cdots,n\)) における関数値も与えられます。
スプラインは、次の多項式で表現できる場合、k 次を持ちます。
スプラインは \([x_i, x_{i+1}), i=1,\cdots,n-1\) サブ区間上に構築されます。したがって、各サブ区間には次の多項式が存在します。
\(c_{j,i}, j=1,\cdots,k, i=1,\cdots,n\) はスプライン係数と呼ばれます。
関数は [a, b) の点で補間されます。このようなポイントは補間サイトまたは単にサイトと呼ばれます。サイトはパーティション・ポイントと一致することも一致しないこともあります。
データ適合コンポーネントにおける数学表記#
コンセプト |
数学表記 |
|---|---|
パーティション |
\(\left\{ x_i \right\}_{i=1,\cdots,n}\)、ここで \(a = x1 < x2< \cdots < xn = b\).. |
均一なパーティション |
次の条件を満たすパーティション \(\left\{ x_i \right\}_{i=1,\cdots,n}\) : \(x_{i+1} - x_i = x_i - x_{i-1}, i=2,\cdots,n-1\) |
準均一パーティション |
定数 説明: \(M = max_{i=1,\cdots,n-1} (\Delta_i)\)、 \(m = min_{i=1,\cdots,n-1} (\Delta_i)\)、 \(\Delta_i = x_{i+1} - x_i\) |
適合される次元 |
\(f(x) = (f_1(x),\cdots, f_p(x))\) です。 |
関数 |
\(F^{(k)}(t)\) です。 |
関数 |
シーケンス \(\left\{ x_i \right\}_{i=1,\cdots,n}\) 内で |
関数 |
\(\left[ x_i,\cdots, x_{i + k} \right]f\)。 特に次を考慮します、 \(\left[ x_1 \right]f = f(x_1)\)、 \(\left[ x_1, x_2 \right] f = (f(x_1) - f(x_2)) / (x_1 - x_2)\)。 |
データ適合コンポーネントにおけるヒント#
インテル® oneMKL のデータ適合コンポーネントは、パーティション、関数値、係数、補間サイトに対する “ヒント” を指定する方法を提供します。
パーティションのヒント#
次がサポートされます。
不均一。
準均一。
均一。
構文
enum class partition_hint {
non_uniform,
quasi_uniform,
uniform
};関数値のヒント#
\(\left\{ x_i \right\}_{i=1,\cdots,nx}\) をパーティション、\(\left\{ f_j(x) \right\}_{j=1,\cdots,ny}\) をベクトル値関数とします。関数値は、nx * ny 要素を持つ 1 次元配列に格納されます。行優先と列優先の 2 つの異なるレイアウトが可能です。
行優先レイアウト関数の場合、値は次のように保存されます。
\(\left\{ f_{j,i} \right\}_{j=1,\cdots,ny, i=1,\cdots,nx}\) を
i番目の分割点、j番目の関数に対応する係数値とします。列優先の場合:
\(\left\{ f_{i,j} \right\}_{i=1,\cdots,nx, j=1,\cdots,ny}\) を
i番目の分割点、j番目の関数に対応する係数値とします。
次のヒントがサポートされます。
行優先
列優先
構文
enum class function_hint {
row_major,
col_major
};係数のヒント#
\(\left\{ x_i \right\}_{i=1,\cdots,nx}\) をパーティション、\(\left\{ f_j(x) \right\}_{j=1,\cdots,ny}\) をベクトル値関数とします。3 次スプラインを構築してみましょう。補間間隔と関数値ごとに 4 つの係数が必要になります。係数は、4 * (nx - 1) * ny 要素を持つ 1 次元配列に格納されます。
行優先の場合:
\(\left\{ c_{j,i,k} \right\}_{j=1,\cdots,ny, i=1,\cdots,nx-1, k=1,\cdots,4}\) を
i番目の分割点、j番目の関数に対応する係数値とします。列優先の場合:
\(\left\{ c_{i,j,k} \right\}_{i=1,\cdots,nx-1, j=1,\cdots,ny, k=1,\cdots,4}\) を
i番目の分割点、j番目の関数に対応する係数値とします。
次がサポートされれます。
行優先
構文
enum class coefficient_hint {
row_major
};サイトのヒント#
次がサポートされます。
不均一。
均一。
ソートされた。
構文
enum class site_hint {
non_uniform,
uniform,
sorted
};補間結果のヒント#
\(\left\{ f_j(x) \right\}_{j=1,\cdots,ny}\) はベクトル値関数、\\(\left\{ s_i \right\}_{i=1,\cdots,ns}\) はサイト、d は計算する必要のある導関数の数 (補間値を含む) とします。したがって、補間結果を格納するメモリーのサイズは、nsite * ny * d 要素になります。
6 つの異なるレイアウトが可能です:
functions-sites-derivatives (機能-サイト-派生)
\(\left\{ r_{j,i,k} \right\}_{j=1,\cdots,ny, i=1,\cdots,nsite, k=1,\cdots,d}\) を
i番目のサイト、j番目の関数、kh番目の導関数に対応する補間結果とします。functions-derivatives-sites (機能-派生-サイト)
\(\left\{ r_{j,k,i} \right\}_{j=1,\cdots,ny, k=1,\cdots,d, i=1,\cdots,nsite}\) を
i番目のサイト、j番目の関数、k番目の導関数に対応する補間結果とします。sites-functions-derivatives (サイト-関数-派生)
\(\left\{ r_{i,j,k} \right\}_{i=1,\cdots,nsite, j=1,\cdots,ny, k=1,\cdots,d}\) を
i番目のサイト、j番目の関数、k番目の導関数に対応する補間結果とします。sites-derivatives-functions (サイト-派生-関数)
\(\left\{ r_{i,k,j} \right\}_{i=1,\cdots,nsite, k=1,\cdots,d, j=1,\cdots,ny}\) を
i番目のサイト、j番目の関数、k番目の導関数に対応する補間結果とします。derivatives-functions-sites (派生-関数-サイト)
\(\left\{ r_{k,j,i} \right\}_{k=1,\cdots,d, j=1,\cdots,ny, i=1,\cdots,nsite}\) を
i番目のサイト、j番目の関数、k番目の導関数に対応する補間結果とします。derivatives-sites-functions (派生-サイト-関数)
\(\left\{ r_{k,i,j} \right\}_{k=1,\cdots,d, i=1,\cdots,nsite, j=1,\cdots,ny}\) を
i番目のサイト、j番目の関数、k番目の導関数に対応する補間結果とします。
次がサポートされます。
functions-sites-derivatives (機能-サイト-派生)
functions-derivatives-sites (機能-派生-サイト)
sites-functions-derivatives (サイト-関数-派生)
sites-derivatives-functions (サイト-派生-関数)
構文
enum class interpolate_hint {
funcs_sites_ders,
funcs_ders_sites,
sites_funcs_ders,
sites_ders_funcs
};デリバティブのヒント#
interpolate 関数中に計算する必要がある微分次数を選択するため、次のヒントが追加されます。
補間値のみを計算する
スプライン多項式の 1 次導関数のみを計算する
スプライン多項式の 2 次導関数のみを計算する
スプライン多項式の 3 次導関数のみを計算する
構文
enum class derivatives {
zero,
first,
second,
third
};operator| は、interpolate によって計算される導関数の順序の組み合わせを作成するためオーバーロードされます。
例
補間値、1 次導関数、3 次導関数を計算する必要があると仮定します。interpolate に渡されるビットマスクを作成するには、次のものが必要です:
std::bitset<32> bit_mask = derivatives::zero | derivatives::first | derivatives::third;境界条件のタイプ#
一部のタイプのスプラインでは境界条件を設定する必要があります。次のタイプがサポートされます。
自由端 (\(f^{(2)}(x_1) = f^{(2)}(x_n) = 0\))。
周期的。
1 次導関数。
2 次導関数。
構文
enum class bc_type {
free_end,
first_left_der,
first_right_der,
second_left_der,
second_right_der,
periodic
};注
1 次導関数と 2 次導関数のタイプは、左の境界と右の境界に設定する必要があります。
自由端では値を設定する必要はありません。