¿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:

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

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.

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):

Esto ya es otra cosa 😉

¿Y qué pasa si tenemos una expresión simbólica? También podemos separarla, pero en este caso hay que tener cuidado con la definición de los símbolos:

¿Qué demonios? El problema es que, por defecto, los símbolos en SymPy pertenecen al cuerpo de los números complejos:

Observa de hecho que algunas simplificaciones no se llevarán a cabo, como se explica en la documentación:

Pero podemos crear símbolos con las propiedades (en SymPy assumptions) que nosotros queramos:

Para hallar el módulo y el argumento, empleamos las funciones abs y arg, aunque tal vez haga falta expandir la expresión primero:

Si especificamos las propiedades adecuadas, las simplificaciones se efectúan correctamente:

Quien esperase x como resultado tiene que repasar matemáticas 😉

También podemos utilizar el sistema de assumptions de SymPy (¿cómo traduciría esto?):

Y esto ya no responde a la pregunta de la semana, ¡pero seguro que resulta útil!

¡Recuerda mandarnos tu pregunta para que la contestemos semanalmente en Pybonacci! Un saludo 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

− three = six