[racket] Implementation of Simpson's Rule (SICP Exercise 1.29)

From: Daniel Prager (daniel.a.prager at gmail.com)
Date: Mon Nov 4 11:52:15 EST 2013

Interestingly, your code gives the expected result with exact arithmetic:

> (simpson-integral cube 0 1 100)
1/4

and less of an error for a smaller number of steps:

> (simpson-integral cube 0 1.0 10)
0.24999999999999994

Suggestion: Modify the code to print out the intermediate steps in the
calculation and compare inexact arithmetic with exact in detail for the n =
100 / h = 0.01 case.


Dan



On Mon, Nov 4, 2013 at 7:14 AM, Ben Duan <yfefyf at gmail.com> wrote:

> I've asked the question on Stack Overflow<http://stackoverflow.com/questions/19706893/implementation-of-simpsons-rule-sicp-exercise-1-29>[1]. Óscar López gave me an
> answer. But I still don't understand it. So I re-post it here:
>
> Following is my code for SICP exercise 1.29
> <http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html>[2]. The
> exercise asks us to
> implement Simpson's Rule using higher order procedure `sum`. It's supposed
> to be
> more accurate than the original `integral` procedure. But I don't know why
> it's
> not the case in my code:
>
>     (define (simpson-integral f a b n)
>       (define h (/ (- b a) n))
>       (define (next x) (+ x (* 2 h)))
>       (* (/ h 3) (+ (f a)
>                     (* 4 (sum f (+ a h) next (- b h)))
>                     (* 2 (sum f (+ a (* 2 h)) next (- b (* 2 h))))
>                     (f b))))
>
> Some explanations of my code: As
>
>     h/3 * (y_{0} + 4*y_{1} + 2*y_{2} + 4*y_{3} + 2*y_{4} + ... + 2*y_{n-2}
> + 4*y_{n-1} + y_{n})
>
> equals
>
>     h/3 * (y_{0}
>            + 4 * (y_{1} + y_{3} + ... + y_{n-1})
>            + 2 * (y_{2} + y_{4} + ... + y_{n-2})
>            + y_{n})
>
> I just use `sum` to compute `y_{1} + y_{3} + ... + y_{n-1}` and `y_{2} +
> y_{4} + ... + y_{n-2}`.
>
> Complete code here:
>
>     #lang racket
>     (define (cube x) (* x x x))
>     (define (sum term a next b)
>       (if (> a b)
>           0
>           (+ (term a)
>              (sum term (next a) next b))))
>     (define (integral f a b dx)
>       (define (add-dx x) (+ x dx))
>       (* (sum f (+ a (/ dx 2.0)) add-dx b)
>          dx))
>     (define (simpson-integral f a b n)
>       (define h (/ (- b a) n))
>       (define (next x) (+ x (* 2 h)))
>       (* (/ h 3) (+ (f a)
>                     (* 4 (sum f (+ a h) next (- b h)))
>                     (* 2 (sum f (+ a (* 2 h)) next (- b (* 2 h))))
>                     (f b))))
>
> Some tests(The exact value should be 0.25):
>
>     > (integral cube 0 1 0.01)
>     0.24998750000000042
>     > (integral cube 0 1 0.001)
>     0.249999875000001
>
>     > (simpson-integral cube 0 1.0 100)
>     0.23078806666666699
>     > (simpson-integral cube 0 1.0 1000)
>     0.24800798800666748
>     > (simpson-integral cube 0 1.0 10000)
>     0.2499999999999509
>
> [1]
> http://stackoverflow.com/questions/19706893/implementation-of-simpsons-rule-sicp-exercise-1-29
> [2] http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html
>
> Thanks
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>
>


-- 
*Daniel Prager*
Agile/Lean Coaching, Software Development and Leadership
Twitter: @agilejitsu <https://twitter.com/agilejitsu>
Blog: agile-jitsu.blogspot.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20131104/e6a03bad/attachment.html>

Posted on the users mailing list.