¿Cómo separar parte real e imaginaria en SymPy?

Andaba yo preguntándome esta mañana, a falta (¡sorprendentemente!) de dudas de los lectores:

Si tengo un número complejo en SymPy, ¿cómo puedo separar la parte real y la parte imaginaria? Y ya puestos, ¿puedo separar también el módulo y el argumento?

Si utilizamos el tipo complex de Python el resultado es correcto pero puede no ser demasiado vistoso:

$ isympy
In [1]: (1j + 1) / (5 - 2j)
Out[1]: (0.10344827586206896+0.24137931034482757j)

Queremos usar las capacidades simbólicas de SymPy. En SymPy, como se indica en el tutorial, los complejos se declaran de esta manera:

In [2]: (1 * I + 1) / (5 - 2 * I)
Out[2]:
 1 + ⅈ
───────
5 - 2⋅ⅈ

Y ya tenemos un objeto de SymPy con toda su potencia (que además se imprime bonito). Para extraer la parte real e imaginaria podemos usar las funciones re e im o el método as_real_imag.

In [3]: a = (1 * I + 1) / (5 - 2 * I)
In [4]: re(a)
Out[4]: 3/29
In [5]: im(a)
Out[5]: 7/29
In [6]: a.as_real_imag()
Out[6]: (3/29, 7/29)

Estos métodos extraen la parte real y la imaginaria pero «pierdo» el número original. Para reescribir el número separando parte real e imaginaria lo mejor es emplear el método expand(complex=True):

In [9]: a.expand(complex=True)
Out[9]:
3    7⋅ⅈ
── + ───
29    29

Esto ya es otra cosa 😉

Continue reading