Используйте Boost-Python для вычисления производной функции, определенной в python

Я хочу написать программу Boost-Python для получения символической функции Python от пользователя и оценки ее производной в моей программе.

Например, Пользователь предоставляет файл Python (Function.py), который определяет функцию, такую ​​как
F = грех (х) * соз (х).

Затем я хочу получить доступ к F ‘(x) (производной от F (x)), используя символическую способность дифференцирования Sympy. Я не хочу использовать численное дифференцирование.

Есть ли способ сделать такую ​​функцию F ‘(x) доступной в C ++ с помощью Boost-Python.

7

Решение

Я не эксперт SymPy, но, возможно, это поможет вам:

Вы можете определить метод Python как:

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

Вы можете создать оцениваемую функцию f1 как производная от е с помощью:

from sympy import *
x = symbols('x')
f1 = lambdify(x, diff(f(x)))

Эта функция f1 может быть вызвана из C ++ с использованием boost :: python. Вы можете создать объект для функции f1, вызвать функцию, используя () оператор и преобразовать результат, чтобы удвоить, используя экстракт<>.

Вот пример:

  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

Другие решения

Вот код, который должен помочь вам начать работу.

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

Он компилируется, но у меня не работает прямо сейчас. Надеюсь, это помогло.

4

По вопросам рекламы [email protected]