我写了代码:
const double PI = 3.141592653589793;
namespace
{
const int N = 8;
const double points[8] = {-0.9602898564975363, -0.7966664774136267, -0.5255324099163290, -0.1834346424956498,
0.1834346424956498, 0.5255324099163290, 0.7966664774136267, 0.9602898564975363};
const double weights[8] = {0.1012285362903706, 0.2223810344533744, 0.3137066458778874, 0.3626837833783621, 0.3626837833783621,
0.3137066458778874, 0.2223810344533744, 0.1012285362903706};
const double error = 1e-10;
template <class TFunction, class TNumber>
class ChangeOfVariables
{
TFunction f;
public:
ChangeOfVariables(TFunction f) : f(f){}
TNumber operator() (TNumber x) { TNumber c=std::cos(x); return f(std::tan(x))/(c*c); }
};
}
class Quadrature
{
public:
Quadrature(void) {};
~Quadrature(void) {};
template <class TFunction, class TNumber>
TNumber integrate(TFunction f, TNumber a, TNumber b)
{
TNumber result = 0.0;
for(int i=0; i<N; i++)
{
result+= weights[i]*f(0.5*((b-a)*points[i]+(a+b)));
}
return 0.5*(b-a)*result;
}
template <class TFunction, class TNumber>
TNumber integrateToInfty(TFunction f, TNumber a)
{
using std::atan;
return integrate<ChangeOfVariables<TFunction,TNumber>, TNumber>(ChangeOfVariables<TFunction,TNumber>(f), atan(a), PI/2);
}
};
在这里使用:
double dampendedExp(double x) {return std::exp(-2.0*x);}
int main()
{
Quadrature quadrature;
cout<<"e^(-2x)="<<quadrature.integrateToInfty(dampendedExp, 0)<<endl;
}
但编译器抱怨:
Error 1 error C2668: 'atan' : ambiguous call to overloaded function c:\users\ga1009\documents\dev\fouriertransform\fouriertransform\quadrature.h 48
这个想法是让它适用于不同的数字类型,例如double
和complex<double>
,其中定义了 atan 。我该如何解决?