C ++中的梯形方法

问题描述 投票:0回答:2

所以该方法本身可以正常工作:

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或您对其进行硬编码的任何内容。我是C ++的新手,我想知道是否有人可以告诉我如何在函数中添加参数,以便每次都可以将要集成的表达式更改为我想要的值。有点像

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;
}

非常感谢。另外,我不明白为什么代码块弄乱了,对不起。

c++ numerical-methods
2个回答
1
投票
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);

1
投票

您可以使用函数指针或模板来传递lambda函数。

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;
© www.soinside.com 2019 - 2024. All rights reserved.