что в пределе при ![]()
даёт необходимое нам одномерное
волновое уравнение:
Еще более упростим задачу, положив плотность
струны постоянной:
Аналогичное уравнение можно получить и для
двумерного случая малых колебаний мембраны:
где ![]()
- двумерный оператор Лапласа. Из
физических соображений очевидно, что одного только уравнения ![]()
недостаточно для однозначного
определения функции отклонения, и необходимо дополнить картину заданием начальных
условий и режима на концах струны.
В качестве первого начального
условия положим:
Функция ![]()
здесь будет иметь смысл положения
струны в момент времени, когда она была отпущена. Второе начальное условие, в
качестве которого задают первую производную от ![]()
сделаем нулевым:
что будет означать, что в начальный момент
времени струна покоилась. Рассматривая краевые условия, также ограничимся
простейшим случаем закреплённой на концах струны:
Все те же самые рассуждения можно распространить
и на случай мембраны:
Поставленная таким образом смешанная задача для
уравнения гиперболического типа может быть решена несколькими способами, но мы
будем рассматривать метод разделения переменных, ибо вид получаемого таким
образом решения позволит дополнительно продемонстрировать некоторые возможности
распараллеливания вычислений.
3.2 Решение задачи
методом Фурье
Суть метода Фурье заключается в представлении
искомого решения в виде произведения двух независимых функций, каждая из
которых будет зависеть только от своей переменной /4/. В нашем случае это:
Подставляя такое решение в волновое
уравнение ![]()
, получаем:
Равенство ![]()
должно тождественно выполняться для
любых аргументов ![]()
и ![]()
, поэтому из математических
соображений ясно, что левая и правая его части равны некоторой константе ![]()
. В результате из одного уравнения
мы получаем два независимых:
Теперь получим граничные с учётом
представления ![]()
:
Общее решение уравнения ![]()
для функции ![]()
имеет вид:
Добавим граничные условия и получим:
Константу![]()
положим равной единице и получим
множество ![]()
- нетривиальных решений![]()
задачи ![]()
:
Аналогично для ![]()
:
Таким образом частное решение
уравнения ![]()
:
а так как это уравнение является линейным и
однородным, можно утверждать, что сумма частных решений тоже ему удовлетворяет:
Недостающие коэффициенты находятся из учёта
начальных условий:
Выражение ![]()
по своей сути является разложением
функции ![]()
в тригонометрический ряд Фурье,
коэффициенты которого, как известно, вычисляются по формуле:
В той же последовательности ищется
решение и для двумерного случая, и для прямоугольной мембраны размерами ![]()
оно выражается двойным рядом:
В силу подобного представления решения становится возможным распараллеливание сразу двух процессов - расчета амплитуд для каждой точки струны или мембраны и вычисления коэффициентов Фурье.
Единожды задав функцию начального
положения ![]()
, можно сразу рассчитать зависящие
только от неё коэффициенты ![]()
, поэтому построение оптимального
алгоритма для их вычисления станет первым этапом работы с CUDA.
В двух последующих главах будем
рассматривать расчёт коэффициентов Фурье двумя независимыми способами - при
помощи быстрого преобразования Фурье и через квадратурные формулы
Гаусса-Лежандра. В обоих случаях используются методы массивно-параллельного
вычисления.
4. ВЫЧИСЛЕНИЕ КОЭФФИЦИЕНТОВ С ПОМОЩЬЮ БЫСТРОГО
ПРЕОБРАЗОВАНИЯ ФУРЬЕ
4.1 Дискретный подход к
вычислению коэффициентов
Коэффициенты ![]()
, выражение для которых было
получено в предыдущей главе, как уже говорилось, программно могут быть
рассчитаны несколькими способами. Один из них - дискретное преобразования
Фурье.
Для этого сначала весь интервал
интегрирования необходимо разбить на ![]()
элементарных равных промежутков и
интегралы заменить дискретными суммами по формуле левых прямоугольников:
В последующих преобразованиях будем опускать двойку перед суммой, учитывая, что добавим её позже в окончательное решение.
Теперь обратим своё внимание на формулы прямого
и обратного дискретного преобразования Фурье:
Согласно именно такому определению
преобразования Фурье функционирует большинство математических библиотек, в том
числе и та, которая была использована в этой работе. Значит, теперь задача
состоит в том, чтобы каким-то образом изменить результаты, получаемые программно,
согласно формулам ![]()
и ![]()
, чтобы можно было использовать их в
расчете ![]()
. Рассмотрим обратное
преобразование. Для начала разложим экспоненту по формуле Эйлера:
Несложно заметить, что если положить
в качестве ![]()
набор значений функции ![]()
(заведомо вещественных), то мнимая
часть обратного дискретного преобразования Фурье даст выражение довольно
похожее на выражение для коэффициентов ![]()
. Сравним:
Теперь в выражении ![]()
умножим и разделим аргумент синуса
на двойку:
Воспользуемся тем замечательным
преимуществом, что входные значения для преобразования Фурье мы можем задавать
какими угодно, и предположим, что существует некоторый набор ![]()
, содержащий всего 2![]()
элементов, ![]()
первых значений которого
действительно вычисляются по формуле:
остальные же значения ![]()
положим равными нулю. Очевидно, что
добавление нулевых членов не изменит суммы:
и мы приходим к выражению:
что является по своей сути
умноженной на коэффициент мнимой частью обратного дискретного преобразования
Фурье для двойного набора значений. Для ясности можем положить ![]()
и получим:
Таким образом мы приходим к простому
алгоритму вычисления коэффициентов Фурье, входящих в решение поставленной в
предыдущих главах задачи. Согласно этому алгоритму для нахождения ![]()
требуется выполнить следующие
действия:
) разбить промежуток интегрирования
(то есть длину струны) на ![]()
равных частей, для каждой из
которых вычислить значение функции начального положения ![]()
(по левой границе интервала);
) сформировать набор ![]()
, ![]()
первых значений которого совпадают
со значениями ![]()
, полученными в предыдущем пункте, а
остальные ![]()
равны нулю;
) выполнить обратное преобразование
Фурье для ![]()
;
) взять нормированную мнимую часть от полученных коэффициентов.
При этом очевидно, что на выходе
преобразования Фурье образуется массив из ![]()
значений, но нас интересует только
первые ![]()
из них, так как именно они будут
давать ![]()
значений ![]()
. Вторая половина массива, вообще
говоря, будет зеркальным отображением первой, это является одним из свойств
дискретного преобразования Фурье и справедливо для всех случаев, когда на его
вход подаётся набор вещественных данных.