将成员函数传递给任意精度C ++正交库(Quadpack ++)

时间:2014-01-10 22:59:31

标签: c++ gsl numerical-integration

我正在尝试数字地集成一个特别讨厌的类函数,最初我使用的是GSL,但是舍入误差对于我想要的容差来说太大了。经过一个快速谷歌任意精度正交库后,我找到了quadpack++,这似乎做我想要的,但我不能使它工作,特别是我似乎无法传递这种形式的功能:

mpf MyClass::foo( mpf t, const mpf_array& fourier ){   
    // do stuf
}

作为输入,它希望以这种形式:

template<typename Real, class param_t>
    class Function : public FtnBase<Real> {
public:
    typedef Real defn_t(Real, param_t*);    
    defn_t& function_;
    param_t* params_;

    virtual Real operator() (Real x) {return function_(x, params_); }
    Function(defn_t& function) : function_(function), params_(0) {}
    Function(defn_t& function, param_t* params) : function_(function), params_(params) {}               
    ~Function() {}
};

我对C ++很陌生,所以它可能很简单,但我已经尝试了指针和std :: bind的每一个组合,我可以想到基于Q1Q2无济于事。对此有任何帮助,或建议更好的测试&amp;记录任意精度的正交库将不胜感激。

1 个答案:

答案 0 :(得分:1)

函数原型必须有两个参数,第二个必须是指针。我不太了解mpf_array知道它归结为什么。如果它不是指针类型,那么这是一个问题。 (另外一些测试显示,在参数前面const没有帮助。)

可能更重要的是,它必须是 free 函数,并且不能属于像MyClass这样的类(除非它是静态函数IIRC)。你的职能部门中是否需要MyClass的元素?

(根据下面的评论进行编辑)。显示的函数原型需要一个(可能是真实的)类型和一个指针,基本上, all 其他参数,这对你来说不仅需要这个mpf_array的东西,还需要你需要的MyClass对象从中调用它。所以你需要将所有这些参数组合成一个大的东西。

struct helper {
    mpf_array foo;
    MyClass bob;
}

然后我们可以创建一个中继函数,将其中一个打包为你需要的参数:

mpf relay(mpf t, helper* args) {
    return args->bob.actual_function(t, args->foo);
}

然后使用您的fourier数组和您的实际对象创建一个辅助结构,并将其地址作为第二个参数传递。这里可能应该有一些引用来避免复制,但是我直接在这个框中输入(所以这里也可能有其他错误)。

这是......充其量只是hackish,但无论如何它应该完成这个包的工作。 (我不得不承认我不知道任何更适合的套餐,对不起。)