<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Numerical Integration</title>
	<atom:link href="http://programmingpraxis.com/2010/02/09/numerical-integration/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmingpraxis.com/2010/02/09/numerical-integration/</link>
	<description>A collection of etudes, updated weekly, for the education and enjoyment of the savvy programmer</description>
	<lastBuildDate>Sat, 11 Feb 2012 09:48:16 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Graham</title>
		<link>http://programmingpraxis.com/2010/02/09/numerical-integration/#comment-3554</link>
		<dc:creator><![CDATA[Graham]]></dc:creator>
		<pubDate>Thu, 08 Sep 2011 16:41:58 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1976#comment-3554</guid>
		<description><![CDATA[Github account moved, so gist disappeared. Here&#039;s my submission (in Python 2.x):
[sourcecode lang=&quot;python&quot;]
from __future__ import division
from math import log

def dx(a, b, n):
    return (b - a) / n

def rectangle(f, a, b, n=1):
    x = lambda k: a + (k + 0.5) * dx(a, b, n)
    return dx(a, b, n) * sum(f(x(k)) for k in xrange(n))

def trapezoid(f, a, b, n=1):
    x = lambda k: a + k * dx(a, b, n)
    return dx(a, b, n) * (f(a) + f(b) + sum(0.5 * (f(x(k)) + f(x(k + 1))) for k
        in xrange(1, n)))

def simpson(f, a, b, n=1):
    x = lambda k: a + k * dx(a, b, 2 * n)
    return dx(a, b, 2 * n) / 3 * (f(a) + f(b) + 2 * sum(f(x(k)) for k in
        xrange(2, 2 * n, 2)) + 4 * sum(f(x(k)) for k in xrange(1, 2 * n, 2)))

def adaptive_quad(f, a, b, quad=simpson, eps=1e-7):
    int_with5 = quad(f, a, b, 5)
    int_with10 = quad(f, a, b, 10)
    m = (a + b) / 2
    if abs(int_with5 - int_with10) &lt; eps:
        return int_with10
    else:
        return (adaptive_quad(f, a, m, quad, eps) +
                adaptive_quad(f, m, b, quad, eps))

def approx_pi(b):
    return adaptive_quad(lambda x: 1 / log(x), 2, b)

if __name__ == &quot;__main__&quot;:
    cube = lambda x: pow(x, 3)
    print rectangle(cube, 0, 1, 10000)
    print trapezoid(cube, 0, 1, 10000)
    print simpson(cube, 0, 1, 10000)
    print approx_pi(1e21)
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>Github account moved, so gist disappeared. Here&#8217;s my submission (in Python 2.x):</p>
<pre class="brush: python;">
from __future__ import division
from math import log

def dx(a, b, n):
    return (b - a) / n

def rectangle(f, a, b, n=1):
    x = lambda k: a + (k + 0.5) * dx(a, b, n)
    return dx(a, b, n) * sum(f(x(k)) for k in xrange(n))

def trapezoid(f, a, b, n=1):
    x = lambda k: a + k * dx(a, b, n)
    return dx(a, b, n) * (f(a) + f(b) + sum(0.5 * (f(x(k)) + f(x(k + 1))) for k
        in xrange(1, n)))

def simpson(f, a, b, n=1):
    x = lambda k: a + k * dx(a, b, 2 * n)
    return dx(a, b, 2 * n) / 3 * (f(a) + f(b) + 2 * sum(f(x(k)) for k in
        xrange(2, 2 * n, 2)) + 4 * sum(f(x(k)) for k in xrange(1, 2 * n, 2)))

def adaptive_quad(f, a, b, quad=simpson, eps=1e-7):
    int_with5 = quad(f, a, b, 5)
    int_with10 = quad(f, a, b, 10)
    m = (a + b) / 2
    if abs(int_with5 - int_with10) &lt; eps:
        return int_with10
    else:
        return (adaptive_quad(f, a, m, quad, eps) +
                adaptive_quad(f, m, b, quad, eps))

def approx_pi(b):
    return adaptive_quad(lambda x: 1 / log(x), 2, b)

if __name__ == &quot;__main__&quot;:
    cube = lambda x: pow(x, 3)
    print rectangle(cube, 0, 1, 10000)
    print trapezoid(cube, 0, 1, 10000)
    print simpson(cube, 0, 1, 10000)
    print approx_pi(1e21)
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Graham</title>
		<link>http://programmingpraxis.com/2010/02/09/numerical-integration/#comment-2839</link>
		<dc:creator><![CDATA[Graham]]></dc:creator>
		<pubDate>Wed, 13 Apr 2011 00:40:53 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1976#comment-2839</guid>
		<description><![CDATA[A bit late to the party, but my solution in available &lt;a href=&quot;https://gist.github.com/916752&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.]]></description>
		<content:encoded><![CDATA[<p>A bit late to the party, but my solution in available <a href="https://gist.github.com/916752" rel="nofollow">here</a>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mike</title>
		<link>http://programmingpraxis.com/2010/02/09/numerical-integration/#comment-1159</link>
		<dc:creator><![CDATA[Mike]]></dc:creator>
		<pubDate>Thu, 15 Apr 2010 20:40:56 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1976#comment-1159</guid>
		<description><![CDATA[Python code.  

[sourcecode lang=&quot;python&quot;]
def rectangular(f, lo, hi, nsteps=1):
    area = 0
    spread = float(hi-lo)
    for n in range(nsteps):
        x = lo + spread*(2*n+1)/(2*nsteps)
        area += f(x)
        
    return area*spread/nsteps

def trapezoidal(f, lo, hi, nsteps=1):
    area = -(f(lo) + f(hi))
    spread = float(hi-lo)
    for n in range(nsteps+1):
        x = lo + n*spread/nsteps
        area += 2*f(x)

    return area*float(hi-lo)/(2*nsteps)

def simpson(f, lo, hi, nsteps=1):
    area = -(f(lo) + f(hi))
    spread = float(hi-lo)
    for n in range(2*nsteps+1):
        x = lo + n*spread/(2*nsteps)
        area += 4*f(x) if n&amp;1 else 2*f(x)

    return area*spread/(6*nsteps)

def adaptive(f, lo, hi, integrator=simpson, eps=1e-3):
    lo,hi = float(lo),float(hi)
    area = 0
    todo = [(lo, hi,integrator(f, lo, hi))]

    while todo:
        a,b,slice_area = todo.pop()
        mid = (a+b)/2
        lohalf = integrator(f, a, mid)
        hihalf = integrator(f, mid, b)
        if abs(slice_area - (lohalf + hihalf)) &gt; eps:
            todo.append((a,mid,lohalf))
            todo.append((mid,b,hihalf))
        else:
            area += lohalf + hihalf

    return area


# tests
def cube(x):
    return x*x*x

def invlog(x):
    from math import log
    
    return 1/log(x)

print rectangular(cube, 0, 1, 10000)
print trapezoidal(cube, 0, 1, 10000)
print simpson(cube, 0, 1, 10000)
print adaptive(invlog, 2, 1e21, eps=1e-7)

[/sourcecode]
output:
0.24999999875
0.2500000025
0.25
2.11272694866e+19]]></description>
		<content:encoded><![CDATA[<p>Python code.  </p>
<pre class="brush: python;">
def rectangular(f, lo, hi, nsteps=1):
    area = 0
    spread = float(hi-lo)
    for n in range(nsteps):
        x = lo + spread*(2*n+1)/(2*nsteps)
        area += f(x)

    return area*spread/nsteps

def trapezoidal(f, lo, hi, nsteps=1):
    area = -(f(lo) + f(hi))
    spread = float(hi-lo)
    for n in range(nsteps+1):
        x = lo + n*spread/nsteps
        area += 2*f(x)

    return area*float(hi-lo)/(2*nsteps)

def simpson(f, lo, hi, nsteps=1):
    area = -(f(lo) + f(hi))
    spread = float(hi-lo)
    for n in range(2*nsteps+1):
        x = lo + n*spread/(2*nsteps)
        area += 4*f(x) if n&amp;1 else 2*f(x)

    return area*spread/(6*nsteps)

def adaptive(f, lo, hi, integrator=simpson, eps=1e-3):
    lo,hi = float(lo),float(hi)
    area = 0
    todo = [(lo, hi,integrator(f, lo, hi))]

    while todo:
        a,b,slice_area = todo.pop()
        mid = (a+b)/2
        lohalf = integrator(f, a, mid)
        hihalf = integrator(f, mid, b)
        if abs(slice_area - (lohalf + hihalf)) &gt; eps:
            todo.append((a,mid,lohalf))
            todo.append((mid,b,hihalf))
        else:
            area += lohalf + hihalf

    return area

# tests
def cube(x):
    return x*x*x

def invlog(x):
    from math import log

    return 1/log(x)

print rectangular(cube, 0, 1, 10000)
print trapezoidal(cube, 0, 1, 10000)
print simpson(cube, 0, 1, 10000)
print adaptive(invlog, 2, 1e21, eps=1e-7)
</pre>
<p>output:<br />
0.24999999875<br />
0.2500000025<br />
0.25<br />
2.11272694866e+19</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Remco Niemeijer</title>
		<link>http://programmingpraxis.com/2010/02/09/numerical-integration/#comment-1000</link>
		<dc:creator><![CDATA[Remco Niemeijer]]></dc:creator>
		<pubDate>Tue, 09 Feb 2010 10:28:49 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1976#comment-1000</guid>
		<description><![CDATA[My Haskell solution (see http://bonsaicode.wordpress.com/2010/02/09/programming-praxis-numerical-integration/ for a version with comments):

[sourcecode lang=&quot;css&quot;]
int combine f a b n = sum $ map g [0..n - 1] where
    w    = (b - a) / n
    lo i = a + w * i
    g i  = w * combine (f $ lo i) (f $ lo i + w/2) (f $ lo i + w)

intRect = int (\_ m _ -&gt; m)

intTrap = int (\l _ h -&gt; (l + h) / 2)

intSimp = int (\l m h -&gt; (l + 4 * m + h) / 6)

intAdapt m f a b epsilon = if abs (g10 - g5) &lt; e then g10 else
    intAdapt m f a mid (Just e) + intAdapt m f mid b (Just e)
    where g5  = m f a b 5
          g10 = m f a b 10
          mid = (a + b) / 2
          e   = maybe 1e-7 id epsilon

approxPi n = round $ intAdapt intSimp (recip . log) 2 n Nothing
[/sourcecode]]]></description>
		<content:encoded><![CDATA[<p>My Haskell solution (see <a href="http://bonsaicode.wordpress.com/2010/02/09/programming-praxis-numerical-integration/" rel="nofollow">http://bonsaicode.wordpress.com/2010/02/09/programming-praxis-numerical-integration/</a> for a version with comments):</p>
<pre class="brush: css;">
int combine f a b n = sum $ map g [0..n - 1] where
    w    = (b - a) / n
    lo i = a + w * i
    g i  = w * combine (f $ lo i) (f $ lo i + w/2) (f $ lo i + w)

intRect = int (\_ m _ -&gt; m)

intTrap = int (\l _ h -&gt; (l + h) / 2)

intSimp = int (\l m h -&gt; (l + 4 * m + h) / 6)

intAdapt m f a b epsilon = if abs (g10 - g5) &lt; e then g10 else
    intAdapt m f a mid (Just e) + intAdapt m f mid b (Just e)
    where g5  = m f a b 5
          g10 = m f a b 10
          mid = (a + b) / 2
          e   = maybe 1e-7 id epsilon

approxPi n = round $ intAdapt intSimp (recip . log) 2 n Nothing
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Programming Praxis &#8211; Numerical Integration &#171; Bonsai Code</title>
		<link>http://programmingpraxis.com/2010/02/09/numerical-integration/#comment-999</link>
		<dc:creator><![CDATA[Programming Praxis &#8211; Numerical Integration &#171; Bonsai Code]]></dc:creator>
		<pubDate>Tue, 09 Feb 2010 10:28:32 +0000</pubDate>
		<guid isPermaLink="false">http://programmingpraxis.com/?p=1976#comment-999</guid>
		<description><![CDATA[[...] Praxis &#8211; Numerical&#160;Integration By Remco Niemeijer  In today&#8217;s Programming Praxis exercise we have to do some numerical integration. Let&#8217;s get [...]]]></description>
		<content:encoded><![CDATA[<p>[...] Praxis &#8211; Numerical&nbsp;Integration By Remco Niemeijer  In today&#8217;s Programming Praxis exercise we have to do some numerical integration. Let&#8217;s get [...]</p>
]]></content:encoded>
	</item>
</channel>
</rss>

