You can generally do this sort of thing using replace().
Unfortunately, the pattern matcher doesn't recognize rational numbers
as a/b, so  you have to do a more manual check. This should work:

e.replace(lambda i: i.is_Pow and i.base == x and i.exp.is_Rational,
lambda i: real_root(-1,
i.exp.as_numer_denom()[1])**i.exp.as_numer_denom()[0])

(replace -1 with whatever value you want to replace). A "cleaner"
solution would be to create a custom Pow subclass that evaluates like
you want, and replace instances of Pow with your class before doing a
substitution.

Aaron Meurer

On Wed, Nov 4, 2015 at 1:19 PM, Paul Royik <distantjob...@gmail.com> wrote:
> So, there is no way to do it using subs and/or some manipulations?
>
> real_root(-1, 3) is of no help, because I can have arbitrary expression.
>
> On Wednesday, November 4, 2015 at 6:29:29 PM UTC+2, Aaron Meurer wrote:
>>
>> You need to use real_root, like
>>
>> In [3]: real_root(-1, 3)
>> Out[3]: -1
>>
>> In [4]: real_root(-1, 3)**2
>> Out[4]: 1
>>
>> SymPy, like most math libraries, uses complex roots (i.e., principal
>> roots) because they have nicer mathematical properties.
>>
>> Aaron Meurer
>>
>> On Wed, Nov 4, 2015 at 3:30 AM, Paul Royik <distan...@gmail.com> wrote:
>> > I have the following expresssion:
>> >
>> > f=x**(Rational(2,3))
>> >
>> > How can I get 1, when substituting (-1) instead of complex number?
>> > For now, I got complex number when run f.subs(x,-1).evalf()
>> >
>> > --
>> > 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/662a2085-1030-42d5-bbde-feb524fd246c%40googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>
> --
> 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+unsubscr...@googlegroups.com.
> To post to this group, send email to sympy@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/c88261c0-3449-4d7a-abf8-8d28ebdca59d%40googlegroups.com.
>
> For more options, visit https://groups.google.com/d/optout.

-- 
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+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@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/CAKgW%3D6%2Bk-X%2BVqRVc2eWs0mDZmRe4Wf9kRtsM0RS8C6H21K-Pzw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to