我正在处理一个涉及很多插值函数的积分,例如
import scipy.integrate as integrate
integrate.quad(lambda t: 1/func_a(t)*(func_g2(tp)*func_g1p(t)-func_g1(tp)*func_g2p(t))
*func_jl(t)/((tau0-t)**2 * klist[84]**2), tp, tau0, limit=100)
其中func_a,func_g1,func_g1p,func_g2,func_g2p和func_jl都是插值函数(使用三次样条曲线完成)。不幸的是,代码性能并不令人满意,所以我正在考虑使用scipy的LowLevelCallable来加速它
从scipy的文档来看,似乎我应该在C代码中只包含我的被积函数的一个函数体,具有特定的函数签名模式,例如
double f(double * x, void * userdata)
{
// integrand here, e.g.
// return 1/func_a(t)*(func_g2(tp)*func_g1p(t)-func_g1(tp)*func_g2p(t))
// *func_jl(t)/(pow(tau0-t, 2) * pow(klist[84], 2));
}
其中,x是要进行积分的参数,userdata包含一些其他参数。但这意味着我没有地方初始化插值函数,除非我在userdata中提供表,并在每次调用被积函数时生成插值函数(我想性能不会很好)。因此,我想知道是否还有其他方法可以让我实际使用scipy.lowlevellable方法和插值函数,或者以另一种方式加速集成
谢谢
是的,但是你必须重写插值函数
你提到过,你有三次样条曲线。不考虑特殊情况,这可以很容易地用C代码实现。样条曲线的生成可以在Python中完成
低级可调用的示例
如何使用Python中的低级可调用函数?
这可以通过使用ctypes包装器来实现,该包装器包括一些生成结构的函数,该结构可以使用void指针来传递
实现的比较
现在比较纯Python实现和C实现的运行时
纯Python
使用低级可调用
相关问题 更多 >
编程相关推荐