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

◆ Bintk()

Sub Bintk ( X() As  Double,
Y() As  Double,
T() As  Double,
N As  Long,
K As  Long,
Bcoef() As  Double,
Q() As  Double,
Info As  Long 
)

k次B-スプライン補間

目的
本ルーチンは与えられたデータを補間するk次スプラインのB-スプライン形式(T(), Bcoef(), N, K)の補間係数を求める. スプライン補間値あるいはその微分係数はBvaluを呼び出すことにより求めることができる.
引数
[in]X()配列 X(LX - 1) (LX >= Ndata)
横座標値(Xベクトル). (重複なし, 昇順であること)
[in]Y()配列 Y(LY - 1) (LY >= Ndata)
縦座標値(Yベクトル).
[in]T()配列 T(LT - 1) (LT >= N + K)
ノットベクトル.
T(0), ..., T(K-1) <= X(0) かつ T(N), ..., T(N+K-1) >= X(N-1) であるから, 区間 [X(0), X(N-1)] の中には N-Kノットしかない(必ずしもX(i)の値と同じである必要はない).
[in]Nデータ点数. (N >= K)
[in]Kスプラインの次数. (K >= 1)
[out]Bcoef()配列 Bcoef(LBcoef - 1) (LBcoef >= N)
B-スプライン係数.
[out]Q()配列 Q(LQ - 1) (LQ >= (2*K - 1)*N)
連立一次方程式の三角分解済係数行列. 横座標が同一の追加データ(X(i), YY(i)) (i = 1〜N)を補間するB-スプライン係数を, YY()をBcoef()に入れ次の呼び出しを行うことにより求めることができる.
  Call Banslv(N, K - 1, K - 1, Q(), Bcoef())
[out]Info= 0: 正常終了.
= -1: パラメータ X() の誤り. (重複している, あるいは, 昇順でない)
= -2: パラメータ Y() の誤り.
= -3: パラメータ T() の誤り.
= -4: パラメータ N の誤り. (N < K)
= -5: パラメータ K の誤り. (K < 1)
= -6: パラメータ Bcoef() の誤り.
= -7: パラメータ Q() の誤り.
= 1: 対応する基底関数の対象外の横座標があるため方程式が特異になった.
= 2: 連立一次方程式のLU分解中に特異性が検出された.
出典
SLATEC
使用例
次の自然対数表を3次B-スプライン補間して, ln(0.115) を求める.
  x       ln(x)
------ ---------
 0.10   -2.3026
 0.11   -2.2073
 0.12   -2.1203
 0.13   -2.0402
------ ---------
Sub Ex_Bintk()
Const N = 4, K = 4
Dim X(N - 1) As Double, Y(N - 1) As Double, Xe As Double
Dim T(N + K - 1) As Double, Bcoef(N - 1) As Double, Q((2 * K - 1) * N - 1) As Double
Dim Ideriv As Long, Inbv As Long, Info As Long, I 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 of order k
For I = 0 To N - K + 1
T(I + K - 1) = X(0) + I * (X(N - 1) - X(0)) / (N - K + 1)
Next
T(0) = T(3): T(1) = T(3): T(2) = T(3)
T(7) = T(4): T(6) = T(4): T(5) = T(4)
Call Bintk(X(), Y(), T(), N, K, Bcoef(), Q(), Info)
If Info <> 0 Then
Debug.Print "Error in Bintk: Info =", Info
Exit Sub
End If
'-- Compute interpolated value
Ideriv = 0: Inbv = 1
Xe = 0.115
Debug.Print "ln(" + CStr(Xe) + ") =", Bvalue(T(), Bcoef(), N, K, Ideriv, Xe, Inbv, Info)
Debug.Print "Info =", Info
End Sub
Sub Bintk(X() As Double, Y() As Double, T() As Double, N As Long, K As Long, Bcoef() As Double, Q() As Double, Info As Long)
k次B-スプライン補間
Function Bvalue(T() As Double, A() As Double, N As Long, K As Long, Ideriv As Long, X As Double, Inbv As Long, Info As Long) As Double
B-形式のB-スプライン関数値または微分値
実行結果
ln(0.115) = -2.16285
Info = 0