Simpson 積分算法

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章