读书人

这是关于用变步长辛普生积分的c++代码

发布时间: 2014-01-01 18:12:08 作者: rapoo

这是关于用变步长辛普生积分的c++代码
#include<iostream.h>
#include<math.h>
class F
{
public:
virtual double operator ()(double x)const=0;
};
class Integral
{
public:
virtual double operator ()(double a,double b,double eps) const=0;
};
class simpson:public Integral
{
public:
simpson(const F&ff):f(ff)
{}
virtual double operator()(double a,double b,double exps) const;
private:
const F&f;
};
double simpson::operator()(double a,double b,double exps) const
{
int done(0);
int n;
double h,Tn,T2n,In,I2n;
n=1;
h=b-a;
Tn=h*(f(a)+f(b))/2.0;
In=Tn;
while(!done)
{
double temp(0.0);
for(int k=0;k<=n-1;k++)
{
double x=a+(k+0.5)*h;
temp+=f(x);
}
T2n=(Tn+h*temp)/2.0;
I2n=(4.0*T2n-Tn)/3.0;
if(fabs(I2n-In)<exps)
done=1;
else
{
Tn=T2n;
n*=2;
h/=2;
In=I2n;
}
}
return I2n;
}

class Function:public F
{
public:
virtual double operator()(double x) const
{
return log(1.0+x)/(1.0+x*x);
}
};
void main()
{
Function f;
simpson simp(f);
cout<<simp(0,2,1E-7)<<endl;
}



题目为对log(1+x)/(1+x^2)的1到2上的积分;
请大家讨论一辛普生积分到底怎么回事,求大神分析 C++
[解决办法]

#include<iostream.h> 

  #include"ff.h"

  #include"xinpusheng.h"

  void main() //主函数

  {

  cout<<"分别输入函数的下限,上限以及划分的区间个数n "<<endl;

  double a,b;

  int n;

  cin>>a>>b>>n; //输入数据

  double intesum1=integrals(a,b,n,f1),intesum2=integrals(a,b,n,f2);

  cout<<"用辛普生法: "<<endl;

  cout<<"f1从"<<a<<"到"<<b<<"的积分约为"<<intesum1<<endl;//输出结果

  cout<<"f2从"<<a<<"到"<<b<<"的积分约为"<<intesum2<<endl;

  }

读书人网 >C++

热点推荐