Metody numeryczne rozwiązywania równań różniczkowych cząstkowych
Marcin Orchel
Spis treści
1 Wstęp 1
2 Zadania 1
2.1 Zadania na 3.0 . . . 1
1 Wstęp 2 Zadania
2.1 Zadania na 3.0
• Rozwiązać metodą numeryczną wybrane równanie różniczkowe cząstkowe pierw- szego rzędu z wybranymi warunkami.
• Rozwiązać metodą numeryczną wybrane równanie różniczkowe cząstkowe drugiego rzędu z wybranymi warunkami.
• Rozwiązać metodą numeryczną wybrany układ równań różniczkowych cząstkowych pierwszego, drugiego rzędu z wybranymi warunkami.
• Rozwiązać równanie eliptyczne, paraboliczne i hiperboliczne
• Porównać z rozwiązaniem symbolicznym z wolframalpha.com.
• Rozwiązać równanie reakcji-dyfuzji określone na prostokącie Ω = (0, a) × (0, b) z niewiadomą u = u(x, y, t)
∂u
∂t = β∆u + f (u) (1)
u (x, y, t) = 0 (2)
u (x, y, 0) = u0(x, y) (3)
dla (x, y) ∈ Ω
• czy zwiększenie liczby węzłów siatki polepsza rozwiązanie 1
Funkcja u0 to wartość rozwiązania w chwili początkowej. Symbol ∆ to dwuwymiarowy operator dyfuzji, tzw. operator Laplace’a
∆u = ∂2u
∂x2 +∂2u
∂y2 (4)
Przykładowo f (u) = u − u3. Wskazówki
• Jak sprowadzić równanie różniczkowe cząstkowe do układu równań różniczkowych zwyczajnych? Mamy równomierną siatkę węzłów pij = (xi, yj) ∈ Ω. Przyjmiemy xi = ihx, yj = jhy, gdzie hx = a/(Nx+ 1) jest krokiem siatki w kierunku x i ana- logicznie hy = b/(Ny+ 1). Oznaczamy uij(t) = u(xi, yj, t). Zastępujemy pochodne przestrzenne ilorazami różnicowymi
∆uij ≈ ∆huij = 1
h2x (2ui,j− ui+1,j − ui−1,j) + 1
h2y (2ui,j− ui,j+1− ui,j−1) (5) przybliżamy układem równań różniczkowych zwyczajnych
d
dtU (t) = β∆h(U (t)) + f (U (t)) (6) Tablica U jest rozmiaru Nx× Ny o elementach będących funkcjami czasu U (t) = (uij(t)) dla 1 ≤ i ≤ Nx, 1 ≤ j ≤ Ny, a operator ∆hjest dyskretyzacją dwuwymiaro- wego laplasjanu. We węzłach brzegowych u jest równa zeru jak w warunkach, więc nie trzeba jej wyznaczać. Trzeba rozwiązać układ Nx· Ny równań różniczkowych zwyczajnych.
Wskazówki do R
• pakiet deSolve
• https://www.rdocumentation.org/packages/deSolve/versions/1.20/topics/
ode.1D
• https://cran.r-project.org/web/packages/deSolve/vignettes/deSolve.pdf Przykłady w R
• Aphid <- function(t, APHIDS, parameters) { deltax <- c (0.5, rep(1, numboxes - 1), 0.5) Flux <- -D * diff(c(0, APHIDS, 0)) / deltax dAPHIDS <- -diff(Flux) / delx + APHIDS * r
# the return value list(dAPHIDS ) }
2
D <- 0.3 # m2/day diffusion rate r <- 0.01 # /day net growth rate delx <- 1 # m thickness of boxes numboxes <- 60
# distance of boxes on plant, m, 1 m intervals
Distance <- seq(from = 0.5, by = delx, length.out = numboxes)
# Initial conditions: # ind/m2 APHIDS <- rep(0, times = numboxes) APHIDS[30:31] <- 1
state <- c(APHIDS = APHIDS) # initialise state variables times <-seq(0, 200, by = 1)
print(system.time(out <- ode.1D(state, times, Aphid, parms = 0, nspec = 1, names = "Aphid")))
• drugi przykład
Aphid <- function(t, APHIDS, parameters) { deltax <- c (0.5, rep(1, numboxes - 2), 0.5) dAPHIDS <- -diff(c(0, APHIDS)) / deltax
list(dAPHIDS) }
r <- 0.01 delx <- 1 numboxes <- 60
Distance <- seq(from = 0.5, by = delx, length.out = numboxes) APHIDS <- rep(0, times = numboxes)
APHIDS[30:31] <- 1
state <- c(APHIDS = APHIDS) times <-seq(0, 200, by = 1)
print(system.time(out <- ode.1D(state, times, Aphid, parms = 0, nspec = 1, names = "Aphid")))
image(out, method = "filled.contour", grid = Distance, xlab =
"time, days", ylab = "Distance on plant, m", main = "Aphid density on a row of plants")
• trzeci przykład
3
Aphid <- function(t, APHIDS, parameters) { deltax <- c (0.5, rep(1, numboxes-2), 0.5) dAPHIDS <- -diff(c(APHIDS, 0)) / deltax list(dAPHIDS)
}
delx <- 1 numboxes <- 50
Distance <- seq(from = 0.5, by = delx, length.out = numboxes) APHIDS <- rep(1, times = numboxes)
state <- c(APHIDS = APHIDS) state <- seq(1,50)
times <-seq(0, 10, by = 0.1)
print(system.time(out <- ode.1D(state, times, Aphid, parms = 0, nspec = 1, names = "Aphid")))
head(out[,1:2]) plot(times, out[,1])
4