2017-03-01 6 views
1

scipyのダウンロードdocumentationは、統合のために使用されるC関数はフォームnquadによって呼び出されるC関数の次元数を知るには? nquad状態の

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関数を変更する場合:私は間の値を取得

#!/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]])) 

gcc -fPIC -shared func.c -o func.so 

でコンパイルし、このPythonプログラムを実行

#include "stdio.h" 
double f(int n, double args[]) { 
    (void)args; 
    printf("%i\n", n); 
    return 0; 
} 

64bit fedora 25では32764と32767が、32bit fedora 25では0が得られます。上記リンクでは、 onはnの値をチェックしませんが、args [0] ... args [2]を使用するので、いくつのディメンションが統合されているか知る方法はありませんか?

とnquadを呼び出す:代わりに、nは異なるべきであるにもかかわらず、64ビットシステムで印刷される内容を変更しない

print(nquad(func, [[0, 1]], args = [1,2,3])) 

。私は使用しています

gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 
Python 3.5.2 
scipy 0.18.0 

答えて

0

私はドキュメント(あなたの最初のリンク)を読んでいます。彼らが言うことは、func(x0, x1, ..., xn, t0, t1, ..., tm)の代わりに、すべてのパラメータをカウントと配列に集約することです。f(int n, double args[n])

すべての変数をスタックにプッシュしてスタックから取得するのはコストがかかることに注意してくださいこのようにして回避することができます。

+0

問題は、ドキュメントとテストによれば、nは数値次元の数ではなく、追加のパラメータが必要です。 – user1226313

0

githubのscipyの問題で答えが得られました。nはdouble args []の長さで、関数を評価する座標と追加のパラメータがnquadに与えられ、c関数に渡される

関連する問題