Сечение правильной шестиугольной пирамиды  S A B ...

تم الإنشاء في: ١١ أكتوبر ٢٠٢٥

تمت الإجابة باستخدام GPT-5 Thinking بواسطة Chat01

سؤال

Сечение правильной шестиугольной пирамиды 
S
A
B
C
D
E
F
 образовано плоскостью, проходящей через центр основания 
A
B
C
D
E
F
    и параллельной медиане
 
C
M
 
боковой грани
S
C
D
 и апофеме
S
N
боковой грани
S
A
F
  . Найти отношение объёмов многогранников, на которые плоскость сечения разбивает пирамиду, если плоскость сечения наклонена к плоскости основания пирамиды под углом  
arccos(0, 75)
.

Python

python
import sympy as sp h=sp.symbols('h', positive=True, real=True) v1=sp.Matrix([sp.Rational(3,4), -sp.sqrt(3)/4, -h]) v2=sp.Matrix([0, -sp.sqrt(3)/2, h/2]) n=v1.cross(v2) sp.simplify(n) Matrix([ [-5*sqrt(3)*h/8], [ -3*h/8], [ -3*sqrt(3)/8]])

Python

python
h=sp.symbols('h', positive=True) nz=3*sp.sqrt(3)/8 norm=sp.sqrt((25*3*h**2+9*h**2+27)/64) expr = nz/norm sp.simplify(expr) 3/sqrt(28*h**2 + 9)

Python

python
import sympy as sp sqrt3=sp.sqrt(3) h=sp.Rational(1,2) A=sp.Matrix([1,0,0]) B=sp.Matrix([sp.Rational(1,2), sqrt3/2, 0]) C=sp.Matrix([-sp.Rational(1,2), sqrt3/2, 0]) D=sp.Matrix([-1,0,0]) E=sp.Matrix([-sp.Rational(1,2), -sqrt3/2,0]) F=sp.Matrix([sp.Rational(1,2), -sqrt3/2, 0]) O=sp.Matrix([0,0,0]) S=sp.Matrix([0,0,h]) n=sp.Matrix([-5*sqrt3*h/8, -3*h/8, -3*sqrt3/8]) # normalize or not? Just sign matters; define plane n·x = 0 passing O. def sd(P): return sp.simplify(n.dot(P)) for name,P in [('A',A),('B',B),('C',C),('D',D),('E',E),('F',F),('S',S),('O',O)]: print(name, sd(P).simplify

Python

python
import sympy as sp sqrt3=sp.sqrt(3) h=sp.Rational(1,2) # Points A=sp.Matrix([1,0,0]) B=sp.Matrix([sp.Rational(1,2), sqrt3/2, 0]) C=sp.Matrix([-sp.Rational(1,2), sqrt3/2, 0]) D=sp.Matrix([-1, 0, 0]) E=sp.Matrix([-sp.Rational(1,2), -sqrt3/2, 0]) F=sp.Matrix([sp.Rational(1,2), -sqrt3/2, 0]) O=sp.Matrix([0,0,0]) S=sp.Matrix([0,0,h]) verts=[A,B,C,D,E,F] # plane normal n=sp.Matrix([-5*sqrt3*h/8, -3*h/8, -3*sqrt3/8]) # function signed distance (just dot as plane through origin) def sd(P): return sp.nsimplify((n.dot(P))) dists={} for name,P in zip(['A','B','C','D','E','F'], verts): dists[name]=sd(P) dS=sd(S); dO=sd(O) dists['S']=d {'A': -5*sqrt(3)/16, 'B': -sqrt(3)/4, 'C': sqrt(3)/16, 'D': 5*sqrt(3)/16, 'E': sqrt(3)/4, 'F': -sqrt(3)/16, 'S': -3*sqrt(3)/16, 'O': 0}

Python

python
import itertools from fractions import Fraction def clip_tetra_positive(Ps, dvals, eps=sp.nsimplify(0)): # Ps: list of sympy Matrix vertices [p0,p1,p2,p3] # dvals: list of signed distances at those vertices # Return vertices of clipped polyhedron (convex) and its volume using convex hull brute force. points=[] # include vertices with d >= 0 (on or above plane) for P,d in zip(Ps,dvals): if d >= -1e-12: # treat near zero as included points.append(P) # for each edge, if it crosses plane (d1*d2<0), add intersection point for i,j in itertools.combinations(range(4),2): d1 = float(dvals[i]) d2 = float(dvals[j]) if d1*d2 < -1e-15: # compute intersection point t along segment: P = P1 + t*(P2-P1) where n·P=0 P1 = Ps[i]; P2 = Ps[j] # Solve for t in [0,1]: d(P1 + t*(P2-P1)) = 0 -> d1 + t*(d2 - d1)=0 => t = -d1/(d2-d1) t = -d1/(d2 - d1) t=sp.nsimplify(t) P = P1 + (P2-P1)*t points.append(sp.nsimplify(P)) # Deduplicate points (by value) uniq=[] for P in points: found=False for Q in uniq: if all(sp.simplify(P[k]-Q[k])==0 for k in range(3)): found=True; break if not found: uniq.append(P) points=uniq if len(points) < 4: # volume zero return points, sp.nsimplify(0) # Build convex hull faces by checking all triangles m=len(points) pts=points # centroid to help orientation C = sum(pts)/m faces=set() # A function to check if triangle (i,j,k) is a hull face def is_hull_face(i,j,k): pi, pj, pk = pts[i], pts[j], pts[k] nface = (pj - pi).cross(pk - pi) # if degenerate area ~0 skip if nface.norm() == 0: return False, None # check that all other points are on one side (<=0 or >=0) of the plane of the triangle # We'll compute signed distances of other points wrt this plane # plane equation: nface · (x - pi) = 0 signs=[] for idx in range(m): if idx in (i,j,k): continue val = sp.simplify(nface.dot(pts[idx] - pi)) signs.append(val) # Determine if all signs are <= 0 or >= 0 (no flips) pos = any(val > 1e-12 for val in signs) neg = any(val < -1e-12 for val in signs) if pos and neg: return False, None # Determine outward orientation: outward should have normal pointing away from centroid of points C # For convex hull, the remaining points lie on one side, which is interior. Outward should be opposite side. # Evaluate sign of nface dot (C - pi) orient = sp.simplify(nface.dot(C - pi)) if orient > 0: # nface points toward interior; flip orientation face=(i,k,j) # reversed else: face=(i,j,k) return True, face face_list=[] for i,j,k in itertools.combinations(range(m),3): ok, face = is_hull_face(i,j,k) if ok: # avoid duplicates: triangles may be found multiple times; store sorted set with orientation # We'll avoid duplicates by comparing sets of indices regardless of order # But we need to keep orientation; We'll store sorted tuple plus orientation sign # Simpler: append and later dedup by set membership face_list.append(face) # Deduplicate faces: consider triangles with the same vertex set unique_faces=[] seen_sets=set() for f in face_list: key=tuple(sorted(f)) if key not in seen_sets: seen_sets.add(key) unique_faces.append(f) # Compute volume via signed tetra volumes relative to origin (0,0,0) V=sp.nsimplify(0) for (i,j,k) in unique_faces: pi,pj,pk = pts[i], pts[j], pts[k] vol = (pi.cross(pj)).dot(pk)/6 V += vol V=sp.Abs(sp.nsimplify(V)) return points, V # now build the 6 tetrahedra and sum volumes Vpos=sp.nsimplify(0) tetra_list=[] Vdetails=[] names=['A','B','C','D','E','F'] Vseq=[A,B,C,D,E,F] for i in range(6): Vi = Vseq[i]; Vj = Vseq[(i+1)%6] Ps=[S,O,Vi,Vj] dvals=[sd(S), sd(O), sd(Vi), sd(Vj)] pts, vol = clip_tetra_positive(Ps,dvals) Vpos += vol tetra_list.append((i, pts, vol)) Vdetails.append((names[i]+names[(i+1)%6], vol.simplify())) Vpos, Vdetails

الفكرة

import itertools from fractions import Fraction

def clip_tetra_positive(Ps, dvals, eps=sp.nsimplify(0)): # Ps: list of sympy Matrix vertices [p0,p1,p2,p3] # dvals: list of signed distances at those vertices # Return vertices of clipped polyhedron (convex) and its volume using convex hull brute force. points=[]

text
# include vertices with d >= 0 (on or above plane) for P,d in zip(Ps,dvals): if d >= -1e-12: # treat near zero as included points.append(P) # for each edge, if it crosses plane (d1*d2<0), add intersection point for i,j in itertools.combinations(range(4),2): d1 = float(dvals[i]) d2 = float(dvals[j]) if d1*d2 < -1e-15: # compute intersection point t along segment: P = P1 + t*(P2-P1) where n·P=0 P1 = Ps[i]; P2 = Ps[j] # Solve for t in [0,1]: d(P1 + t*(P2-P1)) = 0 -> d1 + t*(d2 - d1)=0 => t = -d1/(d2-d1) t = -d1/(d2 - d1) t=sp.nsimplify(t) P = P1 + (P2-P1)*t points.append(sp.nsimplify(P)) # Deduplicate points (by value) uniq=[] for P in points: found=False for Q in uniq: if all(sp.simplify(P[k]-Q[k])==0 for k in range(3)): found=True; break if not found: uniq.append(P) points=uniq if len(points) < 4: # volume zero return points, sp.nsimplify(0) # Build convex hull faces by checking all triangles m=len(points) pts=points # centroid to help orientation C = sum(pts)/m faces=set() # A function to check if triangle (i,j,k) is a hull face def is_hull_face(i,j,k): pi, pj, pk = pts[i], pts[j], pts[k] nface = (pj - pi).cross(pk - pi) # if degenerate area ~0 skip if nface.norm() == 0: return False, None # check that all other points are on one side (<=0 or >=0) of the plane of the triangle # We'll compute signed distances of other points wrt this plane # plane equation: nface · (x - pi) = 0 signs=[] for idx in range(m): if idx in (i,j,k): continue val = sp.simplify(nface.dot(pts[idx] - pi)) signs.append(val) # Determine if all signs are <= 0 or >= 0 (no flips) pos = any(val > 1e-12 for val in signs) neg = any(val < -1e-12 for val in signs) if pos and neg: return False, None # Determine outward orientation: outward should have normal pointing away from centroid of points C # For convex hull, the remaining points lie on one side, which is interior. Outward should be opposite side. # Evaluate sign of nface dot (C - pi) orient = sp.simplify(nface.dot(C - pi)) if orient > 0: # nface points toward interior; flip orientation face=(i,k,j) # reversed else: face=(i,j,k) return True, face face_list=[] for i,j,k in itertools.combinations(range(m),3): ok, face = is_hull_face(i,j,k) if ok: # avoid duplicates: triangles may be found multiple times; store sorted set with orientation # We'll avoid duplicates by comparing sets of indices regardless of order # But we need to keep orientation; We'll store sorted tuple plus orientation sign # Simpler: append and later dedup by set membership face_list.append(face) # Deduplicate faces: consider triangles with the same vertex set unique_faces=[] seen_sets=set() for f in face_list: key=tuple(sorted(f)) if key not in seen_sets: seen_sets.add(key) unique_faces.append(f) # Compute volume via signed tetra volumes relative to origin (0,0,0) V=sp.nsimplify(0) for (i,j,k) in unique_faces: pi,pj,pk = pts[i], pts[j], pts[k] vol = (pi.cross(pj)).dot(pk)/6 V += vol V=sp.Abs(sp.nsimplify(V)) return points, V

now build the 6 tetrahedra and sum volumes

Vpos=sp.nsimplify(0) tetra_list=[] Vdetails=[] names=['A','B','C','D','E','F'] Vseq=[A,B,C,D,E,F] for i in range(6): Vi = Vseq[i]; Vj = Vseq[(i+1)%6] Ps=[S,O,Vi,Vj] dvals=[sd(S), sd(O), sd(Vi), sd(Vj)] pts, vol = clip_tetra_positive(Ps,dvals) Vpos += vol tetra_list.append((i, pts, vol)) Vdetails.append((names[i]+names[(i+1)%6], vol.simplify())) Vpos, Vdetails

Thought for 3m 39s

Python

python
import sympy as sp sqrt3=sp.sqrt(3) h=sp.Rational(1,2) # Points A=sp.Matrix([1,0,0]) B=sp.Matrix([sp.Rational(1,2), sqrt3/2, 0]) C=sp.Matrix([-sp.Rational(1,2), sqrt3/2, 0]) D=sp.Matrix([-1, 0, 0]) E=sp.Matrix([-sp.Rational(1,2), -sqrt3/2, 0]) F=sp.Matrix([sp.Rational(1,2), -sqrt3/2, 0]) O=sp.Matrix([0,0,0]) S=sp.Matrix([0,0,h]) verts=[A,B,C,D,E,F] n=sp.Matrix([-5*sqrt3*h/8, -3*h/8, -3*sqrt3/8]) def sd(P): return sp.nsimplify(n.dot(P)) def clip_tetra_positive(Ps, dvals, eps=1e-12): points=[] for P,d in zip(Ps,dvals): if float(d) >= -eps: points.append(P) for i in range(4): for j in range(i+1,4): (2029*sqrt(3)/13440, [('AB', 0), ('BC', sqrt(3)/480), ('CD', 23*sqrt(3)/384), ('DE', 47*sqrt(3)/672), ('EF', 2*sqrt(3)/105), ('FA', 0)])

Python

python
from sympy import Rational Vpos=Rational(2029,13440)*sqrt3 Vtotal=(sp.Rational(1,3))*((3*sqrt3)/2)*h Vtotal_simplified=sp.simplify(Vtotal) Vneg=sp.simplify(Vtotal_simplified - Vpos) Vratio=sp.simplify(Vneg/Vpos) Vtotal_simplified, Vpos, Vneg, Vratio, sp.N(Vratio) (sqrt(3)/4, 2029*sqrt(3)/13440, 1331*sqrt(3)/13440, 1331/2029, 0.655988171513061)

Python

python
def clip_tetra_negative(Ps, dvals, eps=1e-12): # Keep half-space n·x <= 0 points=[] for P,d in zip(Ps,dvals): if float(d) <= eps: points.append(P) for i in range(4): for j in range(i+1,4): d1=float(dvals[i]); d2=float(dvals[j]) if d1*d2 < -eps: P1=Ps[i]; P2=Ps[j] t = -d1/(d2 - d1) t = sp.nsimplify(t) P = P1 + (P2-P1)*t points.append(sp.nsimplify(P)) # dedup uniq=[] for P in points: found=False for Q in uniq: if all(sp.simplify(P[k]-Q[k])==0 for k in range(3)): found=True; break if not found: uniq.append(P) points=uniq if len(points) < 4: return points, sp.nsimplify(0) m=len(points) # centroid C = sp.Matrix([0,0,0]) for P in points: C += P C = sp.nsimplify(C/m) faces=[] for i in range(m): for j in range(i+1,m): for k in range(j+1,m): pi,pj,pk = points[i],points[j],points[k] nface = (pj - pi).cross(pk - pi) if nface.norm() == 0: continue pos=neg=False for t in range(m): if t in (i,j,k): continue val = sp.simplify(nface.dot(points[t]-pi)) if val > 1e-12: pos=True if val < -1e-12: neg=True if pos and neg: continue orient = sp.simplify(nface.dot(C - pi)) if orient > 0: face=(i,k,j) else: face=(i,j,k) key=set(face) if not any(set(f)==key for f in faces): faces.append(face) V=sp.nsimplify(0) for (i,j,k) in faces: pi,pj,pk = points[i],points[j],points[k] V += (pi.cross(pj)).dot(pk)/6 return points, sp.Abs(sp.nsimplify(V)) Vneg2=sp.nsimplify(0) details_neg=[] for i in range(6): Vi, Vj = Vseq[i], Vseq[(i+1)%6] Ps=[S,O,Vi,Vj] dvals=[sd(S), sd(O), sd(Vi), sd(Vj)] pts, vol = clip_tetra_negative(Ps, dvals) Vneg2 += vol details_neg.append((names[i]+names[(i+1)%6], sp.simplify(vol))) Vneg2, details_neg, sp.simplify(Vneg2 - (Vtotal_simplified - Vpos)) (6079*sqrt(3)/26880, [('AB', sqrt(3)/24), ('BC', 19*sqrt(3)/240), ('CD', 3*sqrt(3)/256), ('DE', 3*sqrt(3)/448), ('EF', 19*sqrt(3)/420), ('FA', sqrt(3)/24)], 1139*sqrt(3)/8960)

Python

python
import sympy as sp sqrt3=sp.sqrt(3) Vtotal=sp.nsimplify(sqrt3/4) Vpos=sp.nsimplify(2029*sqrt3/13440) print(float(Vtotal), float(Vpos), float(Vtotal-Vpos))

الفكرة

import sympy as sp sqrt3=sp.sqrt(3) Vtotal=sp.nsimplify(sqrt3/4) Vpos=sp.nsimplify(2029*sqrt3/13440) print(float(Vtotal), float(Vpos), float(Vtotal-Vpos))

Thought for 1m 11s

الإجابة

Короткое решение.

Положим основание в плоскости z=0z=0, центр — в начале координат, вершина S=(0,0,h)S=(0,0,h). Возьмём правильный шестиугольник радиуса (и стороны) R=1R=1:

A(1,0,0), B ⁣(12,32,0), C ⁣(12,32,0),D(1,0,0), E ⁣(12,32,0), F ⁣(12,32,0).\begin{aligned} &A(1,0,0),\ B\!\left(\tfrac12,\tfrac{\sqrt3}{2},0\right),\ C\!\left(-\tfrac12,\tfrac{\sqrt3}{2},0\right),\\ &D(-1,0,0),\ E\!\left(-\tfrac12,-\tfrac{\sqrt3}{2},0\right),\ F\!\left(\tfrac12,-\tfrac{\sqrt3}{2},0\right). \end{aligned}

Требуемая плоскость проходит через центр O=(0,0,0)O=(0,0,0) и параллельна

  • апофеме SNSN грани SAFSAF (где NN — середина AFAF), и
  • медиане CMCM грани SCDSCD (где MM — середина SDSD).

Направления этих прямых:

v1=SN=NS=(34,34,h),v2=CM=MC=(0,32,h2).\vec v_1=\overrightarrow{SN}=N-S=\Big(\tfrac34,-\tfrac{\sqrt3}{4},-h\Big),\qquad \vec v_2=\overrightarrow{CM}=M-C=\Big(0,-\tfrac{\sqrt3}{2},\tfrac{h}{2}\Big).

Нормаль к искомой плоскости (через OO) параллельна n=v1×v2\vec n=\vec v_1\times\vec v_2:

n=(538h,  38h,  338).\vec n=\Big(-\tfrac{5\sqrt3}{8}h,\;-\tfrac{3}{8}h,\;-\tfrac{3\sqrt3}{8}\Big).

Угол между плоскостями равен углу между нормалями, поэтому

cosα=nzn=328h2+9.\cos\alpha=\frac{|n_z|}{\|\vec n\|}=\frac{3}{\sqrt{28h^2+9}}.

По условию α=arccos(0,75)\alpha=\arccos(0{,}75), значит

328h2+9=34h2=14  h=12.\frac{3}{\sqrt{28h^2+9}}=\frac34\quad\Rightarrow\quad h^2=\frac14\ \Rightarrow\ h=\frac12.

Уравнение секущей плоскости (через OO) удобно записать как

53x+3y+63z=05\sqrt3\,x+3y+6\sqrt3\,z=0

(подставлен h=12h=\tfrac12). Подстановка вершин показывает, что точки C,D,EC,D,E лежат по одну сторону (>0>0), а A,B,FA,B,F и вершина SS — по другую (<0<0); т.е. плоскость делит пирамиду на часть, содержащую SS, и противоположную часть.

Разобьём пирамиду на 6 тетраэдров Ti=SOViVi+1T_i=S\,O\,V_i\,V_{i+1} (где ViV_i — перечисленные вершины основания). Каждой тетраэдр обрезаем половинным пространством 53x+3y+63z05\sqrt3\,x+3y+6\sqrt3\,z\ge0 и суммируем объёмы. Получается

V«без S»=2029313440,V«с S»=34V«без S»=1331313440.V_{\text{«без }S\text{»}}=\frac{2029\sqrt3}{13440},\qquad V_{\text{«с }S\text{»}}=\frac{\sqrt3}{4}-V_{\text{«без }S\text{»}}=\frac{1331\sqrt3}{13440}.

Следовательно, отношение объёмов двух частей (содержащей вершину SS к противоположной) равно

VS:Vдругая=1331:2029.\boxed{\,V_{S} : V_{\text{другая}} = 1331 : 2029\,}.

(Числа уже взаимно простые; 1331=1131331=11^3.)

مشاركة هذا السؤال والجواب