Ryacas version 1.0.0 released!
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 I can announce that Ryacas
version 1.0.0 is
now released to CRAN (https://cran.r-project.org/package=Ryacas).
I wish to thank all co-authors:
Rob Goedman, Gabor Grothendieck, Søren Højsgaard, Grzegorz Mazur, Ayal Pinkus.
It means that you can install the package by (possible after binaries have been built):
install.packages("Ryacas")
Followed by:
library(Ryacas)
(The source code is available at https://github.com/mikldk/ryacas/.)
Now you have the yacas
computer algebra system fully available!
See documentation at https://yacas.readthedocs.io/en/latest/.
Ryacas
allows one to send unprocessed yacas strings and certain other R objects to yacas process from R and get back the result. It also has facilities for manipulating yacas strings and R expressions destined for yacas processing.
It can be used for arbitrary-precision arithmetic, symbolic math, ASCII pretty printing and translating R to TeX.
Below I will demonstrate a few ways to use Ryacas
, but I also refer to a number of blog posts that I have made already:
- Major update of
Ryacas
(R Interface to the Yacas Computer Algebra System) - How much pizza and how much frozen yogurt?
- How much pizza and how much frozen yogurt? …with Gröbner bases
- Correlation is not transitive, in general at least
Examples of usage
I will just give a few examples and then refer to the package webpage especially the vignettes:
- Getting started
- The low-level interface
- The high-level (symbol) interface
- (Note there are more vignettes than these.)
There are two main functions in the low-level interface:
yac_str(x)
: Evaluateyacas
commandx
(a string) and get result as string/character.yac_expr(x)
: Evaluateyacas
commandx
(a string) and get result as anR
expression.
And one main function in the high-level interface:
yac_symbol(x)
: Takes ayacas
command (e.g.x
,2*a
), or anR
vector or matrix and creates ayac_symbol
Simple examples of the low-level interface:
yac_str("x+x+x+x") ## [1] "4*x" yac_str("Factor(x^2+x-6)") ## [1] "(x-2)*(x+3)" yac_str("D(x) x^2 + 4*x") ## [1] "2*x+4" ex <- yac_expr("D(x) x^2 + 4*x") ex ## expression(2 * x + 4) eval(ex, list(x = 2)) ## [1] 8 yac_str("Limit(x, 1) (x^2 - 1)/(x - 1)") ## [1] "2" yac_str("Sum(n, 1, Infinity, (1/2)^n)") ## [1] "1" yac_str("Fibonacci(10)") ## [1] "55" yac_str("Sum(n, 1, 10, Fibonacci(n))") ## [1] "143" yac_str("TeXForm(x^2 - 1)") ## [1] "x ^{2} - 1" yac_str("Solve(a*x^2 + b*x + c == 0, x)") ## [1] "{x==(Sqrt(b^2-4*a*c)-b)/(2*a),x==(-(b+Sqrt(b^2-4*a*c)))/(2*a)}"
Simple examples of the high-level interface:
x <- yac_symbol("x") 2*x^2 - 5 ## [1] 2*x^2-5 c(-2, 5)*x ## [1] {(-2)*x,5*x} as_r(c(-2, 5)*x) ## expression(c(-2 * x, 5 * x)) A <- outer(0:3, 1:4, "-") + diag(2:5) a <- 1:4 B <- yac_symbol(A) B ## {{ 1, -2, -3, -4}, ## { 0, 2, -2, -3}, ## { 1, 0, 3, -2}, ## { 2, 1, 0, 4}} b <- yac_symbol(a) b ## [1] {1,2,3,4} B %*% b ## [1] {-28,-14,2,20} t(B) ## {{ 1, 0, 1, 2}, ## {-2, 2, 0, 1}, ## {-3, -2, 3, 0}, ## {-4, -3, -2, 4}} exp(B) ## {{ Exp(1), Exp(-2), Exp(-3), Exp(-4)}, ## { 1, Exp(2), Exp(-2), Exp(-3)}, ## { Exp(1), 1, Exp(3), Exp(-2)}, ## { Exp(2), Exp(1), 1, Exp(4)}} as_r(exp(B)) ## [,1] [,2] [,3] [,4] ## [1,] 2.718282 0.1353353 0.04978707 0.01831564 ## [2,] 1.000000 7.3890561 0.13533528 0.04978707 ## [3,] 2.718282 1.0000000 20.08553692 0.13533528 ## [4,] 7.389056 2.7182818 1.00000000 54.59815003 B[, 2:3] ## {{-2, -3}, ## { 2, -2}, ## { 0, 3}, ## { 1, 0}} B[upper.tri(B)] <- 1 B ## {{1, 1, 1, 1}, ## {0, 2, 1, 1}, ## {1, 0, 3, 1}, ## {2, 1, 0, 4}} 2*B - B ## {{1, 1, 1, 1}, ## {0, 2, 1, 1}, ## {1, 0, 3, 1}, ## {2, 1, 0, 4}} B %*% solve(B) ## {{1, 0, 0, 0}, ## {0, 1, 0, 0}, ## {0, 0, 1, 0}, ## {0, 0, 0, 1}} solve(B %*% t(B)) ## {{ 363/98, (-123)/98, (-87)/98, (-61)/98}, ## {(-123)/98, 34/49, 23/98, 15/98}, ## { (-87)/98, 23/98, 33/98, 13/98}, ## { (-61)/98, 15/98, 13/98, 17/98}}
And it even works with variables:
D <- B D[2, 3] <- "x" D ## {{1, 1, 1, 1}, ## {0, 2, x, 1}, ## {1, 0, 3, 1}, ## {2, 1, 0, 4}} d <- b d[2] <- "x" d ## [1] {1,x,3,4} D %*% d ## [1] {x+8,5*x+4,14,x+18} ex <- as_r(D %*% d) ex ## expression(c(x + 8, 5 * x + 4, 14, x + 18)) eval(ex, list(x = 2)) ## [1] 10 14 14 20
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.