Octave TutoriaL

99
Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος Εισαγωγή στο OCTAVE Σελ. 1 από 99 Εισαγωγή στο εργαλείο επεξεργασίας αριθμητικών δεδομένων Octave Απόστολος Π. Λερός & Αντώνιος Σ. Ανδρεάτος Αθήνα, Μάϊος 2010

Transcript of Octave TutoriaL

Page 1: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 1 από 99

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

Απόστολος Π. Λερός & Αντώνιος Σ. Ανδρεάτος

Αθήνα, Μάϊος 2010

Page 2: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 2 από 99

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

Απόστολος Π. Λερός ΤΕΙ Χαλκίδας, Τμήμα Αυτοματισμού και Σχολή Ικάρων

[email protected]

Αντώνιος Σ. Ανδρεάτος Σχολή Ικάρων, Τομέας Πληροφορικής

[email protected]

Το παρόν εκπονήθηκε για τις ανάγκες του Εργαστηρίου «Εισαγωγής στην Οκτάβα»,

που διοργανώθηκε στο πλαίσιο του 5ου ΣYNE∆ΡΙΟΥ ΕΛ/ΛΑΚ, που έλαβε χώρα στην Αθήνα

(ΕΜΠ, Μάϊος 2010).

Σημείωση πνευματικών δικαιωμάτων

Το υλικό αυτών των σημειώσεων προήλθε ως επί το πλείστον από την παρατιθέμενη

βιβλιογραφία. Ως εκ τούτου, το copyright των δανεικών κειμένων ανήκει κατά κύριο

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

Creative Commons BY-NC-ND.

Επιμέλεια κειμένου: Ανδριάνα Μυκονιάτη

[email protected]

Αθήνα, Μάϊος 2010

Page 3: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 3 από 99

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ Σελ. 1. ΕΙΣΑΓΩΓΗ ΣΤΟ OCTAVE..............................................................................................................5

1.1 Τι είναι το OCTAVE................................................................................................................5 1.2 Τι δεν είναι το OCTAVE...........................................................................................................5 1.3 Ποιοι χρησιµοποιούν το OCTAVE; ..............................................................................................5 1.4 Γιατί δεν γίνεται χρήση µιας κανονικής υψηλού επιπέδου γλώσσας πχ. 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

Page 4: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 4 από 99

11.7 Παράδειγµα: Τριγωνοποίηση (Example: Triangulation) ............................................................... 60 12. Περισσότερα για τα γραφήµατα (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

Σηµείωση: Για διευκόλυνση του χρήστη, ο κώδικας παρέχεται µέσα σε πλαίσια σαν αυτό. Ο χρήστης

µπορεί να αντιγράψει τον κώδικα και να τον επικολλήσει στο τερµατικό. Χρειάζεται προσοχή µήπως πρέπει να

µετατραπούν οι απόστροφοι από πλάγιες σε όρθιες.

Page 5: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 5 από 99

1. ΕΙΣΑΓΩΓΗ ΣΤΟ OCTAVE

1.1 Τι είναι το 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 είναι ειδικά σχεδιασµένο για την επίλυση

τέτοιων προβληµάτων να κάνει αριθµητικούς υπολογισµούς και να δεικνύει τα αποτελέσµατα

Page 6: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 6 από 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 ams O c t a ve ή κάνοντας κλικ στο εικονίδιό του. Μετά από λίγο

εµφανίζεται ένα λογότυπο σε ένα νέο παράθυρο και ανάλογα µε την έκδοση που έχει εγκατασταθεί

θα δεικνύει τα εξής:

Page 7: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 7 από 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) - Ηµίτονο

Page 8: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 8 από 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).

Page 9: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 9 από 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 είναι µετακινούµενης υποδιαστολής αριθµοί. Χρησιµοποιώντας αυτή τη µεταβλητή

µπορούµε να γράψουµε την προηγούµενη έκφραση ως εξής:

Page 10: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 10 από 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 ή πέντε δεκαδικά ψηφία. 3 Το OCTAVE αποθηκεύει όλους τους αριθµούς σε µορφή IEEE κινούµενης υποδιαστολής τύπου διπλής ακρίβειας (64-bit). Η τιµή ans εδώ στην πραγµατικότητα είναι 0.520639040645464 (µε 15 δεκαδικά ψηφία).

Page 11: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 11 από 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.

Page 12: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 12 από 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 δεν µπορεί ακριβώς να αντιπροσωπευτεί σε δυαδική µορφή χρησιµοποιώντας ένα

Page 13: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 13 από 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

Page 14: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 14 από 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)

Εάν δούµε ότι κάποια εντολή που εισάγαµε παίρνει πολύ χρόνο να εκτελεστεί, είναι πολύ χρήσιµο

να γνωρίζουµε πώς να την σταµατήσουµε. Μπορούµε να ακυρώσουµε την τρέχουσα εντολή

εισάγοντας:

Page 15: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 15 από 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]

Page 16: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 16 από 99

c =

3

5

12

Μια λίστα αριθµών διαχωρισµένων µε κενά ή κόµµατα µέσα σε τετραγωνικές παρενθέσεις, ορίζει

ένα διάνυσµα γραµµής. Αριθµοί διαχωρισµένοι µε ερωτηµατικά (semicolons) ή πατώντας το ENTER

µετά από κάθε αριθµό ορίζει το διάνυσµα στήλης.

Μπορούµε επίσης να δηµιουργήσουµε ένα νέο διάνυσµα από ένα υπάρχον µε να το

συµπεριλάβουµε στον ορισµό του. Για παράδειγµα:

a = [1 2 3]

a =

1 2 3

d = [a 6]

d =

1 2 3 6

4.2 Ο συµβολισµός της άνω-κάτω τελείας (The colon notation)

Ένας χρήσιµος σύντοµος τρόπος για να δηµιουργήσουµε ένα διάνυσµα από αριθµούς µέτρησης

είναι να χρησιµοποιήσουµε τις άνω-κάτω τελείες “:”, όπως στο παράδειγµα:

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

Page 17: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 17 από 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).

Page 18: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 18 από 99

Πίνακας 2: Συναρτήσεις δηµιουργίας διανυσµάτων

logspace(x1, x2,N)

∆ηµιουργεί ένα διάνυσµα από Ν στοιχεία, λογαριθµικά καταµερισµένα µεταξύ 10x1 και 10x2.

(Creates a vector of N elements, logarithmically spaced between 10x1 and 10x2).

Οι πρώτες δύο συναρτήσεις του πίνακα, 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

Page 19: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 19 από 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 ορίζει τους τελεστές .* και ./. Για παράδειγµα:

1 1 1 1

2 2 2 2

3 3 3 3

*

a b a b

a b a b

a b a b

⋅ =

Επισηµαίνεται η “.” µπροστά από κάθε σύµβολο, σηµαίνει ότι είναι µια στοιχείο-προς-

στοιχείο πράξη. Για παράδειγµα, µπορούµε να πολλαπλασιάσουµε κάθε στοιχείο του

διανύσµατος a, που ορίστηκε προηγουµένως, µε διαφορετικό αριθµό:

b = [1 2 3 4 5]

a.*b

ans =

1 6 15 -4 0

5 Υπενθυµίζεται ότι τα µόνα διανυσµατικά γινόµενα που ορίζονται µαθηµατικά είναι το dot γινόµενο και το cross γινόµενο. Και τα δύο αντιπροσωπεύουν ιδιαίτερες πράξεις σε δύο διανύσµατα, καµία από τις οποίες απλά πολλαπλασιάζει τα στοιχεία µαζί και επιστρέφει ένα άλλο διάνυσµα.

Page 20: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 20 από 99

Ο στοιχείο-προς-στοιχείο τελεστής ύψωσης σε δύναµη (.^) είναι ιδιαίτερα χρήσιµος.

Μπορεί να χρησιµοποιηθεί να υψώσουµε ένα διάνυσµα αριθµών σε κάποια δύναµη, ή να

υψώσουµε έναν αριθµό σε διάφορες δυνάµεις, ανάλογα µε το πως τον χρησιµοποιούµε:

b .^ 2

ans =

1 4 9 16 25

2 .^ b

ans =

2 4 8 16 32

Το πρώτο παράδειγµα τετραγωνίζει κάθε στοιχείο του 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 0.8660 0.8660 0.0000 -0.8660 -0.8660 -0.0000

5. Σχεδιαγραφώντας γραφήµατα (Plotting graphs)

Το OCTAVE έχει ισχυρές διευκολύνσεις για σχεδιαγράµµατα γραφηµάτων µέσω ενός δευτέρου

ανοιχτού-κώδικα προγράµµατος GNUPLOT6, αλλά µερικές από τις επιλογές είναι περιορισµένες σε

σύγκριση µε εκείνες του MATLAB. Η βασική εντολή είναι plot(x, y), όπου x και y είναι οι

6 www.gnuplot.org.

Page 21: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 21 από 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 Τα δύο διανύσµατα πρέπει, φυσικά, να είναι του ιδίου µήκους.

Page 22: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 22 από 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 (αστερίσκος)

b blue (µπλε) s square† (τετράγωνο)

-- dashed†

(διακεκοµµένη

y yellow† (κίτρινο) d diamond† (ρόµβος)

k black† (µαύρο) v triangle (down)† [τρίγωνο (κάτω)]

^ triangle (up)† [τρίγωνο (απάνω)]

< triangle (left)† [τρίγωνο (αριστερά)]

> triangle (right)† [τρίγωνο (δεξιά)]

p pentagram (πεντάγραµµο)

h hexagram (εξάγραµµο)

† Μόνο διαθέσιµο στο MATLAB

Page 23: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 23 από 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), ’-’)

Page 24: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 24 από 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

Page 25: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 25 από 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 εντολή.

Page 26: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 26 από 99

Το OCTAVE σε συνδυασµό µε το GNUPLOT, επιτρέπει άµεση αλληλεπίδραση µε το παράθυρο

γραφικών, όπως για να εστιάσουµε κάπου σέρνουµε µε το δεξί κουµπί του ποντικιού ένα κουτί

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

από άλλες ενέργειες και δυνατότητες µε τα πλήκτρα (όταν το παράθυρο γραφικών είναι

επιλεγµένο) δεικνύονται στον επόµενο Πίνακα 49.

Πίνακας 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 πρόσβαση στις γραφικές εντολές είναι µέσω εικόνων και µενού γύρο από το παράθυρο γραφικών.

Page 27: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 27 από 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 να εκκινήσει τον κειµενογράφο της επιλογής

µας.

Page 28: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 28 από 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, και το διορθώσατε, καλώς!

Page 29: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 29 από 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)

Μέχρι τώρα τα προγράµµατα και οι εκφράσεις που έχουµε δει περιείχαν απλές ακολουθιακές

εντολές. Η χρήση των διανυσµάτων (και αργότερα των πινάκων) για την επίλυση προβληµάτων

Page 30: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 30 από 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 πριν αξιολογήσει τη συνθήκη.

Page 31: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 31 από 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

Page 32: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 32 από 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

Page 33: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 33 από 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

Page 34: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 34 από 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 = 3

ans = 4

ans = 5

ans = 6

12 Αυτό δεν σηµαίνει ότι τα for loops είναι αργά, απλά το OCTAVE είναι υψηλά βελτιστοποιηµένο για υπολογισµούς µε πίνακες/διανύσµατα. Επίσης αρκετοί σηµερινοί ηλεκτρονικοί υπολογιστές συµπεριλαµβάνουν εντολές για ταχύτερους υπολογισµούς πινάκων, διότι οι πίνακες είναι βασικοί για τα τρισδιάστατα γραφικά στα παιχνίδια των ηλεκτρονικών υπολογιστών. Για παράδειγµα, οι εντολές ‘MMX’ προστέθηκαν στον επεξεργαστή Intel Pentium το 1995, και σε µετέπειτα επεξεργαστές, είναι ‘Matrix Maths eXtentions’.

Page 35: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 35 από 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]

Άσκηση 4: Να υπολογιστεί το άθροισµα

5

1

( 1)i

i

i=

+∑ .

Λύση:

sum=0;

for i=1:5

sum = sum + (i +1)^i;

end

sum

sum =8476

Άσκηση 5: Να υπολογιστεί το γινόµενο

6

3

1, 3

( )ii i

x x= ≠

−∏ για τις τιµές του ix , 1,...,6i = που

προκύπτουν εάν διαµερίσουµε το διάστηµα [0, 1] σε 5 ισοµήκη διαστήµατα

( 0.2( 1), 1,...,6ix i i= − = ).

Λύση:

Page 36: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 36 από 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

Άσκηση 6: Να υπολογιστεί ο µέσος όρος 1

1 n

i

i

x xn =

= ∑ για µια λίστα τιµών.

Λύση:

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

Page 37: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 37 από 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

Page 38: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 38 από 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 2 3 5 8 13 21 34 55

7.6 Οι εκφράσεις 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.

Page 39: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 39 από 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 να είναι

Page 40: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 40 από 99

µηδέν για το OCTAVE, και αυτό µπορεί να ειδωθεί καθώς ο αριθµός για το x είναι γύρω στο 10-16.

Αυτό δεν σηµαίνει ότι το OCTAVE δεν µπορεί να εργαστεί µε αριθµούς µικρότερους από αυτόν (ο

µικρότερος αριθµός που το OCTAVE µπορεί να αντιπροσωπεύσει είναι γύρω στο 2.2251x10-308)13.

Το πρόβληµα είναι ότι οι δύο αριθµοί στην πράξη του παραδείγµατος είναι διαφορετικών µεγεθών

και το 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 έχει σηµασία αλλά αφότου αυτή η τιµή µειώνεται στο ήµισυ, δεν έχει πια σηµασία.

Page 41: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 41 από 99

ισχυρά από τα scripts είναι οι συναρτήσεις που ορίζονται από τον χρήστη. Αυτές µας επιτρέπουν να

ορίσουµε τις δικές µας εντολές στο OCTAVE που µετά µπορούµε να τις χρησιµοποιήσουµε από τη

γραµµή εντολών ή σε άλλες συναρτήσεις ή scripts.

Οι µεταβλητές στις συναρτήσεις OCTAVE πάντοτε περνάνε µε τιµή, ουδέποτε µε αναφορά.

Ωστόσο, οι συναρτήσεις OCTAVE µπορούν να επιστρέψουν περισσότερες από µία τιµή14. Βασικά, οι

συναρτήσεις στο 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 πολλές τιµές µπορούν να επιστραφούν, έτσι το πέρασµα µε αναφορά δεν είναι απαραίτητο.

Page 42: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 42 από 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 =

Page 43: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 43 από 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)

Εδώ δίνεται µια περισσότερο επιτηδευµένη συνάρτηση η οποία δηµιουργεί ένα µοναδιαίο βήµα,

που ορίζεται σαν:

00,

1, otherwise

if t ty

<=

Αυτή η συνάρτηση θα πάρει δύο παραµέτρους: το χρόνο για τον οποίο τιµές πρέπει να

δηµιουργηθούν, και 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

Page 44: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 44 από 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 δύο

φορές, όπως παρακάτω:

Page 45: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 45 από 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:

t v

µπορούµε να επιβεβαιώσουµε ότι οι µεταβλητές m και n ορισµένες στην συνάρτηση ustep

διατηρήθηκαν µόνο όσο διήρκησε και η συνάρτηση, και δεν είναι µέρος του κυρίως χώρου

εργασίας (workspace). Οποιαδήποτε άλλη µεταβλητή στη λίστα, e.g. η y µεταβλητή θα έχει ακόµη

την τιµή από προηγούµενους ορισµούς, e.g. y από το rectsin script, αντί των τιµών που

ορίστηκαν για την µεταβλητή y στην συνάρτηση ustep. Οι µεταβλητές που ορίζονται και

χρησιµοποιούνται εσωτερικά στις συναρτήσεις είναι εντελώς ξεχωριστές από τον κυρίως χώρο.

Page 46: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 46 από 99

9. Πίνακες και διανύσµατα (Matrices and vectors)

Τα διανύσµατα είναι ειδικές περιπτώσεις από πίνακες. Ένας πίνακας είναι µια ορθογώνια διάταξη

αριθµών, το µέγεθος του οποίου συνήθως περιγράφεται σαν mxn, που σηµαίνει ότι έχει m γραµµές

και n στήλες. Για παράδειγµα, εδώ είναι ένας πίνακας 2x3:

5 7 9

1 3 2A

= − −

Για να εισάγουµε αυτόν τον πίνακα στο 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];

Page 47: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 47 από 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), που δεν συµφωνεί µε τον προηγούµενο ορισµό. Οι αριθµοί στα µεσαία ζεύγη δεν είναι ίδιοι, που εξηγεί το λεκτικό του µηνύµατος του σφάλµατος.

Page 48: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 48 από 99

x =

1 0 3

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.

Page 49: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 49 από 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 0 0

0 7 0

0 0 2

D

− =

Θα µπορούσαµε να κατασκευάσουµε αυτόν τον πίνακα αποκλειστικά, αλλά το OCTAVE παρέχει την

συνάρτηση diag η οποία παίρνει ένα διάνυσµα και το θέτει κατά µήκος της διαγωνίου ενός πίνακα:

diag([-1 7 2])

ans =

-1 0 0

0 7 0

0 0 2

Page 50: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 50 από 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 2 0

0 1 0 0 -1

0 0 1 1 0

5 7 9 0 0

-1 3 -2 0 0

Απλά πρέπει να είµαστε προσεκτικοί ότι κάθε υπο-πίνακας είναι σωστού µεγέθους και µορφής, έτσι

ώστε ο τελικός σύνθετος πίνακας να είναι ορθογώνιος. Φυσικά, το OCTAVE θα µας πει εάν κάποιος

από αυτούς έχει τον λάθος αριθµό από γραµµές ή στήλες.

Page 51: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 51 από 99

9.5 Πίνακες σαν διατάξεις στοιχείων (Matrices as tables)

Οι πίνακες µπορούν επίσης να χρησιµοποιηθούν για την απλή διάταξη δεδοµένων, και µπορούν να

παρέχουν έναν περισσότερο φυσικό τρόπο για την αποθήκευση δεδοµένων:

t=0:0.2:1;

freq=[sin(t)’ sin(2*t)’, sin(3*t)’]

freq =

0 0 0

0.1987 0.3894 0.5646

0.3894 0.7174 0.9320

0.5646 0.9320 0.9738

0.7174 0.9996 0.6755

0.8415 0.9093 0.1411

Εδώ η nth στήλη του πίνακα περιέχει τα δεδοµένα δειγµατοληψίας του sin(t). Η εναλλακτική θα

µπορούσε να είναι η αποθήκευση κάθε σειράς σε δικό της διάνυσµα, καθένα µε διαφορετικό όνοµα.

Τότε θα έπρεπε να γνωρίζουµε ποιο είναι το όνοµα κάθε διανύσµατος εάν θα θέλαµε να

χρησιµοποιήσουµε τα δεδοµένα. Η αποθήκευση σε πίνακα διευκολύνει την προσπέλαση των

δεδοµένων.

9.6 Εξαγωγή τµηµάτων από πίνακες (Extracting bits of matrices)

Οι αριθµοί µπορούν να εξαχθούν από έναν πίνακα µε την ίδια σύνταξη όπως για τα διανύσµατα,

χρησιµοποιώντας τις παρενθέσεις (). Για έναν πίνακα, προσδιορίζουµε την συντεταγµένη της

γραµµής πρώτα και µετά την συντεταγµένη της στήλης (σηµειώνεται ότι σε Καρτεσιανούς όρους,

αυτό είναι y και µετά x). Ιδού µερικά παραδείγµατα:

J = [1 2 3 4

5 6 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

Page 52: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 52 από 99

ans =

4

8

J(3,:) %Row 3, all columns

ans =

11 13 18 10

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

Αυτός ο τύπος εκφράσεων µπορεί επίσης να χρησιµοποιηθεί στην αριστερή πλευρά κάποιας

έκφρασης για να γράψουµε στοιχεία σε κάποιον πίνακα:

J(3, 2:3) = [-1 0]

J =

1 2 3 4

5 6 7 8

11 -1 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

Page 53: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 53 από 99

inv Inverse of a matrix

det Determinant of a matrix

trace Trace of a matrix

eig 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

Page 54: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 54 από 99

ans =

1.0000 0.0000 -0.0000

0 1.0000 0

0 0.0000 1.0000

Ξανά, σηµειώνονται µερικά από τα αριθµητικά σφάλµατα τα οποία παραµένουν, που εµποδίζουν το

OCTAVE από το να αναγνωρίζει µερικά στοιχεία ως ακριβώς ένα ή µηδέν.

Η ορίζουσα (determinant) ενός πίνακα είναι µια πολύ χρήσιµη ποσότητα. Ειδικότερα, µια µηδενική

ορίζουσα συνεπάγεται ότι ο πίνακας δεν έχει αντίστροφο. Η συνάρτηση det υπολογίζει την

ορίζουσα:

det(A)

ans =

-14

11. Λύνοντας την εξίσωση Ax = b (Solving Ax = b)

Μία από τις πιο σπουδαίες χρήσεις των πινάκων είναι η αντιπροσώπευση και επίλυση ταυτόχρονων

εξισώσεων. Ένα σύστηµα γραµµικών εξισώσεων είναι:

11 1 12 2 1 1

21 1 22 2 2 2

1 1 2 2

n n

n n

m m mn n m

a x a x a x b

a x a x a x b

a x a x a x b

+ + + =

+ + + =

=

+ + + =

L

L

M M

L

όπου τα ija και ib είναι γνωστά, και ψάχνουµε για ένα σύνολο τιµών για ix που

ταυτόχρονα ικανοποιούν όλες τις εξισώσεις.

Αυτό το σύστηµα µπορεί να γραφεί σε µορφή πινάκων-διανυσµάτων ως εξής:

11 12 1 1 1

21 22 2 2 2

1 2

n

n

m m mn n m

a a a x b

a a a x b

a a a x b

=

L

L

M M O M M M

L

ή

Ax b=

Σε αυτή την αντιπροσώπευση, Α είναι ο πίνακας των συντελεστών, b είναι οι σταθερές, και x είναι

το διάνυσµα παραµέτρων που αναζητούµε να βρούµε.

Επειδή το OCTAVE είναι σχεδιασµένο να επεξεργάζεται πίνακες και διανύσµατα, είναι ιδιαίτερα

κατάλληλο να χρησιµοποιηθεί για την επίλυση αυτών των ειδών προβληµάτων.

Page 55: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 55 από 99

11.1 Λύση όταν Α έχει αντίστροφο (Solution when A is invertible)

Το πιο απλό σύνολο γραµµικών εξισώσεων για επίλυση είναι όταν έχουµε n εξισώσεις και n

αγνώστους. Σε αυτή την περίπτωση ο πίνακας Α θα είναι τετραγωνικός και µπορεί συχνά να

αντιστραφεί. Θεωρείστε το παράδειγµα:

3

2 3 5

x y

x y

+ =

− =

Επιλύνοντας αυτό στο 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 µπορεί να βρει τον αντίστροφο µεγάλων πινάκων πολύ

γρηγορότερα από ό,τι εµείς µε το χέρι. Από το µάθηµα γραµµικής άλγεβρας γνωρίζουµε τη µέθοδο

Page 56: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 56 από 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.

16

Η συνάρτηση rref θα κάνει την Γκαουσιανή εξάλειψη εάν της δώσουμε έναν προσαυξημένο πίνακα [A b], ή η

συνάρτηση lu στο OCTAVE θα κάνει την LU παραγοντοποίηση ενός πίνακα (βλ. help σύστημα).

Πίνακας 7: Περίληψη των τελεστών του OCTAVE ‘\’ και ‘/’. Χρησιµοποιούν

Γκαουσιανή απαλοιφή εάν ο πίνακας έχει αντίστροφο, διαφορετικά βρίσκει τη

λύση ελάχιστων τετραγώνων

(Summary of Octave’s slash operators. These use Gaussian elimination if the

Page 57: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 57 από 99

11.4 Ιδιόµορφοι πίνακες και τάξη (Singular matrices and rank)

Ο τελεστής καθέτου γραµµής (slash operator) προσπαθεί να κάνει ότι είναι το καλύτερο σε

οποιοδήποτε πίνακα και διάνυσµα του δοθεί, ακόµη και αν λύση δεν είναι πιθανή, ή είναι

ακαθόριστη (undetermined). Θεωρείστε το παράδειγµα: 2

2 3 5

3 4 6

u v w

u w

u v w

+ + =

+ =

+ + =

Αυτή είναι ξανά µια εξίσωση της µορφής Ax=b. Εάν δοκιµάσουµε να τη λύσουµε στο OCTAVE

χρησιµοποιώντας τον τελεστή της καθέτου (slash operator), παίρνουµε:

A=[1 1 1

2 0 3

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 µας προειδοποίησε. Αυτό σηµαίνει ότι έχει µηδενική ορίζουσα και έτσι

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))

Page 58: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 58 από 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) δίνει µόνο µια από τις πιθανές τιµές. Αυτό πάλι είναι κάτι που πρέπει να προσέξουµε.

Page 59: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 59 από 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 σηµαντικά ψηφία από αυτή την ακρίβεια.

Page 60: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 60 από 99

µε όρους της εξίσωσης του µοντέλου, δίνοντας ένα σύνολο από ταυτόχρονες εξισώσεις που είναι

υπερπροσδιορισµένες, δηλ. ο αριθµός των ανεξάρτητων εξισώσεων, m, είναι µεγαλύτερος από τον

αριθµό των µεταβλητών, n.

Σ’ αυτή την περίπτωση δεν είναι δυνατόν να βρεθεί µια ακριβής λύση, αλλά η επιθυµητή λύση είναι

το ‘καλύτερο ταίριασµα’. Αυτό συνήθως ορίζεται σαν τις παραµέτρους του µοντέλο που

ελαχιστοποιούν το τετράγωνο του σφάλµατος για κάθε δεδοµένο σηµείο.

Για ένα σύνολο εξισώσεως που µπορεί να γραφτεί ως Ax=b, η λύση ελάχιστων τετραγώνων δίνεται

µε την ψευδοαντίστροφο:

x = (ATA)-1ATb

Στο OCTAVE µπορούµε να χρησιµοποιήσουµε τον \ τελεστή. Για πίνακες µε αντίστροφο ορίζεται

για την επίλυση της εξίσωσης χρησιµοποιώντας την Γκαουσιανή απαλοιφή, αλλά για τα

υπερπροσδιορισµένα συστήµατα βρίσκει τη λύση των ελάχιστων τετραγώνων. Η

ψευδοαντίστροφος µπορεί επίσης να υπολογιστεί στο OCTAVE χρησιµοποιώντας την συνάρτηση

pinv, όπως επιδεικνύεται στο ακόλουθο παράδειγµα.

11.7 Παράδειγµα: Τριγωνοποίηση (Example: Triangulation)

Ένας ραδιοποµπός χεριού ανιχνεύεται από τρεις διαφορετικούς σταθµούς βάσης, ο καθένας από

τους οποίους παρέχει µια µέτρηση της κατεύθυνσης προς τον ποµπό. Το διάνυσµα από κάθε

σταθµό βάσης σχεδιαγράφεται σε έναν χάρτη και πρέπει όλα να τέµνονται στη θέση του ποµπού.

Οι τρεις γραµµές στο χάρτη µπορεί να περιγραφτούν µε τις εξισώσεις:

2 2

5

6 5

x y

x y

x y

− =

+ =

− = −

Η λύση ελάχιστων τετραγώνων στο σηµείο που τέµνονται µπορεί να υπολογιστεί στο OCTAVE µε

πολλούς διαφορετικούς τρόπους εφόσον ορίσουµε τις εξισώσεις µε πίνακες:

A = [2 -1; 1 1; 6 -1];

b = [2 5 -5]’;

x = inv(A’*A)*A’*b

x =

-0.094595

Page 61: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 61 από 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;

Page 62: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 62 από 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);

Page 63: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 63 από 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) συντεταγµένες από σηµεία στην γραµµή µπορούν όλα να γραφούν σαν συναρτήσεις αυτής της απόστασης κατά µήκος της γραµµής: ‘εάν είµαι τόσο µακριά κατά µήκος της γραµµής, πρέπει να είµαι σε αυτό το σηµείο’.

Page 64: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 64 από 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 Rotate View

<Ctrl> + LMB + motion Rotate axes (View update when button released)

MMB + motion 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.

Page 65: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 65 από 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 εντολές σχεδιαγράφησης.

22.5

33.5

4

11.5

22.5

3-1

-0.5

0

0.5

1

Surf

Σχήµα 11: Παραδείγµατα της ίδιας επιφάνειας µορφής-σαµάρι (saddle-shaped) απεικονιζόµενης χρησιµοποιώντας διαφορετικές OCTAVE εντολές.

(∆οκιµάστε τη σχεδιαγράφηση των άλλων 3 γραφηµάτων στο ίδιο σχήµα χρησιµοποιώντας την εντολή subplot(2, 2, i)).

Page 66: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 66 από 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

3 5 1

-2 1 4];

eig(A)

ans = -1.5120 4.9045

6.6076

21 ∆οκιµάστε colormap(jet) για ένα παράδειγµα µιας εναλλακτικής διερµηνείας των αριθµών (αυτό είναι το προεπιλεγµένο colormap). Το colormap επίσης χρησιµοποιείται να προσδιορίσει τα χρώµατα για το ύψος στις 3D εντολές σχεδιαγράφησης.

Page 67: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 67 από 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 και τον παραγοντοποιεί σε 1 2

TA Q Q= Σ , όπου:

Q1 είναι ένας m×m ορθογώνιος πίνακας µε στήλες τα ιδιοδιανύσµατα του AAT

Q2 είναι ένας n×n ορθογώνιος πίνακας µε στήλες τα ιδιοδιανύσµατα του ATA

Σ είναι ένας m×n διαγώνιος πίνακας µε στοιχεία τις τετραγωνικές ρίζες των ιδιοτιµών του AAT και

ATA (και οι δύο έχουν τις ίδιες ιδιοτιµές, αλλά διαφορετικά ιδιοδιανύσµατα)

Page 68: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 68 από 99

Αυτό το αποτέλεσµα καλύτερα φαίνεται γραφικά:

2

1

( )

( )( ) ( )

TQ nxn

Q mxmA mxn mxn

m m m n

n m n

n

Σ ⋅ ⋅ ⋅ ⋅ ⋅ = ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

644474448

644474448 64748644474448

Το πιο σπουδαίο µέρος αυτής της αποσύνθεσης είναι η θεώρηση του πίνακα Σ, ο διαγώνιος

πίνακας, του οποίου τα στοιχεία ονοµάζονται ιδιόµορφες τιµές, σi:

1

2

0

0

0 0

r

σσ

σ

Σ =

O

O

Επειδή είναι µέρος του διαγωνίου πίνακα, αυτές πολλαπλασιάζουν µόνο ειδικές στήλες του Q1 ή του

Q222. Το µέγεθος της ιδιόµορφης τιµής µας λέει ακριβώς πόσο επηρεασµό οι αντίστοιχες γραµµές

και στήλες του Q1 και Q2T έχουν στον διαγώνιο πίνακα.

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

προστίθενται στον πίνακα A όταν ανακατασκευαστεί. Είναι συχνά κοινό για έναν πίνακα να έχει

µερικές µηδενικές ιδιοτιµές, όπως φαίνεται παραπάνω. Αυτά τα µηδενικά στοιχεία στη διαγώνιο

αντιστοιχούν στις γραµµές ή στήλες που δεν δίνουν επιπρόσθετες πληροφορίες. Αυτό σηµαίνει,

φυσικά, ότι όχι όλος ο πίνακας είναι χρήσιµος — δηλαδή είναι ελλιπής στην τάξη (rank deficient).

Ή, σε όρους ταυτόχρονες εξισώσεις, ότι όχι όλες οι εξισώσεις είναι ανεξάρτητες.

Η τεχνική SVD είναι πολύ χρήσιµο εργαλείο για την ανάλυση ενός πίνακα, και οι λύσεις σε πολλά

προβλήµατα µπορεί απλά να διαβαστούν από την αποσύνθεση των πινάκων. Για παράδειγµα, ο

µηδενικός χώρος ενός πίνακα (η λύση Ax = 0) είναι απλά οι στήλες του Q2 που αντιστοιχούν στις

µηδενικές ιδιόµορφες τιµές. Η SVD είναι επίσης αριθµητικά υψηλά ευσταθής — πίνακες που είναι

λίγο κακής κατάστασης (ill-conditioned) έχουν περισσότερες δυνατότητες να δουλεύουν µε SVD

από οτιδήποτε άλλο.

22 Οι ιδιόµορφες τιµές Σ φυσικά πολλαπλασιάζουν τις γραµµές του Q2

T, και έτσι τις στήλες του µη-αντιστραµένης έκδοσης, Q2.

Page 69: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 69 από 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

3 5 1 5

-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

Page 70: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 70 από 99

0.00000 0.00000 1.68010

V =

-0.297983 0.442764 -0.828029 -0.661559 0.047326 0.109729 -0.079700 -0.885056 -0.455551 -0.683516 -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. Τότε αυτό που µένει είναι πίνακες της ακόλουθης µορφής:

Page 71: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 71 από 99

2

1( )( ) ( )

( )TQ nxnA mxn nxn

Q mxm

m m n n

n m n n

Σ

= ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

64748 64748 6474864748MM M M

Το 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

Page 72: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 72 από 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) r z=

conj Complex conjugate z a bi= −

angle Phase angle (argument) 1tan ( / )b aθ −=

Άλλες συναρτήσεις που µαθηµατικά ορίζονται για µιγαδικούς αριθµούς, όπως sin(x) ή ex, επίσης

λειτουργούν µε µιγαδικούς αριθµούς:

sin (z2)

Page 73: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 73 από 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.

Page 74: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 74 από 99

14.2 Βρίσκοντας ρίζες πολυωνύµων (Finding roots of polynomials)

Για την εύρεση ριζών πολυωνυµικών εξισώσεων, το OCTAVE παρέχει την συνάρτηση roots. Η

εξίσωση εισάγεται στο OCTAVE, χρησιµοποιώντας ένα διάνυσµα για τους συντελεστές. Για

παράδειγµα, η πολυωνυµική εξίσωση:

5 4 32 5 3 0x x x x+ − + + =

θα αντιπροσωπευτεί ως:

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]

γράφουµε:

Page 75: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 75 από 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)

Page 76: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 76 από 99

ans =

-2.2361 2.2361

Σηµειώνεται ότι το πραγµατικό αποτέλεσµα είναι +/- sqrt(5) που είναι περίπου +/- 2.2361. Βλέπετε

επίσης τη συνάρτηση compan.

15.2 Η συνάρτηση compan (c)

Η συνάρτηση compan (c) υπολογίζει τον συµπληρωµατικό (companion) πίνακα που αντιστοιχεί

στο πολυώνυµο µε συντελεστές το διάνυσµα c. Ο συµπληρωµατικός (companion) πίνακας είναι:

2 1 3 1 1 1 1/ / / /

1 0 0 0

0 1 0 0

0 0 1 0

N Nc c c c c c c c

A

+− − − − =

L

L

L

M M O M M

L

Οι ιδιοτιµές του συµπληρωµατικού πίνακα είναι ίσον µε τις ρίζες του πολυωνύµου.

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 0 (Η διαίρεση είναι φυσικά ακριβής.)

Page 77: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 77 από 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 =

1 2 3 0 2 4 0 0 5

p=poly(A)

p =

1 -8 17 -10

Μπορούµε να βρούµε τις ρίζες του χαρακτηριστικού πολυωνύµου (δηλ. τις ιδιοτιµές του Α) µε την:

roots(p)

ans =

5.0000 2.0000 1.0000

ή πιο απλά µε την εντολή eig:

eig(A)

ans =

1 2 5

Page 78: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 78 από 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.

Page 79: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 79 από 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 - Εφαρµογές στα Συστήµατα Αυτοµάτου Ελέγχου

Η θεωρία αυτοµάτου ελέγχου είναι ένας διεπιστηµονικός κλάδος της µηχανικής και των

εφαρµοσµένων µαθηµατικών µε αντικείµενο την ανάλυση, σχεδιασµό και υλοποίηση ελεγκτών που

αυτόµατα (χωρίς την ανθρώπινη επέµβαση) χειρίζονται τις εισόδους ενός δυναµικού συστήµατος

για να επιτευχθεί το επιθυµητό αποτέλεσµα στην έξοδο.

Έστω το δυναµικό σύστηµα που αποτελείται από ένα ελατήριο και µια µάζα κρεµασµένη στο ένα

άκρο του όπως στο παρακάτω σχήµα.

Page 80: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 80 από 99

Η διαφορική εξίσωση που περιγράφει τις δυναµικές του

συστήµατος είναι: 2

2( ) ( ) ( ) ( )

d dM y t b y t ky t u t

dt dt+ + =

όπου:

k.........είναι ο συντελεστής σκληρότητας του ελατηρίου

M .......η µάζα του ελατηρίου

y(t) .... είναι η απόσταση του κέντρου βάρους της µάζας από

το σηµείο ισορροπίας, και

u(t) ...είναι η κάθετη δύναµη την οποία εφαρµόζουµε στη

µάζα

b ........µια σταθερά που εξαρτάται από την αντίσταση του

αέρα.

Εάν οι παράµετροι M=10, κ=5 και b=2, τότε γνωρίζουµε ότι η χαρακτηριστική εξίσωση της

οµογενούς εξίσωσης του συστήµατος είναι 210 2 5 0p p+ + = .

Χρησιµοποιώντας το OCTAVE βρίσκουµε τις ρίζες του χαρακτηριστικού πολυωνύµου του

συστήµατος:

p = [10 2 5]; roots (p)

ans =

-0.10000 + 0.70000i -0.10000 - 0.70000i

Επειδή οι ρίζες είναι µιγαδικές αυτό σηµαίνει ότι η ελεύθερη απόκριση του συστήµατος θα

παρουσιάζει ταλαντώσεις.

Επίσης γνωρίζουµε ότι εάν ορίσουµε για τη θέση και την ταχύτητα τις καταστάσεις 1( ) ( )x t y t= και

µε 1 2( ) ( ) ( )x t y t x t= =& & αντίστοιχα, τότε στο χώρο καταστάσεων το σύστηµα που περιγράφεται µε

την παραπάνω δευτέρας τάξης διαφορική εξίσωση µπορεί να αντικατασταθεί µε το παρακάτω

σύστηµα δύο διαφορικών εξισώσεων πρώτης τάξης:

1 1

2 2

0 1 0( ) ( )

( ) ( ) ( ) ( )1( ) ( )

x t x tx t u t Ax t bu tk b

x t x tM M M

= = + = + − −

&&

&

[ ] 1

2

( )( ) 1 0

( )

x ty t

x t

=

Page 81: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 81 από 99

Θέτοντας τις τιµές των παραµέτρων M=10, κ=5 και b=2 το παραπάνω σύστηµα γίνεται:

1 1

2 2

( ) ( )0 1 0( )

( ) ( )0.5 0.2 0.1

x t x tu t

x t x t

= + − −

&

&

[ ] 1

2

( )( ) 1 0 ( ) 0 ( )

( )

x ty t Cx t u t

x 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.

Αφού πρώτα έχουµε ορίσει το διάνυσµα του χρόνου, το διάνυσµα της εισόδου και τις αρχικές του συνθήκες (0) 1y = και (0) / (0) 2dy dt y= =& , µπορούµε εύκολα να επιβεβαιώσουµε ότι η ελεύθερη

απόκριση του συστήµατος παρουσιάζει ταλαντώσεις και να βρούµε την µέγιστη τιµή της κάνοντας

προσοµοίωση στο 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 που παρουσιάζει το ελατήριο από τη θέση ισορροπίας.

Page 82: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 82 από 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) απόκριση του συστήµατος.

Page 83: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 83 από 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= +&

ελαχιστοποιεί το τετραγωνικό κόστος:

Page 84: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 84 από 99

( ) ( ) ( ) ( )

o

T T

t

J x t Qx t u t Ru t dt

∞ = + ∫

όπου οι πίνακες βαρύτητας των καταστάσεων 0Q ≥ και του ελέγχου 0R > .

Το OCTAVE έχει ενσωµατωµένη τη συνάρτηση lqr η οποία επιστρέφει το κέρδος Κ του ανατροφοδοτικού ελεγκτή ( ) ( )u t Kx t= − έτσι ώστε το σύστηµα κλειστού βρόχου

[ ]( ) ( ) ( )clx t A BK x t A x t= − =& να είναι ευσταθές (ιδιοτιµές του πίνακα clA µικρότερες του µηδενός).

Επίσης η συνάρτηση lqr, σύµφωνα µε τη θεωρία, δίνει τη λύση της αλγεβρικής Riccati εξίσωσης

και τις ιδιοτιµές του κλειστού βρόχου συστήµατος clA . Η σύνταξη της συνάρτησης lqr είναι:

[k, p, e] = lqr (a, b, q, r)

Έτσι επιλέγοντας τους πίνακες βαρύτητας των καταστάσεων 15 0

00 25

Q

= ≥

και του ελέγχου

0.25 0R = > ο παρακάτω 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');

Page 85: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 85 από 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 1

Page 86: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 86 από 99

Η έξοδος y(k) ενός ψηφιακού φίλτρου είναι η συνέλιξη του σήµατος εισόδου του x(k) µε την

κρουστική του απόκριση (impulse response) h(k). Μαθηµατικά, η αντιπροσώπευση αυτής της

σχέσης έχει ως εξής:

( ) ( )* ( ) ( ) ( )n

y k h k x k h k n x n∞

=−∞

= = −∑

Εάν η κρουστική απόκριση h(k) ενός φίλτρου είναι πεπερασµένου µήκους και η είσοδός του x(k)

είναι επίσης πεπερασµένου µήκους, τότε µπορούµε να υλοποιήσουµε το φίλτρο χρησιµοποιώντας

τη συνάρτηση conv. Αποθηκεύουµε τις τιµές x(k) σε ένα διάνυσµα x, τις τιµές h(k) σε ένα

διάνυσµα h, και εκτελούµε τη συνέλιξή τους ως εξής:

x = randn(5,1); % Τυχαίο διάνυσµα µήκους 5 (µε διαστάσεις 5x1)

h = ¼*[1 1 1 1]; % Φίλτρο µέσου όρου µήκους 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) ως εξής:

1

1

(1) (2) ... ( 1)( ) ( ) ( ) ( )

(1) (2) ... ( 1)

n

m

b b z b n zY z H z X z X z

a a z a m z

− −

− −

+ + + += =

+ + + +

όπου H(z) είναι η συνάρτηση µεταφοράς του φίλτρου. Οι σταθερές b(i) και a(i) είναι οι

συντελεστές του φίλτρου και η τάξη του φίλτρου είναι το µέγιστο των n και m.

Το OCTAVE αποθηκεύει τους συντελεστές σε δύο διανύσµατα σε µορφή γραµµής, ένα για τον

αριθµητή (b) και ένα για τον παρονοµαστή (a).

Page 87: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 87 από 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) ως εξής:

2 1 1 2 1( ) ( 1) ... ( ) ( ) ( 1) ... ( )m ny k a y k a y k m b x k b x k b x k n+ ++ − + + − = + − + + −

Με τους τρέχοντες και παρελθοντικούς όρους της εισόδου και τις παρελθοντικές τιµές της εξόδου

y(k) έχουµε:

1 2 1 2 1( ) ( ) ( 1) ... ( ) ( 1) ... ( )n my k b x k b x k b x k n a y k a y k m+ += + − + + − − − + + −

Αυτή η αντιπροσώπευση είναι τυπική (standard) στο πεδίο του χρόνου για ένα ψηφιακό φίλτρο,

και υπολογίζεται αρχίζοντας µε y(1) και υποθέτοντας µηδενικές αρχικές συνθήκες. Η πρόοδος

αυτής της αντιπροσώπευσης είναι:

1

1 2 2

1 2 3 2 3

(1) (1)

(2) (2) (1) (1)

(3) (3) (2) (1) (2) (1)

y b x

y b x b x a y

y b x b x b x a y a y

=

= + −

= + + − −

=M M

Ένα φίλτρο σε αυτή τη µορφή είναι εύκολο να υλοποιηθεί µε τη συνάρτηση filter του OCTAVE.

Για παράδειγµα, ένα απλό χαµηλοπερατό (lowpass) φίλτρο ενός πόλου είναι:

Page 88: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 88 από 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, 1( )

0, 1

nx n

n

==

Στο 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 (σε ισοµερή συχνότητες γύρω από

τον µοναδιαίο κύκλο), οι δύο συναρτήσεις υλοποιούν τις σχέσεις:

Page 89: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 89 από 99

1

0

( 1) ( 1)N

kn

N

n

X k x n W−

=

+ = +∑

1

0

1( 1) ( 1)

Nkn

N

k

x n X k WN

−−

=

+ = +∑

όπου 2( )j

NNW e

π−

= .

Για παράδειγµα, µπορούµε να δηµιουργήσουµε ένα διάνυσµα χρόνου και ένα διάνυσµα σήµατος ως

εξής:

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)).

Page 90: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 90 από 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

Page 91: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 91 από 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

Page 92: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 92 από 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); # flip a 2-D (B/W) image;

imshow(d7) # show result

Εικ.3 – Αναποδογύρισµα της γκρι εικόνας [δ7]

Page 93: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 93 από 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); # Σµίκρυνση 50%

Page 94: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 94 από 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

Page 95: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 95 από 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;

Page 96: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 96 από 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, y,’-’);

plot(x, y,’:’);

plot(x, y,’--’);

plot(x, y,’-.’);

Επιλογές χρωµάτων (Color options): y, m, c, r, g, b, w, k

plot(x, y, ’g’); % green line (line is default)

plot(x, y, ’r’)

Επιλογές σήµανσης (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):

Page 97: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 97 από 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 % you need to know exact command name

help for

help % lists topics for which there is help

lookfor factorial % if you do not know the exact command name

The print command:

print % prints current figure to current printer

Page 98: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 98 από 99

print -deps % prints current figure to .eps file

print -depsc % prints current figure to color .eps file

print -dps % prints current figure to .ps file

The figure command:

figure % opens new figure

figure(2) % makes figure 2 the current figure

The pause command:

pause % What does this do?

pause(2) % What does this do?

The continuation symbol:

x=[0 1 2 3 4 5 ... % To continue the current command

6 7 8 9 10] % to the next line, use ...

The clear command:

clear % clears all variables from memory

clear x y ... % clears listed variables from memory

The clf command:

clf % clears current figure

Page 99: Octave TutoriaL

Δρ. Απόστολος Π. Λερός και Δρ. Αντώνιος Ανδρεάτος

Εισαγωγή στο OCTAVE Σελ. 99 από 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/Octave-

Matlab-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.