python - 如何使用 scipy.integrate.fixed_quad 一次计算多个积分?

标签 python numpy scipy array-broadcasting

给定一个函数func(x,y,z),我想提供一个函数

def integral_over_z(func,x,y,zmin=0,zmax=1,n=16):
    lambda_func = z,x,y: ???
    return scipy.integrate.fixed_quad(lambda_func,a=zmin,b=zmax,args=(x,y),n=n)

使用scipy.integrate.fixed_quad计算用户提供的(x,y)输入在z上的积分。输入 (x,y) 可以是单个浮点或 float 组(当两者都是数组时,它们的形状相同)。

scipy.integrate.fixed_quad支持向量值函数的积分。为此,函数 func 必须返回相应的更高维度的数组:“如果集成向量值函数,则返回的数组必须具有形状 (..., len(x) )"(来自文档)。

因此,我的问题是如何生成 lambda_func 的相应输出数组(可以使用特殊用途的来实现)。

编辑:为了帮助理解我的问题,这里有一个可行的实现,但没有通过 z 进行矢量化(因此不使用 scipy.integrate.fixed_quad )。

def integral_over_z(func,x,y,zmin,zmax,n=16):
    z,w = scipy.special.roots_legendre(n)
    dz = 0.5*(zmax-zmin)
    z = zmin + (np.real(z)+1) * dz
    w = np.real(w) * dz
    result = w[0] * func(x,y,z[0])
    for i in range(1,len(z)):
        result += w[i] * func(x,y,z[i])
    return result

问题是:如何对其进行矢量化,以便它适用于任何有效输入(x 和/或 y float 或数组)。

另一个编辑: 对于通过 scipy.integrate.fixed_quad 实现,被积函数必须采用形状为 (nz)z 一维数组。输入xy必须一起广播,当它们的广播形状可以是任何东西时,比如(n0,n1,..,nk) 那么从 func 返回的值必须具有形状 (n0,n1,..,nk,nz) ——我如何生成它?

最佳答案

它似乎是一个向量值函数,向量值必须位于第 0 维,并且积分参数(在您的情况下 z)必须放在最后(这就是它们的含义 ( ..., len(x)),他们的x是你的z),我认为这来自广播规则。以下示例对我来说效果很好 - 这里的关键是 xy 必须具有正确的形状才能使广播工作

import numpy as np
import scipy.integrate
def integral_over_z(func,x,y,n=16):
    lambda_func = lambda z, x, y: func(x[..., None],y[..., None],z)  # the last dimension of (x,y) needs to be size 1, but you can have as many leading dimensions as you want
    return scipy.integrate.fixed_quad(lambda_func,a=0,b=1,args=(x,y),n=n)
func = lambda x,y,z: 1 + 0*x + 0*y + 0*z  # make sure that the output has the right (broadcast) shape
x = np.zeros((5,))
y =  np.arange(5)
print(integral_over_z(func, x, y, 2))

关于python - 如何使用 scipy.integrate.fixed_quad 一次计算多个积分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72318912/

相关文章:

python - 多维数组行列式

python - 使用 Python/Pandas/Numpy 的几何级数(无循环并使用递归)

python - 如何从 Python 中的数据框中排除非数字整数

python - stats.f_oneway Scipy Anova 返回 2 个包含 4 个值的数组

python - Python 中更节省内存的结构表示?

python - Kivy - 保存对象的值在弹出窗口中更改,因此关闭它后,当我再次打开弹出窗口时,它会以新值打开

python-3.x - numpy apply_along_axis 矢量化

python - Scipy nnls算法没有终止容错选项

python - 为什么这个二分搜索算法两次返回 None ?

Python 和 Pandas : a proper way to fetch data from a dataframe and create a new one