---
title: "Elaborate reference of `Ryacas` functionality"
author: "Rob Goedman, Gabor Grothendieck, Søren Højsgaard, Ayal Pinkus and Mikkel Meyer Andersen"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Elaborate reference of Ryacas functionality}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r, message=FALSE}
library(Ryacas0)
```
# Introduction
`Ryacas` makes the `yacas` computer algebra system available from
within `R`. The name `yacas` is short for "Yet Another Computer Algebra
System". The `yacas` program
is developed by Ayal Pinkhuis (who is also the maintainer)
and others, and is available at for various
platforms. There is a comprehensive documentation (300+ pages) of
`yacas` (also available at
) and the
documentation contains many examples.
# `R` expressions, `yacas` expressions and `Sym` objects
The `Ryacas` package works by sending ``commands''
to `yacas` which makes the calculations and returns the result
to `R`. There are various different formats of the return value as well
## `R` expressions
A call to `yacas` may be in the form of an `R` expression which
involves valid R calls, symbols or constants (though not all valid `R`
expressions are valid). For example:
```{r}
exp1 <- yacas(expression(Factor(x^2-1)))
```
The result `exp1` is not an expression in the `R` sense but an
object of class `"yacas"`.
To evaluate the resulting expression numerically, we can do
```{r}
Eval(exp1, list(x=4))
```
## `yacas` expressions
Some commands are not proper `R` expressions. For example,
typing
```
yacas(expression(D(x)Sin(x)))
```
produces an error.
For such cases we can make
a specification using the `yacas` syntax:
```{r}
yacas("D(x)Sin(x)")
```
## `Sym` objects
Probably the most elegant way of working with `yacas` is by using
`Sym` objects.
A `Sym` object is a `yacas` character string that has the "Sym" class.
One can combine `Sym` objects with other `Sym` objects as well as to
other `R` objects using `+`, `-` and other similar `R`
operators.
The function `Sym(x)` coerces an object `x` to a `Sym` object by
first coercing it to character and then changing its class to "Sym":
```{r}
x <- Sym("x")
```
Operations on `Sym` objects lead to new `Sym` objects:
```{r}
x+4
```
One can apply `sin`, `cos`, `tan`, `deriv`, `Integrate`
and other provided functions to `Sym` objects. For example:
```{r}
Integrate(sin(x), x)
```
In this way the communication with `yacas` is ``tacit''.
It is important to note the difference between the `R` name `x`
and the symbol `"x"` as illustrated below:
```{r}
x <- Sym("xs")
x
x+4
Eval(x+4, list(xs=5))
```
The convention in the following is 1) that `Sym` objects match with
their names that they end with an 's', e.g.
```{r}
xs <- Sym('xs')
```
# A sample session
Algebraic calculations:
```{r}
yacas(expression((10 + 2) * 5 + 7^7))
yacas(expression(1/14+5/21* (30- 1+ 1/2)))
```
```{r}
#(Sym(10) + Sym(2)) * Sym(5) + Sym(7) ^ Sym(7)
Sym("10 * 2") * 5 + Sym(7) ^ 7
#(Sym(10) + 2) * 5 + Sym(7) ^ 7
#Sym("(10+2)*5 + 7^7")
Sym("1/14 + 5/21 * (30 - 1+1/2)")
```
Numerical evaluations:
```{r}
yacas(expression(N(-12/2)))
```
```{r}
Sym("-12/2")
#Eval(Sym("-12/2"))
```
Symbolic expressions:
```{r}
yacas(expression(Factor(x^2-1)))
exp1 <- expression(x^2 + 2 * x^2)
exp2 <- expression(2 * exp0)
exp3 <- expression(6 * pi * x)
exp4 <- expression((exp1 * (1 - sin(exp3))) / exp2)
yacas(exp4)
```
```{r}
Factor(xs^2-1)
exp1 <- xs^2 + 2 * xs^2
exp0 <- Sym("exp0")
exp2 <- 2 * Sym(exp0)
exp3 <- 6 * Pi * xs
exp4 <- exp1 * (1 - sin(exp3)) / exp2
exp4
```
Combining symbolic and numerical expressions:
```{r}
yacas(expression(N(Sin(1)^2 + Cos(x)^2)))
```
```{r}
N(sin(1)^2 + cos(xs)^2)
```
Differentiation:
```{r}
yacas("D(x)Sin(x)")
```
```{r}
deriv(sin(xs), xs)
```
Integration:
```{r}
yacas("Clear(a,b,A,B)")
```
```{r}
yacas("Integrate(x,a,b)Sin(x)")
```
```{r}
as <- Sym("as")
bs <- Sym("bs")
Integrate(sin(xs), xs, as, bs)
```
Expanding polynomials:
```{r}
yacas("Expand((1+x)^3)")
```
```{r}
Expand((1+xs)^3)
```
Taylor expansion:
```{r}
yacas("texp := Taylor(x,0,3) Exp(x)")
```
```{r}
texp <- Taylor(exp(xs), xs, 0, 3)
# Or: texp <- Sym("texp")
```
Printing the result in nice forms:
```{r}
yacas("PrettyForm(texp)")
yacas("TeXForm(texp)")
```
```{r}
PrettyForm(texp)
TeXForm(texp)
```
# Simple `yacas` calculations
## Setting and clearing a variable
The function `Set()` and the operator `:=` can both be used to assign
values to global variables.
```{r}
yacas("n := (10 + 2) * 5")
yacas("n := n+n")
#yacas("Set(z, Cos(a))")
#yacas("z+z")
```
The same can be achieved with `Sym` objects: Consider:
```{r}
Set(ns, (10 + 2) * 5)
```
Now `ns` exists as a variable in `yacas` (and we
can make computations on this variable as above).
However we have no handle on
this variable in `R`. Such a handle is obtained with
```{r}
ns <- Sym("ns")
```
Now the `R` variable `ns` refers to the `yacas` variable
`ns` and we can make calculations directly from `R`, e.g:
```{r}
Set(ns,123)
ns
ns^2
```
Likewise:
```{r}
as <- Sym("as")
zs <- Sym("zs")
Set(zs, cos(as))
zs + zs
```
Clear a variable binding execute `Clear()`:
```{r}
yacas(expression(n))
yacas("Clear(n)")
yacas(expression(n))
```
```{r}
Set(ns, 1)
ns <- Sym("ns")
ns
Clear(ns)
ns
```
## Symbolic and numerical evaluations, precision
Evaluations are generally exact:
```{r}
yacas("Exp(0)")
yacas("Exp(1)")
yacas("Sin(Pi/4)")
yacas("355/113")
```
```{r}
exp(Sym(0))
exp(Sym(1))
sin(Pi/4)
Sym("355/113")
```
To obtain a numerical evaluation
(approximation), the `N()` function can be used:
```{r}
yacas("N(Exp(1))")
yacas("N(Sin(Pi/4))")
yacas("N(355/113)")
```
```{r}
N(exp(1))
N(sin(Pi/4))
N(355/113)
```
The `N()` function has an optional second argument, the required precision:
```{r}
yacas("N(355/133,20)")
```
```{r}
N("355/113",20)
```
The command `Precision(n)`
can be used to specify that all floating point numbers should have a
fixed precision of n digits:
```{r}
yacas("Precision(5)")
yacas("N(355/113)")
```
```{r}
Precision(5)
N("355/113")
```
## Rational numbers
Rational numbers will stay rational as long as the numerator and
denominator are integers:
```{r}
yacas(expression(55/10))
```
```{r}
Sym("55 / 10")
```
## Symbolic calculation
Some exact manipulations :
```{r}
yacas("1/14+5/21*(30-(1+1/2)*5^2)")
yacas("0+x")
yacas("x+1*y")
yacas("Sin(ArcSin(alpha))+Tan(ArcTan(beta))")
```
```{r}
Sym("1/14+5/21*(1*30-(1+1/2)*5^2)")
xs <- Sym("xs")
ys <- Sym("ys")
0+xs
xs+1*ys
sin(asin(xs))+tan(atan(ys))
```
## Complex numbers and the imaginary unit
The imaginary unit $i$ is denoted I and complex numbers can be entered
as either expressions involving I or explicitly Complex(a,b) for a+ib.
```{r}
yacas("I^2")
yacas("7+3*I")
yacas("Conjugate(%)")
yacas("Exp(3*I)")
```
```{r}
I^2
7+3*I
Conjugate(7+3*I)
exp(3*I)
```
## Recall the most recent line -- the `%` operator
The operator `%` automatically recalls the result from the
previous line.
```{r}
yacas("(1+x)^3")
yacas("%")
yacas("z:= %")
```
```{r}
(1+x)^3
zs <- Sym("%")
zs
```
## Printing with `PrettyForm`, `PrettyPrint` and `TeXForm`
There are different ways of displaying the output.
### Standard form
The (standard)
yacas form is:
```{r}
yacas("A:={{a,b},{c,d}}")
yacas("B:= (1+x)^2+k^3")
yacas("A")
yacas("B")
```
```{r}
as <- Sym("as"); bs <- Sym("bs"); cs <- Sym("cs"); ds <- Sym("ds")
A <- List(List(as,bs), List(cs,ds))
ks <- Sym("ks")
B <- (1+xs)^2+ks^3
A
B
```
### Pretty form
The Pretty form is:
```{r}
yacas("PrettyForm(A)")
yacas("PrettyForm(B)")
```
```{r}
PrettyForm(A)
PrettyForm(B)
```
### TeX form
The output can be displayed in TeX form:
```{r}
yacas("TeXForm(B)")
```
```{r}
TeXForm(B)
```
# Commands
## Factorial
```{r}
yacas("40!")
```
```{r}
Factorial(40)
```
## Taylor expansions
Expand $\exp(x)$ in three terms
around $0$ and $a$:
```{r}
yacas("Taylor(x,0,3) Exp(x)")
yacas("Taylor(x,a,3) Exp(x)")
```
```{r}
xs <- Sym("xs")
Taylor(exp(xs),xs,0,3)
as <- Sym("as")
Taylor(exp(x),x,as,3)
```
The `InverseTaylor()` function builds the Taylor series expansion of the
inverse of an expression. For example, the Taylor expansion in two
terms of the inverse of $\exp(x)$ around $x=0$ (which is the Taylor
expansion of $Ln(y)$ around $y=1$):
```{r}
yacas("InverseTaylor(x,0,2)Exp(x)")
yacas("Taylor(y,1,2)Ln(y)")
```
```{r}
InverseTaylor(exp(xs),xs,0,2)
Taylor(log(ys),ys,1,2)
```
## Solving equations
### Solving equations symbolically
Solve equations symbolically with the `Solve()` function:
```{r}
yacas("Solve(x/(1+x) == a, x)")
yacas("Solve(x^2+x == 0, x)")
```
```{r}
Solve(xs/(1+xs) == as, xs)
Solve(xs^2+xs == 0, xs)
```
```{r}
Solve(List(xs^2+ys^2==6, xs-ys==3), List(xs,ys))
```
```{r}
# FIXME
#Solve(List(mean==(xs/(xs+ys)), variance==((xs*ys)/(((xs+ys)^2) * (xs+ys+1)))),
# List(xs,ys))
```
(Note the use of the == operator, which does not evaluate to anything,
to denote an "equation" object.)
### Solving equations numerically
To solve an equation (in one variable) like $sin(x)-exp(x)=0$ numerically taking $0.5$
as initial guess and an accuracy of $0.0001$ do:
```{r}
yacas("Newton(Sin(x)-Exp(x),x, 0.5, 0.0001)")
```
```{r}
Newton(sin(xs)-exp(xs),xs, 0.5, 0.0001)
```
## Expanding polynomials
```{r}
yacas(expression(Expand((1+x)^3)))
```
```{r}
Expand((x+1)^3)
```
## Simplifying an expression
The function Simplify() attempts to reduce an expression
to a simpler form.
```{r}
y <- Sym("y")
yacas("(x+y)^3-(x-y)^3")
yacas("Simplify(%)")
```
```{r}
(x+y)^3-(x-y)^3
Simplify("%")
```
## Analytical derivatives
Analytical derivatives of functions can be evaluated with the
`D()` and `deriv()` functions:
```{r}
yacas("D(x) Sin(x)")
```
```{r}
deriv(sin(xs), xs)
```
These functions also accepts an argument specifying how often the
derivative has to be taken, e.g:
```{r}
yacas("D(x,4)Sin(x)")
```
```{r}
deriv(sin(xs),xs,4)
```
## Integration
@
<>=
yacas("Clear(a,b,A,B)")
```
```{r}
#yacas("Integrate(x,a,b)Sin(x)")
#yacas("Integrate(x,a,b)Ln(x)+x")
#yacas("Integrate(x)1/(x^2-1)")
yacas("Integrate(x)Sin(a*x)^2*Cos(b*x)")
```
```{r}
#Integrate(sin(x),x,a,b)
#Integrate(log(x),x,a,b)
#Integrate(1/(x^2-1),x)
a <- Sym("a")
b <- Sym("b")
Integrate(sin(a*x)^2*cos(b*x),x)
```
## Limits
```{r}
#yacas("Limit(x,0)Sin(x)/x")
yacas("Limit(n,Infinity)(1+(1/n))^n")
yacas("Limit(h,0) (Sin(x+h)-Sin(x))/h")
```
```{r}
#Limit(sin(x)/x,x,0)
ns <- Sym("ns")
Limit((1+(1/ns))^ns,ns,Infinity)
hs <- Sym("hs")
Limit((sin(xs+hs)-sin(xs))/hs,hs,0)
```
## Variable substitution
```{r}
yacas("Subst(x,Cos(a))x+x")
```
```{r}
Subst(xs+xs,xs,cos(as))
```
## Solving ordinary differential equations
```{r}
yacas("OdeSolve(y''==4*y)")
yacas("OdeSolve(y'==8*y)")
```
# Matrices
```{r}
yacas("E4:={ {u1,u1,0},{u1,0,u2},{0,u2,0} }")
yacas("PrettyForm(E4)")
```
```{r}
u1 <- Sym("u1")
u2 <- Sym("u2")
E4 <- List(List(u1, u1, 0), List(u1, 0, u2), List(0, u2, 0))
PrettyForm(E4)
```
## Inverse
```{r}
yacas("E4i := Inverse(E4)")
yacas("Simplify(E4i)")
yacas("PrettyForm(Simplify(E4i))")
```
```{r}
E4i <- Inverse(E4)
Simplify(E4i)
PrettyForm(Simplify(E4i))
```
## Determinant
```{r}
yacas("Determinant(E4)")
yacas("Determinant(E4i)")
yacas("Simplify(E4i)")
yacas("Simplify(Determinant(E4i))")
```
```{r}
determinant(E4)
determinant(E4i)
Simplify(E4i)
Simplify(determinant(E4i))
```
# Miscellaneous
Note that the value returned by `yacas` can be of different types:
```{r}
yacas(expression(Factor(x^2-1)),retclass='unquote')
yacas(expression(Factor(x^2-1)),retclass='character')
```
# Output width
Set output width:
```{r}
get_output_width()
set_output_width(120)
get_output_width()
```