Vector field decomposition

Example 1 from Moore et al. (2016)

Deterministic skeleton, gradient, and remainder fields

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.

Vector field decomposition using 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 =, 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!

bmarkslash7/QPot documentation built on Jan. 11, 2020, 11:11 a.m.