Сечение правильной шестиугольной пирамиды S A B ...
تم الإنشاء في: ١١ أكتوبر ٢٠٢٥
تمت الإجابة باستخدام GPT-5 Thinking بواسطة Chat01
تم الإنشاء في: ١١ أكتوبر ٢٠٢٥
تمت الإجابة باستخدام 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)
.
pythonimport 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]])
pythonh=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)
pythonimport 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
pythonimport 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}
pythonimport 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
pythonimport 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)])
pythonfrom 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)
pythondef 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)
pythonimport 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))
Короткое решение.
Положим основание в плоскости , центр — в начале координат, вершина . Возьмём правильный шестиугольник радиуса (и стороны) :
Требуемая плоскость проходит через центр и параллельна
Направления этих прямых:
Нормаль к искомой плоскости (через ) параллельна :
Угол между плоскостями равен углу между нормалями, поэтому
По условию , значит
Уравнение секущей плоскости (через ) удобно записать как
(подставлен ). Подстановка вершин показывает, что точки лежат по одну сторону (), а и вершина — по другую (); т.е. плоскость делит пирамиду на часть, содержащую , и противоположную часть.
Разобьём пирамиду на 6 тетраэдров (где — перечисленные вершины основания). Каждой тетраэдр обрезаем половинным пространством и суммируем объёмы. Получается
Следовательно, отношение объёмов двух частей (содержащей вершину к противоположной) равно
(Числа уже взаимно простые; .)