Python/Scipy-沿轴与四边形集成
我有一个二维数组。“xy”平面是从(-1,-1)到(1,1)的栅格。我想在函数依赖于点坐标的每个点上计算和积分 我知道,对于离散数据,我可以使用simps或trapz并指定一个轴进行积分(参见示例)。使用scipy.integrate.quad而不使用如下所示的丑陋循环,这是否可行Python/Scipy-沿轴与四边形集成,python,arrays,numpy,numerical-integration,quad,Python,Arrays,Numpy,Numerical Integration,Quad,我有一个二维数组。“xy”平面是从(-1,-1)到(1,1)的栅格。我想在函数依赖于点坐标的每个点上计算和积分 我知道,对于离散数据,我可以使用simps或trapz并指定一个轴进行积分(参见示例)。使用scipy.integrate.quad而不使用如下所示的丑陋循环,这是否可行 import numpy as np import scipy as sp import scipy.integrate x = np.linspace(-1, 1, 10) y = np.linspace(-1,
import numpy as np
import scipy as sp
import scipy.integrate
x = np.linspace(-1, 1, 10)
y = np.linspace(-1, 1, 10)
X,Y = np.meshgrid(x, y)
z = np.linspace(1, 10, 100)
# Integrate discrete values using simps
def func(z):
return (X - z) / ((X - z)**2. + Y**2)
res1 = sp.integrate.simps(func(z.reshape(-1, 1, 1)), z, axis=0)
print(res1)
# Integrate the function using quad at each point in the xy plane
res2 = np.zeros(X.shape)
for i in range(res2.shape[0]):
for j in range(res2.shape[1]):
def func2(z):
return (X[i,j] - z) / ((X[i,j] - z)**2. + Y[i,j]**2)
res2[i,j] = sp.integrate.quad(func2, 1, 10)[0]
print(res2)
使用Steven Johnson教授的方法,我认为,您可以通过以下操作立即实现集成:
import numpy as np
from cubature import cubature
x = np.linspace(-1, 1, 10)
y = np.linspace(-1, 1, 10)
X,Y = np.meshgrid(x, y)
z = np.linspace(1, 10, 100)
def func(z):
return (X.ravel() - z) / ((X.ravel() - z)**2. + Y.ravel()**2)
res = cubature(1, func, np.array([1.]), np.array([10.]))[0].reshape(X.shape)
使用线性间隔的点不是很有效。一个更好的办法是转向四边形的求积格式,例如。例如:
import numpy
import quadpy
def f(x):
return (x[0] - 1) / ((x[0] - 1)**2 + x[1]**2)
quad = numpy.array([
[-1, -1],
[+1, -1],
[+1, +1],
[-1, +1],
])
scheme = quadpy.quadrilateral.Stroud(5)
val = quadpy.quadrilateral.integrate(f, quad, scheme)
到目前为止你试过答案了吗?是的,我试过了。我得到的答案与上面的例子相符,所以它似乎确实有效!谢谢