Bij een autonoom dynamisch systeem van eerste orde, dat wil zeggen een differentiaalvergelijking van de vorm \[\frac{\dd y}{\dd t}=\varphi(y)\] voor zekere functie \(\varphi\), kan in R een lijnelementenveld (ook wel hellingsveld) getekend worden met behulp van het phaseR
pakket. We gebruiken dit pakket omdat dit nog meer faciliteiten biedt (o.a. voor analyses in het fasevlak en voor stelsels van twee autonome differentiaalvergelijkingen). We geven twee voorbeelden: een lijnelementenveld zonder en één met enkele oplossingskrommen.
Het R commando voor het tekenen van een lijnelementenvlak heet flowField
omdat dit ook gebruikt wordt om een vectorveld voor stelsels van twee differentiaalvergelijkingen te tekenen. We illustreren het gebruik van het R commando aan de hand van de logistische differentiaalvergelijking \[\frac{\dd y}{\dd t}=y\cdot (1-y/2)\] Onderstaand R script
library(phaseR)
model <- function(tijd, begintoestand, parameters){
with(as.list(c(begintoestand, parameters)), {
dydt <- r * y * (1 - y / K)
return(list(dydt))
})
}
params <- c(r = 1, K = 2)
flowField(model, xlim = c(0, 4), ylim = c(-1, 3),
parameters = params, system = "one.dim",
state.names = c("y"), add = FALSE,
xlab = "t", ylab = "y",
main = "hellingsveld bij dy/dt = y*(1-y/2)")
levert het volgende diagram op:
Met de optie add = FALSE
geef je aan dat je een nieuw diagram wilt tekenen en niet het hellingsveld aan een bestaande figuur wilt toevoegen (via add = TRUE
). De optie system = "one.dim"
geeft aan dat we hier te maken hebben met een autonome, eerste-orde differentiaalvergelijking en niet met een stelsel van twee differentiaalvergelijkingen (gebruik hiervoor system = "two.dim"
). We specificeren de afhankelijke variable via state.names = c("y")
omdat we deze naam van de variabele niet in de model functie hebben gebruikt (maar in plaats daarvan begintoestand
als argument hebben gebruikt)
In plaats van lijnstukjes krijg je in het flowField
commando pijlen in het diagram getekend. Onderstaand code fragment illustreert hoe je door aanpassing van de grootte van de pijlpunt wel lijnstukjes kunt simuleren en via opties zelf de kleur en fijnmazigheid van het rooster kunt specificeren.
We verwijzen naar de phaseR handleiding voor meer details over de verschillende opties in het flowField
commando.
flowField(model, xlim = c(0, 4), ylim = c(-1, 3),
parameters = params, system = "one.dim",
state.names = c("y"), points = 13,
arrow.head = 0.001, col = "red",
add = FALSE, xlab = "t", ylab = "y",
main = "hellingsveld bij dy/dt = y*(1-y/2)")
In een lijnelementenveld kunnen we oplossingskrommen tekenen via de trajectory
instructie. Onderstaand R script
flowField(model, xlim = c(0, 4), ylim = c(-1, 3),
parameters = params, system = "one.dim",
state.names = c("y"), points = 13,
arrow.head = 0.001, col = "red",
add = FALSE, xlab = "t", ylab = "y",
main = "hellingsveld bij dy/dt = y*(1-y/2)")
trajectory(model, parameters = params, system = "one.dim",
state.names = c("y"), y0 = c(0.25), tlim = c(0, 4),
col = "blue", lwd = 2)
trajectory(model, parameters = params, system = "one.dim",
state.names = c("y"), y0 = c(3), tlim = c(0, 4),
col = "green", lwd = 2)
trajectory(model, parameters = params, system = "one.dim",
state.names = c("y"), y0 = c(-0.05), tlim = c(0, 4),
col = "black", lwd = 2)
levert het volgende diagram op, dat ook wel bekend staat als een faseportret van en differentiaalvergelijking:
We verwijzen naar de phaseR handleiding voor meer details over de verschillende opties in de flowField
en trajectory
commando's.