<div dir="ltr">Interestingly, your code gives the expected result with exact arithmetic:<div><br></div><div><div>> (simpson-integral cube 0 1 100)</div><div>1/4</div></div><div><br></div><div>and less of an error for a smaller number of steps:</div>

<div><br></div><div><div>> (simpson-integral cube 0 1.0 10)</div><div>0.24999999999999994</div><div><br></div><div>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.</div>

<div><br></div><div><br></div><div>Dan</div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Nov 4, 2013 at 7:14 AM, Ben Duan <span dir="ltr"><<a href="mailto:yfefyf@gmail.com" target="_blank">yfefyf@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>I've asked the question on <a href="http://stackoverflow.com/questions/19706893/implementation-of-simpsons-rule-sicp-exercise-1-29" target="_blank">Stack Overflow</a> [1]. Óscar López gave me an</div>

<div>answer. But I still don't understand it. So I re-post it here:</div>
</div><div><br></div><div><div>Following is my code for <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html" target="_blank">SICP exercise 1.29 </a>[2]. The exercise asks us to</div><div>implement Simpson's Rule using higher order procedure `sum`. It's supposed to be</div>


<div>more accurate than the original `integral` procedure. But I don't know why it's</div><div>not the case in my code:</div></div><div><br></div><div><font face="courier new, monospace">    (define (simpson-integral f a b n)</font></div>


<div><font face="courier new, monospace">      (define h (/ (- b a) n))</font></div><div><font face="courier new, monospace">      (define (next x) (+ x (* 2 h)))</font></div><div><font face="courier new, monospace">      (* (/ h 3) (+ (f a)</font></div>


<div><font face="courier new, monospace">                    (* 4 (sum f (+ a h) next (- b h)))</font></div><div><font face="courier new, monospace">                    (* 2 (sum f (+ a (* 2 h)) next (- b (* 2 h))))</font></div>


<div><font face="courier new, monospace">                    (f b))))</font></div><div><br></div><div>Some explanations of my code: As</div><div><br></div><div><font face="courier new, monospace">    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})</font></div>


<div><br></div><div>equals</div><div><br></div><div><font face="courier new, monospace">    h/3 * (y_{0}</font></div><div><font face="courier new, monospace">           + 4 * (y_{1} + y_{3} + ... + y_{n-1})</font></div><div>


<font face="courier new, monospace">           + 2 * (y_{2} + y_{4} + ... + y_{n-2})</font></div><div><font face="courier new, monospace">           + y_{n})</font></div><div><br></div><div>I just use `sum` to compute `y_{1} + y_{3} + ... + y_{n-1}` and `y_{2} +</div>


<div>y_{4} + ... + y_{n-2}`.</div><div><br></div><div>Complete code here:</div><div><br></div><div><font face="courier new, monospace">    #lang racket</font></div><div><font face="courier new, monospace">    (define (cube x) (* x x x))</font></div>


<div><font face="courier new, monospace">    (define (sum term a next b)</font></div><div><font face="courier new, monospace">      (if (> a b)</font></div><div><font face="courier new, monospace">          0</font></div>


<div><font face="courier new, monospace">          (+ (term a)</font></div><div><font face="courier new, monospace">             (sum term (next a) next b))))</font></div><div><font face="courier new, monospace">    (define (integral f a b dx)</font></div>


<div><font face="courier new, monospace">      (define (add-dx x) (+ x dx))</font></div><div><font face="courier new, monospace">      (* (sum f (+ a (/ dx 2.0)) add-dx b)</font></div><div><font face="courier new, monospace">         dx))</font></div>


<div><font face="courier new, monospace">    (define (simpson-integral f a b n)</font></div><div><font face="courier new, monospace">      (define h (/ (- b a) n))</font></div><div><font face="courier new, monospace">      (define (next x) (+ x (* 2 h)))</font></div>


<div><font face="courier new, monospace">      (* (/ h 3) (+ (f a)</font></div><div><font face="courier new, monospace">                    (* 4 (sum f (+ a h) next (- b h)))</font></div><div><font face="courier new, monospace">                    (* 2 (sum f (+ a (* 2 h)) next (- b (* 2 h))))</font></div>


<div><font face="courier new, monospace">                    (f b))))</font></div><div><br></div><div>Some tests(The exact value should be 0.25):</div><div><br></div><div><font face="courier new, monospace">    > (integral cube 0 1 0.01)</font></div>


<div><font face="courier new, monospace">    0.24998750000000042</font></div><div><font face="courier new, monospace">    > (integral cube 0 1 0.001)</font></div><div><font face="courier new, monospace">    0.249999875000001</font></div>


<div><font face="courier new, monospace">    </font></div><div><font face="courier new, monospace">    > (simpson-integral cube 0 1.0 100)</font></div><div><font face="courier new, monospace">    0.23078806666666699</font></div>


<div><font face="courier new, monospace">    > (simpson-integral cube 0 1.0 1000)</font></div><div><font face="courier new, monospace">    0.24800798800666748</font></div><div><font face="courier new, monospace">    > (simpson-integral cube 0 1.0 10000)</font></div>


<div><font face="courier new, monospace">    0.2499999999999509</font></div><div><br></div><div>[1] <a href="http://stackoverflow.com/questions/19706893/implementation-of-simpsons-rule-sicp-exercise-1-29" target="_blank">http://stackoverflow.com/questions/19706893/implementation-of-simpsons-rule-sicp-exercise-1-29</a></div>


<div>[2] <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html" target="_blank">http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html</a></div><div><br></div><div>Thanks</div></div>
<br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><div style="font-family:arial;font-size:small"><b>Daniel Prager</b></div><div style="font-family:arial;font-size:small">Agile/Lean Coaching, Software Development and Leadership</div>

<div style="font-family:arial;font-size:small"><font color="#999999">Twitter:</font> <a href="https://twitter.com/agilejitsu" style="color:rgb(17,85,204)" target="_blank">@agilejitsu</a> </div><div style="font-family:arial;font-size:small">

<font color="#999999">Blog:</font> <a href="http://agile-jitsu.blogspot.com/" style="color:rgb(17,85,204)" target="_blank">agile-jitsu.blogspot.com</a></div></div>
</div>