|
|
◆ 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] | A | Lower limit of integration a. |
| [in] | B | Upper limit of integration b. |
| [in] | Npts | Number 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] | Result | Approximation 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] | XX | When returned with IRev = 1, XX contains the abscissa where the function value should be evaluated and given in the next call. |
| [in] | YY | When returned with IRev = 1, the function value should be given in YY in the next call. |
| [in,out] | IRev | Control 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
|