Python, complexe types om te werken met complexe getallen (absolute waarden, declinatie, polaire transformaties, enz.)

Bedrijf

Python heeft een standaard type voor het hanteren van complexe getallen, het COMPLEX type. Als u alleen eenvoudige berekeningen wilt uitvoeren, hoeft u geen modules te importeren, maar als u de standaardbibliotheek cmath importeert, kunt u ook wiskundige functies gebruiken (exponentiële, logaritmische, trigonometrische, enz.) die overeenkomen met complexe getallen.

De volgende inhoud wordt hier uitgelegd met voorbeeldcode.

  • Genereren van complexe variabelen
  • Krijg echte en denkbeeldige delen:real,imagkenmerk
  • Krijg geconjugeerde complexe getallen:conjugate()methode
  • Absolute waarde (magnitude):abs()functie (b.v. wiskunde, programmeren, programmeren)
  • Verkrijg declinatie (fase):math,cmathmodule
  • Poolcoördinatentransformatie (polaire vormvoorstelling):math,cmathmodule
  • Berekening van complexe getallen (kwadratuur, machten, vierkantswortels)

Genereren van complexe variabelen

Denomineer de imaginaire eenheid door j en schrijf het volgende, merk op dat het niet i is.

c = 3 + 4j

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

Als het imaginaire deel 1 is, resulteert het weglaten ervan in een NameError. Als een variabele met de naam j als eerste wordt gedefinieerd, wordt hij beschouwd als die variabele.

1j
Het moet uitdrukkelijk zo worden gesteld.

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

c = 3 + 1j

print(c)
# (3+1j)

Als het reële deel 0 is, kan het worden weggelaten.

c = 3j

print(c)
# 3j

Als u een waarde met een imaginair deel van 0 als een complex type wilt definiëren, moet u 0 expliciet schrijven. Zoals hieronder beschreven, kunnen bewerkingen worden uitgevoerd tussen het complexe type en het integer type of floating-point type.

c = 3 + 0j

print(c)
# (3+0j)

Reële en imaginaire delen kunnen worden gespecificeerd als floating-point float-type. Exponentiële notatie is ook aanvaardbaar.

c = 1.2e3 + 3j

print(c)
# (1200+3j)

Het kan ook gegenereerd worden door een constructor van het type “complex”, zoals in “complex(reëel deel, imaginair deel)”.

c = complex(3, 4)

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

Krijg reële en imaginaire delen van complexe getallen: real, imagkenmerk

De reële en imaginaire delen van een complex type kunnen respectievelijk verkregen worden met de attributen real en imag. Beide zijn floating-point float-types.

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

Het is alleen-lezen en kan niet worden gewijzigd.

# c.real = 5.5
# AttributeError: readonly attribute

Krijg geconjugeerde complexe getallen: conjugate()

Om geconjugeerde complexe getallen te bekomen, gebruik de methode conjugate().

c = 3 + 4j

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

Verkrijg de absolute waarde (magnitude) van een complex getal: abs()

Om de absolute waarde (magnitude) van een complex getal te verkrijgen, gebruikt u de ingebouwde functie abs().

c = 3 + 4j

print(abs(c))
# 5.0

c = 1 + 1j

print(abs(c))
# 1.4142135623730951

Verkrijg de declinatie (fase) van een complex getal: math, cmathmodule

Om de declinatie (fase) van een complex getal te verkrijgen, gebruikt u de module math of cmath.

De module cmath is een wiskundige functiemodule voor complexe getallen.

Deze kan worden berekend met de inverse tangensfunctie math.atan2() zoals gedefinieerd, of gebruik cmath.phase(), die de declinatie (fase) teruggeeft.

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

In beide gevallen is de eenheid van hoek die kan worden verkregen radialen. Om om te rekenen naar graden, gebruik math.degrees().

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

Polaire coördinatentransformatie van complexe getallen (polaire formele voorstelling): math, cmathmodule

Zoals hierboven vermeld, kunnen de absolute waarde (magnitude) en declinatie (fase) van een complex getal verkregen worden, maar met cmath.polar(), kunnen ze samen verkregen worden als een (absolute waarde, declinatie) tupel.

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

De omzetting van poolcoördinaten naar cartesische coördinaten gebeurt met cmath.rect(). cmath.rect(absolute waarde, afwijking) en soortgelijke argumenten kunnen worden gebruikt om waarden van het equivalente complexe type te verkrijgen.

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)

De reële en imaginaire delen zijn gelijkwaardig aan de resultaten berekend door cosinus math.cos() en sinus math.sin() op basis van absolute waarden en declinatiehoeken.

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

Berekening van complexe getallen (kwadratuur, machten, vierkantswortels)

Vier rekenkundige bewerkingen en machtsberekeningen kunnen worden uitgevoerd met de gebruikelijke rekenkundige operatoren.

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)

Vierkantswortel kan berekend worden met **0.5, maar dit introduceert een fout. cmath.sqrt() kan gebruikt worden om de exacte waarde te berekenen.

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

Het kan ook rekenkundige bewerkingen uitvoeren met complexe typen, int-typen en float-typen.

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

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