一个球被两个垂直的平面切割,分成四份,已知三份体积,求剩下的那份体积?
https://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=19043&pid=96643&fromuid=14149这个问题的推广提问 先简单一点,只是被两个垂直的面切,然后看情况,是否被三个垂直的面切 一个圆球,被两个互相垂直的平面切成体积不同的四部分。求最小那一块的体积。有以下公式:
例题:
Clear["Global`*"];
R = 10; Subscript = 3; Subscript = 5;
V = 2/3 Subscript Subscript Sqrt\) - \!\(\*SubsuperscriptBox[\(h\), \(2\), \(2\)]\)] + 2/3 R^3 ArcTan[(R Sqrt\) -
\!\(\*SubsuperscriptBox[\(h\), \(2\), \(2\)]\)])/(Subscript Subscript)] - 1/3 Subscript (3 R^2 - \!\(\*SubsuperscriptBox[\(h\), \(2\), \(2\)]\)) ArcTan\) -
\!\(\*SubsuperscriptBox[\(h\), \(2\), \(2\)]\)]/Subscript] - (1/3) Subscript (3 R^2 - \!\(\*SubsuperscriptBox[\(h\), \(1\), \(2\)]\)) ArcTan\) - \!\(\*SubsuperscriptBox[\(h\), \(2\), \(2\)]\)]/Subscript]
N
运行结果:
\(10 \sqrt{66}-\frac{1375}{3} \arctan\left(\sqrt{\frac{22}{3}}\right)+\frac{2000}{3} \arctan\left(2\sqrt{\frac{22}{3}}\right)-291 \arctan\left(\frac{\sqrt{66}}{5}\right)\)
152.346
我做这个题,大概是20年前的事情了。记得在本论坛上贴出过,帖子名称记不得了。
球和圆的差距不大。
球的15.268
圆的15.385
本帖最后由 yuange1975 于 2023-9-22 20:44 编辑
前天爬山手机上写代码调试出来,今天有空整理了一下。
懒得写分析文章了,代码很简单,有兴趣的自己看代码吧。小小的打一个广告,有兴趣的可以加入我的知识星球《袁哥的技术天地》,主要是网络安全、数学、投资等方面的一些经验的随意分享。
两互相垂直平面切一球,切成四部分,依次体积为abcd。已知abc,求d=?
这题情形现实中还是很常见的,切球形西瓜、土豆等。
就是图1的圆的问题推广成球的问题。球半径R,两垂直平面交点P坐标(R*x,R*y)。
n为精度位数,可以设置成需要的求解精度要求。
求得如图1的数据d=15.2684403090431785。
abcd按逆时针顺序排列,就是分别是坐标体系里的第一二三四象限。
有三个方程:
3(a+b)/(pi*R^3)=y^3-3y+2
3(b+c)/(pi*R^3)=-x^3+3x+2
r=sqrt(1-x*x-y*y)
rx=sqrt(1-x*x)
ry=sqrt(1-y*y)
a=f(x,y)=(2*x*y*r+2*acos(x/rx*y/ry)+(x**3-3*x)*acos(y/rx)+(y**3-3*y)*acos(x/ry)/3*R^3
求d的方程
3(a+b+c+d)=4*pi*R^3
P点坐标(x*R,y*R)(x^2+y^2<=1)切的第一块a块的体积公式f(x,y)。b=f(-x,y)和c=f(-x,-y)、d=f(x,-y)都有这样的公式,但是这个公式太复杂。a+b、b+c可以消去一些复杂项,公式变得非常简单。就取一个复杂的a就行,另外两个用简单的方程。
解这3个方程组得到xyR,带入就得到d=4/3*pi*R^3-(a+b+c)。
Python 代码如下:
# 两互相直平面切一球,切成四部分,依次体积为abcd。
# 已知abc,求d=?
# copy by yuange 2023.9.20
# n 精度位数
frommpmath import *
n=20
mp.prec=128
mp.dps=n+1
rn="\r\n"
'''
3(a+b)/(piR^3)=Y^3-3Y+2
3(b+c)/(piR^3)=(-X^3+3X+2)
Y^3-3Y+2=(a+b)/(b+c)*(-X^3+3X+2)
a=R^3*vv(x,y)
'''
stepn=16
num=1000
mpf1=mpf("1")
mpf0=mpf("0")
er=pow(mpf("0.1"),n)
def vv(x,y):
r=sqrt(1-x*x-y*y)
v0=(2*x*y*r+2*acos(x*y/sqrt(r*r+x*x*y*y))+(x**3-3*x)*acos(y/sqrt(r*r+y*y))+(y**3-3*y)*acos(x/sqrt(r*r+x*x)))/3
return v0
def qiu(a,b,c):
step=mpf1/stepn
y=0-mpf1
stop=0
sign=0
if c>=b :
y=mpf0
stop=1
fx=lambda x :-x**3+3*x+2-mpf1*(b+c)/(a+b)*(y**3-3*y+2)
for i in range(num):
fy=(y**3-3*y+2)*(b+c)/(a+b)-2
if abs(fy)>2 :
y+=step
continue
x=findroot(fx,0)
#print(rn,"x,y=",x,y)
if x*x+y*y > 1+1e-5 :
y+=step
if y > 1 :break
continue
a1=vv(x,y)
R1=3*(a+b)/pi/(y**3-3*y+2)
R2=a/a1
#print(rn,"R1,R2=",R1,R2,R1-R2,step,a1)
if abs(R1-R2) < er :
R=cbrt(R1)
d=4*pi*R1/3-a-b-c
#print(rn,"ok!X,Y,R,d=",x*R,y*R,R,d)
return x,y,R,d
break
if (R1-R2)>0 :
y-=step
step=step/stepn
#print(rn,"step=",step)
continue
y+=step
if y>stop+0.1 :
break
x,y,r,d=qiu(12,20,25)
print(rn,"x,y,r,d=",(x,y,r,d))
x,y,r,d=qiu(20,25,d)
print(rn,"x,y,r,d=",(x,y,r,d))
最初v(x,y)是使用的数值积分,不能直接解方程,所以等于是自己写了一个自己求解方程的代码。
得到了v(x,y)的解析表达式后就可以直接用find root 解方程组了,代码就非常简单了。
部分方程得不到解析解,可以数值积分等的可以使用那个框架自己解方程。
Python代码和结果如下,代码和结果刚好一屏。
# 两互相垂直平面切一球,切成四部分,依次体积为abcd。
# 已知abc,求d=?
# copy by yuange 2023.9.20
# n 精度位数
frommpmath import *
n=20
mp.dps=n+1
def v(x,y):
r=sqrt(1-x*x-y*y)
rx=sqrt(1-x*x)
ry=sqrt(1-y*y)
v0=(2*x*y*r+2*acos(x/rx*y/ry)+(x**3-3*x)*acos(y/rx)+(y**3-3*y)*acos(x/ry))/3
return v0
def qiu(a,b,c):
f1=lambda x,y:y**3-3*y+2+(x**3-3*x-2)*(a+b)/(b+c)
f2=lambda x,y:a*pi/v(x,y)-3*(a+b)/(y**3-3*y+2)
x,y=findroot(,)
d=4*(a+b)/(y**3-3*y+2)-(a+b+c)
R=cbrt((a+b+c+d)/pi*3/4)
return (x,y,R,d)
print(qiu(12,20,25))
这个公式非常不错,不过形式还是有点不太好。
球半径R。过球心,做垂直两垂直面的垂面,切出来横截面,取两垂直面分别水平和垂直方向,交点P的坐标(x*R,y*R)。限制P位于圆上或者圆内,有x^2+y^2<=1
切下来第一象限那块体积:
V(x,y)=1/3*(2*x*y*r+2*acos(x/rx*y/ry)+(x**3-3*x)*acos(y/rx)+(y**3-3*y)*acos(x/ry))*R^3
其中
r=sqrt(1-x*x-y*y)
rx=sqrt(1-x*x)
ry=sqrt(1-y*y)
这样的公式形式更好更漂亮,也更适用。
V(x,y)对于x或者y的负值也适用,并且第二三四象限的块体积分别为,V(-x,y)、V(-x,-y)、V(x,-y)。
这样更通用,可以一次直接适应各种大小面积分布。
得到公式很重要,还有公式的形式也很重要。
一个是公式怎么更通用,比如这个里面的xy范围不要局限于都大于0。
一个是公式各自变量怎么更独立,比如这个xy取坐标对于R的比例,而不是直接坐标,可以把R独立出来。
还有怎么写成更简洁的形式,比如这个公式里把r、rx、ry独立表示出来,原公式整体就会显得简洁很多。
TSC999 发表于 2023-8-20 09:59
一个圆球,被两个互相垂直的平面切成体积不同的四部分。求最小那一块的体积。有以下公式:
您好,能请教您一下关于这个积分的思路吗? TSC999 发表于 2023-8-20 09:59
一个圆球,被两个互相垂直的平面切成体积不同的四部分。求最小那一块的体积。有以下公式:
您好,我想请教一下在计算这个问题的时候,那个包含了(x-sin(x))的那一项积分的思路。
页:
[1]