-1

C コードから mpmath の特殊関数にアクセスしたいと考えています。中間のpythonスクリプトを介してそれを行う方法を知っています。たとえば、超幾何関数を評価するために、C プログラムは次のようにします。

#include <Python.h>

void main (int argc, char *argv[])
{
   int npars= 4;
   double a1, a2, b1, x, res;
   PyObject *pName, *pModule, *pFunc, *pArgs, *pValue;
   PyObject *pa1, *pa2, *pb1, *px;

   a1= atof(argv[1]);
   a2= atof(argv[2]);
   b1= atof(argv[3]);
   x= atof(argv[4]);

   setenv("PYTHONPATH", ".", 1); // Set PYTHONPATH TO bin directory
   Py_Initialize();

   pa1= PyFloat_FromDouble(a1);
   pa2= PyFloat_FromDouble(a2);
   pb1= PyFloat_FromDouble(b1);
   px=  PyFloat_FromDouble(x);
   pName = PyString_FromString("GGauss_2F1");
   pModule = PyImport_Import(pName);
   pFunc = PyObject_GetAttrString(pModule, "Gauss_2F1");
   pArgs = PyTuple_Pack(npars, pa1, pa2, pb1, px);
   pValue = PyObject_CallObject(pFunc, pArgs);

   res= PyFloat_AsDouble(pValue);
   printf("2F1(x)= %.15f\n", res);
}

GGauss_2F1.py スクリプトを呼び出すことで問題なく動作します。

from mpmath import *
def Gauss_2F1(a1, a2, b1, z):
   hpg= hyp2f1(a1, a2, b1, z)
   return hpg

中間の python スクリプトに頼ることなく、C から直接 mpmath 関数 hyp2f1 を呼び出す方法はありますか? mpmathモジュールはコマンドでインポートできると思います

PyRun_SimpleString("from mpmath import *");   

しかし、実際の関数にアクセスするにはどうすればよいでしょうか?

4

1 に答える 1

0

何?いいえ!名前を変更するだけで、文字通り GGauss_2F1.Gauss_2F1 にアクセスするために行ったことを行います。PyRun_SimpleString("from mpmath import *") を実行しようとしているのはなぜですか? – user2357112

Ok。あなたの提案に従ってください:

#include <Python.h>

void main (int argc, char *argv[])
{
   int npars= 4;
   double a1, a2, b1, x, res;
   PyObject *pName, *pModule, *pFunc, *pArgs, *pValue;
   PyObject *pa1, *pa2, *pb1, *px;

   a1= atof(argv[1]);
   a2= atof(argv[2]);
   b1= atof(argv[3]);
   x= atof(argv[4]);

   setenv("PYTHONPATH", ".", 1); // Set PYTHONPATH TO bin directory
   Py_Initialize();

   pa1= PyFloat_FromDouble(a1);
   pa2= PyFloat_FromDouble(a2);
   pb1= PyFloat_FromDouble(b1);
   px=  PyFloat_FromDouble(x);
   pName = PyString_FromString("mpmath");
   pModule = PyImport_Import(pName);
   pFunc = PyObject_GetAttrString(pModule, "hyp2f1");
   pArgs = PyTuple_Pack(npars, pa1, pa2, pb1, px);
   pValue = PyObject_CallObject(pFunc, pArgs);

   res= PyFloat_AsDouble(pValue);
   printf("2F1(x)= %.15f\n", res);
}

コードは期待どおりに動作しているようで、正しい結果を生成しています。お待ちいただいてありがとうございます"...

于 2016-09-22T20:57:58.870 に答える