旋转体的体积和表面积
2015-09-18 23:01
423 查看
积分公式
令曲线y=f(x)y=f(x)绕xx轴旋转,形成的旋转体,则其体积和表面积可以计算积分而得(假设体积和表面积一定存在,积分一定存在,这里不讨论数学问题)。体积公式为:
V=∫πy2dxV={\int}{\pi}{y^2}dx
表面积公式为
S=∫2πy1+y′2−−−−−−√dxS=\int{2\pi}{y}\sqrt{1+{y^{\prime}}^2}dx
剩下的就是推导定积分公式。
ZOJ3866 Cylinder Candy
ZOJ3866,一个圆柱体半径为rrmm,高度为hhmm,外围包裹着ddmm厚的涂层,求其表面积和体积。这个题目要精确到10−810^{-8},推不出积分公式就不用做了。整个部分最关键的就是四个边角的形状,四个边角合在一起恰好是一个圆环的外半侧。所以关键就是求圆环的外半侧的体积以及表面积。
曲线方程为:
y=r+d2−x2−−−−−−√,x∈[−d,d]y=r+\sqrt{d^2-x^2},x\in\left[-d,d\right]
则,体积积分为:
V=π∫(r2+d2−x2+2rd2−x2−−−−−−√)dx=π∫(r2+d2)dx−π∫x2dx+2πr∫d2−x2−−−−−−√dxV=\pi\int(r^2+d^2-x^2+2r\sqrt{d^2-x^2}\;)dx\\=\pi\int(r^2+d^2)dx-\pi\int{x^2}dx+2\pi{r}\int\sqrt{d^2-x^2}dx
第3项稍微麻烦一点,其不定积分为:
∫d2−x2−−−−−−√dx=12xd2−x2−−−−−−√+d22arcsinxd+C\int\sqrt{d^2-x^2}dx=\frac{1}{2}x\sqrt{d^2-x^2}+\frac{d^2}{2}arcsin{\frac{x}{d}}+C
表面积公式首先要求yy的导数:
y′=−xd2−x2−−−−−−√y\prime=-\frac{x}{\sqrt{d^2-x^2}}
所以,
1+y′2=d2d2−x21+{y\prime}^2=\frac{d^2}{d^2-x^2}
表面积的积分为:
S=2π∫(r+d2−x2−−−−−−√)dd2−x2−−−−−−√dx=2πrd∫1d2−x2−−−−−−√dx+2πd∫dxS=2\pi\int({r+\sqrt{d^2-x^2}})\frac{d}{\sqrt{d^2-x^2}}dx\\=2\pi{rd}\int\frac{1}{\sqrt{d^2-x^2}}dx+2\pi{d}\int{dx}
第一项就是arcsinxd+Carcsin\frac{x}{d}+C。
所以,体积和表面积全部可以求出原函数的解析式。
然后把其他部分的圆柱体算上即可。
#include <cstdio> #include <cmath> double const PI = acos(-1.0); double const DELTA = 1E-6; double R,H,D; double integral(){ return (2.0*D*R*R+4.0*D*D*D/3.0+D*D*R*PI) * PI; } double integral2(){ return 4.0*PI*D*D + 2.0*PI*PI*R*D; } int main(){ int nofkase; scanf("%d",&nofkase); while( nofkase-- ){ scanf("%lf%lf%lf",&R,&H,&D); double v = integral() + PI * ( R + D ) * ( R + D ) * H; double s = integral2() + 2.0 * PI * ( R + D ) * H + 2.0 * PI * R * R; printf("%.12lf %.12lf\n",v,s); } return 0; }
ZOJ3898 Stean
ZOJ3898同样是旋转体的表面积和体积。曲线为:y=2+cosxy=2+cosx
不同点在于定积分公式中有一项是得不到解析式的。但是这道题很明显曲线是周期性函数,定积分的周期就是π\pi,而题目要求在10−210^{-2}以内,所以取ϵ\epsilon为10−310^{-3}或10−410^{-4}直接使用积分定义去计算。每次计算需要迭代的次数在几万次,应该是没有问题的。
体积积分:
V=π∫(2+cosx)2dx=4π∫dx+4π∫cosxdx+π∫cos2xdxV=\pi\int(2+cosx)^2dx\\=4\pi\int{dx}+4\pi\int{cosx}dx\\+\pi\int{cos^2x}dx
其中第三项为:
∫cos2xdx=x2+sin2x4+C\int{cos^2x}dx=\frac{x}{2}+\frac{sin2x}{4}+C
表面积积分:
S=2π∫(2+cosx)1+sin2x−−−−−−−−√dx=4π∫1+sin2x−−−−−−−−√dx+2π∫1+sin2x−−−−−−−−√dsinxS=2\pi\int(2+cosx)\sqrt{1+sin^2x}\;dx\\=4\pi\int\sqrt{1+sin^2x}\;dx\\+2\pi\int\sqrt{1+sin^2x}\;dsinx
其中第一项不知道积不积得出来,反正我没有积出来。数学不行,就用计算机的方法算。第二项令t=sinxt=sinx,则
∫1+t2−−−−−√dt=12t1+t2−−−−−√+12ln∣∣t+1+t2−−−−−√∣∣+C\int\sqrt{1+t^2}\;dt=\frac{1}{2}t\sqrt{1+t^2}+\frac{1}{2}\ln{\left|{t+\sqrt{1+t^2}}\right|}+C
#include <cstdio> #include <cmath> double const PI = acos(-1.); double const EPS = 1E-4; //计算一个周期 double init1p(){ double ret = 0.0; for(double x=0.0;x<=0.5*PI;x+=EPS){ double t = sin(x); ret += sqrt(1.0+t*t); } return 8.0*PI*ret*EPS; } double const ONEP = init1p(); double v(double z1,double z2){ return 4.0 * PI * ( z2 - z1 ) + 4.0 * PI * ( sin(z2) - sin(z1) ) + 0.5 * PI * ( z2 - z1 ) + 0.25 * PI * ( sin(z2+z2) - sin(z1+z1) ); } double s(double z1,double z2){ //计算底面积 double y1 = 2.0 + cos(z1); double ret = PI * y1 * y1; //计算解析式的积分 double t2 = sin(z2), t1 = sin(z1); double tt2 = sqrt(1.0+t2*t2), tt1 = sqrt(1.0+t1*t1); ret += PI * ( t2 * tt2 - t1 * tt1 ) + PI * ( log(fabs(t2+tt2)) - log(fabs(t1+tt1)) ); //计算周期 int n = (int)(( z2 - z1 ) / PI); ret += ONEP * (double)n; //计算积分 double tmp = 0.0; for(double x=z1+PI*(double)n;x<=z2;x+=EPS){ double t = sin(x); tmp += sqrt(1.0+t*t); } return ret += tmp * 4.0 * PI * EPS; } int main(){ int kase; scanf("%d",&kase); while(kase--){ double z1,z2; scanf("%lf%lf",&z1,&z2); printf("%.5lf %.5lf\n",v(z1,z2),s(z1,z2)); } return 0; }
相关文章推荐
- phpStrom主题包分享
- Android电话拦截实现以及TelephonyManager监听的取消
- Android电话拦截实现以及TelephonyManager监听的取消
- 【BZOJ】2002 弹飞绵羊 分块
- canvas详细介绍
- hdu1290(规律)
- Java RMI之HelloWorld篇
- 2015/9/18
- 【CodeChef】Chef and Churu 分块+树状数组
- String 类常用方法
- 操作系统实验(一)
- HDU 5343 MZL's Circle Zhou
- PHP安全之register_globals
- 面对不同种类的处理结果——<result type="">
- 组态王按钮滑过
- 孪生姐妹的session和cookie
- JAVAweb中设置时间显示格式
- 新闻项目第一次遍观看
- 不小于N的素数个数
- Nginx安装配置实现用户认证、反向代理、隐藏版本号