The code needs a small edit to work properly with many functions (it
requires sympy imported as sy):
def parse_imaginary_real(expression):
"""
It takes an expression and parse correctly the imaginary and real part
of first derivatives of a
real or imaginary function.
This function works only for first derivatives.
It could be extended easily to work with second or higher order
derivatives as well.
"""
all_variables = globals()
# Get the variables that are functions
all_functions = [x for x in all_variables.values() if isinstance(x,
sy.Function)]
new_exp = expression
for f in all_functions:
if f.is_real:
new_exp = new_exp.subs(sy.im(sy.diff(f)),
0).subs(sy.re(sy.diff(f)), sy.diff(f))
elif f.is_imaginary:
new_exp = new_exp.subs(sy.im(sy.diff(f)),
sy.diff(f)).subs(sy.re(sy.diff(f)), 0)
return new_exp
Il giorno sabato 29 febbraio 2020 12:20:03 UTC+1, Lorenzo Monacelli ha
scritto:
>
> I have found a simple workaround for this problem. I implemented a
> function that performs a hardcore substitution of the expression:
>
> def parse_imaginary_real(expression):
> """
> It takes an expression and parse correctly the imaginary and real part
> of first derivatives of a
> real or imaginary function.
>
> This function works only for first derivatives.
> It could be extended easily to work with second or higher order
> derivatives as well.
>
> """
> all_variables = globals()
>
> # Get the variables that are functions
> all_functions = [x for x in all_variables.values() if isinstance(x,
> sy.Function)]
>
> new_exp = expression
> for f in all_functions:
> if f.is_real:
> new_exp = expression.subs(sy.im(sy.diff(f)),
> 0).subs(sy.re(sy.diff(f)),
> sy.diff(f))
> elif f.is_imaginary:
> new_exp = expression.subs(sy.im(sy.diff(f)), sy.diff(f)).subs(
> sy.re(sy.diff(f)), 0)
>
> return new_exp
>
>
> This function can be used as simplify to an expression. Indeed, it has
> still some issues: it does not check the type of the argument, and it
> simplifies only first derivatives (and I think it could be very slow if
> many variables have been defined, I do not know very well how the globals()
> can work if the function is used on a library).
>
> However, for my simple case, it does the job and allows me to go over,
> simplifying the imaginary and real parts of first derivatives that are zero
> by definition. I hope it can be useful for other users.
> Bests,
> Lorenzo
>
> Il giorno venerdì 28 febbraio 2020 20:02:51 UTC+1, Aaron Meurer ha scritto:
>>
>> There is an open issue about this
>> https://github.com/sympy/sympy/issues/11868.
>>
>> Aaron Meurer
>>
>> On Fri, Feb 28, 2020 at 12:00 PM Lorenzo Monacelli
>> <[email protected]> wrote:
>> >
>> > Dear all,
>> > I have a complex expression and I want to separate imaginary and real
>> part, however I noticed that when I have derivatives on a function, the
>> real and imaginary part separation does not work properly:
>> >
>> > t = sy.Symbol("t", real = True)
>> > f = sy.Function("f", real = True)(t)
>> >
>> > Then if I ask sympy the imaginary part of f, it correctly returns 0,
>> however if I ask the immaginary part of the derivative of f, it is not able
>> to see that it is zero:
>> >
>> > sy.im(f) # this is zero (ok!)
>> > sy.im(sy.diff(f, t)) # does not simplify to zero
>> >
>> > How can I force sympy to set automatically the derivative of f to real
>> numbers?
>> > Thanks in advance for the help,
>> > Bests,
>> > Lorenzo
>> >
>> > --
>> > 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 [email protected].
>> > To view this discussion on the web visit
>> https://groups.google.com/d/msgid/sympy/dec5a368-f065-4a1f-b5da-9bb2b4f74559%40googlegroups.com.
>>
>>
>>
>
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/f4ae5248-196a-4735-a60e-8af5729928c2%40googlegroups.com.