Re:
g5g5g5用c++编的不知道能否解决你的问题?希望对你有启发!
//用变步长梯形积分法求解函数的定积分。
#include <iostream.h>
#include <math.h>
#include "iomanip.h"
class F
{
public:
virtual double operator() (double x) const=0;//纯虚函数重载运算符()
};
class Fun:public F
{
public:
double operator() (double x) const//虚函数的内联实现
{
return log(1.0+x)/(1.0+x*x);//被积函数
}
};
class Integ
{
public:
virtual double operator() (double a,double b,double eps) const=0;
};
class Trapz:public Integ
{
public:
Trapz(const F&pf):f(pf){ }
double operator() (double a,double b,double eps) const;
private:
const F &f;
};
//类成员函数的实现
double Trapz::operator() (double a,double b,double eps) const
{
int done(0);
int n;
double h,Tn,T2n;
n=1;
h=b-a;
Tn=h*(f(a)+f(b))/2.0;//计算n=1时的积分值
while(!done)
{
double temp(0.0);
for(int k=0;k<n;k++)
{
double x=a+(k+0.5)*h;
temp+=f(x);
}
T2n=(Tn+h*temp)/2.0;//变步长梯形积分法
if(fabs(T2n-Tn)<eps) done=1;//判断积分误差
else //进行下一步计算
{
Tn=T2n;n*=2;h/=2;}
}
return T2n;
}
//主函数
void main()
{
Fun f1;
Trapz trapz1(f1);
cout<<"函数f=log(1+x)/(1+x*x)在区间[1,2]上的定积分为:"<<setprecision(15)<<trapz1(0,2,1e-7)<<endl;
//输出计算结果
}