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

◆ Bfqad()

Sub Bfqad ( F As  LongPtr,
T() As  Double,
Bcoef() As  Double,
N As  Long,
K As  Long,
Id As  Long,
X1 As  Double,
X2 As  Double,
Tol As  Double,
Quad As  Double,
Info As  Long 
)

任意関数×B-スプラインの積分値

目的
本ルーチンは任意の関数f(x)とB-形式(T(), Bcoef(), N, K)のK次B-スプラインのId次微分値の積の区間[X1, X2]における積分を求める. [X1, X2]は[T(K-1), T(K)]の部分区間でなければならない.

8点ガウス公式を使用した適応求積ルーチンにより, 区間内に含まれるノットにより構成された部分区間[X1, X2]の積分を求める.
引数
[in]F被積分関数 f(x) を求めるユーザーサブルーチンで, 次のように定義すること.
Function F(X As Double) As Double
F = f(X)の値
End Function
Xを変更してはならない.
[in]T()配列 T(LT - 1) (LT >= N + K)
ノットベクトル.
[in]Bcoef()配列 Bcoef(LBcoef - 1) (LBcoef >= N)
B-スプライン係数.
[in]NB-スプライン係数の数. (N = ノット多重度の合計 - K)
[in]KB-スプラインの次数. (K >= 1)
[in]Idスプラインの微分係数の次数. (0 <= Id <= K - 1)
Id = 0の場合, 関数値となる.
[in]X1積分区間の下限値. (T(K) <= X1 <= T(N+1))
[in]X2積分区間の上限値. (T(K) <= X2 <= T(N+1))
[in]Tol積分の要求精度. (Eps < Tol <= 0.1) (ただし, Epsは単位丸め誤差(= D1mach(4))である)
[out]Quadf(X)*(K次B-スプラインのId次微分係数) の区間[X1, X2]における積分値.
[out]Info= 0: 正常終了.
= -2: パラメータ T() の誤り.
= -3: パラメータ Bcoef() の誤り.
= -4: パラメータ N の誤り. (N < K)
= -5: パラメータ K の誤り. (K < 1)
= -6: パラメータ Id の誤り. (Id < 0 or Id >= K)
= -7: パラメータ X1 の誤り. (X1 < T(K) or X1 > T(N+1))
= -8: パラメータ X2 の誤り. (X2 < T(K) or X2 > T(N+1))
= -9: パラメータ Tol の誤り. (Tol < Eps or Tol > 0.1)
= 1: 区間(X1, X2)におけるいくつかの積分値が要求精度を満たさなかった.
出典
SLATEC
使用例
次の数表を用いて S = ∫ 1/(1 + x^2) dx [0, 4] (= atan(4)) を求める. (f(X) = 1)
  x    1/(1 + x^2)
----- -------------
 -1        0.5
  0        1 
  1        0.5 
  2        0.2 
  3        0.1 
  4        0.05882
  5        0.03846
----- -------------
Function Bf(X As Double) As Double
Bf = 1
End Function
Sub Ex_Bfqad()
Const Ndata = 7, A = 0, B = 4
Dim X(Ndata - 1) As Double, Y(Ndata - 1) As Double, D(Ndata - 1) 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 Id As Long, Tol As Double, Info As Long, S As Double
'-- Data
X(0) = -1: Y(0) = 0.5
X(1) = 0: Y(1) = 1
X(2) = 1: Y(2) = 0.5
X(3) = 2: Y(3) = 0.2
X(4) = 3: Y(4) = 0.1
X(5) = 4: Y(5) = 0.05882
X(6) = 5: Y(6) = 0.03846
'-- B-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 integral 1/(1 + x^2) dx [0, 4] (= atan(4))
Id = 0: Tol = 0.0000000001 '1.0e-10
Call Bfqad(AddressOf Bf, T(), Bcoef(), N, K, Id, A, B, Tol, S, Info)
Debug.Print "S =", S, "S(true) =", Atn(4)
Debug.Print "Info =", Info
End Sub
Sub Bfqad(F As LongPtr, T() As Double, Bcoef() As Double, N As Long, K As Long, Id As Long, X1 As Double, X2 As Double, Tol As Double, Quad As Double, Info As Long)
任意関数×B-スプラインの積分値
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-スプライン補間
実行結果
S = 1.32679961538462 S(true) = 1.32581766366803
Info = 0