Boole's ruleIn mathematics, Boole's rule, named after George Boole, is a method of numerical integration. FormulaSimple Boole's RuleIt approximates an integral: by using the values of f at five equally spaced points:[1] It is expressed thus in Abramowitz and Stegun:[2] where the error term is for some number between and where 945 = 1 × 3 × 5 × 7 × 9. It is often known as Bode's rule, due to a typographical error that propagated from Abramowitz and Stegun.[3] The following constitutes a very simple implementation of the method in Common Lisp which ignores the error term: (defun integrate-booles-rule (f x1 x5)
"Calculates the Boole's rule numerical integral of the function F in
the closed interval extending from inclusive X1 to inclusive X5
without error term inclusion."
(declare (type (function (real) real) f))
(declare (type real x1 x5))
(let ((h (/ (- x5 x1) 4)))
(declare (type real h))
(let* ((x2 (+ x1 h))
(x3 (+ x2 h))
(x4 (+ x3 h)))
(declare (type real x2 x3 x4))
(* (/ (* 2 h) 45)
(+ (* 7 (funcall f x1))
(* 32 (funcall f x2))
(* 12 (funcall f x3))
(* 32 (funcall f x4))
(* 7 (funcall f x5)))))))
Composite Boole's RuleIn cases where the integration is permitted to extend over equidistant sections of the interval , the composite Boole's rule might be applied. Given divisions, where mod , the integrated value amounts to:[4]
where the error term is similar to above. The following Common Lisp code implements the aforementioned formula: (defun integrate-composite-booles-rule (f a b n)
"Calculates the composite Boole's rule numerical integral of the
function F in the closed interval extending from inclusive A to
inclusive B across N subintervals."
(declare (type (function (real) real) f))
(declare (type real a b))
(declare (type (integer 1 *) n))
(let ((h (/ (- b a) n)))
(declare (type real h))
(flet ((f[i] (i)
(declare (type (integer 0 *) i))
(let ((xi (+ a (* i h))))
(declare (type real xi))
(the real (funcall f xi)))))
(* (/ (* 2 h) 45)
(+ (* 7 (+ (f[i] 0) (f[i] n)))
(* 32 (loop for i from 1 to (- n 1) by 2 sum (f[i] i)))
(* 12 (loop for i from 2 to (- n 2) by 4 sum (f[i] i)))
(* 14 (loop for i from 4 to (- n 4) by 4 sum (f[i] i))))))))
See alsoNotes
References
|