Конечно-разностные схемы моделирования распространения волн
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
>
2.10Тестовые примеры для программы, реализующей явную схему
Программа реализованная на C/C++ в качестве выходных данных имеет 2 файла: config.txt - содержащий информацию о расчётной сетке и eta.txt - содержащую карту высот. Примеры выходных данных можно посмотреть в прикреплённых файлах.
На рисунках 4 - 9 изображены результаты работы программы строящей графики в среде MATLAB в разные моменты времени:
Рисунок 4 - состояние волны в начальный момент времени
Рисунок 5 - состояние волны в момент времени t = 1с
Рисунок 6 - состояние волны в момент времени t=1,5c
Рисунок 7 - состояние волны в момент времени t=2c
Рисунок 8 - состояние волны в момент времени t=3c
Рисунок 9 - состояние волны в момент времени t=6c
3. Неявная схема
3.1Постановка задачи
Пусть система дифференциальных уравнений, моделирующая поведение волн, имеет вид
(11)
Для этой системы выберем неявную конечно-разностную схему с пересчётом
(12)
(13)
(14)
(15)
Шаги по горизонтальным осям (?x и ?y) возьмём равными, выразив их как h = ?x = ?y, а глубину бассейна будем считать постоянной, т.е. H = const.
С помощью полученной схемы реализовать программу, позволяющую моделировать поведение волн.
3.2Теоретическая часть
Для моделирования поведения волн, как уже было описано выше, мы использовали систему дифференциальных уравнений (11) и построенную к ней конечно-разностную схему в которой: u и v -векторы скорости, а ? - высота волны, ?* - вспомогательное значение высота волны, H - глубина бассейна.
Данная схема является неявной с пересчётом. Главной особенностью неявных схем является то, что они являются безусловно устойчивыми.
Мы выделили ?*, которая не зависит от элементов на следующем слое. Пользуясь этим приёмом, мы может находить скорости независимо от значения скоростей на следующем шаге. Это позволяет нам использовать метод прогонки для отыскания значений скоростей на новом слое. Для этого нам потребуется выразить скорости из уравнений (13) и (14), а заодно и однозначно выразить ? и ?*:
(16)
(17)
(18)
(19)
Для того, что бы отыскать значения на n+1 слое, опираясь на предыдущий слой, нужно будет решать систему линейных уравнений. Обычно, для этого используются итерационные методы, вместо более долгих точных методов. То такие методы имеют один большой недостаток - они решают систему приближенно. Но особый вид неявной схемы позволяет нам использовать решать всего лишь трёхдиагональную матрицу. Для этого используется метод прогонки.
Теперь, когда уравнения для поиска новых значений построены, требуется задать начальные и граничные условия.
3.3Начальные условия
В данной задаче начальное состояние волны зададим при помощи функции
(20)
Скорости начальный момент равны 0. h = 0.1, , а высота бассейна равна 1.
На рисунке 10 изображено начальное состояние волны.
Рисунок 10 - состояние в начальный момент времени
3.4Граничные условия
Для данной схемы рассмотрим в качестве граничных условий свободные границы. Для этого будем использовать условие протекания:
(21)
3.5Алгоритм решения
1)Задать параметры расчётной сетки.
)Задать начальные значения.
)Рассчитать временные высоты.
)Рассчитать используя метод прогонки распределение скоростей на новом слою
).Рассчитать высоты на новом слою.
)Задать граничные условия на новом слою.
)Вернуться к пункту 3, если слой не последний.
)Вывести полученные данные о высотах и характеристиках в файлы.
)Отобразить полученные результаты.
3.6Блок-схема
На рисунке 11 изображена блок-схема алгоритма.
Рисунок 11 - блок-схема алгоритма
3.7Реализация
3.7.1Таблица идентификаторов для программы
В таблице 4 представлены идентификаторы переменных, функций и процедур для языков C/C++, используемых в реализации программ.
Таблица 4 - ИдентификаторыДанныеИдентификатор на языке C/C++Переменные и методы Scheme:Массив значений udouble *** uМассив значений vdouble *** vМассив значений высотdouble *** etaВременный массив значений высотdouble ** etaTempКол-во моментов времениt_numКол-во точек на осяхx_numШаг по времени (секунды)dtШаг по оси (метры)dxГлубина бассейнаHВывод массива значенийoutArray(char *, double ***)Очистка массивовclear()Вывод информации о схемеouput()Переменные и методы SchemeN:Фазовая скоростьcЗадать начальные условияsetInitialConditions()Задать граничные условия на n шагуsetBoundaryConditions(int n)Начать расчётыcalculate()Подготовить временные высотыprepareEtaTemp()Метод прогонкиsolveMatrix()Рассчитать значений высотcalculateEta()Рассчитать UxcalculateUx()Рассчитать UycalculateUy()Рассчитать VxcalculateVx()Рассчитать VycalculateVy()Переменные:Счётчикиi, j, kНачальная координата xx0Начальная координата yy0Начальная высотаeta0Вспомогательные массивыa, b, c, f, d, eТестовая схемаtest
3.7.2Реализация на языке С/С++ программы
Gредставлена реализация алгоритма на языке C/C++.
Реализация явной схемы на языке C/C++
#include
#include
#include double g = 9.8;Scheme{:*** u;// Массив значений u*** v;// Массив значений v*** eta;// Массив значений eta** etaTemp;// Массив вспомогательных значений etaH;// Глубина бассейнаt_num;// Кол-во моментов времениx_num;// Кол-во точек на оси Xdt;// Шаг по времени (секунды)dx;// Шаг по оси (метры)outArray(char * name, double *** out_array){* fout = fopen(name, "w");(int i = 0; i < t_num; i++){(int j = 0; j < x_n