![](/img/trans.png)
[英]Use Boost-Python in C++ to Access to Array of Functions Defined in Python
[英]Use Boost-Python to calculate derivative of function defined in python
我想编写一个Boost-Python程序来从用户那里获取一个符号python函数,并在我的程序中评估它的派生。
例如,User提供了一个python文件(Function.py),它定义了一个函数,如F = sin(x)* cos(x)。
然后我希望使用Sympy的符号分化能力来访问F'(x)(F(x)的导数)。 我不想使用数值微分。
有没有办法使用Boost-Python在C ++中访问这样的函数F'(x)。
这里有一些代码可以帮助您入门。
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 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;
}
编译命令,替换为您的路径和编译器:
$ 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 <>将结果转换为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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.