Приложение A: Исходные коды на Python построения 2D модели псевдогиперболоида 2-го порядка

Рис. № 11. 2D- псевдогиперболоид 2-го порядка
Python
import numpy as np
import matplotlib.pyplot as plt
# параметры резонатора
a0 = 2 # Полуось (горизонтальная)
b0 = 3 # Полуось (вертикальная)
R = 13.7 # Радиус фокальной зоны
# вычисляем фокусы
c = np.sqrt(a0**2 + b0**2) # Фокусное расстояние
e = c / a0 # Эксцентриситет
print(f»Параметры:»)
print(f» a₀ = {a0}»)
print(f» b₀ = {b0}»)
print(f» R = {R}»)
print(f»\nФокусы гиперболы:»)
print(f» F₁ = {-c:.4f} (левый)»)
print(f» F₂ = {+c:.4f} (правый)»)
# функция образующей гиперболы
def hyperbolic_horns_lower(x, a0, b0, R_line):
«»»Нижние рога, ограниченные сверху Y=R_line»»»
if np.abs(x) < a0:
return 0.0
y = b0 * np.sqrt((x / a0)**2 — 1)
return min(y, R_line)
# генерация точек
X_LIMIT = 10.0 # УВЕЛИЧЕНО: было 4.0 → теперь 10.0 для полного отображения
x_values = np.linspace(-X_LIMIT, X_LIMIT, 1000) # Больше точек для гладкости
# Нижние рога
y_lower = np.array([hyperbolic_horns_lower(x, a0, b0, R) for x in x_values])
# Верхние рога (зеркальная часть)
y_upper = 2 * R — y_lower
# визуализация
fig = plt.figure(figsize=(16, 10))
ax = plt.gca()
# основные рога
ax.plot(x_values, y_lower, color=’darkorange’, linewidth=4,
label=’Нижние рога (гипербола)’, zorder=3)
ax.plot(x_values, y_upper, color=’blue’, linewidth=4,
label=’Верхние рога (зеркальная часть)’, zorder=3)
# ось вращения
ax.axhline(R, color=’red’, linestyle=’-‘, linewidth=2.5,
label=f’Ось вращения Y={R}’, alpha=0.8, zorder=1)
# фокусы гиперболы — на обеих ветвях!
# нижние фокусы (на нижних рогах, y=0)
ax.scatter([c, -c], [0, 0], color=’red’, s=500, marker=’*’, zorder=10,
edgecolors=’darkred’, linewidths=2.5)
# верхние фокусы (на верхних рогах, y=2r)
ax.scatter([c, -c], [2*R, 2*R], color=’red’, s=500, marker=’*’, zorder=10,
edgecolors=’darkred’, linewidths=2.5,
label=f’Фокусы гиперболы: F₁={-c:.2f}, F₂={c:.2f}’)
# Вертикальные линии через НИЖНИЕ фокусы
ax.plot([c, c], [-2, 2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)
ax.plot([-c, -c], [-2, 2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)
# Вертикальные линии через ВЕРХНИЕ фокусы ← ДОБАВЛЕНО!
ax.plot([c, c], [2*R-2, 2*R+2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)
ax.plot([-c, -c], [2*R-2, 2*R+2], ‘r-‘, linewidth=2.5, alpha=0.7, zorder=2)
# Текстовые метки нижних фокусов
ax.text(c+0.3, -2.5, f’F₂ = {c:.2f}’, fontsize=12, weight=’bold’,
color=’darkred’, ha=’left’,
bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))
ax.text(-c-0.3, -2.5, f’F₁ = {-c:.2f}’, fontsize=12, weight=’bold’,
color=’darkred’, ha=’right’,
bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))
# Текстовые метки верхних фокусов
ax.text(c+0.3, 2*R+2.5, f’F₂ = {c:.2f}’, fontsize=12, weight=’bold’,
color=’darkred’, ha=’left’,
bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))
ax.text(-c-0.3, 2*R+2.5, f’F₁ = {-c:.2f}’, fontsize=12, weight=’bold’,
color=’darkred’, ha=’right’,
bbox=dict(boxstyle=’round,pad=0.4′, facecolor=’lightyellow’, alpha=0.95))
# вершины рогов
ax.scatter([a0, -a0], [0, 0], color=’black’, s=180, zorder=6, marker=’o’,
edgecolors=’darkgray’, linewidths=2.5, label=f’Вершины нижних рогов: ±{a0}’)
ax.scatter([a0, -a0], [2*R, 2*R], color=’black’, s=180, zorder=6, marker=’s’,
edgecolors=’darkgray’, linewidths=2.5, label=f’Вершины верхних рогов’)
# фокальная зона
ax.plot([-a0, a0], [0, 0], color=’lime’, linewidth=8, linestyle=’-‘, alpha=0.9,
label=f’Фокальная зона’, zorder=5, marker=’o’, markersize=6)
ax.plot([-a0, a0], [2*R, 2*R], color=’lime’, linewidth=8, linestyle=’-‘, alpha=0.9,
zorder=5, marker=’o’, markersize=6)
# Размерные линии
# Размер a₀
ax.annotate(», xy=(0, -0.7), xytext=(a0, -0.7),
arrowprops=dict(arrowstyle='<->’, color=’black’, lw=2.5))
ax.text(a0/2, -1.3, f’a₀ = {a0}’, fontsize=11, ha=’center’, weight=’bold’,
bbox=dict(boxstyle=’round’, facecolor=’white’, edgecolor=’black’, linewidth=1.5, alpha=0.95))
# Размер c (фокусное расстояние)
ax.annotate(», xy=(0, 0.7), xytext=(c, 0.7),
arrowprops=dict(arrowstyle='<->’, color=’red’, lw=2.5))
ax.text(c/2, 1.3, f’c = {c:.2f}’, fontsize=10, ha=’center’, weight=’bold’,
color=’darkred’,
bbox=dict(boxstyle=’round’, facecolor=’lightyellow’, edgecolor=’red’, linewidth=2, alpha=0.95))
# Размер R
ax.plot([X_LIMIT+0.5, X_LIMIT+0.5], [0, R], ‘g-‘, linewidth=2.5, alpha=0.8)
ax.plot([X_LIMIT+0.2, X_LIMIT+0.8], [0, 0], ‘g-‘, linewidth=2.5, alpha=0.8)
ax.plot([X_LIMIT+0.2, X_LIMIT+0.8], [R, R], ‘g-‘, linewidth=2.5, alpha=0.8)
ax.text(X_LIMIT+1.2, R/2, f’R = {R}’, fontsize=11, ha=’left’, weight=’bold’,
color=’darkgreen’,
bbox=dict(boxstyle=’round’, facecolor=’lightgreen’, edgecolor=’green’, linewidth=1.5, alpha=0.9))
# Аннотация фокусного свойства (снизу)
arrow_y = 1.5
ax.annotate(», xy=(c-0.1, arrow_y), xytext=(-c+0.1, arrow_y),
arrowprops=dict(arrowstyle='<->’, color=’purple’, lw=3, alpha=0.6))
ax.text(0, arrow_y+0.7, ‘F₁ ← → F₂’,
fontsize=10, ha=’center’, weight=’bold’, color=’purple’,
bbox=dict(boxstyle=’round’, facecolor=’lavender’, alpha=0.8))
# Аннотация фокусного свойства (сверху)
arrow_y_top = 2*R + 1.5
ax.annotate(», xy=(c-0.1, arrow_y_top), xytext=(-c+0.1, arrow_y_top),
arrowprops=dict(arrowstyle='<->’, color=’purple’, lw=3, alpha=0.6))
ax.text(0, arrow_y_top+0.7, ‘F₁ ← → F₂’,
fontsize=10, ha=’center’, weight=’bold’, color=’purple’,
bbox=dict(boxstyle=’round’, facecolor=’lavender’, alpha=0.8))
# Информационный текст
info_text = (f’Параметры:\n’
f’c = √(a₀²+b₀²) = {c:.4f}\n’
f’e = c/a₀ = {e:.4f}\n’
f’h/R = {2*a0/R:.4f}\n’
f’c/R = {c/R:.4f}’)
ax.text(-X_LIMIT+0.5, 2*R+5, info_text, fontsize=9, weight=’bold’, family=’monospace’,
bbox=dict(boxstyle=’round’, facecolor=’lightyellow’, edgecolor=’black’,
linewidth=1.5, alpha=0.95))
# Оформление
ax.set_title(f’2D сечение псевдогиперболоидного резонатора (a₀={a0}, b₀={b0}, R={R})\nс фокусами НА ОБЕИХ ветвях и ветвями до оси вращения’,
fontsize=15, weight=’bold’, pad=20, color=’darkgreen’)
ax.set_xlabel(‘X (продольная ось)’, fontsize=13, weight=’bold’)
ax.set_ylabel(‘Y (радиальная ось)’, fontsize=13, weight=’bold’)
ax.grid(True, linestyle=’:’, alpha=0.4, linewidth=1)
ax.set_xlim(-X_LIMIT-1, X_LIMIT+1.5)
ax.set_ylim(-4, 2*R+6)
ax.set_aspect(‘equal’)
ax.legend(loc=’upper center’, fontsize=10, framealpha=0.98, ncol=2,
bbox_to_anchor=(0.5, -0.04))
plt.tight_layout()
plt.savefig(‘hyperboloid_complete_foci.png’, dpi=150, bbox_inches=’tight’)
plt.show()
# Вывод результатов
print(f»\n» + «=»*70)
print(«ПОЛНАЯ ИНФОРМАЦИЯ О РЕЗОНАТОРЕ»)
print(«=»*70)
print(f»»»
ФОКУСЫ НА НИЖНИХ РОГАХ:
F₁ = ({-c:.4f}, 0) — левый фокус
F₂ = ({c:.4f}, 0) — правый фокус
ФОКУСЫ НА ВЕРХНИХ РОГАХ:
F₁ = ({-c:.4f}, {2*R:.1f}) — левый фокус
F₂ = ({c:.4f}, {2*R:.1f}) — правый фокус
РАССТОЯНИЕ МЕЖДУ ФОКУСАМИ:
2c = {2*c:.4f}
c/R = {c/R:.4f}
ВЕТВИ ДОХОДЯТ ДО ОСИ ВРАЩЕНИЯ:
X_LIMIT = 10.0
Полное отображение гиперболы
ФОКУСНОЕ СВОЙСТВО:
На каждой ветви лучи циркулируют между F₁ и F₂
Верхние и нижние ветви связаны через портали
→ Полная 3D циркуляция энергии в резонаторе!
«»»)
print(«=»*70)
Приложение В: Исходные коды на Python построения 3D модели псевдогиперболоида

Рис. № 12. 3D- псевдогиперболоид 2-го порядка
Модель:
Python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Параметры из документа
a0 = 2
b0 = 2.9
R = 13.7
# Функция для y_lower (радиальный профиль нижних рогов)
def get_y_lower(x, a0, b0, R):
abs_x = np.abs(x)
if abs_x < a0:
return 0.0
y = b0 * np.sqrt((abs_x / a0)**2 - 1)
return min(y, R)
# Расстояние от оси Y=R до профиля (радиус вращения)
def d(x, a0, b0, R):
y_lower = get_y_lower(x, a0, b0, R)
return R - y_lower # Поскольку профиль симметричен, это даёт радиус
# Генерация сетки
x = np.linspace(-10, 10, 100) # Ось X (осевая координата)
theta = np.linspace(0, 2 * np.pi, 50) # Угол вращения
X, Theta = np.meshgrid(x, theta)
#Радиусдлякаждойточки
D = np.array([d(xval, a0, b0, R) for xval in x])
D = np.tile(D, (len(theta), 1))
# Координаты поверхности
Y = R + D * np.cos(Theta) # Смещение по Y от оси
Z = D * np.sin(Theta) # Z для вращения
# Построение графика
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, color='blue', alpha=0.7) #Полупрозрачнаяповерхность
# Настройка осей
ax.set_xlabel('X (осевая координата)')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D модель резонатора: вращение вокруг оси Y=13.7')
# Показать сюжет
plt.show()
Приложение С: Исходные коды на Python построения профиля псевдогиперболоида 7-го порядка

Рис. № 13. Профиль псевдогиперболоида 7-го порядка
python
import numpy as np
import matplotlib.pyplot as plt
# Геометрические параметры
a0 = 2.0 # Горизонтальная полуось
b0 = 2.9 # Вертикальная полуось
R = 13.7 # Ограничение по радиусу
N_COPIES = 5 # Кол-во зеркальных слоёв
X_LIMIT = 10.0 # Отрисовка по X
c = np.sqrt(a0**2 + b0**2) # Фокусное расстояние
def get_hyperbola_y(x, a0, b0, R_lim):
if np.abs(x) < a0:
return 0.0
y = b0 * np.sqrt((x / a0)**2 — 1)
return np.minimum(y, R_lim)
x_vals = np.linspace(-X_LIMIT, X_LIMIT, 1000)
y_base_lower = np.array([get_hyperbola_y(x, a0, b0, R) for x in x_vals])
y_base_upper = 2 * R — y_base_lower
# Визуализация
fig, ax = plt.subplots(figsize=(10, 14))
colors = [‘#3477eb’, ‘#34eb86’, ‘#eb3434’, ‘#b134eb’, ‘#ebce34’]
for i in range(N_COPIES):
offset = i * (2 * R)
ax.plot(x_vals, y_base_lower + offset, color=colors[i % len(colors)], lw=2.5)
ax.plot(x_vals, y_base_upper + offset, color=colors[i % len(colors)], lw=2.5)
ax.axhline(offset, color=’gray’, ls=’—‘, alpha=0.3)
ax.axhline(offset + 2 * R, color=’gray’, ls=’—‘, alpha=0.3)
ax.scatter([c, -c], [offset, offset], marker=’*’, color=’black’, s=60) # фокусы
ax.set_title(«Стек из зеркальных торо-оболочек гиперболического профиля», fontsize=14)
ax.set_xlim(-X_LIMIT, X_LIMIT)
ax.set_ylim(-5, N_COPIES * 2 * R + 5)
ax.set_xlabel(«X (Ось симметрии)»)
ax.set_ylabel(«Y (Вертикальная ось)»)
ax.grid(True)
plt.show()
Приложение D: Исходные коды на Python построения 3-D псевдогиперболоида 6-го порядка

Рис. № 14. 3-D псевдогиперболоид 6-го порядка
Python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# ПАРАМЕТРЫ
a0 = 2
b0 = 2.9
R = 13.7
X_LIMIT = 8.0
N_COPIES = 5
N_STEPS = 100 # Детализация вращения
N_POINTS = 200 # Детализация кривой
# Функция образующей
def get_hyperbola_y(x, a0, b0, R_limit):
if np.abs(x) < a0:
return 0.0
y = b0 * np.sqrt((x / a0)**2 — 1)
return np.minimum(y, R_limit)
x_vals = np.linspace(-X_LIMIT, X_LIMIT, N_POINTS)
theta = np.linspace(0, 2 * np.pi, N_STEPS)
theta_grid, x_grid = np.meshgrid(theta, x_vals)
# ПОСТРОЕНИЕ 3D
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection=’3d’)
# Цветовая карта для слоев
colors = plt.cm.viridis(np.linspace(0, 1, N_COPIES))
for i in range(N_COPIES):
offset = i * (2 * R)
# Расчитываем радиусы для нижней и верхней ветвей этой копии
# Относительно оси вращения Y=0
y_base = np.array([get_hyperbola_y(x, a0, b0, R) for x in x_vals])
# Слой 1: Вращение нижней ветви + offset
r1 = y_base + offset
Y1 = r1[:, None] * np.cos(theta_grid)
Z1 = r1[:, None] * np.sin(theta_grid)
X1 = x_grid
# Слой 2: Вращение верхней ветви + offset
r2 = (2 * R — y_base) + offset
Y2 = r2[:, None] * np.cos(theta_grid)
Z2 = r2[:, None] * np.sin(theta_grid)
X2 = x_grid
# Отрисовка поверхностей (с прозрачностью для видимости слоев)
ax.plot_surface(X1, Y1, Z1, color=colors[i], alpha=0.3, antialiased=True)
ax.plot_surface(X2, Y2, Z2, color=colors[i], alpha=0.3, antialiased=True)
# Оформление
ax.set_title(f’3D Резонатор: вращение 5 зеркальных копий\nвокруг оси фокусов (Y=0)’, fontsize=14)
ax.set_xlabel(‘X (Ось симметрии)’)
ax.set_ylabel(‘Y’)
ax.set_zlabel(‘Z’)
# Выравнивание осей для корректного отображения пропорций
max_range = (2 * R * N_COPIES) / 2
ax.set_ylim(-max_range, max_range)
ax.set_zlim(-max_range, max_range)
plt.tight_layout()
plt.show()