import numpy as np
from math import exp, sqrt, pi
from integ_gauss_legendre import integ_GL
"""
Numerial integration by Imoto-Moriguchi-Takazawa (I.M.T.) formula
"""
# define function to be integrated
[ドキュメント]
def func(x):
return sqrt(1.0 - x*x)
# define analytical integration of f(x)
#def F(x):
# return exp(x)
Q = 0.00702985840661; # int(exp(-1/t - 1/(1-t) by Gauss-Legendre method
[ドキュメント]
def IMTfunc(x):
return exp(-1.0 / x - 1.0 / (1.0-x)) / Q;
#===================
# parameters
#===================
# Gauss-Legendre integration parameters to convert x to u
n_gl_order = 5
ngl = 10
# Integration parameters
xmin, xmax = -1.0, 1.0
nblock_max = 10
#===================
# main routine
#===================
print("Numerical integration using by IMT formula")
fx = func(xmin)
#Fx = F(xmax) - F(xmin)
Fx = pi / 2.0
print("")
print("Analytical values:")
print(" f({})={}".format(xmin, fx))
print(" integ(f)[{}, {}]={}".format(xmin, xmax, Fx))
print("")
print("nBlock\tS\tError")
for nblock in range(2, nblock_max+1):
h = (1.0 - 0.0) / nblock;
S = 0.0;
for i in range(1, nblock):
# ui is in the converted range [0, 1]
ui = i * h;
# x' = phi(ui) is in [0,1]
phiui = 0.0
for j in range(ngl):
hgl = (ui - 0.0) / ngl
x0_gl = 0.0 + j * hgl
x1_gl = x0_gl + hgl
phiui += integ_GL(n_gl_order, IMTfunc, x0_gl, x1_gl)
# obtain the original x from x' = phi(ui)
xi = xmin + (xmax - xmin) * phiui
yi = func(xi);
phi1 = exp(-1.0 / ui - 1.0 / (1.0 - ui)) / Q
S += yi * phi1
S *= (xmax - xmin) / nblock
print("{}\t{}\t{}".format(nblock, S, S - Fx))