XLPack 6.1
Excel VBA Numerical Library Reference Manual
Loading...
Searching...
No Matches

◆ Qagp_r()

Sub Qagp_r ( A As  Double,
B As  Double,
Npts As  Long,
Points() As  Double,
Result As  Double,
Info As  Long,
XX As  Double,
YY As  Double,
IRev As  Long,
Optional AbsErr As  Double,
Optional Neval As  Long,
Optional EpsAbs As  Double = -1,
Optional EpsRel As  Double = -1,
Optional Limit As  Long = -1,
Optional Last As  Long 
)

Finite interval adaptive quadrature with known singular points (21-point Gauss-Kronrod rule)

Purpose
The routine computes an approximation result to a definite integral I = integral of f(x) over [a, b], satisfying the requested accuracy. Break points of the integration interval, where local difficulties of the integrand may occur (e.g. singularities, discontinuities), can be provided by the user.
Result is obtained by the adaptive integration applying the 21-point Gauss-Kronrod rule to satisfy the requested accuracy.
Parameters
[in]ALower limit of integration a.
[in]BUpper limit of integration b.
[in]NptsNumber of user provided break points. (Npts >= 0)
[in]Points()Array Points(LPoints - 1) (LPoints >= max(NPts, 1))
Points(0) to Points(NPts - 1) are user provided break points. (The break points should be specified inside the integration interval)
[out]ResultApproximation to the integral.
[out]Info= 0: Successful exit.
= -3: The argument npts had an illegal value. (npts < 0)
= -4: The argument Points() is invalid.
= 1: Maximum number of subdivisions allowed has been reached.
= 2: Requested tolerance cannot be achieved due to roundoff error.
= 3: Bad integrand behavior found in the integration interval.
= 4: Algorithm does not converge due to the roundoff error in the extrapolation table.
= 5: The integral is probably divergent, or slowly convergent.
= 6: Singular points are specified outside the integration interval.
[out]XXWhen returned with IRev = 1, XX contains the abscissa where the function value should be evaluated and given in the next call.
[in]YYWhen returned with IRev = 1, the function value should be given in YY in the next call.
[in,out]IRevControl variable for reverse communication.
[in] Before first call, IRev should be initialized to zero. On succeeding calls, IRev should not be altered.
[out] If IRev is not zero, complete the following tasks and call this routine again without changing IRev.
= 0: Computation finished. See return code in Info.
= 1: User should set the function values at XX in YY. Do not alter any variables other than YY.
[out]AbsErr(Optional)
Estimate of the modulus of the absolute error, which should equal or exceed the true error.
[out]Neval(Optional)
Number of integrand evaluations.
[in]EpsAbs(Optional)
Absolute accuracy requested. (default = 0)
The requested accuracy is assumed to be satisfied if AbsErr <= max(EpsAbs, EpsRel*|Result|))
(If EpsAbs < 0, the default value will be used)
[in]EpsRel(Optional)
Relative accuracy requested. (default = 1.0e-12)
The requested accuracy is assumed to be satisfied if AbsErr <= max(EpsAbs, EpsRel*|Result|))
If EpsAbs <= 0 and EpsRel < 50*eps, EpsRel is assumed to be 50*eps, where eps is the machine precision.
(If EpsRel < 0, the default value will be used)
[in]Limit(Optional)
Maximum number of subintervals in the partition of the given integration interval [a, b] (limit >= Npts + 1) (default = Npts + 100)
(If Limit < Npts + 1, the default value will be used)
[out]Last(Optional)
Number of subintervals produced in the subdivision process.
Reference
SLATEC (QUADPACK)
Example Program
Compute the following integral.
∫ x^3*ln(abs((x^2 - 1)(x^2 - 2))) dx [0, 3] (= 52.740748)
There are two singular points at x = 1 and x = √2.
Sub Ex_Qagp_r()
Const Npts = 2
Dim A As Double, B As Double, Result As Double, Points(Npts - 1) As Double
Dim Info As Long, Neval As Long, EpsRel As Double
Dim XX As Double, YY As Double, IRev As Long
A = 0: B = 3
Points(0) = 1: Points(1) = Sqr(2)
EpsRel = 0.00000001 '1.0e-8
IRev = 0
Do
Call Qagp_r(A, B, Npts, Points(), Result, Info, XX, YY, IRev, , Neval, , EpsRel)
If IRev = 1 Then YY = XX ^ 3 * Log(Abs((XX ^ 2 - 1) * (XX ^ 2 - 2)))
Loop While IRev <> 0
Debug.Print "S =", Result, "Neval =", Neval
Debug.Print "Info =", Info
End Sub
Example Results
S = 52.7407483840768 Neval = 3843
Info = 0