Python tiene un tipo estándar para manejar números complejos, el tipo COMPLEX. Si sólo quieres hacer cálculos sencillos, no necesitas importar ningún módulo, pero si importas la librería estándar cmath, también puedes usar funciones matemáticas (exponenciales, logarítmicas, trigonométricas, etc.) correspondientes a números complejos.
Los siguientes contenidos se explican aquí con un código de ejemplo.
- Generar variables complejas
- Obtener partes reales e imaginarias:
real
,imag
atributo - Obtener números complejos conjugados:
conjugate()
método - Obtener el valor absoluto (magnitud):
abs()
función (por ejemplo, matemáticas, programación, programación) - Obtener la declinación (fase):
math
,cmath
módulo - Transformación de coordenadas polares (representación en forma polar):
math
,cmath
módulo - Cálculo de números complejos (cuadratura, potencias, raíces cuadradas)
- Generar variables complejas
- Obtener las partes reales e imaginarias de los números complejos: real, imagatributo
- Obtener números complejos conjugados: conjugate()
- Obtener el valor absoluto (magnitud) de un número complejo: abs()
- Obtener la declinación (fase) de un número complejo: math, cmathmódulo
- Transformación en coordenadas polares de los números complejos (representación formal polar): math, cmathmódulo
- Cálculo de números complejos (cuadratura, potencias, raíces cuadradas)
Generar variables complejas
Denote la unidad imaginaria por j y escriba lo siguiente, observe que no es i.
c = 3 + 4j
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Si la parte imaginaria es 1, al omitirla se produce un NameError. Si se define primero una variable llamada j, se considera que es esa variable.
1j
Debería ser declarado explícitamente de esta manera.
# c = 3 + j
# NameError: name 'j' is not defined
c = 3 + 1j
print(c)
# (3+1j)
Si la parte real es 0, se puede omitir.
c = 3j
print(c)
# 3j
Si desea definir un valor con una parte imaginaria de 0 como un tipo complejo, escriba 0 explícitamente. Como se describe a continuación, se pueden realizar operaciones entre el tipo complejo y el tipo entero o el tipo de punto flotante.
c = 3 + 0j
print(c)
# (3+0j)
Las partes real e imaginaria pueden especificarse como tipo float de punto flotante. También se acepta la notación exponencial.
c = 1.2e3 + 3j
print(c)
# (1200+3j)
También puede ser generado por un constructor de tipo «complejo», como en «complejo(parte real, parte imaginaria)».
c = complex(3, 4)
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Obtener las partes reales e imaginarias de los números complejos: real, imagatributo
Las partes real e imaginaria de un tipo complejo pueden obtenerse con los atributos real e imag, respectivamente. Ambos son tipos flotantes de punto flotante.
c = 3 + 4j
print(c.real)
print(type(c.real))
# 3.0
# <class 'float'>
print(c.imag)
print(type(c.imag))
# 4.0
# <class 'float'>
Es de sólo lectura y no se puede modificar.
# c.real = 5.5
# AttributeError: readonly attribute
Obtener números complejos conjugados: conjugate()
Para obtener números complejos conjugados, utilice el método conjugate().
c = 3 + 4j
print(c.conjugate())
# (3-4j)
Obtener el valor absoluto (magnitud) de un número complejo: abs()
Para obtener el valor absoluto (magnitud) de un número complejo, utilice la función incorporada abs().
c = 3 + 4j
print(abs(c))
# 5.0
c = 1 + 1j
print(abs(c))
# 1.4142135623730951
Obtener la declinación (fase) de un número complejo: math, cmathmódulo
Para obtener la declinación (fase) de un número complejo, utilice el módulo math o cmath.
El módulo cmath es un módulo de funciones matemáticas para números complejos.
Se puede calcular con la función de tangente inversa math.atan2() como se ha definido, o utilizar cmath.phase(), que devuelve la declinación (fase).
import cmath
import math
c = 1 + 1j
print(math.atan2(c.imag, c.real))
# 0.7853981633974483
print(cmath.phase(c))
# 0.7853981633974483
print(cmath.phase(c) == math.atan2(c.imag, c.real))
# True
En ambos casos, la unidad de ángulo que se puede obtener es el radio. Para convertir a grados, utilice math.degrees().
print(math.degrees(cmath.phase(c)))
# 45.0
Transformación en coordenadas polares de los números complejos (representación formal polar): math, cmathmódulo
Como se ha mencionado anteriormente, se puede obtener el valor absoluto (magnitud) y la declinación (fase) de un número complejo, pero utilizando cmath.polar(), se pueden obtener juntos como una tupla (valor absoluto, declinación).
c = 1 + 1j
print(cmath.polar(c))
print(type(cmath.polar(c)))
# (1.4142135623730951, 0.7853981633974483)
# <class 'tuple'>
print(cmath.polar(c)[0] == abs(c))
# True
print(cmath.polar(c)[1] == cmath.phase(c))
# True
La conversión de coordenadas polares a coordenadas cartesianas se realiza mediante cmath.rect(). cmath.rect(valor absoluto, desviación) y argumentos similares pueden utilizarse para obtener valores del tipo complejo equivalente.
print(cmath.rect(1, 1))
# (0.5403023058681398+0.8414709848078965j)
print(cmath.rect(1, 0))
# (1+0j)
print(cmath.rect(cmath.polar(c)[0], cmath.polar(c)[1]))
# (1.0000000000000002+1j)
Las partes real e imaginaria son equivalentes a los resultados calculados por coseno math.cos() y seno math.sin() a partir de valores absolutos y ángulos de declinación.
r = 2
ph = math.pi
print(cmath.rect(r, ph).real == r * math.cos(ph))
# True
print(cmath.rect(r, ph).imag == r * math.sin(ph))
# True
Cálculo de números complejos (cuadratura, potencias, raíces cuadradas)
Se pueden realizar cuatro operaciones aritméticas y cálculos de potencia con los operadores aritméticos habituales.
c1 = 3 + 4j
c2 = 2 - 1j
print(c1 + c2)
# (5+3j)
print(c1 - c2)
# (1+5j)
print(c1 * c2)
# (10+5j)
print(c1 / c2)
# (0.4+2.2j)
print(c1 ** 3)
# (-117+44j)
La raíz cuadrada se puede calcular con **0,5, pero introduce un error. Se puede utilizar cmath.sqrt() para calcular el valor exacto.
print((-3 + 4j) ** 0.5)
# (1.0000000000000002+2j)
print((-1) ** 0.5)
# (6.123233995736766e-17+1j)
print(cmath.sqrt(-3 + 4j))
# (1+2j)
print(cmath.sqrt(-1))
# 1j
También puede realizar operaciones aritméticas con tipos complejos, tipos int y tipos float.
print(c1 + 3)
# (6+4j)
print(c1 * 0.5)
# (1.5+2j)