XLPack 7.0
XLPack 数値計算ライブラリ (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
Sub Bint4(X() As Double, Y() As Double, Ndata As Long, Ibcl As Long, Ibcr As Long, Fbcl As Double, Fbcr As Double, Kntopt As Long, T() As Double, Bcoef() As Double, N As Long, K As Long, Info As Long)
3次B-スプライン補間
Function Ppvalu(C() As Double, Xi() As Double, Lxi As Long, K As Long, Ideriv As Long, X As Double, Inppv As Long, Info As Long) As Double
PP(区分多項式)形式のB-スプライン関数値または微分値
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(区分多項式)形式への変換
実行結果
ln(0.115) = -2.16266
Info = 0