Передача функции generi c для численного интегрирования с правилом трапеции - PullRequest
1 голос
/ 21 января 2020

У меня есть метод вычисления интеграла функции с использованием правила трапеции. Он отлично работает:

double trap_method(double a, double b, double n){

    int i = 1; double area = 0; double h = (b-a)/(n-1);
    double x = a+h;
    while(i <= n-2){

        area = area + exp(x)*h;
        x = x+h;
        i++;
    }
    area = area + (exp(a) + exp(b)) * h/2;

    return area;
}

Однако, как вы можете видеть, он работает только для e x или любого другого кода, который вы в нем жестко закодировали.

Мне было интересно, как я могу добавить параметр к trap_method так, чтобы я мог просто изменить выражение, которое я хочу интегрировать, во все, что я хочу каждый раз. Что-то вроде:

double trap_method(double a, double b, double n, function f){

    int i = 1; double area = 0; double h = (b-a)/(n-1);
    double x = a+h;
    while(i <= n-2){

        area = area + f(x)*h;
        x = x+h;
        i++;
    }
    area = area + (f(a) + f(b)) * h/2;

    return area;
}

Ответы [ 2 ]

4 голосов
/ 21 января 2020

Вы можете использовать указатель функции или шаблон для передачи лямбда-функции.

double f(double x){
    return x*x;
}

double trap_method(double a, double b, int n, double (*func)(double)){

    int i = 1; double area = 0; double h = (b-a)/(n-1);
    double x = a+h;
    while(i <= n-2){

        area = area + func(x)*h;
        x = x+h;
        i++;
    }
    area = area + (func(a) + func(b)) * h/2;

    return area;
}

template<typename FUNC>
double trap_method(double a, double b, int n, FUNC func){

    int i = 1; double area = 0; double h = (b-a)/(n-1);
    double x = a+h;
    while(i <= n-2){

        area = area + func(x)*h;
        x = x+h;
        i++;
    }
    area = area + (func(a) + func(b)) * h/2;

    return area;
}

в основном

cout << trap_method(0, 1, 100, f) << endl;
cout << trap_method(0, 1, 100, [](double x){return x*x;}) << endl;
1 голос
/ 21 января 2020
template<typename func_type>
double trap_method(double a, double b, double n, func_type f){

    int i = 1; double area = 0; double h = (b-a)/(n-1);
    double x = a+h;
    while(i <= n-2){

        area = area + f(x)*h;
        x = x+h;
        i++;
    }
    area = area + (f(a) + f(b)) * h/2;

    return area;
}

, а потом и позже ....

double result = trap_method(a, b, n, std::exp);
...