使用python进行并行数值积分

spo*_*nce 7 python multiprocessing scipy 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))
Run Code Online (Sandbox Code Playgroud)

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

感谢您的任何帮助.

塞缪尔.

Nic*_*mer 0

所有经典求积规则都具有以下形式

在此输入图像描述

的计算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
Run Code Online (Sandbox Code Playgroud)