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

◆ Bint4()

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-スプライン補間

目的
本ルーチンは与えられたデータを補間する3次スプライン(k = 4)のB-スプライン形式(T(), Bcoef(), N, K)の補間係数を求める. スプライン補間値あるいはその微分係数はBvaluを呼び出すことにより求めることができる.

パラメータIbcl, Ibcr, Fbcl, Fbcrは X(0)およびX(Ndata-1)におけるスプラインの1次または2次微分を指定する. 問題によりこれらが指定されていない場合には, 自然スプライン, すなわち, X(0)およびX(Ndata-1)における2次微分を0に設定する(Ibcl = Ibcr = 2, Fbcl = Fbcr = 0)のが一般的である.

スプラインは T(3) <= X <= T(N) において, X(i)を値とする内部ノットで定義される. ただし, N = Ndata+2 である. ノット T(0), T(1), T(2) は T(3) = X(0) の左側に, また, ノット T(N+1), T(N+2), T(N+3) は T(N) = X(Ndata-1) の右側に昇順に並ぶ. [X(0), X(Ndata-1)]の外側への外そうが必要でなければ, Kntopt = 1 により T(0) = T(1) = T(2) = T(3) = X(0) および T(N) = T(N+1) = T(N+2) = T(N+3) = X(Ndata-1) と指定することができる. Kntopt = 2 とすることにより, ノット T(0), T(1), T(2) の値を, 最初の7つのノットがT(3) = X(0) に関して対称になるようにすることができる. T(N+1), T(N+2), T(N+3) についても T(N) = X(Ndata-1) に関して同様である. Kntopt = 3 とすることによりユーザーが, T(0), T(1), T(2) は X(0) の左側で, また, T(N+1), T(N+2), T(N+3) は X(Ndata-1) の右側で昇順に独自の値を設定することができる. どの場合でも, T(3) <= X <= T(N) においてBvaluを用いて得られる補間値は, 与えられた境界条件について一意である.
引数
[in]X()配列 X(LX - 1) (LX >= Ndata)
横座標値(Xベクトル). (重複なし, 昇順であること)
[in]Y()配列 Y(LY - 1) (LY >= Ndata)
縦座標値(Yベクトル).
[in]Ndataデータ点数. (Ndata >= 2)
[in]Ibcl左境界条件を指定.
= 1: X(0)における1階微分をFbclにする.
= 2: X(0)における2階微分をFbclにする.
[in]Ibcr右境界条件を指定.
= 1: X(Ndata - 1)における1階微分をFbcrにする.
= 2: X(Ndata - 1)における2階微分をFbcrにする.
[in]FbclIbclが指定する左境界値.
[in]FbcrIbcrが指定する右境界値.
[in]Kntoptノットの指定.
= 1: T(3)およびT(N)におけるノットの多重度を4にする.
= 2: T(3)およびT(N)についてノットを対称にする.
= 3: T(0)〜T(2)およびT(N+1)〜T(N+3)の値をユーザーが指定する.
[in,out]T()配列 T(LT - 1) (LT >= N + 4)
[in] Kntopt = 3 のとき, T(0)〜T(2)およびT(N+1)〜T(N+3)の値を指定.
[out] ノットの値.
[out]Bcoef()配列 Bcoef(LBcoef - 1) (LBcoef >= N)
B-スプライン係数.
[out]N係数の数. (N = Ndata + 2)
[out]Kスプラインの次数. (K = 4)
[out]Info= 0: 正常終了.
= -1: パラメータ X() の誤り. (重複している, あるいは, 昇順でない)
= -2: パラメータ Y() の誤り.
= -3: パラメータ Ndata の誤り. (Ndata < 2)
= -4: パラメータ Ibcl の誤り. (Ibcl <> 1 および Ibcl <> 2)
= -5: パラメータ Ibcr の誤り. (Ibcr <> 1 および Ibcr <> 2)
= -8: パラメータ Kntopt の誤り. (Kntopt < 1 または Kntopt > 3)
= -9: パラメータ T() の誤り.
= -10: パラメータ Bcoef() の誤り.
= 1: 係数を求めるための連立方程式が特異になった.
出典
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_Bint4()
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 Ideriv As Long, Inbv 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
'-- Compute interpolated values
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
実行結果
ln(0.115) = -2.16266
Info = 0