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

◆ Bsplpp()

Sub Bsplpp ( T() As  Double,
A() As  Double,
N As  Long,
K As  Long,
C() As  Double,
Xi() As  Double,
Lxi As  Long,
Info As  Long 
)

B-形式のB-スプラインからPP(区分多項式)形式への変換

目的
本ルーチンはB-形式(T(), A(), N, K)のB-スプラインをPpvaluで使うためにPP(区分多項式)形式(C(), Xi(), Lxi, K)に変換する. ここで, 区切り点の配列Xi()(長さLxi)は多重度を除いたノット配列T()である. 行列C(i,j)の列は, 区間Xi(j-1) <= X < Xi(j)のXについてのXi(j)のまわりのテーラー展開の右微分値である(i = 0 〜 k-1, j = 0 〜 Lxi-1).
関数PpvaluはXi(0) <= X <= Xi(Lxi)の指定されたXについてPP形式の関数値を求める.
引数
[in]T()配列 T(LT - 1) (LT >= N + K)
ノットベクトル.
[in]A()配列 A(LA - 1) (LA >= N)
B-スプライン係数.
[in]NB-スプライン係数の数. (N = ノット多重度の合計 - K)
[in]KB-スプラインの次数. (K >= 1)
[out]C()配列 C(LC1 - 1, LC2 - 1) (LC1 >= K, LC2 >= Lxi)
区分多項式の区切り点における右微分係数.
[out]Xi()配列 Xi(LXi - 1) (LXi >= Lxi + 1)
区分多項式の区切り点.
[out]Lxi区分多項式の小区間数. (Lxi <= N - K + 1)
[out]Info= 0: 正常終了.
= -1: パラメータ T() の誤り.
= -2: パラメータ A() の誤り.
= -3: パラメータ N の誤り. (N < K)
= -4: パラメータ K の誤り. (K < 1)
= -5: パラメータ C() の誤り.
= -6: パラメータ Xi() の誤り.
出典
SLATEC
使用例
次の自然対数表をBint4により3次B-スプライン補間する. その係数をPP形式に変換した 後, Ppvaluを使って ln(0.115) の補間値を求める.
  x       ln(x)
------ ---------
 0.10   -2.3026
 0.11   -2.2073
 0.12   -2.1203
 0.13   -2.0402
------ ---------
Sub Ex_Bsplpp()
Const Ndata = 4
Dim X(Ndata - 1) As Double, Y(Ndata - 1) As Double, Xe As Double
Dim Ibcl As Long, Ibcr As Long, Fbcl As Double, Fbcr As Double, Kntopt As Long
Dim T(Ndata + 5) As Double, Bcoef(Ndata + 1) As Double, N As Long, K As Long
Dim Lxi As Long, C(3, Ndata - 2) As Double, Xi(Ndata - 1) As Double
Dim Ideriv As Long, Inppv As Long, 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
'-- B-representation of cubic spline interpolation
Ibcl = 2: Fbcl = 0: Ibcr = 2: Fbcr = 0 '-- Natural spline
Kntopt = 1
Call Bint4(X(), Y(), Ndata, Ibcl, Ibcr, Fbcl, Fbcr, Kntopt, T(), Bcoef(), N, K, Info)
If Info <> 0 Then
Debug.Print "Error in Bint4: Info =", Info
Exit Sub
End If
'-- Convert to PP form
Call Bsplpp(T(), Bcoef(), N, K, C(), Xi(), Lxi, Info)
If Info <> 0 Then
Debug.Print "Error in Bsplpp: Info =", Info
Exit Sub
End If
'-- Compute interpolated value
Ideriv = 0: Inppv = 1
Xe = 0.115
Debug.Print "ln(" + CStr(Xe) + ") =", Ppvalu(C(), Xi(), Lxi, K, Ideriv, Xe, Inppv, Info)
Debug.Print "Info =", Info
End Sub
実行結果
ln(0.115) = -2.16266
Info = 0