Εισαγωγή στο εργαλείο επεξεργασίας αριθµητικών δεδοµένων

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος
Εισαγωγή στο εργαλείο επεξεργασίας
αριθµητικών δεδοµένων 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