我需要在python中的6D中进行数值积分。由于scipy.integrate.nquad函数运行缓慢,因此我目前正在尝试通过将被积数定义为Numba的scipy.LowLevelCallable来加快处理速度。
通过复制给定here的示例,我能够使用scipy.integrate.quad在1D中做到这一点:
import numpy as np
from numba import cfunc
from scipy import integrate
def integrand(t):
return np.exp(-t) / t**2
nb_integrand = cfunc("float64(float64)")(integrand)
# regular integration
%timeit integrate.quad(integrand, 1, np.inf)
10000次循环,最佳3:每个循环128 µs
# integration with compiled function
%timeit integrate.quad(nb_integrand.ctypes, 1, np.inf)
100000个循环,每个循环中最好为3:7.08 µs
当我现在想使用nquad进行此操作时,nquad文档说:
但是以下代码给了我一个错误:
from numba import cfunc
import ctypes
def func(n_arg,x):
xe = x[0]
xh = x[1]
return np.sin(2*np.pi*xe)*np.sin(2*np.pi*xh)
nb_func = cfunc("float64(int64,CPointer(float64))")(func)
integrate.nquad(nb_func.ctypes, [[0,1],[0,1]], full_output=True)
错误:四元组:第一个参数是签名不正确的ctypes函数指针
是否可以使用numba编译可直接在代码中与nquad一起使用而无需在外部文件中定义该函数的函数?
提前非常感谢您!
最佳答案
将函数包装在 scipy.LowLevelCallable
中会使nquad
满意:
si.nquad(sp.LowLevelCallable(nb_func.ctypes), [[0,1],[0,1]], full_output=True)
# (-2.3958561404687756e-19, 7.002641250699693e-15, {'neval': 1323})
关于python - 如何实现从Numba调用的C以与nquad高效集成?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45823212/