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

Use Boost-Python to calculate derivative of function defined in python

本文关键字:函数 定义 Boost-Python 计算 Python 使用      更新时间:2023-10-16

我想编写一个boost-python程序,以从用户中获取符号python函数并在我的程序中评估其衍生物。

例如,用户提供了一个python文件(function.py),该文件定义了一个函数f = sin(x)*cos(x)。

然后,我想使用Sympy的符号分化能力访问F'(x)(f(x))。我不想使用数值差异。

是否有一种方法可以使用Boost-Python在C 中访问此类函数。

这是一些代码,应该帮助您开始。

main.cpp:

#include <boost/python.hpp>
#include <iostream>
using namespace boost::python;
int main(void) {
    Py_Initialize();
    object main_module = import("__main__");
    object main_namespace = main_module.attr("__dict__");
    exec("from __future__ import divisionn"
        "from sympy import *n"
        "x = symbols('x')n"
        "f = symbols('f', cls=Function)n"
        "f = cos(x) * sin(x)n"
        "f1 = lambda u: diff(f).subs(x, u);n",
        main_namespace);
    exec("result = f1(1.0)", main_namespace);
    double res = extract<double>(main_namespace["result"]);
    std::cout << "Out: " << res << std::endl;
    return 0;
}

编译命令,用您的路径和编译器替换:

$ clang++ -I"/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/Current/Headers/" -L"/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/Current/lib/" -lpython2.7 main.cpp

它编译但现在对我不起作用。希望它能有所帮助。

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

您可以定义一个python方法:

def f(x):
  return sin(x)*cos(x)

您可以创建一个可评估的函数 f1 作为 f 的派生函数

from sympy import *
x = symbols('x')
f1 = lambdify(x, diff(f(x)))

使用Boost :: Python可以从C 调用此功能F1。您可以创建一个对象来函数f1,使用()操作员调用函数,然后使用 extract&lt;> 。。

将结果转换为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;