Derivate a discrete variable using finite differences
Derivate(
formula,
order = 1,
cyclical = FALSE,
fill = FALSE,
data = NULL,
sphere = FALSE,
a = 6371000,
equispaced = TRUE
)
Laplacian(
formula,
cyclical = FALSE,
fill = FALSE,
data = NULL,
sphere = FALSE,
a = 6371000,
equispaced = TRUE
)
Divergence(
formula,
cyclical = FALSE,
fill = FALSE,
data = NULL,
sphere = FALSE,
a = 6371000,
equispaced = TRUE
)
Vorticity(
formula,
cyclical = FALSE,
fill = FALSE,
data = NULL,
sphere = FALSE,
a = 6371000,
equispaced = TRUE
)
a formula indicating dependent and independent variables
order of the derivative
logical vector of boundary condition for each independent variable
logical indicating whether to fill values at the boundaries with forward and backwards differencing
optional data.frame containing the variables
logical indicating whether to use spherical coordinates (see details)
radius to use in spherical coordinates (defaults to Earth's radius)
logical indicating whether points are equispaced or not.
If there is one independent variable and one dependent variable, a numeric vector of the same length as the dependent variable. If there are two or more independent variables or two or more dependent variables, a list containing the directional derivatives of each dependent variables.
Each element of the return vector is an estimation of \(\frac{\partial^n x}{\partial y^{n}}\) by centred finite differences.
If sphere = TRUE
, then the first two independent variables are
assumed to be longitude and latitude (in that order) in degrees. Then, a
correction is applied to the derivative so that they are in the same units as
a
.
Using fill = TRUE
will degrade the solution near the edges of a non-cyclical
boundary. Use with caution.
Laplacian()
, Divergence()
and Vorticity()
are convenient wrappers that
call Derivate()
and make the appropriate sums. For Divergence()
and
Vorticity()
, formula
must be of the form vx + vy ~ x + y
(in that order).
Other meteorology functions:
EOF()
,
GeostrophicWind()
,
WaveFlux()
,
thermodynamics
,
waves
data.table::setDTthreads(2)
theta <- seq(0, 360, length.out = 20)*pi/180
theta <- theta[-1]
x <- cos(theta)
dx_analytical <- -sin(theta)
dx_finitediff <- Derivate(x ~ theta, cyclical = TRUE)[[1]]
plot(theta, dx_analytical, type = "l")
points(theta, dx_finitediff, col = "red")
# Curvature (Laplacian)
# Note the different boundary conditions for each dimension
variable <- expand.grid(lon = seq(0, 360, by = 3)[-1],
lat = seq(-90, 90, by = 3))
variable$z <- with(variable, cos(lat*pi/180*3) + sin(lon*pi/180*2))
variable <- cbind(
variable,
as.data.frame(Derivate(z ~ lon + lat, data = variable,
cyclical = c(TRUE, FALSE), order = 2)))
library(ggplot2)
ggplot(variable, aes(lon, lat)) +
geom_contour(aes(z = z)) +
geom_contour(aes(z = z.ddlon + z.ddlat), color = "red")
#> Warning: Removed 480 rows containing non-finite outside the scale range
#> (`stat_contour()`).
# The same as
ggplot(variable, aes(lon, lat)) +
geom_contour(aes(z = z)) +
geom_contour(aes(z = Laplacian(z ~ lon + lat, cyclical = c(TRUE, FALSE))),
color = "red")
#> Warning: Removed 480 rows containing non-finite outside the scale range
#> (`stat_contour()`).