XLPack 7.0
XLPack Numerical Library (Excel VBA) Reference Manual
Loading...
Searching...
No Matches

◆ 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 
)

Integral of product of arbitrary function and B-representation of B-spline

Purpose
This routine computes the integral on [X1, X2] of a product of a function f(x) and the Id-th derivative of a K-th order B-spline, using the B-representation (T(), Bcoef(), N, K). [X1, X2] must be a subinterval of [T(K-1), T(K)].

Then integration routine using adaptive 8-point Gauss-Legendre rule integrates the product on subintervals of [X1, X2] formed by included (distinct) knots.
Parameters
[in]FUser supplied subroutine which calculates the integrand function f(x) defined as follows.
Function F(X As Double) As Double
F = the value of f(X)
End Function
X should not be changed.
[in]T()Array T(LT - 1) (LT >= N + K)
Knot vector.
[in]Bcoef()Array Bcoef(LBcoef - 1) (LBcoef >= N)
B-spline coefficients.
[in]NNumber of B-spline coefficients. (N = sum of knot multiplicities - K)
[in]KOrder of the B-spline. (1 <= K)
[in]IdOrder of the spline derivative. (0 <= Id <= K - 1)
Id = 0 gives the spline function.
[in]X1Lower end point of quadrature interval. (T(K) <= X1 <= T(N+1))
[in]X2Upper end point of quadrature interval. (T(K) <= X2 <= T(N+1))
[in]TolDesired accuracy for the quadrature. (Eps < Tol <= 0.1, where Eps is the double precision unit roundoff (= D1mach(4)))
[out]QuadIntegral of f(x)*(Id-th derivative of a K-th order B-spline) on [X1, X2].
[out]Info= 0: Successful exit.
= -2: The argument T() is invalid.
= -3: The argument Bcoef() is invalid.
= -4: The argument N had an illegal value. (N < K)
= -5: The argument K had an illegal value. (K < 1)
= -6: The argument Id had an illegal value. (Id < 0 or Id >= K)
= -7: The argument X1 had an illegal value. (X1 < T(K) or X1 > T(N+1))
= -8: The argument X2 had an illegal value. (X2 < T(K) or X2 > T(N+1))
= -9: The argument Tol had an illegal value. (Tol < Eps or Tol > 0.1)
= 1: Some quadrature on (X1, X2) does not meet the requested tolerance.
Reference
SLATEC
Example Program
Using the following table, compute S = integral of 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)
Integral of product of arbitrary function and B-representation of B-spline
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)
B-representation of the cubic spline interpolation
Example Results
S = 1.32679961538462 S(true) = 1.32581766366803
Info = 0