#define PR double
typedef PR (*FUN)(PR); //定義指向被積函數的指針
class Integral
{
private:
PR lower,upper; //lower——積分下限;upper——積分上限
FUN integrand; //integrand——被積函數
public:
Integral(PR l=0,PR u=0,FUN f=0):lower(l),upper(u),integrand(f){}
void PutChangeBd(PR l,PR u); //設置積分上限、下限
void Put_Integrand(FUN f); //設置積分函數
PR Solution(long n); //用Simpson 3/8法求解積分
};
void Integral::PutChangeBd(PR l,PR u) //設置積分下限、上限
{
lower=l;
upper=u;
}
void Integral::Put_Integrand(FUN f) //設置積分函數
{
integrand=f;
}
PR Integral::Solution(long n) //用Simpson 3/8法求解積分
{
PR h,result=0,temp=0;
h=(upper-lower)/3/n;
result=integrand(lower)+integrand(upper);
for (int i=1;i<=n;i++)
temp+=(integrand(lower+(3*i-1)*h)+integrand(lower+(3*i-2)*h));
result+=3*temp;
temp=0;
for (int i=1;i<n;i++)
temp+=integrand(lower+3*i*h);
result+=2*temp;
result*=(upper-lower)/8/n;
return result;
}