Recall that the deterministic skeleton from vignette [1. link here] can be visualized as a vector field. In gradient systems, this vector field is completely determined by the potential function. The name ``gradient system'' refers to the fact that the vector field is the negative of the potential function’s gradient. In non-gradient systems, the vector field can no longer be represented solely in terms of the gradient. Instead, there is a remainder component of the vector field. The vector field can be decomposed into two terms: $$ \text{vector field} = \text{gradient (or negative of the potential)} + \text{remainder field} \text{, or}$$ $$ \begin{bmatrix}f_{1}(x,y)\ f_{2}(x,y) \end{bmatrix}=-\nabla \Phi(x,y)+\mathbf{r}(x,y)= -\begin{bmatrix}\frac{\partial \Phi}{\partial x}(x,y)\ \frac{\partial \Phi}{\partial y}(x,y) \end{bmatrix} + \begin{bmatrix}r_{1}(x,y)\ r_{2}(x,y) \end{bmatrix} $$ The remainder vector field is orthogonal to the gradient of the quasi-potential everywhere. That is, for every $(x, y)$ in the domain, $$\nabla \Phi (x, y) · \mathbf{r}(x, y) = 0.$$ An more detailed explanation of this property can be found in Moore et al. (2016) and Nolting and Abbott (2016).
The remainder vector field can be interpreted as a force that causes trajectories to circulate around level sets of the quasi-potential.
QPot
QPot
enables users to perform this decomposition. The function VecDecomAll
calculates the vector field decomposition, and outputs three vector fields: the original deterministic skeleton, $\mathbf{f}(x, y)$; the gradient vector field, $-\nabla \Phi (x, y)$; and the remainder vector field, $\mathbf{r}(x, y)$. Each of these three vector fields can be output alone using VecDecomVec
, VecDecomGrad
, or VecDecomRem
. These vector fields can be visualized using the function VecDecomPlot
. Code to create the vector fields from VecDecomAll
is displayed below; code for generating individual vector fields can be found in the man pages accessible by help
for VecDecomVec
, VecDecomGrad
, or VecDecomRem
.
## Calculate all three vector fields. VDAll <- VecDecomAll(surface = ex1.global, x.rhs = parms.eqn.x, y.rhs = parms.eqn.y, x.bound = bounds.x, y.bound = bounds.y) ## Plot the deterministic skeleton vector field VecDecomPlot(x.field = VDAll[, , 1], y.field = VDAll[, , 2], dens = c(25, 25), x.bound = bounds.x, y.bound = bounds.y, xlim = c(0, 11), ylim = c(0, 6), arrow.type = "proportional", tail.length = 0.35, head.length = 0.025) ## Plot the gradient vector field VecDecomPlot(x.field = VDAll[, , 3], y.field = VDAll[, , 4], dens = c(25, 25), x.bound = bounds.x, y.bound = bounds.y, arrow.type = "proportional", tail.length = 0.35, head.length = 0.025) ## Plot the remainder vector field VecDecomPlot(x.field = VDAll[, , 5], y.field = VDAll[, , 6], dens = c(25, 25), x.bound = bounds.x, y.bound = bounds.y, arrow.type = "proportional", tail.length = 0.35, head.length = 0.025)
And that's it---you've successfully decomposed the vector field!
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.