这是关于用变步长辛普生积分的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;
}