如何知道由nquad调用的C函数中的维数?
问题描述:
SciPy的documentation为nquad规定,用于集成C函数的形式如何知道由nquad调用的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函数应该知道有多少维正被集成,以使用args正确数量的?
如果我修改一般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]]))
我得到之间的值。 32764和32767在64位fedora 25上的n,而在32位的fedora 25上我得到0.在上面的链接中,c函数on不检查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])
的数组。
注意这两个推动所有的变量压入堆栈,并从堆栈中让他们很昂贵操作时经常执行,可以用这种方式避免。
答
我在github上的一个scipy问题中得到了答案:n是双参数[]的长度,其中包括函数应被评估的坐标以及任何其他给nquad并传递给c函数的参数
问题是根据他们的文档和我的测试,n只告诉数字的额外参数,而不是维数。 – user1226313