ZOJ 3898 - Stean 积分

有一个陶罐,陶罐是由函数Y=2+cosX,截取x=Z1到x=Z2段后,形成的旋转体,陶罐只有底x=Z1,没有盖子。

问陶罐能乘多少的水(体积),以及它的表面积

 

体积还是比较好求的,直接用旋转体体积公式,pi*∫[z1,z2](2+cosX)2dX=  pi* ( 4sinX+sin2X/4+9X/2 | [z1,z2] )

比较难求的是表面积,套用旋转体侧面积公式,2pi*∫[z1,z2](2+cosX)*sqrt(1+sin2X)dX

然而这个积分相当难求(好像是第二类椭圆积分),我们需要用辛普森积分法求(这个公式太厉害啦OTZ,强行求积分)

∫[l,r] f(x) dx= (r-l)/6*( f(r) + 4f((l+r)/2) + f(l)) ;

 

然而辛普森积分法误差很大,所以我们可以把这个区间分成10000等分,每份分别用辛普森积分法求,这样就可以减小误差

还有,样例有错误,第二个样例的表面积应该是28.28,当然样例的答案跟正解来比也是在误差范围内,应该是出题人故意迷惑人吧

 

事实上等分5000份就可以AC这道题目

 

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define eps 1e-9
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 20005
#define MAXM 40005
#define INF 0x3fffffff
#define PB push_back
#define MP make_pair
#define X first
#define Y second
#define clr(x,y) memset(x,y,sizeof(x));
using namespace std;
typedef long long LL;
int i,j,k,n,m,x,y,T,ans,big,cas,num,len;
bool flag;
const double pi=acos(-1.0);
double l,r;

double f(double u)
{
    return cos(u)+2.0;
}

double df(double u)
{
    return (2.0+cos(u))*sqrt(1.0+sin(u)*sin(u));
}

double xps(double l,double r)
{
    return (r-l)*(df(r)+4.0*df((l+r)/2)+df(l))/6.0;
}

double f2(double u)
{
    return 4.0*sin(u)+sin(u*2.0)/4.0+9.0*u/2.0;
}

int main()
{
    scanf("%d",&T);
    while (T--)
    {
        scanf("%lf%lf",&l,&r);
        double ans=0;
        double g=l;
        double h=(r-l)/5001;
        for (i=1;i<=5001;i++)
        {
            ans+=xps(g,g+h);
            g+=h;
        }
        printf("%.2lf ",pi*(f2(r)-f2(l)));
        printf("%.2lf\n",2.0*pi*ans+pi*f(l)*f(l));
    }
}

 

posted @ 2015-09-12 23:47  zhyfzy  阅读(430)  评论(0编辑  收藏  举报