Symbolic Sage - What is it?

18 views
Skip to first unread message

yuri.k

unread,
Mar 27, 2010, 3:36:41 PM3/27/10
to sage-devel
As a maple user I can say that sage is difficult to use if you just
going to do some simple math. The main reason is - I used to deal with
symbolic computation. So what's wrong with symbolic in Sage?

To do some complex symbolic computation I usually need symbolic
variables, functions, regular numbers, strings, vectors, matrices and
of course collections to store all this data. Also I need simple way
to check what is that I deal with. Is it collection or may be sum, or
just a logarithmic function? And of course I need some unified way to
get parts of expression I deal with.

But what I get when I use sage? I always need to check is expression
belong to some type (python or sage) and then depends on what it was I
can use some specific methods.

e.g. if I have symbolic expression expr=diff(f,x)+x+1 I can call
operator() method and then I'm able to compare is it operator.add or
not by writing expr.operator() == operator.add
but if expr=diff(f,x) I can't compare it in such way, I should use
instanceof() to check if expr.operator() it is instance of
FDerivativeOperator.
What is worst if I have just a number 1 or set of smth I cant even
call operator method cause they don't have one.

Sounds really bad especially for those who use sage for first time.
But even for programmers I think it is bad approach to deal with
symbolical expression in their algorithms.

So.. I decided to make life easier and to make wraps around everything
I need to make my math. So In this approach everything - integers,
floats, rationals, lists, tuples, functions, derivatives, symbolic
vars, vectors, matrices, and so on treats as symbolical expression.
Which means I can do following operations with them:

1. get their symbolic type mtype(expr)
sage: x=var('x')
sage: eq=x+1
sage: stype(eq)
'+.relation'

sage: x=var('x')
sage: eq=2*x
sage: stype(eq)
'*.relation'

sage: x=var('x')
sage: f=function('f',x)
sage: expr=[1, x, f]
sage: mtype(expr)
'list.collection'
sage: map(mtype, expr)
['integer.number', 'symbolic.variable', 'symbolic.function']

2. check if their symbolic type is belongs to some group of types
mtype(expr,'_relations _.4.vector ")
sage: x=var('x')
sage: eq=x+1
sage: mtype(eq,'_+')
True

sage: x=var('x')
sage: eq=x+1
sage: mtype(eq,'+')
False

sage: x=var('x')
sage: eq=x+1
sage: mtype(eq,'+.relation')
True

sage: x=var('x')
sage: eq=2*x
sage: mtype(eq,'_+')
False

sage: x=var('x')
sage: eq=2*x
sage: mtype(eq,'*')
True

sage: a,b=var('a b')
sage: mtype(a>=b,'>=.relation')
True
sage: mtype(a>=b,'>.relation')
False
sage: mtype(a>=b,'==.relation')
False
sage: mtype(a>=b,'_=')
True
sage: mtype(a>=b,'_>')
True
sage: mtype(a>=b,'_>.')
False
sage: mtype(a>=b,'_>=.')
True

3. get list of operands ops(expr)
sage: a=var('a')
sage: t=1,2,a
sage: ops(t)
[1, 2, a]

sage: x=var('x')
sage: y=function('y',x)
sage: eq=diff(y,x)+y+x+1
sage: ops(eq)
[D[0](y)(x), y(x), x, 1]

sage: x,t=var('x t')
sage: y=function('y',x,t)
sage: eq=diff(y,x,t,t)
sage: q=ops(eq)
sage: q
[y(x, t), x, t, t]
sage: qq=ops(q,1)
sage: qq
y(x,t)
sage: ops(qq)
[x, t]

sage: x=var('x')
sage: ops(x)
[]

sage: ops(1)
[]

4. calculate number of operands nops(expr)
sage: a=var('a')
sage: t=1,2,a
sage: nops(t)
3

sage: x=var('x')
sage: y=function('y',x)
sage: eq=diff(y,x)+y+x+1
sage: nops(eq)
4

5.get operator op(expr)
and be sure that op(expr)(ops(expr)) - expr ==0
sage: x,t=var(x,t)
sage: f=function('f',x,t)
sage: f
f(x,t)
sage: ops(f)
[x,t]
sage: op(f)(op(f))
f(x,t)
sage: op(f)(ops(f)) - f
0

6. get subexpressions of expression by given types indets(expr,
'_.vector')
sage: x,a,b,c,t=var('x,a,b,c,t')
sage: y=function('y',t,x)
sage: eq=a*(diff(y,t,x))^2+b*diff(y,x)+3+x+ln(x+1)+c*x
sage: indets(eq,'diff')
set([D[0, 1](y)(t, x), D[1](y)(t, x)])
sage: indets(eq,'_function')
set([log(x + 1), y(t, x)])
sage: indets(eq,'_function diff')
set([D[0, 1](y)(t, x), D[1](y)(t, x), log(x + 1), y(t, x)])

sage: x,a,b,c,t=var('x,a,b,c,t')
sage: g=function('g',x)
sage: f=function('f',t,x)
sage: eq=a*x+3+b*sin(x)+ln(f+x)+tan(1/x)+g+exp(c+t)
sage: eq
a*x + b*sin(x) + e^(c + t) + log(x + f(t, x)) + tan(1/x) + g(x) +
3
sage: indets(eq,'_function')
set([sin(x), log(x + f(t, x)), f(t, x), g(x), tan(1/x), e^(c +
t)])
sage: indets(eq,'_standard.function')
set([sin(x), tan(1/x), log(x + f(t, x)), e^(c + t)])
sage: indets(eq,'_trig.standard.function')
set([sin(x), tan(1/x)])
sage: indets(eq,'_trig')
set([sin(x), tan(1/x)])
sage: indets(eq,'_logarithmic.standard.function')
set([log(x + f(t, x)), e^(c + t)])
sage: indets(eq,'_logarithmic')
set([log(x + f(t, x)), e^(c + t)])
sage: indets(eq,'log.logarithmic.standard.function')
set([log(x + f(t, x))])
sage: indets(eq,'_log')
set([log(x + f(t, x)), e^(c + t)])
sage: indets(eq,'symbolic.function')
set([f(t, x), g(x)])
sage: indets(eq,'symbolic.variable')
set([c, t, a, x, b])
sage: indets(eq,'_symbolic')
set([f(t, x), g(x), b, c, t, a, x])

sage: eq=log(x+1)+dilog(x+3)
sage: indets(eq,'_log')
set([dilog(x + 3), log(x + 1)])
sage: indets(eq,'log.logarithmic.standard.function')
set([log(x + 1)])

sage: x=var('x')
sage: eq=(x+1)^2+ln(x+1)+3+x
sage:indets(eq,'_+')
set([x+1,(x+1)^2+ln(x+1)+3+x])

sage: eq=x + log((x + 5)/7) + 5
sage: eq
x + log(1/7*x + 5/7) + 5
sage: indets(eq,'rational.number')
set([5/7, 1/7])
sage: indets(eq,'integer.number')
set([5])
sage: indets(eq,'_number')
set([5/7, 5, 1/7])


Actually all this work is done. But as I new to sage and have not so
much time it is more like good skeleton for further work in this
direction.

I will add code to trac as soon as possible.

P.S.: fill free to contact me if you are interested in or just for
feedback.

yuri.k

unread,
Mar 27, 2010, 4:46:31 PM3/27/10
to sage-devel
> I will add code to trac as soon as possible.

http://trac.sagemath.org/sage_trac/ticket/8616#comment:3

Reply all
Reply to author
Forward
0 new messages