【问题标题】:Parallel numerical integration using python使用python进行并行数值积分
【发布时间】:2013-05-05 08:42:50
【问题描述】:

我想在 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 正是这样做的(这就是我将它作为全局变量而不将其作为参数传递给定义的原因)。

感谢您的帮助。

塞缪尔。

【问题讨论】:

    标签: python scipy multiprocessing numerical-integration


    【解决方案1】:

    所有经典的求积规则都有这种形式

    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
    

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 2014-07-06
      • 2019-08-28
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2013-12-16
      • 1970-01-01
      相关资源
      最近更新 更多