Skip to content

Commit 1b4030d

Browse files
authored
Update Lab3.md
1 parent e19eba7 commit 1b4030d

File tree

1 file changed

+127
-6
lines changed

1 file changed

+127
-6
lines changed

reports/Special/Lab3.md

Lines changed: 127 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
2. [Структура проекта 🛠️](#2-структура-проекта-)
77
3. [Ход выполнения работы 🔎](#3-ход-выполнения-работы-)
88
- [Используемые методы 📚](#используемые-методы-)
9-
- [FTCS](#FTCS)
10-
- [Явная схема Лакса-Вендрофа](#явная-схема-лакса-вендрофа)
11-
- [Схема Рихтмайера](#схема-рихтмайера)
12-
- [Схема МакКормака](#схема-маккормака)
13-
- [Противопотоковый метод первого порядка](#противопотоковый-метод-первого-порядка)
14-
- [Противопотоковый метод второго порядка](#противопотоковый-метод-второго-порядка)
9+
- [FTCS ⏩](#FTCS-)
10+
- [Явная схема Лакса-Вендрофа ⏹](#явная-схема-лакса-вендрофа-)
11+
- [Схема Рихтмайера 🔄](#схема-рихтмайера-)
12+
- [Схема МакКормака ✅](#схема-маккормака-)
13+
- [Противопотоковый метод первого порядка 🡐](#противопотоковый-метод-первого-порядка-)
14+
- [Противопотоковый метод второго порядка 🡐🡐](#противопотоковый-метод-второго-порядка-)
15+
- [BTCS 🧱](#BTCS-)
1516
- [Решение одномерного уравнения конвекции](#решение-одномерного-уравнения-конвекции)
1617
- [Решение явным Эйлером](#решение-явным-эйлером)
1718
4. [Заключение и выводы 📝](#4-заключение-и-выводы-)
@@ -54,3 +55,123 @@ CMakeLists.txt # Конфигурация сборки проекта
5455
## 3. Ход выполнения работы 🔎
5556

5657
### Используемые методы 📚
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

Comments
 (0)