对于nquad,Scipydocumentation表示用于集成的c函数的形式
f(int n, double args[n])
where n is the number of extra parameters and args is an array of doubles of the additional parameters.
那么,为了使用正确数量的参数,c函数应该如何知道集成了多少维?
如果我将一般documentation使用的c函数修改为:
#include "stdio.h"
double f(int n, double args[]) {
(void)args;
printf("%i\n", n);
return 0;
}
编译时使用
gcc -fPIC -shared func.c -o func.so
运行这个python程序:
#!/usr/bin/env python3
import ctypes
from scipy.integrate import nquad
lib = ctypes.CDLL('func.so')
func = lib.f
func.restype = ctypes.c_double
func.argtypes = (ctypes.c_int, ctypes.c_double)
print(nquad(func, [[0, 1]]))
在64位fedora 25上,n的值在32764和32767之间,而在32位fedora 25上,我得到0。在上面的链接中,c函数不检查n的值,而是使用args[0]…args[2],所以无法知道集成了多少维度?
使用以下命令调用nquad:
print(nquad(func, [[0, 1]], args = [1,2,3]))
相反,不会更改64位系统上打印的内容,即使n应该不同。我在用
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
Python 3.5.2
scipy 0.18.0
最佳答案
我读了文档(你的第一个链接)。我认为他们说的是,他们不是调用func(x0, x1, ..., xn, t0, t1, ..., tm)
,而是“将所有参数压缩为f(int n, double args[n])
中的一个计数和一个数组”。
请注意,将所有变量推送到堆栈上,以及从堆栈中获取变量,这两种操作在经常执行时都是代价高昂的操作,可以通过这种方式避免。
关于python - 如何知道nquad调用的C函数中的维数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42536982/