|
|
◆ 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] | Fbcl | Ibclが指定する左境界値. |
| [in] | Fbcr | Ibcrが指定する右境界値. |
| [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
|