XLPack 7.0
XLPack 数値計算ライブラリ (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
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 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.16266
Info = 0