Programacion Con Matlab
Programacion Con Matlab
system
Rob Goedman, Gabor Grothendieck, Søren Højsgaard,
Ayal Pinkus, Mikkel Meyer Andersen
September 29, 2018
Contents
1 Introduction 2
3 A sample session 3
5 Commands 11
5.1 Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2 Taylor expansions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.3 Solving equations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.3.1 Solving equations symbolically . . . . . . . . . . . . . . . . . . . . . . 12
5.3.2 Solving equations numerically . . . . . . . . . . . . . . . . . . . . . . . 13
5.4 Expanding polynomials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.5 Simplifying an expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.6 Analytical derivatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.7 Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.8 Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.9 Variable substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.10 Solving ordinary differential equations . . . . . . . . . . . . . . . . . . . . . . 15
6 Matrices 15
6.1 Inverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.2 Determinant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1
7 Miscellaneous 18
1 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 de-
veloped by Ayal Pinkhuis (who is also the maintainer) and others, and is available at
http://yacas.sourceforge.net for various platforms. There is a comprehensive documentation
(300+ pages) of yacas (also available at http://yacas.sourceforge.net) and the documenta-
tion contains many examples.
2.1 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:
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
yacas(expression(D(x)Sin(x)))
produces an error. For such cases we can make a specification using the yacas syntax:
> yacas("D(x)Sin(x)")
expression(cos(x))
2
> x <- Sym("x")
expression(x)
> x+4
expression(x + 4)
One can apply sin, cos, tan, deriv, Integrate and other provided functions to Sym objects.
For example:
> Integrate(sin(x), x)
expression(-cos(x))
The convention in the following is 1) that Sym objects match with their names that they end
with an ’s’, e.g.
3 A sample session
Algebraic calculations:
3
> #(Sym(10) + Sym(2)) * Sym(5) + Sym(7) ^ Sym(7)
> Sym("10 * 2") * 5 + Sym(7) ^ 7
expression(823643)
> #(Sym(10) + 2) * 5 + Sym(7) ^ 7
> #Sym("(10+2)*5 + 7^7")
> Sym("1/14 + 5/21 * (30 - 1+1/2)")
expression(149/21)
Numerical evaluations:
> yacas(expression(N(-12/2)))
expression(-6)
> Sym("-12/2")
expression(-6)
> #Eval(Sym("-12/2"))
Symbolic expressions:
> yacas(expression(Factor(x^2-1)))
expression((x + 1) * (x - 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)
expression(3 * (x^2 * (1 - sin(6 * (x * pi))))/(2 * exp0))
> Factor(xs^2-1)
expression((xs + 1) * (xs - 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
expression(3 * (xs^2 * (1 - sin(6 * (xs * pi))))/(2 * exp0))
Differentiation:
4
> yacas("D(x)Sin(x)")
expression(cos(x))
Integration:
> yacas("Integrate(x,a,b)Sin(x)")
expression(cos(a) - cos(b))
Expanding polynomials:
> yacas("Expand((1+x)^3)")
expression(x^3 + 3 * x^2 + 3 * x + 1)
> Expand((1+xs)^3)
expression(xs^3 + 3 * xs^2 + 3 * xs + 1)
Taylor expansion:
> yacas("PrettyForm(texp)")
2 3
x x
x + -- + -- + 1
2 6
> yacas("TeXForm(texp)", retclass = "unquote")
$x + \frac{x ^{2}}{2} + \frac{x ^{3}}{6} + 1$
> PrettyForm(texp)
2 3
xs xs
xs + --- + --- + 1
2 6
> TeXForm(texp)
expression("$xs + \frac{xs ^{2}}{2} + \frac{xs ^{3}}{6} + 1$")
5
4 Simple Yacas calculations
Now the R variable ns refers to the yacas variable ns and we can make calculations directly
from R, e.g:
> Set(ns,123)
expression(123)
> ns
expression(123)
> ns^2
expression(15129)
Likewise:
6
> yacas(expression(n))
expression(120)
> yacas("Clear(n)")
expression(TRUE)
> yacas(expression(n))
expression(n)
> Set(ns, 1)
expression(1)
> ns <- Sym("ns")
> ns
expression(1)
> Clear(ns)
expression(TRUE)
> ns
expression(ns)
> yacas("Exp(0)")
expression(1)
> yacas("Exp(1)")
expression(exp(1))
> yacas("Sin(Pi/4)")
expression(root(1/2, 2))
> yacas("355/113")
expression(355/113)
> exp(Sym(0))
expression(1)
> exp(Sym(1))
expression(exp(1))
> sin(Pi/4)
expression(root(1/2, 2))
> Sym("355/113")
expression(355/113)
7
> yacas("N(Exp(1))")
expression(2.7182818284)
> yacas("N(Sin(Pi/4))")
expression(0.7071067811)
> yacas("N(355/113)")
expression(3.1415929203)
> N(exp(1))
expression(2.71828182845905)
> N(sin(Pi/4))
expression(0.7071067811)
> N(355/113)
expression(3.14159292035398)
The N() function has an optional second argument, the required precision:
> yacas("N(355/133,20)")
expression(2.66917293233083)
> N("355/113",20)
expression(3.14159292035398)
The command Precision(n) can be used to specify that all floating point numbers should
have a fixed precision of n digits:
> yacas("Precision(5)")
expression(Precision(5))
> yacas("N(355/113)")
expression(3.1415929203)
> Precision(5)
expression(Precision(5))
> N("355/113")
expression(3.1415929203)
> yacas(expression(55/10))
expression(11/2)
8
4.4 Symbolic calculation
Some exact manipulations :
> yacas("1/14+5/21*(30-(1+1/2)*5^2)")
expression(-12/7)
> yacas("0+x")
expression(x)
> yacas("x+1*y")
expression(x + y)
> yacas("Sin(ArcSin(alpha))+Tan(ArcTan(beta))")
expression(alpha + beta)
> Sym("1/14+5/21*(1*30-(1+1/2)*5^2)")
expression(-12/7)
> xs <- Sym("xs")
> ys <- Sym("ys")
> 0+xs
expression(xs)
> xs+1*ys
expression(xs + ys)
> sin(asin(xs))+tan(atan(ys))
expression(xs + ys)
> yacas("I^2")
expression(-1)
> yacas("7+3*I")
expression(complex_cartesian(7, 3))
> yacas("Conjugate(%)")
expression(complex_cartesian(7, -3))
> yacas("Exp(3*I)")
expression(complex_cartesian(cos(3), sin(3)))
9
> I^2
expression(-1)
> 7+3*I
expression(complex_cartesian(7, 3))
> Conjugate(7+3*I)
expression(complex_cartesian(7, -3))
> exp(3*I)
expression(complex_cartesian(cos(3), sin(3)))
> yacas("(1+x)^3")
expression((x + 1)^3)
> yacas("%")
expression((x + 1)^3)
> yacas("z:= %")
expression((x + 1)^3)
> (1+x)^3
expression((xs + 1)^3)
> zs <- Sym("%")
> zs
expression((xs + 1)^3)
> yacas("A:={{a,b},{c,d}}")
expression(list(list(a, b), list(c, d)))
> yacas("B:= (1+x)^2+k^3")
expression((x + 1)^2 + k^3)
> yacas("A")
expression(list(list(a, b), list(c, d)))
> yacas("B")
expression((x + 1)^2 + k^3)
10
> 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
expression(list(list(as, bs), list(cs, ds)))
> B
expression((xs + 1)^2 + ks^3)
> yacas("PrettyForm(A)")
/ \
| ( a ) ( b ) |
| |
| ( c ) ( d ) |
\ /
> yacas("PrettyForm(B)")
2 3
( x + 1 ) + k
> PrettyForm(A)
/ \
| ( as ) ( bs ) |
| |
| ( cs ) ( ds ) |
\ /
> PrettyForm(B)
2 3
( xs + 1 ) + ks
> #FIXME
> #yacas("TeXForm(B)")
> #FIXME
> #TeXForm(B)
5 Commands
5.1 Factorial
> yacas("40!")
expression(8.15915283247898e+47)
11
> Factorial(40)
expression(Factorial(40))
The InverseTaylor() function builds the Taylor series expansion of the inverse of an ex-
pression. 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):
> yacas("InverseTaylor(x,0,2)Exp(x)")
expression(x - 1 - (x - 1)^2/2)
> yacas("Taylor(y,1,2)Ln(y)")
expression(y - 1 - (y - 1)^2/2)
> InverseTaylor(exp(xs),xs,0,2)
expression(xs + xs^2/2 + 1)
> Taylor(log(ys),ys,1,2)
expression(ys - 1 - (ys - 1)^2/2)
12
> Solve(xs/(1+xs) == as, xs)
expression(list(xs == as/(1 - as)))
> Solve(xs^2+xs == 0, xs)
expression(list(xs == 0, xs == -1))
> # 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.)
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:
> yacas(expression(Expand((1+x)^3)))
expression(x^3 + 3 * x^2 + 3 * x + 1)
> Expand((x+1)^3)
expression(xs^3 + 3 * xs^2 + 3 * xs + 1)
13
> (x+y)^3-(x-y)^3
expression((xs + y)^3 - (xs - y)^3)
> Simplify("%")
expression(6 * (xs^2 * y) + 2 * y^3)
These functions also accepts an argument specifying how often the derivative has to be
taken, e.g:
> yacas("D(x,4)Sin(x)")
expression(sin(x))
> deriv(sin(xs),xs,4)
expression(sin(xs))
5.7 Integration
> #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)")
expression((2 * sin(b * x)/b - (sin(-2 * (x * a) - b * x)/(-2 *
a - b) + sin(-2 * (x * a) + b * x)/(-2 * a + b)))/4)
> #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)
expression((2 * sin(b * xs)/b - (sin(-2 * (xs * a) - b * xs)/(-2 *
a - b) + sin(-2 * (xs * a) + b * xs)/(-2 * a + b)))/4)
14
5.8 Limits
> #yacas("Limit(x,0)Sin(x)/x")
> yacas("Limit(n,Infinity)(1+(1/n))^n")
expression(exp(1))
> yacas("Limit(h,0) (Sin(x+h)-Sin(x))/h")
expression(cos(x))
> #Limit(sin(x)/x,x,0)
> ns <- Sym("ns")
> Limit((1+(1/ns))^ns,ns,Infinity)
expression(exp(1))
> hs <- Sym("hs")
> Limit((sin(xs+hs)-sin(xs))/hs,hs,0)
expression(cos(xs))
> Subst(xs+xs,xs,cos(as))
expression(2 * cos(as))
> yacas("OdeSolve(y''==4*y)")
expression(C545 * exp(2 * x) + C549 * exp(-2 * x))
> yacas("OdeSolve(y'==8*y)")
expression(C579 * exp(8 * x))
6 Matrices
> yacas("E4:={ {u1,u1,0},{u1,0,u2},{0,u2,0} }")
expression(list(list(u1, u1, 0), list(u1, 0, u2), list(0, u2,
0)))
> yacas("PrettyForm(E4)")
/ \
| ( u1 ) ( u1 ) ( 0 ) |
| |
| ( u1 ) ( 0 ) ( u2 ) |
| |
| ( 0 ) ( u2 ) ( 0 ) |
\ /
15
> u1 <- Sym("u1")
> u2 <- Sym("u2")
> E4 <- List(List(u1, u1, 0), List(u1, 0, u2), List(0, u2, 0))
> PrettyForm(E4)
/ \
| ( u1 ) ( u1 ) ( 0 ) |
| |
| ( u1 ) ( 0 ) ( u2 ) |
| |
| ( 0 ) ( u2 ) ( 0 ) |
\ /
6.1 Inverse
> yacas("E4i:=Inverse(E4)")
expression(list(list(u1 * u2^2/(u1^2 * u2^2), 1/u1 - u1 * u2^2/(u2^2 *
u1^2), -(u1 * u2/u1)/u2^2), list(1/u1 - u1 * u2^2/(u2^2 *
u1^2), u1 * u2^2/(u2^2 * u1^2) - 1/u1, u2 * u1/(u2^2 * u1)),
list(-(u1 * u2/u1)/u2^2, u1 * u2/(u1 * u2^2), u1/u2^2)))
> yacas("Simplify(E4i)")
expression(list(list(1/u1, 0, -1/u2), list(0, 0, 1/u2), list(-1/u2,
1/u2, u1/u2^2)))
> yacas("PrettyForm(Simplify(E4i))")
/ \
| / 1 \ ( 0 ) / -1 \ |
| | -- | | -- | |
| \ u1 / \ u2 / |
| |
| ( 0 ) ( 0 ) / 1 \ |
| | -- | |
| \ u2 / |
| |
| / -1 \ / 1 \ / u1 \ |
| | -- | | -- | | --- | |
| \ u2 / \ u2 / | 2 | |
| \ u2 / |
\ /
16
> E4i <- Inverse(E4)
> Simplify(E4i)
expression(list(list(1/u1, 0, -1/u2), list(0, 0, 1/u2), list(-1/u2,
1/u2, u1/u2^2)))
> PrettyForm(Simplify(E4i))
/ \
| / 1 \ ( 0 ) / -1 \ |
| | -- | | -- | |
| \ u1 / \ u2 / |
| |
| ( 0 ) ( 0 ) / 1 \ |
| | -- | |
| \ u2 / |
| |
| / -1 \ / 1 \ / u1 \ |
| | -- | | -- | | --- | |
| \ u2 / \ u2 / | 2 | |
| \ u2 / |
\ /
6.2 Determinant
> yacas("Determinant(E4)")
expression(-(u1 * u2^2))
> yacas("Determinant(E4i)")
expression((u1 * u2^2/(u2^2 * u1^2) - 1/u1) * (u1 * u2^2) * u1/(u1^2 *
u2^4) - u1 * u2^2 * (u2 * u1) * (u1 * u2)/(u1 * u2^2 * (u2^2 *
u1 * (u1^2 * u2^2))) - (1/u1 - u1 * u2^2/(u2^2 * u1^2)) *
(u1 * u2)^2/(u2^4 * u1^2) - (1/u1 - u1 * u2^2/(u2^2 * u1^2))^2 *
u1/u2^2 - (1/u1 - u1 * u2^2/(u2^2 * u1^2)) * (u2 * u1) *
(u1 * u2)/(u2^4 * u1^2) - (u1 * u2^2/(u2^2 * u1^2) - 1/u1) *
(u1 * u2)^2/(u1^2 * u2^4))
> yacas("Simplify(E4i)")
expression(list(list(1/u1, 0, -1/u2), list(0, 0, 1/u2), list(-1/u2,
1/u2, u1/u2^2)))
> yacas("Simplify(Determinant(E4i))")
expression(-1/(u1 * u2^2))
17
> determinant(E4)
expression(-(u1 * u2^2))
> determinant(E4i)
expression((u1 * u2^2/(u2^2 * u1^2) - 1/u1) * (u1 * u2^2) * u1/(u1^2 *
u2^4) - u1 * u2^2 * (u2 * u1) * (u1 * u2)/(u1 * u2^2 * (u2^2 *
u1 * (u1^2 * u2^2))) - (1/u1 - u1 * u2^2/(u2^2 * u1^2)) *
(u1 * u2)^2/(u2^4 * u1^2) - (1/u1 - u1 * u2^2/(u2^2 * u1^2))^2 *
u1/u2^2 - (1/u1 - u1 * u2^2/(u2^2 * u1^2)) * (u2 * u1) *
(u1 * u2)/(u2^4 * u1^2) - (u1 * u2^2/(u2^2 * u1^2) - 1/u1) *
(u1 * u2)^2/(u1^2 * u2^4))
> Simplify(E4i)
expression(list(list(1/u1, 0, -1/u2), list(0, 0, 1/u2), list(-1/u2,
1/u2, u1/u2^2)))
> Simplify(determinant(E4i))
expression(-1/(u1 * u2^2))
7 Miscellaneous
Note that the value returned by yacas can be of different types:
> yacas(expression(Factor(x^2-1)),retclass='unquote')
*" ("+" (x ,1 ),"- (x ,1 ))
> yacas(expression(Factor(x^2-1)),retclass='character')
"*" ("+" (x ,1 ),"-" (x ,1 ))
18