numpy中Gauss-Legendre正交的不同间隔
Different intervals for Gauss-Legendre quadrature in numpy
我们如何在 [-1, 1]
以外的时间间隔内使用 NumPy 包 numpy.polynomial.legendre.leggauss
?
以下示例在区间 [-1, 1]
.
上将 scipy.integrate.quad
与 Gauss-Legendre 方法进行比较
import numpy as np
from scipy import integrate
# Define function and interval
a = -1.
b = 1.
f = lambda x: np.cos(x)
# Gauss-Legendre (default interval is [-1, 1])
deg = 6
x, w = np.polynomial.legendre.leggauss(deg)
gauss = sum(w * f(x))
# For comparison
quad, quad_err = integrate.quad(f, a, b)
print 'The QUADPACK solution: {0:.12} with error: {1:.12}'.format(quad, quad_err)
print 'Gauss-Legendre solution: {0:.12}'.format(gauss)
print 'Difference between QUADPACK and Gauss-Legendre: ', abs(gauss - quad)
输出:
The QUADPACK solution: 1.68294196962 with error: 1.86844092378e-14
Gauss-Legendre solution: 1.68294196961
Difference between QUADPACK and Gauss-Legendre: 1.51301193796e-12
到 change the interval,将 x 值从 [-1, 1] 转换为 [a, b] 使用,比方说,
t = 0.5*(x + 1)*(b - a) + a
然后将求积公式按(b - a)/2缩放:
gauss = sum(w * f(t)) * 0.5*(b - a)
这是您的示例的修改版本:
import numpy as np
from scipy import integrate
# Define function and interval
a = 0.0
b = np.pi/2
f = lambda x: np.cos(x)
# Gauss-Legendre (default interval is [-1, 1])
deg = 6
x, w = np.polynomial.legendre.leggauss(deg)
# Translate x values from the interval [-1, 1] to [a, b]
t = 0.5*(x + 1)*(b - a) + a
gauss = sum(w * f(t)) * 0.5*(b - a)
# For comparison
quad, quad_err = integrate.quad(f, a, b)
print 'The QUADPACK solution: {0:.12} with error: {1:.12}'.format(quad, quad_err)
print 'Gauss-Legendre solution: {0:.12}'.format(gauss)
print 'Difference between QUADPACK and Gauss-Legendre: ', abs(gauss - quad)
它打印:
The QUADPACK solution: 1.0 with error: 1.11022302463e-14
Gauss-Legendre solution: 1.0
Difference between QUADPACK and Gauss-Legendre: 4.62963001269e-14
quadpy(我的一个小项目)作为一个更简单的语法:
import numpy
import quadpy
out, err = quadpy.quad(numpy.cos, 1.1, 1.2)
我们如何在 [-1, 1]
以外的时间间隔内使用 NumPy 包 numpy.polynomial.legendre.leggauss
?
以下示例在区间 [-1, 1]
.
scipy.integrate.quad
与 Gauss-Legendre 方法进行比较
import numpy as np
from scipy import integrate
# Define function and interval
a = -1.
b = 1.
f = lambda x: np.cos(x)
# Gauss-Legendre (default interval is [-1, 1])
deg = 6
x, w = np.polynomial.legendre.leggauss(deg)
gauss = sum(w * f(x))
# For comparison
quad, quad_err = integrate.quad(f, a, b)
print 'The QUADPACK solution: {0:.12} with error: {1:.12}'.format(quad, quad_err)
print 'Gauss-Legendre solution: {0:.12}'.format(gauss)
print 'Difference between QUADPACK and Gauss-Legendre: ', abs(gauss - quad)
输出:
The QUADPACK solution: 1.68294196962 with error: 1.86844092378e-14
Gauss-Legendre solution: 1.68294196961
Difference between QUADPACK and Gauss-Legendre: 1.51301193796e-12
到 change the interval,将 x 值从 [-1, 1] 转换为 [a, b] 使用,比方说,
t = 0.5*(x + 1)*(b - a) + a
然后将求积公式按(b - a)/2缩放:
gauss = sum(w * f(t)) * 0.5*(b - a)
这是您的示例的修改版本:
import numpy as np
from scipy import integrate
# Define function and interval
a = 0.0
b = np.pi/2
f = lambda x: np.cos(x)
# Gauss-Legendre (default interval is [-1, 1])
deg = 6
x, w = np.polynomial.legendre.leggauss(deg)
# Translate x values from the interval [-1, 1] to [a, b]
t = 0.5*(x + 1)*(b - a) + a
gauss = sum(w * f(t)) * 0.5*(b - a)
# For comparison
quad, quad_err = integrate.quad(f, a, b)
print 'The QUADPACK solution: {0:.12} with error: {1:.12}'.format(quad, quad_err)
print 'Gauss-Legendre solution: {0:.12}'.format(gauss)
print 'Difference between QUADPACK and Gauss-Legendre: ', abs(gauss - quad)
它打印:
The QUADPACK solution: 1.0 with error: 1.11022302463e-14 Gauss-Legendre solution: 1.0 Difference between QUADPACK and Gauss-Legendre: 4.62963001269e-14
quadpy(我的一个小项目)作为一个更简单的语法:
import numpy
import quadpy
out, err = quadpy.quad(numpy.cos, 1.1, 1.2)