首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Boost-Python计算python中定义的函数的导数

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

Stack Overflow用户
提问于 2012-12-23 11:08:48
回答 2查看 834关注 0票数 7

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

例如,用户提供了一个python文件(Function.py),它定义了F= sin(x)*cos(x)这样的函数。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-31 08:26:31

我不是SymPy专家,但这可能会对你有所帮助:

您可以像这样定义Python方法:

代码语言:javascript
复制
def f(x):
  return sin(x)*cos(x)

您可以使用以下命令将可求值函数f1创建为f的派生函数:

代码语言:javascript
复制
from sympy import *
x = symbols('x')
f1 = lambdify(x, diff(f(x)))

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

下面是一个示例:

代码语言:javascript
复制
  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;
票数 3
EN

Stack Overflow用户

发布于 2012-12-26 05:00:57

下面是一些代码,可以帮助您入门。

main.cpp:

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
$ 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

它可以编译,但现在对我不起作用。希望这能帮上忙。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14008307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档