将函数f(x,y)作为y固定的参数传递

时间:2017-05-16 16:23:57

标签: c++ pointers

我想知道c ++中是否有任何方法可以传递函数和其他函数,并修复了一些参数。

这里解释一个例子:

#include<math.h>
#include<iostream>

double myfunc(double x) { return 5*x; }

double gaussian( double x , double s , double v) { return exp( (x-v)*(x-v) / (s*s) ) ; }

double Trapeze1D(const double x_min, const double x_max, double (*fonction)(double) )
{
    double nb_pts = 100.0 ;
    double integrale = 0.0 ;
    double dx = ( x_max - x_min ) / (double) nb_pts ;

    double x_k ;

    while ( k < nb_pts-1 )
    {
        k++;
        x_k = x_min + (double) k * dx ;
        integrale += fonction(x_k) ;
     }    

    integrale *= dx ;
    return integrale ;
}

int main()
{
    cout << Trapeze1D(0.0,1.0,myfunc) << endl ; // <-- works fine
    cout << Trapeze1D(0.0,1.0, gaussian(double , 2,3) ) << endl ; // <-- I would like something like that ...

    // Also tried :
    double tmp(double x) = gaussian(x, 2,3) ; // <-- does not work C++ does not allow definition of function inside function ...
    cout << Trapeze1D(0.0,1.0, tmp) << endl ; 
}

我的问题如下,我将不得不进行整合(最终集成方法会更加复杂)几种不同类型的函数,其中许多依赖于高斯,多项式,beta定律等参数...... / p>

我也试过使用这样的类:

 class gaussian
 {
  public:
     double eval(double x) ;
     void get(double s, double v) ;
  private:
    double s ;
    double v ;
 }

double gaussian::eval(double x){ return exp( (x-v)*(x-v) / (s*s) ) ; }

int main()
{
    gaussian G;
    G.get(1.0,2.0) ;
    cout << Trapeze1D(0.0,1.0,G.eval) << endl ; // <-- error
}

但是我收到以下错误:必须调用对非静态成员函数的引用

任何帮助都将受到高度赞赏。 非常感谢

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。最简单的是你真正非常接近的那个:

int main()
{
    std::cout << Trapeze1D(0.0, 1.0, myfunc) << std::endl;

    auto tmp = [](double x){ return gaussian(x, 2, 3); };
    std::cout << Trapeze1D(0.0, 1.0, tmp) << std::endl;
}

这会创建一个包含高斯函数的临时lambda函数。如果你不熟悉lambdas,这是在文件顶部声明tmp的临时版本:

double myfunc(double x) { return 5*x; }

double gaussian( double x , double s , double v) { return exp( (x-v)*(x-v) / (s*s) ) ; }

double tmp(double x) { return gaussian(2, 3, x); }

如果您希望这更灵活,并且您有兴趣定期更改sv,那么您可以随时进行仿函数课程,但这会涉及到一些改变您的工作Trapeze1D函数可以接受函数指针或函子:

template <typename FuncType>
double Trapeze1D(const double x_min, const double x_max, FuncType fonction)
{
    ...
    integrale += fonction(x_k);
    ...
}

class gaussian_functor
{
public:
    gaussian_functor(double s, double v)
        : m_s(s)
        , m_v(v)
    {}

    double operator() (double x) const { return exp((x - m_v)*(x - m_v) / (m_s*m_s)); }
private:
    double m_s;
    double m_v;
};


int main()
{
    std::cout << Trapeze1D(0.0, 1.0, myfunc) << std::endl;

    gaussian_functor my_functor(2.0, 3.0);
    std::cout << Trapeze1D(0.0, 1.0, my_functor) << std::endl;
}