<div dir="ltr">Thanks, Jens and Daniel.<div><br></div><div>There's no problem with Simpson's Rule. I got another way to implement Simpson's Rule from <a href="http://eli.thegreenplace.net/2007/07/11/sicp-section-131/">Eli Bendersky</a>. And re-wrote it in Racket:</div>
<div><br></div><div><div>    (define (simpson-integral2 f a b n)</div><div>      (define h (/ (- b a) n))</div><div>      (define (next counter) (+ counter 1))</div><div>      (define (term counter)</div><div>        (* (f (+ a (* h counter))) (cond</div>
<div>                                     ((= counter 0) 1)</div><div>                                     ((= counter n) 1)</div><div>                                     ((odd? counter) 4)</div><div>                                     ((even? counter) 2))))</div>
<div>      (* (/ h 3) (sum term 0 next n)))</div></div><div><br></div><div>The result is very accurate:</div><div><br></div><div>    > (simpson-integral2 cube 0 1.0 10)</div><div>    0.25</div><div>    > (simpson-integral2 cube 0 1.0 100)</div>
<div>    0.24999999999999992</div><div>    > (simpson-integral2 cube 0 1.0 1000)</div><div>    0.2500000000000003</div><div>    > (simpson-integral2 cube 0 1.0 10000)</div><div>    0.2500000000000011</div><div><br></div>
<div>Eli's code and mine are two implementations for the same Rule, but mine is far less accurate. So I think there's some wrong with my implementation. But I still can't find it out.</div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Tue, Nov 5, 2013 at 1:59 AM, Jens Axel Søgaard <span dir="ltr"><<a href="mailto:jensaxel@soegaard.net" target="_blank">jensaxel@soegaard.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2013/11/4 Ben Duan <<a href="mailto:yfefyf@gmail.com">yfefyf@gmail.com</a>>:<br>
<div class="im">> I've asked the question on Stack Overflow [1]. Óscar López gave me an<br>
> answer. But I still don't understand it. So I re-post it here:<br>
><br>
> Following is my code for SICP exercise 1.29 [2]. The exercise asks us to<br>
> implement Simpson's Rule using higher order procedure `sum`. It's supposed<br>
> to be more accurate than the original `integral` procedure. But I don't know why<br>
> it's not the case in my code:<br>
<br>
</div>A couple of points:<br>
<br>
 - to compare to methods M1 and M2 we need to specify the class of functions,<br>
   we will use the methods on<br>
 - when comparing the results of the two methods on a single function f,<br>
   we must use the same number of evaluations of f<br>
 - the most accurate method for a given number of evaluations n,<br>
   is the method which has the best worst case behaviour<br>
<br>
Thus when SICP says:<br>
"Simpson's Rule is a more accurate method of numerical integration<br>
than the method illustrated above."<br>
it doesn't mean that the Simpson rule will work better than, say, the<br>
midpoint method for all<br>
function. Some methods give very good results for polynomials of a small degree.<br>
Try your methods on some non-polynomials: say 1/x , ln(x), sqrt(x) and sin(x).<br>
<br>
See also some interesting examples here:<br>
<br>
<a href="http://www.math.uconn.edu/~heffernan/math1132s13/files/trapezoid_rule.pdf" target="_blank">http://www.math.uconn.edu/~heffernan/math1132s13/files/trapezoid_rule.pdf</a><br>
<br>
<br>
--<br>
Jens Axel Søgaard<br>
</blockquote></div><br></div>