如何将一个变量积分为二维插值函数

问题描述 投票:0回答:1

我想制作一份分析综合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)
python scipy integration interpolation
1个回答
0
投票

您的被积函数缺少对插值器函数的调用,应该是

f_interpolated(y) * multi_gaussian(y,mu1,sigma)

© www.soinside.com 2019 - 2024. All rights reserved.