Python中函数与采样数据的双重积分
我想找到一种方法,使用numpy的trapz函数或者scipy库中的类似函数,对采样数据进行双重积分。
具体来说,我想计算这个函数:
这里的f(x',y')
是我采样得到的数组,而F(x, y)
是一个维度相同的数组。
这是我尝试的代码,但结果不正确:
def integrate_2D(f, x, y):
def integral(f, x, y, x0, y0):
F_i = np.trapz(np.trapz(np.arcsinh(1/np.sqrt((x-x0+0.01)**2+(y-y0+0.01)**2)) * f, x), y)
return F_i
sigma = 1.0
F = [[integral(f, x, y, x0, y0) for x0 in x] for y0 in y]
return F
xlin = np.linspace(0, 10, 100)
ylin = np.linspace(0, 10, 100)
X,Y = np.meshgrid(xlin, ylin)
f = 1.0 * np.exp(-((X - 8.)**2 + (Y - 8)**2)/(8.0))
f += 0.5 * np.exp(-((X - 1)**2 + (Y - 9)**2)/(10.0))
F = integrate_2D(f, xlin, ylin)
输出的数组似乎是沿着结果网格的对角线排列的,而我希望它返回的数组看起来像是模糊的输入数组。
1 个回答
3
我明白你想要做的事情,但你现在的嵌套结构让逻辑变得不清晰。你可以试试这样做,
def int_2D( x, y, xlo=0.0, xhi=10.0, ylo=0.0, yhi=10.0, Nx=100, Ny=100 ):
# construct f(x,y) for given limits
#-----------------------------------
xlin = np.linspace(xlo, xhi, Nx)
ylin = np.linspace(ylo, yhi, Ny)
X,Y = np.meshgrid(xlin, ylin)
f = 1.0 * np.exp(-((X - 8.)**2 + (Y - 8)**2)/(8.0))
f += 0.5 * np.exp(-((X - 1)**2 + (Y - 9)**2)/(10.0))
# construct 2-D integrand
#-----------------------------------
m = np.sqrt( (x - X)**2 + (y - Y)**2 )
y = 1.0 / np.arcsinh( m ) * f
# do a 1-D integral over every row
#-----------------------------------
I = np.zeros( Ny )
for i in range(Ny):
I[i] = np.trapz( y[i,:], xlin )
# then an integral over the result
#-----------------------------------
F = np.trapz( I, ylin )
return F