ΣΧΟΛΗ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΕΜΠ ΜΕΘΟΔΟΙ ΕΠΙΛΥΣΗΣ ΜΕ Η/Υ 7 η ΕΝΟΤΗΤΑ Δομές επανάληψης (συνέχεια) Εντολές εισόδου/εξόδου (συνέχεια) Ν.Δ. Λαγαρός Μ. Φραγκιαδάκης Α. Στάμος
Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες Χρήσης Creative Commons. για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς. 97
Περιεχόμενα 1) δομές επανάληψης (συνέχεια) 2) ανάγνωση εξωτερικών αρχείων με τυχαία διαμόρφωση 3) μέθοδοι ολοκλήρωσης 4) εφαρμογές 98
δομές επανάληψης while loop Είδαμε την εντολή for που συντάσσεται: for x = array ( εντολές ) end Εναλλακτικά μπορούμε να χρησιμοποιήσουμε την εντολή while while συνθήκη ( εντολές ) end while n <= 10 % η συνθήκη είναι όσο το n είναι μικρότερο ή ίσο από 10. n = n + 2; % η τιμή του n αυξάνεται σε κάθε επανάληψη κατά 2 disp(n) A(n) = 50*n+32; % δίνουμε τιμές στα Α(2), Α(4), Α(6), Α(8) και Α(10) end 99
δομές επανάληψης while loop Παράδειγμα while-loop: ο παρακάτω βρόγχος ονομάζεται ατέρμων, γιατί?? i = 0; while 1 < 2 i = i + 1 disp('de STAMATW, DE STAMATW ') end Πατήστε ταυτόχρονα Ctrl + C για να σταματήσει ο βρόγχος 100
Διαστάσεις διανυσμάτων και μητρώων Οι εντολές length και size: Έστω μητρώο Α διαστάσεων 3x4 size(a) δίνει τις διαστάσεις ενός μητρώου, δηλαδή 3x4 size(a,2) δίνει το μήκος της 2 ης διάστασης του μητρώου Α, δηλαδή 4 length(a) δίνει το μήκος της μεγαλύτερης διάστασης, δηλαδή 4 Τα παραπάνω αποτελέσματα μπορούμε να τα αποθηκεύουμε σε μεταβλητές: >> ss = size(a) ss = 3 4 Παρατηρήστε ότι το ss είναι ένα μητρώο 1x2 (γράψτε size(ss)) >> ss = size(a,1) ss = 3 Τώρα το ss είναι ένας ακέραιος αριθμός 101
Oλοκλήρωση συναρτήσεων Ζητείται να ολοκληρωθεί η συνάρτηση y = x 2 e x, στο διάστημα x = 2,3 dx = 0.05; x = 2:dx:3; y = (x.^2).*exp(x); figure(34) plot(x,y,'b.-') xlabel('x','fontsize',18) ylabel('y','fontsize',18) olokl=0; for i=2:length(x) olokl = olokl + 0.5*dx*(y(i-1)+y(i)); end olokl Χωρίζουμε το διάστημα x σε τραπέζια ύψους dx και υπολογίζουμε το εμβαδόν των τραπεζίων (κανόνας του Τραπεζίου) 102
Ολοκλήρωση συναρτήσεων (συνέχεια) Μπορείτε να εκτιμήσετε το σφάλμα του υπολογισμού; 2 x 2 x x x (η αναλυτική λύση είναι: x e dx x e 2xe 2e c ) Να επαναληφθεί ο υπολογισμός χρησιμοποιώντας: 1. Μικρότερο βήμα dx 2. την συνάρτηση του Matlab cumtrapz (η ακριβής σύνταξη είναι dx*cumtrapz(y)) 3. τον κανόνα του Simpson dx I f (x 0) 4 f (x 1) 2 f (x 2) 4 f (x 3) 2 f (x 4) 4 f (x N 1) f (x N) 3 N /2 dx f (x 2 j 2) 4 f (x 2 j 1) f (x 2 j ) 3 j 1 χωρίζουμε το διάστημα σε Ν τμήματα μήκους dx, N άρτιος Εαν η παραπάνω εξίσωση έχει μέγεθος επιτάχυνσης, μπορείτε να υπολογίσετε την συνάρτηση της μετατόπισης; 103
Ανάγνωση και γραφή σε αρχεία Το Μatlab διαβάζει και αποθηκεύει αρχεία δεδομένων διαφόρων μορφών, αρχεία onoma.mat διαβάζονται μόνο από το Matlab save('onomaarxeiou.mat','var_1','var_2','var_3') απλά αρχεία κειμένου (αρχεία ASCII) - διαβάζονται από όλους τους editors κειμένου (Σημειωματάριο, Word, κλπ) (εντολές dlmread και dlmwrite) αρχεία Excel ή/και csv (comma separated) (εντολές xlsread και xlswrite) μορφοποιημένα αρχεία - O ισχυρότερος τρόπος γραφής και ανάγνωσης δεδομένων από αρχεία ASCII. (εντολές fprintf, sprintf) 104
Γραφή σε μορφοποιημένα αρχεία sprintf str = sprintf( διαμόρφωση, A1,...,An) π.χ. sprintf('%5.3f',pi) δίνει 3.142 Όπου η διαμόρφωση έχει την μορφή: % πλατος.ψηφία f (είχαμε 5 ψηφία συνολικά και 3 δεκαδικά) αντί για f (float number): e: σημαίνει επιστημονική γραφή (για μεγάλους αριθμούς) π.χ. sprintf('%5.3e',1000*pi) δίνει 3.142e+03 (5 ψηφία, 3 δεκαδικά) g: συμπαγής γραφή, % συνολικόπλάτος.σημαντικάψηφία g π.χ. δοκιμάστε sprintf('%g',pi), ενώ, sprintf('%5.3g',pi) δίνει 3.14 (3 σημαντικά ψηφία) 105
Γραφή σε μορφοποιημένα αρχεία (συνέχεια) sprintf str = sprintf( διαμόρφωση,a1,...,an) >> A = 1/exp(1); % A = 1/e (βάση του φυσικού λογάριθμου) >> str_e = sprintf( to A einai iso me %0.5e',A) >> str_f = sprintf('to A einai iso me %0.5f',A) >> str_g = sprintf('to A einai iso me %0.5g',A) str_e = to A einai iso me 3.67879e-01 str_f = to A einai iso me 0.36788 str_g = to A einai iso me 0.36788 106
Γραφή σε μορφοποιημένα αρχεία (συνέχεια) fprintf fprintf(αρχείο, διαμόρφωση, A1,...,An) >> A = [6,12,4;7.567,-2,3;2,8.55,-9.2] % ανοίγουμε ένα αρχείο κειμένου στο οποίο θα γράψουμε κάποιο αρχικό κείμενο >> fid =fopen('mitrwoa.txt','w'); >> fprintf(fid,' Ektypwsi toy mitrwou A: \n'); >> fprintf(fid,'-----------------------------------\n'); >> for i=1:size(a,1) fprintf(fid,'[%10.4f %10.4f %10.4f] \n',a(i,1),a(i,2),a(i,3)); end % το \n λέει στο πρόγραμμα να αλλάξει γραμμή >> fclose(fid)% κλείνουμε το αρχείο κειμένου ώστε να μπορεί να το ανοίξει κάποιο άλλο πρόγραμμα. Το τελικό αποτέλεσμα (στο αρχείο mitrwoa.txt) θα είναι: Ektypwsi toy mitrwou A: ----------------------------------- [ 6.0000 12.0000 4.0000] [ 7.5670-2.0000 3.0000] [ 2.0000 8.5500-9.2000] Όνομα Διαμόρφωση Μεταβλητές 107
Γραφή σε μορφοποιημένα αρχεία (συνέχεια) fprintf fprintf(αρχείο, διαμόρφωση, A1,...,An) Το προηγούμενο πρόγραμμα θα μπορoύσε να γραφεί με την παρακάτω μορφή (αποφεύγοντας την δομή επανάληψης for): >> A = [6,12,4;7.567,-2,3;2,8.55,-9.2] >> fid =fopen('mitrwoa.txt','w'); >> fprintf(fid,' Ektypwsi toy mitrwou A: \n'); >> fprintf(fid,'----------------------------------- \n'); >> fprintf(fid,'[%10.4f %10.4f %10.4f] \n',a(:,1),a(:,2),a(:,3)); >> fclose(fid) 108
Γραφή σε μορφοποιημένα αρχεία (συνέχεια) Παράδειγμα: Έστω ότι το διάνυσμα/μεταβλητή Acc τιμές επιτάχυνσης με χρονικό βήμα 0.02sec. Να γραφεί η Acc σε ένα αρχείο ASCII με διαμόρφωση: α. στην 1 η γραμμή να δίνονται το πλήθος τιμών (ακέραιος αριθμος) και το χρονικό βήμα (πραγματικός αριθμός με τρία δεκαδικά ψηφία) β. στις υπόλοιπες γραμμές δίνονται οι τιμές τις επιτάχυνσης, έχοντας 5 τιμές σε κάθε γραμμή. 109
Γραφή σε μορφοποιημένα αρχεία (συνέχεια) Παράδειγμα (συνέχεια): % ανάγνωση του αρχείου Acc = dlmread('earthquake1.dat'); % γραφή στο αρχείο seismos.txt με νέα διαμόρφωση της επιλογής μας dt=0.02; nsteps = length(acc); fid =fopen('seismos.txt','w'); fprintf(fid,'time step: %g, number of steps: %g \n',dt,nsteps); fprintf(fid,'%12.6e, %12.6e, %12.6e, %12.6e, %12.6e \n',acc(:)); fclose(fid) Το αρχείο seismos.txt θα είναι: time step: 0.02, number of steps: 3000 6.631000e+00, 3.507000e+00, 1.628000e+00, 1.105000e+00, 4.260000e-01 2.390000e-01, -2.680000e-01, -1.836000e+00, -1.490000e+00, 1.413000e+00-1.058000e+00, 1.669000e+00, 1.167600e+01, 1.149800e+01, -2.920000e-01-1.671800e+01, -1.228200e+01, -3.280000e+00, -1.202900e+01, -6.913000e+00 110
Αποθήκευση εικόνας Μία εικόνα μπορεί να αποθηκευθεί με τις εντολές: savefig('peaksfile.fig') και print(filename,formattype) >> figure() >> hold on, grid on; box on; >> time=dt*(1:nsteps); >> plot(time,acc,'b-') Αποθήκευση της εικόνας σε αρχείο.fig (ανοίγει μόνο με το Matlab) >> savefig( seismos.fig ) Αποθήκευση της εικόνας σε αρχείο.jpg ή.png (γενικά αρχεία εικόνας μπορούν να μπούν στο Word για μια εργασία) >> print( seismos.jpg,'-djpeg') >> print( seismos.png,'-dpng') 111
Αλγεβρικές πράξεις μητρώων Το Matlab μπορεί πολύ εύκολα να χρησιμοποιηθεί για την επίλυση γραμμικών (και όχι μόνο!) συστημάτων, Έστω το σύστημα: 6x 12y 4z 70 7x 2y 3z 5 2x 8y 9z 64 Για την επίλυση απλά γράφουμε το σύστημα στην μορφή AX = B X = (A -1 )B A = [6,12,4;7,-2,3;2,8,-9] B = [70;5;64] X = A^(-1)*B X = 3.0000 5.0000-2.0000 112
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα Πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοιχτά Ακαδημαϊκά Μαθήματα Ε.Μ.Π.» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση. 113