XLPack 6.1
Excel VBA 数値計算ライブラリ・リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ 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 の一部のチェックは行わない.
制限および仮定事項は次のとおりである.
  1. N >= 2 (正しくなければエラーを返す)
  2. X(i) < X(i+1), i = 0〜n-1 (チェックしない)
  3. Incfd > 0 (正しくなければエラーを返す)
  4. Knotyp <= 2 (正しくなければエラーを返す)
  5. (*) Nknots = Ndim + 4 = 2*N + 4 (正しくなければエラーを返す)
  6. (*) 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]NdimB-スプライン領域の配列の大きさ (2*Nに設定される).
[out]KordB-スプラインの次数 (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
'-- Cubic Hermite interpolation
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