|
|
◆ Pchbs()
| Sub Pchbs |
( |
N As |
Long, |
|
|
X() As |
Double, |
|
|
F() As |
Double, |
|
|
D() As |
Double, |
|
|
Knotyp As |
Long, |
|
|
Nknots As |
Long, |
|
|
T() As |
Double, |
|
|
Bcoef() As |
Double, |
|
|
Ndim As |
Long, |
|
|
Kord As |
Long, |
|
|
Info As |
Long, |
|
|
Optional Idxfd As |
Long = 0, |
|
|
Optional Incfd As |
Long = 1 |
|
) |
| |
区分3次エルミートからB-スプラインへの変換
- 目的
- 本ルーチンは, N, X(), F()およびD()により定められる区分3次エルミート関数のB-スプライン表現を求める.
出力は関数のB-スプライン表現, すなわち Nknots, T(), Bcoef(), Ndim および Kord である.
入力となる区分3次エルミート関数は本パッケージ内の他のルーチンで計算されたと仮定し, 入力値 N, X() および Incfd の一部のチェックは行わない.
制限および仮定事項は次のとおりである.
- N >= 2 (正しくなければエラーを返す)
- X(i) < X(i+1), i = 0〜n-1 (チェックしない)
- Incfd > 0 (正しくなければエラーを返す)
- Knotyp <= 2 (正しくなければエラーを返す)
- (*) Nknots = Ndim + 4 = 2*N + 4 (正しくなければエラーを返す)
- (*) T(2*k + 1) = T(2*k) = X(k), k = 0〜n-1 (チェックしない)
(*): Knotyp < 0 の場合のみ
- 引数
-
| [in] | N | データ点数. (N >= 2) |
| [in] | X() | 配列 X(LX - 1) (LX >= N)
独立変数値. X()の要素は昇順でなければならない. |
| [in] | F() | 配列 F(LF - 1) (LF >= Incfd*(N - 1) + 1)
関数の値. F(Idxfd + I*Incfd)がX(I)に対応する値である (I = 0〜N-1). |
| [in] | D() | 配列 D(LD - 1) (LD >= Incfd*(N - 1) + 1)
微分係数の値. D(Idxfd + I*Incfd)がX(I)に対応する値である (I = 0〜N-1). |
| [in] | Knotyp | ノットの並びを制御するフラグ.
各Xにおいて多重ノットを挿入し, Knotypの値に従って端のノット対を設定することによりノットの並びT()を構成する.
= 0: X(0)およびX(N-1)を多重度4のノットにする.
= 1: 一番端の小区間長を繰り返す.
T(0) = T(1) = X(0) - (X(1) - X(0))
T(M + 3) = T(M + 2) = X(N - 1) + (X(N - 1) - X(N - 2))
= 2: 境界ノットを周期的におく.
T(0) = T(1) = X(0) - (X(N - 1) - X(N - 2))
T(M + 3) = T(M + 2) = X(N - 1) + (X(1) - X(0))
ただし, M = Ndim = 2 * N.
負の値が入力された場合, NknotsとT()は前回の呼び出しで設定されているとみなす. 本オプションはパラメトリック曲線としての使い方の際の効率化のために提供されている. |
| [in,out] | Nknots | ノット数.
[in] Knotyp < 0 の場合: Nknotsに入力された値が Ndim+4 に等しくなければエラーを返す.
[out] Knotyp >= 0の場合: Nknotsは本ルーチンにより Ndim+4 に設定される. |
| [in,out] | T() | 配列 T(LT - 1) (LT >= 2 * N + 4)
B-スプライン形式のノット.
[in] Knotyp < 0 の場合: Pchbsの前回の呼び出しでT()が設定されているものとみなす. (ノットの並びが正しいかどうかは本ルーチンでは確認しない)
[out] Knotyp >= 0の場合: Xの値に等しい内部(二重)ノットと上のように設定された境界ノットがT()に設定される. |
| [out] | Bcoef() | 配列 Bcoef(LBcoef - 1) (LBcoef >= 2 * N)
B-スプライン係数. |
| [out] | Ndim | B-スプライン領域の配列の大きさ (2*Nに設定される). |
| [out] | Kord | B-スプラインの次数 (4に設定される). |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ N の誤り. (N < 2)
= -2: パラメータ X() の誤り.
= -3: パラメータ F() の誤り.
= -4: パラメータ D() の誤り.
= -5: パラメータ Knotyp の誤り. (Knotyp > 2)
= -6: パラメータ Nknots の誤り. (Nknots <> 2*N+4 (Knotyp < 0))
= -7: パラメータ T() の誤り.
= -8: パラメータ Bcoef() の誤り.
= -13: パラメータ Incfd の誤り. (Incfd < 1) |
| [in] | Idxfd | (省略可)
F()およびD()の先頭データのインデックス値. (省略時 = 0) |
| [in] | Incfd | (省略可)
F()およびD()の要素間隔. (Incfd >= 1) (省略時 = 1) |
- 出典
- SLATEC (PCHIP)
- 使用例
- 次の自然対数表の区分3次エルミート補間をB-スプライン表現に変換する.
x ln(x)
------ ---------
0.10 -2.3026
0.11 -2.2073
0.12 -2.1203
0.13 -2.0402
------ ---------
Sub Ex_Pchbs()
Const N = 4, Ne = 2
Dim X(N - 1) As Double, Y(N - 1) As Double, D(N - 1) As Double
Dim Ic(1) As Long, Vc(1) As Double
Dim Knotyp As Long, Nknots As Long, T(2 * N + 3) As Double, Bcoef(2 * N - 1) As Double
Dim Ndim As Long, Kord As Long
Dim Info As Long
'-- Data
X(0) = 0.1: Y(0) = -2.3026
X(1) = 0.11: Y(1) = -2.2073
X(2) = 0.12: Y(2) = -2.1203
X(3) = 0.13: Y(3) = -2.0402
Ic(0) = 1: Ic(1) = 1
Vc(0) = 1 / X(0): Vc(1) = 1 / X(3)
Call Pchic(Ic(), Vc(), 0, N, X(), Y(), D(), Info)
If Info <> 0 Then
Debug.Print "Error in Pchic: Info =", Info
Exit Sub
End If
'-- Convert to B-spline
Knotyp = 0
Call Pchbs(N, X(), Y(), D(), Knotyp, Nknots, T(), Bcoef(), Ndim, Kord, Info)
Debug.Print "Info =", Info
End Sub
Function Hermite(N As Long, X As Double, Optional Info As Long) As Double エルミート多項式 Hn(x)
Sub Pchbs(N As Long, X() As Double, F() As Double, D() As Double, Knotyp As Long, Nknots As Long, T() As Double, Bcoef() As Double, Ndim As Long, Kord As Long, Info As Long, Optional Idxfd As Long=0, Optional Incfd As Long=1) 区分3次エルミートからB-スプラインへの変換
Sub Pchic(Ic() As Long, Vc() As Double, Switch As Double, N As Long, X() As Double, F() As Double, D() As Double, Info As Long, Optional Idxfd As Long=0, Optional Incfd As Long=1) 区分3次エルミート補間
|