Οι Complex numbers δεν είναι περίπλοκοι.
Χρειάζονται απλώς ένα λιγότερο ανησυχητικό όνομα.
Είναι τόσο χρήσιμοι, ειδικά στη μηχανική και τις επιστήμες, που η R τους περιλαμβάνει ως τυπικούς ατομικούς τύπους, μαζί με τους integer, double, logical, character και raw.
Ένας complex αριθμός στην R είναι μία μόνο τιμή.
Στην πράξη όμως, μπορεί να θεωρηθεί ως ένα ζεύγος αριθμών.
Αυτά ονομάζονται το "πραγματικό" και το "φανταστικό" μέρος, για άτυχους ιστορικούς λόγους.
Και πάλι, το καλύτερο είναι να εστιάσεις στη βασική απλότητα και όχι στα περίεργα ονόματα.
Για να δημιουργήσεις μιγαδικούς αριθμούς από δύο πραγματικούς αριθμούς, απλώς πρόσθεσε το επίθημα i στο φανταστικό μέρος.
2+3i
#> [1] 2+3i
typeof(2+3i)
#> [1] "complex"
Για να δημιουργήσεις έναν μιγαδικό αριθμό από πραγματικές μεταβλητές, η παραπάνω σύνταξη δεν θα δουλέψει.
Γράφοντας r + imi μπερδεύεις τον parser, κάνοντάς τον να νομίζει ότι το imi είναι όνομα (ανύπαρκτης) μεταβλητής.
Είτε πολλαπλασίασε το φανταστικό μέρος με 1i είτε χρησιμοποίησε τη συνάρτηση [complex()][ref-complex]:
r <- 2
im <- 3
r + im * 1i
#> [1] 2+3i
# must include the `real` and `imaginary` keywords
complex(real = r, imaginary = im)
#> [1] 2+3i
Μπορεί να αναρωτιέσαι, γιατί i και όχι j;
Οι περισσότεροι μηχανικοί προτιμούν το j.
Οι περισσότεροι επιστήμονες και μαθηματικοί προτιμούν τον μαθηματικό συμβολισμό i για το φανταστικό, αλλά αυτός ο συμβολισμός συγκρούεται με τη χρήση του i για να σημαίνει ρεύμα στη μηχανική ηλεκτρολογίας.
Η R επέλεξε το i, η Python επέλεξε το j, και η Julia απέφυγε τη διαμάχη επιλέγοντας το im.
Πρόσεχε όταν εναλλάσσεις μεταξύ γλωσσών προγραμματισμού [STEM][wiki-STEM].
Για να προσπελάσεις τα μέρη ενός μιγαδικού αριθμού ξεχωριστά:
z <- 2+3i
Re(z) # real part
#> [1] 2
Im(z) # imaginary part
#> [1] 3
Οποιοδήποτε από τα δύο μέρη μπορεί να είναι μηδέν, και οι μαθηματικοί μπορεί τότε να μιλήσουν για τον αριθμό ως "εντελώς πραγματικό" ή "εντελώς φανταστικό". Ωστόσο, παραμένει μιγαδικός αριθμός στην R.
1.2 + 0i
#> [1] 1.2+0i
typeof(1.2 + 0i)
#> [1] "complex"
2i
#> [1] 0+2i
typeof(2i)
#> [1] "complex"
Μπορεί να έχεις ακούσει ότι το i (ή το j) είναι η τετραγωνική ρίζα του -1.
Για την ώρα, το μόνο που σημαίνει αυτό είναι ότι το φανταστικό μέρος εξ ορισμού ικανοποιεί την παρακάτω ισότητα:
1i * 1i == -1 # more precisely, 1i * 1i == -1 + 0i
#> [1] TRUE
Αυτή είναι μια απλή ιδέα, αλλά οδηγεί σε ενδιαφέρουσες συνέπειες.
Οι περισσότεροι τελεστές που χρησιμοποιούνται με floats και ακέραιους λειτουργούν επίσης με μιγαδικούς αριθμούς:
z1 = 1.5 + 2i
z2 = 2 + 1.5i
z1 + z2 # addition
#> [1] 3.5+3.5i
z1 * z2 # multiplication
#> [1] 0+6.25i
z1 / z2 # division
#> [1] 0.96+0.28i
z1^2 # exponentiation
#> [1] -1.75+6i
2^z1 # another exponentiation
#> [1] 0.518895+2.780422i
Οι περισσότερες μαθηματικές συναρτήσεις λειτουργούν με μιγαδικές εισόδους.
Υπάρχουν αρκετές συναρτήσεις, πέρα από τις Re() και Im(), με ιδιαίτερη σημασία για τους μιγαδικούς αριθμούς.
Conj() απλώς αντιστρέφει το πρόσημο του φανταστικού μέρους ενός μιγαδικού αριθμού (από + σε - ή και αντίστροφα).
abs(<complex number>) επιστρέφει σίγουρα έναν πραγματικό αριθμό χωρίς φανταστικό μέρος (το "μέτρο" της), και η Mod(<complex number>) είναι συνώνυμη.Arg(<complex number>) επιστρέφει τη γωνία φάσης σε ακτίνια.z1
#> [1] 1.5+2i
abs(z1)
#> [1] 2.5
Mod(z1) # same as previous
#> [1] 2.5
Conj(z1) # flip sign
#> [1] 1.5-2i
Arg(z1)
#> [1] 0.9272952
Μόλις προσλήφθηκες σε μια νέα υπηρεσία ταξί που προσπαθεί να ξεχωρίσει από τις άλλες προσφορές σε μια ήδη κορεσμένη αγορά. Για να το πετύχει αυτό, ο διευθύνων σύμβουλος αποφάσισε να προσφέρει μια εξαιρετικά πολυτελή υπηρεσία στο Μανχάταν, με συνοδούς σε κάθε διασταύρωση που βοηθούν τους πελάτες πριν και μετά τη διαδρομή τους. Τώρα, πρέπει να γράψεις κώδικα που θα βοηθήσει στις λειτουργίες της υπηρεσίας.
Ο διευθύνων σύμβουλός σου αποφάσισε ότι, εφόσον το Μανχάταν έχει διάταξη δρόμων που μοιάζει κυρίως με πλέγμα, οι μιγαδικοί αριθμοί είναι ένας βολικός τρόπος για να αναπαραστήσεις τις διασταυρώσεις των δρόμων. Έτσι, οι θετικοί και οι αρνητικοί πραγματικοί αριθμοί αναπαριστούν την ανατολή και τη δύση, και οι θετικοί και οι αρνητικοί φανταστικοί αριθμοί τον βορρά και τον νότο, αντίστοιχα.
Καθώς η δημιουργία ενός μιγαδικού αριθμού στη γλώσσα R είναι λίγο, ε... ιδιαίτερη, σου ζητήθηκε να υλοποιήσεις μια απλή συνάρτηση μιγαδικών αριθμών.
Υλοποίησε τη συνάρτηση simplex(a, b), η οποία δέχεται τους ακέραιους a και b.
Επίστρεψε τον μιγαδικό αριθμό a+bi.
simplex(1, 1)
#> 1+1i
simplex(-3, 4)
#> -3+4i
Όταν ένας πελάτης δίνει τη διασταύρωση προορισμού, οι οδηγοί σου θα παίρνουν κατευθύνσεις για το πώς να φτάσουν εκεί. Αυτές οι κατευθύνσεις έχουν τη μορφή μιγαδικού αριθμού, όπου το πραγματικό μέρος αναπαριστά πόσα τετράγωνα προς βορρά/νότο πρέπει να πάνε και το φανταστικό μέρος την απόσταση ανατολή/δύση. Για να συμβαδίζει με μια καθιερωμένη πυξίδα, ο υπεύθυνος έργου σου αποφάσισε ότι ο βορράς θα είναι στη θετική φανταστική κατεύθυνση και ο νότος στην αρνητική φανταστική κατεύθυνση. Ομοίως, η ανατολή είναι στη θετική πραγματική κατεύθυνση και η δύση στην αρνητική πραγματική κατεύθυνση.
Υλοποίησε τη συνάρτηση driver_directions(start, end), η οποία δέχεται τις συντεταγμένες της διασταύρωσης αφετηρίας start και τις συντεταγμένες του προορισμού end.
Επίστρεψε έναν μιγαδικό αριθμό που αναπαριστά πόσα τετράγωνα προς ανατολή/δύση + βορρά/νότο πρέπει να διανύσει ο οδηγός.
driver_directions(0+0i, 7+5i)
#> 7+5i
driver_directions(-2+3i, 4-5i)
#> 6-8i
Ο πελάτης χρεώνεται ένα ποσό για την απόσταση που πρέπει να καλύψει το ταξί. Καθώς το Μανχάταν έχει διάταξη δρόμων που μοιάζει με πλέγμα, τα ταξί μπορούν να κινηθούν μόνο κατά μήκος αυτών των διαδρομών. Αυτή η δομή οδηγεί σε ένα μέτρο απόστασης που είναι αναγκασμένο να ακολουθεί τις γραμμές του πλέγματος. Η απόσταση μπορεί να βρεθεί αθροίζοντας είτε τον αριθμό των γραμμών που διανύθηκαν είτε τον αριθμό των διασταυρώσεων στις οποίες έφτασες (δηλαδή χωρίς να υπολογίζεται η διασταύρωση αφετηρίας). Αυτό το μέτρο ονομάζεται συνήθως απόσταση Μανχάταν ή νόρμα L1.
Υλοποίησε τη συνάρτηση manhattan(start, end), η οποία δέχεται τις διασταυρώσεις start και end.
Επίστρεψε την απόσταση Μανχάταν μεταξύ των διασταυρώσεων start και end.
manhattan(0+0i, 3+4i)
#> 7
manhattan(-2-3i, -1+1i)
#> 5
Ο διευθύνων σύμβουλος κατάφερε να πείσει τις επενδυτικές τράπεζες να συμμετάσχουν, υπογραμμίζοντας ότι η υπηρεσία δεν είναι μόνο εξαιρετικά πολυτελής αλλά και οικολογική, επειδή θα χρησιμοποιεί εκπαιδευμένα κοράκια για να μεταφέρουν μηνύματα ανάμεσα στους συνοδούς στις διασταυρώσεις (οι οποίοι μεταβιβάζουν πληροφορίες για τους επιβάτες, για μια εξατομικευμένη εμπειρία). Φαίνεται ότι κανένας από τους τραπεζίτες δεν μπήκε στον κόπο να κάνει τη δέουσα έρευνα για το γιατί ακριβώς αυτό είναι φιλικό προς το περιβάλλον, ή ακόμη και για το τι είδους διευθύνων σύμβουλος απολαμβάνει να εκπαιδεύει κοράκια στον ελεύθερό του χρόνο, επειδή τα χρήματα των επενδύσεων έρχονταν βροχή.
Αυτή η υπηρεσία χρεώνεται επίσης με βάση την απόσταση που διανύεται. Ωστόσο, επειδή τα κοράκια μπορούν να πετάξουν, δεν χρειάζεται να ακολουθήσουν το δίκτυο δρόμων σε πλέγμα και μπορούν να πάρουν τον συντομότερο δρόμο. Φυσικά, αυτό μπορεί να μην ισχύει όταν υπάρχουν τεράστιοι ουρανοξύστες, αλλά ο διευθύνων σύμβουλος βάζει αυτή την υπηρεσία στο Μανχάταν του Κάνσας (γνωστό και ως "The Little Apple"), όπου τα κοράκια μπορούν εύκολα να πετάξουν πάνω από τα χαμηλά κτίρια. Η πιθανή ζήτηση για μια τέτοια υπηρεσία στο Μανχάταν του Κάνσας, και το πώς θα νιώσουν οι ντόπιοι πεζοί με όλα αυτά τα πουλιά να πετούν από πάνω, είναι θέματα για άλλη μέρα.
Υλοποίησε τη συνάρτηση as_crow_flies(start, end), η οποία δέχεται τις διασταυρώσεις start και end.
Επίστρεψε την απόσταση σε ευθεία γραμμή μεταξύ των δύο.
as_crow_flies(0+0i, 3+4i)
#> 5
Ο διευθύνων σύμβουλός σου έχει εκπαιδεύσει τα κοράκια να ακολουθούν κατευθύνσεις παρόμοιου τύπου με αυτές των οδηγών. Ωστόσο, ο διευθύνων σύμβουλος αγαπά το Νότιο Ημισφαίριο και εκπαίδευσε τα κοράκια χρησιμοποιώντας διαφορετική πυξίδα από αυτήν που χρησιμοποιεί ο υπεύθυνος έργου σου για το υπόλοιπο σύστημα. Ο διευθύνων σύμβουλός σου αποδεικνύεται αρκετά εκκεντρικός άνθρωπος. Η πυξίδα του διευθύνοντος συμβούλου έχει τον βορρά στην αρνητική φανταστική κατεύθυνση και τον νότο στη θετική φανταστική κατεύθυνση. Αυτό είναι το αντίθετο από τις κατευθύνσεις βορρά/νότου των οδηγών, ενώ η ανατολή/δύση παραμένουν ίδιες.
Υλοποίησε τη συνάρτηση crows_directions(start, end), η οποία δέχεται τις διασταυρώσεις start και end.
Επίστρεψε τον μιγαδικό αριθμό που αντιστοιχεί στις κατευθύνσεις του οδηγού, αλλά με τον βορρά/νότο ανεστραμμένο.
driver_directions(0+0i, 7+5i)
#> 7-5i
driver_directions(-2+3i, 4-5i)
#> 6+8i
Γράψου στο Exercism για να μάθεις και να κατακτήσεις R με 21 έννοιες111 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.