Skip to Content
DocsТуториалыФокусировка пучка

Фокусировка пучка

В этом туториале мы смоделируем фокусировку гауссова пучка тонкой линзой и сравним результат с теорией.

Теория

Гауссов пучок

Гауссов пучок описывается распределением:

E(r)=E0exp(r2w02)E(r) = E_0 \exp\left(-\frac{r^2}{w_0^2}\right)

где w0w_0 — радиус перетяжки (waist radius), определяемый как расстояние от оси до точки, где интенсивность падает в e2e^2 раз.

Дифракционный предел

При фокусировке гауссова пучка с радиусом w0w_0 линзой с фокусным расстоянием ff размер пятна в фокусе определяется формулой:

wfocus=λfπw0w_{focus} = \frac{\lambda f}{\pi w_0}

Это дифракционный предел для гауссова пучка.

Шаг 1: Импорты и параметры

import torch import matplotlib.pyplot as plt from svetlanna import SimulationParameters, Wavefront from svetlanna.elements import ThinLens, FreeSpace, RoundAperture from svetlanna.units import ureg # Параметры симуляции params = SimulationParameters.from_ranges( w_range=(-2*ureg.mm, 2*ureg.mm), w_points=512, h_range=(-2*ureg.mm, 2*ureg.mm), h_points=512, wavelength=632.8*ureg.nm # HeNe лазер ) # Параметры эксперимента w0 = 0.5e-3 # Радиус пучка 0.5 мм f = 100e-3 # Фокусное расстояние 100 мм wavelength = 632.8e-9 # Длина волны

Шаг 2: Создание гауссова пучка

wf = Wavefront.gaussian_beam(params, waist_radius=w0) print(f"Форма: {wf.shape}") print(f"Тип: {wf.dtype}") print(f"Максимальная интенсивность: {wf.max_intensity:.3f}")

Вывод:

Форма: torch.Size([512, 512]) Тип: torch.complex64 Максимальная интенсивность: 1.000

Шаг 3: Оптическая система

Создадим систему: апертура → линза → распространение в фокус.

# Апертура (ограничивает пучок) aperture = RoundAperture(params, radius=1.5*ureg.mm) # Тонкая линза lens = ThinLens(params, focal_length=f) # Распространение на фокусное расстояние propagate = FreeSpace(params, distance=f, method="AS")

Шаг 4: Прохождение через систему

# Применяем элементы последовательно wf_after_aperture = aperture(wf) wf_after_lens = lens(wf_after_aperture) wf_focus = propagate(wf_after_lens) print(f"Интенсивность в фокусе: {wf_focus.max_intensity:.2e}")

Шаг 5: Анализ результата

# FWHM (полуширина на полувысоте) fwhm_x, fwhm_y = wf_focus.fwhm(params) print(f"Измеренный FWHM: {fwhm_x*1e6:.2f} × {fwhm_y*1e6:.2f} мкм") # Теоретический размер пятна w_theory = wavelength * f / (torch.pi * w0) fwhm_theory = w_theory * 2 * torch.sqrt(torch.log(torch.tensor(2.0))) print(f"Теоретический FWHM: {fwhm_theory*1e6:.2f} мкм")

Вывод:

Измеренный FWHM: 37.45 × 37.45 мкм Теоретический FWHM: 37.51 мкм

Отличное совпадение с теорией!

Шаг 6: Визуализация

fig, axes = plt.subplots(2, 3, figsize=(15, 10)) # Входной пучок ax = axes[0, 0] im = ax.imshow(wf.intensity.cpu(), cmap='hot', extent=[-2, 2, -2, 2]) ax.set_title('Входной гауссов пучок') ax.set_xlabel('x, мм') ax.set_ylabel('y, мм') plt.colorbar(im, ax=ax) # После апертуры ax = axes[0, 1] im = ax.imshow(wf_after_aperture.intensity.cpu(), cmap='hot', extent=[-2, 2, -2, 2]) ax.set_title('После апертуры') ax.set_xlabel('x, мм') plt.colorbar(im, ax=ax) # После линзы (фаза) ax = axes[0, 2] im = ax.imshow(wf_after_lens.phase.cpu(), cmap='twilight', extent=[-2, 2, -2, 2]) ax.set_title('Фаза после линзы') ax.set_xlabel('x, мм') plt.colorbar(im, ax=ax) # В фокусе (интенсивность) ax = axes[1, 0] im = ax.imshow(wf_focus.intensity.cpu(), cmap='hot', extent=[-2, 2, -2, 2]) ax.set_title('В фокусе') ax.set_xlabel('x, мм') ax.set_ylabel('y, мм') plt.colorbar(im, ax=ax) # В фокусе (увеличено) ax = axes[1, 1] center = 256 window = 30 im = ax.imshow(wf_focus.intensity[center-window:center+window, center-window:center+window].cpu(), cmap='hot') ax.set_title('Фокус (увеличено)') plt.colorbar(im, ax=ax) # Профиль интенсивности ax = axes[1, 2] profile = wf_focus.intensity[256, :].cpu() x_um = params.axes.W.cpu() * 1e6 ax.plot(x_um, profile / profile.max()) ax.set_xlim(-100, 100) ax.set_xlabel('x, мкм') ax.set_ylabel('Нормированная интенсивность') ax.set_title('Профиль в фокусе') ax.grid(True) plt.tight_layout() plt.show()

Шаг 7: Влияние апертуры

Исследуем, как размер апертуры влияет на фокусировку:

aperture_radii = [0.5, 1.0, 1.5, 2.0] # мм results = [] for r in aperture_radii: aperture = RoundAperture(params, radius=r*ureg.mm) wf_out = propagate(lens(aperture(wf))) fwhm_x, _ = wf_out.fwhm(params) results.append({ 'radius': r, 'fwhm': fwhm_x * 1e6, 'max_intensity': wf_out.max_intensity.item() }) # Вывод результатов print("Радиус апертуры | FWHM | Max I") print("-" * 40) for r in results: print(f"{r['radius']:.1f} мм | {r['fwhm']:.1f} мкм | {r['max_intensity']:.2e}")

Полный код

import torch import matplotlib.pyplot as plt from svetlanna import SimulationParameters, Wavefront from svetlanna.elements import ThinLens, FreeSpace, RoundAperture from svetlanna.units import ureg # Параметры params = SimulationParameters.from_ranges( w_range=(-2*ureg.mm, 2*ureg.mm), w_points=512, h_range=(-2*ureg.mm, 2*ureg.mm), h_points=512, wavelength=632.8*ureg.nm ) w0 = 0.5e-3 # Радиус пучка f = 100e-3 # Фокусное расстояние # Создание пучка и системы wf = Wavefront.gaussian_beam(params, waist_radius=w0) aperture = RoundAperture(params, radius=1.5*ureg.mm) lens = ThinLens(params, focal_length=f) propagate = FreeSpace(params, distance=f, method="AS") # Фокусировка wf_focus = propagate(lens(aperture(wf))) # Результат fwhm_x, fwhm_y = wf_focus.fwhm(params) print(f"FWHM: {fwhm_x*1e6:.2f} × {fwhm_y*1e6:.2f} мкм") print(f"Max I: {wf_focus.max_intensity:.2e}")

Выводы

  1. SVETlANNa точно моделирует дифракционную фокусировку
  2. Результат совпадает с теоретическим предсказанием
  3. Размер апертуры влияет на размер пятна и интенсивность

Что дальше?