ΣΧΟΛΗ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΕΜΠ ΜΕΘΟΔΟΙ ΕΠΙΛΥΣΗΣ ΜΕ Η/Υ 6 η ΕΝΟΤΗΤΑ Δομές επανάληψης Ν.Δ. Λαγαρός Μ. Φραγκιαδάκης Α. Στάμος
Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες Χρήσης Creative Commons. για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς. 83
Περιεχομένα 1) η εντολή for 2) χρήση διανυσμάτων για την αποφυγή δομών επανάληψης 3) ανάγνωση εξωτερικών αρχείων 4) γραφήματα (συνέχεια) 5) μέθοδοι ολοκλήρωσης 84
δομές επανάληψης for loops Σύνταξη: for x = array ( εντολές ) end Παράδειγμα 1: >> for n = 1:10 >> disp(n) % η τιμή του n αλλάζει σε κάθε επανάληψη >> k = 50*n + 32; % η τιμή του k αλλάζει σε κάθε επανάληψη (δεν αποθηκεύεται όμως) >> A(n) = sin(n*pi/10); % η θέση n του μητρώου A παίρνει τιμή >> end >> Α % τυπώνονται οι τιμές του Α >> k % τυπώνεται η τελευταία τιμή του k = 50*10 + 32= 82 85
δομές επανάληψης (συνέχεια) Παράδειγμα 2: for i = 1:10 n(i)=i; x(n) = sin(n*pi/10); end plot(n,x,'k.-') xlabel('n','fontsize',18) ylabel('x','fontsize',18) Παρατηρήστε ότι το ίδιο αποτέλεσμα προκύπτει εάν χειριστούμε τα διανύσματα ως μεταβλητές (vectorized λύση): n = 1:10; x = sin(n*pi/10); plot(n,x,'k.-') Η χρήση του βρόγχου for δίνει ευελιξία προγραμματιστικά, υπολογιστικά όμως είναι σημαντικά χρονοβόρα και πρέπει να αποφεύγεται όπου αυτό είναι δυνατό (ειδικά στις πράξεις μητρώων). 86
δομές επανάληψης (συνέχεια) Παράδειγμα 3: figure(2) hold on; grid on; box on; n = 1:100; for i = 1:3 x = n.^(i/4); if i == 1 plot(n,x,'r-') elseif i == 2 plot(n,x,'b-','linewidth',2) elseif i == 3 plot(n,x,'g--','linewidth',3) end xlabel('n','fontsize',18) ylabel('x','fontsize',18) end 87
δομές επανάληψης (συνέχεια) Παράδειγμα 4: με την εντολή for μπορούμε να δώσε τιμές σε ένα μητρώο: >> for n = 1:5 >> for m = 5:-1:1 >> A(n,m) = n^2+m^2; >> end >> end ή να πολλαπλασιάσουμε μητρώα, διανύσματα κλπ: >> a = [0, -1, 4; 9, -14, 25; -34, 49, 64]; >> v = [4; -2; 10]; >> b = zeros(3,1); >> for i = 1:3 >> for j = 1:3 >> b(i)=b(i)+a(i,j)*v(j); >> end >> end Ελέγξετε το αποτέλεσμα του πολλαπλασιασμού με την πράξη: b = a*v 88
δομές επανάληψης (συνέχεια) Χρήσιμες εντολές είναι οι length και size: Έστω μητρώο Α διαστάσεων 3x4 size(a) δίνει τις διαστάσεις ενός μητρώου, δηλαδή 3x4 size(a,2) δίνει το μήκος της 2 ης διάστασης του μητρώου Α, δηλαδή 4 length(a,2) δίνει το μήκος της μεγαλύτερης διάστασης, δηλαδή 4 Τα παραπάνω αποτελέσματα μπορούμε να τα αποθηκεύουμε σε μεταβλητές: >> ss = size(a) >> ss = 3 4 >> a = [0, -1, 4, 4; 9, -14, 25, 5; -34, 49, 64, 7]; >> v = [1, -1, 9, 5] ; % το μας δίνει τον ανάστροφο >> b = zeros(3,1); >> for i = 1:size(a,1) >> for j = 1:length(v) >> b(i)= b(i) + a(i,j)*v(j); >> end >> end συγκρίνετε το αποτέλεσμα με την πράξη b = a*v 89
Ανάγνωση και γραφή σε αρχεία Το Μatlab διαβάζει και αποθηκεύει αρχεία δεδομένων διαφόρων μορφών, αρχεία onoma.mat διαβάζονται μόνο από το Matlab >> save('onomaarxeiou.mat','var_1','var_2','var_3') >> a = [0, -1, 4, 4; 9, -14, 25, 5; -34, 49, 64, 7]; >> v = [1, -1, 9, 5] ; >> k = panathinaikos ; >> save( kapoioonoma.mat, a, v, k ) Οι μεταβλητές a, v, k σώθηκαν στο αρχείο kapoioonoma.mat 90
Ανάγνωση και γραφή σε αρχεία Το αρχείο kapoioonoma.mat μπορεί να διαβαστεί μόνο από το Matlab με την εντολή load. >> clear % καθαρίζει όλες τις μεταβλητές από την μνήμη >> load(kapoioonoma.mat) >> disp(a) % επανέρχεται η τιμή του a >> disp(v) >> disp(k) 91
Ανάγνωση και γραφή σε αρχεία Απλά αρχεία κειμένου (αρχεία ASCII) διαβάζονται από όλους τους editors κειμένου (Σημειωματάριο, Word, κλπ) εντολές dlmread και dlmwrite Παράδειγμα: >> a = [0,-1,4,4,10; 9,-14,25,5,8;-34,49,64,7,98]; >> fname = 'onomaarxeiou.txt ; >> dlmwrite(fname,a') Το αρχείο onomaarxeiou.txt μπορούμε: α. απλά να το διαβάσουμε με κάποιο πρόγραμμα β. να φορτώσουμε τα περιεχόμενά του σε κάποιο μητρώο, π.χ. >> dd = dlmread('onomaarxeiou.txt') >> dd = load('onomaarxeiou.txt') Το αποτέλεσμα είναι το ίδιο, η load όμως είναι ισχυρότερη εντολή 92
Ανάγνωση και γραφή σε αρχεία αρχεία Excel ή/και csv (comma separated) εντολές xlsread και xlswrite Παράδειγμα: >> a = [0,-1,4,4,10; 9,-14,25,5,8;-34,49,64,7,98]; >> xlswrite('onomaarxeiou.xls',a') μορφοποιημένα αρχεία εντολές fprintf και fgetl, fgets Είναι ο ισχυρότερος τρόπος γραφής και ανάγνωσης δεδομένων από αρχεία ASCII, θα παρουσιαστεί σε επόμενη ενότητα. Δεν περιορίζει η γραφή και η ανάγνωση να είναι σε γραμμές και σε στήλες (όπως οι dlmread και dlmwrite). 93
Άλλες χρήσιμες συναρτήσεις Άλλες χρήσιμες συναρτήσεις για την διαχείριση αρχείων: dir cd pwd copyfile delete 94
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα Πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοιχτά Ακαδημαϊκά Μαθήματα Ε.Μ.Π.» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση. 95