使用Boost-Python计算python中定义的函数的导数

Hes*_*sam 7 c++ python numpy sympy boost-python

我想编写一个Boost-Python程序来从用户那里获取一个符号python函数,并在我的程序中评估它的派生.

例如,User提供了一个python文件(Function.py),它定义了一个类似F = sin(x)*cos(x)的函数.

然后我希望使用Sympy的符号分化能力来访问F'(x)(F(x)的导数).我不想使用数值微分.

有没有办法使用Boost-Python在C++中访问这样的函数F'(x).

J. *_*eja 3

我不是 SymPy 专家,但也许这可以帮助您:

您可以定义一个 Python 方法,例如:

def f(x):
  return sin(x)*cos(x)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法创建可评估函数f1作为f的导数:

from sympy import *
x = symbols('x')
f1 = lambdify(x, diff(f(x)))
Run Code Online (Sandbox Code Playgroud)

可以使用 boost::python 从 C++ 调用此函数 f1。您可以创建一个函数 f1 的对象,使用() 运算符调用该函数,并使用extract<>将结果转换为 double 。

这是一个例子:

  namespace py = boost::python;

  Py_Initialize();

  py::object main_module = py::import("__main__");
  py::object main_dict   = main_module.attr("__dict__");

  py::exec(
    "def f(x):\n"
    "  return  sin(x)*cos(x)\n",
    main_dict
  );

  py::exec(
    "from sympy import *\n"
    "x = symbols('x')\n"
    "f1 = lambdify(x, diff(f(x)))\n",
     main_dict
  );

  py::object f1 = main_dict["f1"];
  std::cout << py::extract<double>(f1(0.0)) << std::endl;
  std::cout << py::extract<double>(f1(1.0)) << std::endl;

  return 0;
Run Code Online (Sandbox Code Playgroud)