Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Εισαγωγή στο εργαλείο επεξεργασίας αριθµητικών δεδοµένων Octave Απόστολος Π. Λερός & Αντώνιος Σ. Ανδρεάτος Αθήνα, Μάϊος 2010 Εισαγωγή στο OCTAVE Σελ. 1 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Εισαγωγή στο εργαλείο επεξεργασίας αριθµητικών δεδοµένων Octave Απόστολος Π. Λερός ΤΕΙ Χαλκίδας, Τμήμα Αυτοματισμού και Σχολή Ικάρων [email protected] Αντώνιος Σ. Ανδρεάτος Σχολή Ικάρων, Τομέας Πληροφορικής [email protected] Το παρόν εκπονήθηκε για τις ανάγκες του Εργαστηρίου «Εισαγωγής στην Οκτάβα», που διοργανώθηκε στο πλαίσιο του 5ου ΣYNE∆ΡΙΟΥ ΕΛ/ΛΑΚ, που έλαβε χώρα στην Αθήνα (ΕΜΠ, Μάϊος 2010). Σημείωση πνευματικών δικαιωμάτων Το υλικό αυτών των σημειώσεων προήλθε ως επί το πλείστον από την παρατιθέμενη βιβλιογραφία. Ως εκ τούτου, το copyright των δανεικών κειμένων ανήκει κατά κύριο λόγο στους αρχικούς συγγραφείς τους. Τα υπόλοιπα διανέμονται υπό την άδεια Creative Commons BY-NC-ND. Επιμέλεια κειμένου: Ανδριάνα Μυκονιάτη [email protected] Αθήνα, Μάϊος 2010 Εισαγωγή στο OCTAVE Σελ. 2 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ Σελ. 1. ΕΙΣΑΓΩΓΗ ΣΤΟ OCTAVE.............................................................................................................. 5 Τι είναι το OCTAVE ................................................................................................................ 5 Τι δεν είναι το OCTAVE ........................................................................................................... 5 Ποιοι χρησιµοποιούν το OCTAVE; .............................................................................................. 5 Γιατί δεν γίνεται χρήση µιας κανονικής υψηλού επιπέδου γλώσσας πχ. C++; .......................................... 5 2. ΑΠΛΟΙ ΥΠΟΛΟΓΙΣΜΟΙ ................................................................................................................ 6 2.1 Έναρξη του OCTAVE (Starting OCTAVE) ...................................................................................... 6 2.2 Το OCTAVE ως αριθµοµηχανή (OCTAVE as calculator) .................................................................... 7 2.3 Ενσωµατωµένες συναρτήσεις (Built-in functions) ............................................................................ 7 3. Το περιβάλλον του OCTAVE (Environment of OCTAVE) ........................................................................ 9 3.1 Ονοµαζόµενες µεταβλητές (Named variables) ................................................................................ 9 3.2 Αριθµοί και διαµόρφωση (Numbers and formatting) ...................................................................... 11 3.3 Παρουσίαση αριθµών και ακρίβεια (Number representation and accuracy) ........................................... 12 3.4 Φόρτωση και αποθήκευση δεδοµένων (Loading and saving data) ...................................................... 13 3.5 Επανάληψη προηγούµενων εντολών (Repeating previous commands) ................................................ 14 3.6 Λήψη Βοήθειας (Getting help)................................................................................................. 14 3.7 Ακυρώνοντας µιαν εντολή (Cancelling a command) ....................................................................... 14 3.8 Το ερωτηµατικό και κρύψιµο απαντήσεων (Semicolon and hiding answers) .......................................... 15 4. Πίνακες και διανύσµατα (Arrays and Vectors) .................................................................................. 15 4.1 ∆ηµιουργία διανυσµάτων (Building vectors) ................................................................................ 15 4.2 Ο συµβολισµός της άνω-κάτω τελείας (The colon notation) ............................................................. 16 4.3 Εµφάνιση µεγάλων διανυσµάτων και πινάκων (Displaying large vectors and matrices) ............................. 17 4.4 Συναρτήσεις δηµιουργίας διανυσµάτων (Vector creation functions) .................................................... 17 4.5 Εξαγωγή στοιχείων από διάνυσµα (Extracting elements from a vector) ............................................... 18 4.6 Μαθηµατικά διανυσµάτων (Vector maths) .................................................................................. 19 5. Σχεδιαγραφώντας γραφήµατα (Plotting graphs) ............................................................................... 20 5.1 Βελτιώνοντας την παρουσίαση (Improving the presentation) ........................................................... 22 5.2 Πολλαπλά γραφήµατα (Multiple graphs) .................................................................................... 23 5.3 Πολλαπλά σχεδιαγράµµατα (Multiple figures) .............................................................................. 24 5.4 Χειρονακτική κλίµακα (Manual scaling) ...................................................................................... 25 5.5 Αποθήκευση και εκτύπωση σχηµάτων (Saving and printing figures) ................................................... 27 6. OCTAVE Προγραµµατισµός Ι: Αρχεία Script (Octave programming I: Script files) ....................................... 27 6.1 ∆ηµιουργία και επεξεργασία ενός script (Creating and editing a script) ................................................ 27 6.2 Τρέξιµο και εκσφαλµάτωση των scripts (Running and debugging scripts) ............................................ 28 6.3 Περιεχόµενο των scripts (Remembering previous scripts)................................................................ 29 7. Εκφράσεις ελέγχου (Control statements)........................................................................................ 29 7.1 if...else selection................................................................................................................. 30 7.2 switch selection .................................................................................................................. 32 7.3 for loops .......................................................................................................................... 34 7.4 while loops ....................................................................................................................... 36 7.5 Η έκφραση do-until ............................................................................................................. 37 7.6 Οι εκφράσεις break και continue.............................................................................................. 38 7.7 Ορθότητα και ακρίβεια (Accuracy and precision) .......................................................................... 39 8. Προγραµµατισµός ΙΙ: Συναρτήσεις (programming ΙI: Functions) ........................................................... 40 8.1 Παράδειγµα 1: Ηµίτονο σε βαθµούς (Example 1: Sine in degrees) ..................................................... 41 8.2 ∆ηµιουργία και χρήση συναρτήσεων (Creating and using functions) ................................................... 42 8.3 Παράδειγµα 2: Μοναδιαίο βήµα (Example 2: Unit step) .................................................................. 43 9. Πίνακες και διανύσµατα (Matrices and vectors) ................................................................................ 46 9.1 Πολλαπλασιασµός πινάκων (Matrix multiplication) ......................................................................... 47 9.2 Ο Τελεστής µετάθεσης (The transpose operator) ......................................................................... 48 9.3 Συναρτήσεις που δηµιουργούν πίνακες (Matrix creation functions) ..................................................... 48 9.4 ∆ηµιουργώντας σύνθετους πίνακες (Building composite matrices) ..................................................... 50 9.5 Πίνακες σαν διατάξεις στοιχείων (Matrices as tables) ..................................................................... 51 9.6 Εξαγωγή τµηµάτων από πίνακες (Extracting bits of matrices) ........................................................... 51 10. Βασικές συναρτήσεις πινάκων (Basic matrix functions) ................................................................... 52 11. Λύνοντας την εξίσωση Ax = b (Solving Ax = b) ........................................................................... 54 11.1 Λύση όταν Α έχει αντίστροφο (Solution when A is invertible) ....................................................... 55 11.2 Γκαουσιανή απαλοιφή και LU παραγοντοποίηση (Gaussian elimination and LU factorization) .................. 55 11.3 ∆ιαίρεση πινάκων και ο τελεστής καθέτου γραµµής (Matrix division and the slash operator) .................. 56 11.4 Ιδιόµορφοι πίνακες και τάξη (Singular matrices and rank) ........................................................... 57 11.5 Κακή κατάσταση (Ill-conditioning) ........................................................................................ 58 11.6 Υπερπροσδιορισµένα συστήµατα: Ελάχιστα τετράγωνα (Over-determined systems: Least squares) ......... 59 1.1 1.2 1.3 1.4 Εισαγωγή στο OCTAVE Σελ. 3 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 11.7 Παράδειγµα: Τριγωνοποίηση (Example: Triangulation) ............................................................... 60 Περισσότερα για τα γραφήµατα (More graphs) ............................................................................ 62 12.1 Θέτοντας µερικά γραφήµατα σε ένα παράθυρο (Putting several graphs in one window) ....................... 62 12.2 Τρισδιάστατα σχεδιαγράµµατα (3D plots) ............................................................................... 63 12.3 Αλλάζοντας την οπτική γωνία (Changing the viewpoint) .............................................................. 64 12.4 Σχεδιαγράφοντας επιφάνειες (Plotting surfaces) ....................................................................... 65 12.5 Εικόνες και κινηµατογραφική ταινία (Images and Movies)............................................................ 66 13. Ιδιοδιανύσµατα και Αποσύνθεση ιδιόµορφων τιµών (Eigenvectors and the Singular Value Decomposition)..... 66 13.1 Η συνάρτηση eig (The eig function) ..................................................................................... 66 13.2 Αποσύνθεση ιδιόµορφων τιµών (The Singular Value Decomposition) .............................................. 67 13.3 Προσέγγιση πινάκων: Αλλαγή τάξης (Approximating matrices: Changing rank) .................................. 69 13.4 Η svd εντολή (The svd function) .......................................................................................... 69 13.5 Η εντολή svd (Economy SVD) ............................................................................................. 70 14. Μιγαδικοί αριθµοί (Complex numbers)....................................................................................... 71 14.1 Σχεδιαγράφοντας µιγαδικούς αριθµούς (Plotting complex numbers) ............................................... 73 14.2 Βρίσκοντας ρίζες πολυωνύµων (Finding roots of polynomials) ....................................................... 74 15. Χειρισµοί πολυωνύµων (Polynomial manipulation) ........................................................................ 74 15.1 Υπολογισµός ριζών (Finding Roots)....................................................................................... 75 15.2 Η συνάρτηση compan (c) .................................................................................................. 76 15.3 Γινόµενο και διαίρεση πολυωνύµων ...................................................................................... 76 15.4 Παράγωγος ενός πολυωνύµου............................................................................................. 77 15.5 Χαρακτηριστικό πολυώνυµο ενός τετραγωνικού πίνακα .............................................................. 77 15.6 Προσαρµογή δεδοµένων (curve fitting) .................................................................................. 78 16. OCTAVE - Εφαρµογές στα Συστήµατα Αυτοµάτου Ελέγχου.............................................................. 79 16.1 Ελεύθερη απόκριση συστήµατος .......................................................................................... 81 16.2 Κρουστική απόκριση συστήµατος ......................................................................................... 82 16.3 Βηµατική απόκριση συστήµατος .......................................................................................... 83 16.4 Σχεδιασµός ελεγκτή γραµµικού ρυθµιστή ............................................................................... 83 17. Εφαρµογές του OCTAVE στη Ψηφιακή Επεξεργασία Σήµατος ........................................................... 85 17.1 Συνέλιξη και φιλτράρισµα (Convolution and Filtering) ................................................................. 85 17.2 Φίλτρα και συναρτήσεις µεταφοράς (Filters and Transfer Functions)............................................... 86 17.3 Συνάρτηση filter (Function filter) ......................................................................................... 87 17.4 Κρουστική Απόκριση (Impulse Response) ............................................................................... 88 17.5 ∆ιακριτός µετασχηµατισµός Fourier (Discrete Fourier Transform) .................................................. 88 18. Επεξεργασία εικόνας µε την Οκτάβα ......................................................................................... 90 18.1 Εργαλειοθήκη επεξεργασίας εικόνας «image» .......................................................................... 90 18.2 Εισαγωγή και προβολή εικόνων ........................................................................................... 90 18.3 Μετατροπές εικόνων ........................................................................................................ 91 18.4 Επεξεργασία γκρί εικόνας................................................................................................... 93 18.5 Φιλτράρισµα εικόνας µε κώδικα ........................................................................................... 94 19. Εργαστηριακές Ασκήσεις ....................................................................................................... 95 19.1 Αποτίµηση συναρτήσεων y = f(x) και χειρισµός διανυσµάτων-πινάκων ............................................ 95 19.2 ∆ιαγράµµατα (plots) ........................................................................................................ 96 19.3 Άλλες ποικίλες εντολές (Miscellaneous commands) .................................................................... 97 Βιβλιογραφία (References)................................................................................................................ 99 12. Σηµείωση: Για διευκόλυνση του χρήστη, ο κώδικας παρέχεται µέσα σε πλαίσια σαν αυτό. Ο χρήστης µπορεί να αντιγράψει τον κώδικα και να τον επικολλήσει στο τερµατικό. Χρειάζεται προσοχή µήπως πρέπει να µετατραπούν οι απόστροφοι από πλάγιες σε όρθιες. Εισαγωγή στο OCTAVE Σελ. 4 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 1. 1.1 ΕΙΣΑΓΩΓΗ ΣΤΟ OCTAVE Τι είναι το OCTAVE Το OCTAVE είναι ένα αλληλεπιδραστικό λογισµικό ανοιχτού κώδικα για αριθµητικούς υπολογισµούς και γραφικά. Ειδικότερα έχει σχεδιαστεί για υπολογισµούς πινάκων όπως επίλυση ταυτόχρονων εξισώσεων, υπολογισµό ιδιοδιανυσµάτων, ιδιοτιµών κλπ. Σε πολλά πραγµατικά προβλήµατα µηχανικών τα δεδοµένα εκφράζονται σαν πίνακες και διανύσµατα και έτσι αυτά άπτονται σε λύσεις αυτού του τύπου. Επιπρόσθετα, το OCTAVE µπορεί να εµφανίσει τα δεδοµένα σε µια ποικιλία από διαφορετικούς τρόπους και έχει τη δική του γλώσσα προγραµµατισµού που επιτρέπει στο σύστηµα να επεκταθεί. Μπορεί να θεωρηθεί σαν µια ισχυρή, προγραµµατιζόµενη γραφική αριθµοµηχανή. Το OCTAVE διευκολύνει στην επίλυση µεγάλου εύρους αριθµητικών προβληµάτων, επιτρέποντας έτσι την αφιέρωση περισσότερου χρόνου για πειραµατισµό και σκέψη γύρω από το ευρύτερο πρόβληµα. Το OCTAVE αρχικά δηµιουργήθηκε σαν ένα συνοδευτικό λογισµικό σε ένα βιβλίο προπτυχιακού µαθήµατος για σχεδιασµό χηµικού αντιδραστήρα. Σήµερα αναπτύσσεται υπό την επίβλεψη του Dr. John W. Eaton. ∆ιατίθεται µε την άδεια GNU General Public License. Η χρησιµότητα του OCTAVE αυξάνεται καθώς είναι συντακτικά συµβατό µε το MATLAB που συχνά χρησιµοποιείται στη βιοµηχανία και στα πανεπιστήµια. Το OCTAVE µπορεί να αποκτηθεί από τη διεύθυνση www.octave.org. 1.2 Τι δεν είναι το OCTAVE Το OCTAVE είναι σχεδιασµένο για την αριθµητική επίλυση µαθηµατικών προβληµάτων, δηλαδή µε τον υπολογισµό τιµών στην µνήµη του ηλεκτρονικού υπολογιστή. Αυτό σηµαίνει ότι δεν µπορεί πάντοτε να δίνει µιαν ακριβή λύση σε ένα πρόβληµα και δεν πρέπει να συγχέεται µε προγράµµατα όπως Mathematica ή Maple, που δίνουν συµβολικές λύσεις µε το να κάνουν αλγεβρικούς χειρισµούς. Αυτό δεν το κάνει καλύτερο ούτε χειρότερο - χρησιµοποιείται για διαφορετικούς σκοπούς. Τα περισσότερα πραγµατικά µαθηµατικά προβλήµατα (ιδιαίτερα µηχανικών επιστηµών) δεν έχουν ξεκάθαρες συµβολικές λύσεις. 1.3 Ποιοι χρησιµοποιούν το OCTAVE; Το OCTAVE και το MATLAB το χρησιµοποιούν ευρέως οι µηχανικοί και οι επιστήµονες, στα πανεπιστήµια, στα ερευνητικά κέντρα και στην βιοµηχανία, για να κάνουν αριθµητικούς υπολογισµούς και για ανάπτυξη και δοκιµές µαθηµατικών αλγορίθµων. Καθίσταται πολύ εύκολο να γραφούν µαθηµατικά προγράµµατα πολύ γρήγορα και να επεξεργαστούν δεδοµένα µε ποικίλους τρόπους. 1.4 Γιατί δεν γίνεται χρήση µιας κανονικής υψηλού επιπέδου γλώσσας πχ. C++; Η C++ και άλλες τυπικές γλώσσες προγραµµατισµού είναι συνήθως σχεδιασµένες για την ανάπτυξη λογισµικών γενικής χρήσης. Ωστόσο, οι λύσεις σε µαθηµατικά προβλήµατα απαιτούν χρόνο να προγραµµατιστούν χρησιµοποιώντας την C++ και η γλώσσα από τη φύση της δεν υποστηρίζει αρκετά µαθηµατικά σκεπτικά ή γραφικά. Το OCTAVE είναι ειδικά σχεδιασµένο για την επίλυση τέτοιων προβληµάτων να κάνει αριθµητικούς υπολογισµούς και να δεικνύει τα αποτελέσµατα Εισαγωγή στο OCTAVE Σελ. 5 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος γραφικά. Ακόµη και προγραµµατιστές που τελικά γράφουν λογισµικά σε γλώσσες όπως C++ µερικές φορές αρχίζουν µε το να πρωτοτυπούν τα όποια µαθηµατικά τµήµατά του χρησιµοποιώντας το OCTAVE, καθώς αυτό τους επιτρέπει να δοκιµάζουν τους αλγόριθµους τους γρήγορα. 2. 2.1 ΑΠΛΟΙ ΥΠΟΛΟΓΙΣΜΟΙ Έναρξη του OCTAVE (Starting OCTAVE) Στο Λίνουξ η εγκατάσταση της Οκτάβας γίνεται εύκολα µέσω Synaptics. Μετά την εγκατάσταση, η πρόσβαση στο τερµατικό της Οκτάβας γίνεται από το µενόύ: Applications > Programming [ή Science] > GNU Octave. Εµφανίζεται τότε ένα παράθυρο σαν το παρακάτω (στο οποίο φαίνεται η τρέχουσα έκδοση, εδώ είναι η 3.0.5): Σε περιβάλλον windows, µετά την εγκατάσταση του OCTAVE δηµιουργείται το εξής εικονίδιο στην Επιφάνεια Εργασίας: . Εάν ήδη δεν έχετε το OCTAVE να τρέχει, ενεργοποιείστε το από το S t a r t P r o g r a m s O c t a v e ή κάνοντας κλικ στο εικονίδιό του. Μετά από λίγο εµφανίζεται ένα λογότυπο σε ένα νέο παράθυρο και ανάλογα µε την έκδοση που έχει εγκατασταθεί θα δεικνύει τα εξής: Εισαγωγή στο OCTAVE Σελ. 6 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Το παραπάνω παράθυρο είναι το περιβάλλον του OCTAVE. Το σύµβολο > είναι η προτροπή του OCTAVE που µας ρωτά να εισάγουµε µια εντολή. Εάν θέλουµε να εξέλθουµε από το OCTAVE σε οποιοδήποτε σηµείο, εισάγουµε στην προτροπή την εντολή quit ή exit. 2.2 Το OCTAVE ως αριθµοµηχανή (OCTAVE as calculator) Ο πιο απλός τρόπος χρήσης του OCTAVE είναι να εισάγουµε στην προτροπή µαθηµατικές εντολές, όπως σε µια κανονική αριθµοµηχανή. Όλες οι σύνηθες αριθµητικές εκφράσεις αναγνωρίζονται. Για παράδειγµα, στην προτροπή εισάγουµε: 1+2 και πατώντας το πλήκτρο ENTER το OCTAVE ανταποκρίνεται δίνοντάς µας την απάντηση: ans = 3 Οι βασικές αριθµητικές πράξεις είναι + - * /, και το ^ που χρησιµοποιείται για ύψωση σε δύναµη (πχ. 2^3=8). Οι παρενθέσεις () µπορούν επίσης να χρησιµοποιηθούν. Η σειρά προτεραιότητας είναι η σύνηθες, δηλαδή οι παρενθέσεις αποτιµούνται πρώτα, µετά οι δυνάµεις, µετά οι πολλαπλασιασµοί και διαιρέσεις, και τελικά οι προσθέσεις και αφαιρέσεις. 2.3 Ενσωµατωµένες συναρτήσεις (Built-in functions) Πέρα από τις βασικές αριθµητικές πράξεις, το OCTAVE παρέχει όλες τις σύνηθες µαθηµατικές συναρτήσεις. Μια συλλογή από αυτές παρουσιάζεται στον παρακάτω Πίνακα 1. Πίνακας 1: Βασικές µαθηµατικές συναρτήσεις cos Cosine of an angle (in radians) - Συνηµίτονο sin Sine of an angle (in radians) - Ηµίτονο Εισαγωγή στο OCTAVE Σελ. 7 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Πίνακας 1: Βασικές µαθηµατικές συναρτήσεις tan Tangent of an angle (in radians) - Εφαπτοµένη exp Exponential function (ex) – Εκθετική συνάρτηση log Natural logarithm (loge, not log10) – Φυσικός λογάριθµος log10 Logarithm to base 10 – Λογάριθµος µε βάση 10 sinh Hyperbolic sine – Υπερβολικό ηµίτονο cosh Hyperbolic cosine – Υπερβολικό συνηµίτονο tanh Hyperbolic tangent – Υπερβολική εφαπτοµένη acos Inverse cosine – Αντίστροφο συνηµίτονο acosh Inverse hyperbolic cosine – Αντίστροφο υπερβολικό συνηµίτονο asin Inverse sine – Αντίστροφο ηµίτονο asinh Inverse hyperbolic sine – Αντίστροφο υπερβολικό ηµίτονο atan Inverse tangent – Αντίστροφη εφαπτοµένη atan2 Two-argument form of inverse tangent atanh Inverse hyperbolic tangent Αντίστροφη υπερβολική εφαπτοµένη abs Absolute value – Απόλυτη τιµή sign Sign of the number (-1 or +1) – Πρόσηµο αριθµού round Round to the nearest integer – Στρογγυλοποίηση στον πλησιέστερο ακέραιο floor Round down (towards minus infinity) – Στρογγυλοποίηση στο -∞ ceil Round up (towards plus infinity) – Στρογγυλοποίηση στο +∞ fix Round towards zero – Στρογγυλοποίηση στο 0 rem Remainder after integer division – Υπόλοιπο διαίρεσης ακεραίων Αυτές οι συναρτήσεις επικαλούνται όπως και στην C++ µε το όνοµα της συνάρτησης και µετά τα ορίσµατα της συνάρτησης σε παρενθέσεις (). Για παράδειγµα1: exp(1) ans = 2.7183 Για µια µεγαλύτερη έκφραση, όπως για παράδειγµα τον υπολογισµό 2.5sin(15o + ln(3.82)), εισάγουµε: 2.5*sin(15*pi/180 + log(3.8^2)) 1 Τα ορίσµατα µιας συνάρτησης είναι οι τιµές που περνούν στη συνάρτηση και χρησιµοποιούνται για να υπολογιστεί η απόκρισή της. Σ’ αυτό το παράδειγµα το όρισµα είναι η τιµή «1», έτσι η εκθετική συνάρτηση exp υπολογίζει το εκθετικό του 1 και επιστρέφει την τιµή (δηλ. ε1=2.7183). Εισαγωγή στο OCTAVE Σελ. 8 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ans = 0.52064 Εδώ υπάρχουν µερικά στοιχεία που χρήζουν επεξήγηση: Το αποκλειστικό σύµβολο του πολλαπλασιασµού πάντοτε χρειάζεται στις εξισώσεις, για παράδειγµα µεταξύ του 2.5 και sin. Οι τριγωνοµετρικές συναρτήσεις (για παράδειγµα cos) εργάζονται σε ακτίνια (radians). Ο παράγοντας π/180 µπορεί να χρησιµοποιηθεί για την µετατροπή των βαθµών σε ακτίνια. Το pi είναι ένα παράδειγµα µιας ονοµαζόµενης µεταβλητής. Η συνάρτηση του φυσικού λογάριθµου ονοµάζεται “log” και όχι “ln”. Χρησιµοποιώντας αυτές τις συναρτήσεις και τις σύνηθες µαθηµατικές πράξεις το OCTAVE µπορεί να κάνει όλα τα πράγµατα που κάνει µια κανονική αριθµοµηχανή. 3. Το περιβάλλον του OCTAVE (Environment of OCTAVE) Όπως µπορούµε να δούµε από τα µέχρι τώρα παραδείγµατα, το OCTAVE έχει µια γραµµή-εντολών διεπαφή (command-line interface) – οι εντολές εισάγονται µία κάθε φορά στην προτροπή και µετά πατάµε το πλήκτρο ENTER. Το OCTAVE είναι διερµηνευµένη γλώσσα (interpreted language) που σηµαίνει ότι κάθε εντολή µετατρέπεται σε κώδικα µηχανής µετά την εισαγωγή της. Σε µεταγλωττισµένες γλώσσες (compiled languages) όπως η C++, ολόκληρο το πρόγραµµα εισάγεται πρώτα σε έναν κειµενογράφο, µετά αυτό ολόκληρο µετατρέπεται σε κώδικα µηχανής χρησιµοποιώντας έναν µεταγλωττιστή, και στη συνέχεια ολόκληρο το πρόγραµµα εκτελείται. Τα µεταγλωττισµένα προγράµµατα τρέχουν πιο γρήγορα από τα διερµηνευµένα, αλλά χρειάζονται περισσότερο χρόνο για να αναπτυχθούν. Είναι πιο γρήγορο να δοκιµαστούν τα πράγµατα µε το OCTAVE, ακόµη κι αν οι υπολογισµοί παίρνουν λίγο περισσότερο χρόνο. 3.1 Ονοµαζόµενες µεταβλητές (Named variables) Σε κάποιο σπουδαίο υπολογισµό θα χρειαστούµε να αποθηκεύσουµε τις απαντήσεις ή να ξαναχρησιµοποιήσουµε τις τιµές όπως ακριβώς χρησιµοποιούµε την µνήµη της αριθµοµηχανής. Το OCTAVE µας επιτρέπει να ορίσουµε και να χρησιµοποιήσουµε ονοµαζόµενες µεταβλητές. Για παράδειγµα, ας θεωρήσουµε το παράδειγµα των βαθµών της προηγούµενης ενότητας. Μπορούµε να ορίσουµε µια µεταβλητή deg για να βαστάει τον παράγοντα µετατροπής, γράφοντας: deg = pi/180 deg = 0.017453 Επισηµαίνεται ότι ο τύπος της µεταβλητής δεν χρειάζεται να οριστεί, σε αντίθεση µε τις περισσότερες υψηλού επιπέδου γλώσσες προγραµµατισµού πχ. C++. Όλες οι µεταβλητές στο OCTAVE είναι µετακινούµενης υποδιαστολής αριθµοί. Χρησιµοποιώντας αυτή τη µεταβλητή µπορούµε να γράψουµε την προηγούµενη έκφραση ως εξής: Εισαγωγή στο OCTAVE Σελ. 9 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 2.5*sin(15* deg + log(3.8^2)) ans = 0.52064 η οποία δεν είναι πιο εύκολη να γραφεί, αλλά είναι πιο εύκολη να διαβαστεί και υπάρχει µικρότερη πιθανότητα να κάνουµε κάποιο επιπόλαιο λάθος όταν εισάγουµε του αριθµούς. Προσπαθείτε να ορίζετε και να χρησιµοποιείτε µεταβλητές για όλους τους κοινούς αριθµούς ή τα αποτελέσµατα όταν γράφετε προγράµµατα. Έχουµε ήδη δει ένα άλλο παράδειγµα µιας µεταβλητής στο OCTAVE. Κάθε φορά που εισάγουµε µια έκφραση στην οποία δεν έχουµε ορίσει µεταβλητή, όπως στο πιο πρόσφατο παράδειγµα, το OCTAVE ορίζει για την απάντηση την µεταβλητή ans. Αυτή µετά µπορεί να χρησιµοποιηθεί ακριβώς κατά τον ίδιο τρόπο: new = 5*ans new = 2.6032 Επισηµαίνεται ότι αυτή δεν είναι η απάντηση που προκύπτει απλά εκτελώντας τον πολλαπλασιασµό 5 x 0.52064. Αν και το OCTAVE δείχνει αριθµούς µε µερικά µόνο δεκαδικά ψηφία (συνήθως πέντε)2, τους αποθηκεύει εσωτερικά στις µεταβλητές µε µεγαλύτερη ακρίβεια και έτσι η δεδοµένη απάντηση είναι πιο ακριβής3. Σε όλους τους αριθµητικούς υπολογισµούς, το σφάλµα στρογγυλοποίησης είναι πολύ σπουδαίο και είναι ουσιώδες να µην εισάγουµε περισσότερα σφάλµατα από ότι ήδη υπάρχουν. Αυτό είναι ένας ακόµη σπουδαίος λόγος για αποθήκευση αριθµών σε µεταβλητές αντί να τους εισάγουµε κάθε φορά. Όταν ορίζουµε και χρησιµοποιούµε µεταβλητές, τα κεφλαία γράµµατα είναι διαφορετικά από τα πεζά: η µεταβλητή a είναι διαφορετική από την A. Υπάρχουν επίσης και µερικές µεταβλητές που είναι ήδη ορισµένες και χρησιµοποιούνται από το OCTAVE. Η µεταβλητή ans ήδη έχει αναφερθεί, όπως έχει η pi, και επιπρόσθετα i και j είναι επίσης ορισµένες σαν ρίζα -1 (βλ. παρακάτω ενότητα 14). Το OCTAVE δεν µας εµποδίζει να ορίσουµε αυτές τις µεταβλητές εκ νέου σε όποιες τιµές επιθυµούµε, αλλά κάνοντας κάτι τέτοιο ίσως να προκαλέσουµε σύγχυση στον εαυτό µας και στο OCTAVE. Παροµοίως, δίνοντας ονόµατα σε µεταβλητές σαν sin ή cos επιτρέπεται, αλλά δεν συνίσταται. 2 Το MATLAB συνήθως δεικνύει 4 ή πέντε δεκαδικά ψηφία. Το OCTAVE αποθηκεύει όλους τους αριθµούς σε µορφή IEEE κινούµενης υποδιαστολής τύπου διπλής ακρίβειας (64-bit). Η τιµή ans εδώ στην πραγµατικότητα είναι 0.520639040645464 (µε 15 δεκαδικά ψηφία). 3 Εισαγωγή στο OCTAVE Σελ. 10 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Εάν θέλουµε να δούµε την τιµή µιας µεταβλητής σε όποιο σηµείο, απλά εισάγουµε το όνοµά της και πατάµε το πλήκτρο ENTER. Εάν θέλουµε να δούµε τη λίστα από όλες τις ονοµαζόµενες 4 συναρτήσεις και µεταβλητές που έχουµε δηµιουργήσει ή χρησιµοποιήσει, εισάγουµε: who *** dynamically linked functions: dispatch *** currently compiled functions: rem *** local user variables: deg new Ανά περίπτωση θα θέλουµε να διαγράψουµε µεταβλητές από το χώρο εργασίας (workspace), ίσως για να εξοικονοµήσουµε µνήµη, ή διότι παίρνουµε συγκεχυµένα αποτελέσµατα χρησιµοποιώντας µια µεταβλητή και θέλουµε να αρχίσουµε εκ νέου από την αρχή ξανά. Η εντολή clear θα διαγράψει όλες τις µεταβλητές, ή προσδιορίζοντας: clear name θα διαγράψει ακριβώς την µεταβλητή µε το όνοµα name. 3.2 Αριθµοί και διαµόρφωση (Numbers and formatting) Έχουµε δει ότι το OCTAVE συνήθως δεικνύει αριθµούς σε πέντε δεκαδικά ψηφία. Η εντολή format µας επιτρέπει να επιλέξουµε τον τρόπο που θα δεικνύονται οι αριθµοί. Ειδικότερα, εισάγοντας: format long θα κάνει το OCTAVE να δείξει αριθµούς σε δεκαπέντε (15) και περισσότερα δεκαδικά ψηφία, που είναι η ακρίβεια των υπολογισµών του. Εάν εισάγουµε την εντολή help format µπορούµε να πάρουµε µια πλήρη λίστα από επιλογές για αυτή την εντολή. Με την εντολή format long ενεργοποιηµένη, µπορούµε να δούµε την πιο ακριβή τιµή της µεταβλητής deg: deg deg = 0.0174532925199433 Η εντολή: format short 4 Κανονικά το MATLAB δείχνει µόνο τις µεταβλητές του χρήστη (δικές µας) και την ans. Εισαγωγή στο OCTAVE Σελ. 11 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος επιστρέφει το OCTAVE στην ένδειξη της ακρίβειας σε κανονική µορφή. Το OCTAVE δεικνύει πολύ µεγάλους ή µικρούς αριθµούς χρησιµοποιώντας τον εκθετικό συµβολισµό (exponential notation). Για παράδειγµα: 25456.4 = 2.54564 x 104, ο οποίος δεικνύεται από το OCTAVE σαν 2.5456e+004. Μπορούµε επίσης να εισάγουµε αριθµούς στο OCTAVE χρησιµοποιώντας αυτή τη διαµόρφωση. Υπάρχουν επίσης και µερικοί άλλοι αριθµοί που αναγνωρίζονται και υπολογίζονται από το OCTAVE: Μιγαδικοί αριθµοί (Complex numbers): Πχ. 3+4i, αναγνωρίζεται πλήρως από το Octave, όπως σχολιάζεται περεταίρω στην ενότητα 14. Infinity (Inf): Το αποτέλεσµα διαίρεσης ενός αριθµού µε το µηδέν. Αυτή είναι µια έγκυρη απάντηση σε έναν υπολογισµό και µπορεί να ανατεθεί σε µια µεταβλητή ακριβώς όπως οποιοσδήποτε άλλος αριθµός. Not a Number (NaN): Το αποτέλεσµα µηδέν δια µηδέν και επίσης για µερικές άλλες πράξεις που δηµιουργούν απροσδιόριστα αποτελέσµατα. Ξανά, αυτός µπορεί να χρησιµοποιηθεί ακριβώς σαν οποιοδήποτε άλλο αριθµό (αν και τα αποτελέσµατα από οποιοδήποτε υπολογισµό που τον χρησιµοποιεί είναι πάντοτε NaN). 3.3 Παρουσίαση αριθµών και ακρίβεια (Number representation and accuracy) Οι αριθµοί στο OCTAVE, όπως και στους ηλεκτρονικούς υπολογιστές, αποθηκεύονται σε δυαδική αντί για δεκαδική µορφή. Στη δεκαδική µορφή (βάση 10), ο αριθµός 12.25 σηµαίνει: 12.25 = 1x101 +2x100 +2x10-1+5x10-2 αλλά στη δυαδική µορφή (βάση 2) θα γραφεί ως εξής: 1100.01 = 1x23+1x22+0x21+0x20+0x2-1+1x2-2 = 12.25 Χρησιµοποιώντας τη δυαδική µορφή είναι ιδανική για τους ηλεκτρονικούς υπολογιστές καθώς αυτή είναι ακριβώς µια σειρά από ένα και µηδενικά η οποία µπορεί να αντιπροσωπευτεί µε το εάν ειδικά κυκλώµατα είναι ενεργοποιηµένα ή απενεργοποιηµένα. Ένα πρόβληµα µε το να αντιπροσωπεύουµε αριθµούς στον ηλεκτρονικό υπολογιστή είναι ότι κάθε αριθµός µπορεί να έχει πεπερασµένο αριθµό ψηφίων ή bit, που διατίθενται γι’ αυτόν και έτσι µπορεί µόνο να έχει πεπερασµένο αριθµό από ψηφία. Θεωρείστε το ακόλουθο παράδειγµα: 1 – 0.2 – 0.2 – 0.2 – 0.2 – 0.2 ans = 5.5511e-017 Το αποτέλεσµα είναι πολύ µικρό, αλλά όχι ακριβώς µηδέν, που είναι η σωστή απάντηση. Ο λόγος είναι ότι το 0.2 δεν µπορεί ακριβώς να αντιπροσωπευτεί σε δυαδική µορφή χρησιµοποιώντας ένα Εισαγωγή στο OCTAVE Σελ. 12 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος πεπερασµένο αριθµό από ψηφία (είναι 0.0011001100…). Αυτή ακριβώς είναι και η αιτία που το 1/3 δεν µπορεί ακριβώς να γραφεί σε βάση 10 αριθµό. Το OCTAVE (και όλα τα υπόλοιπα προγράµµατα ηλεκτρονικών υπολογιστών) αντιπροσωπεύουν αυτούς τους αριθµούς µε τον όσο το δυνατόν καλύτερη προσέγγιση µπορούν, αλλά επαναληπτικές χρήσεις αυτών των προσεγγίσεων, όπως είδαµε εδώ, µπορεί να δηµιουργήσουν προβλήµατα. Γι’ αυτό το λόγο πρέπει να σκεφτούµε πολύ προσεκτικά πριν ελέγξουµε ότι ένας αριθµός είναι ακριβώς ίσος µε κάποιον άλλον. Είναι συνήθως καλό να ελέγξουµε ότι είναι ίσος µέσα σε κάποια ανοχή. Θα επιστρέψουµε σ’ αυτό το πρόβληµα κατά τη διάρκεια του εγχειριδίου. 3.4 Φόρτωση και αποθήκευση δεδοµένων (Loading and saving data) Όταν εξερχόµαστε από το OCTAVE, χάνουµε όλες τις µεταβλητές που έχουµε δηµιουργήσει. Εάν για κάποιο λόγο χρειάζεται να τερµατίσουµε το OCTAVE, µπορούµε να αποθηκεύσουµε την τρέχουσα εργασία έτσι ώστε να την φορτώσουµε ξανά αργότερα. Εάν εισάγουµε: save anyname τότε ολόκληρος ο χώρος εργασίας (workspace) θα αποθηκευτεί σε ένα αρχείο ονοµαζόµενο anyname.mat στο τρέχων κατάλογο (σηµειώνεται ότι το OCTAVE αυτόµατα προσθέτει .mat στο τέλος του ονόµατος που δώσαµε). Μπορούµε µετά να τερµατίσουµε το OCTAVE και όταν θέλουµε να κάνουµε επανεκκίνηση τότε εισάγουµε: load anyname που θα επαναφέρει τον προηγούµενο χώρο εργασίας και µπορούµε να συνεχίσουµε από εκεί που σταµατήσαµε. Μπορούµε επίσης να φορτώσουµε και να αποθηκεύσουµε συγκεκριµένες µεταβλητές εισάγοντας: save filename var1 var2 … Για παράδειγµα, εάν θέλαµε να αποθηκεύσουµε την µεταβλητή deg, για να µην την υπολογίζουµε από την αρχή (που δεν είναι και πολύ δύσκολο σε αυτή την περίπτωση !), θα µπορούσαµε να εισάγουµε την εντολή: save degconv deg Αυτή η εντολή θα αποθηκεύσει την µεταβλητή σε ένα αρχείο ονοµαζόµενο degconv.mat. Μπορούµε να το φορτώσουµε ξανά µε το να εισάγουµε: load degconv Εισαγωγή στο OCTAVE Σελ. 13 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Το OCTAVE µπορεί να φορτώσει επίσης δεδοµένα από αρχεία κειµένου (text), που είναι ιδιαίτερα χρήσιµο εάν θέλουµε να δηµιουργήσουµε γραφήµατα ή να εκτελέσουµε υπολογισµούς σε µετρήσεις από κάποια άλλη πηγή. Το αρχείο κειµένου πρέπει να περιέχει γραµµές από αριθµούς που είναι διαχωρισµένοι µε κενό. 3.5 Επανάληψη προηγούµενων εντολών (Repeating previous commands) Το OCTAVE βαστάει όλες τις προηγούµενες εντολές που έχουµε εισάγει και µπορούµε να χρησιµοποιήσουµε τα πλήκτρα ↑ και ↓ για να επιθεωρήσουµε τις προηγούµενες εντολές (µε την πιο πρόσφατη πρώτα). Όταν µια εντολή έχει ανακληθεί, µπορούµε να την τροποποιήσουµε πριν την χρησιµοποιήσουµε ξανά. Μπορούµε να χρησιµοποιήσοµε τα πλήκτρα ← και → για να µετακινήσουµε τον δροµέα µέσα στην γραµµή και να εισάγουµε νέους χαρακτήρες ή να διαγράψουµε µε το πλήκτρο Delete ή το Backspace και να αλλάξουµε το περιεχόµενο. Αυτό είναι ιδιαίτερα χρήσιµο εάν µόλις έχουµε γράψει µια µακριά γραµµή και µετά το OCTAVE έχει βρει σφάλµατα σε αυτήν. Χρησιµοποιώντας τα πλήκτρα µε τα βέλη, µπορούµε να διορθώσουµε το σφάλµα και να δοκιµάσουµε ξανά. 3.6 Λήψη Βοήθειας (Getting help) Εάν δεν είµαστε σίγουροι τι κάνει κάποια ειδική εντολή του OCTAVE, ή θέλουµε να βρούµε µια ειδική συνάρτηση, το OCTAVE περιέχει ένα ολοκληρωµένο σύστηµα βοήθειας. Ο βασικός τρόπος χρήσης του συστήµατος της βοήθειας είναι να εισάγουµε στην προτροπή: help commandname Για παράδειγµα, help sqrt ‘sqrt’ is a built-in function -- Mapping Function: sqrt (X) Compute the square root of each element of X. If X is negative, a complex result is returned. To compute the matrix square root, see *note Linear Algebra::. See also: realsqrtOverload function Additional help for built-in functions and operators is available in the on-line version of the manual. Use the command ‘doc <topic>’ to search the manual index. Help and information about Octave is also available on the WWW at http://www.octave.org and via the [email protected] mailing list. 3.7 Ακυρώνοντας µιαν εντολή (Cancelling a command) Εάν δούµε ότι κάποια εντολή που εισάγαµε παίρνει πολύ χρόνο να εκτελεστεί, είναι πολύ χρήσιµο να γνωρίζουµε πώς να την σταµατήσουµε. Μπορούµε να ακυρώσουµε την τρέχουσα εντολή εισάγοντας: Εισαγωγή στο OCTAVE Σελ. 14 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Ctrl-C που πρέπει (ίσως µετά από λίγο) να µας επιστρέψει στην εντολή της προτροπής. 3.8 Το ερωτηµατικό και κρύψιµο απαντήσεων (Semicolon and hiding answers) Τα ελληνικά ερωτηµατικά (semicolons) “;” συχνά χρησιµοποιούνται στις γλώσσες προγραµµατισµού για να διαχωρίζουν συναρτήσεις και να δείχνουν το τέλος της γραµµής, όπως στην C++ που προστίθενται σχεδόν σε κάθε γραµµή. Τα ερωτηµατικά δεν απαιτούνται στο OCTAVE αλλά εξυπηρετούν ένα χρήσιµο σκοπό. Εάν εισάγουµε µια εντολή όπως ήδη έχουµε κάνει µέχρι τώρα, χωρίς το ερωτηµατικό στο τέλος, το OCTAVE πάντοτε δεικνύει το αποτέλεσµα της έκφρασης. Αλλά, εάν τελειώσουµε την εντολή γραµµής µε ερωτηµατικό, αυτό αποτρέπει το OCTAVE να δεικνύει το αποτέλεσµα. Αυτό είναι ιδιαίτερα χρήσιµο εάν δεν θέλουµε να γνωρίζουµε το αποτέλεσµα αµέσως ή όταν το αποτέλεσµα είναι µια µεγάλη λίστα από αριθµούς. 4. Πίνακες και διανύσµατα (Arrays and Vectors) Αρκετά προβλήµατα στα µαθηµατικά επιλύνονται µε ακολουθίες αριθµών. Σε αρκετές γλώσσες προγραµµατισµού αυτές οι ακολουθίες αριθµών ονοµάζονται πίνακες (arrays). Στο OCTAVE οι πίνακες είναι απλά παραδείγµατα από διανύσµατα. Τα διανύσµατα συνήθως χρησιµοποιούνται να αντιπροσωπεύουν τις τρείς διαστάσεις της θέσης ή της ταχύτητας, αλλά ένα διάνυσµα στην πραγµατικότητα είναι µια λίστα από αριθµούς, και έτσι ακριβώς το OCTAVE τα µεταχειρίζεται. Στην πραγµατικότητα, τα διανύσµατα είναι µια ειδική περίπτωση πινάκων (που είναι ένα πλέγµα δύο διαστάσεων από αριθµούς). Ένα διάνυσµα είναι ένας πίνακας µε µια µόνο γραµµή ή µε µια µόνο στήλη. Θα δούµε αργότερα ότι συχνά είναι σπουδαίο να διαχωρίζουµε τα διανύσµατα γραµµής (...) από τα διανύσµατα στήλης (M) . 4.1 ∆ηµιουργία διανυσµάτων (Building vectors) Υπάρχουν πολλοί τρόποι για να ορίσουµε διανύσµατα ή πίνακες. Συνήθως ο πιο εύκολος τρόπος είναι να γράψουµε το διάνυσµα µέσα σε αγκύλες []. Για παράδειγµα: a = [1 2 3] a= 1 2 3 b = [3,2,1] b= 3 2 1 c = [3;5;12] Εισαγωγή στο OCTAVE Σελ. 15 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος c= 3 5 12 Μια λίστα αριθµών διαχωρισµένων µε κενά ή κόµµατα µέσα σε τετραγωνικές παρενθέσεις, ορίζει ένα διάνυσµα γραµµής. Αριθµοί διαχωρισµένοι µε ερωτηµατικά (semicolons) ή πατώντας το ENTER µετά από κάθε αριθµό ορίζει το διάνυσµα στήλης. Μπορούµε επίσης να δηµιουργήσουµε ένα νέο διάνυσµα από ένα υπάρχον µε να το συµπεριλάβουµε στον ορισµό του. Για παράδειγµα: a = [1 2 3] a= 1 2 3 d = [a 6] d= 1 2 4.2 Ο συµβολισµός της άνω-κάτω τελείας (The colon notation) 3 6 Ένας χρήσιµος σύντοµος τρόπος για να δηµιουργήσουµε ένα διάνυσµα από αριθµούς µέτρησης είναι να χρησιµοποιήσουµε τις άνω-κάτω τελείες “:”, όπως στο παράδειγµα: e = 2:7 e= 2 3 4 5 6 7 Το σύµβολο µε τις άνω-κάτω τελείες λέει στο OCTAVE να δηµιουργήσει ένα διάνυσµα από αριθµούς αρχίζοντας από τον πρώτο αριθµό, µετρώντας προς τα πάνω (και συµπεριλαµβάνοντας) τον δεύτερο αριθµό. Ένας τρίτος αριθµός µπορεί επίσης να συµπεριληφθεί µεταξύ των δύο, κάνοντας την εντολή a:b:c. Ο µεσαίος αριθµός τότε προσδιορίζει το βήµα µεταξύ των στοιχείων του διανύσµατος: e = 2:0.3:4 e = 2.0000 2.3000 2.6000 2.9000 3.2000 3.5000 3.8000 Εισαγωγή στο OCTAVE Σελ. 16 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σηµείωση: Εάν το βήµα είναι τέτοιο που δεν µπορεί να φτάσει ακριβώς στον τελευταίο αριθµό, όπως σε αυτήν την περίπτωση, τότε το OCTAVE δηµιουργεί τους αριθµούς που δεν τον υπερβαίνουν. Το βήµα µπορεί επίσης να είναι αρνητικό, που σε αυτήν την περίπτωση θα µετρήσει προς τα κάτω στον τελευταίο αριθµό. 4.3 Εµφάνιση µεγάλων διανυσµάτων και πινάκων (Displaying large vectors and matrices) Εάν ζητήσουµε από το OCTAVE να εµφανίσει έναν πίνακα ή διάνυσµα που δεν χωράει σε µια µονή οθόνη, τότε θα παρουσιάσει τις τιµές ανά σελίδα κάθε φορά. ∆οκιµάστε: v = 1:1000 Πατήστε το διάστηµα (spacebar) για να δείτε την επόµενη σελίδα από τιµές και χρησιµοποιείστε το “q” πλήκτρο να τερµατίσετε την εµφάνιση και να επιστρέψετε στην εντολή προτροπής του OCTAVE. Μπορείτε επίσης να χρησιµοποιήσετε το “b” πλήκτρο για να κυλίσετε προς τα πίσω πάνω στις τιµές που ήδη εµφανίστηκαν. Μερικές φορές είναι βολικό να απενεργοποιήσουµε τη δυνατότητα σελιδοποίησης, για παράδειγµα όταν εµφανίζονται ενδιάµεσες τιµές κατά τη διάρκεια µακρών υπολογισµών που απαιτούν πολύ χρόνο. Αυτό µπορεί να επιτευχθεί µε τη χρήση της εντολής: more off Όπως αναµενόταν, η σελιδοποίηση µπορεί να ενεργοποιηθεί ξανά µε τη χρήση της εντολής: more on 4.4 Συναρτήσεις δηµιουργίας διανυσµάτων (Vector creation functions) Το OCTAVE επίσης παρέχει ένα σύνολο συναρτήσεων για τη δηµιουργία διανυσµάτων. Αυτές οι συναρτήσεις δεικνύονται στον παρακάτω Πίνακα 2. Πίνακας 2: Συναρτήσεις δηµιουργίας διανυσµάτων zeros(M,N) ∆ηµιουργεί έναν πίνακα όπου κάθε στοιχείο του είναι µηδέν. Για διάνυσµα γραµµής µεγέθους n, θέτουµε M = 1, N = n. (Creates a matrix where every element is zero. For a row vector of size n, set M = 1, N = n). ones(M,N) ∆ηµιουργεί έναν πίνακα όπου κάθε στοιχείο του είναι ένα. Για διάνυσµα γραµµής µεγέθους n, θέτουµε M = 1, N = n. (Creates a matrix where every element is one. For a row vector of size n, set M = 1, N = n). linspace(x1, x2,N) ∆ηµιουργεί ένα διάνυσµα από Ν στοιχεία, ισοµερή καταµερισµένα µεταξύ x1 και x2. (Creates a vector of N elements, evenly spaced between x1 and x2). Εισαγωγή στο OCTAVE Σελ. 17 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Πίνακας 2: Συναρτήσεις δηµιουργίας διανυσµάτων ∆ηµιουργεί ένα διάνυσµα από Ν στοιχεία, λογαριθµικά καταµερισµένα µεταξύ 10x1 και 10x2. (Creates a vector of N elements, logarithmically spaced between 10x1 and 10x2). logspace(x1, x2,N) Οι πρώτες δύο συναρτήσεις του πίνακα, zeros και ones, επίσης δουλεύουν και για πίνακες, και τα δύο συναρτησιακά ορίσµατα, Μ και Ν, προσδιορίζουν τον αριθµό των γραµµών και στηλών στον πίνακα αντίστοιχα. Ένα διάνυσµα γραµµής είναι ένας πίνακας που έχει µία γραµµή και τόσες στήλες όσο το µέγεθος του διανύσµατος. 4.5 Εξαγωγή στοιχείων από διάνυσµα (Extracting elements from a vector) Μεµονωµένα στοιχεία ενός διανύσµατος αναφέρονται χρησιµοποιώντας κανονικές παρενθέσεις () και αριθµούνται ξεκινώντας από ένα, όχι µηδέν όπως στην C++. Εάν ορίσουµε ένα διάνυσµα: a=[1:2:6 -1 0] a= 1 3 5 -1 0 τότε µπορούµε να πάρουµε το τρίτο στοιχείο εισάγοντας: a(3) ans = 5 Ο συµβολισµός µε τις άνω-κάτω τελείες (colon) µπορεί επίσης να χρησιµοποιηθεί για να προσδιορίσει το εύρος αριθµών για να πάρουµε µερικά στοιχεία µε µια φορά: a(3:5) ans = 5 -1 0 a(1:2:5) ans = 1 5 0 Εισαγωγή στο OCTAVE Σελ. 18 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 4.6 Μαθηµατικά διανυσµάτων (Vector maths) Αποθηκεύοντας µια λίστα αριθµών σε ένα διάνυσµα επιτρέπει στο OCTAVE να χρησιµοποιεί µερικά από τα ισχυρά του χαρακτηριστικά για να κάνει υπολογισµούς. Στην C++ εάν θέλαµε να κάνουµε την ίδια λειτουργία σε µια λίστα από αριθµούς, ας υποθέσουµε ότι θέλαµε να πολλαπλασιάσουµε κάθε στοιχείο επί 2, θα έπρεπε να χρησιµοποιήσουµε ένα for loop για να προσπελάσουµε κάθε στοιχείο. Αυτό µπορεί επίσης να γίνει και στο OCTAVE (βλ. ενότητα 7), αλλά είναι πολύ πιο εύκολο να κάνουµε χρήση τις λειτουργίες του OCTAVE για διανύσµατα. Ο πολλαπλασιασµός όλων των αριθµών ενός διανύσµατος επί τον ίδιο αριθµό είναι τόσο απλός όσο ο πολλαπλασιασµός ολοκλήρου του διανύσµατος επί τον αριθµό. Το επόµενο παράδειγµα χρησιµοποιεί το διάνυσµα που ορίστηκε προηγουµένως: a*2 ans = 2 6 10 -2 0 Το ίδιο ισχύει και για τη διαίρεση. Μπορούµε επίσης να προσθέσουµε τον ίδιο αριθµό σε κάθε στοιχείο χρησιµοποιώντας τους τελεστές + ή -, αν και αυτό τυπικά δεν είναι συµβατό µαθηµατικά. Ο πολλαπλασιασµός δύο διανυσµάτων µαζί στο OCTAVE ακολουθεί τους κανόνες πολλαπλασιασµού πινάκων (βλ. ενότητα 9), που δεν κάνει στοιχείο προς στοιχείο πολλαπλασιασµό5. Εάν θέλουµε να κάνουµε αυτό, το OCTAVE ορίζει τους τελεστές .* και ./. Για παράδειγµα: a1 b1 a1b1 a 2 ⋅ * b2 = a 2 b 2 a b a b 3 3 3 3 Επισηµαίνεται η “.” µπροστά από κάθε σύµβολο, σηµαίνει ότι είναι µια στοιχείο-προςστοιχείο πράξη. Για παράδειγµα, µπορούµε να πολλαπλασιάσουµε κάθε στοιχείο του διανύσµατος a, που ορίστηκε προηγουµένως, µε διαφορετικό αριθµό: b = [1 2 3 4 5] a.*b ans = 1 6 15 -4 0 5 Υπενθυµίζεται ότι τα µόνα διανυσµατικά γινόµενα που ορίζονται µαθηµατικά είναι το dot γινόµενο και το cross γινόµενο. Και τα δύο αντιπροσωπεύουν ιδιαίτερες πράξεις σε δύο διανύσµατα, καµία από τις οποίες απλά πολλαπλασιάζει τα στοιχεία µαζί και επιστρέφει ένα άλλο διάνυσµα. Εισαγωγή στο OCTAVE Σελ. 19 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Ο στοιχείο-προς-στοιχείο τελεστής ύψωσης σε δύναµη (.^) είναι ιδιαίτερα χρήσιµος. Μπορεί να χρησιµοποιηθεί να υψώσουµε ένα διάνυσµα αριθµών σε κάποια δύναµη, ή να υψώσουµε έναν αριθµό σε διάφορες δυνάµεις, ανάλογα µε το πως τον χρησιµοποιούµε: b .^ 2 ans = 1 4 9 16 25 4 8 16 32 2 .^ b ans = 2 Το πρώτο παράδειγµα τετραγωνίζει κάθε στοιχείο του b. Το δεύτερο υψώνει τον αριθµό 2 σε κάθε από τις δυνάµεις που δίνονται στο b. Όλες οι στοιχείο-προς-στοιχείο εντολές (+, -, ./, .*, .^) µπορούν να χρησιµοποιηθούν µεταξύ δύο διανυσµάτων, εάν αυτά είναι του ιδίου µεγέθους (διαστάσεων) και µορφής. ∆ιαφορετικά αντίστοιχα στοιχεία δεν µπορεί να βρεθούν και δίνεται σφάλµα. Οι περισσότερες συναρτήσεις του OCTAVE επίσης γνωρίζουν τα των διανυσµάτων. Για παράδειγµα, για να δηµιουργήσουµε µια λίστα τιµών από ηµίτονα σε διαστήµατα 60 µοιρών, απλά χρειαζόµαστε να περάσουµε ένα διάνυσµα από γωνίες στη συνάρτηση ηµιτόνου: angles = [0:pi/3:2*pi] angles = 0 1.0472 2.0944 3.1416 4.1888 5.2360 6.2832 y=sin(angles) y= 0 5. 0.8660 0.8660 0.0000 -0.8660 -0.8660 -0.0000 Σχεδιαγραφώντας γραφήµατα (Plotting graphs) Το OCTAVE έχει ισχυρές διευκολύνσεις για σχεδιαγράµµατα γραφηµάτων µέσω ενός δευτέρου ανοιχτού-κώδικα προγράµµατος GNUPLOT6, αλλά µερικές από τις επιλογές είναι περιορισµένες σε σύγκριση µε εκείνες του MATLAB. Η βασική εντολή είναι plot(x, y), όπου x και y είναι οι 6 www.gnuplot.org. Εισαγωγή στο OCTAVE Σελ. 20 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος συντεταγµένες. Εάν δοθεί µόνο ένα ζεύγος αριθµών τότε σχεδιαγραφεί ένα σηµείο, αλλά συνήθως περνάµε διανύσµατα και σχεδιαγραφεί όλα τα σηµεία που δίνονται µε τα δύο διανύσµατα, ενώνοντάς τα µε ευθείες γραµµές7. Το ηµιτονικό γράφηµα που ορίστηκε προηγουµένως µπορεί να σχεδιαγραφεί εισάγοντας την εντολή: plot(angles, y) Ένα νέο παράθυρο πρέπει να ανοίξει, που θα δεικνύει το γράφηµα, που φαίνεται στο Σχήµα 1. Επισηµαίνεται ότι το OCTAVE αυτόµατα επιλέγει την κλίµακα και σχεδιαγραφεί τους άξονες. Σχήµα 1: Γράφηµα του y = sin(x), µε δειγµατοληψία κάθε 60ο. Προς το παρόν το γράφηµα δεν µοιάζει ιδιαίτερα σαν παράσταση ηµιτόνου, διότι έχουµε µόνο πάρει τιµές κάθε 60 µοίρες. Για να σχεδιαγράψουµε ένα πιο ακριβές γράφηµα, χρειαζόµαστε να υπολογίσουµε το y σε υψηλότερη ανάλυση (περισσότερες τιµές): angles = linspace(0, 2*pi, 100); y = sin(angles); plot(angles, y); Η εντολή linspace δηµιουργεί ένα διάνυσµα µε 100 τιµές καταµερισµένες σε ίσα διαστήµατα µεταξύ 0 και 2π (η τιµή 100 επιλέχθηκε µε δοκιµή και λάθος). ∆οκιµάστε αυτές τις εντολές για να κάνετε τα σχεδιαγράµµατα ξανά µε µεγαλύτερη ανάλυση. Θυµηθείτε ότι µπορεί να χρησιµοποιήσετε τα βέλη ↑ και ↓ για να µεταβείτε πίσω και να ξαναχρησιµοποιήσετε τις προηγούµενες εντολές σας. Το επόµενο Σχήµα 2 δείχνει το γράφηµα µε τις πιο πάνω εντολές: 7 Τα δύο διανύσµατα πρέπει, φυσικά, να είναι του ιδίου µήκους. Εισαγωγή στο OCTAVE Σελ. 21 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σχήµα 2: Γράφηµα του y = sin(x), µε 100 τιµές µεταξύ 0 και 2π. 5.1 Βελτιώνοντας την παρουσίαση (Improving the presentation) Μπορούµε να επιλέξουµε το χρώµα και το στυλ της γραµµής για τα γραφήµατα χρησιµοποιώντας ένα τρίτο όρισµα στην εντολή (συνάρτηση) plot. Για παράδειγµα, για να σχεδιαγράψουµε το γράφηµα µε κόκκινους κύκλους, εισάγουµε: plot(angles, y, ‘ro’) Το τρίτο όρισµα είναι ένα αλφαριθµητικό το οποίο περιγράφει επιθυµητά στυλ. Ο παρακάτω Πίνακας 3 δεικνύει τις πιθανές τιµές (επίσης διαθέσιµος µε την εισαγωγή help plot στο OCTAVE). Πίνακας 3: Χρώµατα και στυλ για σύµβολα και γραµµές στις εντολές σχεδιαγραµµάτων (βλ help plot) w white (άσπρο) . point (σηµείο) - solid (συνεχόµενη) m magenta (βαθυκόκκινο) ο circle (κύκλος) : dotted† (τελείες) c cyan (κυανού) x x-mark (x-σηµάδι) -. r red (κόκκινο) + plus (συν) dashdot† (διακεκοµµένη µε τελείες) g green (πράσινο) * star (αστερίσκος) -- dashed† b blue (µπλε) s square† (τετράγωνο) y yellow† (κίτρινο) d diamond† (ρόµβος) k black† (µαύρο) v triangle (down)† [τρίγωνο (κάτω)] ^ triangle (up)† [τρίγωνο (απάνω)] < triangle (left)† [τρίγωνο (αριστερά)] > triangle (right)† [τρίγωνο (δεξιά)] p pentagram (πεντάγραµµο) h hexagram (εξάγραµµο) (διακεκοµµένη † Μόνο διαθέσιµο στο MATLAB Εισαγωγή στο OCTAVE Σελ. 22 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Για να δώσουµε τίτλο στο γράφηµα και ετικέτες στους άξονες χρησιµοποιούµε τις εντολές title, xlabel και ylabel: title (’Graph of y = sin(x)’) xlabel (’Angle’) ylabel (’Value’) Τα αλφαριθµητικά στο OCTAVE (όπως τα ονόµατα των αξόνων) καθορίζονται χρησιµοποιώντας αποστρόφους (‘ ’). Σε µερικές περιπτώσεις η εντολή replot πρέπει να χρησιµοποιηθεί για να είναι σε θέση το γράφηµα να ενηµερωθεί. Πλέγµα επίσης µπορεί να προστεθεί στο γράφηµα, εισάγοντας την εντολή: grid on Το παρακάτω Σχήµα 3 δεικνύει το αποτέλεσµα. Μπορούµε να µεγεθύνουµε το σχήµα ή να το κάνουµε διαφορετικού ύψους και πλάτους µε το να σύροµε τις γωνίες του παραθύρου του. Σχήµα 3: Γράφηµα του y = sin(x), µε κόκκινους κύκλους κάθε σηµείο του. 5.2 Πολλαπλά γραφήµατα (Multiple graphs) Περισσότερα γραφήµατα µπορούµε να σχεδιάσουµε στο ίδιο σχήµα προσθέτοντας περισσότερα ορίσµατα στην εντολή plot, δίνοντας τα x και y διανύσµατα για κάθε γράφηµα. Για παράδειγµα, για να σχεδιαγράψουµε το γράφηµα του συνηµίτονου µαζί µε το προηγούµενο ηµίτονο γράφηµα, εισάγουµε: plot (angles, y,’:’, angles, cos (angles), ’-’) Εισαγωγή στο OCTAVE Σελ. 23 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος όπου τα επιπρόσθετα τρία ορίσµατα ορίζουν το γράφηµα του συνηµίτονου και το στυλ της γραµµής του. Μπορούµε να προσθέσουµε λεζάντα στο σχεδιάγραµµα χρησιµοποιώντας την legend εντολή: legend (’Sine’, ’Cosine’) όπου προσδιορίζουµε τα ονόµατα για τα γραφήµατα µε τη σειρά που σχεδιαγράφησαν. Με τις παραπάνω εντολές πρέπει να είµαστε σε θέση να πάρουµε ένα ζεύγος γραφηµάτων όπως στο επόµενο Σχήµα 4. Σχήµα 4: Γραφήµατα του y = sin(x) και y = cos(x). Μέχρι τώρα, κάθε φορά που εισάγαµε µια plot εντολή, τα υπάρχοντα περιεχόµενα του σχήµατος είχαν σβηστεί. Εάν θέλουµε να διατηρήσουµε την τρέχουσα καµπύλη και να εναποθέσουµε νέες καµπύλες (plots) πάνω σε αυτό, µπορούµε να χρησιµοποιήσουµε την εντολή hold on. Χρησιµοποιώντας αυτή την εντολή, τα δύο γραφήµατα (ηµιτόνου και συνηµτόνου) θα µπορούσαν να σχεδιαστούν χρησιµοποιώντας δύο ξεχωριστές εντολές plot: plot (angles, y, ’:’) hold on plot (angles, cos (angles), ’g-’) legend (’Sine’, ’Cosine’) Εάν θέλουµε να ελευθερώσουµε το κλείδωµα του τρέχοντος σχεδιαγράµµατος, η εντολή που εισάγουµε είναι hold off. 5.3 Πολλαπλά σχεδιαγράµµατα (Multiple figures) Μπορούµε επίσης να έχουµε πολλαπλά παράθυρα σχεδιαγραµµάτων. Εάν εισάγουµε: figure Εισαγωγή στο OCTAVE Σελ. 24 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος η επόµενη εντολή plot θα παράγει ένα γράφηµα σε ένα νέο παράθυρο σχεδιαγράµµατος. Για παράδειγµα, εισάγοντας: plot (angles, tan (angles)) θα σχεδιάσει τη συνάρτηση της εφαπτοµένης σε αυτό το νέο παράθυρο (βλ. παρακάτω Σχήµα 5(α))8. Εάν θέλουµε να πάµε πίσω και να κάνουµε plot στο πρώτο σχεδιάγραµµα, µπορούµε να εισάγουµε: figure(0) 5.4 Χειρονακτική κλίµακα (Manual scaling) Η συνάρτηση της εφαπτοµένης που µόλις κάναµε plot δεν φαίνεται καλά διότι το διάνυσµα angles έχει µόνο 100 στοιχεία, και έτσι πολύ λίγα σηµεία αντιπροσωπεύουν τις ασύµπτωτες. Ωστόσο, ακόµη και µε περισσότερες τιµές συµπεριλαµβανοµένης και της π/2, ουδέποτε θα φαίνεται σωστά, διότι δεικνύοντας το άπειρο είναι δύσκολο (το OCTAVE ούτε καν προσπαθεί). Μπορούµε να κρύψουµε αυτού του είδους προβλήµατα µε το να εστιάσουµε στο τµήµα του γραφήµατος που πραγµατικά ενδιαφερόµαστε. Η εντολή axis µας επιτρέπει να επιλέξουµε χειρωνακτικά τους άξονες. Η εντολή axis παίρνει ένα όρισµα που είναι διάνυσµα και ορίζεται σαν (xmin, xmax, ymin, ymax). Έτσι εάν εισάγουµε: figure(2) axis ([0 7 -5 5]) το σχεδιάγραµµα έχει κλίµακα όπως φαίνεται στο Σχήµα 5(β). Επισηµαίνονται οι παρενθέσεις στη συνάρτηση (εντολή) axis και οι αγκύλες που ορίζουν το διάνυσµα σαν όρισµα. (a) Default scaling (b) Manual scaling Σχήµα 5: Γράφηµα του y = tan(x) µε default scaling (Σχήµα 5a) , και µε χρήση axis([0 7 -5 5] (Σχήµα 5b)). 8 Στο MATLAB η εντολή figure φέρνει ένα νέο παράθυρο αµέσως ενώ στο OCTAVE το νέο παράθυρο ίσως να µην εµφανιστεί µέχρις ότου εισάγουµε την plot εντολή. Εισαγωγή στο OCTAVE Σελ. 25 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Το OCTAVE σε συνδυασµό µε το GNUPLOT, επιτρέπει άµεση αλληλεπίδραση µε το παράθυρο γραφικών, όπως για να εστιάσουµε κάπου σέρνουµε µε το δεξί κουµπί του ποντικιού ένα κουτί γύρω από την περιοχή που µας ενδιαφέρει και επιλέγουµε µε το αριστερό κουµπί. Λεπτοµέρειες από άλλες ενέργειες και δυνατότητες µε τα πλήκτρα (όταν το παράθυρο γραφικών είναι 9 επιλεγµένο) δεικνύονται στον επόµενο Πίνακα 4 . Πίνακας 4: Ποντίκι και δυνατότητες µε πλήκτρα για αλληλεπίδραση µε 2D γραφικά, (LMB - Left Mouse Button, RMB – Right Mouse Button), βλ. επίσης Πίνακα 8. Ποντίκι (Mouse) Ενέργειες LMB Επισηµειώνω το γράφηµα (Annotate the graph.) RMB Επισηµειώνω την περιοχή εστίασης (Mark Zoom region.) Πλήκτρα Ενέργειες a Autoscale and Replot b Toggle Border e Replot (removes annotations) g Toggle grid h Help l Toggle Logscales L Toggle individual axis m Toggle Mouse control r Toggle Ruler 1 Decrement mousemode 2 Increment mousemode 3 Decrement clipboardmode 4 Increment clipboardmode 5 Toggle polardistance 6 Toggle verbose 7 Toggle graph size ratio n Go to next zoom in the zoom stack p Go to previous zoom in the zoom stack u Unzoom Escape Cancel zoom region 9 Στο MATLAB πρόσβαση στις γραφικές εντολές είναι µέσω εικόνων και µενού γύρο από το παράθυρο γραφικών. Εισαγωγή στο OCTAVE Σελ. 26 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 5.5 Αποθήκευση και εκτύπωση σχηµάτων (Saving and printing figures) Το OCTAVE/GNUPLOT δεν προσφέρει µε το ποντίκι ή µε πλήκτρο οδηγούµενη δυνατότητα. Ωστόσο, τα γραφήµατα µπορούν να εκτυπωθούν στον εκτυπωτή από την γραµµή εντολών (command line) εισάγοντας print στην προτροπή. Η help print δίνει πληροφορίες για τις πολλές διαθέσιµες επιλογές εκτύπωσης συµπεριλαµβανοµένης: print (‘graph1.eps’ , ’-deps’) για την αποθήκευση µιας postscript έκδοσης του γραφήµατος σε ένα αρχείο graph1.eps. Για την αποθήκευση ενός PNG format εικόνας, εισάγουµε: print (‘graph1.png’, ’-dpng’) 6. OCTAVE Προγραµµατισµός Ι: Αρχεία Script (Octave programming I: Script files) Εάν έχουµε µια σειρά από εντολές που θέλουµε να τις εισάγουµε ξανά και ξανά, µπορούµε να τις αποθηκεύσουµε σε ένα OCTAVE script. Αυτό είναι ένα αρχείο κειµένου που περιέχει εντολές και είναι ο βασικός τύπος ενός OCTAVE προγράµµατος. Όταν εκτελούµε ένα script αρχείο στο OCTAVE, έχει το ίδιο αποτέλεσµα σαν να εισάγουµε τις εντολές από εκείνο το αρχείο, γραµµή προς γραµµή. Τα script αρχεία είναι επίσης χρήσιµα όταν δεν είµαστε αρκετά σίγουροι για τη σειρά των εντολών που θέλουµε να χρησιµοποιήσουµε, διότι είναι ευκολότερο να τις επεξεργαστούµε σε ένα αρχείο κειµένου χρησιµοποιώντας τον δροµέα και τα πλήκτρα για να ανακαλέσουµε και να επεξεργαστούµε προηγούµενες γραµµές εντολών που µόλις δοκιµάσαµε. Τα OCTAVE script αρχεία είναι κανονικά αρχεία κειµένου, αλλά πρέπει να έχουν µια .m επέκταση στο όνοµα του αρχείου (όπως run.m). Για αυτό το λόγο, µερικές φορές ονοµάζονται M-files. Το υπόλοιπο όνοµα του αρχείου (η λέξη run στο παράδειγµα) είναι η εντολή που εισάγουµε στο OCTAVE για να εκτελέσει το script. 6.1 ∆ηµιουργία και επεξεργασία ενός script (Creating and editing a script) Μπορούµε να δηµιουργήσουµε ένα αρχείο script σε οποιοδήποτε κειµενογράφο (όπως emacs, notepad), και µπορούµε να εκκινήσουµε έναν κειµενογράφο µέσα από το OCTAVE εισάγοντας την εντολή: edit Αυτή η εντολή θα εκκινήσει τον κειµενογράφο σε ένα νέο παράθυρο10. Εάν θέλουµε να επεξεργαστούµε ένα υπάρχον αρχείο script, µπορούµε να συµπεριλάβουµε το όνοµα του script αρχείου. Εάν, για παράδειγµα, είχαµε ένα script ονοµαζόµενο run.m, τότε εισάγοντας edit run, θα άνοιγε τον κειµενογράφο και θα φόρτωνε αυτό το αρχείο για επεξεργασία. 10 Μπορούµε να διαµορφώσουµε την εντολή edit να εκκινήσει τον κειµενογράφο της επιλογής µας. Εισαγωγή στο OCTAVE Σελ. 27 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Στο κείµενο απλά εισάγουµε τις εντολές που θέλουµε το OCTAVE να εκτελέσει. Για παράδειγµα, ξεκινήστε τον κειµενογράφο εάν δεν τον έχετε ήδη ξεκινήσει και εισάγετε τις εξής εντολές σ’ αυτόν (αλλά πρώτα διαγράψετε όποιες γραµµές δεν χρειάζεστε): % Script υπολογισµού και ένδειξεις του σχεδιαγράµµατος µιας % ανορθωµένης ηµιτονικής κυµατοµορφής t = linspace (0, 10, 100); y = abs (sin (t)); % Η εντολή abs κάνει όλες τις αρνητικές τιµές θετικές plot (t, y); title (‘Rectified Sine Wave’); labelx (‘t’); Το «%» σύµβολο αναγνωρίζει ένα σχόλιο και οποιοδήποτε κείµενο σε µια γραµµή µετά το % αγνοείται από το OCTAVE. Σχόλια πρέπει να χρησιµοποιούνται στο script για να περιγράφουν το τι κάνει, για το όφελος άλλων που το χρησιµοποιούν και επίσης για εσάς αργότερα µετά από µερικές εβδοµάδες που θα έχετε ξεχάσει το σκεπτικό του προγράµµατος. Επιλέξτε File Save As … από το µενού του κειµενογράφου και αποθηκεύσετε το αρχείο σας ως rectsin.m. Έχετε τελειώσει µε το παράθυρο του κειµενογράφου, αλλά καλό είναι να το αφήσετε ανοιχτό διότι χωρίς αµφιβολία θα το χρησιµοποιήσετε ξανά. 6.2 Τρέξιµο και εκσφαλµάτωση των scripts (Running and debugging scripts) Για να τρέξουµε το script, εισάγουµε το όνοµά του στο κυρίως παράθυρο του OCTAVE. Για το script που µόλις δηµιουργήσαµε εισάγουµε: rectsin Ένα σχήµα σε ένα παράθυρο θα εµφανιστεί που θα δείχνει την ανορθωµένη ηµιτονική κυµατοµορφή. Αλλά, εάν εισάγαµε το script στον κειµενογράφο ακριβώς όπως δίνεται παραπάνω, επίσης θα δούµε στο παράθυρο εντολών του OCTAVE: error: ‘labelx’ undefined near line 6 column 1 error: called from: error: C:\Users\Apostolos\Desktop\3.3.3_gcc-4.3.0\apl_examples\ rectsin.m at line 6, column 1 που δείχνουν ότι υπάρχει σφάλµα στο script11. Τα σφάλµατα στο OCTAVE έχουν καλύτερη σηµασία όταν διαβάζονται από κάτω (το τέλος) προς τα πάνω (στην αρχή). Το παραπάνω σφάλµα λέει ότι στην γραµµή 6 του rectsin.m, δεν γνωρίζει τι να κάνει µε την εντολή ‘labelx’. Η αιτία, φυσικά είναι ότι η εντολή πρέπει να είναι ‘xlabel’. Πηγαίνοντας πίσω στον κειµενογράφο, διορθώνουµε το σφάλµα, και µετά αποθηκεύουµε ξανά το αρχείο. Μην ξεχνάτε να αποθηκεύετε το αρχείο κάθε φορά που το επεξεργάζεστε. 11 Εάν βρήκατε το σφάλµα όταν γράφατε εισάγατε το script, και το διορθώσατε, καλώς! Εισαγωγή στο OCTAVE Σελ. 28 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Προσπαθήστε να τρέξετε ξανά το διορθωµένο script αρχείο και αυτή τη φορά πρέπει να δώσει σωστά την ετικέτα στον x-άξονα, όπως φαίνεται στο παρακάτω Σχήµα 6. Σχήµα 6: Γράφηµα της ανορθωµένης ηµιτονικής κυµατοµορφής, παρήχθη µε το rectsin.m script. 6.3 Περιεχόµενο των scripts (Remembering previous scripts) Τα script αρχεία είναι πολύ χρήσιµα στο OCTAVE και εάν δεν είµαστε προσεκτικοί σύντοµα βρισκόµαστε µε αρκετά scripts για διαφορετικές εργασίες και µετά δεν θυµούµαστε τι κάνει το καθένα. Εάν θέλουµε να γνωρίζουµε τι scripts έχουµε, εισάγουµε την εντολή what για να µας δώσει µια λίστα από όλα τα scripts και τα αρχεία δεδοµένων (data files): what m-files in current directory /mnt/hda7/Octave/tutorial rectsin.m mat-files in current directory /mnt/hda7/Octave/tutorial Το OCTAVE σύστηµα βοήθειας επίσης θα αναγνωρίσει αυτόµατα τα scripts. Εάν ζητήσουµε βοήθεια για το rectsin script θα πάρουµε: help rectsin % Script υπολογισµού και ένδειξεις του σχεδιαγράµµατος µιας % ανορθωµένης ηµιτονικής κυµατοµορφής Το OCTAVE υποθέτει ότι οι πρώτες γραµµές µε τα σχόλια στο M-file είναι µια περιγραφή του script και εµφανίζει αυτά τα σχόλια όταν ζητάµε βοήθεια. Πρέπει να προσθέτουµε γραµµές µε σχόλια στην κορυφή για κάθε script που γράφουµε για να βοηθούµαστε στην αναζήτηση για το τι κάνει το καθένα. 7. Εκφράσεις ελέγχου (Control statements) Μέχρι τώρα τα προγράµµατα και οι εκφράσεις που έχουµε δει περιείχαν απλές ακολουθιακές εντολές. Η χρήση των διανυσµάτων (και αργότερα των πινάκων) για την επίλυση προβληµάτων Εισαγωγή στο OCTAVE Σελ. 29 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος επιβάλλουν περισσότερο απαιτητικούς υπολογισµούς από απλές εκφράσεις. Έτσι πέρα από µερικές τυπικές δοµές χρειαζόµαστε και εκφράσεις ελέγχου προγραµµάτων. Οι εκφράσεις ελέγχου ελέγχουν τη ροή της εκτέλεσης των προγραµµάτων επιτρέποντας είτε την επαναληπτική είτε την κατά επιλογή εκτέλεση άλλων εντολών. Όλες οι εκφράσεις ελέγχου αρχίζουν µε ειδικές δεσµευµένες λέξεις. Κάθε έκφραση ελέγχου έχει µια αντίστοιχη δεσµευµένη λέξη END. Η λίστα των εκφράσεων που περιέχονται µεταξύ της αρχικής ειδικής δεσµευµένης λέξης και της αντίστοιχης δεσµευµένης λέξης END ονοµάζεται το σώµα της έκφρασης ελέγχου. Το OCTAVE υποστηρίζει τις σύνηθες δοµές βρόχων. 7.1 if...else selection Στα προγράµµατα συχνά θέλουµε να εκτελέσουµε διαφορετικές εντολές που εξαρτώνται από κάποια συνθήκη. Η συνηθισµένη εντολή σ’ αυτές τις περιπτώσεις είναι η if. Η γενική µορφή της έκφρασης if στο OCTAVE είναι: if expression statements elseif expression statements else statements end Αυτή είναι λίγο διαφορετική από τη σύνταξη της C++: οι παρενθέσεις () γύρω από την συνθήκη (expression) δεν χρειάζονται (αν και µπορεί να χρησιµοποιηθούν για διαύγεια) και το τµήµα των εκφράσεων (statements) δεν χρειάζεται να καθοριστεί µε αγκύλες {}. Αντί αυτού, η εντολή end χρησιµοποιείται για να δηλώσει το τέλος της if έκφρασης. Ενώ οι εκφράσεις ελέγχου, όπως το if, συνήθως χρησιµοποιούνται στα OCTAVE scripts, αυτές επίσης µπορούν να εισαχθούν στην γραµµή εντολών όπως στο παράδειγµα: a=0; b=2; if a > b c=3 else c=4 end c= 4 Εάν τις εισάγουµε στην γραµµή εντολών, το OCTAVE περιµένει µέχρις ότου εισαχθεί το τελευταίο end πριν αξιολογήσει τη συνθήκη. Εισαγωγή στο OCTAVE Σελ. 30 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Πολλές εκφράσεις ελέγχου στηρίζονται στην αξιολόγηση κάποιας λογικής συνθήκης (logical expression) – κάποια έκφραση που µπορεί να είναι αληθής ή ψευδής ανάλογα µε τις τρέχουσες τιµές. Στο OCTAVE, οι λογικές συνθήκες επιστρέφουν αριθµούς: 0 εάν η συνθήκη είναι ψευδής και 1 εάν είναι αληθής: 1==2 ans = 0 pi > exp(1) & sqrt(-1) == i ans = 1 Μια πλήρης λίστα από σχεσιακούς και λογικούς τελεστές διατίθεται, όπως φαίνεται στον παρακάτω Πίνακα 5. Επισηµαίνεται ότι δεν είναι ακριβώς οι ίδιοι όπως στην C++. Πίνακας 5: Εκφράσεις Boole (Boolean expressions) Σύµβολο Έννοια Παράδειγµα == equal (ίσο) if x == y ~= not equal (όχι ίσο) if x ~= y greater than (µεγαλύτερο από) if x > y greater than or equal (µεγαλύτερο από ή ίσο) if x >= y less than (λιγότερο από) if x < y less than or equal (λιγότερο από ή ίσο) if x <= y & AND (ΚΑΙ) if x == 1 & y > 2 | OR (Ή) if x == 1 | y > 2 ~ NOT (Άρνηση, ΟΧΙ) x = ~y > >= < <= Άσκηση 1: Να βρεθεί ο λογάριθµος του x. Λύση: if x > 0 y = log(x); elseif x < 0 y = log(-x); else Εισαγωγή στο OCTAVE Σελ. 31 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος disp("Cannot take the log of zero."); endif Άσκηση 2: Να εισαχθεί ένας αριθµός και να προσδιοριστεί εάν αυτός είναι θετικός. Λύση: x = input("Enter a number: "); x =5; if x > 0 disp("The number is positive."); endif Άσκηση 3: Να εισαχθεί ένας αριθµός και να προσδιοριστεί εάν αυτός είναι αρνητικός. Λύση: x = input("Enter a number: "); if x < 0 disp("The number is negative."); endif Άσκηση 4: Να εισαχθεί ένας αριθµός και να προσδιοριστεί εάν αυτός είναι µηδέν. Λύση: x = input("Enter a number: "); if x == 0 disp("The number is zero."); endif 7.2 switch selection Εάν βρεθούµε στην ανάγκη να χρησιµοποιήσουµε πολλαπλές if/elseif εκφράσεις και να επιλέξουµε µεταξύ διαφόρων επιλογών, ίσως είναι καλύτερα να χρησιµοποιήσουµε την έκφραση switch. Αυτή έχει την ακόλουθη µορφή: switch x case x1 , statements case x2 , statements otherwise, statements end Εισαγωγή στο OCTAVE Σελ. 32 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Στην έκφραση switch η τιµή της µεταβλητής x συγκρίνεται µε κάθε µία από τις περιπτώσεις (case) της λίστας και εάν βρεθεί µία που είναι ίση τότε εκτελούνται οι αντίστοιχες εκφράσεις της. Επισηµαίνεται ότι αντίθετα µε την C++ η εντολή break στο τέλος των εκφράσεων κάθε περίπτωσης δεν είναι αναγκαία, γιατί το OCTAVE εκτελεί εντολές µέχρι την εντολή της επόµενης περίπτωσης. Εάν δεν βρεθεί ταύτιση, οι εκφράσεις otherwise εκτελούνται εάν αυτές υπάρχουν. Ένα παράδειγµα είναι ως εξής: a=1; switch a case 0 disp(’a is zero’); case 1 disp(’a is one’); otherwise disp(’a is not a binary digit’); end a is one Η συνάρτηση disp εµφανίζει µια τιµή ή ένα αλφαριθµητικό. Σ’ αυτό το παράδειγµα χρησιµοποιείται για να εµφανίσει αλφαριθµητικά, αλλά µπορεί επίσης να χρησιµοποιηθεί µε µεταβλητές, πχ., disp(a) θα εµφανίσει την τιµή του a. Άσκηση 1: Να γραφτεί πρόγραµµα χρησιµοποιώντας την έκφραση switch που να δίνει την τιµή του εισιτήριου από την Αθήνα για προορισµό στις πόλεις Ρώµη, Λονδίνο και Μόσχα. Λύση: city = input (‘Enter destination city: ‘, ‘s’) switch city case ‘Rome’ disp(‘100 Euros’) case ‘London’ disp(‘150 Euros’) case ‘Moscow’ disp(‘120 Euros’) otherwise sprintf(‘No flights for %s’, city) endswitch Εισαγωγή στο OCTAVE Σελ. 33 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 7.3 for loops Η προγραµµατιστική δοµή µε τις περισσότερες πιθανότητες να χρησιµοποιηθεί είναι ο βρόχος for, ο οποίος επαναλαµβάνει ένα τµήµα κώδικα µερικές φορές µε κάποιο βήµα. Στο OCTAVE πρέπει να γίνεται χρήση της αριθµητικής των διανυσµάτων αντί του for loop, εάν είναι δυνατόν, καθώς ένα for loop είναι περίπου 40 φορές πιο αργό12. Ωστόσο, υπάρχουν στιγµές που το for loop είναι αναπόφευκτο. Η σύνταξή του είναι: for variable = vector statements end όπου η µεταβλητή vector περιέχει τους αριθµούς των βηµατικών επαναλήψεων. Συνήθως το vector εκφράζεται σε µορφή άνω-κάτω τελεία (:), όπως στο επόµενο παράδειγµα που δηµιουργεί ένα διάνυσµα µε τους πρώτους 5 όρους για το παραγοντικό του n: for n=1:5 nf(n) = factorial(n); end disp(nf) 1 2 6 24 120 Επισηµαίνεται η χρήση του ερωτηµατικού (;) στο τέλος της γραµµής στο for loop. Αυτό αποτρέπει τo OCTAVE από το να εµφανίζει την τρέχουσα τιµή της µεταβλητής nf(n) κάθε φορά γύρω στο βρόχο, το οποίο θα είναι κάπως ενοχλητικό (δοκιµάστε το χωρίς το ερωτηµατικό εάν θέλετε). Άσκηση 1: Να υπολογιστεί η παράσταση j +2 για j=1, 2, 3, 4, 5. Λύση: for j=1:5 J+2 end ans ans ans ans = = = = 3 4 5 6 12 Αυτό δεν σηµαίνει ότι τα for loops είναι αργά, απλά το OCTAVE είναι υψηλά βελτιστοποιηµένο για υπολογισµούς µε πίνακες/διανύσµατα. Επίσης αρκετοί σηµερινοί ηλεκτρονικοί υπολογιστές συµπεριλαµβάνουν εντολές για ταχύτερους υπολογισµούς πινάκων, διότι οι πίνακες είναι βασικοί για τα τρισδιάστατα γραφικά στα παιχνίδια των ηλεκτρονικών υπολογιστών. Για παράδειγµα, οι εντολές ‘MMX’ προστέθηκαν στον επεξεργαστή Intel Pentium το 1995, και σε µετέπειτα επεξεργαστές, είναι ‘Matrix Maths eXtentions’. Εισαγωγή στο OCTAVE Σελ. 34 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ans = 7 Άσκηση 2: Να υψωθούν στο τετράγωνο τα στοιχεία του διανύσµατος x=[1, 2, 3, 4, 5]. Λύση: for j=1:5 x(J) = j^2; end x x = [1 4 9 16 25] Άσκηση 3: Να υψωθούν στο τετράγωνο τα στοιχεία του διανύσµατος x=[1, 2, 3, 4, 5]. Λύση: for j=1:5 x(J) = j^2; end x x = [1 4 9 16 25] 5 Άσκηση 4: Να υπολογιστεί το άθροισµα ∑ (i + 1) . i i =1 Λύση: sum=0; for i=1:5 sum = sum + (i +1)^i; end sum sum =8476 6 Άσκηση 5: Να υπολογιστεί το γινόµενο ∏ (x 3 − xi ) για τις τιµές του xi , i = 1,...,6 που i =1,i ≠3 προκύπτουν εάν ( xi = 0.2(i − 1), Λύση: Εισαγωγή στο OCTAVE διαµερίσουµε το διάστηµα [0, 1] σε 5 ισοµήκη διαστήµατα i = 1,...,6 ). Σελ. 35 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος x = (0:5)/5 product=1; for i=1:2, product = product * (x(3) – x(i)); end for i=4:6, product = product * (x(3) – x(i)); end product product = - 0.0038400 1 n Άσκηση 6: Να υπολογιστεί ο µέσος όρος x = ∑ xi για µια λίστα τιµών. n i =1 Λύση: x = [1 2 3 4 5] x_mean = 0; for entry = x, x_mean = x_mean + entry; endfor x_mean = x_mean / length(x) x_mean x_mean = 3 7.4 while loops Εάν δεν γνωρίζουµε ακριβώς τον αριθµό των επαναλήψεων που χρειαζόµαστε και θέλουµε επαναλήψεις µέχρις ότου κάποια συνθήκη ικανοποιείται, το OCTAVE παρέχει το while loop: while expression statements end Για παράδειγµα: x=1; while 1+x > 1 x = x/2; end x x = 1.1102e-016 Εισαγωγή στο OCTAVE Σελ. 36 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Άσκηση 1: Να δηµιουργηθεί µια µεταβλητή fib η οποία περιέχει τα πρώτα 10 στοιχεία της σειράς Fibonacci. Λύση: fib = ones (1, 10); i = 3; while (i <= 10) fib (i) = fib (i-1) + fib (i-2); i++; end fib fib = 1 1 2 3 5 8 13 21 34 55 Άσκηση 2: Να δηµιουργηθεί µια µεταβλητή fib η οποία περιέχει τα πρώτα 10 στοιχεία της σειράς Fibonacci. Λύση: x = 1.0; while x < 10 x = x*2; disp(x); endwhile end 2 4 x x=4 7.5 Η έκφραση do-until Η έκφραση do-until είναι παρόµοια µε την έκφραση while, εκτός του ότι επαναληπτικά εκτελεί µια έκφραση µέχρις ότου µια συνθήκη γίνει αληθής και εκτός του ότι ο έλεγχος της συνθήκης είναι στο τέλος του βρόχου, έτσι το σώµα του βρόχου πάντοτε εκτελείται το λιγότερο µια φορά. Όπως και µε τη συνθήκη σε µια if έκφραση, η συνθήκη σε µια do-until έκφραση θεωρείται αληθής εάν η τιµή της είναι µη µηδενική, και ψευδής εάν η τιµή της είναι µηδενική. Εάν η τιµή της υπό συνθήκης έκφρασης σε µιαν έκφραση do-until είναι ένα διάνυσµα ή ένας πίνακας, θεωρείται αληθής µόνο εάν είναι µη κενή (non-empty) και όλα τα στοιχεία είναι µη µηδενικά. Η do-until έκφραση στο Octave συντάσσεται ως εξής: do Εισαγωγή στο OCTAVE Σελ. 37 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος body until (condition) Εδώ το body (σώµα) είναι µια έκφραση ή λίστα από εκφράσεις που ονοµάζουµε το σώµα του βρόχου, και condition (συνθήκη) είναι µια έκφραση που ελέγχει για πόσο θα εκτελείται ή θα τρέχει ο βρόχος. Το επόµενο παράδειγµα δηµιουργεί µια µεταβλητή fib που περιέχει τα πρώτα 10 στοιχεία µιας ακολουθίας Fibonacci. fib = ones (1, 10); i = 2; do i++; fib (i) = fib (i-1) + fib (i-2); until (i == 10) fib fib = 1 1 7.6 2 3 5 8 13 21 34 55 Οι εκφράσεις break και continue Μερικές φορές είναι ανάγκη να εξέλθουµε από έναν βρόχο κάπου στη µέση της εκτέλεσής του ή να συνεχίσουµε στην επόµενη τιµή σε έναν for βρόχο χωρίς την εκτέλεση των υπόλοιπων εντολών του για την τρέχουσα τιµή. Εδώ χρησιµοποιούµε τις εκφράσεις break και continue. Ο παρακάτω κώδικας δεικνύει πώς χρησιµοποιούµε την έκφραση break. total = 0; while true x = input('Value to add (enter 0 to stop): '); if x == 0 break; endif total = total + x; disp(['Total: ', num2str(total)]); endwhile Χωρίς την έκφραση break, ο βρόχος θα εξακολουθούσε να εκτελείται για πάντα καθώς η συνθήκη του βρόχου while είναι πάντοτε true. Το break µας επιτρέπει να πηδήξουµε µετά από το end του βρόχου (στην έκφραση µετά την endwhile). The break statement can be used in any loop: for, while or do...until. Εισαγωγή στο OCTAVE Σελ. 38 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Η έκφραση continue επίσης πηδάει από το εσωτερικό του ενός βρόχου αλλά επιστρέφει στην αρχή του βρόχου σε αντίθεση να πηγαίνει στο τέλος. Σε ένα for loop, η επόµενη τιµή µέσα στο διάνυσµα θα ανατεθεί στην µεταβλητή for (εάν υπάρχουν ακόµη) και το loop ξανάρχισε µε αυτή την τιµή; Σε ένα while loop, η συνθήκη στην αρχή του βρόχου θα επανεξεταστεί και ο βρόχος θα συνεχίσει εάν είναι ακόµη αληθής (true); Σε ένα do...until loop, η συνθήκη στο τέλος του βρόχου θα εξεταστεί και ο βρόχος θα συνεχίσει από την αρχή εάν είναι ακόµη ψευδής (false). Σαν ένα παράδειγµα, ο παρακάτω κώδικας θα γεµίσει το κάτω τριγωνικό µέρος ενός τετραγωνικού πίνακα µε 1 και τα υπόλοιπα στοιχεία µε 0. N = 5; A = zeros(N); % Create an N x N matrix filled with 0s for row = 1:N for column = 1:N if column > row continue; endif A(row, column) = 1; endfor endfor disp(A); Σηµείωση: Το εσωτερικό for πηδάει (continues) πάνω από τον κώδικα που αναθέτει 1 σε µια εισαγωγή του A όταν ο δείκτης της στήλης είναι µεγαλύτερος από τον δείκτη της γραµµής. 7.7 Ορθότητα και ακρίβεια (Accuracy and precision) Ας θεωρήσουµε ξανά τον κώδικα: x=1; while 1+x > 1 x = x/2; end x x = 1.1102e-016 Το παραπάνω while loop συνεχίζει να µειώνει κατά το ήµισυ τις τιµές του x µέχρις ότου προσθέτοντας στο x το 1 δεν υπάρχει διαφορά στο αποτέλεσµα, δηλαδή µέχρις ότου το x να είναι Εισαγωγή στο OCTAVE Σελ. 39 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος µηδέν για το OCTAVE, και αυτό µπορεί να ειδωθεί καθώς ο αριθµός για το x είναι γύρω στο 10-16. Αυτό δεν σηµαίνει ότι το OCTAVE δεν µπορεί να εργαστεί µε αριθµούς µικρότερους από αυτόν (ο 13 µικρότερος αριθµός που το OCTAVE µπορεί να αντιπροσωπεύσει είναι γύρω στο 2.2251x10-308) . Το πρόβληµα είναι ότι οι δύο αριθµοί στην πράξη του παραδείγµατος είναι διαφορετικών µεγεθών και το OCTAVE δεν µπορεί να διατηρήσει την ακρίβεια και για τους δύο. Θεωρείστε αυτό το παράδειγµα: a = 13901 = 1.3901 × 104 b = 0.0012 = 1.2 × 10−3 Εάν φανταστούµε ότι η αριθµητική ακρίβεια του ηλεκτρονικού υπολογιστή είναι 5 σηµαντικά ψηφία (significant figures) στη βάση του αριθµού (το µέρος πριν το επί 10k), τότε και τα δύο a και b µπορούν να αντιπροσωπευτούν ακριβώς. Αλλά, εάν προσπαθήσουµε να προσθέσουµε του δύο αριθµούς, παίρνουµε τα εξής: a + b = 13901.0012 = 1.39010012 × 104 = 1.3901 × 104 σε 5 σηµαντικά ψηφία Έτσι, ενώ οι δύο αριθµοί είναι εντάξει από µόνοι τους, επειδή τα µεγέθη τους διαφέρουν κατά πολύ, το άθροισµά τους δεν µπορεί να αντιπροσωπευτεί ακριβώς. Αυτό ακριβώς συµβαίνει στην περίπτωση του while loop παραπάνω. Το OCTAVE (και οι περισσότεροι ηλεκτρονικοί υπολογιστές) είναι ακριβείς γύρω στα 15 σηµαντικά ψηφία, έτσι όταν προσπαθούµε να προσθέσουµε 1x10-16 στο 1, η απάντηση απαιτεί έναν µεγαλύτερο αριθµό σηµαντικών ψηφίων από αυτόν που είναι διαθέσιµος και η απάντηση περικόπτεται αφήνοντας µόνο το 1. ∆εν υπάρχει γενική λύση σε τέτοιου είδους προβλήµατα, αλλά χρειαζόµαστε να γνωρίζουµε ότι υπάρχουν. Είναι πολύ ασυνήθιστο να χρειαζόµαστε να ανησυχούµε για την δεκάτη έκτη δεκαδική θέση για µια απάντηση, αλλά εάν είναι ανάγκη να ανησυχούµε τότε πρέπει να σκεφτόµαστε πολύ προσεκτικά πώς να λύσουµε το πρόβληµα. Η απάντηση είναι στο να σκεφτούµε πως θα γίνει η διατύπωση της λύσης και να σιγουρευτούµε στη λύση ότι οι αριθµοί που επιλέγουµε να χρησιµοποιήσουµε είναι όλοι περίπου µε το ίδιο µέγεθος. 8. Προγραµµατισµός ΙΙ: Συναρτήσεις (programming ΙI: Functions) Τα αρχεία scripts στο OCTAVE µας επιτρέπουν να γράψουµε απλά προγράµµατα, αλλά περισσότερο 13 Οι µεταβλητές realmax και realmin µας λένε ποιος είναι ο µέγιστος και ελάχιστος αριθµός σε οποιοδήποτε ηλεκτρονικό υπολογιστή. Επιπρόσθετα η µεταβλητή eps βαστάει την ‘απόσταση από το 1.0 στον επόµενο κινητής υποδιαστολής αριθµό’ – µέτρο ένδειξης πιθανού σφάλµατος σε κάθε αριθµό, συνήθως αντιπροσωπεύεται µε το γράµµα ε στους θεωρητικούς υπολογισµούς. Η τιµή eps είναι 2.2204x10-16 στον ηλεκτρονικό µας υπολογιστή. Στο παράδειγµά µας, όταν το x έχει αυτή την τιµή, 1+x έχει σηµασία αλλά αφότου αυτή η τιµή µειώνεται στο ήµισυ, δεν έχει πια σηµασία. Εισαγωγή στο OCTAVE Σελ. 40 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ισχυρά από τα scripts είναι οι συναρτήσεις που ορίζονται από τον χρήστη. Αυτές µας επιτρέπουν να ορίσουµε τις δικές µας εντολές στο OCTAVE που µετά µπορούµε να τις χρησιµοποιήσουµε από τη γραµµή εντολών ή σε άλλες συναρτήσεις ή scripts. Οι µεταβλητές στις συναρτήσεις OCTAVE πάντοτε περνάνε µε τιµή, ουδέποτε µε αναφορά. 14 Ωστόσο, οι συναρτήσεις OCTAVE µπορούν να επιστρέψουν περισσότερες από µία τιµή . Βασικά, οι συναρτήσεις στο OCTAVE είναι περασµένοι αριθµοί, εκτελούν µερικούς υπολογισµούς και δίνουν πίσω µερικούς άλλους αριθµούς. Μια συνάρτηση (function) ορίζεται σε ένα αρχείο κειµένου, όπως ακριβώς και στα scripts, εκτός από το ότι η πρώτη γραµµή του αρχείου έχει την ακόλουθη µορφή: function [output1, output2, ...] = name (input1, input2, ...) Κάθε συνάρτηση αποθηκεύεται σε ξεχωριστό M-file, το οποίο πρέπει να έχει το ίδιο όνοµα όπως η συνάρτηση. Για παράδειγµα, µια συνάρτηση που ονοµάζεται sind() πρέπει να οριστεί σε ένα αρχείο που ονοµάζεται sind.m. Κάθε συνάρτηση µπορεί να έχει έναν αριθµό από ορίσµατα και να επιστρέφει έναν αριθµό από διαφορετικές τιµές. Όταν βρεθούµε σε κατάσταση που χρησιµοποιούµε το ίδιο σύνολο από εκφράσεις ξανά και ξανά, αυτό είναι ένδειξη ότι αυτές πρέπει να πακεταριστούν σε µια συνάρτηση. Όταν πακεταριστούν σαν συνάρτηση, είναι ευκολότερο να χρησιµοποιηθούν, κάνουν τον κώδικα περισσότερο αναγνώσιµο, και µπορεί να χρησιµοποιηθούν από άλλους ανθρώπους σε διαφορετικές καταστάσεις. 8.1 Παράδειγµα 1: Ηµίτονο σε βαθµούς (Example 1: Sine in degrees) Το OCTAVE χρησιµοποιεί ακτίνια για όλους του υπολογισµούς του µε γωνίες, αλλά οι περισσότεροι από εµάς είµαστε πιο ευχαριστηµένοι να εργαζόµαστε σε βαθµούς. Όταν κάνουµε τους OCTAVE υπολογισµούς µπορούµε πάντοτε να µετατρέψουµε την γωνία d σε ακτίνια χρησιµοποιώντας sin(d/180*pi), ή ακόµη χρησιµοποιώντας την µεταβλητή deg=pi/180 (όπως ορίστηκε στην ενότητα 3.1), γράφοντας sin(d*deg). Αλλά θα ήταν πιο απλό και περισσότερο αναγνώσιµο εάν απλά µπορούσαµε να εισάγουµε την εντολή sin(d) (‘ηµίτονο σε βαθµούς’), και να µπορούµε να δηµιουργήσουµε µια συνάρτηση να κάνει ακριβώς αυτό. Μια τέτοια συνάρτηση θα µπορούσε να οριστεί δηµιουργώντας ένα αρχείο sind.m που να περιέχει ακριβώς τις εξής γραµµές: function s = sind(x) % SIND(X) Calculates sine(x) in degrees s = sin(x*pi/180); 14 Όταν οι µεταβλητές περνούν µε τιµή, είναι µόνο για ανάγνωση – οι τιµές µπορεί να διαβαστούν και να χρησιµοποιηθούν, αλλά δεν µπορεί να αλλαχτούν. Όταν οι µεταβλητές περνούν µε αναφορά, όπως στην C++, οι τιµές τους µπορεί να αλλαχτούν για να περάσουν πληροφορία από την συνάρτηση πίσω στο κυρίως πρόγραµµα. Αυτό απαιτείται στην C++ διότι συνήθως µόνο µια τιµή µπορεί να επιστραφεί από µια συνάρτηση. Στο OCTAVE πολλές τιµές µπορούν να επιστραφούν, έτσι το πέρασµα µε αναφορά δεν είναι απαραίτητο. Εισαγωγή στο OCTAVE Σελ. 41 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Αυτό ίσως να φαίνεται ασήµαντο, αλλά πολλές συναρτήσεις είναι ασήµαντες και αυτό δεν τις κάνει λιγότερο χρήσιµες. Θα εξετάσουµε αυτή τη συνάρτηση γραµµή προς γραµµή: Γραµµή 1: Λέει στο OCTAVE ότι αυτό το αρχείο ορίζει µια συνάρτηση αντί ένα script. Λέει ότι η συνάρτηση ονοµάζεται sind και ότι παίρνει ένα όρισµα που ονοµάζεται x. Το αποτέλεσµα της συνάρτησης αναγνωρίζεται εσωτερικά σαν s. Ότι το s έχει οριστεί εσωτερικά σε αυτή τη συνάρτηση αυτό είναι που ο χρήστης θα πάρει όταν χρησιµοποιεί την sind συνάρτηση. Γραµµή 2: Είναι γραµµή µε σχόλια. Όπως και µε τα scripts, το πρώτο σύνολο σχολίων στο αρχείο πρέπει να περιγράφει τη συνάρτηση. Αυτή η γραµµή είναι εκείνη που εµφανίζεται όταν ο χρήστης εισάγει help sind. Συνηθίζεται να χρησιµοποιούµε παρόµοια µορφή µε εκείνη που χρησιµοποιείται από του OCTAVE τις ενσωµατωµένες συναρτήσεις. Γραµµή 3: Κάνει τους πραγµατικούς υπολογισµούς αυτής της συνάρτησης. Παίρνει την είσοδο x και αποθηκεύει το αποτέλεσµα του υπολογισµού στη µεταβλητή s, η οποία ορίστηκε στην πρώτη γραµµή σαν το όνοµα του αποτελέσµατος της συνάρτησης. Τερµατισµός της συνάρτησης (End of the function): Οι συναρτήσεις στο OCTAVE δεν χρειάζεται να τερµατίζουν µε την return εντολή (αν και µπορούµε να χρησιµοποιήσουµε την εντολή return για να κάνουµε το OCTAVE να εξέλθει στο µέσο της συνάρτησης). Επειδή κάθε συνάρτηση είναι ένα ξεχωριστό M-file, µόλις φτάσει στο τέλος του αρχείου το OCTAVE γνωρίζει ότι είναι το τέλος της συνάρτησης. Η τιµή που έχει το s στο τέλος της συνάρτησης είναι η τιµή που επιστρέφεται. 8.2 ∆ηµιουργία και χρήση συναρτήσεων (Creating and using functions) ∆ηµιουργείτε την παραπάνω συνάρτηση ανοίγοντας τον κειµενογράφο (editor) (εισάγεται edit εάν δεν είναι ήδη ανοιχτός) και εισάγοντας τις γραµµές της συνάρτησης όπως δίνονται παραπάνω. Αποθηκεύστε το αρχείο σαν sind.m. Επειδή το αρχείο κειµένου πρέπει να έχει το ίδιο όνοµα όπως της συνάρτησης, µε την επέκταση .m. Μπορούµε τώρα να χρησιµοποιήσουµε τη συνάρτηση µε τον ίδιο τρόπο όπως τις εσωτερικές συναρτήσεις του OCTAVE. ∆οκιµάστε εισάγοντας: help sind SIND(X) Calculates sine(x) in degrees που δείχνει ότι η συνάρτηση έχει αναγνωριστεί από το OCTAVE και ότι αυτό έχει βρει την help γραµµή που συµπεριλήφθηκε στον ορισµό της συνάρτησης. Τώρα µπορούµε να δοκιµάσουµε µερικούς αριθµούς: sind(0) ans = Εισαγωγή στο OCTAVE Σελ. 42 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 0 sind(45) ans = 0.70711 t = sind([30 60 90]) t= 0.50000 0.86603 1.00000 Αυτό το τελευταίο παράδειγµα δείχνει ότι επίσης δουλεύει αυτόµατα και µε διανύσµατα. Εάν καλέσουµε τη συνάρτηση sind µε ένα διάνυσµα, σηµαίνει ότι η παράµετρος x µέσα στην συνάρτηση θα είναι διάνυσµα, και σ’ αυτήν την περίπτωση η συνάρτηση sin γνωρίζει πώς να εργάζεται µε διανύσµατα, έτσι µπορεί να δίνει τη σωστή απόκριση. 8.3 Παράδειγµα 2: Μοναδιαίο βήµα (Example 2: Unit step) Εδώ δίνεται µια περισσότερο επιτηδευµένη συνάρτηση η οποία δηµιουργεί ένα µοναδιαίο βήµα, που ορίζεται σαν: 0, if t < t0 y= 1, otherwise Αυτή η συνάρτηση θα πάρει δύο παραµέτρους: το χρόνο για τον οποίο τιµές πρέπει να δηµιουργηθούν, και t0, το χρόνο του βήµατος. Η πλήρης συνάρτηση δίνεται παρακάτω: function y = ustep(t, t0) %USTEP(t, t0) unit step at t0 % A unit step is defined as % 0 for t < t0 % 1 for t >= t0 [m, n] = size(t); % Check that this is a vector, not a matrix i.e. (1 x n) or (m x 1) if m ~= 1 & n ~=1 error(’T must be a vector’); end y = zeros(m, n); %Initialise output array for k = 1:length(t) if t(k) >= t0 y(k) = 1; %Otherwise, leave it at zero, which is correct end Εισαγωγή στο OCTAVE Σελ. 43 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος end Ξανά θα κοιτάξουµε τον ορισµό αυτής της συνάρτησης γραµµή προς γραµµή: Γραµµή 1: Η πρώτη γραµµή µας λέει ότι είναι µια συνάρτηση που ονοµάζεται ustep, και ότι ο χρήστης πρέπει να δώσει δύο ορίσµατα, που εσωτερικά είναι γνωστά σαν t και t0. Το αποτέλεσµα της συνάρτησης είναι µια µεταβλητή, ονοµαζόµενη y. Γραµµές 2-5: Είναι η περιγραφή της συνάρτησης. Αυτή τη φορά το µήνυµα βοήθειας περιέχει µερικές γραµµές. Γραµµή 6: Το πρώτο όρισµα της συνάρτησης ustep, t, συνήθως θα είναι ένα διάνυσµα, το οποίο θα περιέχει τις χρονικές τιµές για τις οποίες η συνάρτηση θα αξιολογήσει. Αυτή η γραµµή χρησιµοποιεί την size συνάρτηση, η οποία επιστρέφει δύο τιµές: τον αριθµό από τις γραµµές και µετά τον αριθµό από τις στήλες ενός διανύσµατος (ή πίνακα). Αυτό δίνει ένα παράδειγµα το πώς οι συναρτήσεις στο OCTAVE µπορούν να επιστρέψουν δύο πράγµατα – σε διάνυσµα, φυσικά. Αυτές οι τιµές χρησιµοποιούνται να δηµιουργήσουν ένα διάνυσµα εξόδου του ιδίου µεγέθους, και να ελέγξουν ότι η είσοδος είναι διάνυσµα. Γραµµές 7-10: Ελέγχουν ότι η είσοδος t είναι έγκυρη δηλ. ότι το t δεν είναι ένας πίνακα. Ελέγχει ότι έχει είτε µία γραµµή ή µία στήλη (χρησιµοποιώντας το αποτέλεσµα από την ίδια συνάρτηση). Η συνάρτηση error εµφανίζει ένα µήνυµα και τερµατίζει τη συνάρτηση εάν υπάρχει πρόβληµα. Γραµµή 11: Όπως το σχετικό σχόλιο λέει, αυτή η γραµµή δηµιουργεί τον πίνακα για να βαστάει τις τιµές εξόδου. Αρχικοποιείται να είναι των ιδίων µεγεθών και µορφής όπως η είσοδος t, και για κάθε στοιχείο να είναι µηδέν. Γραµµή 12: Για κάθε χρονική τιµή στο t, θέλουµε να δηµιουργήσουµε µια τιµή για το y. Έτσι χρησιµοποιούµε ένα for loop για να βηµατίσουµε µέσα σε κάθε τιµή. Η συνάρτηση length µας λέει πόσα στοιχεία υπάρχουν στο διάνυσµα t. Γραµµές 13-15: Σύµφωνα µε τον ορισµό µας, εάν t<t0, τότε η συνάρτηση step έχει την τιµή µηδέν. Το διάνυσµα εξόδου µας ήδη περιέχει µηδενικά, έτσι αγνοούµε αυτή την περίπτωση. Στην άλλη περίπτωση, όταν t>=t0, η έξοδος πρέπει να είναι 1. Ελέγχουµε για αυτήν την περίπτωση και αντίστοιχα θέτουµε 1 στο y, την µεταβλητή εξόδου µας. Όπως και στις περισσότερες υψηλού επιπέδου γλώσσες, όλες οι µεταβλητές που δηµιουργούνται εσωτερικά σε µια συνάρτηση (m, n και k σε αυτή την περίπτωση) είναι τοπικές στη συνάρτηση. Υπάρχουν µόνο κατά τη διάρκεια της συνάρτησης, και δεν γράφουν πάνω σε µεταβλητές µε το ίδιο όνοµα κάπου αλλού στο OCTAVE. Οι µόνες µεταβλητές που περνούν πίσω είναι οι επιστρεφόµενες τιµές που ορίζονται στην πρώτη συναρτησιακή γραµµή: y σε αυτή την περίπτωση. Εισάγετε αυτή την συνάρτηση στον κειµενογράφο, και αποθηκεύστε την σαν ustep.m. Μπορούµε τώρα να χρησιµοποιήσουµε αυτή την συνάρτηση να δηµιουργήσουµε ένα σήµα. Για παράδειγµα, για τη δηµιουργία ενός µοναδιαίου παλµού διάρκειας ενός δευτερολέπτου, αρχίζοντας στο t=0, µπορούµε πρώτα να ορίσουµε µια χρονική κλίµακα και µετά να χρησιµοποιήσουµε την ustep δύο φορές, όπως παρακάτω: Εισαγωγή στο OCTAVE Σελ. 44 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος t=-1:0.1:4; v = ustep(t, 0) - ustep(t, 1); plot (t, v) axis ([-1 4 -1 2]) Αυτό πρέπει να εµφανίσει τον παλµό, όπως φαίνεται στο Σχήµα 7. Σχήµα 7: Γράφηµα µοναδιαίου, ενός δευτερολέπτου παλµού που δηµιουργήθηκε από δύο µοναδιαία βήµατα, χρησιµοποιώντας την συνάρτηση ustep. Εάν µετά (ανάλογα µε την έκδοση του OCTAVE που έχουµε) εισάγουµε: who *** dynamically linked functions: dispatch *** currently compiled functions: _plt2_ _plt_ isscalar isvector rows _plt2vv_ axis isstr plot ustep *** local user variables: tv µπορούµε να επιβεβαιώσουµε ότι οι µεταβλητές m και n ορισµένες στην συνάρτηση ustep διατηρήθηκαν µόνο όσο διήρκησε και η συνάρτηση, και δεν είναι µέρος του κυρίως χώρου εργασίας (workspace). Οποιαδήποτε άλλη µεταβλητή στη λίστα, e.g. η y µεταβλητή θα έχει ακόµη την τιµή από προηγούµενους ορισµούς, e.g. y από το rectsin script, αντί των τιµών που ορίστηκαν για την µεταβλητή y στην συνάρτηση ustep. Οι µεταβλητές που ορίζονται και χρησιµοποιούνται εσωτερικά στις συναρτήσεις είναι εντελώς ξεχωριστές από τον κυρίως χώρο. Εισαγωγή στο OCTAVE Σελ. 45 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 9. Πίνακες και διανύσµατα (Matrices and vectors) Τα διανύσµατα είναι ειδικές περιπτώσεις από πίνακες. Ένας πίνακας είναι µια ορθογώνια διάταξη αριθµών, το µέγεθος του οποίου συνήθως περιγράφεται σαν mxn, που σηµαίνει ότι έχει m γραµµές και n στήλες. Για παράδειγµα, εδώ είναι ένας πίνακας 2x3: 5 7 9 A= −1 3 −2 Για να εισάγουµε αυτόν τον πίνακα στο OCTAVE χρησιµοποιούµε την ίδια σύνταξη όπως και στα διανύσµατα, εισάγοντάς τον γραµµή προς γραµµή: A=[5 7 9 -1 3 -2] A= 5 7 9 -1 3 -2 εναλλακτικά, µπορούµε να χρησιµοποιήσουµε ερωτηµατικά (semicolons) για να δηλώσουµε το τέλος της γραµµής, όπως σε αυτό το παράδειγµα: B=[2 0; 0 -1; 1 0] B= 2 0 0 -1 1 0 Μπορούµε επίσης να χρησιµοποιήσουµε την µορφή άνω-και-κάτω τελείες (colon): C = [1:3; 8:-2:4] C= 1 2 3 8 6 4 Μια τελική εναλλακτική είναι να κτίσουµε τον πίνακα γραµµή προς γραµµή (αυτή είναι ιδιαίτερα καλή για την κατασκευή πινάκων από αποτελέσµατα σε ένα for loop): D = [1 2 3]; D = [D; 4 5 6]; Εισαγωγή στο OCTAVE Σελ. 46 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος D = [D; 7 8 9] D= 1 2 3 4 5 6 7 8 9 9.1 Πολλαπλασιασµός πινάκων (Matrix multiplication) Με διανύσµατα και πίνακες, το σύµβολο * αντιπροσωπεύει πολλαπλασιασµό πινάκων, όπως σε αυτά τα παραδείγµατα (χρησιµοποιώντας τους πίνακες που ορίστηκαν παραπάνω): A*B ans = 19 -7 -4 -3 B*C ans = 2 4 6 -8 -6 -4 1 2 3 A*C error: operator *: nonconformant arguments (op1 is 2x3, op2 is 2x3) error: evaluating binary operator ‘*’ near line 11, column 2 Προτείνουµε να επεξεργαστείτε αυτά τα παραδείγµατα µε το χέρι για να θυµηθήτε πώς γίνονται οι πράξεις. Επισηµαίνεται ότι δεν µπορούµε να κάνουµε A*C, διότι οι δύο πίνακες έχουν ασυµβίβαστες διαστάσεις15. Όταν έχουµε να κάνουµε µε διανύσµατα, υπάρχει λίγη ανάγκη να ξεχωρίσουµε διανύσµατα µεταξύ γραµµής και στήλης. Όταν πολλαπλασιάζουµε διανύσµατα, ωστόσο, θα δουλέψει µόνο µε ένα τρόπο. Ένα διάνυσµα γραµµής είναι 1xn πίνακας, αλλά αυτό δεν µπορεί να πολλαπλασιάσει έναν mxn πίνακα από δεξιά: x = [1 0 3] 15 Γενικά, σε πολλαπλασιασµό πινάκων, οι διαστάσεις των πινάκων είναι: (lxm)*(mxn) (lxn). Όταν προσπαθούµε να κάνουµε A*C, προσπαθούµε να κάνουµε (2x3)*(2x3), που δεν συµφωνεί µε τον προηγούµενο ορισµό. Οι αριθµοί στα µεσαία ζεύγη δεν είναι ίδιοι, που εξηγεί το λεκτικό του µηνύµατος του σφάλµατος. Εισαγωγή στο OCTAVE Σελ. 47 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος x= 103 A*x error: operator *: nonconformant arguments (op1 is 2x3, op2 is 1x3) error: evaluating binary operator ‘*’ near line 12, column 2 9.2 Ο Τελεστής µετάθεσης (The transpose operator) Όταν µεταθέτουµε ένα διάνυσµα το αλλάζουµε από διάνυσµα γραµµής σε διάνυσµα στήλης ή αντίστροφα. Η µετάθεση ενός πίνακα αλλάζει τις γραµµές µε τις στήλες. Μαθηµατικά, η µετάθεση του A αντιπροσωπεύεται ως AT. Στο OCTAVE µια απόστροφος (‘) εκτελεί αυτή τη λειτουργία: A A= 5 7 9 -1 3 -2 A’ ans = 5 -1 7 3 9 -2 A*x’ ans = 32 -7 Σ’ αυτό το τελευταίο παράδειγµα η x’ εντολή αλλάζει το διάνυσµα γραµµής σε διάνυσµα στήλης, έτσι τώρα µπορεί να πολλαπλασιαστεί από αριστερά µε τον πίνακα Α. 9.3 Συναρτήσεις που δηµιουργούν πίνακες (Matrix creation functions) Το OCTAVE παρέχει µερικές συναρτήσεις που µας βοηθούν να κατασκευάσουµε ειδικούς πίνακες. Έχουµε ήδη δει τις ones και zeros, που δηµιουργούν πίνακες από δεδοµένου µεγέθους γεµάτους µε 1 και 0. Εισαγωγή στο OCTAVE Σελ. 48 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Ένας πολύ σπουδαίος πίνακας είναι ο πίνακας ταυτότητας (identity matrix). Αυτός είναι ο πίνακας που όταν πολλαπλασιαστεί µε οποιοιδήποτε άλλο πίνακα ή διάνυσµα δεν αλλάζει τίποτα. Αυτό ο πίνακας συνήθως ονοµάζεται I στους µαθηµατικούς τύπους, έτσι η συνάρτηση OCTAVE καλείται eye. Αυτή παίρνει µόνο µία παράµετρο, επειδή ο πίνακας ταυτότητας πρέπει να είναι τετραγωνικός: I = eye(4) I= 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 Μπορούµε να δοκιµάσουµε ότι αυτός ο πίνακας δεν επιφέρει αλλαγές σε οποιοδήποτε διάνυσµα ή πίνακα: I * [5; 8; 2; 0] ans = 5 8 2 0 Ο πίνακας ταυτότητας (identity matrix) είναι ειδική περίπτωση ενός διαγωνίου πίνακα, µε µηδενικά εκτός από τα στοιχεία στη διαγώνιο: −1 D = 0 0 0 7 0 0 0 2 Θα µπορούσαµε να κατασκευάσουµε αυτόν τον πίνακα αποκλειστικά, αλλά το OCTAVE παρέχει την συνάρτηση diag η οποία παίρνει ένα διάνυσµα και το θέτει κατά µήκος της διαγωνίου ενός πίνακα: diag([-1 7 2]) ans = -1 0 0 0 7 0 0 0 2 Εισαγωγή στο OCTAVE Σελ. 49 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Η συνάρτηση diag είναι αρκετά επιτηδευµένη, καθώς εάν η συνάρτηση καλείται για έναν πίνακα, αντί ενός διανύσµατος, µας λέει τα στοιχεία της διαγωνίου του πίνακα. Για τον πίνακα Α που ορίστηκε παραπάνω: diag(A) ans = 5 3 Σηµειώνεται ότι ο πίνακας δεν είναι ανάγκη να είναι τετραγωνικός για να οριστούν τα στοιχεία της διαγωνίου του, και για µη τετραγωνικούς πίνακες ακόµη ξεκινάει από την κορυφή αριστερή γωνία, σταµατώντας όταν δεν υπάρχουν άλλες γραµµές ή στήλες. Τέλος, µερικές φορές είναι χρήσιµο να δηµιουργούµε κενούς πίνακες για να προσθέσουµε σε αυτούς στοιχεία αργότερα. Μπορούµε να κάνουµε αυτό µε το να ορίσουµε τον πίνακα µε ένα κενό ζεύγος από αγκύλες: E = [] E= [] 9.4 ∆ηµιουργώντας σύνθετους πίνακες (Building composite matrices) Είναι συχνά χρήσιµο να έχουµε τη δυνατότητα να κατασκευάσουµε πίνακες από µικρότερα τµήµατα, και αυτό µπορεί εύκολα να γίνει χρησιµοποιώντας τη βασική σύνταξη δηµιουργίας πινάκων: comp = [eye(3) B; A zeros(2,2)] comp = 1 0 0 1 0 0 5 7 -1 3 0 0 1 9 -2 2 0 1 0 0 0 -1 0 0 0 Απλά πρέπει να είµαστε προσεκτικοί ότι κάθε υπο-πίνακας είναι σωστού µεγέθους και µορφής, έτσι ώστε ο τελικός σύνθετος πίνακας να είναι ορθογώνιος. Φυσικά, το OCTAVE θα µας πει εάν κάποιος από αυτούς έχει τον λάθος αριθµό από γραµµές ή στήλες. Εισαγωγή στο OCTAVE Σελ. 50 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 9.5 Πίνακες σαν διατάξεις στοιχείων (Matrices as tables) Οι πίνακες µπορούν επίσης να χρησιµοποιηθούν για την απλή διάταξη δεδοµένων, και µπορούν να παρέχουν έναν περισσότερο φυσικό τρόπο για την αποθήκευση δεδοµένων: t=0:0.2:1; freq=[sin(t)’ sin(2*t)’, sin(3*t)’] freq = 0 0.1987 0.3894 0.5646 0.7174 0.8415 0 0.3894 0.7174 0.9320 0.9996 0.9093 0 0.5646 0.9320 0.9738 0.6755 0.1411 Εδώ η nth στήλη του πίνακα περιέχει τα δεδοµένα δειγµατοληψίας του sin(t). Η εναλλακτική θα µπορούσε να είναι η αποθήκευση κάθε σειράς σε δικό της διάνυσµα, καθένα µε διαφορετικό όνοµα. Τότε θα έπρεπε να γνωρίζουµε ποιο είναι το όνοµα κάθε διανύσµατος εάν θα θέλαµε να χρησιµοποιήσουµε τα δεδοµένα. Η αποθήκευση σε πίνακα διευκολύνει την προσπέλαση των δεδοµένων. 9.6 Εξαγωγή τµηµάτων από πίνακες (Extracting bits of matrices) Οι αριθµοί µπορούν να εξαχθούν από έναν πίνακα µε την ίδια σύνταξη όπως για τα διανύσµατα, χρησιµοποιώντας τις παρενθέσεις (). Για έναν πίνακα, προσδιορίζουµε την συντεταγµένη της γραµµής πρώτα και µετά την συντεταγµένη της στήλης (σηµειώνεται ότι σε Καρτεσιανούς όρους, αυτό είναι y και µετά x). Ιδού µερικά παραδείγµατα: J = [1 2 5 3 6 4 7 8 11 13 18 10]; J(1,1) ans = 1 J(2,3) ans = 7 J(1:2, 4) %Rows 1-2, column 4 Εισαγωγή στο OCTAVE Σελ. 51 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ans = 4 8 J(3,:) %Row 3, all columns ans = 11 13 18 10 Ο : τελεστής µπορεί να χρησιµοποιηθεί να προσδιορίσει κάποιο εύρος από στοιχεία, ή εάν χρησιµοποιηθεί απλά µόνος του τότε αναφέρεται σε ολόκληρη τη γραµµή ή στήλη. Αυτός ο τύπος εκφράσεων µπορεί επίσης να χρησιµοποιηθεί στην αριστερή πλευρά κάποιας έκφρασης για να γράψουµε στοιχεία σε κάποιον πίνακα: J(3, 2:3) = [-1 0] J= 1 5 11 2 6 -1 3 4 7 8 0 10 10. Βασικές συναρτήσεις πινάκων (Basic matrix functions) Το OCTAVE επιτρέπει όλες τις σύνηθες αριθµητικές πράξεις να εφαρµοστούν στους πίνακες. Ο πολλαπλασιασµός πινάκων έχει ήδη συζητηθεί, και οι άλλες κοινές λειτουργίες είναι η πρόσθεση ή αφαίρεση δύο πινάκων του ιδίου µεγέθους και µορφής. Αυτό εύκολα µπορεί να γίνει χρησιµοποιώντας τους + και – τελεστές. Όπως µε τα διανύσµατα, το OCTAVE επίσης ορίζει τους τελεστές .* και ./, που επιτρέπουν τα αντίστοιχα στοιχεία δύο ταυτόσηµων πινάκων να πολλαπλασιαστούν ή να διαιρεθούν. Όλα τα στοιχεία ενός πίνακα µπορεί να υψωθούν στην ίδια δύναµη χρησιµοποιώντας τον .^ τελεστή. Το OCTAVE επίσης προσφέρει έναν µεγάλο αριθµό από συναρτήσεις για επεξεργασία πινάκων, και µερικές από αυτές (βλ. παρακάτω Πίνακα 6) θα καλυφτούν αργότερα σ’ αυτό το εγχειρίδιο. Πίνακας 6: Βασικές συναρτήσεις πινάκων και αποσυνθέσεις (Basic matrix functions and decompositions) Συναρτήσεις Περιγραφή eye Create an identity matrix zeros Create a matrix of zeros ones Create a matrix of ones rand Create a matrix filled with random numbers diag Create a diagonal matrix, or extract the diagonal of the given matrix Εισαγωγή στο OCTAVE Σελ. 52 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος inv Inverse of a matrix det Determinant of a matrix trace eig Trace of a matrix Calculate the eigenvectors and eigenvalues of a matrix rank Calculate an estimate of the rank of a matrix null Calculate a basis for the null space of a matrix rref Perform Gaussian elimination on an augmented matrix lu Calculate the LU decomposition of a matrix qr Calculate the QR decomposition of a matrix svd Calculate the SVD of a matrix pinv Calculate the pseudoinverse of a matrix Η συνάρτηση size µας δίνει τις διαστάσεις ενός πίνακα. Είναι µια συνάρτηση που επιστρέφει ένα διάνυσµα, προσδιορίζοντας τον αριθµό των γραµµών και των στηλών. size(J) ans = 3 4 Ο αντίστροφος ενός πίνακα είναι ένας πίνακας ο οποίος όταν πολλαπλασιαστεί µε τον αρχικό πίνακα µας δίνει τον µοναδιαίο πίνακα (identity matrix) (ΑΑ-1=Α-1Α=Ι). Αναιρεί το αποτέλεσµα του αρχικού πίνακα. Ορίζεται µόνο για τετραγωνικούς πίνακες και στο OCTAVE µπορεί να βρεθεί χρησιµοποιώντας την συνάρτηση inv: A = [3 0 4 0 1 -1 2 1 -3]; inv(A) ans = 0.1429 -0.2857 0.2857 0.1429 1.2143 -0.2143 0.1429 0.2143 -0.2143 A*inv(A) %Check the answer Εισαγωγή στο OCTAVE Σελ. 53 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ans = 1.0000 0 0 0.0000 1.0000 0.0000 -0.0000 0 1.0000 Ξανά, σηµειώνονται µερικά από τα αριθµητικά σφάλµατα τα οποία παραµένουν, που εµποδίζουν το OCTAVE από το να αναγνωρίζει µερικά στοιχεία ως ακριβώς ένα ή µηδέν. Η ορίζουσα (determinant) ενός πίνακα είναι µια πολύ χρήσιµη ποσότητα. Ειδικότερα, µια µηδενική ορίζουσα συνεπάγεται ότι ο πίνακας δεν έχει αντίστροφο. Η συνάρτηση det υπολογίζει την ορίζουσα: det(A) ans = -14 11. Λύνοντας την εξίσωση Ax = b (Solving Ax = b) Μία από τις πιο σπουδαίες χρήσεις των πινάκων είναι η αντιπροσώπευση και επίλυση ταυτόχρονων εξισώσεων. Ένα σύστηµα γραµµικών εξισώσεων είναι: a11 x1 + a12 x2 + L + a1n xn = b1 a21 x1 + a22 x2 + L + a2 n xn = b2 M = M am1 x1 + am 2 x2 + L + amn xn = bm όπου τα aij και bi είναι γνωστά, και ψάχνουµε για ένα σύνολο τιµών για xi που ταυτόχρονα ικανοποιούν όλες τις εξισώσεις. Αυτό το σύστηµα µπορεί να γραφεί σε µορφή πινάκων-διανυσµάτων ως εξής: a11 a 21 M am1 ή a12 a22 M am 2 L a1n x1 b1 L a2 n x2 b2 = O M M M L amn xn bm Ax = b Σε αυτή την αντιπροσώπευση, Α είναι ο πίνακας των συντελεστών, b είναι οι σταθερές, και x είναι το διάνυσµα παραµέτρων που αναζητούµε να βρούµε. Επειδή το OCTAVE είναι σχεδιασµένο να επεξεργάζεται πίνακες και διανύσµατα, είναι ιδιαίτερα κατάλληλο να χρησιµοποιηθεί για την επίλυση αυτών των ειδών προβληµάτων. Εισαγωγή στο OCTAVE Σελ. 54 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 11.1 Λύση όταν Α έχει αντίστροφο (Solution when A is invertible) Το πιο απλό σύνολο γραµµικών εξισώσεων για επίλυση είναι όταν έχουµε n εξισώσεις και n αγνώστους. Σε αυτή την περίπτωση ο πίνακας Α θα είναι τετραγωνικός και µπορεί συχνά να αντιστραφεί. Θεωρείστε το παράδειγµα: x+ y =3 2x − 3 y = 5 Επιλύνοντας αυτό στο OCTAVE είναι µια περίπτωση αντιπροσώπευσης των εξισώσεων σε µορφή πίνακα - διανυσµάτων και µετά κάνοντας χρήση του αντιστρόφου του Α για την ανεύρεση της λύσης: A=[1 1 2 -3]; b=[3 5]’; inv(A)*b ans = 2.8000 0.2000 A*ans % Απλώς για δοκιµή (Just to check) ans = 3.0000 5.0000 Έτσι η λύση είναι x = 2.8, y = 0.2. 11.2 Γκαουσιανή απαλοιφή και LU παραγοντοποίηση (Gaussian elimination and LU factorization) Ο υπολογισµός του αντιστρόφου ενός πίνακα είναι µη αποδοτική µέθοδος για την επίλυση τέτοιων προβληµάτων, ακόµη και εάν το OCTAVE µπορεί να βρει τον αντίστροφο µεγάλων πινάκων πολύ γρηγορότερα από ό,τι εµείς µε το χέρι. Από το µάθηµα γραµµικής άλγεβρας γνωρίζουµε τη µέθοδο Εισαγωγή στο OCTAVE Σελ. 55 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος της «Γκαουσιανής» απαλοιφής και τη µέθοδο της LU παραγοντοποίησης (που είναι Γκαουσιανή 16 απαλοιφή σε µορφή πινάκων) . Αυτές προσφέρουν ένα πιο αποδοτικό τρόπο επίλυσης του Αx=b, και το OCTAVE κάνει πολύ εύκολη τη χρήση της Γκαουσιανής απαλοιφής, ορίζοντάς την ως διαίρεση πινάκων για πίνακες που έχουν αντίστροφο. 11.3 ∆ιαίρεση πινάκων και ο τελεστής καθέτου γραµµής (Matrix division and the slash operator) Σε µια κανονική αλγεβρική εξίσωση, ax=b, εάν θέλουµε να βρούµε την τιµή του x, απλά θα υπολογίσουµε x=b/a. Σε µια πίνακα-διάνυσµα εξίσωση Ax=b, ωστόσο, η διαίρεση δεν ορίζεται και η λύση δίνεται από την x=A-1b. Σαν συντόµευση για αυτό, το OCTAVE ορίζει έναν ειδικό τελεστή ‘\’ (σηµειώνεται ότι αυτός είναι η αντικάθετος, όχι το σύµβολο διαίρεσης «/»), και µπορεί να σκεφτούµε ότι κάνει ‘διαίρεση πινάκων’. Χρησιµοποιώντας αυτόν τον τελεστή, η λύση της προηγούµενης εξίσωσής µας µπορεί να υπολογιστεί ως εξής: A\b ans = 2.8000 0.2000 Σηµειώνεται ότι αυτός δεν είναι τυπικός συµβολισµός και σε µαθηµατικές εκφράσεις πρέπει πάντοτε ακόµη να γράφουµε A-1b. Πρέπει ακόµη να θυµηθούµε ότι ο πολλαπλασιασµός πινάκων δεν είναι µεταβατικός (δηλ. ΑΒ≠ΒΑ). Αυτό σηµαίνει ότι ενώ η λύση του AX=B δίνεται µε X=A-1B η λύση του XA=B είναι X=BA-1, και αυτές οι δύο εκφράσεις είναι διαφορετικές. Σαν αποτέλεσµα, το OCTAVE επίσης ορίζει τον τελεστή ‘/’ (κάθετος) που κάνει αυτή την άλλη διαφορετική διαίρεση πινάκων. Η προηγούµενη περίπτωση, ωστόσο, είναι περισσότερο πιθανή, και είναι συνήθως η αντικάθετος ‘\’ που θα χρειαστούµε. Οι τελεστές των δύο καθέτων γραµµών και οι χρήσεις τους παρουσιάζονται περιληπτικά στον επόµενο Πίνακα 7. Πίνακας 7: Περίληψη των τελεστών του OCTAVE ‘\’ και ‘/’. Χρησιµοποιούν Γκαουσιανή απαλοιφή εάν ο πίνακας έχει αντίστροφο, διαφορετικά βρίσκει τη λύση ελάχιστων τετραγώνων (Summary of Octave’s slash operators. These use Gaussian elimination if the 16 Η συνάρτηση rref θα κάνει την Γκαουσιανή εξάλειψη εάν της δώσουμε έναν προσαυξημένο πίνακα [A b], ή η συνάρτηση lu στο OCTAVE θα κάνει την LU παραγοντοποίηση ενός πίνακα (βλ. help σύστημα). Εισαγωγή στο OCTAVE Σελ. 56 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος matrix is invertible, and finds the least squares solution otherwise). Τελεστής Για λύση προβλήµατος OCTAVE εντολή Μαθηµατική ισοδυναµία Όνοµα \ AX=B Α\Β A-1B Αριστερή διαίρεση (left division (backslash)) / XA=B Β/Α BA-1 ∆εξιά διαίρεση (right division (forward slash)) 11.4 Ιδιόµορφοι πίνακες και τάξη (Singular matrices and rank) Ο τελεστής καθέτου γραµµής (slash operator) προσπαθεί να κάνει ότι είναι το καλύτερο σε οποιοδήποτε πίνακα και διάνυσµα του δοθεί, ακόµη και αν λύση δεν είναι πιθανή, ή είναι ακαθόριστη (undetermined). Θεωρείστε το παράδειγµα: u+v+w= 2 2u + 3w = 5 3u + v + 4 w = 6 Αυτή είναι ξανά µια εξίσωση της µορφής Ax=b. Εάν δοκιµάσουµε να τη λύσουµε στο OCTAVE χρησιµοποιώντας τον τελεστή της καθέτου (slash operator), παίρνουµε: A=[1 1 1 203 3 1 4]; b=[ 2 5 6]’; x=A\b; warning: matrix singular to machine precision, rcond = 1.15648e-17 warning: attempting to find minimum norm solution warning: dgelsd rank difficient 3x3 matrix, rank = 2 x= 0.69048 -0.11905 1.09524 A*x % ∆οκιµή που δεν µας δίνει πίσω το αρχικό διάνυσµα b ans = 1.6667 4.6667 6.3333 Έτσι η λύση που δίνεται δεν είναι λύση της εξίσωσης! Σε αυτή την περίπτωση ο πίνακας Α είναι ιδιόµορφος όπως το OCTAVE µας προειδοποίησε. Αυτό σηµαίνει ότι έχει µηδενική ορίζουσα και έτσι Εισαγωγή στο OCTAVE Σελ. 57 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος δεν έχει αντίστροφο. (Ακόµη και εάν δεν υπήρχε προειδοποίηση θα έπρεπε να ήµασταν καχύποπτοι από το µέγεθος των τιµών του x. Αυτό επίσης επιβεβαιώνεται όταν ελέγξουµε την ορίζουσα που δίνει αριθµό κοντά στο µηδέν, πχ., det(A) ans = 5.5511e-16 Όταν ο πίνακας είναι ιδιόµορφος, δεν υπάρχει µοναδική λύση των εξισώσεων. Αλλά έχουµε τρεις εξισώσεις µε τρεις αγνώστους, έτσι γιατί δεν υπάρχει µια µοναδική λύση; Το πρόβληµα είναι ότι δεν είναι τρεις µοναδικές εξισώσεις. Η συνάρτηση rank στο OCTAVE εκτιµά την τάξη ενός πίνακα – ο αριθµός γραµµικά ανεξάρτητων γραµµών ή στηλών ενός πίνακα: rank(A) ans = 2 Έτσι υπάρχουν µόνο δύο ανεξάρτητες εξισώσεις σ’ αυτήν την περίπτωση. Κοιτάζοντας τις αρχικές εξισώσεις περισσότερο προσεκτικά, βλέπουµε ότι οι δύο πρώτες προστίθενται και δίνουν την 3u+v+4w=7 που είναι αντιφατική µε την τρίτη εξίσωση. Με άλλα λόγια, δεν υπάρχει λύση σε αυτές τις εξισώσεις. Το τι έχει συµβεί σε αυτή την περίπτωση είναι ότι, λόγω των σφαλµάτων στρογγυλοποίησης στην Γκαουσιανή απαλοιφή, το OCTAVE έχει βρει µια λανθασµένη λύση. Το δίδαγµα αυτής της ενότητας είναι ότι ο τελεστής της καθέτου γραµµής (slash operator) στο OCTAVE είναι πολύ ισχυρός και χρήσιµος, αλλά πρέπει να τον χρησιµοποιούµε προσεκτικά. Πρέπει να ελέγχουµε τους πίνακες για να είµαστε σίγουροι ότι δεν είναι ιδιόµορφοι, ή σχεδόν ιδιόµορφοι17. 11.5 Κακή κατάσταση (Ill-conditioning) Οι πίνακες που είναι κοντά στο να είναι ιδιόµορφοι είναι ένα παράδειγµα από κακής κατάστασης (Ill-conditioned) πίνακες. Ένα πρόβληµα είναι κακής κατάστασης εάν µικρές αλλαγές στα δεδοµένα παράγουν µεγάλες αλλαγές στα αποτελέσµατα. Θεωρείστε το σύστηµα: 1 1 1 2 1 1.01 1 = 2.01 για το οποίο το OCTAVE εµφανίζει τη σωστή απάντηση: M=[1 1; 1 1.01]; b=[2; 2.01]; x=M\b 17 Μερικοί ιδιόµορφοι πίνακες µπορεί να έχουν άπειρες λύσεις, αντί καθόλου λύση. Σ’ αυτή την περίπτωση, ο τελεστής της καθέτου γραµµής (slash operator) δίνει µόνο µια από τις πιθανές τιµές. Αυτό πάλι είναι κάτι που πρέπει να προσέξουµε. Εισαγωγή στο OCTAVE Σελ. 58 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος x= 1.00000 1.00000 Ας αλλάξουµε τώρα ένα από τα στοιχεία του Μ κατά λίγο και να δούµε τι συµβαίνει: M(1,2)=1.005; x=M\b x= -0.0100000 2.0000000 Αλλάζοντας αυτό το ένα στοιχείο κατά 0.5% έχει µειώσει το X(1) κατά περίπου 101%, και έχει αυξήσει το X(2) κατά 100%! Η ευαισθησία ενός πίνακα εκτιµάται χρησιµοποιώντας τον αριθµό κατάστασης (condition number), ο ακριβής ορισµός του οποίου είναι πέρα από τον σκοπό αυτού του εγχειριδίου. Ωστόσο, όσο µεγαλύτερος είναι ο αριθµός κατάστασης, τόσο περισσότερο ευαίσθητη είναι η λύση σε αριθµητικά σφάλµατα. Στο OCTAVE ο αριθµός κατάστασης µπορεί να βρεθεί µε τη συνάρτηση cond: cond(M) ans = 402.01 Ένας κανόνας είναι ότι εάν γράψουµε τον αριθµό κατάστασης σε εκθετική µορφή ax10k, τότε τα τελευταία k σηµαντικά ψηφία του αποτελέσµατος πρέπει να αγνοηθούν. Το OCTAVE χρησιµοποιεί γύρω στα 15 σηµαντικά ψηφία, έτσι ο αριθµός των σηµαντικών ψηφίων που πρέπει να πιστέψουµε είναι (15 – k). Σ’ αυτό το παράδειγµα, ο αριθµός κατάστασης είναι 4x102, έτσι όλες από τις τελευταίες 2 δεκαδικές θέσεις της λύσης πρέπει να αγνοηθούν, δηλ. το αποτέλεσµα είναι τελείως έγκυρο18. Για τον ιδιόµορφο πίνακα Α από νωρίτερα, που έδωσε το ψεύτικο αποτέλεσµα, η συνάρτηση cond δίνει τον αριθµό κατάστασης 5.2432x1016. ∆ηλαδή, όλο το αποτέλεσµα πρέπει να αγνοηθεί. 11.6 Υπερπροσδιορισµένα συστήµατα: Ελάχιστα τετράγωνα (Over-determined systems: Least squares) Ένα συνηθισµένο πρόβληµα είναι όταν επιθυµούµε να ταιριάξουµε (παλινδρόµηση) ένα µαθηµατικό µοντέλο σε ένα µεγάλο αριθµό από δεδοµένα σηµεία. Κάθε δεδοµένο σηµείο µπορεί να εκφραστεί 18 Αυτό υποθέτει ότι οι τιµές που εισήχθησαν στον αρχικό πίνακα Μ και το διάνυσµα b ήταν ακριβείς σε 15 σηµαντικά ψηφία. Εάν αυτές οι τιµές ήταν γνωστές σε µικρότερη ακρίβεια, τότε χάνουµε k σηµαντικά ψηφία από αυτή την ακρίβεια. Εισαγωγή στο OCTAVE Σελ. 59 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος µε όρους της εξίσωσης του µοντέλου, δίνοντας ένα σύνολο από ταυτόχρονες εξισώσεις που είναι υπερπροσδιορισµένες, δηλ. ο αριθµός των ανεξάρτητων εξισώσεων, m, είναι µεγαλύτερος από τον αριθµό των µεταβλητών, n. Σ’ αυτή την περίπτωση δεν είναι δυνατόν να βρεθεί µια ακριβής λύση, αλλά η επιθυµητή λύση είναι το ‘καλύτερο ταίριασµα’. Αυτό συνήθως ορίζεται σαν τις παραµέτρους του µοντέλο που ελαχιστοποιούν το τετράγωνο του σφάλµατος για κάθε δεδοµένο σηµείο. Για ένα σύνολο εξισώσεως που µπορεί να γραφτεί ως Ax=b, η λύση ελάχιστων τετραγώνων δίνεται µε την ψευδοαντίστροφο: x = (ATA)-1ATb Στο OCTAVE µπορούµε να χρησιµοποιήσουµε τον \ τελεστή. Για πίνακες µε αντίστροφο ορίζεται για την επίλυση της εξίσωσης χρησιµοποιώντας την Γκαουσιανή απαλοιφή, αλλά για τα υπερπροσδιορισµένα συστήµατα βρίσκει τη λύση των ελάχιστων τετραγώνων. Η ψευδοαντίστροφος µπορεί επίσης να υπολογιστεί στο OCTAVE χρησιµοποιώντας την συνάρτηση pinv, όπως επιδεικνύεται στο ακόλουθο παράδειγµα. 11.7 Παράδειγµα: Τριγωνοποίηση (Example: Triangulation) Ένας ραδιοποµπός χεριού ανιχνεύεται από τρεις διαφορετικούς σταθµούς βάσης, ο καθένας από τους οποίους παρέχει µια µέτρηση της κατεύθυνσης προς τον ποµπό. Το διάνυσµα από κάθε σταθµό βάσης σχεδιαγράφεται σε έναν χάρτη και πρέπει όλα να τέµνονται στη θέση του ποµπού. Οι τρεις γραµµές στο χάρτη µπορεί να περιγραφτούν µε τις εξισώσεις: 2x − y = 2 x+ y =5 6 x − y = −5 Η λύση ελάχιστων τετραγώνων στο σηµείο που τέµνονται µπορεί να υπολογιστεί στο OCTAVE µε πολλούς διαφορετικούς τρόπους εφόσον ορίσουµε τις εξισώσεις µε πίνακες: A = [2 -1; 1 1; 6 -1]; b = [2 5 -5]’; x = inv(A’*A)*A’*b x= -0.094595 Εισαγωγή στο OCTAVE Σελ. 60 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 2.445946 x=pinv(A)*b x= -0.094595 2.445946 x = A\b x= -0.094595 2.445946 Φυσικά, όλοι οι παραπάνω τρόποι, δίνουν την ίδια λύση. Αυτή η λύση φαίνεται στο παρακάτω Σχήµα 8 µε τον αστερίσκο. Ο κώδικας που σχεδιαγραφεί τις προηγούµενες τρείς εξισώσεις, οι οποίες λόγω διαφόρων σφαλµάτων δεν υπάρχει ένα κοινό σηµείο στο οποίο αυτές τέµνονται, καθώς και το ελαχίστων τετραγώνων τους σηµείο που αυτές τέµνονται είναι ως εξής: x = linspace(-4, 4, 1000); y1 = 2*x+2; y2 = -x +5; y3 = 6*x + 5; A = [2 -1; 1 1; 6 -1]; b = [2 5 -5]’; simeio = A\b; plot(x, y1, x, y2, x, y3, simeio(1), simeio(2), ‘*); xlabel('x'); ylabel('y'); title (‘Plot of 2x-y=2, x+y=5, 6x-y=-5 and simeio=[-0.0946 2.446]’); legend(‘y1 = 2*x+2',' y2 = -x +5', ‘y3 = 6*x + 5’, ‘simeio’); grid on; Εισαγωγή στο OCTAVE Σελ. 61 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σχήµα 8: Τρεις γραµµές και η ελάχιστων τετραγώνων εκτίµηση του σηµείου που τέµνονται. 12. Περισσότερα για τα γραφήµατα (More graphs) Το OCTAVE παρέχει περισσότερο επιτηδευµένες δυνατότητες γραφικών από το να σχεδιαγραφεί απλά 2D Καρτεσιανά γραφήµατα, πάλι χρησιµοποιώντας το GNUPlot. Μπορεί επίσης να παράγει ιστογράµµατα, 3D επιφάνειες, σχεδιαγράµµατα καµπυλών και πολικά σχεδιαγράµµατα. Λεπτοµέρειες από όλα αυτά µπορεί να βρεθούν στο help σύστηµα και επιπρόσθετα στο GNUPlot εγχειρίδιο. 12.1 Θέτοντας µερικά γραφήµατα σε ένα παράθυρο (Putting several graphs in one window) Εάν έχουµε µερικά γραφήµατα που µοιράζονται παρόµοιο θέµα, µπορούµε να τα σχεδιαγράψουµε σε ξεχωριστά γραφήµατα µέσα στο ίδιο γραφικό παράθυρο. Η εντολή subplot διαχωρίζει το παράθυρο γραφικών σε µια διάταξη από µικρότερα παράθυρα. Η γενική µορφή είναι: subplot(rows, columns, select) Το select όρισµα προσδιορίζει το τρέχον γράφηµα στη διάταξη. Αυτά τα µικρότερα παράθυρα είναι αριθµηµένα από την κορυφή αριστερά, σχεδιογραφώντας τα πρώτα κατά την γραµµή. Το παράδειγµα παρακάτω δηµιουργεί δύο γραφήµατα, το ένα κάτω στο άλλο, όπως φαίνονται στο Σχήµα 9. x = linspace(-10, 10); subplot(2,1,1) % Specify two rows, one column, and select % the top one as the current graph plot(x, sin(x)); subplot(2,1,2); plot(x, sin(x)./x); Εισαγωγή στο OCTAVE Σελ. 62 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σχήµα 9: Παράδειγµα της εντολής subplot, δεικνύοντας ένα sine και sinc γράφηµα το ένα κάτω από το άλλο. Οι τυπικές για τους άξονες ετικέτες και για τους τίτλους εντολές µπορεί επίσης να χρησιµοποιηθούν σε κάθε subplot. 12.2 Τρισδιάστατα σχεδιαγράµµατα (3D plots) Το OCTAVE παρέχει µια ευρεία γκάµα µεθόδων απεικόνισης 3D δεδοµένων. Ο πιο απλός τρόπος για 3D γραφήµατα είναι plot3, που είναι το 3D ισοδύναµο της εντολής plot. Χρησιµοποιείται για σχεδιαγράφηση σηµείων ή γραµµών, αυτή η εντολή απλά παίρνει µια λίστα από x, y και z τιµές. Το ακόλουθο παράδειγµα σχεδιαγραφεί έναν έλικα, χρησιµοποιώντας µια παραµετρική αντιπροσώπευση19. t = 0:pi/50:10*pi; x = sin(t); y = cos(t); z = t; plot3(x, y, z); Το γράφηµα δεικνύεται στο Σχήµα 10. Οι εντολές xlabel και ylabel δουλεύουν όπως προηγουµένως και τώρα η εντολή zlabel µπορεί επίσης να χρησιµοποιηθεί. Όταν σχεδιαγραφούµε γραµµές ή σηµεία σε 3D µπορούµε να χρησιµοποιήσουµε όλα τα στυλ που είναι στη λίστα του Πίνακα 3. 19 Μια γραµµή είναι µόνο µιας διάστασης µορφή – µπορούµε να ορίσουµε ένα σηµείο πάνω στο µήκος της γραµµής, αλλά δεν έχει πλάτος ή ύψος. Οι γραµµές λοιπόν µπορούν να περιγραφούν µε όρους µόνο µιας παραµέτρου: την απόσταση κατά µήκος της γραµµής. Τα x, y (και 3D z) συντεταγµένες από σηµεία στην γραµµή µπορούν όλα να γραφούν σαν συναρτήσεις αυτής της απόστασης κατά µήκος της γραµµής: ‘εάν είµαι τόσο µακριά κατά µήκος της γραµµής, πρέπει να είµαι σε αυτό το σηµείο’. Εισαγωγή στο OCTAVE Σελ. 63 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σχήµα 10: Παράδειγµα της εντολής plot3, δεικνύοντας έναν έλικα. 12.3 Αλλάζοντας την οπτική γωνία (Changing the viewpoint) Εάν θέλουµε να περιστρέψουµε το 3D σχεδιάγραµµα για να το δούµε από µια άλλη γωνία, η πιο εύκολη µέθοδος είναι να χρησιµοποιήσουµε το ποντίκι. (Κάνοντας κλικ και σύροντας µε το ποντίκι πάνω στο σχεδιάγραµµα θα περιστρέψει και θα εστιάσει το γράφηµα κλπ. Βοηθά εάν το γράφηµα έχει ετικέτες πρώτα). Λεπτοµέρειες για τις περισσότερο χρησιµοποιούµενες εντολές δίνονται στον Πίνακα 820. Πίνακας 8: Ποντίκι και πλήκτρα για αλληλεπίδραση µε 3D γραφικά (Mouse and Key binds for interaction with 3D graphs). (LMB - Left Mouse Button, MMB – Middle Mouse Button), βλ. επίσης Πίνακα 4. Ποντίκι (Mouse) LMB + motion <Ctrl> + LMB + motion MMB + motion Ενέργειες Rotate View Rotate axes (View update when button released) Scale View <Ctrl> + MMB + motion Scale axes (View update when button released) <Shift> + MMB + motion vertical motion – change ticslevel Πλήκτρα Ενέργειες → Rotate right (<shift> increases amount) ↑ Rotate up (<shift> increases amount) ← Rotate left (< shift> increases amount) ↓ Rotate down (<shift> increases amount) Η OCTAVE εντολή view µπορεί επίσης να χρησιµοποιηθεί για την επιλογή και για να θέσει µια συγκεκριµένη οπτική γωνία, (χρησιµοποίησε help view για περισσότερες πληροφορίες). 20 Το MATLAB έχει ένα υπερβάλλον γραφικό αλληλεπιδραστικό χρησιµοποιώντας ένα GUI. Εισαγωγή στο OCTAVE Σελ. 64 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 12.4 Σχεδιαγράφοντας επιφάνειες (Plotting surfaces) Μια άλλη κοινή απαίτηση για 3D γραφικά είναι η σχεδιαγράφηση µια επιφάνειας, που ορίζεται σαν συνάρτηση δύο µεταβλητών f(x, y), και αυτές µπορεί να σχεδιαγραφούν στο OCTAVE µε διαφορετικούς τρόπους. Πρώτα όµως, για να σχεδιαγραφήσουµε αυτές τις συναρτήσεις χρειαζόµαστε ένα πλέγµα σηµείων στα οποία η συνάρτηση πρέπει να αξιολογηθεί. Ένα τέτοιο πλέγµα (grid) µπορεί να δηµιουργηθεί µε την χρήση της meshgrid συνάρτησης του OCTAVE: x = 2:0.2:4; % Define the x- and y- coordinates y = 1:0.2:3; % of the grid lines [X, Y] = meshgrid(x, y); %Make the grid Οι πίνακες X και Y τότε περιέχουν τις x και y συντεταγµένες των σηµείων δείγµατος. Η συνάρτηση µπορεί να αξιολογηθεί σε κάθε ένα από αυτά τα σηµεία. Για παράδειγµα, για τη σχεδιαγράφηση της συνάρτησης f(x, y) = (x − 3)2 − (y − 2)2 πάνω στο πλέγµα που υπολογίστηκε προηγουµένως, θα εισάγουµε: Z=(X-3).^2 - (Y-2).^2; surf(X, Y, Z) Η εντολή surf είναι µία από τους πιθανούς τρόπους απεικόνισης της επιφάνειας. Το Σχήµα 11 δεικνύει, στην κορυφή αριστερά, αυτή την επιφάνεια σχεδιαγραφηµένη χρησιµοποιώντας την εντολή surf, και επίσης τα αποτελέσµατα από µερικές άλλες δυνατές 3D εντολές σχεδιαγράφησης. Surf 1 0.5 0 -0.5 -13 2.5 2 1.5 12 2.5 3 3.5 4 Σχήµα 11: Παραδείγµατα της ίδιας επιφάνειας µορφής-σαµάρι (saddle-shaped) απεικονιζόµενης χρησιµοποιώντας διαφορετικές OCTAVE εντολές. (∆οκιµάστε τη σχεδιαγράφηση των άλλων 3 γραφηµάτων στο ίδιο σχήµα χρησιµοποιώντας την εντολή subplot(2, 2, i)). Εισαγωγή στο OCTAVE Σελ. 65 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 12.5 Εικόνες και κινηµατογραφική ταινία (Images and Movies) Μια εικόνα είναι απλά ένας πίνακας, όπου κάθε αριθµός αντιπροσωπεύει το χρώµα ή την ένταση εκείνου του κάθε εικονοστοιχείου (pixel). ∆εν πρέπει λοιπόν να εκπλαγούµε ότι το OCTAVE µπορεί επίσης να κάνει επεξεργασία εικόνας. Ας υποθέσουµε ότι ένας πίνακας µε τιµές φωτεινότητας µιας εικόνας έχει αποθηκευτεί σε ένα αρχείο που ονοµάζεται cued.mat, τότε οι παρακάτω εντολές το φορτώνουν και το εµφανίζουν: load cued colormap(gray(64)) % Tell Octave to expect a grayscale image image(a) Η εντολή image εµφανίζει τον πίνακα σαν µια εικόνα. Η εντολή colormap λέει στο OCTAVE να διερµηνεύσει κάθε αριθµό σαν σκιά του grey, και τι είναι το εύρος των αριθµών21. Το OCTAVE µπορεί επίσης να δηµιουργήσει και να εµφανίσει κινηµατογραφικές ταινίες (movies), αλλά σε αντίθεση µε το MATLAB αυτή η δυνατότητα είναι δύσχρηστη. Ελπίζοµε να βελτιωθεί αυτή η δυνατότητα στο µέλλον. 13. Ιδιοδιανύσµατα και Αποσύνθεση ιδιόµορφων τιµών (Eigenvectors and the Singular Value Decomposition) Μετά από τη λύση της Ax=b, η άλλη σπουδαία εξίσωση πινάκων είναι Ax=λx, η λύση της οποίας είναι τα ιδιοδιανύσµατα (eigenvectors) και οι ιδιοτιµές (eigenvalues) του πίνακα Α. Εξισώσεις αυτής της µορφής εµφανίζονται συχνά σε εφαρµογές µηχανικών, και το OCTAVE πάλι παρέχει τα κατάλληλα εργαλεία. 13.1 Η συνάρτηση eig (The eig function) Η συνάρτηση eig στο OCTAVE υπολογίζει τα ιδιοδιανύσµατα και τις ιδιοτιµές. Εάν χρησιµοποιηθεί µόνη της, απλά επιστρέφει ένα διάνυσµα που περιέχει τις ιδιοτιµές, όπως για παράδειγµα: A = [1 3 -2 351 -2 1 4]; eig(A) ans = -1.5120 4.9045 6.6076 21 ∆οκιµάστε colormap(jet) για ένα παράδειγµα µιας εναλλακτικής διερµηνείας των αριθµών (αυτό είναι το προεπιλεγµένο colormap). Το colormap επίσης χρησιµοποιείται να προσδιορίσει τα χρώµατα για το ύψος στις 3D εντολές σχεδιαγράφησης. Εισαγωγή στο OCTAVE Σελ. 66 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Για να πάρουµε τα ιδιοδιανύσµατα, χρειαζόµαστε να δώσουµε δύο µεταβλητές για την απάντηση: [V, D] = eig(A) V= -0.818394 -0.315302 -0.480434 0.434733 0.207055 -0.876433 -0.375818 0.926128 0.032380 D= -1.51204 0.00000 0.00000 0.00000 4.90448 0.00000 0.00000 0.00000 6.60756 Οι στήλες του πίνακα V είναι τα ιδιοδιανύσµατα, και οι ιδιοτιµές αυτή τη φορά επιστρέφονται στη διαγώνιο ενός πίνακα. Τα ιδιοδιανύσµατα και οι ιδιοτιµές επιστρέφονται σ’ αυτή τη µορφή διότι αυτή είναι συµβατή µε τη διαγώνιο µορφή του πίνακα. Πρέπει να ανακαλέσουµε, εάν U είναι ο πίνακας µε τα ιδιοδιανύσµατα και Λ ο διαγώνιος πίνακας µε τις ιδιοτιµές, τότε A = UΛU−1. Μπορούµε εύκολα να το ελέγξουµε αυτό χρησιµοποιώντας τους πίνακες που επιστράφηκαν µε την εντολή eig: V*D*inv(V) ans = 1.0000 3.0000 -2.0000 3.0000 5.0000 1.0000 -2.0000 1.0000 4.0000 που είναι ο αρχικός πίνακας A. 13.2 Αποσύνθεση ιδιόµορφων τιµών (The Singular Value Decomposition) Τα ιδιοδιανύσµατα και οι ιδιοτιµές µπορεί να βρεθούν µόνο για ένα τετραγωνικό πίνακα, και έτσι η αποσύνθεση σε UΛU−1 είναι δυνατή µόνο για αυτούς του πίνακες. Η αποσύνθεση ιδιόµορφων τιµών (Singular Value Decomposition (SVD)) είναι µια πολύ χρήσιµη τεχνική, η οποία προσφέρει µια παρόµοια αποσύνθεση για οποιονδήποτε πίνακα. Λεπτοµέρειες καλύπτονται στο µάθηµα Γραµµική Άλγεβρα, αλλά µια σύνοψη του αποτελέσµατος της αποσύνθεσης δίνεται εδώ. Η SVD τεχνική παίρνει έναν m×n πίνακα A και τον παραγοντοποιεί σε A = Q1ΣQ2T , όπου: Q1 είναι ένας m×m ορθογώνιος πίνακας µε στήλες τα ιδιοδιανύσµατα του AAT Q2 είναι ένας n×n ορθογώνιος πίνακας µε στήλες τα ιδιοδιανύσµατα του ATA Σ είναι ένας m×n διαγώνιος πίνακας µε στοιχεία τις τετραγωνικές ρίζες των ιδιοτιµών του AAT και ATA (και οι δύο έχουν τις ίδιες ιδιοτιµές, αλλά διαφορετικά ιδιοδιανύσµατα) Εισαγωγή στο OCTAVE Σελ. 67 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Αυτό το αποτέλεσµα καλύτερα φαίνεται γραφικά: T Q2 ( nxn ) 644 4 7444 8 Q1 ( mxm ) A( mxn ) Σ ( mxn ) ⋅ 644 4 7444 8 64748 644 4 7444 8 ⋅ ⋅ ⋅ ⋅ m = m m n ⋅ ⋅ n ⋅ ⋅ ⋅ m ⋅ ⋅ ⋅ n ⋅ ⋅ ⋅ ⋅ ⋅ n ⋅ ⋅ Το πιο σπουδαίο µέρος αυτής της αποσύνθεσης είναι η θεώρηση του πίνακα Σ, ο διαγώνιος πίνακας, του οποίου τα στοιχεία ονοµάζονται ιδιόµορφες τιµές, σi: σ 1 σ2 Σ= 0 O σr 0 0 O 0 Επειδή είναι µέρος του διαγωνίου πίνακα, αυτές πολλαπλασιάζουν µόνο ειδικές στήλες του Q1 ή του Q222. Το µέγεθος της ιδιόµορφης τιµής µας λέει ακριβώς πόσο επηρεασµό οι αντίστοιχες γραµµές και στήλες του Q1 και Q2T έχουν στον διαγώνιο πίνακα. Ευκρινώς, εάν µία ιδιόµορφη τιµή είναι µικρή, πολύ λίγο από τις αντίστοιχες γραµµές και στήλες προστίθενται στον πίνακα A όταν ανακατασκευαστεί. Είναι συχνά κοινό για έναν πίνακα να έχει µερικές µηδενικές ιδιοτιµές, όπως φαίνεται παραπάνω. Αυτά τα µηδενικά στοιχεία στη διαγώνιο αντιστοιχούν στις γραµµές ή στήλες που δεν δίνουν επιπρόσθετες πληροφορίες. Αυτό σηµαίνει, φυσικά, ότι όχι όλος ο πίνακας είναι χρήσιµος — δηλαδή είναι ελλιπής στην τάξη (rank deficient). Ή, σε όρους ταυτόχρονες εξισώσεις, ότι όχι όλες οι εξισώσεις είναι ανεξάρτητες. Η τεχνική SVD είναι πολύ χρήσιµο εργαλείο για την ανάλυση ενός πίνακα, και οι λύσεις σε πολλά προβλήµατα µπορεί απλά να διαβαστούν από την αποσύνθεση των πινάκων. Για παράδειγµα, ο µηδενικός χώρος ενός πίνακα (η λύση Ax = 0) είναι απλά οι στήλες του Q2 που αντιστοιχούν στις µηδενικές ιδιόµορφες τιµές. Η SVD είναι επίσης αριθµητικά υψηλά ευσταθής — πίνακες που είναι λίγο κακής κατάστασης (ill-conditioned) έχουν περισσότερες δυνατότητες να δουλεύουν µε SVD από οτιδήποτε άλλο. 22 Οι ιδιόµορφες τιµές Σ φυσικά πολλαπλασιάζουν τις γραµµές του Q2T, και έτσι τις στήλες του µηαντιστραµένης έκδοσης, Q2. Εισαγωγή στο OCTAVE Σελ. 68 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 13.3 Προσέγγιση πινάκων: Αλλαγή τάξης (Approximating matrices: Changing rank) Μια άλλη σπουδαία χρήση της τεχνικής SVD είναι η διορατικότητα που δίνει στο ποσό που ένας πίνακας είναι σπουδαίος, και πώς να απλοποιηθεί ένας πίνακας µε ελάχιστη αποδιοργάνωση. Οι ιδιόµορφες τιµές είναι συνήθως διατεταγµένες σε σειρά µεγέθους, µε την πρώτη σ1, να είναι η µεγαλύτερη και περισσότερο σηµαντική. Οι αντίστοιχες στήλες του Q1 και Q2 είναι επίσης διατεταγµένες σε σπουδαιότητα. Αυτό σηµαίνει ότι, ενώ µπορούµε να βρούµε την ακριβή τιµή του A πολλαπλασιάζοντας Q1ΣQ2T, εάν εξαλείψουµε (για παράδειγµα) την τελευταία στήλη του Q1 και Q2, και την τελευταία ιδιόµορφη τιµή, θα εξαλείφουµε τα λιγότερο σπουδαία δεδοµένα. Εάν µετά πολλαπλασιάσουµε αυτούς τους απλούστερους πίνακες, θα πάρουµε µόνο κάποια προσέγγιση του A, αλλά εκείνη που ακόµη περιέχει όλες εκτός τις πιο ασήµαντες πληροφορίες. 13.4 Η svd εντολή (The svd function) Η τεχνική SVD εκτελείται στο OCTAVE χρησιµοποιώντας την συνάρτηση svd. Όπως µε την συνάρτηση eig, από µόνη της επιστρέφει τις ιδιόµορφες τιµές (singular values), αλλά εάν της δοθούν τρεις πίνακες για την απάντηση τότε θα τους συµπληρώσει µε την πλήρη αποσύνθεση: A = [1 3 -2 3 3515 -2 1 4 2]; svd (A) ans = 8.9310 5.0412 1.6801 [U, S, V] = svd (A, 0) U= -4.6734e-01 3.8640e-01 7.9516e-01 -8.6205e-01 3.3920e-04 -5.0682e-01 -1.9611e-01 -9.2233e-01 3.3294e-01 S= 8.93102 0.00000 0.00000 0.00000 5.04125 0.00000 Εισαγωγή στο OCTAVE Σελ. 69 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 0.00000 0.00000 1.68010 V= -0.297983 -0.661559 -0.079700 -0.683516 0.442764 -0.828029 0.047326 0.109729 -0.885056 -0.455551 -0.135631 0.307898 U*S*V’ % Check Answers ans = 1.00000 3.00000 -2.00000 3.00000 3.00000 5.00000 1.00000 5.00000 -2.00000 1.00000 4.00000 2.00000 Σηµειώνεται ότι το OCTAVE αυτόµατα βάζει σε σειρά τις ιδιόµορφες τιµές σε φθίνουσα διάταξη. 13.5 Η εντολή svd (Economy SVD) Αν ένας πίνακας Α διαστάσεων m×n έχει m > n, τότε ο πίνακας µοναδικών τιµών του Σ, θα έχει τουλάχιστον µια γραµµή µε µηδενικά: [U, S, V] = svd (A) U= -0.22985 0.88346 0.40825 -0.52474 0.24078 -0.81650 -0.81964 -0.40190 0.40825 S= 9.52552 0.00000 0.00000 0.51430 0.00000 0.00000 V= -0.61963 -0.78489 -0.78489 0.61963 Εάν µετά θεωρήσουµε τον πολλαπλασιασµό A = U*S*V’, µπορούµε να δούµε ότι η τελευταία στήλη του U δεν έχει λόγο ύπαρξης: πολλαπλασιάζει τα µηδενικά της S, και έτσι κάλλιστα µπορεί να φύγει. Έτσι αυτή η τελευταία στήλη µπορεί µε ασφάλεια να εξαλειφθεί, και το ίδιο ισχύει για την τελευταία γραµµή του S. Τότε αυτό που µένει είναι πίνακες της ακόλουθης µορφής: Εισαγωγή στο OCTAVE Σελ. 70 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος A ( mxn ) 64748 M m = ⋅ n ⋅ T Q2 ( nxn ) Σ ( nxn ) Q1 ( mxm ) 6474 8 6474 8 64748 M M M m n n ⋅ m ⋅ ⋅ n ⋅ ⋅ n ⋅ Το OCTAVE µπορεί να κάνει αυτή την οικονοµική τεχνική SVD µε το να προσθέσουµε ένα ‘, 0’ στο όρισµα της συνάρτησης (µηδέν, όχι το γράµµα ‘ο’): [U, S, V] = svd (A, 0) U= -0.22985 0.88346 -0.52474 0.24078 -0.81964 -0.40190 S= 9.52552 0.00000 0.00000 0.51430 V= -0.61963 -0.78489 -0.78489 0.61963 Αυτό συνιστάται για πίνακες αυτής της µορφής, διότι παίρνει πολύ λιγότερο µνήµη και χρόνο να επεξεργαστούν. 14. Μιγαδικοί αριθµοί (Complex numbers) Πέρα από τους υπολογισµούς πινάκων και διανυσµάτων, το OCTAVE επίσης υποστηρίζει πολλά µαθηµατικά σκεπτικά και σκεπτικά µηχανικής, και µεταξύ αυτών είναι οι µιγαδικοί αριθµοί. Οι µιγαδικοί αριθµοί µπορεί να εισαχθούν στο OCTAVE ακριβώς όπως τους γράφουµε, για παράδειγµα: z1 = 4-3i z1 = 4 - 3i Εναλλακτικά, τα i και j αρχικοποιούνται από το OCTAVE να είναι ορίσαµε διαφορετικά) µπορούµε να εισάγουµε: −1 και έτσι (εάν δεν z2 = 1 + 3*j Εισαγωγή στο OCTAVE Σελ. 71 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος z2 = 1 + 3i Μπορούµε να εκτελέσουµε όλες τις σύνηθες αριθµητικές πράξεις στους µιγαδικούς αριθµούς, ακριβώς όπως για τους πραγµατικούς αριθµούς: z2-z1 ans = -3 + 6i z1+z2 ans = 5 z2/z1 ans = -0.20000 + 0.60000i z1^2 ans = 7 - 24i Το OCTAVE επίσης παρέχει µερικές συναρτήσεις και άλλες τυπικές µιγαδικές πράξεις, όπως ανεύρεση µιγαδικού συζυγή, µέγεθος και τη φάση αριθµού, κλπ. (βλ. επόµενο Πίνακα 9). Πίνακας 9: Συναρτήσεις µιγαδικών αριθµών (Complex number functions) Συνάρτηση (function) Σηµασία (meaning) Ορισµός (definition ( z = a + bi )) imag Imaginary part b real Real part a abs Absolute value (modulus) conj Complex conjugate angle Phase angle (argument) r= z z = a − bi θ = tan −1 (b / a ) Άλλες συναρτήσεις που µαθηµατικά ορίζονται για µιγαδικούς αριθµούς, όπως sin(x) ή ex, επίσης λειτουργούν µε µιγαδικούς αριθµούς: sin (z2) Εισαγωγή στο OCTAVE Σελ. 72 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ans = 8.4716 + 5.4127i exp (j*pi) %Should be -1 ans = -1.0000e+00 + 1.2246e-16i exp (j*2) ans = -0.41615 + 0.90930i cos (2) + j*sin(2) %Should be the same as e^2i ans = -0.41615 + 0.90930i Πίνακες και διανύσµατα µπορούν, φυσικά, επίσης να περιέχουν µιγαδικούς αριθµούς. 14.1 Σχεδιαγράφοντας µιγαδικούς αριθµούς (Plotting complex numbers) Η εντολή plot του OCTAVE επίσης καταλαβαίνει µιγαδικούς αριθµούς. Έτσι µπορούµε να την χρησιµοποιήσουµε για να κάνουµε το Argand σχεδιάγραµµα (όπου ο x-άξονας αντιπροσωπεύει το πραγµατικό µέρος και ο y-άξονας το φανταστικό): plot (z1,’*’, z2,’*’) axis ([-5 5 -5 5]) Αυτές οι εντολές παράγουν τα σχεδιαγράµµατα που φαίνονται στο Σχήµα 12. Σχήµα 12: Γραφική αντιπροσώπευση των µιγαδικών αριθµών z1 = 4 − 3i και z2 = 1 + 3i χρησιµοποιώντας τη συνάρτηση plot. Εισαγωγή στο OCTAVE Σελ. 73 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 14.2 Βρίσκοντας ρίζες πολυωνύµων (Finding roots of polynomials) Για την εύρεση ριζών πολυωνυµικών εξισώσεων, το OCTAVE παρέχει την συνάρτηση roots. Η εξίσωση εισάγεται στο OCTAVE, χρησιµοποιώντας ένα διάνυσµα για τους συντελεστές. Για παράδειγµα, η πολυωνυµική εξίσωση: x5 + 2 x 4 − 5 x 3 + x + 3 = 0 θα αντιπροσωπευτεί ως: c = [1 2 -5 0 1 3]; Η συνάρτηση roots καλείται χρησιµοποιώντας αυτό το διάνυσµα: roots (c) ans = -3.44726 + 0.00000i 1.17303 + 0.39021i 1.17303 - 0.39021i -0.44940 + 0.60621i -0.44940 - 0.60621i 15. Χειρισµοί πολυωνύµων (Polynomial manipulation) Στο Octave ένα πολυώνυµο αντιπροσωπεύεται από τους συντελεστές του (διατεταγµένους σε φθίνουσα σειρά). Για παράδειγµα, ένα διάνυσµα c µήκους N+1 αντιστοιχεί στο εξής πολυώνυµο τάξης N: p(x) = c(1) x^N + ... + c(N) x + c(N+1) Η τιµή ενός πολυωνύµου που αντιπροσωπεύεται από το διάνυσµα c µπορεί να αποτιµηθεί στο σηµείο x πολύ εύκολα, όπως φαίνεται στο επόµενο παράδειγµα: c = [1 2 3]; N = length(c)-1; val = dot( 2.^(N:-1:0), c ); val = 11 Ενώ το παραπάνω παράδειγµα δείχνει πόσο εύκολο είναι να υπολογιστεί η τιµή ενός πολυωνύµου, δεν είναι όµως ο πιο ευσταθής αλγόριθµος. Με µεγαλύτερα πολυώνυµα πρέπει να χρησιµοποιούµε περισσότερο κοµψούς αλγόριθµους, όπως τη µέθοδο του Horner, που είναι ακριβώς αυτή που χρησιµοποιείται στη συνάρτηση polyval (c, x) του Octave. Για να πάρουµε τη γραφική παράσταση του p(x) (βλ. παρακάτω Σχήµα 13) στο διάστηµα [-1, 1] γράφουµε: Εισαγωγή στο OCTAVE Σελ. 74 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος x=linspace(-1, 1); plot(x, polyval(c, x)) Σχήµα 13: Γραφική παράσταση του p(x). Στην περίπτωση που το x είναι τετραγωνικός πίνακας, το πολυώνυµο που δίνεται µε το διάνυσµα c παραµένει να είναι καλά-ορισµένο. Όπως όταν το x είναι αριθµός η προφανής υλοποίηση εύκολα εκφράζεται στο Octave, αλλά επίσης σε αυτή την περίπτωση περισσότερο κοµψοί αλγόριθµοι αποδίδουν καλύτερα. Η συνάρτηση polyvalm (c, x) παρέχει έναν τέτοιο αλγόριθµο, δηλ. η polyvalm (c, x) θα αποτιµήσει το πολυώνυµο µε την έννοια των πινάκων, που σηµαίνει πολλαπλασιασµός πινάκων χρησιµοποιείται αντί στοιχείο προς στοιχείο πολλαπλασιασµό όπως χρησιµοποιείται στην polyval. Το όρισµα x πρέπει να είναι ένας τετραγωνικός πίνακας. 15.1 Υπολογισµός ριζών (Finding Roots) Το Octave µπορεί να βρει τις ρίζες ενός δεδοµένου πολυωνύµου υπολογίζοντας τον συµπληρωµατικό (companion) πίνακα του πολυωνύµου (βλ. την συνάρτηση compan, παρακάτω για ορισµό), και µετά βρίσκοντας τις ιδιοτιµές του (eigenvalues). Η συνάρτηση roots (v) για ένα διάνυσµα v µε N στοιχεία, επιστρέφει τις ρίζες του πολυωνύµου: v(1) * z^(N-1) + ... + v(N-1) * z + v(N) Για παράδειγµα, ο παρακάτω κώδικας υπολογίζει τις ρίζες του τετραγωνικού πολυωνύµου p(x) = x^2 – 5: c = [1, 0, -5]; roots(c) Εισαγωγή στο OCTAVE Σελ. 75 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ans = -2.2361 2.2361 Σηµειώνεται ότι το πραγµατικό αποτέλεσµα είναι +/- sqrt(5) που είναι περίπου +/- 2.2361. Βλέπετε επίσης τη συνάρτηση compan. 15.2 Η συνάρτηση compan (c) Η συνάρτηση compan (c) υπολογίζει τον συµπληρωµατικό (companion) πίνακα που αντιστοιχεί στο πολυώνυµο µε συντελεστές το διάνυσµα c. Ο συµπληρωµατικός (companion) πίνακας είναι: − c2 / c1 1 A= 0 M 0 − c3 / c1 L − c N / c1 0 L 0 1 M L O 0 M 0 L 1 − c N +1 / c1 0 0 M 0 Οι ιδιοτιµές του συµπληρωµατικού πίνακα είναι ίσον µε τις ρίζες του πολυωνύµου. 15.3 Γινόµενο και διαίρεση πολυωνύµων Για να πολλαπλασιάσουµε δύο πολυώνυµα χρησιµοποιούµε την εντολή conv (a, b). Για παράδειγµα, για τον πολλαπλασιασµό των πολυωνύµων p(x)=x+2 και q(x)=x^2+4x+8: p=[1, 2]; q=[1, 4, 8]; z=conv(p, q) z= 1 6 16 16 Βρήκαµε, δηλαδή, ότι z(x) = p(x) q(x) = x^3 + 6x^2 + 16x + 16. Για να διαιρέσουµε δύο πολυώνυµα χρησιµοποιούµε την εντολή deconv(a,b). Για παράδειγµα, για να διαιρέσουµε τώρα το z(x) µε το q(x) έχουµε: [p, r] = deconv(z, q) p=1 2 r=0 0 0 Εισαγωγή στο OCTAVE 0 (Η διαίρεση είναι φυσικά ακριβής.) Σελ. 76 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 15.4 Παράγωγος ενός πολυωνύµου Για να βρούµε την παράγωγο ενός πολυωνύµου χρησιµοποιούµε την εντολή polyder (p). Για παράδειγµα, η παράγωγος του p(x) = 3x^3 − 4x^2 − x + 2 είναι: p=[3, -4, -1, 2]; polyder(p) ans = 9 -8 -1 15.5 Χαρακτηριστικό πολυώνυµο ενός τετραγωνικού πίνακα Η εντολή poly βρίσκει το χαρακτηριστικό πολυώνυµο ενός τετραγωνικού πίνακα. Για παράδειγµα: A=[1, 2, 3; 0, 2, 4; 0 0 5] A= 123 024 005 p=poly(A) p= 1 -8 17 -10 Μπορούµε να βρούµε τις ρίζες του χαρακτηριστικού πολυωνύµου (δηλ. τις ιδιοτιµές του Α) µε την: roots(p) ans = 5.0000 2.0000 1.0000 ή πιο απλά µε την εντολή eig: eig(A) ans = 1 2 5 Εισαγωγή στο OCTAVE Σελ. 77 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 15.6 Προσαρµογή δεδοµένων (curve fitting) Μια από τις κύριες εφαρµογές των πολυωνύµων είναι η προσαρµογή δεδοµένων (curve fitting), που είναι επίσης γνωστή ως παλινδρόµηση (regression). Σε αυτή τη διαδικασία, έχουµε σαν δεδοµένα ένα πεπερασµένο αριθµό σηµείων και θέλουµε να βρούµε µια συνάρτηση, συνήθως πολυώνυµο µικρού βαθµού, που να αντιπροσωπεύει τα δεδοµένα, δηλ. να προσαρµόσουµε το πολυώνυµο στα δεδοµένα. Αν απαιτήσουµε το πολυώνυµο να περνά από όλα τα σηµεία), τότε παίρνουµε το λεγόµενο πολυώνυµο παρεµβολής (interpolant), του οποίου ο βαθµός είναι ίσος µε τον αριθµό των σηµείων πλην ένα. Αν δεν απαιτήσουµε το πολυώνυµο να περνά από όλα τα σηµεία, αλλά να έχει βαθµό µικρότερο από τον αριθµό των σηµείων πλην ένα, τότε αυτό µπορεί να γίνει µε διάφορες µεθόδους, η πιο συνηθισµένη των οποίων είναι η µέθοδος των ελάχιστων τετραγώνων (least squares method). Στο Octave τα πιο πάνω γίνονται µε την εντολή polyfit, που δουλεύει ως εξής: Έστω ότι τα (xi, yi), i= 1,...,N+1 είναι τα δεδοµένα που έχουν αποθηκευτεί σε δύο διανύσµατα x και y, αντίστοιχα. Τότε, η εντολή: p = polyfit(x, y, Μ) µας δίνει τους συντελεστές του πολυωνύµου p που έχει βαθµό Μ και που αντιπροσωπεύει τα δεδοµένα. Σηµειώνεται ότι αν Μ=Ν, τότε παίρνουµε τους συντελεστές του πολυώνυµου παρεµβολής που περνά από όλα τα σηµεία (xi, yi), ενώ αν Μ<N τότε παίρνουµε τους συντελεστές ενός πολυωνύµου που προσαρµόζει τα δεδοµένα µε την µέθοδο των ελάχιστων τετραγώνων. Αν Μ>N, τότε το πολυώνυµο δεν είναι µοναδικό. Όµως αυτή η περίπτωση δεν παρουσιάζει ενδιαφέρον. Για παράδειγµα, έστω ότι έχουµε: x = [1 2 3 4]; y = [2 6 4 8]; Τότε, p = polyfit(x, y, 3) p = 2 -15 35 -20 το οποίο σηµαίνει ότι το πολυώνυµο p (x) = 2x^3 −15x^2 + 35x – 20 περνά από όλα τα δοθέντα σηµεία, µιας και έχουµε 4 σηµεία και το πολυώνυµο που κατασκευάστηκε έχει βαθµό 3. Εισαγωγή στο OCTAVE Σελ. 78 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Για να κάνουµε τη γραφική παράσταση του p(t) (βλ. παρακάτω Σχήµα 14), µε t στο διάστηµα [1, 4] και για να δείξουµε τα δεδοµένα σηµεία στους ίδιους άξονες, εισάγουµε τον παρακάτω κώδικα: t = linspace(1, 4); p_times = polyval(p, t); plot(t, p_times, x, y, 'o') xlabel('x') ylabel('y') legend('p(x)','data') Σχήµα 14: Γραφική παράσταση του p(x). 16. OCTAVE - Εφαρµογές στα Συστήµατα Αυτοµάτου Ελέγχου Η θεωρία αυτοµάτου ελέγχου είναι ένας διεπιστηµονικός κλάδος της µηχανικής και των εφαρµοσµένων µαθηµατικών µε αντικείµενο την ανάλυση, σχεδιασµό και υλοποίηση ελεγκτών που αυτόµατα (χωρίς την ανθρώπινη επέµβαση) χειρίζονται τις εισόδους ενός δυναµικού συστήµατος για να επιτευχθεί το επιθυµητό αποτέλεσµα στην έξοδο. Έστω το δυναµικό σύστηµα που αποτελείται από ένα ελατήριο και µια µάζα κρεµασµένη στο ένα άκρο του όπως στο παρακάτω σχήµα. Εισαγωγή στο OCTAVE Σελ. 79 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Η διαφορική εξίσωση που περιγράφει τις δυναµικές του συστήµατος είναι: M d2 d y (t ) + b y (t ) + ky (t ) = u (t ) 2 dt dt όπου: k.........είναι ο συντελεστής σκληρότητας του ελατηρίου M .......η µάζα του ελατηρίου y(t) .... είναι η απόσταση του κέντρου βάρους της µάζας από το σηµείο ισορροπίας, και u(t) ...είναι η κάθετη δύναµη την οποία εφαρµόζουµε στη µάζα b ........µια σταθερά που εξαρτάται από την αντίσταση του αέρα. Εάν οι παράµετροι M=10, κ=5 και b=2, τότε γνωρίζουµε ότι η χαρακτηριστική εξίσωση της οµογενούς εξίσωσης του συστήµατος είναι 10 p 2 + 2 p + 5 = 0 . Χρησιµοποιώντας το OCTAVE βρίσκουµε τις ρίζες του χαρακτηριστικού πολυωνύµου του συστήµατος: p = [10 2 5]; roots (p) ans = -0.10000 + 0.70000i -0.10000 - 0.70000i Επειδή οι ρίζες είναι µιγαδικές αυτό σηµαίνει ότι η ελεύθερη απόκριση του συστήµατος θα παρουσιάζει ταλαντώσεις. Επίσης γνωρίζουµε ότι εάν ορίσουµε για τη θέση και την ταχύτητα τις καταστάσεις x1 (t ) = y (t ) και µε x&1 (t ) = y& (t ) = x2 (t ) αντίστοιχα, τότε στο χώρο καταστάσεων το σύστηµα που περιγράφεται µε την παραπάνω δευτέρας τάξης διαφορική εξίσωση µπορεί να αντικατασταθεί µε το παρακάτω σύστηµα δύο διαφορικών εξισώσεων πρώτης τάξης: 0 x&1 (t ) x& (t ) = k = x& 2 (t ) − M Εισαγωγή στο OCTAVE 1 0 x1 (t ) b + 1 − x2 (t ) M M x ( t ) y (t ) = [1 0 ] 1 x 2 (t ) u (t ) = Ax (t ) + bu (t ) Σελ. 80 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Θέτοντας τις τιµές των παραµέτρων M=10, κ=5 και b=2 το παραπάνω σύστηµα γίνεται: 1 x1 (t ) 0 x&1 (t ) 0 x& (t ) = −0.5 −0.2 x (t ) + 0.1 u (t ) 2 2 x (t ) y (t ) = [1 0] 1 = Cx(t ) + 0u (t ) x2 (t ) Στο OCTAVE το παραπάνω σύστηµα στο χώρο καταστάσεων αντιπροσωπεύεται µε το αντικείµενο που δηµιουργείται µε την εντολή ss (state space) ως εξής: A = [0 1; -0.5 -0.2]; b = [0; 0.1]; c = [1 0]; sys = ss(A, b, c, 0); 16.1 Ελεύθερη απόκριση συστήµατος Η ελεύθερη απόκριση ενός συστήµατος είναι η έξοδός του yελ (t ) όταν η είσοδος είναι 0. Αφού πρώτα έχουµε ορίσει το διάνυσµα του χρόνου, το διάνυσµα της εισόδου και τις αρχικές του συνθήκες y (0) = 1 και dy (0) / dt = y& (0) = 2 , µπορούµε εύκολα να επιβεβαιώσουµε ότι η ελεύθερη απόκριση του συστήµατος παρουσιάζει ταλαντώσεις και να βρούµε την µέγιστη τιµή της κάνοντας προσοµοίωση στο OCTAVE χρησιµοποιώντας την εντολή lsim ως εξής: t = [0:0.1:100]; u = zeros(1001, 1); y0 = 1; 2]; y = lsim (sys, u, t, y0); mx=max(abs(y)) % µέγιστη τιµή ταλάντωσης plot(t,y,'Color',[0 0 1], 'LineWidth',2, mx, ‘*’); title('Free response of a Mass Spring System'); xlabel('t'), ylabel('y(t)'), grid('on'); mx = 2.6723 Το παρακάτω Σχήµα 15 δεικνύει τις ταλαντώσεις της ελεύθερης απόκρισης του συστήµατος και τη µέγιστη αποµάκρυνση mx = 2.6723 που παρουσιάζει το ελατήριο από τη θέση ισορροπίας. Εισαγωγή στο OCTAVE Σελ. 81 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σχήµα 15: Ελεύθερη απόκριση ενός συστήµατος µάζας-ελατηρίου. 16.2 Κρουστική απόκριση συστήµατος Η απόκριση του συστήµατος σε είσοδο την κρουστική συνάρτηση Dirac δ(t) δίνεται από την εντολή: impulse(sys, 1, 100, 1000); title('Impulse response of a Mass Spring System'); όπου 1 είναι ο δείκτης της µεταβλητής που διεγείρεται, 100 είναι πάλι το χρονικό διάστηµα που µελετάµε το σύστηµα (βλ. παρακάτω Σχήµα 16), και 1000 είναι το πλήθος των σηµείων προσοµοίωσης. Σχήµα 16: Κρουστική (Impulse) απόκριση του συστήµατος. Εισαγωγή στο OCTAVE Σελ. 82 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 16.3 Βηµατική απόκριση συστήµατος Αντίστοιχα µε την εντολή step υπολογίζουµε την απόκριση του συστήµατος σε βηµατική είσοδο: step(sys, 1, 100, 1000); title('Step response of a Mass Spring System'); όπου 1 είναι ο δείκτης της µεταβλητής που διεγείρεται, 100 είναι πάλι το χρονικό διάστηµα που µελετάµε το σύστηµα (βλ. παρακάτω Σχήµα 17), και 1000 είναι το πλήθος των σηµείων προσοµοίωσης. Σχήµα 17: Βηµατική (Step) απόκριση του συστήµατος. 16.4 Σχεδιασµός ελεγκτή γραµµικού ρυθµιστή Η απόκριση του συστήµατος (βλ. παραπάνω Σχήµα 17) µε βηµατική είσοδο δεικνύει ότι στο αρχικό διάστηµα υπάρχουν αισθητές ταλαντώσεις οι οποίες αποσβήνουν περίπου τελείως στο χρονικό διάστηµα µετά τα 40 sec. Είναι επιθυµητό να σχεδιαστεί ένας ανατροφοδοτικός (feedback) ελεγκτής έτσι ώστε για βηµατική είσοδο αυτές να µην είναι πολύ αισθητές και να αποσβήνουν σε σύντοµο χρονικό διάστηµα. Υπάρχουν αρκετοί τρόποι σχεδίασης τέτοιων ελεγκτών. Εδώ θα χρησιµοποιήσουµε τη µεθοδολογία του γραµµικού ρυθµιστή (linear regulator). Ο γραµµικός ρυθµιστής είναι ο ανατροφοδοτικός ελεγκτής που για το σύστηµα: x& (t ) = Ax(t ) + Bu (t ) ελαχιστοποιεί το τετραγωνικό κόστος: Εισαγωγή στο OCTAVE Σελ. 83 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος ∞ T J = ∫ x (t )Qx(t ) + u T (t ) Ru (t ) dt to όπου οι πίνακες βαρύτητας των καταστάσεων Q ≥ 0 και του ελέγχου R > 0 . Το OCTAVE έχει ενσωµατωµένη τη συνάρτηση lqr η οποία επιστρέφει το κέρδος Κ του ανατροφοδοτικού ελεγκτή u (t ) = − Kx (t ) έτσι ώστε το σύστηµα κλειστού βρόχου x& (t ) = [ A − BK ] x(t ) = Acl x(t ) να είναι ευσταθές (ιδιοτιµές του πίνακα Acl µικρότερες του µηδενός). Επίσης η συνάρτηση lqr, σύµφωνα µε τη θεωρία, δίνει τη λύση της αλγεβρικής Riccati εξίσωσης και τις ιδιοτιµές του κλειστού βρόχου συστήµατος Acl . Η σύνταξη της συνάρτησης lqr είναι: [k, p, e] = lqr (a, b, q, r) 15 0 ≥ 0 και του ελέγχου 0 25 Έτσι επιλέγοντας τους πίνακες βαρύτητας των καταστάσεων Q = R = 0.25 > 0 ο παρακάτω OCTAVE κώδικας µας δίνει τη βηµατική απόκριση του κλειστού βρόχου συστήµατος που δεικνύεται στο Σχήµα 18: A = [0 1; -0.5 -0.2]; b = [0; 0.1]; c = [1 0]; q = [10 0; 0 25]; r = 0.25; [k, p, e] = lqr (A, b, q, r); Acl = A – b*k; sys = ss(Acl, b, c, 0); step(sys, 1, 100, 1000); title('Step response of the Closed loop Mass Spring System'); Εισαγωγή στο OCTAVE Σελ. 84 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Σχήµα 18: Βηµατική Απόκριση συστήµατος κλειστού βρόχου. Συγκρίνοντας τα παραπάνω Σχήµατα 17 και 18 είναι προφανές ότι ο γραµµικός ρυθµιστής (ανατροφοδοτικός ελεγκτής) αποσβήνει πλήρως τις ταλαντώσεις του συστήµατος σε σύντοµο χρονικό διάστηµα και µε χωρίς µεγάλη υπερύψωση. 17. Εφαρµογές του OCTAVE στη Ψηφιακή Επεξεργασία Σήµατος Η ψηφιακή επεξεργασία σήµατος (Digital signal processing (DSP)) διαπραγµατεύεται την αντιπροσώπευση σηµάτων µε µια αλληλουχία αριθµών ή συµβόλων και την επεξεργασία αυτών των σηµάτων. Περιλαµβάνει διάφορους τοµείς όπως επεξεργασία ακουστικών σηµάτων και οµιλίας, σηµάτων sonar και radar, σηµάτων διατάξεων αισθητήρων, εκτιµήσεις φάσµατος, στατιστική επεξεργασία σήµατος, ψηφιακή επεξεργασία εικόνων, επεξεργασία σηµάτων τηλεπικοινωνιών, σηµάτων βιοϊατρικής, έλεγχο συστηµάτων, επεξεργασία σεισµικών δεδοµένων, κλπ. 17.1 Συνέλιξη και φιλτράρισµα (Convolution and Filtering) Η µαθηµατική υποδοµή για το φιλτράρισµα σηµάτων είναι η συνέλιξη (convolution). Η OCTAVE συνάρτηση conv εκτελεί την τυπική µονο-διάστατη συνέλιξη ενός διανύσµατος µε ένα άλλο: Για παράδειγµα, conv([1 1 1],[1 1 1]) ans = 1 2 3 2 Εισαγωγή στο OCTAVE 1 Σελ. 85 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Η έξοδος y(k) ενός ψηφιακού φίλτρου είναι η συνέλιξη του σήµατος εισόδου του x(k) µε την κρουστική του απόκριση (impulse response) h(k). Μαθηµατικά, η αντιπροσώπευση αυτής της σχέσης έχει ως εξής: y ( k ) = h( k ) * x ( k ) = ∞ ∑ h ( k − n) x ( n) n =−∞ Εάν η κρουστική απόκριση h(k) ενός φίλτρου είναι πεπερασµένου µήκους και η είσοδός του x(k) είναι επίσης πεπερασµένου µήκους, τότε µπορούµε να υλοποιήσουµε το φίλτρο χρησιµοποιώντας τη συνάρτηση conv. Αποθηκεύουµε τις τιµές x(k) σε ένα διάνυσµα x, τις τιµές h(k) σε ένα διάνυσµα h, και εκτελούµε τη συνέλιξή τους ως εξής: x = randn(5,1); h = ¼*[1 1 1 1]; % Τυχαίο διάνυσµα µήκους 5 (µε διαστάσεις 5x1) % Φίλτρο µέσου όρου µήκους 4 y = conv(h,x); y= 0.43699 0.29990 0.16408 0.32081 -0.66092 -0.52393 -0.38800 0.54474 17.2 Φίλτρα και συναρτήσεις µεταφοράς (Filters and Transfer Functions) Γενικά, ο µετασχηµατισµός-Ζ Y(z) της εξόδου y(n) ενός ψηφιακού φίλτρου σχετίζεται µε το µετασχηµατισµό-Ζ X(z) της εισόδου του x(n) ως εξής: Y (z) = H ( z) X (z) = b(1) + b(2) z −1 + ... + b(n + 1) z − n X ( z) a(1) + a(2) z −1 + ... + a(m + 1) z − m όπου H(z) είναι η συνάρτηση µεταφοράς του φίλτρου. Οι σταθερές b(i) και a(i) είναι οι συντελεστές του φίλτρου και η τάξη του φίλτρου είναι το µέγιστο των n και m. Το OCTAVE αποθηκεύει τους συντελεστές σε δύο διανύσµατα σε µορφή γραµµής, ένα για τον αριθµητή (b) και ένα για τον παρονοµαστή (a). Εισαγωγή στο OCTAVE Σελ. 86 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Αρκετά τυπικά ονόµατα φίλτρων αντανακλούν τον αριθµό των a και b συντελεστών που υπάρχουν ως εξής: Όταν n = 0 (που σηµαίνει ότι το b είναι ένας αριθµός), το φίλτρο είναι ένα Infinite Impulse Response (IIR) φίλτρο, all-pole, recursive, ή autoregressive (AR) φίλτρο. Όταν m = 0 (που σηµαίνει ότι το a είναι ένας αριθµός), το φίλτρο είναι ένα Finite Impulse Response (FIR), all-zero, nonrecursive, ή moving-average (MA) φίλτρο. Εάν και τα δύο n και m είναι µεγαλύτερα από µηδέν, το φίλτρο είναι ένα IIR, pole-zero, recursive, ή autoregressive moving-average (ARMA) φίλτρο. Τα αρκτικόλεξα AR, MA, και ARMA συνήθως χρησιµοποιούνται σε φίλτρα που σχετίζονται µε το φιλτράρισµα στοχαστικών διεργασιών. 17.3 Συνάρτηση filter (Function filter) Από το z-µετασχηµατισµό µπορούµε να µεταβούµε πίσω στη µορφή της σχέσης µε την εξίσωση διαφορών. Υποθέτοντας ότι a(1) = 1, πολλαπλασιάζουµε τον παρονοµαστή µε την αριστερή πλευρά και παίρνουµε τον αντίστροφο z-µετασχηµατισµό (inverse z-transform) ως εξής: y (k ) + a2 y (k − 1) + ... + am +1 y (k − m) = b1 x(k ) + b2 x(k − 1) + ... + bn +1 x(k − n) Με τους τρέχοντες και παρελθοντικούς όρους της εισόδου και τις παρελθοντικές τιµές της εξόδου y(k) έχουµε: y (k ) = b1 x(k ) + b2 x(k − 1) + ... + bn +1 x(k − n) − a2 y (k − 1) + ... + am +1 y (k − m) Αυτή η αντιπροσώπευση είναι τυπική (standard) στο πεδίο του χρόνου για ένα ψηφιακό φίλτρο, και υπολογίζεται αρχίζοντας µε y(1) και υποθέτοντας µηδενικές αρχικές συνθήκες. Η πρόοδος αυτής της αντιπροσώπευσης είναι: y (1) = b1 x(1) y (2) = b1 x(2) + b2 x(1) − a2 y (1) y (3) = b1 x(3) + b2 x(2) + b3 x(1) − a2 y (2) − a3 y (1) M = M Ένα φίλτρο σε αυτή τη µορφή είναι εύκολο να υλοποιηθεί µε τη συνάρτηση filter του OCTAVE. Για παράδειγµα, ένα απλό χαµηλοπερατό (lowpass) φίλτρο ενός πόλου είναι: Εισαγωγή στο OCTAVE Σελ. 87 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος b = 1; % Αριθµητής a = [1 -0.9]; % Παρονοµαστής όπου τα διανύσµατα b και a αντιπροσωπεύουν τους συντελεστές ενός φίλτρου σε µορφή συνάρτησης µεταφοράς. Για την εφαρµογή αυτού του φίλτρου σε δεδοµένα µε το διάνυσµα x χρησιµοποιούµε τη σύνταξη: y = filter(b, a, x); Η συνάρτηση filter µας δίνει τόσα δείγµατα εξόδου όσα υπάρχουν στην είσοδο, δηλ. το µήκος του διανύσµατος y είναι το ίδιο µε το µήκος του διανύσµατος x. Εάν το πρώτο στοιχείο του a δεν είναι 1, η συνάρτηση filter διαιρεί του συντελεστές µε a(1) πριν την υλοποίηση της εξίσωσης διαφορών. 17.4 Κρουστική Απόκριση (Impulse Response) Η κρουστική απόκριση ενός ψηφιακού φίλτρου είναι η έξοδος που προκύπτει από τη µοναδιαία κρουστική αλληλουχία στην είσοδο που ορίζεται ως: 1, n = 1 x ( n) = 0, n ≠ 1 Στο OCTAVE µπορούµε να δηµιουργήσουµε µια κρουστική αλληλουχία µε πολλούς τρόπους. Ένας απλός τρόπος είναι: imp = [1; zeros(49, 1)]; Η κρουστική απόκριση του απλού φίλτρου b = 1 και a = [1 -0.9] είναι: h = filter(b, a, imp); 17.5 ∆ιακριτός µετασχηµατισµός Fourier (Discrete Fourier Transform) Ο διακριτός µετασχηµατισµός Fourier (discrete Fourier transform), ή DFT, είναι το κύριο εργαλείο για ψηφιακή επεξεργασία σήµατος. Η αλγοριθµική µέθοδος για τον υπολογισµό του DFT µε µειωµένο χρόνο εκτέλεσης είναι ο γρήγορος µετασχηµατισµός Fourier (fast Fourier transform (FFT)). Το OCTAVE παρέχει τις συναρτήσεις fft και ifft για τον υπολογισµό του διακριτού µετασχηµατισµού Fourier (discrete Fourier transform, DFT) και τον αντίστροφό του αντίστοιχα. Για µια αλληλουχία εισόδου x και του DFT µετασχηµατισµού του X (σε ισοµερή συχνότητες γύρω από τον µοναδιαίο κύκλο), οι δύο συναρτήσεις υλοποιούν τις σχέσεις: Εισαγωγή στο OCTAVE Σελ. 88 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος N −1 X (k + 1) = ∑ x(n + 1)WNkn n=0 x(n + 1) = όπου WN = e − j( 2π ) N 1 N N −1 ∑ X (k + 1)W − kn N k =0 . Για παράδειγµα, µπορούµε να δηµιουργήσουµε ένα διάνυσµα χρόνου και ένα διάνυσµα σήµατος ως εξής: t = (0:1/100:10-1/100); % ∆ιάνυσµα χρόνου x = sin(2*pi*15*t) + sin(2*pi*40*t); % Σήµα Τότε το DFT του σήµατος, το µέτρο και η φάση της µετασχηµατισµένης σειράς είναι: y = fft(x); % Υπολογισµός DFT του x m = abs(y); p = unwrap(angle(y)); % Μέτρο καο φάση Για να πάρουµε το γράφηµα του µέτρου και της φάσης (βλ. Σχήµα 19) εισάγουµε τις εξής εντολές: f = (0:length(y)-1)*99/length(y); % Frequency vector plot(f, m); title('Magnitude'); set(gca,'XTick',[15 40 60 85]); figure; plot(f, p*180/pi); title('Phase'); set(gca, 'XTick',[15 40 60 85]); Σχήµα 19: Μέτρο και φάση του y=fft((sin(2*pi*15*t) + sin(2*pi*40*t)). Εισαγωγή στο OCTAVE Σελ. 89 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Για να πειραµατιστείτε µε τον αντίστροφο διακριτό µετασχηµατισµό Fourier (συνάρτηση ifft) δοκιµάστε το παρακάτω παράδειγµα όπου η αρχική αλληλουχία x και η ανακτηµένη αλληλουχία είναι ταυτόσηµες (στα πλαίσια σφάλµατος στρογγυλοποίησης). t = (0:1/255:1); x = sin(2*pi*120*t); y = real(ifft(fft(x))); 18. Επεξεργασία εικόνας µε την Οκτάβα 18.1 Εργαλειοθήκη επεξεργασίας εικόνας «image» Για την επεξεργασία εικόνας χρειαζόµαστε την σχετική εργαλειοθήκη image. Οι εργαλειοθήκες της Οκτάβας παρατίθενται στη δνση: http://octave.sourceforge.net/packages.php. Στην σελίδα που θα εµφανιστεί αναφέρονται όλες οι εργαλειοθήκες που είναι άνω των 80. Επιλέγοντας “details” βλέπουµε τις εντολές µιας εργαλειοθήκης ενώ πατώντας “download” τις κατεβάζουµε. Πάντως ο πιο εύκολος τρόπος εγκατάστασης είναι µέσω του Synaptics package manager. Η Οκτάβα προσφέρεται για επεξεργασία εικόνων γιατί οι εικόνες παριστάνονται ως δισδιάστατοι (grayscale) ή τρισδιάστατοι πίνακες (έγχρωµες). Ο όρος grayscale αποδίδεται εδώ ως γκρι και όχι ασπρόµαυρη [που έχει µόνο άσπρα και µαύρα εικονοστοιχεία]. Το “:” στο τέλος της εντολής αποκρύπτει υπολογισµούς. Το “#” δηλώνει σχόλιο. τους ενδιάµεσους αριθµητικούς Πηγή: http://octave.sourceforge.net/image/overview.html Ακολουθεί Κώδικας µε σχόλια 18.2 Εισαγωγή και προβολή εικόνων clc # clear screen - καθαρισµός οθόνης τερµατικού # Χρησιµοποιούµε την εντολή imread(“διαδροµή”) για να διαβάσουµε # µιαν εικόνα. myimage1 = imread("/home/antony/Octave_scripts/d5.gif"); # get # original image no.1 myimage2 =imread("/home/antony/Octave_scripts/appLBW.jpg"); # get Εισαγωγή στο OCTAVE Σελ. 90 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος # original gray image no.1 myimage3 =imread("/home/antony/Octave_scripts/apple.jpg"); # get # original image no.3 # Χρησιµοποιούµε την εντολή imshow(όνοµα_εικόνας) για να # διαβάσουµε µιαν εικόνα. imshow(myimage1) # πρόβαλε την εικ.1 Εικ. 1 – Αρχική εικόνα 18.3 Μετατροπές εικόνων # Η δυαδική συνάρτηση isgray(εικόνα1) επιστρέφει 1 αν η εικόνα1 είναι # σε διαβαθµίσεις του γκρί. ∆ιαφορετικά, (έγχρωµη), επιστρέφει 0. # isgray() # Boolean. Returns true for a gray-scale intensity image. # Η συνάρτηση flipud(myimage1) αναποδογυρίζει µια γκρί εικόνα # try with a colour image to see the difference # Αναποδογύρισε και πρόβαλε µιαν εικόνα αν είναι γκρί if (isgray(myimage1)) cc=flipud(myimage1); # flip a 2-D (B/W) image; disp('Image is grayscaLe') imshow(cc) # show result else disp('Image is NOT grayscaLe') end # end_if Η συνάρτηση rgb2gray µετατρέπει µιαν έχρωµη εικόνα σε γκρί. # rgb2gray # Converts an RGB image to a gray scale image Εισαγωγή στο OCTAVE Σελ. 91 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος myimage2 = imread("/home/antony/Octave_scripts/d5.gif"); # get # original image no.2 d6= rgb2gray(myimage2); # convert to gray BOOL1 = isgray(d6) # check if gray [should be "1"] imshow(d6) # show result # j=histeq(d6) # δείξε το ιστόγραµµα της εικ. d6 Εικ.2 – Μετατροπή αρχικής εικόνας σε γκρι # # # # ALTERNATIVELY, --- µια πιο συµπαγής σύνταξη είναι: d7= rgb2gray(imread("/home/antony/Octave_scripts/d5.gif")); get original image no.1 imshow(d7) # Τώρα που έχουµε την γκρί εικόνα, µπορούµε να την # αναποδογυρίσουµε: d7=flipud(d6); imshow(d7) # flip a 2-D (B/W) image; # show result Εικ.3 – Αναποδογύρισµα της γκρι εικόνας [δ7] Εισαγωγή στο OCTAVE Σελ. 92 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος 18.4 Επεξεργασία γκρί εικόνας Περιστροφή γκρί εικόνας # Χρησιµοποιούµε την εντολή imrotate που συντάσσεται ως εξής: ## imrotate(IMGPRE, THETA, METHOD, BBOX, EXTRAPVAL) d8= imrotate(d6, 30, "nearest", "loose", 0); # περιστροφή κατά 30° imshow(d8) # show result Εικ.4 – Περιστροφή της γκρι εικόνας κατά 30° [δ8] d9= imrotate(d6, -30, "nearest", "crop", 0); # περιστροφή κατά # -30° και επιπλέον, # kopse o,ti perisseuei apo to arxiko plaisio imshow(d9) # show result Εικ.5 – Περιστροφή της γκρι εικόνας κατά -30° µέσα στο αρχικό πλαίσιο [δ9] d10 =imresize(d6,0.5); Εισαγωγή στο OCTAVE # Σµίκρυνση 50% Σελ. 93 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος imshow(d10) # show result Εικ.6 – Σµίκρυνση της γκρι εικόνας κατά 50% [δ10] 18.5 Φιλτράρισµα εικόνας µε κώδικα # Υπενθυµίζουµε ότι µια εικόνα είναι ένας 2-∆ ή 3-∆ πίνακας [n_row,n_col] =size(myimage1) # Return the number rows and columns # of myimage1 zmax=max(max(myimage1)) # find max value zmin=min(min(myimage1)) # find min value imshow(myimage1) # show image before aa=myimage1; # define a new img_variable "aa" for i=1:n_row for j=1:n_col if (myimage1(i,j) < zmax*0.8) # transformation # Αλλάζοντας την τιµή [0,8] παίρνουµε διαφορετικά # αποτελέσµατα – δοκιµάστε aa(i,j)=1; # αν ισχύει η ανωτέρω # συνθήκη, αντικάθιστώ το πίξελ µε 1 end # end_if end # end_for_coL end # end_for_row imshow(aa) # show image after filtering Εισαγωγή στο OCTAVE Σελ. 94 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Εικ.7α – Αρχική εικόνα Εικ.7β – Φιλτραρισµένη εικόνα Παρατηρούµε αλλαγή χρώµατος των κίτρινων εικονοστοιχείων σε πιο σκούρα (κόκκινα). ∆οκιµάστε µε διάφορες τιµές του κατωφλίου. 19. Εργαστηριακές Ασκήσεις 19.1 Αποτίµηση συναρτήσεων y = f(x) και χειρισµός διανυσµάτων-πινάκων Παράδειγµα: x=0:0.1:1; y=sin(pi*x); % Γράψτε help elfun να δείτε λίστα προορισµένων συναρτήσεων Εναλλακτικά, χρησιµοποιώντας τον βρόχο for-end (αισθητά αργός τρόπος) x=0:0.1:1; n=length(x); for i=1:n; y(i)=sin(pi*x(i)); end; ∆ιανύσµατα και πίνακες (Vectors are matrices): y=x*x; % Τι συµβαίνει; Γιατί; x2=0:0.2:1; y=x+x2; % Τι συµβαίνει; Γιατί; y=x’*x % Τι είναι το y; y=x*x’ % Τι είναι το y; Στοιχείο προς στοιχείο εντολές (Componentwise operation): y=x.*x % Η τελεία δεικνύει πολλαπλασιασµό στοιχείων y=x.^3 % Το carat δεικνύει εκθέτη y=2*x % Εδώ δεν χρειάζεστε τελεία y=1./x % Εδώ δεν χρειάζεστε τελεία Πρόσβαση σε υποδιανύσµατα (Accessing subvectors): x=0:0.1:1; n=length(x) x2=x(5:10) % Τι είναι το x2; x2=x([1,3,4,11]) % Τι είναι το x2; x2=x(2:4:11) % Τι είναι το x2; Εισαγωγή στο OCTAVE Σελ. 95 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Πρόσβαση σε υποπίνακες Accessing submatrices: a=[100 90 85; 117 110 108; 84 84 84; 96 90 88]; [m, n]=size(x) a2=a(2,3) % Τι είναι ο υποπίνακας a2; a2=a(:,2) % Τι είναι ο a2; a2=a(2,:) % Τι είναι ο a2; a2=a(2:3,:) % Τι είναι ο a2; a2=a(2:3,[1,3]) % Τι είναι ο a2; Η εντολή sum (The sum command (type ’help sum’)): y = [1, 4, 2, 10]; sum(y); % επιστρέφει το άθροισµα των στοιχείων του y sum(y(1:2:4)); % Τι είναι αυτό; sum(a(:,1)); % µε το a όπως πριν. Τι είναι αυτό; 19.2 ∆ιαγράµµατα (plots) Εντολή plot (Plot command): x=0:.1:1; y =sin(2*pi*x); plot(x, y); % τα δύο διανύσµατα πρέπει να έχουν ίδιες διαστάσεις Exercise: x=[0,1]; y=sin(2*pi*x); plot(x,y); % Τι συµβαίνει; Επιλογές (Options): Line type options: -,:,--,-. plot(x, plot(x, plot(x, plot(x, y,’-’); y,’:’); y,’--’); y,’-.’); Επιλογές χρωµάτων (Color options): y, m, c, r, g, b, w, k plot(x, y, ’g’); plot(x, y, ’r’) % green line (line is default) Επιλογές σήµανσης (Marker options): ., o, x, +, *, s, d, v, ^, <, >, p, h (type help plot) plot(x, y, ’x’); % blue star (blue is default) Χρησιµοποιώντας µερικές επιλογές µαζί (Using several options together): plot(x, y,’*-r’); % red line with star markers ∆ιαγράµµατα µερικών γραφηµάτων (Plotting several curves): Εισαγωγή στο OCTAVE Σελ. 96 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος x=0:0.05:1; y1=sin(2*pi*x); y2=cos(2*pi*x); plot(x, y1, x, y2) plot(x, y1, ’-b’, x, y2, ’--r’) x=0:0.05:2; y1=x; y2=x.^2; y3=x.^3; y4=x.^4; plot(x, y1, ’-b’, x, y2, ’--r’, x, y3, ’*g’, x, y4, ’-c’) Εναλλακτικά, χρήση εντολής hold (Alternative, using hold command): x=0:0.05:1; y1=sin(2*pi*x); y2=cos(2*pi*x); plot(x, y1,’-b’) hold on plot(x, y2,’--r’) hold off Εντολή για τους άξονες (The axis command): axis([0,2,0,4]) axis equal axis square % Γράψτε ’help axis’ για να δείτε τι άλλες επιλογές υπάρχουν Ετικέτες (Labelling): xlabel(’time t’) ylabel(’position s(t)’) ylabel(’position s(t)’,’FontSize’,16) title(’Its important to label your graphs!’) text(0.6, 2,’some text’,’FontSize’,16) set(gca,’FontSize’,16) legend(’x’,’x^2’) Τα πιο απλά διαγράµµατα (Simplest Plots): plot(x) % Plots x vs its index, quick way to see what is in x plot(x1, x2) % Careful! This does not plot x1 vs index % and x2 vs index. Instead, plots x2 vx x1 plot(x1,x2,x3) % and this gives you an error. Why? 19.3 Άλλες ποικίλες εντολές (Miscellaneous commands) Σχόλια (Comments): % This is a comment The help and lookfor commands: help zeros help for help lookfor factorial % you need to know exact command name % lists topics for which there is help % if you do not know the exact command name The print command: print Εισαγωγή στο OCTAVE % prints current figure to current printer Σελ. 97 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος print -deps print -depsc print -dps % prints current figure to .eps file % prints current figure to color .eps file % prints current figure to .ps file The figure command: figure figure(2) % opens new figure % makes figure 2 the current figure The pause command: pause pause(2) % What does this do? % What does this do? The continuation symbol: x=[0 1 2 3 4 5 ... 6 7 8 9 10] % To continue the current command % to the next line, use ... The clear command: clear clear x y ... % clears all variables from memory % clears listed variables from memory The clf command: clf Εισαγωγή στο OCTAVE % clears current figure Σελ. 98 από 99 Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Βιβλιογραφία (References) [1] www.octave.org και http://www.gnu.org/software/octave/ [2] P.J.G. Long, Introduction to Octave, Department of Engineering, University of Cambridge, September 2005, http://smilodon.berkeley.edu/octavetut.pdf [3] Hubert Selhofer, revised by Marcel Oliver, Introduction to GNU Octave, 2003/09/10, http://math.jacobs-university.de/oliver/teaching/iub/resources/octave/octave-intro.pdf [4] Kai Arras, Octave/Matlab Tutorial, http://srl.informatik.uni-freiburg.de/downloadsdir/OctaveMatlab-Tutorial.pdf [5] John W. Eaton, David Bateman, Søren Hauberg, GNU Octave, A high-level interactive language for numerical computations, Edition 3 for Octave version 3.2.2, July 2007. [6] MATLAB (http://www.mathworks.com/) [7] Βολογιαννίδης Σταύρος, Συστήµατα Αυτοµάτου Ελέγχου, Θεωρία και Εφαρµογές, http://anadrasis.math.auth.gr/S.Vologiannidis.htm [8] Γ. ΓΕΩΡΓΙΟΥ - Χ. ΞΕΝΟΦΩΝΤΟΣ, Εισαγωγή στη MATLAB, ISBN 978-9963-644-57-5, Kantzilaris, Nicosia, Cyprus 2007, http://www.ucy.ac.cy/~georgios ή http://www.ucy.ac.cy/~xenophontos. Εισαγωγή στο OCTAVE Σελ. 99 από 99
© Copyright 2024 Paperzz