Python, tipus complexos per treballar amb nombres complexos (valors absoluts, declinació, transformacions polars, etc.)

Negocis

Python té un tipus estàndard per manejar nombres complexos, el tipus COMPLEX. Si només voleu fer càlculs senzills, no cal que importeu cap mòdul, però si importeu la biblioteca estàndard cmath, també podeu utilitzar funcions matemàtiques (exponencial, logarítmica, trigonomètrica, etc.) corresponents a nombres complexos.

Els continguts següents s’expliquen aquí amb codi d’exemple.

  • Generar variables complexes
  • Obteniu parts reals i imaginàries:real,imagatribut
  • Obtenir nombres complexos conjugats:conjugate()mètode
  • Obteniu el valor absolut (magnitud):abs()funció (per exemple, matemàtiques, programació, programació)
  • Obtenir la declinació (fase):math,cmathmòdul
  • Transformació de coordenades polars (representació de forma polar):math,cmathmòdul
  • Càlcul de nombres complexos (quadratura, potències, arrels quadrades)

Generar variables complexes

Denota la unitat imaginària amb j i escriu el següent, observa que no és i.

c = 3 + 4j

print(c)
print(type(c))
# (3+4j)
# <class 'complex'>

Si la part imaginària és 1, ometre-la provoca un NameError. Si es defineix primer una variable anomenada j, es considera que és aquesta variable.

1j
S’hauria d’expressar d’aquesta manera.

# c = 3 + j
# NameError: name 'j' is not defined

c = 3 + 1j

print(c)
# (3+1j)

Si la part real és 0, es pot ometre.

c = 3j

print(c)
# 3j

Si voleu definir un valor amb una part imaginària de 0 com a tipus complex complex, escriviu 0 explícitament. Tal com es descriu a continuació, es poden realitzar operacions entre el tipus complex i el tipus enter o el tipus de coma flotant.

c = 3 + 0j

print(c)
# (3+0j)

Les parts reals i imaginàries es poden especificar com a tipus flotant de coma flotant. La notació exponencial també és acceptable.

c = 1.2e3 + 3j

print(c)
# (1200+3j)

També pot ser generat per un constructor de tipus “complex”, com en “complex(part real, part imaginària)”.

c = complex(3, 4)

print(c)
print(type(c))
# (3+4j)
# <class 'complex'>

Obtenir parts reals i imaginàries de nombres complexos:real,imagatribut

Les parts real i imaginària d’un tipus complex complex es poden obtenir amb els atributs real i imatge, respectivament. Tots dos són tipus flotant de coma flotant.

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'>

És només de lectura i no es pot canviar.

# c.real = 5.5
# AttributeError: readonly attribute

Obtenir nombres complexos conjugats:conjugate()

Per obtenir nombres complexos conjugats, utilitzeu el mètode conjugate().

c = 3 + 4j

print(c.conjugate())
# (3-4j)

Obtenir el valor absolut (magnitud) d’un nombre complex:abs()

Per obtenir el valor absolut (magnitud) d’un nombre complex, utilitzeu la funció incorporada abs().

c = 3 + 4j

print(abs(c))
# 5.0

c = 1 + 1j

print(abs(c))
# 1.4142135623730951

Obtenir la declinació (fase) d’un nombre complex:math,cmathmòdul

Per obtenir la declinació (fase) d’un nombre complex, utilitzeu el mòdul matemàtic o cmath.

El mòdul cmath és un mòdul de funcions matemàtiques per a nombres complexos.

Es pot calcular amb la funció de tangent inversa math.atan2() tal com es defineix, o utilitzar cmath.phase(), que retorna la declinació (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 ambdós casos, la unitat d’angle que es pot obtenir són els radians. Per convertir en graus, utilitzeu math.degrees().

print(math.degrees(cmath.phase(c)))
# 45.0

Transformació de coordenades polars de nombres complexos (representació formal polar):math,cmathmòdul

Com s’ha esmentat anteriorment, es poden obtenir el valor absolut (magnitud) i la declinació (fase) d’un nombre complex, però utilitzant cmath.polar(), es poden obtenir junts com una tupla (valor absolut, declinació).

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ó de coordenades polars a coordenades cartesianes es fa mitjançant cmath.rect(). cmath.rect(valor absolut, desviació) i arguments similars es poden utilitzar per obtenir valors del tipus complex complex complex equivalent.

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)

Les parts real i imaginària són equivalents als resultats calculats per cosinus math.cos() i sinus math.sin() a partir de valors absoluts i angles de declinació.

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àlcul de nombres complexos (quadratura, potències, arrels quadrades)

Es poden realitzar quatre operacions aritmètiques i càlculs de potència utilitzant els operadors aritmètics habituals.

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)

L’arrel quadrada es pot calcular amb **0,5, però introdueix error. cmath.sqrt() es pot utilitzar per calcular el valor exacte.

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

També pot realitzar operacions aritmètiques amb tipus complexos, tipus int i tipus float.

print(c1 + 3)
# (6+4j)

print(c1 * 0.5)
# (1.5+2j)