Χρονικές σειρές 9 o μάθημα: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΤΗ MATLAB (3) ΓΡΑΦΗΜΑΤΑ Εαρινό εξάμηνο 2018-2019 Τμήμα Μαθηματικών ΑΠΘ Διδάσκουσα: Αγγελική Παπάνα Μεταδιδακτορική Ερευνήτρια Πολυτεχνική σχολή, Α.Π.Θ. & Οικονομικό Τμήμα, Πανεπιστήμιο Μακεδονίας http://users.auth.gr/~agpapana/ 1
Η εντολή switch Η εντολή switch-case μας δίνει τη δυνατότητα να επιλέξουμε για εκτέλεση μια ομάδα εντολών από άλλες πιθανές ομάδες. Η γενική της δομή έχει ως εξής: switch switch_expression case value_1 statement(s) case value_2 statement(s) otherwise. statement(s) end 2
Η πρώτη γραμμή περιέχει την λέξη κλειδί switch, ακολουθούμενη από το όνομα switch_expression, που θα δώσουμε εμείς, το οποίο μπορεί να είναι βαθμωτή ποσότητα, αλφαριθμητικό, ή ακόμα και μαθηματική παράσταση με προκαθορισμένες μεταβλητές που μπορεί να πάρει μια τιμή. Μετά από το switch, ακολουθούν οι διάφορες εντολές case. Η κάθε μια έχει ένα όνομα (π.χ. value _1, value_2 κλπ) το οποίο μπορεί να είναι βαθμωτή ποσότητα ή αλφαριθμητικό, και μετά ακολουθούν οι εντολές που θα εκτελεστούν αν βρεθούμε στη συγκεκριμένη περίπτωση. Μετά την τελευταία περίπτωση/εντολή case, ακολουθεί η προαιρετική περίπτωση/εντολή otherwise της οποίας οι εντολές θα εκτελεστούν αν καμιά από τις προηγούμενες περιπτώσεις δεν ισχύει. 3
Σε αντίθεση με άλλες γλώσσες προγραμματισμού (όπως, π.χ. η C), στη MATLAB δεν χρειάζεται να διακόψουμε τη ροή της δομής μετά από κάθε case, μια και αυτό θα γίνει αυτόματα αφού μια από τις περιπτώσεις έχει επαληθευτεί. Παράδειγμα Το πιο κάτω script m-file μετατρέπει μήκη από διάφορες μονάδες σε cm. 4
% convertcm.m x = input('dwste th timh ths metablhths pou xreiazetai metatroph: '); units = input('dwste tis movades metrhshs ths (mesa se apostrofous):'); switch units case {'in','inch'} y = 2.54*x; % converts to centimeters disp('se ekatosta (cm), h timh ths metablhths eivai') disp(y) case {'m','meter'} y = x*100; % converts to centimters disp('se ekatosta (cm), h timh ths metablhths eivai') disp(y) otherwise disp(['unknown units:' units]) y = nan; end 5
Παράδειγμα function []=checkmat(a) % Elegxei an enas pinakas einai antistrepsimos % Dedomeno eisodou: pinakas A, Dedomeno eksodou: kanena [m,n]=size(a); if m ~=n disp('matrix A is not square!') else deta=det(a); switch deta case 0 disp('matrix A is singular!') otherwise disp('matrix A is invertible!') end end 6
Παράδειγμα function []=ticketp() % Returns the cost of an airfair depending on the destination city=input('enter destination city: ', 's') switch city case 'Paphos' disp('50 CYP') case 'Athens' disp('150 CYP') case 'Heraklion' disp('110 CYP') case 'Thessaloniki' disp('200 CYP') otherwise sprintf('no flights for %s',city) end 7
Η συνάρτηση menu Η συνάρτηση menu παράγει ένα μενού επιλογών για τον χρήστη. Η δομή της είναι choice=menu(header, item1, item2,.) όπου header είναι η επικεφαλίδα item1 είναι η πρώτη επιλογή, item2 η δεύτερη κοκ. Η σύνταξη choice=menu(header, itemlist) όπου itemlist είναι ένας αλφαριθμητικός πίνακας κελίων είναι επίσης αποδεκτή. Η menu επιστρέφει τον αριθμό της επιλογής του χρήστη στη μεταβλητή choice. 8
ΓΡΑΦΙΚΑ H MATLAB έχει εξαιρετικές δυνατότητες για γραφικά και είναι εφοδιασμένη με αρκετές συναρτήσεις για εύκολο και ευέλικτο σχεδιασμό επίπεδων καμπυλών, τρισδιάστατων επιφανειών, ισοϋψών, παραμετρικών δισδιάστατων αλλά και τρισδιάστατων καμπυλών κα. Το κεφάλαιο αυτό είναι μια εισαγωγή στις σημαντικότερες γραφικές συναρτήσεις της MATLAB. 9
Η εντολή plot Η συνάρτηση plot χρησιμοποιείται για την κατασκευή του γραφήματος μιας επίπεδης καμπύλης τα σημεία της οποίας είναι αποθηκευμένα στα ισομήκη διανύσματα x και y. Αν για παράδειγμα, έχουμε τα διανύσματα >> x=[0 1 1.5 2.2 3.]; >> y=[0 1.65 1.45 1.4 1]; με την εντολή >> plot(x,y) εμφανίζεται αυτόματα ένα παράθυρο γραφικών με το γράφημα: Ενώνει τα 5 σημεία που ορίζουν τα x και y με συνεχείς γραμμές. 10
Παράδειγμα Θα κατασκευάσουμε το γράφημα της y = cos(x) στο διάστημα [ π, π]. Ακολουθούμε τα εξής βήματα: >> x=-pi:0.01:pi; >> x=linspace(-pi,pi); ή >> x=linspace(-pi,pi, n); (n: πλήθος σημείων που θέλω να διαμερίσω το x) >> y=cos(x); >> plot(x,y) ή >> x=-pi:0.01:pi; plot(x,cos(x)) ή >> plot(-pi:0.01:pi,cos(-pi:0.01:pi)) ή >> plot(linspace(-pi,pi,301),cos(linspace(-pi,pi,301))) 11
Συνάρτηση logspace Η logspace παράγει διανύσματα με συνιστώσες που ισαπέχουν λογαριθμικά. >> logspace(0,2,11) >> logspace(0,2,3) ans = ans = Columns 1 through 5 1 10 100 1.0000 1.5849 2.5119 3.9811 6.3096 Columns 6 through 10 10.0000 15.8489 25.1189 39.8107 63.0957 Column 11 100.0000 12
Χρήσιμες συναρτήσεις για γραφικά Το γράφημα που πήραμε πιο πάνω είναι απλό αφού δεν έχει ετικέτες στους άξονες, τίτλο και λεζάντα. Όλα αυτά μπορούν να προστεθούν και να τροποποιηθούν είτε απευθείας με το μενού του παραθύρου γραφικών είτε με συναρτήσεις βιβλιοθήκης στο παράθυρο εντολών. Με τις πιο κάτω εντολές: >> xlabel('x') >> ylabel('y=cos(x)') >> title('graph of cosine in [-pi, pi]') >> legend('cos(x)') το γράφημα που παίρνουμε είναι: 13
Οι κυριότερες συναρτήσεις για γραφικά είναι συγκεντρωμένες στον ακόλουθο πίνακα: Εντολή plot title xlabel ylabel legend text grid Περιγραφή Δημιουργεί το γράφημα του y συναρτήσει του x Προσθήκη τίτλου Προσθήκη ετικέτας στον οριζόντιο άξονα Προσθήκη ετικέτας στον κατακόρυφο άξονα Προσθήκη λεζάντας (legend( First, Second )) Προσθήκη κειμένου στη θέση (x i, y i ) (text(xi, yi, string )) Δημιουργία πλέγματος 14
Εντολή figure hold axis Περιγραφή Άνοιγμα (άλλου) παραθύρου γραφικών Πάγωμα του τρέχοντος παραθύρου γραφικών για το σχεδιασμό και άλλων καμπυλών (hold on/hold off) Κλείδωμα/ξεκλείδωμα αξόνων (axis) Ίσες μονάδες αξόνων (axis equal) Διαγραφή αξόνων (axis off) Όρια αξόνων (axis([xmin, xmax,ymin,ymax])) Στις ετικέτες, τον τίτλο και τη λεζάντα δεν μπορούμε να έχουμε ελληνικά με απλό τρόπο. >> title('graph of cosine in [-\pi, \pi]') 15
Η εντολή figure μας επιτρέπει να ανοίξουμε ένα νέο παράθυρο γραφικών εκτός από το προεπιλεγμένο με όνομα Figure 1. Αν έχουμε ήδη δημιουργήσει το Figure 1 και δεν θέλουμε να το διαγράψουμε, γράφουμε >> figure(2) Την επόμενη φορά που θα δημιουργήσουμε γραφικά, αυτά θα εμφανιστούν στο παράθυρο με όνομα Figure 2. Αυτό θα είναι το παράθυρο εργασίας για όλες τις γραφικές παραστάσεις μέχρι να χρησιμοποιήσουμε εκ νέου την εντολή figure. Η εντολή hold χρησιμοποιείται όταν θέλουμε να σχεδιάσουμε επιπλέον καμπύλες στο ίδιο γράφημα. 16
Αν παραλείψουμε το x, η εντολή plot(y) σχεδιάζει τα στοιχεία yi συναρτήσει των δεικτών i. Έτσι οι εντολές >> x=0:-0.1:-0.5; >> plot(exp(x), '*') δίνουν το γράφημα: Επειδή το διάνυσμα έχει μήκος 6 στον άξονα των i οι τιμές κυμαίνονται από 1 έως 6. 17
Η εντολή plot δουλεύει ακόμα και όταν τα δεδομένα εισόδου είναι μιγαδικοί αριθμοί. Σε αυτή την περίπτωση, το μιγαδικό μέρος των αριθμών αγνοείται, εκτός αν χρησιμοποιήσουμε μόνο ένα δεδομένο εισόδου οπότε το γράφημα που παίρνουμε αντιστοιχεί στη γραφική παράσταση του μιγαδικού μέρους έναντι του πραγματικού. Συγκεκριμένα, η εντολή plot(z) όταν το Z είναι μιγαδικό διάνυσμα (ή πίνακας) είναι ισοδύναμη με την plot(real(z), imag(z)). Για παράδειγμα, οι εντολές >> t=0:pi/10:2*pi; >> plot(exp(i*t),'-o') >> axis equal παράγουν το γράφημα: 18
Η εντολή axis equal αναγκάζει τους άξονες να έχουν το ίδιο μέγεθος, έτσι ώστε η γραφική παράσταση να είναι κυκλική. 19
Βιβλιογραφία 1. Γ. Γεωργίου, Χ. Ξενοφώντος. Εισαγωγή στη MATLAB. Πανεπιστήμιο Κύπρου, Λευκωσία, 2007 (ISBN 978-9963-644-57-5). 2. Matlab, High-Performance Numeric Computation and Visualization Software. The Math Works Inc, 1992. 20