\usepackage{amsmath}

Project

Author

Ivan Bilyk

Published

May 3, 2025

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.\)

# 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]))

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:

  1. Približné riešenie na elemente je polynóm.
  2. Polynóm musí byť úplný, čo znamená, že musí obsahovať všetky mocniny \(x\) od nultej po najvyššiu.
  3. 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).
  4. 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:

  1. Spojitosť približného riešenia \(U(x)\), čiže primárnej neznámej, na styku elementov: \[ u_2^{e-1} = u_1^e \]

  2. 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)"))

fig

7 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)

8 Literatúra

1.
TOMEK, L. and K. MIKULA. Numerické modelovanie pomocou metódy konečných prvkov [online]. B.m.: Slovenská technická univerzita v Bratislave, 2024. Available at: https://www.svf.stuba.sk/buxus/docs/dokumenty/skripta/2024/Numericke_modelovanie_pomocou_metody_konecnych_prvkov.pdf
2.
WIKIPÉDIA. Metóda konečných prvkov. B.m.: https://sk.wikipedia.org/wiki/Met%C3%B3da_kone%C4%8Dn%C3%BDch_prvkov. 2024