#!/usr/bin/env python
# A. Pletzer Tue Mar 20 11:42:05 EST 2001
# G. Genellina 2009-09-10: Minor syntax changes, compatibility with Python 2.4 and above
"""
Gauss Integration
"""
from itertools import izip
_nodes =(
(0.,),
(-0.5773502691896257,
0.5773502691896257,),
(-0.7745966692414834,
0.,
0.7745966692414834,),
(-0.861136311594053,
-0.3399810435848562,
0.3399810435848562,
0.861136311594053,),
(-0.906179845938664,
-0.5384693101056829,
0.,
0.5384693101056829,
0.906179845938664,),
(-0.932469514203152,
-0.6612093864662646,
-0.2386191860831968,
0.2386191860831968,
0.6612093864662646,
0.932469514203152,),
(-0.949107912342759,
-0.7415311855993937,
-0.4058451513773972,
0.,
0.4058451513773971,
0.7415311855993945,
0.949107912342759,),
(-0.960289856497537,
-0.7966664774136262,
-0.5255324099163289,
-0.1834346424956498,
0.1834346424956498,
0.5255324099163289,
0.7966664774136262,
0.960289856497537,),
(-0.968160239507626,
-0.836031107326637,
-0.6133714327005903,
-0.3242534234038088,
0.,
0.3242534234038088,
0.6133714327005908,
0.836031107326635,
0.968160239507627,),
(-0.973906528517172,
-0.865063366688984,
-0.6794095682990246,
-0.433395394129247,
-0.1488743389816312,
0.1488743389816312,
0.433395394129247,
0.6794095682990246,
0.865063366688984,
0.973906528517172,),
(-0.97822865814604,
-0.88706259976812,
-0.7301520055740422,
-0.5190961292068116,
-0.2695431559523449,
0.,
0.2695431559523449,
0.5190961292068117,
0.73015200557405,
0.887062599768093,
0.978228658146058,),
(-0.981560634246732,
-0.904117256370452,
-0.7699026741943177,
-0.5873179542866143,
-0.3678314989981804,
-0.1252334085114688,
0.1252334085114688,
0.3678314989981804,
0.5873179542866143,
0.7699026741943177,
0.904117256370452,
0.981560634246732,),
)
_weights=(
(2.,),
(1.,
1.,),
(0.5555555555555553,
0.888888888888889,
0.5555555555555553,),
(0.3478548451374539,
0.6521451548625462,
0.6521451548625462,
0.3478548451374539,),
(0.2369268850561887,
0.4786286704993665,
0.5688888888888889,
0.4786286704993665,
0.2369268850561887,),
(0.1713244923791709,
0.3607615730481379,
0.4679139345726913,
0.4679139345726913,
0.3607615730481379,
0.1713244923791709,),
(0.129484966168868,
0.2797053914892783,
0.3818300505051186,
0.4179591836734694,
0.3818300505051188,
0.279705391489276,
0.1294849661688697,),
(0.1012285362903738,
0.2223810344533786,
0.3137066458778874,
0.3626837833783619,
0.3626837833783619,
0.3137066458778874,
0.2223810344533786,
0.1012285362903738,),
(0.0812743883615759,
0.1806481606948543,
0.2606106964029356,
0.3123470770400029,
0.3302393550012597,
0.3123470770400025,
0.2606106964029353,
0.1806481606948577,
0.0812743883615721,),
(0.06667134430868681,
0.149451349150573,
0.2190863625159832,
0.2692667193099968,
0.2955242247147529,
0.2955242247147529,
0.2692667193099968,
0.2190863625159832,
0.149451349150573,
0.06667134430868681,),
(0.05566856711621584,
0.1255803694648743,
0.1862902109277404,
0.2331937645919927,
0.2628045445102466,
0.2729250867779006,
0.2628045445102466,
0.2331937645919933,
0.1862902109277339,
0.1255803694649132,
0.05566856711616958,),
(0.04717533638647547,
0.1069393259953637,
0.1600783285433586,
0.2031674267230672,
0.2334925365383534,
0.2491470458134027,
0.2491470458134027,
0.2334925365383534,
0.2031674267230672,
0.1600783285433586,
0.1069393259953637,
0.04717533638647547,),
)
_nodesLog =(
(0.3333333333333333,),
(0.1120088061669761,
0.6022769081187381,),
(0.06389079308732544,
0.3689970637156184,
0.766880303938942,),
(0.04144848019938324,
0.2452749143206022,
0.5561654535602751,
0.848982394532986,),
(0.02913447215197205,
0.1739772133208974,
0.4117025202849029,
0.6773141745828183,
0.89477136103101,),
(0.02163400584411693,
0.1295833911549506,
0.3140204499147661,
0.5386572173517997,
0.7569153373774084,
0.922668851372116,),
(0.0167193554082585,
0.100185677915675,
0.2462942462079286,
0.4334634932570557,
0.6323509880476823,
0.81111862674023,
0.940848166743287,),
(0.01332024416089244,
0.07975042901389491,
0.1978710293261864,
0.354153994351925,
0.5294585752348643,
0.7018145299391673,
0.849379320441094,
0.953326450056343,),
(0.01086933608417545,
0.06498366633800794,
0.1622293980238825,
0.2937499039716641,
0.4466318819056009,
0.6054816627755208,
0.7541101371585467,
0.877265828834263,
0.96225055941096,),
(0.00904263096219963,
0.05397126622250072,
0.1353118246392511,
0.2470524162871565,
0.3802125396092744,
0.5237923179723384,
0.6657752055148032,
0.7941904160147613,
0.898161091216429,
0.9688479887196,),
(0.007643941174637681,
0.04554182825657903,
0.1145222974551244,
0.2103785812270227,
0.3266955532217897,
0.4554532469286375,
0.5876483563573721,
0.7139638500230458,
0.825453217777127,
0.914193921640008,
0.973860256264123,),
(0.006548722279080035,
0.03894680956045022,
0.0981502631060046,
0.1811385815906331,
0.2832200676673157,
0.398434435164983,
0.5199526267791299,
0.6405109167754819,
0.7528650118926111,
0.850240024421055,
0.926749682988251,
0.977756129778486,),
)
_weightsLog=(
(-1.,),
(-0.7185393190303845,
-0.2814606809696154,),
(-0.5134045522323634,
-0.3919800412014877,
-0.0946154065661483,),
(-0.3834640681451353,
-0.3868753177747627,
-0.1904351269501432,
-0.03922548712995894,),
(-0.2978934717828955,
-0.3497762265132236,
-0.234488290044052,
-0.0989304595166356,
-0.01891155214319462,),
(-0.2387636625785478,
-0.3082865732739458,
-0.2453174265632108,
-0.1420087565664786,
-0.05545462232488041,
-0.01016895869293513,),
(-0.1961693894252476,
-0.2703026442472726,
-0.239681873007687,
-0.1657757748104267,
-0.0889432271377365,
-0.03319430435645653,
-0.005932787015162054,),
(-0.164416604728002,
-0.2375256100233057,
-0.2268419844319134,
-0.1757540790060772,
-0.1129240302467932,
-0.05787221071771947,
-0.02097907374214317,
-0.003686407104036044,),
(-0.1400684387481339,
-0.2097722052010308,
-0.211427149896601,
-0.1771562339380667,
-0.1277992280331758,
-0.07847890261203835,
-0.0390225049841783,
-0.01386729555074604,
-0.002408041036090773,),
(-0.12095513195457,
-0.1863635425640733,
-0.1956608732777627,
-0.1735771421828997,
-0.135695672995467,
-0.0936467585378491,
-0.05578772735275126,
-0.02715981089692378,
-0.00951518260454442,
-0.001638157633217673,),
(-0.1056522560990997,
-0.1665716806006314,
-0.1805632182877528,
-0.1672787367737502,
-0.1386970574017174,
-0.1038334333650771,
-0.06953669788988512,
-0.04054160079499477,
-0.01943540249522013,
-0.006737429326043388,
-0.001152486965101561,),
(-0.09319269144393,
-0.1497518275763289,
-0.166557454364573,
-0.1596335594369941,
-0.1384248318647479,
-0.1100165706360573,
-0.07996182177673273,
-0.0524069547809709,
-0.03007108900074863,
-0.01424924540252916,
-0.004899924710875609,
-0.000834029009809656,),
)
_NGMAX = len(_nodes)
_NGMIN = 1
def gauss(xmin, xmax, funct, ng=10):
"""
Gauss quadature (weight function = 1.0):
xmin, xmax: boundaries of integration domain
funct: integrand function
ng: Gauss integration order
"""
ng = max(min(ng, _NGMAX), _NGMIN)
ns = _nodes[ng-1]
ws = _weights[ng-1]
dx = xmax - xmin
xs = [(dx*y + xmin + xmax)/2. for y in ns]
return 0.5*dx*sum(funct(x)*w for x,w in izip(xs,ws))
def gaussLog(xmin, xmax, funct, ng=10):
"""
Gauss quadature with Log singularity at x=xmin:
xmin, xmax: boundaries of integration domain
funct: integrand function
ng: Gauss integration order
"""
ng = max(min(ng, _NGMAX), _NGMIN)
ns = _nodesLog[ng-1]
ws = _weightsLog[ng-1];
dx = xmax - xmin
xs = [(dx*y + xmin) for y in ns]
return dx*sum(funct(x)*w for x,w in izip(xs,ws))
####
if __name__ == '__main__':
from math import *
def f2(x):
return x**2
def f3(x):
return x**4
def f4(x):
return cos(2.*pi*(x-0.128726465))
def f5(x):
return 2.*cos(2.*pi*(x-0.128726465))**2
print '-'*80
print 'Gauss (weight function = 1)'
print '-'*80
# simple tests
print 'gauss(0., 1., f3, 1)=', gauss(0., 1., f3, 1)
print 'gauss(0., 1., f3, 2)=', gauss(0., 1., f3, 2)
print 'gauss(0., 1., f4, 3)=', gauss(0., 1., f3, 3)
print 'gauss(0., 1., f3 )=', gauss(0., 1., f3 )
# convergence test
ng = range(_NGMIN, _NGMAX+1)
print """\n
Integrate[Cos[2.*Pi*(x-0.128726465)], {x, 0, 1}]
\n"""
error = [gauss(0., 10.0, f4, n) for n in ng]
print ' n = ', '%8d'*len(ng) % tuple(ng)
print 'error = ', '%8.0e'*len(error) % tuple(error)
print """\n
Integrate[2.*Cos[2.*Pi*(x-0.128726465)]^2, {x, 0, 1}]
\n"""
error = [gauss(0., 1.0, f5, n)-1.0 for n in ng]
print ' n = ', '%8d'*len(ng) % tuple(ng)
print 'error = ', '%8.0e'*len(error) % tuple(error)
print '-'*80
print 'Gauss with Log singularity at left boundary'
print '-'*80
a, b = 0., 1.
print """\n
Integrate[Log[x]*x^2, {x, 0, 1}]
\n"""
exact = -1./9.
error = [gaussLog(a, b, f2, n) - exact for n in ng]
print ' n = ', '%8d'*len(ng) % tuple(ng)
print 'error = ', '%8.0e'*len(error) % tuple(error)
print """\n
Integrate[Log[x]*2.*Cos[2.*Pi*(x-0.128726465)]^2, {x, 0, 1}]
\n"""
exact = -1.242002481967963
error = [gaussLog(a, b, f5, n) - exact for n in ng]
print ' n = ', '%8d'*len(ng) % tuple(ng)
print 'error = ', '%8.0e'*len(error) % tuple(error)