Решение параболического уравнения Леонтовича-Фока
Дифракция гауссова пучка на поглощающей полуплоскости
В данной задаче рассматривается распространение двумерного волнового поля вблизи границы идеально поглощающей полуплоскости. Источником служит гауссов пучок, падающий перпендикулярно на край экрана. Основная цель — показать, как волна «затекает» в область геометрической тени, формируя плавное, лишённое интерференционных осцилляций поле на поверхности, что характерно для модели Фока. Мы численно решим соответствующее уравнение эволюционного типа и визуализируем амплитуду поля вдоль границы раздела сред.
Параболическое уравнение Леонтовича — Фока
Параболическое уравнение Леонтовича-Фока было решено Владимиром Александровичем Фоком вместе с Михаилом Александровичем Леонтовичем в ходе изучения распространения радиоволн вокруг искривленной поверхности Земли.
Сложность задачи заключалась в том, что классические методы попросту не работали в так называемой «области Фока» — переходной зоне на границе света и тени. Представьте себе поверхность Земли, освещенную радиопередатчиком. Там, куда лучи доходят по прямой (зона прямой видимости), всё более-менее понятно. А вот дальше, за горизонтом, находится зона тени, куда, как мы знаем на практике, радиоволны всё же проникают. Описать этот процесс математически было чрезвычайно трудно.
Это уравнение получается из уравнения Гельмгольца путём выделения быстроосциллирующего множителя, распространяющегося вдоль выделенного направления, и пренебрежения второй производной по продольной координате. Оно описывает медленную комплексную амплитуду волны u(x, z) вблизи границы тени.
Уравнение записывается следующим образом:
Здесь — координата вдоль направления распространения, — поперечная координата, — волновое число, а — относительная диэлектрическая проницаемость среды (зависит только от ).
Это уравнение говорит нам, что медленная амплитуда волны u меняется вдоль x пропорционально кривизне её профиля по z. Физически это описывает, как узкий пучок расплывается и просачивается в область тени по мере распространения. Для компьютера производные нужно заменить дискретными аналогами, поэтому мы покрываем плоскость сеткой с шагами и , а вторую производную по записываем через значения в трёх соседних точках: .
Зная поле при некотором x, мы хотим найти его на следующем шаге . Простой явный метод здесь неустойчив, поэтому мы используем схему Кранка — Николсон, усредняющую вторую производную между текущим и следующим слоем: , где — матрица дискретной второй производной. Перенеся неизвестное влево, а известное вправо, получаем систему линейных уравнений с трёхдиагональной матрицей . Решая её на каждом шаге, мы продвигаем волну вперёд по . Чтобы смоделировать край поглощающего экрана, после каждого шага мы принудительно зануляем амплитуду в том узле сетки, который соответствует для всех . Так рождается наглядная картина дифракции: пучок уширяется, а его часть, касающаяся границы, безвозвратно поглощается.
Решение
Рассмотрим модельную задачу для свободного пространства () с граничным условием идеального поглощения на полуплоскости: при . Начальное распределение поля при зададим в виде смещённого от границы гауссова пучка. Эволюцию по будем выполнять при помощи полностью неявной конечно-разностной схемы (метод Кранка — Николсон), которая обладает хорошей устойчивостью.
using LinearAlgebra
# --- Параметры задачи ---
k = 20.0 # волновое число
Lz = 10.0 # размер области по z
Nz = 300 # число узлов по z
dz = Lz / Nz
z = range(-Lz/2, Lz/2, length=Nz+1)[1:Nz]
Lx = 5.0
Nx = 200
dx = Lx / Nx
x_range = range(0, Lx, length=Nx+1)
# Начальный гауссов пучок
z0 = 2.0
w0 = 0.5
u0 = @. exp(-((z - z0)/w0)^2)
# --- Дискретизация ---
main_diag = -2.0 * ones(Nz)
off_diag = ones(Nz-1)
D2 = (1/dz^2) * (diagm(-1 => off_diag, 0 => main_diag, 1 => off_diag))
D2[1, end] = 1/dz^2
D2[end, 1] = 1/dz^2
alpha = -1im / (2k)
I_mat = Matrix{ComplexF64}(I, Nz, Nz)
A = I_mat - (alpha * dx/2) * D2
B = I_mat + (alpha * dx/2) * D2
zero_idx = argmin(abs.(z .- 0.0))
# --- Марш по x ---
u = copy(u0)
field_amplitude = zeros(Float64, Nz, Nx+1)
field_amplitude[:, 1] = abs.(u)
for n in 1:Nx
u = A \ (B * u)
u[zero_idx] = 0.0
field_amplitude[:, n+1] = abs.(u)
end
# --- 3D-поверхность ---
plot(
x_range, z, field_amplitude,
st = :surface, # тип графика — поверхность
xlabel = "x (продольная координата)",
ylabel = "z (поперечная координата)",
zlabel = "|u|",
title = "Дифракция гауссова пучка у поглощающей полуплоскости\n(уравнение Леонтовича — Фока)",
camera = (45, 30), # удобный угол обзора
colorbar_title = "Амплитуда",
alpha = 0.9, # небольшая прозрачность для лучшего восприятия глубины
fillalpha = 0.8,
linewidth = 0.1, # тонкая сетка, чтобы не перегружать картинку
titlefont=font(10), guidefont=font(6)
)
# Добавим линию края полуплоскости для наглядности
plot!(
[0, Lx], [0, 0], [0, 0],
lw = 3, color = :black, linestyle = :dash, label = "Край полуплоскости (z=0)"
)
На графике видно, как гауссов пучок смещается, уширяется вследствие дифракции, а его амплитуда вблизи z = 0 стремится к нулю по мере распространения за край полуплоскости.
Заключение
Параболическое уравнение Леонтовича — Фока позволяет эффективно рассчитывать дифракционные эффекты вблизи границы тени без необходимости решать полное волновое уравнение. Продемонстрированное численное решение методом Кранка — Николсон обладает устойчивостью и легко масштабируется на более сложные профили диэлектрической проницаемости, что делает его удобным инструментом для анализа распространения радиоволн вблизи поверхности Земли и в задачах квазиоптики.
