caracas: Computer Algebra in R via SymPy
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
It is with great pleasure that we can announce the release of caracas version 1.0.1 to CRAN (https://cran.r-project.org/package=caracas).
The package enables user to make computer algebra from R using the Python library SymPy.
You can now install the caracas package as follows:
install.packages("caracas")
And then load it by:
library(caracas)
The source code and the development version is available at https://github.com/r-cas/caracas/. Online documentation (of the development version) can be found at https://r-cas.github.io/caracas/.
Below we will show a few examples, but also notice the vignettes available at https://cran.r-project.org/package=caracas.
Quick start
x <- symbol('x')
eq <- 2*x^2 - x
eq
## [caracas]: 2
## 2⋅x - x
as.character(eq)
## [1] "2*x^2 - x"
as_r(eq)
## expression(2 * x^2 - x)
tex(eq) # $$`r tex(eq)`$$
## [1] "2 x^{2} - x"
\[2 x^{2} - x\]
solve_sys(eq, x) ## Solution 1: ## x = 0 ## Solution 2: ## x = 1/2 der(eq, x) ## [caracas]: 4⋅x - 1 subs(eq, x, "y") ## [caracas]: 2 ## 2⋅y - y
Linear algebra
A <- matrix(c("x", 2, 0, "2*x"), 2, 2)
B <- as_symbol(A)
B
## [caracas]: ⎡x 0 ⎤
## ⎢ ⎥
## ⎣2 2⋅x⎦
determinant(B)
## [caracas]: 2
## 2⋅x
Binv <- inv(B) # or solve_lin(B)
Binv
## [caracas]: ⎡ 1 ⎤
## ⎢ ─ 0 ⎥
## ⎢ x ⎥
## ⎢ ⎥
## ⎢-1 1 ⎥
## ⎢─── ───⎥
## ⎢ 2 2⋅x⎥
## ⎣ x ⎦
tex(Binv)
## [1] "\\left[\\begin{matrix}\\frac{1}{x} & 0\\\\- \\frac{1}{x^{2}} & \\frac{1}{2 x}\\end{matrix}\\right]"
\[\left[\begin{matrix}\frac{1}{x} & 0\\- \frac{1}{x^{2}} & \frac{1}{2 x}\end{matrix}\right]\]
eigen_val(Binv) ## [[1]] ## [[1]]$eigval ## [caracas]: 1 ## ─ ## x ## ## [[1]]$eigmult ## [1] 1 ## ## ## [[2]] ## [[2]]$eigval ## [caracas]: 1 ## ─── ## 2⋅x ## ## [[2]]$eigmult ## [1] 1
Matrix-vector multiplication with %*%; subsetting with [, diag() etc. also works.
Maximising the multinomial likelihood
p <- as_symbol(paste0("p", 1:3))
y <- as_symbol(paste0("y", 1:3))
a <- as_symbol("a")
l <- sum(y*log(p))
l
## [caracas]: y₁⋅log(p₁) + y₂⋅log(p₂) + y₃⋅log(p₃)
L <- -l + a*(sum(p) - 1)
L
## [caracas]: a⋅(p₁ + p₂ + p₃ - 1) - y₁⋅log(p₁) - y₂⋅log(p₂) - y₃⋅log(p₃)
g <- der(L, c(p, a))
g
## [caracas]: ⎡ y₁ y₂ y₃ ⎤
## ⎢a - ── a - ── a - ── p₁ + p₂ + p₃ - 1⎥
## ⎣ p₁ p₂ p₃ ⎦
sol <- solve_sys(g, c(p, a))
sol
## Solution 1:
## p1 = y₁
## ────────────
## y₁ + y₂ + y₃
## p2 = y₂
## ────────────
## y₁ + y₂ + y₃
## p3 = y₃
## ────────────
## y₁ + y₂ + y₃
## a = y₁ + y₂ + y₃
sol[[1L]]$p1
## [caracas]: y₁
## ────────────
## y₁ + y₂ + y₃
tex(sol[[1L]]$p1)
## [1] "\\frac{y_{1}}{y_{1} + y_{2} + y_{3}}"
caracas objects can be turned into R objects using as_r():
l
## [caracas]: y₁⋅log(p₁) + y₂⋅log(p₂) + y₃⋅log(p₃)
l_e <- as_r(l)
l_e
## expression(y1 * log(p1) + y2 * log(p2) + y3 * log(p3))
eval(l_e, list(p1 = 0.2, p2 = 0.3, p3 = 0.5,
y1 = 18, y2 = 31, y3 = 51))
## [1] -101.6435
More information and examples
Please refer to one or more of the following:
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.