使用Python进行并行数值积分

8

我希望能够在Python中使用多个CPU对函数进行数值积分。我的期望是执行以下操作:

from scipy.integrate import quad
import multiprocessing
def FanDDW(arguments):
  wtq,eigq_files,DDB_files,EIGR2D_files,FAN_files = arguments
  ...
  return tot_corr

# Numerical integration
def integration(frequency):
# Parallelize the work over cpus
  pool = multiprocessing.Pool(processes=nb_cpus)
  total = pool.map(FanDDW, zip(wtq,eigq_files,DDB_files,EIGR2D_files,FAN_files))
  FanDDW_corr = sum(total)
  return quad(FanDDW, -Inf, Inf, args=(zip(wtq,eigq_files,DDB_files,EIGR2D_files,FAN_files)))[0]

vec_functionint = vectorize(integration)
vec_functionint(3,arange(1.0,4.0,0.5))

此外,“频率”是一个全局变量(不属于FanDDW(arguments))。它是一个包含函数必须评估的位置的向量。我认为quad应该以聪明的方式选择频率。如何将其传递给FanDDW,知道它不应分配在CPU之间,并且pool.map确实会这样做(这就是为什么我将它作为全局变量而不是将其传递给定义作为参数的原因)。
感谢您的任何帮助。
萨缪尔。
1个回答

0

所有经典的数值积分公式都具有以下形式

enter image description here

f(x_i)的计算通常是最耗费时间的,因此如果您想使用多个CPU,就必须考虑如何设计您的f。总和可以表示为标量积<w, f(x_i)>,当使用numpy.dot进行计算时,它会在大多数架构上使用线程。

quadpy(我的一个项目)会一次性调用所有点的积分函数,因此在f中,您有机会进行复杂的计算。

import quadpy


def f(x):
    print(x.shape)  # (1, 50)
    return x[0] ** 2


scheme = quadpy.e1r2.gauss_hermite(50)
val = scheme.integrate(f)

print(val)  # 0.886226925452758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接