Normalerweise schreibe ich einen Quantencomputersimulator in Python. Aus diesem Grund werden sehr häufig komplexe Zahlen verwendet.
Python und Numpy unterstützen auch komplexe Zahlen, daher ist dies kein allzu großes Problem, aber es gibt einige Fallen, daher werde ich sie alle zusammenfassen.
Dies ist die, die Sie normalerweise in der Referenz finden. Leicht überprüfen.
In der Mathematik wird i oft für imaginäre Einheiten verwendet, in Python wird jedoch "1j" verwendet. (In Bereichen wie Elektrizität habe ich gesehen, dass i für Strom verwendet wird, daher wird die imaginäre Einheit auf j gesetzt, aber ich weiß nichts anderes in anderen Bereichen)
Sie können auch so etwas wie "2j" oder "1.23j" schreiben. (Normalerweise bedeutet doppelt so viel wie "1j", 1,23 mal) Während "1" und "1." unterschiedliche Typen haben, sind "1j" und "1.j" beide gleich.
Sie können auch "a + b * 1. j" als "Komplex (a, b)" mit a und b als Gleitkommazahlen schreiben.
(1 + 2j) .real
ist 1
, (1 + 2j) .imag
ist 2
. Beachten Sie, dass es sich nicht um eine Methode handelt. Fügen Sie daher nicht ()
hinzu.
Komplexe Konjugate verwenden ".conjugate ()", wie "(1 + 2j) .conjugate ()". Da dies eine Methode ist, ist ()
erforderlich.
Übrigens können ".real", ".imag", "conjugate ()" tatsächlich für float und int verwendet werden.
Selbst mit numpy können Sie normalerweise komplexe Zahlen verwenden, z. B. "np.array ([1 + 2j, 3, 4j, 5 + 6.7j])". Zu diesem Zeitpunkt ist "dtype" standardmäßig "complex128".
.real
, .imag
, .conjugate ()
kann auch für numpy Arrays verwendet werden.
In numpy können Sie auch ".conj ()" anstelle von ".conjugate ()" verwenden.
Zusätzlich ist es notwendig, ".conj (). T" zu verwenden, um das Elmeet-Konjugat der Matrix zu nehmen, was ein wenig mühsam ist.
Mit np.matrix
war es möglich mit .H
. Es scheint nicht in "np.array" zu sein.
cmath
statt math
Verwenden Sie "cmath importieren" anstelle von "Mathematik importieren". Während die Funktion "math" reelle Zahlen in der Definition und im Bereich verwendet, enthält "cmath" auch komplexe Zahlen in der Definition und im Bereich. Weitere Informationen finden Sie unter Offizielle Dokumentation.
Es gibt auch nützliche Funktionen wie "phase ()", um die Abweichung einer komplexen Zahl zu ermitteln, "polar ()", um einen Tapple mit Radius und Abweichung zurückzugeben, und "rect ()", um einen Komplex aus Radius und Abweichung zu erstellen. ..
Ich werde einige Fallen schreiben und wie ich damit umgehen soll.
Python konvertiert den Typ implizit, ohne den Typ selbst zu schreiben, aber in numpy hat das Array einen Typ, und der Typ des Arrays ändert sich nicht willkürlich. (Dasselbe gilt, wenn das int-Array kein Float wird.)
a = np.array([1., 2.]) #dtype ist float64
a *= 1j
# UFuncTypeError: Cannot cast ufunc 'multiply' output from dtype('complex128') to dtype('float64') with casting rule 'same_kind'
Um dies zu verhindern Geben Sie den Typ von Anfang an wie "np.array ([1., 2.], dtype = np.complex128)" an Es ist notwendig, von Anfang an komplexe Zahlen wie "np.array ([1 + 0j, 2.], dtype = np.complex128)" einzuschließen.
Das ist wirklich eine Falle.
Das innere Produkt des komplexen Vektors ist die Summe des Produkts des komplexen Konjugats von $ u $ und des Produkts jeder Komponente von $ v $, wie z. B. $ u \ cdot v = \ sum_ {i = 1} ^ n u_i ^ * v_i $. Ist normal, aber in "np.dot" wird die Summe der Produkte jeder Komponente so genommen, wie sie ist, ohne das komplexe Konjugat zu nehmen. Wenn Sie wirklich "np.dot" verwenden müssen, nehmen Sie das komplexe Konjugat selbst. Wenn Sie dagegen "np.vdot" verwenden, können Sie das innere Produkt auch dann richtig erhalten, wenn es sich um einen komplexen Vektor handelt.
Natürlich für alle, die sich mit komplexen Zahlen in anderen Sprachen beschäftigen. Komplexe Zahlen können nicht verglichen werden.
Genauer gesagt ist es nicht möglich, die Größe des "komplexen Typs" zu vergleichen. Selbst wenn der Programmierer weiß, dass das Berechnungsergebnis eine reelle Zahl ist, kann es nicht verglichen werden, wenn es sich um einen komplexen Zahlentyp für den Computer handelt. Es muss eine reelle Zahl sein, z. B. ".real".
Da np.abs
intern so etwas wie sqrt (real ** 2 + imag ** 2)
berechnet, ist es verschwenderisch, es zu quadrieren.
Wenn Sie dagegen eine Berechnung wie "arr.real ** 2 + arr.imag ** 2" auf der Python-Seite schreiben, wird diese nicht direkt berechnet, was zu einer Verschwendung von Speicherplatz führt.
Ich habe es schon einmal recherchiert, aber StackOverflow sagt, dass numba verwendet werden kann -of-complex-numpy-ndarray). Es scheint, dass es keinen überraschenden Weg gibt, dies ohne unnötige Open-Flat-Berechnung nur mit Python und Numpy zu tun.
Recommended Posts