Chapter 1, Building Abstractions with Procedures
Section - Formulating Abstractions with Higher-Order Procedures
Exercise 1.29
We can simply write the procedure following the original integral procedure shown. Notice here that the arguments passed to sum are not $a$ and $b$ but the indexes of the terms i.e. 0, 1, 2 … n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#lang sicp
(define (sum term a next b)
(if
(> a b)
0
(+
(term a)
(sum term (next a) next b)
)
)
)
(define (cube n) (* n n n))
;integral procedure from book
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2.0)) add-dx b)
dx))
; simpson integral procedure
(define (simpson-integral f a b n)
(define (coeff k)
(cond
((or (= k 0) (= k n)) 1)
((even? k) 2)
(else 4)
)
)
(let ((h (/ (- b a) n)))
(define (term k)
(* (coeff k) (f (+ a (* k h))))
)
(*
(/ h 3)
(sum term 0 inc n)
)
)
)
We can see the output of simpson is more accurate than original procedure.
1
2
3
4
5
6
7
8
> (simpson-integral cube 0.0 1.0 100)
0.24999999999999992
> (integral cube 0.0 1.0 0.01)
0.24998750000000042
> (simpson-integral cube 0.0 1.0 1000)
0.2500000000000003
> (integral cube 0.0 1.0 0.001)
0.249999875000001