使用Boost-Python来计算Python中定义的函数的导数
Use Boost-Python to calculate derivative of function defined in python
我想编写一个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;
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- Visual Studio中的函数声明和函数定义问题
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 具有enable_if外部类原型的模板类构造函数定义
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为函数定义符号不明确的指针参数
- C++模板专用化 - 无法匹配函数定义
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 找不到 #define 的函数定义
- 根据类型特征更改函数定义?
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 命名空间更改函数定义
- "Type&"与C++函数定义中的"Type*"
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 如何从 C++ 中的现有模板函数定义新函数
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 为什么c++允许成员函数定义中实例的私有成员访问
- Qt基类函数定义
- C++函数定义中参数列表后面额外一对括号的含义