# Vytvoríme prázdny graf
plot(0, 0, type = "n", xlim = c(0, 10), ylim = c(-1, 1), xlab = "", ylab = "", axes = FALSE)
# Hlavná čiara
segments(0, 0, 10, 0, lwd = 2)
# Šípka na osi
arrows(0, 0, 10, 0, length = 0.1)
# Značky na osi
tick_x <- c(0, 2, 4, 5, 6, 8, 10)
tick_labels <- c("0", "", "", expression(x[A]^e), expression(x[B]^e), "", "L")
segments(tick_x, 0.1, tick_x, -0.1)
text(tick_x, -0.3, tick_labels)
# Bloky Ω
text(1, 0.3, expression(Omega^1))
text(3, 0.3, expression(Omega^2))
text(5, 0.3, expression(Omega^e))
text(7, 0.3, expression(Omega^{e+1}))
text(9, 0.3, expression(Omega^N))
# Šípka pre h_e
arrows(5, 0.5, 6, 0.5, angle = 90, code = 3, length = 0.1)
text(5.5, 0.7, expression(h[e]))Project
1 Úvod
Metóda konečných prvkov je numerická metóda slúžiaca na simuláciu priebehov napätia, deformácii, vlastných frekvencií, prúdenie tepla, javov elektromagnetizmu, prúdenie tekutín a pod. na vytvorenom fyzikálnom modeli. Sme budeme riešiť diferenciálnu rovnicu 2. rádu v 1D v stacionárnom prípade. \[\begin{equation} - \frac{d}{dx} \left( a(x) \frac{du}{dx} \right) = f(x), \quad x \in (0, L),\tag{1} \label{strong_form} \end{equation}\]
kde neznámou je funkcia \(u(x)\). Vstupmi (dátami) úlohy sú materiálová charakteristika \(a(x)\), intenzita zdrojov (resp. vonkajších síl) \(f(x)\) a okrajové podmienky zadané na hranici výpočtovej oblasti \(\Omega = (0, L)\) (čiže v bodoch \(x = 0\) a \(x = L\) ).
Funkcii $u(x) $ sa niekedy hovorí primárna neznáma a funkcii
\[ q(x) = -a(x) \frac{du}{dx} \]
sa hovorí sekundárna neznáma alebo aj tok.
Budeme uvažovať okrajové podmienky
\[ u(0) = u_0, \quad \left( a(x) \frac{du}{dx} \right)\Big|_{x=L} = Q_L, \]
kde \(u_0\) a \(Q_L\) sú zadané čísla.
Okrajové podmienky majú vo všeobecnosti tvar
\[ \alpha_1 u(0) + \beta_1 \left( -a(x) \frac{du}{dx} \right)\Big|_{x=0} = g_1, \quad \alpha_2 u(L) + \beta_2 \left( a(x) \frac{du}{dx} \right)\Big|_{x=L} = g_2, \]
kde \(\alpha_1, \beta_1, g_1\) a \(\alpha_2, \beta_2, g_2\) sú zadané konštanty.
Prípad \(\beta_i = 0\) zodpovedá Dirichletovej okrajovej podmienke, kde zadávame hodnotu primárnej neznámej \(u(x)\) na hranici. Ak \(\alpha_i = 0\), hovoríme o Neumannovej okrajovej podmienke, pri ktorej je vlastne na hranici zadaná hodnota sekundárnej neznámej \(q(x)\). Ak je \(\alpha_i\) aj \(\beta_i\) nenulové, ide o Newtonovu okrajovú podmienku.
2 Diskretizácia výpočtovej oblasti
Výpočtovú oblasť \(\Omega = (0, L)\) diskretizujeme na \(N\) elementov \(\Omega^e, e = 1, \dots, N\). Každý element je interval \(\Omega^e = [x_A^e, x_B^e]\), pričom intervaly môžu mať rôznu veľkosť \(h^e = |\Omega^e| = x_B^e - x_A^e.\)
Približné (numerické) riešenie na elemente \(\Omega^e\) budeme označovať ako \(U^e(x), x \in \Omega^e\). Celkové približné riešenie \(U(x), x \in [0, L]\) získame poskladaním funkcií \(U^e(x)\) do jednej funkcie, čiže
\[ U(x) = \begin{cases} U^1(x), & x \in \Omega^1, \\ U^2(x), & x \in \Omega^2, \\ \vdots & \\ U^N(x), & x \in \Omega^N. \end{cases} \]
3 Sústava rovníc na elemente
3.1 Slabá formulácia
Vyberme jeden element \(\Omega^e = [x_A^e, x_B^e]\). Vynásobme diferenciálnu rovnicu \(\eqref{strong_form}\) váhovou funkciou \(w(x)\) a výsledok zintegrujme na elemente \(\Omega^e\). Dostaneme variačnú formuláciu:
\[\begin{equation}\int_{x_A^e}^{x_B^e} -\frac{d}{dx} \left( a \frac{du}{dx} \right) w \, dx = \int_{x_A^e}^{x_B^e} f w \, dx. \tag{2} \label{eq2} \end{equation}\]
Na ľavej strane prenesieme jednu deriváciu na váhovú funkciu, využijeme na to integráciu per partes:
\[\int_a^b g' h \, dx = [g h]_a^b - \int_a^b g h' \, dx, \]
pričom \(g' = -\frac{d}{dx} \left( a \frac{du}{dx} \right)\), \(h = w\), a teda \(g = -a \frac{du}{dx}\), \(h' = \frac{dw}{dx}\).
Dostaneme:
\(\left[ -a \frac{du}{dx} w \right]_{x_A^e}^{x_B^e} + \int_{x_A^e}^{x_B^e} a \frac{du}{dx} \frac{dw}{dx} \, dx = \int_{x_A^e}^{x_B^e} f w \, dx.\)
A po rozpísaní hraničného člena máme: \[\begin{equation} - \left( a \frac{du}{dx} \Big|_{x = x_B^e} \right) w(x_B^e) - \left( -a \frac{du}{dx} \Big|_{x = x_A^e} \right) w(x_A^e) + \int_{x_A^e}^{x_B^e} a \frac{du}{dx} \frac{dw}{dx} \, dx = \int_{x_A^e}^{x_B^e} f w \, dx. \tag{3} \label{eq3} \end{equation}\]
Zaveďme označenia: \[ Q_A^e := \left( -a \frac{du}{dx} \Big|_{x = x_A^e} \right) \quad \text{tok dovnútra elementu zľava}, \] \[\begin{equation} Q_B^e := \left( a \frac{du}{dx} \Big|_{x = x_B^e} \right) \quad \text{tok dovnútra elementu sprava}. \tag{4} \label{eq4} \end{equation}\]
# Vytvoríme prázdny graf
plot(0, 0, type = "n", xlim = c(0, 10), ylim = c(-1, 1), axes = FALSE, xlab = "", ylab = "")
# Hlavná horizontálna čiara
segments(1, 0, 9, 0, lwd = 2)
# Krajné čiary
segments(1, -0.3, 1, 0.3)
segments(9, -0.3, 9, 0.3)
# Popisky
text(1, -0.5, expression(x[A]^e))
text(9, -0.5, expression(x[B]^e))
text(5, 0.4, expression(Omega^e))
# Šípky pre Q_A^e a Q_B^e
arrows(1.5, 0.3, 4, 0.3, length = 0.1)
arrows(8.5, 0.3, 6, 0.3, length = 0.1)
# Popisky pre Q_A^e a Q_B^e
text(2.5, 0.5, expression(Q[A]^e))
text(7.5, 0.5, expression(Q[B]^e))Hraničné členy v rovnici \(\eqref{eq3}\) prehodíme na pravú stranu a dostávame slabú formuláciu diferenciálnej rovnice \(\eqref{strong_form}\) na elemente \(\Omega^e\):
\[\begin{equation} \int_{x_A^e}^{x_B^e} a \frac{du}{dx} \frac{dw}{dx} \, dx = \int_{x_A^e}^{x_B^e} f w \, dx + Q_A^e w(x_A^e) + Q_B^e w(x_B^e). \tag{5} \label{eq5} \end{equation}\] ## Aproximačné funkcie
Približné riešenie \(U^e(x)\) na elemente \(\Omega^e\) budeme hľadať v tvare lineárnej kombinácie aproximačných funkcií. V MKP musí približné riešenie na elemente vo všeobecnosti spĺňať nasledujúce požiadavky:
- Približné riešenie na elemente je polynóm.
- Polynóm musí byť úplný, čo znamená, že musí obsahovať všetky mocniny \(x\) od nultej po najvyššiu.
- Derivácie, ktoré sa vyskytujú v slabej formulácii, musia byť vo všeobecnosti pre polynóm nenulové (v prípade slabej formulácie \(\eqref{eq5}\) musí byť nenulová 1. derivácia).
- Musia byť splnené interpolačné podmienky pre primárne neznáme.
3.1.1 Lineárne elementy
Najjednoduchšie funkcie, ktoré spĺňajú podmienky 1 až 4 pre slabú formuláciu \(\eqref{eq5}\), sú lineárne polynómy. Približné riešenie na elemente \(\Omega^e\) teda stačí hľadať v tvare
\[\begin{equation} U^e(x) = c_1 + c_2 x, \label{eq6} \tag{6} \end{equation}\]
kde \(c_1, c_2\) sú zatiaľ neznáme čísla.
Tieto elementy majú dva uzlové body \(x_1^e = x_A^e\) a \(x_2^e = x_B^e\). Neznáme koeficienty \(c_1, c_2\) určíme tak, aby boli v uzlových bodoch splnené interpolačné podmienky:
\[\begin{equation} U^e(x_1^e) = u_1^e, \quad U^e(x_2^e) = u_2^e. \label{eq7} \tag{7} \end{equation}\]
Po dosadení do \(\eqref{eq6}\) dostaneme sústavu:
\[\begin{aligned} c_1 + c_2 x_1^e &= u_1^e, \\ c_1 + c_2 x_2^e &= u_2^e, \end{aligned}\]resp. maticovo:
\[\begin{bmatrix} 1 & x_1^e \\ 1 & x_2^e \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \end{bmatrix} = \begin{bmatrix} u_1^e \\ u_2^e \end{bmatrix}.\]
Použitím Cramerovho pravidla:
\[ c_1 = \frac{\begin{vmatrix} u_1^e & x_1^e \\ u_2^e & x_2^e \end{vmatrix}}{\begin{vmatrix} 1 & x_1^e \\ 1 & x_2^e \end{vmatrix}} = \frac{u_1^e x_2^e - u_2^e x_1^e}{x_2^e - x_1^e}, \quad c_2 = \frac{\begin{vmatrix} 1 & u_1^e \\ 1 & u_2^e \end{vmatrix}}{\begin{vmatrix} 1 & x_1^e \\ 1 & x_2^e \end{vmatrix}} = \frac{u_2^e - u_1^e}{x_2^e - x_1^e}. \]
Dostali sme približné riešenie na elemente v tvare lineárnej kombinácie
\[\begin{equation} U^e(x) = u_1^e \psi_1^e(x) + u_2^e \psi_2^e(x), \label{eq8} \tag{8} \end{equation}\]
Po dosadení späť:
\[\begin{equation} U^e(x) = u_1^e \frac{x_2^e - x}{x_2^e - x_1^e} + u_2^e \frac{x - x_1^e}{x_2^e - x_1^e}, \label{eq9} \tag{9} \end{equation}\]
kde funkcie
\[\begin{equation} \psi_1^e(x) = \frac{x_2^e - x}{x_2^e - x_1^e}, \quad \psi_2^e(x) = \frac{x - x_1^e}{x_2^e - x_1^e}, \label{eq10} \tag{10} \end{equation}\]
sú lineárne aproximačné funkcie.
3.1.2 Kvadratické elementy
Pri kvadratických elementoch uvažujeme riešenie:
\[\begin{equation} U^e(x) = c_1 + c_2 x + c_3 x^2, \label{eq11} \tag{11} \end{equation}\]
kde \(c_1, c_2, c_3\) sú neznáme, určené tromi uzlovými bodmi \(x_1^e = x_A^e, x_2^e, x_3^e = x_B^e\):
\[\begin{aligned} U^e(x_1^e) &= u_1^e, \\ U^e(x_2^e) &= u_2^e, \\ U^e(x_3^e) &= u_3^e, \end{aligned}\]resp. maticovo:
\[ \begin{bmatrix} 1 & x_1^e & (x_1^e)^2 \\ 1 & x_2^e & (x_2^e)^2 \\ 1 & x_3^e & (x_3^e)^2 \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \end{bmatrix} = \begin{bmatrix} u_1^e \\ u_2^e \\ u_3^e \end{bmatrix}. \]
Použitím Cramerovho pravidla:
\[ c_1 = \frac{ \begin{vmatrix} u_1^e & x_1^e & (x_1^e)^2 \\ u_2^e & x_2^e & (x_2^e)^2 \\ u_3^e & x_3^e & (x_3^e)^2 \end{vmatrix} }{ D^e }, \quad c_2 = \frac{ \begin{vmatrix} 1 & u_1^e & (x_1^e)^2 \\ 1 & u_2^e & (x_2^e)^2 \\ 1 & u_3^e & (x_3^e)^2 \end{vmatrix} }{ D^e }, \quad c_3 = \frac{ \begin{vmatrix} 1 & x_1^e & u_1^e \\ 1 & x_2^e & u_2^e \\ 1 & x_3^e & u_3^e \end{vmatrix} }{ D^e }, \]
kde \(D^e := \begin{vmatrix} 1 & x_1^e & (x_1^e)^2 \\ 1 & x_2^e & (x_2^e)^2 \\ 1 & x_3^e & (x_3^e)^2 \end{vmatrix}\).
Po dosadení a úprave:
\[\begin{equation} U^e(x) = u_1^e \psi_1^e(x) + u_2^e \psi_2^e(x) + u_3^e \psi_3^e(x), \label{eq12} \tag{12} \end{equation}\]
kde
\[\begin{equation} \psi_1^e(x) = \frac{(x - x_2^e)(x - x_3^e)}{(x_1^e - x_2^e)(x_1^e - x_3^e)}, \quad \psi_2^e(x) = \frac{(x - x_1^e)(x - x_3^e)}{(x_2^e - x_1^e)(x_2^e - x_3^e)}, \quad \psi_3^e(x) = \frac{(x - x_1^e)(x - x_2^e)}{(x_3^e - x_1^e)(x_3^e - x_2^e)}. \label{eq13} \tag{13} \end{equation}\]
3.1.3 Elementy ľubovoľného stupňa
Pre elementy stupňa \(s\):
\[\begin{equation} U^e(x) = c_1 + c_2 x + c_3 x^2 + \cdots + c_{s+1} x^s = \sum_{i=1}^{s+1} c_i x^{i-1}, \label{eq14} \tag{14} \end{equation}\]
alebo
\[\begin{equation} U^e(x) = \sum_{i=1}^{s+1} u_i^e \psi_i^e(x), \label{eq15} \tag{15} \end{equation}\]
kde
\[\begin{equation} \psi_i^e(x) = \frac{ (x - x_1^e) \cdots (x - x_{i-1}^e)(x - x_{i+1}^e) \cdots (x - x_{s+1}^e) }{ (x_i^e - x_1^e) \cdots (x_i^e - x_{i-1}^e)(x_i^e - x_{i+1}^e) \cdots (x_i^e - x_{s+1}^e) } \label{eq16} \tag{16} \end{equation}\] \[ = \prod_{j=1, j \neq i}^{s+1} \frac{x - x_j^e}{x_i^e - x_j^e}, \quad i = 1, \dots, s+1. \]
s <- 3
x_nodes <- seq(0, 1, length.out = s + 1)
# Funkcia na výpočet Lagrangeovho polynómu psi_i(x)
lagrange_psi <- function(i, x, x_nodes) {
num <- 1
den <- 1
for (j in seq_along(x_nodes)) {
if (j != i) {
num <- num * (x - x_nodes[j])
den <- den * (x_nodes[i] - x_nodes[j])
}
}
return(num / den)
}
# Vykreslenie psi_i(x) pre i = 1, ..., s + 1
library(ggplot2)
x_plot <- seq(-0.2, 1.2, length.out = 200)
psi_data <- data.frame(x = rep(x_plot, s + 1),
y = unlist(lapply(1:(s + 1), function(i) sapply(x_plot, lagrange_psi, i = i, x_nodes = x_nodes))),
group = factor(rep(1:(s + 1), each = length(x_plot))))
ggplot(psi_data, aes(x = x, y = y, color = group)) +
geom_line(size = 1) +
geom_vline(xintercept = x_nodes, linetype = "dashed") +
geom_hline(yintercept = 0, color = "black") +
labs(title = paste("Aproximačné funkcie pre s =", s),
x = "x", y = "ψ_i(x)", color = "ψ_i") +
theme_minimal()Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
3.2 Dosadenie približného riešenia a aproximačných funkcií do slabej formulácie
3.2.1 Lineárny element
Na získanie sústavy rovníc na elemente \(\Omega^e\) použijeme nasledujúci postup.
V slabej formulácii \(\eqref{eq5}\) za neznámu funkciu \(u(x)\) dosadíme približné riešenie \(U^e(x)\) na elemente v tvare \(\eqref{eq8}\)
a za váhovú funkciu \(w(x)\) postupne dosádzame aproximačné funkcie \(\psi_1^e(x)\) a \(\psi_2^e(x)\).
Prvá elementová rovnica:
Zoberme \(w = \psi_1^e\), po dosadení máme
\[\begin{equation} \int_{x_1^e}^{x_2^e} a \frac{d (u_1^e \psi_1^e + u_2^e \psi_2^e)}{dx} \frac{d \psi_1^e}{dx} dx = \int_{x_1^e}^{x_2^e} f \psi_1^e dx + Q_1^e \psi_1^e(x_1^e) + Q_2^e \psi_1^e(x_2^e). \tag{17} \label{eq17} \end{equation}\]
Na ľavej strane rozdeľujeme:
\[ \int_{x_1^e}^{x_2^e} a \left( u_1^e \frac{d \psi_1^e}{dx} + u_2^e \frac{d \psi_2^e}{dx} \right) \frac{d \psi_1^e}{dx} dx = \int_{x_1^e}^{x_2^e} f \psi_1^e dx + Q_1^e, \]
a nakoniec rozložíme:
\[ u_1^e \underbrace{ \int_{x_1^e}^{x_2^e} a \frac{d \psi_1^e}{dx} \frac{d \psi_1^e}{dx} dx }_{K_{11}^e} + u_2^e \underbrace{ \int_{x_1^e}^{x_2^e} a \frac{d \psi_2^e}{dx} \frac{d \psi_1^e}{dx} dx }_{K_{12}^e} = \underbrace{ \int_{x_1^e}^{x_2^e} f \psi_1^e dx }_{f_1^e} + Q_1^e. \]
Druhá elementová rovnica:
Pre \(w = \psi_2^e\) dostaneme
\[ u_1^e \underbrace{ \int_{x_1^e}^{x_2^e} a \frac{d \psi_1^e}{dx} \frac{d \psi_2^e}{dx} dx }_{K_{21}^e} + u_2^e \underbrace{ \int_{x_1^e}^{x_2^e} a \frac{d \psi_2^e}{dx} \frac{d \psi_2^e}{dx} dx }_{K_{22}^e} = \underbrace{ \int_{x_1^e}^{x_2^e} f \psi_2^e dx }_{f_2^e} + Q_2^e. \]
3.2.2 Sústava rovníc na elemente
Na elemente \(\Omega^e = [x_1^e, x_2^e]\) sme získali sústavu
\[\begin{align} K_{11}^e u_1^e + K_{12}^e u_2^e &= f_1^e + Q_1^e, \\ K_{21}^e u_1^e + K_{22}^e u_2^e &= f_2^e + Q_2^e. \tag{18} \label{eq18} \end{align}\]
Používame označenia:
\[\begin{equation} K_{ij}^e = \int_{x_1^e}^{x_2^e} a \frac{d \psi_j^e}{dx} \frac{d \psi_i^e}{dx} dx, \quad f_i^e = \int_{x_1^e}^{x_2^e} f \psi_i^e dx. \tag{19} \label{eq19} \end{equation}\]
V maticovom tvare:
\[\begin{equation} \underbrace{ \begin{bmatrix} K_{11}^e & K_{12}^e \\ K_{21}^e & K_{22}^e \end{bmatrix} }_{K^e} \underbrace{ \begin{bmatrix} u_1^e \\ u_2^e \end{bmatrix} }_{u^e} = \underbrace{ \begin{bmatrix} f_1^e \\ f_2^e \end{bmatrix} }_{f^e} + \underbrace{ \begin{bmatrix} Q_1^e \\ Q_2^e \end{bmatrix} }_{Q^e}. \tag{20} \label{eq20} \end{equation}\]
3.2.3 Kvadratický element
Pre kvadratický element (tri uzly) získame:
\[ \int_{x_1^e}^{x_3^e} a \frac{du}{dx} \frac{dw}{dx} dx = \int_{x_1^e}^{x_3^e} f w dx + Q_1^e w(x_1^e) + Q_3^e w(x_3^e). \]
Po dosadení:
\[ u_1^e K_{11}^e + u_2^e K_{12}^e + u_3^e K_{13}^e = f_1^e + Q_1^e, \] \[ u_1^e K_{21}^e + u_2^e K_{22}^e + u_3^e K_{23}^e = f_2^e + Q_3^e, \] \[ u_1^e K_{31}^e + u_2^e K_{32}^e + u_3^e K_{33}^e = f_3^e + Q_3^e, \]
pričom
\[\begin{equation} K_{ij}^e := \int_{x_1^e}^{x_3^e} a \frac{d \psi_j^e}{dx} \frac{d \psi_i^e}{dx} dx, \quad f_i^e := \int_{x_1^e}^{x_3^e} f \psi_i^e dx. \tag{21} \label{eq21} \end{equation}\]
V maticovom tvare:
\[\begin{equation} \underbrace{ \begin{bmatrix} K_{11}^e & K_{12}^e & K_{13}^e \\ K_{21}^e & K_{22}^e & K_{23}^e \\ K_{31}^e & K_{32}^e & K_{33}^e \end{bmatrix} }_{K^e} \underbrace{ \begin{bmatrix} u_1^e \\ u_2^e \\ u_3^e \end{bmatrix} }_{u^e} = \underbrace{ \begin{bmatrix} f_1^e \\ f_2^e \\ f_3^e \end{bmatrix} }_{f^e} + \underbrace{ \begin{bmatrix} Q_1^e \\ 0 \\ Q_3^e \end{bmatrix} }_{Q^e}. \tag{22} \label{eq22} \end{equation}\]
4 Globálna sústava rovníc
4.1 Lineárne elementy
Na spojenie elementových sústav rovníc \(\eqref{eq20}\) (pre \(e = 1, \dots, N\)) do globálnej sústavy rovníc využijeme dva princípy:
Spojitosť približného riešenia \(U(x)\), čiže primárnej neznámej, na styku elementov: \[ u_2^{e-1} = u_1^e \]
Bilancia tokov (resp. rovnováha síl), čiže sekundárnych neznámych, na styku elementov: \[\begin{equation} Q_2^{e-1} + Q_1^e = 0 \quad (\text{resp. } Q_2^{e-1} = -Q_1^e) \tag{23} \label{eq23} \end{equation}\]
V globálnom číslovaní: \[\begin{equation} U_1 = u_1^1, \quad U_2 = u_1^2, \dots, U_e = u_2^{e-1} = u_1^e, \dots, U_N = u_1^N, \quad U_{N+1} = u_2^N. \tag{24} \label{eq24} \end{equation}\]
Sústava rovníc pre elementy: \[ \Omega^{e-1}: \begin{aligned} K_{11}^{e-1} u_1^{e-1} + K_{12}^{e-1} u_2^{e-1} &= f_1^{e-1} + Q_1^{e-1}, \\ K_{21}^{e-1} u_1^{e-1} + K_{22}^{e-1} u_2^{e-1} &= f_2^{e-1} + Q_2^{e-1}, \end{aligned} \]
\[ \Omega^e: \begin{aligned} K_{11}^e u_1^e + K_{12}^e u_2^e &= f_1^e + Q_1^e, \\ K_{21}^e u_1^e + K_{22}^e u_2^e &= f_2^e + Q_2^e. \end{aligned} \]
Sčítaním: \[ K_{21}^{e-1} U_{e-1} + (K_{22}^{e-1} + K_{11}^e) U_e + K_{12}^e U_{e+1} = f_2^{e-1} + f_1^e. \]
Globálny systém rovníc: \[ \underbrace{ \begin{bmatrix} K_{11}^1 & K_{12}^1 & 0 & \cdots & 0 \\ K_{21}^1 & K_{22}^1 + K_{11}^2 & K_{12}^2 & \cdots & 0 \\ 0 & K_{21}^2 & K_{22}^2 + K_{11}^3 & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & \cdots & 0 & K_{21}^N & K_{22}^N \end{bmatrix} }_{K} \underbrace{ \begin{bmatrix} U_1 \\ U_2 \\ U_3 \\ \vdots \\ U_{N+1} \end{bmatrix} }_{U} = \underbrace{ \begin{bmatrix} f_1^1 + Q_1^1 \\ f_2^1 + f_1^2 \\ f_2^2 + f_1^3 \\ \vdots \\ f_2^N + Q_2^N \end{bmatrix} }_{F}. \tag{25} \]
4.2 Kvadratické elementy
Pre kvadratické elementy spojíme systémy rovníc \(\eqref{eq22}\) pre \(e = 1, \dots, N\).
Spojitosť: \[ u_3^{e-1} = u_1^e \]
Bilancia tokov: \[ Q_3^{e-1} + Q_1^e = 0 \]
Globálne číslovanie (pre \(2N + 1\) uzlov): \[ U_1 = u_1^1, \quad U_2 = u_2^1, \quad U_3 = u_3^1 = u_1^2, \dots, U_{2N} = u_2^N, \quad U_{2N+1} = u_3^N. \]
Globálny systém rovníc: \[\begin{equation} \underbrace{ \begin{bmatrix} K_{11}^1 & K_{12}^1 & K_{13}^1 & 0 & 0 & \cdots \\ K_{21}^1 & K_{22}^1 + K_{11}^2 & K_{23}^1 & K_{12}^2 & 0 & \cdots \\ 0 & K_{21}^2 & K_{22}^2 + K_{11}^3 & K_{23}^2 & 0 & \cdots \\ \vdots & \vdots & \vdots & \ddots & \ddots & \vdots \\ 0 & \cdots & 0 & K_{31}^3 & K_{32}^3 & K_{33}^3 \end{bmatrix} }_{K} \underbrace{ \begin{bmatrix} U_1 \\ U_2 \\ U_3 \\ \vdots \\ U_{2N+1} \end{bmatrix} }_{U} = \underbrace{ \begin{bmatrix} f_1^1 + Q_1^1 \\ f_2^1 + f_1^2 \\ f_3^1 + f_2^2 \\ \vdots \\ f_2^N + Q_3^N \end{bmatrix} }_{F}. \tag{26} \label{eq26} \end{equation}\]
5 Využitie okrajových podmienok pre lineárne elementy
Vo všeobecnosti máme pre úlohu \(\eqref{strong_form}\) zadané okrajové podmienky.
Najprv okrajové podmienky prepíšeme do reči našich neznámych: - v ľavej: \[
U_1 = u(0), \quad Q_1^1 = \left( -a(x) \frac{du}{dx} \right) \bigg|_{x=0}
\] - v pravej: \[
U_{N+1} = u(L), \quad Q_2^N = \left( a(x) \frac{du}{dx} \right) \bigg|_{x=L}
\]
Okrajové podmienky: \[ \alpha_1 U_1 + \beta_1 Q_1^1 = g_1, \quad \alpha_2 U_{N+1} + \beta_2 Q_2^N = g_2. \tag{27} \]
5.1 Dirichletova podmienka
Ak \(\beta_1 = 0\) (resp. \(\beta_2 = 0\)), priamo zapíšeme: \[ \begin{bmatrix} \alpha_1 & 0 & \cdots & 0 \\ \vdots & \vdots & & \vdots \end{bmatrix} \begin{bmatrix} U_1 \\ \vdots \end{bmatrix} = \begin{bmatrix} g_1 \\ \vdots \end{bmatrix}, \quad \text{resp.} \quad \begin{bmatrix} \vdots & \vdots & \vdots & \alpha_2 \end{bmatrix} \begin{bmatrix} \vdots \\ U_{N+1} \end{bmatrix} = \begin{bmatrix} \vdots \\ g_2 \end{bmatrix}. \]
5.2 Neumannova / Newtonova podmienka
Ak \(\beta_1 \neq 0\) (resp. \(\beta_2 \neq 0\)): \[ Q_1^1 = \frac{g_1 - \alpha_1 U_1}{\beta_1}, \quad Q_2^N = \frac{g_2 - \alpha_2 U_{N+1}}{\beta_2}. \tag{28} \]
Dosadíme do \(\eqref{eq26}\), a matica sústavy má tvar: \[ \begin{bmatrix} K_{11}^1 + \frac{\alpha_1}{\beta_1} & K_{12}^1 & 0 & \cdots \\ \vdots & \vdots & \vdots & \\ \cdots & 0 & K_{21}^N & K_{22}^N + \frac{\alpha_2}{\beta_2} \end{bmatrix} \begin{bmatrix} U_1 \\ \vdots \\ U_{N+1} \end{bmatrix} = \begin{bmatrix} f_1^1 + \frac{g_1}{\beta_1} \\ \vdots \\ f_2^N + \frac{g_2}{\beta_2} \end{bmatrix}. \]
6 Riešenie globálneho systému rovníc a konštrukcia približného riešenia
Na riešenie globálneho systému môžeme použiť: - Priame metódy (napr. Gaussova eliminácia, Thomasov algoritmus), - Iteračné metódy (napr. Gauss-Seidel, SOR, BiCGStab).
Pre lineárne elementy: - Po vyriešení globálneho systému \(\eqref{eq26}\) získame \(U_1, \dots, U_{N+1}\). - Potom na elementoch \(\Omega^e\) s lokálnymi hodnotami \(u_1^e, u_2^e\) priradíme globálne neznáme.
Celkové približné riešenie: \[ U(x) = \begin{cases} U_1 \\ U^1(x) = u_1^1 \psi_1^1(x) + u_2^1 \psi_2^1(x), & x \in \Omega^1 \\ U^2(x) = u_1^2 \psi_1^2(x) + u_2^2 \psi_2^2(x), & x \in \Omega^2 \\ \vdots \\ U^N(x) = u_1^N \psi_1^N(x) + u_2^N \psi_2^N(x), & x \in \Omega^N \\ U_{N+1} \end{cases}. \tag{29} \]
library(Matrix)
library(plotly)
Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':
last_plot
The following object is masked from 'package:stats':
filter
The following object is masked from 'package:graphics':
layout
# Parametre úlohy
xa <- 0 # začiatok intervalu
xb <- 1 # koniec intervalu
n <- 4 # počet elementov
d <- 1.0 # parameter metódy (implicitný, explicitný, Crank-Nicholson)
h <- (xb - xa) / n
k <- 1.0 # parameter na výpočet časového kroku
T <- 3.0 # celkový čas simulácie
deltat <- k * h^2 # časový krok
Nt <- ceiling(T / deltat) # počet časových krokov
xVals <- seq(xa, xb, length.out = n + 1) # uzly
# Funkcia na skladanie globálnych matíc
vytvor_matrice <- function(n, xVals, a, f) {
K <- Matrix(0, nrow = n + 1, ncol = n + 1)
M <- Matrix(0, nrow = n + 1, ncol = n + 1)
F <- numeric(n + 1)
for (e in 1:n) {
he <- xVals[e + 1] - xVals[e]
Ke <- matrix(c(a(xVals[e]) / he, -a(xVals[e]) / he,
-a(xVals[e]) / he, a(xVals[e]) / he), 2, 2)
Me <- matrix(c(2, 1, 1, 2), 2, 2) * he / 6
fe <- f((xVals[e] + xVals[e + 1]) / 2) * he / 2 * c(1, 1)
idx <- c(e, e + 1)
K[idx, idx] <- K[idx, idx] + Ke
M[idx, idx] <- M[idx, idx] + Me
F[idx] <- F[idx] + fe
}
return(list(K = K, M = M, F = F))
}
# Definícia funkcií
a <- function(x) 1 + x # materiálový koeficient
f <- function(x) -18 * x^2 # zdrojový člen
u0 <- function(x) 1 + 2 * x - x^2 # počiatočné podmienky
# Okrajové podmienky
d1 <- 1.0; B1 <- 0.0; g1 <- 1.0 # ľavý okraj: Dirichletova (ak B1 == 0)
d2 <- 0.0; B2 <- 1.0; g2 <- 0.0 # pravý okraj: Neumannova (ak d2 == 0)
# Inicializácia počiatočného vektora
U <- u0(xVals)
# Získanie globálnych matíc
matrice <- vytvor_matrice(n, xVals, a, f)
K <- matrice$K
M <- matrice$M
F <- matrice$F
# Matrica H pre časový krok
H <- M + d * deltat * K
if (B1 == 0) {
H[1, ] <- 0; H[1, 1] <- d1
}
if (B2 == 0) {
H[n + 1, ] <- 0; H[n + 1, n + 1] <- d2
}
# Ukladanie riešení
solutions <- matrix(0, nrow = Nt, ncol = n + 1)
solutions[1, ] <- U
# Časová slučka
for (t in 2:Nt) {
G <- (M - (1 - d) * deltat * K) %*% U + deltat * F
if (B1 == 0) G[1] <- g1
if (B2 == 0) G[n + 1] <- g2
U <- as.vector(solve(H, G))
solutions[t, ] <- U
}
# Príprava údajov na animáciu
time_steps <- rep(1:Nt, each = n + 1)
x_plot <- rep(xVals, Nt)
u_plot <- as.vector(t(solutions))
plot_data <- data.frame(
time = time_steps,
x = x_plot,
u = u_plot
)
# Vytvorenie grafu
fig <- plot_ly() %>%
add_lines(x = xVals, y = solutions[1, ], name = "Počiatočný stav",
line = list(color = 'red', width = 3)) %>%
add_lines(x = xVals, y = solutions[Nt, ], name = "Konečný stav",
line = list(color = 'blue', width = 3)) %>%
add_trace(data = plot_data, x = ~x, y = ~u, frame = ~time,
type = 'scatter', mode = 'lines', name = "Časové kroky",
line = list(color = 'gray', width = 1), showlegend = FALSE) %>%
layout(title = "Časový vývoj riešenia",
xaxis = list(title = "x"),
yaxis = list(title = "u(x, t)"))
fig7 Záver
V tejto práci sme podrobne prešli formuláciou a riešením jednorozmernej okrajovej úlohy pre diferenciálnu rovnicu druhého rádu pomocou metódy konečných prvkov (MKP).Numerické riešenie ukázalo očakávané správanie: pre lineárne aj kvadratické elementy sa približné riešenie rýchlo približuje k presnému riešeniu. Animácia časového priebehu pomohla vizualizovať dynamiku problému a overiť stabilitu metódy.
Práca poskytuje pevný základ na rozšírenie riešenia na viacrozmerné problémy alebo úlohy vyššieho rádu, prípadne na využitie pokročilejších aproximačných funkcií a nelineárnych metód. (1, 2)