knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(caracas)
inline_code <- function(x) { x } if (!has_sympy()) { # SymPy not available, so the chunks shall not be evaluated knitr::opts_chunk$set(eval = FALSE) inline_code <- function(x) { deparse(substitute(x)) } }
x <- symbol('x') as.character(x) x as_expr(x)
2*x y <- symbol('y') sqrt(3*x^y)
z <- cos(x)^2 + sin(x)^2 z simplify(z) tex(z)
z <- cos(x)*cos(y) - sin(x)*sin(y) z simplify(z) z <- cos(x + y) z expand(z) expand_trig(z)
x <- symbol('x') y <- symbol('y') z <- log(x*y) z expand_log(z)
x <- symbol("x") sum_(1/x, "x", 1, 10) sum_(1/x, x, 1, 10) s <- sum_(1/x, "x", 1, 10) as_expr(s) sum(1/(1:10)) n <- symbol("n") simplify(sum_(x, x, 1, n))
x <- symbol("x") p <- prod_(1/x, "x", 1, 10) p as_expr(p) prod(1/(1:10)) n <- symbol("n") prod_(x, x, 1, n)
x <- symbol("x") int(1/x, x, 1, 10) i1 <- int(1/x, x, 1, 10, doit = FALSE) i1 tex(i1) doit(i1) int(1/x, x) i1 <- int(1/x, x, doit = FALSE) i1 tex(i1) doit(i1)
x <- symbol("x") lim(sin(x)/x, "x", 0) lim(1/x, "x", 0, dir = '+') lim(1/x, "x", 0, dir = '-')
We can also postpone evaluation:
x <- symbol("x") lim(sin(x)/x, "x", 0) lim(sin(x)/x, x, 0)
res <- lim(sin(x)/x, "x", 0, doit = FALSE) res as.character(res) tex(res) doit(res) as_expr(res)
Note that the function is called d() and not deriv().
x <- symbol("x") y <- symbol("y") f <- 3*x^2 + x*y^2 f as_expr(f) der(f, "x") der(f, x) der(f, c("x", "y")) der(f, list(x, y)) f1 <- der(f, list(x, y)) f1 as.character(f1) as_expr(f1) eval(as_expr(f1), list(x = 1, y = 2)) der(f1, list(x, y)) f2 <- der2(f, list(x, y)) f2 as_expr(f2) eval(as_expr(f2), list(x = 1, y = 2))
x <- symbol("x") y <- symbol("y") f <- eval_to_symbol("[3*x**2 + x*y**2, 2*x, 5*y]") f der(f, list(x, y))
def_sym(x) f <- cos(x) ft_with_O <- taylor(f, x0 = 0, n = 4+1) ft_with_O ft_with_O %>% drop_remainder() %>% as_expr()
A <- matrix(c("x", 0, 0, "2*x"), 2, 2) A B <- as_sym(A) B 2*B B*B # Component-wise / Hadamard product dim(B) sqrt(B) log(B) sum(B) B %*% t(B) diag(B) cbind(B, B) rbind(B, B)
det(B) QRdecomposition(B)
A <- matrix(c("a", 0, 0, 0, "a", "a", "a", 0, 0), 3, 3) B <- as_sym(A) eigenval(B) eigenvec(B) eigen(eval(as_expr(B), list(a = 2)))
B diag(B) diag(B) <- "b" B diag(B)[-2] <- "a" B
inv() / solve_lin()solve_sys()Below find an example with maximising the multinomial likelihood.
p <- as_sym(paste0("p", 1:3)) y <- as_sym(paste0("y", 1:3)) a <- as_sym("a") l <- sum(y*log(p)) l L <- -l + a*(sum(p) - 1) L tex(L) g <- der(L, list(p, a)) g sol <- solve_sys(g, list(p, a)) sol sol[[1L]]$p1 tex(sol[[1L]]$p1)
x <- symbol("x", positive = TRUE) solve_sys(x^2 - 1, 0, x) x <- symbol("x", real = TRUE) solve_sys(x^2 + 1, 0, x) x <- symbol("x") solve_sys(x^2 + 1, 0, x)
x <- symbol('x') eq <- 2*x^2 - x eq subs(eq, x, "y")
p <- as_sym(paste0("p", 1:3)) y <- as_sym(paste0("y", 1:3)) a <- as_sym("a") l <- sum(y*log(p)) L <- -l + a*(sum(p) - 1) g <- der(L, c(a, p)) sols <- solve_sys(g, list(a, p)) sol <- sols[[1L]] sol H <- der2(L, list(p, a)) H H_sol <- subs(H, sol) H_sol
Note that all vectors in caracas are column vectors.
A <- matrix(c("a", 0, 0, 0, "a", "a", "a", 0, 0), 3, 3) B <- as_sym(A) B[, 2] B[, -2] B[1, ] B[1, , drop = FALSE] # Note this is a 1x3 matrix B[, 2] <- "x" B
texshow(B)
plots the following in the plot window:
texshow(B)
You can also provide a string instead:
texshow(paste0("B = ", tex(B)))
giving
texshow(paste0("B = ", tex(B)))
SymPy directlysympy <- get_sympy()
sympy$diff("2*a*x", "x") sympy$solve("x**2 - 1", "x")
Below we give a brief example of assumptions. First consider the Cholesky decomposition of a matrix:
A <- matrix(c("x+1", 1, 1, 1), 2, 2) %>% as_sym() A
do_la(A, "cholesky")
This fails as A is not positive (semi-)definite.
To ensure this, we need to impose restrictions on x. 
This is done by defining a symbol with an assumption about positivity:
y <- symbol("y", positive = TRUE)
We continue and define B, where it is important that 
declare_symbols = FALSE or else a new y will automatically 
be defined by caracas overwriting the above definition:
B <- as_sym("[[y + 1, 1], [1, 1]]", declare_symbols = FALSE) B do_la(B, "cholesky")
It is possible to ask for properties (see https://docs.sympy.org/latest/modules/assumptions/ask.html):
ask(y, "positive") ask(B, "hermitian") ask(A, "hermitian")
# Multinomial likelihood p <- as_sym(paste0("p", 1:3)) y <- as_sym(paste0("y", 1:3)) a <- as_sym("a") l <- sum(y*log(p)) L <- -l + a*(sum(p) - 1) L print(L, ascii = TRUE) g <- der(L, list(p, a)) sol <- solve_sys(g, list(p, a)) sol print(sol, simplify = FALSE)
as.character(g) as_character_matrix(g)
The following options are available:
caracas.print.method (utf8 is default, others are: prettyascii, ascii, compactascii)caracas.print.rowveccaracas.print.sol.simplifysol L options(caracas.print.method = "prettyascii") sol L options(caracas.print.method = "ascii") sol L options(caracas.print.method = NULL) # Or 'utf8' sol L
p options(caracas.print.rowvec = FALSE) p options(caracas.print.rowvec = NULL) # reset to default (TRUE)
sol options(caracas.print.sol.simplify = FALSE) sol options(caracas.print.sol.simplify = NULL) # reset to default (TRUE)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.