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

pass function f(x,y) as a parameter with y fixed

本文关键字:作为 参数传递 函数      更新时间:2023-10-16

我想知道 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 ; 
}

的问题如下,我将不得不集成(最终积分方法会复杂得多(几种不同类型的函数,其中许多取决于高斯、多项式、贝塔定律等参数......

我也尝试过使用这样的类:

 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
}

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

任何帮助将不胜感激。非常感谢

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

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 函数来包装高斯函数。 如果您不熟悉 lambda,这是在文件顶部声明 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;
}