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