2024-10-16 22:35:17 发布
网友
我想编写一个Boost Python程序,从用户那里获取一个符号Python函数,并在我的程序中计算它的派生函数。在
例如,用户提供一个python文件(函数.py)它定义了一个函数 F=正弦(x)*余弦(x)。在
然后我想利用sypy的符号微分能力,得到F’(x)(F(x)的导数)。我不想用数值微分。在
有一种方法可以使用PosithPython在C++中实现这样的函数f’(x)。在
我不是同情专家,但也许这可以帮助你:
可以定义如下Python方法:
def f(x): return sin(x)*cos(x)
您可以使用以下方法创建可求值函数f1作为f的导数:
这个函数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命令,替换为路径和编译器:
它可以编译,但现在不适合我。希望有帮助。在
我不是同情专家,但也许这可以帮助你:
可以定义如下Python方法:
您可以使用以下方法创建可求值函数f1作为f的导数:
^{pr2}$这个函数f1可以从C++中使用Boosi::Python调用。您可以为函数f1创建一个对象,使用()运算符调用函数,并使用extract<;将结果转换为double。在
下面是一个例子:
这里有一些代码可以帮助你开始。在
在主.cpp公司名称:
Compile命令,替换为路径和编译器:
^{pr2}$它可以编译,但现在不适合我。希望有帮助。在
相关问题 更多 >
编程相关推荐