# HP Forums

Full Version: Infinite Integrals by Gaussian Quadrature
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
The program INFGAUS calculates the integral:

∫ e^-x * f(x) dx from x = a to x = ∞

f(x) is the subroutine FX. The subroutine starts with the x value on the stack and ends with the RTN command.

The HP 45 algorithm, which is incorporated into the program INFGAUS estimates the integral by the sum

e^-a * Σ(( w_i * f(z_i + a)) for i=1 to 3)

where

w_1 = 0.71109390099
z_1 = 0.4157745568

w_2 = 0.2785177336
z_2 = 2.29428036

w_3 = 0.0103892565
z_3 = 6.289945083

Source

HP-45 Applications Handbook Hewlett Packard Company. 1974.

DM41X Program: INFGAUS

The code can work is for the entire HP 41C/DM41 family. The calculator is set to Fix 2 mode. Registers 01 through 08 are needed.

Code:
01  LBL^T INFGAUS 02  .4157745568 03  STO 01 04  2.29428036 05  STO 02 06  6.289945083 07  STO 03 08  .7110930099 09  STO 04 10  .278517736 11  STO 05 12  .0103892565 13  STO 06 14  FIX 2 15  ^T A? 16  PROMPT 17  STO 07 18  RCL 01 19  + 20  XEQ^T FX 21  RCL 04 22  * 23  STO 08 24  RCL 07 25  RCL 02 26  + 27  XEQ^T FX 28  RCL 05 29  * 30  ST+ 08 31  RCL 03 32  RCL 07 33  + 34  XEQ^T FX 35  RCL 06 36  * 37  RCL 08 38  + 39  RCL 07 40  CHS 41  E↑X 42  * 43  STO 08 44  END

Examples

Example 1

∫ e^-x * x^3.99 dx from x = 0 to ∞ (calculate Γ(4.99))

Code:
LBL^T FX 3.99 Y↑X RTN

A? 0
Result: 23.64

Example 2

∫ e^-x * x^2 ÷ (x - 1) dx from x = 2 to ∞

Code:
LBL^T FX X↑2 LASTx 1 - / RTN

A? 2
Result: 0.62

Example 3

∫ (e^-x)^2 dx from x = 0 to ∞
= ∫ (e^-x) * (e^-x) dx from x = 0 to ∞

Code:
LBL^T FX CHS E↑X RTN

A? 0
Result: 0.50 (it turns out 0.5 is the exact answer)
(11-23-2022 01:55 PM)Eddie W. Shore Wrote: [ -> ]The program INFGAUS calculates the integral:

∫ e^-x * f(x) dx from x = a to x = ∞

...

e^-a * Σ(( w_i * f(z_i + a)) for i=1 to 3)

where

w_1 = 0.71109390099
z_1 = 0.4157745568

w_2 = 0.2785177336
z_2 = 2.29428036

w_3 = 0.0103892565
z_3 = 6.289945083

Source

HP-45 Applications Handbook Hewlett Packard Company. 1974.

The handbook only listed the shifts and weights ... How does the numbers derived ?

I was expecting Gaussian Quadrature of z integral. But with 3 points, results are terrible.
Note: in XCas, Int(...) == quote(int(...))

XCas> Int(e^-x * f(x), x, a, inf) (x=-ln(y))

∫(f(-ln(y)), y, 0, exp(-a))

XCas> Int(f(-ln(y)), y, 0, exp(-a)) (y = (z+1)*exp(-a)/2)

exp(-a) * ∫(f(a - ln((1+z)/2))/2, z, -1, 1)
2nd attempt, points and weights are closer.
We assume a=0, then later put back a.

Let x=(1-y)/(1+y), y=[-1 ..1] map to x = [inf .. 0]
Trivia: inverse has same shape, y=(1-x)/(1+x)

XCas> Int(e^-x * f(x), x, 0, inf) (x=(1-y)/(1+y))

$$\displaystyle \int _{-1}^{1} \frac{2 \exp \left(- \frac{1-y}{1+y}\right)\;f\left(\frac{1-y}{1+y}\right)} {\left(1+y\right)^{2}}\,dy$$

$$\displaystyle \int _{a}^{\infty} e^{-x}\,f(x)\,dx = e^{-a}\;\int _{-1}^{1} \frac{2 \exp \left(- \frac{1-y}{1+y}\right)\;f\left(\frac{1-y}{1+y} + a\right)} {\left(1+y\right)^{2}}\,dy$$

With 3 points Gaussian quadrature, we have:

e^-a * Σ(( w_i * f(z_i + a)) for i=1 to 3)

where

w_1 = 0.310738836
z_1 = 0.1270166538

w_2 = 0.6540078954
z_2 = 1.0

w_3 = 0.008329973286
z_3 = 7.872983346

Numbers strongly depends on how infinite intervals is mapped to [-1, 1]
For OP examples, above numbers are still not as good. (but, perhaps good for others?)
I figured out how the numbers are derived. The trick is *no* transformation!
Again, we assume a=0, then later put back a (if needed)

Assume f is a quintic polynomial, we solved for integral exact solution.

XCas> P(x) := horner([A,B,C,D,E,F],x) // quintic polynomial
XCas> R := int(e^-x * P(x), x=0 .. inf)

120*A + 24*B + 6*C + 2*D + E+F

XCas> M := w1*P(z1) + w2*P(z2) + w3*P(z3) - R

If weights/points correctly picked, M=0, for any P coefficients.
For simplicity, we use identity matrix for P coefficients.

XCas> M := normal([
M(A=1,B=0,C=0,D=0,E=0,F=0),
M(A=0,B=1,C=0,D=0,E=0,F=0),
M(A=0,B=0,C=1,D=0,E=0,F=0),
M(A=0,B=0,C=0,D=1,E=0,F=0),
M(A=0,B=0,C=0,D=0,E=1,F=0),
M(A=0,B=0,C=0,D=0,E=0,F=1)
])

XCas> transpose(M)

$$\left(\begin{array}{c}-120+w_{1} z_{1}^{5}+w_{2} z_{2}^{5}+w_{3} z_{3}^{5}\\-24+w_{1} z_{1}^{4}+w_{2} z_{2}^{4}+w_{3} z_{3}^{4}\\-6+w_{1} z_{1}^{3}+w_{2} z_{2}^{3}+w_{3} z_{3}^{3}\\-2+w_{1} z_{1}^{2}+w_{2} z_{2}^{2}+w_{3} z_{3}^{2}\\-1+w_{1} z_{1}+w_{2} z_{2}+w_{3} z_{3}\\-1+w_{1}+w_{2}+w_{3}\end{array}\right)$$

Last equation, we have sum of weights = 1, matching OP
6 equations, 6 unknown, using previous post numbers as guess.

XCas> fsolve(M=0,[w1,z1, w2,z2, w3,z3] = [0.311,0.127, 0.654,1.00, 0.00833,7.87], [w1,z1, w2,z2, w3,z3])

[0.278517733569, 2.29428036028,
0.711093009929, 0.415774556783,
0.0103892565016, 6.28994508294]

Weights/Points now match OP (in different orders, but that's OK)
Reference URL's
• HP Forums: https://www.hpmuseum.org/forum/index.php
• :