|
|
◆ Qaws_r()
| Sub Qaws_r |
( |
A As |
Double, |
|
|
B As |
Double, |
|
|
Alpha As |
Double, |
|
|
Beta As |
Double, |
|
|
Integr As |
Long, |
|
|
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 for singular functions (25-point Clenshaw-Curtis and 15-point Gauss-Kronrod rule) (reverse communication version)
- Purpose
- The routine calculates an approximation result to a definite integral I = integral of f(x)*w(x) over [a, b] satisfying the requested accuracy, where the weight function w(x) has algebraic-logarithmic singularities at the end points of an integration region. See parameter Integr.
Result is obtained by the adaptive integration applying a 25-point modified Clenshaw-Curtis rule and a 15-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] | Alpha | Parameter α in the weight function. (Alpha > -1) |
| [in] | Beta | Parameter β in the weight function. (Beta > -1) |
| [in] | Integr | Indicates the form of weight function w(x)
= 1: w(x) = (x - a)^α * (b - x)^β
= 2: w(x) = (x - a)^α * (b - x)^β * ln(x - a)
= 3: w(x) = (x - a)^α * (b - x)^β * ln(b - x)
= 4: w(x) = (x - a)^α * (b - x)^β * ln(x - a) * ln(b - x) |
| [out] | Result | Approximation to the integral. |
| [out] | Info | = 0: Successful exit.
= -1: The argument A (or B) had an illegal value. (A >= B)
= -3: The argument Alpha had an illegal value. (Alpha <= -1)
= -4: The argument Beta had an illegal value. (Beta <= -1)
= -5: The argument Integr had an illegal value. (Integr < 1 or Integr > 4)
= 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. |
| [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 >= 2) (default = 100)
(If Limit < 2, 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.
∫ ln(x)/(1 + ln(x)^2)^2 dx [0, 1] (= 0.1892752)
Sub Ex_Qaws_r()
Dim A As Double, B As Double, Result As Double, Info As Long
Dim Alpha As Double, Beta As Double, Integr As Long
Dim XX As Double, YY As Double, IRev As Long
A = 0: B = 1
Alpha = 0: Beta = 0: Integr = 2
IRev = 0
Do
Call Qaws_r(A, B, Alpha, Beta, Integr, Result, Info, XX, YY, IRev)
If IRev = 1 Then
YY = 0
If XX > 0 Then YY = 1 / (1 + Log(XX) ^ 2) ^ 2
End If
Loop While IRev <> 0
Debug.Print "S =", Result
Debug.Print "Info =", Info
End Sub
Function Beta(A As Double, B As Double, Optional Info As Long) As Double Beta function B(a, b)
Sub Qaws_r(A As Double, B As Double, Alpha As Double, Beta As Double, Integr As Long, 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 for singular functions (25-point Clenshaw-Curtis and 15-point Gau...
- Example Results
S = -0.189275187882035
Info = 0
|