|
6 | 6 | 2. [Структура проекта 🛠️](#2-структура-проекта-) |
7 | 7 | 3. [Ход выполнения работы 🔎](#3-ход-выполнения-работы-) |
8 | 8 | - [Используемые методы 📚](#используемые-методы-) |
9 | | - - [FTCS](#FTCS) |
10 | | - - [Явная схема Лакса-Вендрофа](#явная-схема-лакса-вендрофа) |
11 | | - - [Схема Рихтмайера](#схема-рихтмайера) |
12 | | - - [Схема МакКормака](#схема-маккормака) |
13 | | - - [Противопотоковый метод первого порядка](#противопотоковый-метод-первого-порядка) |
14 | | - - [Противопотоковый метод второго порядка](#противопотоковый-метод-второго-порядка) |
| 9 | + - [FTCS ⏩](#FTCS-) |
| 10 | + - [Явная схема Лакса-Вендрофа ⏹](#явная-схема-лакса-вендрофа-) |
| 11 | + - [Схема Рихтмайера 🔄](#схема-рихтмайера-) |
| 12 | + - [Схема МакКормака ✅](#схема-маккормака-) |
| 13 | + - [Противопотоковый метод первого порядка 🡐](#противопотоковый-метод-первого-порядка-) |
| 14 | + - [Противопотоковый метод второго порядка 🡐🡐](#противопотоковый-метод-второго-порядка-) |
| 15 | + - [BTCS 🧱](#BTCS-) |
15 | 16 | - [Решение одномерного уравнения конвекции](#решение-одномерного-уравнения-конвекции) |
16 | 17 | - [Решение явным Эйлером](#решение-явным-эйлером) |
17 | 18 | 4. [Заключение и выводы 📝](#4-заключение-и-выводы-) |
@@ -54,3 +55,123 @@ CMakeLists.txt # Конфигурация сборки проекта |
54 | 55 | ## 3. Ход выполнения работы 🔎 |
55 | 56 |
|
56 | 57 | ### Используемые методы 📚 |
| 58 | + |
| 59 | +#### FTCS ⏩ |
| 60 | + |
| 61 | +Схема FTCS использует прямой шаг по времени и центральную разность по пространству для аппроксимации уравнения конвекции $u_t + a u_x = 0$. Для внутреннего узла $x_i$ на слое $t^j$ приближение записывается как |
| 62 | + |
| 63 | +$$ |
| 64 | +U_i^{j+1} = U_i^j - \frac{c}{2}\left(U_{i+1}^j - U_{i-1}^j\right),\quad c = \frac{a\Delta t}{\Delta x} |
| 65 | +$$ |
| 66 | + |
| 67 | +Схема обладает формально вторым порядком точности по пространству и первым по времени, однако для чистой конвекции она **безусловно неустойчива**: при любом ненулевом $c$ существуют волновые числа, для которых модуль коэффициента усиления больше единицы. В вычислительных экспериментах это проявляется как экспоненциальный рост ошибки и «взрыв» решения при достаточно больших временах или при увеличении $c$. |
| 68 | + |
| 69 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/FTCSSolver.h` |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +#### Явная схема Лакса-Вендрофа ⏹ |
| 74 | + |
| 75 | +Одношаговая схема Лакса–Вендрофа достигает второго порядка точности по времени и пространству за счёт учёта членов второго порядка ряда Тейлора по времени. Для уравнения конвекции дискретизация имеет вид |
| 76 | + |
| 77 | +$$ |
| 78 | +U_i^{j+1} = U_i^j - \frac{c}{2}\left(U_{i+1}^j - U_{i-1}^j\right) + \frac{c^2}{2}\left(U_{i+1}^j - 2U_i^j + U_{i-1}^j\right) |
| 79 | +$$ |
| 80 | + |
| 81 | +Схема условно устойчива при $|c|\le 1$ и даёт высокую точность на гладких решениях, хорошо сохраняет форму бегущей волны и практически не вносит численной диффузии. Характерным недостатком являются слабые дисперсионные «колечки» позади фронтов при наличии разрывов. |
| 82 | + |
| 83 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/LaxWendroffSolver.h` |
| 84 | + |
| 85 | +--- |
| 86 | + |
| 87 | +#### Схема Рихтмайера 🔄 |
| 88 | + |
| 89 | +Схема Рихтмайера реализует метод Лакса–Вендрофа в двух шагах: сначала применяется предиктор Лакса, затем корректор типа leapfrog. |
| 90 | + |
| 91 | +1. Предиктор: |
| 92 | + |
| 93 | +$$ |
| 94 | +U_i^{*} = \frac{1}{2}\left(U_{i+1}^j + U_{i-1}^j\right) - \frac{c}{2}\left(U_{i+1}^j - U_{i-1}^j\right) |
| 95 | +$$ |
| 96 | + |
| 97 | +2. Корректор: |
| 98 | + |
| 99 | +$$ |
| 100 | +U_i^{j+2} = U_i^j - c\left(U_{i+1}^* - U_{i-1}^{*}\right) |
| 101 | +$$ |
| 102 | + |
| 103 | +По порядку точности и формальным условиям устойчивости схема эквивалентна одношаговой Лакс–Вендрофа $(|c|\le 1)$, но из-за двухшаговой структуры сильнее подвержена накоплению дисперсионных ошибок и чувствительна к граничным условиям. В экспериментах наблюдалось значительное усиление осцилляций и рост ошибки при больших временах. |
| 104 | + |
| 105 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/RichtmyerSolver.h` |
| 106 | + |
| 107 | +--- |
| 108 | + |
| 109 | +#### Схема МакКормака ✅ |
| 110 | + |
| 111 | +Метод МакКормака — предиктор‑корректорная схема второго порядка точности, также относящаяся к семейству Лакс–Вендроф‑типов. Для $a>0$ используется прямой upwind‑предиктор и обратный корректирующий шаг: |
| 112 | + |
| 113 | +Предиктор: |
| 114 | + |
| 115 | +$$ |
| 116 | +U_i^{*} = U_i^j - c\left(U_{i+1}^j - U_i^j\right) |
| 117 | +$$ |
| 118 | + |
| 119 | +Корректор: |
| 120 | + |
| 121 | +$$ |
| 122 | +U_i^{j+1} = \frac{1}{2}\left(U_i^j + U_i^* - c\left(U_i^* - U_{i-1}^{*}\right)\right) |
| 123 | +$$ |
| 124 | + |
| 125 | +Схема условно устойчива при $|c|\le 1$ и показывает очень хорошее сохранение формы гладкой волны, с ошибками порядка $10^{-6}\)–\(10^{-5}$ на рассматриваемых интервалах времени. Численная диффузия мала, а дисперсионные осцилляции выражены слабее, чем у Рихтмайера. |
| 126 | + |
| 127 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/MacCormackSolver.h` |
| 128 | + |
| 129 | +--- |
| 130 | + |
| 131 | +#### Противопотоковый метод первого порядка 🡐 |
| 132 | + |
| 133 | +Противопотоковый метод первого порядка учитывает направление переноса и использует одностороннюю разность для аппроксимации производной. Для $a>0$ (перенос вправо) схема имеет вид |
| 134 | + |
| 135 | +$$ |
| 136 | +U_i^{j+1} = U_i^j - c\left(U_i^j - U_{i-1}^j\right) |
| 137 | +$$ |
| 138 | + |
| 139 | +а для $a<0$ — симметричную формулу с узлами $i$ и $i+1$. |
| 140 | + |
| 141 | +Схема устойчивa при $|c|\le 1$ и полностью подавляет неустойчивые осцилляции, однако обладает сильной численной диффузией: максимум волны заметно уменьшается, фронты становятся пологими, а ошибка растёт примерно линейно со временем. |
| 142 | + |
| 143 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/Upwind1Solver.h` |
| 144 | + |
| 145 | +--- |
| 146 | + |
| 147 | +#### Противопотоковый метод второго порядка 🡐🡐 |
| 148 | + |
| 149 | +Противопотоковый метод второго порядка корректирует схему первого порядка так, чтобы повысить точность по пространству до $O(h^2)$. Для $a>0$ дискретизация записывается как |
| 150 | + |
| 151 | +$$ |
| 152 | +U_i^{j+1} = U_i^j - c\left(U_i^j - U_{i-1}^j\right) - \frac{c(1-c)}{2}\left(U_i^j - 2U_{i-1}^j + U_{i-2}^j\right), \quad i\ge 2 |
| 153 | +$$ |
| 154 | + |
| 155 | +при $a<0$ используется зеркальная формула с узлами $i, i+1, i+2$. |
| 156 | + |
| 157 | +Схема условно устойчива при $|c|<2$ и даёт меньшую численную диффузию, чем 1‑й порядок, но из‑за дисперсионных эффектов может порождать заметные искажения на больших временах. В эксперименте при $c=0.1$ и $c=0.5$ метод оставался устойчивым, но максимальная ошибка достигала величин порядка единицы, что делает его менее точным по сравнению с симметричными схемами второго порядка. |
| 158 | + |
| 159 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/Upwind2Solver.h` |
| 160 | + |
| 161 | +--- |
| 162 | + |
| 163 | +#### BTCS 🧱 |
| 164 | + |
| 165 | +Схема BTCS относится к полностью неявным методам. Для уравнения конвекции она использует обратную разность по времени и центральную по пространству: |
| 166 | + |
| 167 | +$$ |
| 168 | +U_i^{j+1} = U_i^j - \frac{c}{2}\left(U_{i+1}^{j+1} - U_{i-1}^{j+1}\right) |
| 169 | +$$ |
| 170 | + |
| 171 | +что приводит на каждом шаге по времени к решению трёхдиагональной системы линейных алгебраических уравнений. |
| 172 | + |
| 173 | +BTCS обладает первым порядком точности по времени и пространству, но является **безусловно устойчивой** схемой: ограничений вида $|c|\le 1$ нет. За устойчивость приходится платить заметной численной диффузией: профиль волны сглаживается, максимум уменьшается, а ошибка растёт примерно линейно со временем, оставаясь, однако, умеренной (порядка $10^{-3}$–$10^{-2}$) на рассматриваемых промежутках. Однако, обладая неявной численной дисперсией, метод применительно к уравнению переноса дает слабые результаты для переходных процессов. |
| 174 | + |
| 175 | +**Программная реализация:** `include/Labs/Special/Lab3/ConvectionSolvers/BTCSSolver.h` (с использованием `ThomasSolver` для решения трёхдиагональной системы). |
| 176 | + |
| 177 | +--- |
0 commit comments