Mathematical substitution in SymPy

133 views
Skip to first unread message

Adrián Ashley

unread,
Aug 13, 2015, 2:54:10 PM8/13/15
to sympy
Hello,

How can I substitute/replace something mathematically from an expression:

For example:

>>> exp(5*x).xreplace({exp(x): sin(x)})
>>> exp(5*x)   # I would expect sin(x)**5 here


In better way to do the above thing?

Thanks,
Best,

--
Adrian

Sartaj Singh

unread,
Aug 13, 2015, 4:18:44 PM8/13/15
to sy...@googlegroups.com
Try this,

>>> exp(5*x).xreplace({exp(5*x): sin(5*x)})
sin(5*x)

--
You received this message because you are subscribed to the Google Groups "sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sympy+un...@googlegroups.com.
To post to this group, send email to sy...@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/4be0109e-a665-4c89-8774-0300163250f0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Regards
Sartaj Singh

Mathematics and Computing,
Indian Institute of Technology,
Varanasi - 221 005 INDIA

Adrián Ashley

unread,
Aug 14, 2015, 2:25:55 AM8/14/15
to sympy
Hi Sartaj,

I think you didn't understood my point. I am looking for mathematical substitution, not exact
substitution.

exp(5*x).xreplace({exp(5*x): sin(5*x)}) is just a mere example of usage of xreplace. I am not
looking for exact replacement. the exponent can be anything

For example:

>>> sin(exp(x)).some_replace_func({exp: x})

>>> sin(x)

>>> exp(5*x).some_replace_func({exp(x): sin(x)})
>>> exp(5*x)


Thanks,
Best,

Adrian

Adrián Ashley

unread,
Aug 14, 2015, 2:33:08 AM8/14/15
to sympy
Correction previous example:

In [9]: sin(exp(a*x)).some_replace_func({exp(x): x})
Out[9]: sin(x**a)

Gaurav Dhingra

unread,
Aug 14, 2015, 2:38:25 AM8/14/15
to sympy
Do you want something like replacing some function f1 (say `exponential function` you mentioned `{exp(x): x}` ) with some other f2 (say linear function, you mentioned `{exp(x): x}`  ) in your expression ?
Message has been deleted

Aaron Meurer

unread,
Aug 14, 2015, 2:41:31 PM8/14/15
to sy...@googlegroups.com
xreplace only does exact structural replacement (the "x" stands for "exact"). To get mathematical replacement, use subs:

>>> print(exp(5*x).subs(exp(x), sin(x)))
sin(x)**5

Aaron Meurer

On Fri, Aug 14, 2015 at 5:17 AM, AMiT Kumar <dtu....@gmail.com> wrote:
I am also Interested in getting the solution for this.

AMiT Kumar

Adrián Ashley

unread,
Aug 14, 2015, 2:48:48 PM8/14/15
to sympy

Hi, 

Thanks for the workaround, but

subs doesn't work here:

>>> sin(exp(a*x)).subs({exp(x): x})
>>> sin(exp(a*x))


Best,
Adrian

Aaron Meurer

unread,
Aug 14, 2015, 2:58:20 PM8/14/15
to sy...@googlegroups.com
subs is limited on how smart it is. I think it only works for numerical coefficients.

Also note that exp(a*x) != exp(x)**a in general (take x = 2*pi*I and a = 1/2). It should be true if a is an integer, though (but subs doesn't handle it if you set a = Symbol('a', integer=True)).

If you know what form of expression you want to replace, you can use the replace() method with Wilds, like

In [26]: b = Wild('b', exclude=[x])

In [27]: print(exp(a*x).replace(exp(b*x), sin(x)**b))
sin(x)**a

Aaron Meurer


Richard Fateman

unread,
Aug 18, 2015, 11:54:25 PM8/18/15
to sympy
You could look at Maxima's  ratsubst command for ideas about what could be
done.

ratsubst(y, exp(x), exp(5*x))  returns y^5.

RJF
Reply all
Reply to author
Forward
0 new messages