Передача математического выражения для работы

Iomanip спросил: 12 мая 2018 в 04:20 в: c++

Мне нужно сделать функцию в C++ для вычисления интегралов. Я использую simpsone rule для вычисления значения данного интеграла. Я знаю, как рассчитать это. У меня нет проблем с математикой. Мне нужно знать, как передать общее выражение, чтобы сделать мою программу гибкой.

У меня есть 4 f(x) функции, для которых я должен делать вычисления. Например:

f(x)=2e^x
f(x)=x^3e
etc.

У меня есть две возможности сделать это.

1) Я могу выполнять отдельную функцию для каждой функции f(x).

double function1() {
...
calculations 2e^x
...
return resault;
}double function2() {
...
calculations x^3e
...
return resault;
}

Этот способ легко и быстро записать, но код вообще не является гибким. В этом случае мне нужно сделать новую функцию для каждой новой заданной функции f (x).

Я хотел бы иметь одну функцию, к которой я могу передать выбранную функцию f(x).

2) Второй случай, который я предпочитаю, - это сделать какой-то интерпретатор выражений. Я подумал о том, чтобы поместить части выражения в std::vector, а затем выполнить вычисления для каждой ячейки vector.

Я уже видел идею разбора строки в выражение, но я думаю, что в конце он будет почти таким же, как идея с vector. Я могу ошибаться.

Каков наилучший способ сделать мой код гибким и простым в использовании для пользователей (а не программистов)?


1 ответ

Есть решение
Hussein Golshani ответил: 12 мая 2018 в 05:28

Предположим, что у вас есть функция, которая принимает два выражения и возвращает сумму результатов из них. Вы можете передать выражения для использования с помощью lambda expression, который поддерживается с C++11, как показано ниже:

template<typename Func, typename Func2>
int calculate(Func &lambda_expr1, int param1, Func2 &lambda_expr2, int param2)
{
    return lambda_expr1(param1) + lambda_expr2(param2);
}void main()
{
    // case 1
    auto f1 = [](int p) {return p*p; }; // expression 1
    auto f2 = [](int p) {return p*p*p; }; // expression 2
    int result = calculate(f1, 3, f2, 4);
    // result = 73    // case 2
    result = calculate([](int p) {return p*p/2; }, 4, [](int p) {return p*p*p/3; }, 3);
    // result = 17
}