使用BoostPython计算python中定义的函数的导数

2024-10-16 22:35:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一个Boost Python程序,从用户那里获取一个符号Python函数,并在我的程序中计算它的派生函数。在

例如,用户提供一个python文件(函数.py)它定义了一个函数 F=正弦(x)*余弦(x)。在

然后我想利用sypy的符号微分能力,得到F’(x)(F(x)的导数)。我不想用数值微分。在

有一种方法可以使用PosithPython在C++中实现这样的函数f’(x)。在


Tags: 文件函数用户py程序利用定义符号
2条回答

我不是同情专家,但也许这可以帮助你:

可以定义如下Python方法:

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

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

^{pr2}$

这个函数f1可以从C++中使用Boosi::Python调用。您可以为函数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;

这里有一些代码可以帮助你开始。在

在主.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 division\n"
        "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;
}

Compile命令,替换为路径和编译器:

^{pr2}$

它可以编译,但现在不适合我。希望有帮助。在

相关问题 更多 >