用 梯形法,矩形法,辛普生法,变步长梯形法,求积分

用 梯形法,矩形法,辛普生法,变步长梯形法,求积分。

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


辛普森积分法:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值