tests/testthat/test-calculus.R

set.seed(12)
g <- 201
from <- -3.5
to <- 3.5
domain <- c(from, to)
grid <- seq(from, to, length.out = g)
dgrid <- seq(from + 0.5, to - 0.5, length.out = 50)

eval_irreg <- function(expression, g, domain) {
  args <- unique(round(sort(runif(g, domain[1], domain[2])), 3))
  f <- eval(expression, list(x = args))
  tfd(f, arg = args)
}

cubic <- tfd(grid^3, grid)
square <- 3 * tfd(grid^2, grid)
lin <- 6 * tfd(grid, grid)
cubic_irreg <- eval_irreg(expression(x^3), g, domain)
cubic_b <- tfb(cubic, k = 45, bs = "tp", verbose = FALSE)
square_irreg <- eval_irreg(expression(3 * x^2), g, domain)
square_b <- tfb(square, k = 45, bs = "tp", verbose = FALSE)

test_that("basic derivatives work", {
  dgrid <- seq(from + 0.5, to - 0.5, length.out = 50)

  expect_equal(tf_derive(cubic)[, dgrid], square[, dgrid], tolerance = 0.1)
  expect_equal(tf_derive(cubic_irreg)[, dgrid], square[, dgrid],
    tolerance = 0.1
  )
  expect_equal(tf_derive(cubic_b)[, dgrid], square[, dgrid],
    tolerance = 0.1, ignore_attr = TRUE
  )
  expect_equal(tf_derive(cubic, order = 2)[, dgrid], lin[, dgrid],
    tolerance = 0.1
  )
  expect_equal(tf_derive(cubic_irreg, order = 2)[, dgrid], lin[, dgrid],
    tolerance = 0.1
  )
  expect_equal(tf_derive(cubic_b, order = 2)[, dgrid], lin[, dgrid],
    tolerance = 0.1,
    ignore_attr = TRUE
  )
})

test_that("basic definite integration works", {
  expect_equal(tf_integrate(square), to^3 - from^3, tolerance = 0.1)
  expect_equal(tf_integrate(square_irreg), to^3 - from^3, tolerance = 0.1)
  expect_equal(tf_integrate(square_b), to^3 - from^3,
    tolerance = 0.1,
    ignore_attr = TRUE
  )
})

test_that("basic antiderivatives work", {
  expect_equal(tf_integrate(square, definite = FALSE)[, dgrid],
    cubic[, dgrid] - from^3,
    tolerance = 0.1
  )
  expect_equal(tf_integrate(square_irreg, definite = FALSE)[, dgrid],
    cubic[, dgrid] - from^3,
    tolerance = 0.1
  )
  expect_equal(tf_integrate(square_b, definite = FALSE)[, dgrid],
    cubic[, dgrid] - from^3,
    tolerance = 0.1, ignore_attr = TRUE
  )
})

test_that("deriv & tf_integrate are reversible (approximately)", {
  set.seed(1337)
  f <- tf_rgp(10, arg = grid, nugget = 0)
  f <- f - f[, grid[1]] # start at  0
  f2 <- tf_integrate(tf_derive(f), definite = FALSE)
  f3 <- tf_derive(tf_integrate(f, definite = FALSE))
  expect_equal(f[, dgrid], f2[, dgrid], tolerance = 0.1)
  expect_equal(f[, dgrid], f3[, dgrid], tolerance = 0.1)

  expect_error(
    tf_integrate(tf_derive(tfb(f, verbose = FALSE)), definite = FALSE),
    "previously"
  )

  f_pc <- tfb_fpc(
    f[1:3, seq(tf_domain(f)[1], tf_domain(f)[2], length.out = 101)],
    smooth = FALSE, verbose = FALSE
  )
  f_pc2 <- tf_integrate(tf_derive(f_pc), definite = FALSE)
  f_pc3 <- tf_derive(tf_integrate(f_pc, definite = FALSE))
  expect_equal(f_pc[, dgrid], f_pc2[, dgrid], tolerance = 0.1)
  expect_equal(f_pc[, dgrid], f_pc3[, dgrid], tolerance = 0.1)
  expect_equal(tf_integrate(f_pc), tf_integrate(f[1:3]), tolerance = 0.01)
})

Try the tf package in your browser

Any scripts or data that you put into this service are public.

tf documentation built on May 29, 2024, 5:28 a.m.