我想制作一份分析综合pdf。被积函数是 x,y 中插值(通过
RegularGridInterpolator
)二维数组与 y 中解析高斯函数之间的乘积。我只需要集成到 y 中。可以这样做吗?当我将高斯函数和插值函数相乘并使用命令 lambda
定义该函数时,会引发以下错误:
unsupported operand type(s) for *: 'float' and 'RegularGridInterpolator'
那么,即使在尝试对其进行积分之前,我如何将插值函数与分析函数结合起来以获得可以积分的被积函数?
将解析函数和插值函数定义为
N(y)
和 d(x,y)
,我尝试将被积函数定义为:
integrand = lambda x, y: N(y)*d(x,y)
这是一个重现我必须做的事情的例子。当然,在不知道解析的二维高斯的情况下
import numpy as np
from scipy.interpolate import RegularGridInterpolator
import scipy
a = np.linspace(0.2,2.0,700)
b = np.linspace(-np.pi/2,np.pi/2,700)
y = np.linspace(-np.pi/2,np.pi/2,700)
mu1 = np.pi/5
sigma = 0.3
mu=np.array([4.,2.]) #mean
C =np.array([[1.44, -0.702], [-0.702, 0.81]]) #covariance matrix
V=np.linalg.inv(C)
def multi_gaussian(x,mu,V):
y=x-mu
v = np.array([V])
if v.size>1:
dets = np.linalg.det(V)
n = mu.size
Exp=np.exp(np.sum(-0.5*(y @ V*y),axis=-1))
norm = (1./(((2*np.pi)**(n/2)))*np.sqrt(dets))
if v.size==1:
s=V**(-0.5)
norm = ((2*np.pi)**(0.5)*s)**(-1)
Exp=np.exp(-0.5*(y**2)*V)
z=(norm*Exp)
return z
X, Y = np.meshgrid(a,b)
Z = np.stack((X,Y), axis=-1)
f_numerical = multi_gaussian(Z, mu, V)
f_interpolated = RegularGridInterpolator([a,b], f_numerical,
bounds_error = False, fill_value = 0.)
integrand = lambda y: f_interpolated*multi_gaussian(y,mu1,sigma)
integral = scipy.integrate.quad(integrand, -np.pi/2, np.pi/2)
您的被积函数缺少对插值器函数的调用,应该是
f_interpolated(y) * multi_gaussian(y,mu1,sigma)