使用python进行并行数值积分

时间:2013-05-10 15:48:12

标签: python scipy multiprocessing numerical-integration

我想在python中使用多个cpus在数字上集成一个函数。我想做点什么:

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(参数)外部)。它是一个包含必须计算函数的位置的向量。我想四元组应该以聪明的方式选择频率。如何将它传递给FanDDW,知道它不应该在CPU之间分配,并且pool.map正是这样做的(这就是为什么我把它作为全局变量并且没有将它作为参数传递给定义的原因)。

感谢您的帮助。

塞缪尔。

1 个答案:

答案 0 :(得分: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