Διαδρομές
/
Python
Python
/
Ύλη
/
Μιγαδικοί αριθμοί
Μι

Μιγαδικοί αριθμοί σε Python

{one: "1 άσκηση", other: "%{count} ασκήσεις"}

Σχετικά με την έννοια Μιγαδικοί αριθμοί

Τα Complex numbers δεν είναι περίπλοκα. Απλώς χρειάζονται ένα λιγότερο ανησυχητικό όνομα.

Είναι τόσο χρήσιμα, ειδικά στη μηχανική και στις επιστήμες, που η Python περιλαμβάνει τον complex ως τυπικό αριθμητικό τύπο, μαζί με τους ακέραιους (ints) και τους αριθμούς κινητής υποδιαστολής (floats).

Τα βασικά

Μια τιμή complex στην Python είναι ουσιαστικά ένα ζεύγος αριθμών κινητής υποδιαστολής. Αυτά ονομάζονται "πραγματικό" και "φανταστικό" μέρος, για ατυχείς ιστορικούς λόγους. Και πάλι, είναι καλύτερα να εστιάσεις στην υποκείμενη απλότητα και όχι στα παράξενα ονόματα.

Υπάρχουν δύο συνηθισμένοι τρόποι για να δημιουργήσεις μιγαδικούς αριθμούς.

  1. Ο κατασκευαστής complex(real, imag) δέχεται δύο παραμέτρους float:
>>> z1 = complex(1.5, 2.0)
>>> z1
(1.5+2j)

Ο κατασκευαστής μπορεί επίσης να αναλύσει είσοδο σε μορφή συμβολοσειράς. Έχει τον παράξενο περιορισμό ότι αποτυγχάνει αν η συμβολοσειρά περιέχει κενά.

>>> complex('4+2j')
(4+2j)

>>> complex('4 + 2j')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string
  1. Ο μιγαδικός αριθμός μπορεί να δοθεί απευθείας ως <real part> + <complex part>j, ή απλώς ως <complex part>j αν το πραγματικό μέρος είναι μηδέν:
>>> z2 = 2.0 + 1.5j
>>> z2
(2+1.5j)

Το τελικό αποτέλεσμα είναι ίδιο με τη χρήση του κατασκευαστή complex().

Υπάρχουν δύο κανόνες για το φανταστικό μέρος του μιγαδικού αριθμού:

  • Συμβολίζεται με j (όχι με i, όπως μπορεί να δεις σε μαθηματικά βιβλία).

  • Το j πρέπει να ακολουθεί αμέσως έναν αριθμό, ώστε η Python να μην το εκλάβει ως όνομα μεταβλητής. Αν χρειάζεται, χρησιμοποίησε το 1j.

>>> j
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined

>>> 1j
1j

>>> type(1j)
<class 'complex'>

Οι περισσότεροι μηχανικοί είναι ευχαριστημένοι με το j. Οι περισσότεροι επιστήμονες και μαθηματικοί προτιμούν τον μαθηματικό συμβολισμό i για το φανταστικό, αλλά ο συμβολισμός αυτός συγκρούεται με τη χρήση του i για το ρεύμα στην ηλεκτρολογική μηχανική. Έτσι, όταν σχεδιάστηκε η Python, κέρδισαν οι ηλεκτρολόγοι μηχανικοί.

Για να προσπελάσεις τα μέρη ενός μιγαδικού αριθμού ξεχωριστά:

>>> z2.real
2.0
>>> z2.imag
1.5

Οποιοδήποτε από τα δύο μέρη μπορεί να είναι μηδέν, και τότε οι μαθηματικοί μπορεί να μιλήσουν για τον αριθμό ως "εντελώς πραγματικό" ή "εντελώς φανταστικό". Ωστόσο, στην Python παραμένει μιγαδικός αριθμός:

>>> complex(0, 1)
1j
>>> type(complex(0, 1))
<class 'complex'>

>>> complex(1, 0)
(1+0j)

Μπορεί να έχεις ακούσει ότι "το i (ή το j) είναι η τετραγωνική ρίζα του -1".

Για την ώρα, αυτό σημαίνει μόνο ότι το φανταστικό μέρος εξ ορισμού ικανοποιεί την ισότητα

1j * 1j == -1  # => True

Είναι μια απλή ιδέα, αλλά οδηγεί σε ενδιαφέροντα συμπεράσματα.

Αριθμητικές πράξεις

Οι περισσότεροι από τους operators που χρησιμοποιούνται με αριθμούς κινητής υποδιαστολής και ακέραιους λειτουργούν και με μιγαδικούς αριθμούς:

>>> z1 = (1.5+2j)
>>> z2 = (2+1.5j)


>>> z1 + z2  # addition
(3.5+3.5j)

>>> z1 - z2  # subtraction
(-0.5+0.5j)

>>> z1 * z2  # multiplication
6.25j

>>> z1 / z2  # division
(0.96+0.28j)

>>> z1 ** 2  # exponentiation
(-1.75+6j)

>>> 2 ** z1  # another exponentiation
(0.5188946835878313+2.7804223253571183j)

>>> 1j ** 2  # j * j == -1
(-1+0j)

Η εξήγηση των κανόνων για τον πολλαπλασιασμό και τη διαίρεση μιγαδικών αριθμών ξεφεύγει από το πλαίσιο αυτής της έννοιας (και είναι απίθανο να χρειαστεί να κάνεις αυτές τις πράξεις "με το χέρι" πολύ συχνά).

Οποιαδήποτε μαθηματική ή ηλεκτρολογική εισαγωγή στους μιγαδικούς αριθμούς καλύπτει αυτό το θέμα, αν θέλεις να εμβαθύνεις.

Εναλλακτικά, το Exercism έχει μια άσκηση Complex Numbers όπου μπορείς να υλοποιήσεις μια κλάση μιγαδικών αριθμών με αυτές τις πράξεις από πρώτες αρχές.

Η ακέραια διαίρεση δεν είναι δυνατή στους μιγαδικούς αριθμούς, οπότε οι τελεστές // και % και η συνάρτηση divmod() θα αποτύχουν για τον τύπο των μιγαδικών αριθμών.

Υπάρχουν δύο συναρτήσεις που υλοποιούνται για αριθμητικούς τύπους και είναι πολύ χρήσιμες όταν δουλεύεις με μιγαδικούς αριθμούς:

  • Η <complex number>.conjugate() απλώς αντιστρέφει το πρόσημο του φανταστικού μέρους ενός μιγαδικού αριθμού (από + σε - ή αντίστροφα).
    • Λόγω του τρόπου που λειτουργεί ο πολλαπλασιασμός μιγαδικών, είναι πιο χρήσιμη απ' όσο νομίζεις.
  • Η abs(<complex number>) εγγυάται ότι επιστρέφει έναν πραγματικό αριθμό χωρίς φανταστικό μέρος.
>>> z1
(1.5+2j)

>>> z1.conjugate() # flip the z1.imag sign
(1.5-2j)

>>> abs(z1) # sqrt(z1.real ** 2 + z1.imag ** 2)
2.5

Η ενότητα cmath

Η τυπική βιβλιοθήκη της Python έχει μια ενότητα math γεμάτη χρήσιμες λειτουργίες για εργασία με πραγματικούς αριθμούς.

Έχει επίσης μια αντίστοιχη ενότητα cmath για εργασία με μιγαδικούς αριθμούς.

Σε ενθαρρύνουμε να διαβάσεις την ενότητα και να πειραματιστείς, αλλά οι κύριες κατηγορίες είναι:

  • Μετατροπή μεταξύ καρτεσιανών και πολικών συντεταγμένων,
  • Εκθετικές και λογαριθμικές συναρτήσεις,
  • Τριγωνομετρικές συναρτήσεις,
  • Υπερβολικές συναρτήσεις,
  • Συναρτήσεις ταξινόμησης, και
  • Χρήσιμες σταθερές.

Ακολουθεί ένα παράδειγμα που χρησιμοποιεί κάποιες σταθερές:

>>> import cmath

>>> euler = cmath.exp(1j * cmath.pi) # Euler's equation

>>> euler.real
-1.0
>>> round(euler.imag, 15) # round to 15 decimal places
0.0

Έτσι, μια απλή έκφραση με τρεις από τις σημαντικότερες σταθερές της φύσης, e, i (ή j) και pi, δίνει ως αποτέλεσμα -1. Κάποιοι πιστεύουν ότι αυτό είναι το ομορφότερο αποτέλεσμα σε όλα τα μαθηματικά. Χρονολογείται γύρω στο 1740.


Προαιρετικό τμήμα: συχνές ερωτήσεις για τους μιγαδικούς αριθμούς

Μπορείς να παραλείψεις αυτό το τμήμα, εκτός αν σε ενδιαφέρει.

Δεν είναι αυτά κάποιο παράξενο νέο κομμάτι των καθαρών μαθηματικών;

Ήταν παράξενα και νέα τον 16ο αιώνα.

500 χρόνια αργότερα, βρίσκονται στο επίκεντρο της μηχανικής και των φυσικών επιστημών.

Γιατί να τα χρησιμοποιήσει κανείς;

Αποδεικνύεται ότι οι μιγαδικοί αριθμοί είναι ο απλούστερος τρόπος να περιγράψεις οτιδήποτε περιστρέφεται ή οτιδήποτε έχει κυματική φύση. Γι' αυτό χρησιμοποιούνται ευρέως στην ηλεκτρολογική μηχανική, στην επεξεργασία ήχου, στη φυσική, στα βιντεοπαιχνίδια και στη ναυσιπλοΐα, για να αναφέρουμε μόνο μερικές εφαρμογές.

Μπορείς να δεις πράγματα να περιστρέφονται. Οι μιγαδικοί αριθμοί μπορεί να μην κάνουν τον κόσμο να γυρίζει, αλλά είναι εξαιρετικοί στο να εξηγούν τι συμβαίνει όταν ο κόσμος γυρίζει: κοίταξε οποιαδήποτε δορυφορική εικόνα μιας μεγάλης καταιγίδας.

Λιγότερο προφανώς, ο ήχος έχει κυματική φύση, το φως έχει κυματική φύση, τα ραδιοσήματα έχουν κυματική φύση, και ακόμη και η οικονομία της χώρας σου είναι τουλάχιστον εν μέρει κυματική.

Μεγάλο μέρος αυτής της επεξεργασίας κυμάτων μπορεί να γίνει με τριγωνομετρικές συναρτήσεις (sin() και cos()), αλλά αυτό γίνεται περίπλοκο αρκετά γρήγορα.

Οι μιγαδικές εκθετικές συναρτήσεις είναι πολύ πιο εύκολες στη χρήση.

Μα εγώ δεν χρειάζομαι μιγαδικούς αριθμούς!

Αυτό ισχύει μόνο αν ζεις σε μια σπηλιά και μαζεύεις την τροφή σου.

Αν το διαβάζεις αυτό σε οποιαδήποτε οθόνη, εξαρτάσαι απόλυτα από κάποιες χρήσιμες προόδους του 20ού αιώνα που έγιναν χάρη στη χρήση μιγαδικών αριθμών.

  1. Ημιαγωγά τσιπ.

    • Δεν έχουν κανένα νόημα στην κλασική φυσική και μπορούν να εξηγηθούν (και να σχεδιαστούν) μόνο από την κβαντική μηχανική (ΚΜ).
    • Στην κβαντική μηχανική, τα πάντα είναι μιγαδικά εξ ορισμού. (είναι κυματομορφές μέχρι κάτω)
  2. Ο αλγόριθμος του Γρήγορου Μετασχηματισμού Fourier (FFT).

    • Ο FFT είναι μια εφαρμογή των μιγαδικών αριθμών και βρίσκεται σε όλα όσα σχετίζονται με τη μετάδοση ήχου, την επεξεργασία ήχου, τις φωτογραφίες και το βίντεο.

    • Το MP3 και άλλες μορφές ήχου χρησιμοποιούν τον FFT για συμπίεση, ώστε να χωράει περισσότερος ήχος σε μικρότερο χώρο αποθήκευσης.

    • Η συμπίεση JPEG και το βίντεο MP4, μαζί με πολλές άλλες μορφές εικόνας και βίντεο, χρησιμοποιούν επίσης τον FFT για συμπίεση.

    • Ο FFT χρησιμοποιείται επίσης στα ψηφιακά φίλτρα που επιτρέπουν στις κεραίες κινητής τηλεφωνίας να ξεχωρίζουν το προσωπικό σου σήμα από όλα τα άλλα.

Οπότε, μάλλον χρησιμοποιείς τεχνολογία που βασίζεται σε υπολογισμούς μιγαδικών αριθμών χιλιάδες φορές το δευτερόλεπτο.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα