


«»»
Псевдогиперболоид:
- БОКОВОЕ кольцевое окно при |x|≤a — просто открытое окно, БЕЗ стрелок излучения.
- ТОРЦЕВОЕ окно Out-1 ΔR=R/100 справа — еле заметно, СО стрелками осевого вывода вдоль +x.
- Левый рог — стенка целая.
ГЕОМЕТРИЯ ВОРОНОК НЕ ТРОНУТА.
«»»
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
============================================================
ПАРАМЕТРЫ
============================================================
a = 1.0
beta = 1.0
rho = 10.0
ka = 10.0
b = beta * a
R = rho * a
L = a * np.sqrt(1 + (R/b)**2)
dR = R / 100.0
dR_vis = dR
print(f»a={a}, b={b}, R={R}, L={L:.3f}»)
print(f»ΔR = R/100 = {dR:.4f}»)
def r_horn(x):
return R — bnp.sqrt((x/a)*2 — 1.0)
============================================================
РИСУНОК 1: меридиональное сечение
============================================================
fig, ax = plt.subplots(figsize=(15, 8))
— ЛЕВЫЙ РОГ: целиком —
x_left = np.linspace(-L, -a, 800)
r_left = r_horn(x_left)
ax.plot(x_left, r_left, ‘k-‘, lw=2.5, label=’стенка псевдогиперболоида’)
ax.plot(x_left, -r_left, ‘k-‘, lw=2.5)
— ПРАВЫЙ РОГ: стенка только до ρ = R-ΔR —
x_right = np.linspace(a, L, 800)
r_right = r_horn(x_right)
mask_r = r_right < (R — dR_vis)
ax.plot(x_right[mask_r], r_right[mask_r], ‘k-‘, lw=2.5)
ax.plot(x_right[mask_r], -r_right[mask_r], ‘k-‘, lw=2.5)
Линия фокусов
ax.plot([-L, L], [ R, R], ‘r—‘, lw=0.5, alpha=0.35)
ax.plot([-L, L], [-R, -R], ‘r—‘, lw=0.5, alpha=0.35)
ax.text(-L*0.95, R+0.25, ‘линия фокусов ρ=R’, color=’red’, fontsize=9)
— БОКОВОЕ ОКНО: просто пустое место, БЕЗ стрелок —
ax.plot([-a, a], [ R, R], ‘o’, color=’gray’, ms=4, alpha=0.6)
ax.plot([-a, a], [-R, -R], ‘o’, color=’gray’, ms=4, alpha=0.6)
ax.text(0, R+0.6, ‘боковое кольцевое окно (стенки нет)’,
ha=’center’, color=’gray’, fontsize=9, style=’italic’)
ax.annotate(», xy=(a, R+0.25), xytext=(-a, R+0.25),
arrowprops=dict(arrowstyle='<->’, color=’gray’, lw=0.8))
ax.text(0, R+0.05, ‘2a’, ha=’center’, color=’gray’, fontsize=8)
— ТОРЦЕВОЕ ОКНО ΔR: тонкая щёлочка справа —
x_torce = np.linspace(a, L, 2000)
r_torce = r_horn(x_torce)
in_window = (r_torce >= R — dR_vis) & (r_torce <= R)
ax.fill_between(x_torce[in_window], r_torce[in_window],
np.full(np.sum(in_window), R), color=’red’, alpha=0.6)
ax.fill_between(x_torce[in_window], -np.full(np.sum(in_window), R),
-r_torce[in_window], color=’red’, alpha=0.6)
x_edge_r = anp.sqrt(1 + (dR_vis/b)*2)
Выноска к торцевому окну
ax.annotate(f’торцевое окно Out-1\nΔR = R/100 = {dR:.3f}’,
xy=(x_edge_r, R-dR_vis/2),
xytext=(x_edge_r-1.5, R+2.2),
fontsize=10, color=’darkred’, fontweight=’bold’,
arrowprops=dict(arrowstyle=’->’, color=’darkred’, lw=1.2))
— ОСЕВЫЕ СТРЕЛКИ ВЫВОДА ЭНЕРГИИ из торцевого кольца ΔR (вдоль +x) —
Стрелки начинаются от торца правого рога и идут вправо
y_arrows = R — dR_vis/2
верхняя стрелка
ax.annotate(», xy=(L+3.0, y_arrows), xytext=(x_edge_r+0.05, y_arrows),
arrowprops=dict(arrowstyle=’->’, color=’red’, lw=2.5))
нижняя стрелка
ax.annotate(», xy=(L+3.0, -y_arrows), xytext=(x_edge_r+0.05, -y_arrows),
arrowprops=dict(arrowstyle=’->’, color=’red’, lw=2.5))
ax.text(L+1.5, R+0.7, ‘осевой вывод\nэнергии →’,
ha=’center’, color=’red’, fontsize=11, fontweight=’bold’)
— Заливка тела Ω —
ax.fill_between(x_left, r_left, -r_left, color=’lightsteelblue’, alpha=0.18)
x_mid = np.linspace(-a, a, 100)
ax.fill_between(x_mid, R, -R, color=’lightsteelblue’, alpha=0.18)
ax.fill_between(x_right, r_right, -r_right, color=’lightsteelblue’, alpha=0.18)
Метки x=±a
ax.axvline(-a, color=’blue’, lw=0.5, ls=’:’, alpha=0.5)
ax.axvline( a, color=’blue’, lw=0.5, ls=’:’, alpha=0.5)
ax.text(-a, -R1.18, ‘-a’, ha=’center’, color=’blue’, fontsize=10) ax.text( a, -R1.18, ‘a’, ha=’center’, color=’blue’, fontsize=10)
ax.set_xlabel(‘x’, fontsize=12)
ax.set_ylabel(‘ρ’, fontsize=12)
ax.set_title(‘Псевдогиперболоид с двумя окнами\n’
‘Боковое кольцевое окно при |x|≤a — открытое (без стрелок)\n’
f’+ торцевое окно Out-1 ΔR=R/100={dR:.3f} справа — осевой вывод энергии вдоль +x’,
fontsize=11)
ax.set_aspect(‘equal’)
ax.legend(loc=’lower left’, fontsize=9, framealpha=0.95)
ax.grid(True, alpha=0.3)
ax.set_xlim(-L1.1, L1.15+4)
ax.set_ylim(-R1.35, R1.35)
plt.tight_layout()
plt.savefig(‘step1_final.png’, dpi=140, bbox_inches=’tight’)
plt.show()
============================================================
РИСУНОК 2: ВРЕЗКА — увеличение торцевого окна
============================================================
fig, ax = plt.subplots(figsize=(10, 6))
x_zoom = np.linspace(a-0.3, x_edge_r+1.2, 1000)
r_zoom = r_horn(np.clip(x_zoom, a, None))
mask_z = (x_zoom >= a) & (r_zoom < (R — dR_vis))
ax.plot(x_zoom[mask_z], r_zoom[mask_z], ‘k-‘, lw=3)
ax.plot([a-0.3, x_edge_r+1.2], [R, R], ‘r—‘, lw=0.7, alpha=0.5)
ax.text(a-0.25, R+0.005, ‘ρ=R (линия фокусов)’, color=’red’, fontsize=9)
ax.plot([a-0.3, x_edge_r+1.2], [R-dR_vis, R-dR_vis],
color=’darkred’, lw=0.7, ls=’:’, alpha=0.7)
ax.text(a-0.25, R-dR_vis-0.012, f’ρ=R-ΔR={R-dR_vis:.3f}’,
color=’darkred’, fontsize=9)
in_z = (x_zoom >= a) & (r_zoom >= R — dR_vis) & (r_zoom <= R)
ax.fill_between(x_zoom[in_z], r_zoom[in_z],
np.full(np.sum(in_z), R), color=’red’, alpha=0.6)
Осевые стрелки в увеличенном виде
for ys in [R-dR_vis0.25, R-dR_vis0.5, R-dR_vis*0.75]:
ax.annotate(», xy=(x_edge_r+1.0, ys), xytext=(x_edge_r+0.05, ys),
arrowprops=dict(arrowstyle=’->’, color=’red’, lw=2))
ax.text(x_edge_r+0.55, R+0.015, ‘осевой вывод’, color=’red’,
fontsize=10, fontweight=’bold’, ha=’center’)
ax.annotate(», xy=(x_edge_r+0.15, R), xytext=(x_edge_r+0.15, R-dR_vis),
arrowprops=dict(arrowstyle='<->’, color=’darkred’, lw=1.5))
ax.text(x_edge_r+0.2, R-dR_vis/2, f’ΔR={dR:.3f}’,
color=’darkred’, fontsize=11, va=’center’, fontweight=’bold’)
ax.plot([a], [R], ‘o’, color=’gray’, ms=8)
ax.text(a-0.05, R+0.015, ‘x=a\n(кромка бокового окна)’,
ha=’right’, color=’gray’, fontsize=9)
ax.set_xlabel(‘x’, fontsize=11)
ax.set_ylabel(‘ρ’, fontsize=11)
ax.set_title(f’Врезка: торцевое окно ΔR={dR:.3f} = R/100\n’
‘Осевой вывод энергии из кольца ΔR вдоль +x’,
fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_xlim(a-0.3, x_edge_r+1.2)
ax.set_ylim(R — 6*dR_vis, R + 0.04)
plt.tight_layout()
plt.savefig(‘step1_final_zoom.png’, dpi=140, bbox_inches=’tight’)
plt.show()
============================================================
РИСУНОК 3: 3D
============================================================
fig = plt.figure(figsize=(15, 10))
ax3d = fig.add_subplot(111, projection=’3d’)
n_phi = 100
phi = np.linspace(0, 1.6np.pi, n_phi) phi_full = np.linspace(0, 2np.pi, 220)
x_lh = np.linspace(-L, -a, 100)
X, PHI = np.meshgrid(x_lh, phi)
RHO = r_horn(X)
ax3d.plot_surface(X, RHOnp.cos(PHI), RHOnp.sin(PHI),
color=’lightsteelblue’, alpha=0.6,
edgecolor=’gray’, linewidth=0.1, rstride=2, cstride=2)
x_rh = np.linspace(a, L, 100)
X, PHI = np.meshgrid(x_rh, phi)
RHO = r_horn(X)
RHO_d = np.where(RHO < R — dR_vis, RHO, np.nan)
ax3d.plot_surface(X, RHO_dnp.cos(PHI), RHO_dnp.sin(PHI),
color=’lightsteelblue’, alpha=0.6,
edgecolor=’gray’, linewidth=0.1, rstride=2, cstride=2)
Кромки бокового окна (БЕЗ стрелок излучения)
ax3d.plot(np.full_like(phi_full, -a), Rnp.cos(phi_full), Rnp.sin(phi_full),
color=’gray’, lw=1.2, alpha=0.7)
ax3d.plot(np.full_like(phi_full, a), Rnp.cos(phi_full), Rnp.sin(phi_full),
color=’gray’, lw=1.2, alpha=0.7)
Кромка торцевого окна (красное колечко)
ax3d.plot(np.full_like(phi_full, x_edge_r),
(R-dR_vis)np.cos(phi_full), (R-dR_vis)np.sin(phi_full),
color=’darkred’, lw=1.5)
— ОСЕВЫЕ СТРЕЛКИ ВЫВОДА из торцевого кольца ΔR (вдоль +x) —
n_arr = 16
for ph in np.linspace(0, 2np.pi, n_arr, endpoint=False): rho_arr = R — dR_vis0.5
y0 = rho_arrnp.cos(ph) z0 = rho_arrnp.sin(ph)
ax3d.quiver(x_edge_r, y0, z0, L*0.6, 0, 0,
color=’red’, lw=1.4, arrow_length_ratio=0.18, alpha=0.85)
ax3d.set_xlabel(‘x’); ax3d.set_ylabel(‘y’); ax3d.set_zlabel(‘z’)
ax3d.set_title(‘3D: боковое кольцевое окно (открытое, без стрелок) +\n’
f’торцевое окно ΔR=R/100={dR:.3f} — осевой вывод энергии вдоль +x’,
fontsize=11)
ax3d.view_init(elev=12, azim=35)
mx = R1.1 ax3d.set_xlim(-L1.05, L*1.3); ax3d.set_ylim(-mx, mx); ax3d.set_zlim(-mx, mx)
plt.tight_layout()
plt.savefig(‘step1_final_3d.png’, dpi=140, bbox_inches=’tight’)
plt.show()
print(«\n=== Геометрия ===»)
print(f»Левый рог: x∈[{-L:.2f}, -a], стенка целая»)
print(f»Боковое кольцевое окно: |x|≤a, ρ=R — стенки нет (без стрелок излучения)»)
print(f»Правый рог: x∈[a, {L:.2f}], стенка обрывается на ρ=R-ΔR»)
print(f»Торцевое окно Out-1: ΔR={dR:.4f} = R/100, осевой вывод вдоль +x»)