import math PRINTpts=True def adapt(f, a, b, err): trap = (f(a) + f(b))*(b-a)/2.0 c= float(a+b)/2.0 if PRINTpts: print c, f(c) simp= (f(a)+f(c)*4+f(b))*(b-a)/6.0 if math.fabs(simp-trap) < err : return simp return adapt(f,a,c,err/math.sqrt(2)) + adapt(f,c,b,err/math.sqrt(2)) #Not very polynomial like print " f=lambda x: math.sqrt(1-x**2)" f=lambda x: math.sqrt(1-x**2) a=0 b=1 print adapt(f,a,b,1.e-5)-math.pi/4 # somewhat polynomial like print " f=lambda x: 1+ 1.0/((x-.25)**2+.001) - 1.0/((x-.75)**2+.001)" f=lambda x:1.0+1.0/((x-.25)**2+.001) - 1.0/((x-.75)**2+.001) a=0 b=1 print adapt(f,a,b,1.e-1)-1.0 print " f=lambda x: 1+ 1.0/((x-.25)**2+.001) - 1.0/((x-.75)**2+.001)" print "try again with different range" print adapt(f,a,.45,1.e-1)+adapt(f,.45,b,1.e-1)-1.0