用 梯形法,矩形法,辛普生法,变步长梯形法,求积分。
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
const double E=1e-10;
const int INF=10000000;
class Integration
{
private:
double left;//积分下限
double right;//积分上限
double (*getv)(double x);//计算函数
double eps;//精度
int n;//n个区间
public:
Integration(double (*f)(double))
{
left=0;
right=0;
getv=f;
}
void set1(double l,double r,double eps_)
{
left=l;
right=r;
eps=eps_;
}
void set2(double l,double r,int n_)
{
left=l;
right=r;
n=n_;
}
double func1()//用 梯 形 法 求 积 分
{
double distance=(right-left)/n;
double sum=0,p;
for(p=left;p+E<right;p+=distance)//加E是为了防止误差,可用T[2]测试(1,2,3);
{
sum+=(getv(p)+getv(p+distance))*distance/2;
}
return sum;
}
double func2()//矩 形 法 求 积 分
{
double distance=(right-left)/n;
double sum=0,p;
for(p=left;p+E<right;p+=distance)
sum+=getv(p)*distance;
return sum;
}
double func3()//辛 普 生 法 求 积 分
{
double distance=(right-left)/(2*n);
double sum=getv(left)+getv(right),p;
for(p=left+distance;p+E<right;p+=2*distance)
{
sum+=4*getv(p);
if(p+distance<right)
sum+=2*getv(p+distance);
}
return sum*distance/3;
}
double func4()//变 步 长 梯 形 法 求 积 分
{
double e=INF,p;
double s1=0,s2=0;
double distance;
for(n=1;e+E>eps;e=s2-s1,n=n*2)
{
s1=s2;
if(n==1)
{
distance=(right-left)/n;
s2=func1();
continue;
}
s2=s1/2;
for(p=left+distance/2;p+E<right;p+=distance)
s2+=distance/2*getv(p);
distance=(right-left)/n;
}
return s2;
}
};
//三个计算函数
double f1(double x)
{
return log(1.0+x)/(1.0+x*x);
}
double f2(double x)
{
return x*x;
}
double f3(double x)
{
return 2*x;
}
Integration T[3]={f1,f2,f3};//创建3个对象,f1,f2,f3全部隐含转换为Integration类型,再来初始化。如果这样初始化报错,说明您的编译器不支持c++11...赶紧换编译器吧。。。
/*菜单*/
void menu1() // 选择积分函数功能菜单
{
cout<<"\n 请 选 择 被 积 函 数"<<endl;
cout<<"\n 1. 求 y=log(1.0+x)/(1.0+x*x)的 积 分\n";
cout<<"\n 2. 求 y=x*x 的 积 分 \n";
cout<<"\n 3. 求 y=2*x 的 积 分\n";
cout<<"\n 0. 退 出\n";
}
void menu2() // 选择积分方法功能菜单
{
cout<<"\n 请 选 择 积 分 方 法"<<endl;
cout<<"\n 1. 用 梯 形 法 求 积 分\n";
cout<<"\n 2. 用 矩 形 法 求 积 分\n";
cout<<"\n 3. 用 辛 普 生 法 求 积 分\n";
cout<<"\n 4. 用 变 步 长 梯 形 法 求 积 分\n";
cout<<"\n 0. 返 回 上 级 菜 单\n";
}
void menu3()
{
cout<<"\n 请输入积分上限 请输入积分下限 请输入分割区间数\n";
}
void menu4()
{
cout<<"\n 请输入积分上限 请输入积分下限 请输入精确度\n";
}
void input1(int choose)//输入上限,下限,精度求积分
{
system("cls");
double l,r;
int n;
menu3();
cin>>l>>r>>n;
T[choose-1].set2(l,r,n);
}
void input2(int choose)//输入,上限,下限,精度求积分
{
system("cls");
double l,r,eps;
menu4();
cin>>l>>r>>eps;
T[choose-1].set1(l,r,eps);
}
/*主函数*/
int main()
{
int choose1,choose2;
int flag=1;
while (flag)
{
system("cls");
menu1();
cin>>choose1;
system("cls");
int flag1=1;
switch(choose1)
{
case 1:
case 2:
case 3:
while(flag1)
{
menu2();
cin>>choose2;
switch(choose2)
{
case 1:
input1(choose1);
cout<<T[choose1-1].func1()<<endl;
break;
case 2:
input1(choose1);
cout<<T[choose1-1].func2()<<endl;
break;
case 3:
input1(choose1);
cout<<T[choose1-1].func3()<<endl;
break;
case 4:
input2(choose1);
cout<<T[choose1-1].func4()<<endl;
break;
case 0:
flag1=0;break;
default:
cout<<"\n Wrong Selection !(选择错误,重选)\n";
}
}//end of while(flag1)
break;
case 0:
flag=0;
cout<<"\n *** The End! ***\n";
break;
default:
cout<<"\n Wrong Selection !(选择错误,重选)\n";system("pause");
}
}
return 0;
}
辛普森积分法: