Το πρόβλημα: Εμβαδόν σφαίρας Θέλουμε να γράψουμε ένα πρόγραμμα που θα υπολογίζει το εμβαδόν Α μιας σφαίρας, ακτίνας r. Για παράδειγμα, έστω πως έχουμε την σφαίρα της γης, η οποία έχει ως γνωστόν ακτίνα (r=6367 km). Το εμβαδόν της σφαίρας είναι: A r = 4πr 2 Μπορούμε να γράψουμε:
r=6367 r = 6367 >> A=4*3.1416*r^2 A = 5.0943e+08 Προφανώς η επιφάνεια είναι σε τετραγωνικά χιλιόμετρα, αφού η ακτίνα είναι σε χιλιόμετρα.
Το πρόβλημα Εάν θέλουμε τώρα να γράψουμε ένα πρόγραμμα που, για να είναι λίγο πιο λειτουργικό, θα μας ζητάει πρώτα να δώσουμε την ακτίνα r της σφαίρας και στην συνέχεια θα υπολογίζει το εμβαδόν της Α και θα το εμφανίζει στην οθόνη, μαζί με την τιμή της ακτίνας: % Υπολογισμός επιφάνειας σφαίρας r = input('δώσε την ακτίνα r: '); A = 4*3.1416*r^2; fprintf('r = %10.3f A = %10.3e\n', r, A)
Εδώ έχουμε δύο εντολές που εισάγονται: Η εντολή input μας βοηθάει να εισάγουμε δεδομένα από τον χρήστη. Περιέχει ένα μήνυμα (λογικά προς τον χρήστη), που εσωκλείεται σε μονά εισαγωγικά (δηλαδή περιέχει μια συμβολοσειρά, μία string). Το πρόγραμμα περιμένει να δώσει ο χρήστης τα δεδομένα και ύστερα προχωράει παρακάτω στην εκτέλεση των άλλων εντολών που ακολουθούν.
Η εντολή fprintf έχει κι αυτή μια συμβολοσειρά. Εδώ όμως η συμβολοσειρά είναι ένα μήνυμα, με αλληλουχίες ειδικών χαρακτήρων, που ορίζουν το πώς θα εμφανιστούν οι αριθμητικές τιμές που θα περιληφθούν στην συμβολοσειρά.
Τελεστής προσαρμογής του r Τελεστής προσαρμογής του A Αλλαγή γραμμής (νέα γραμμή) fprintf('r = %10.3f A = %10.3e\n', r, A) Συμβολοσειρά εξόδου με τελεστές προσαρμογής Λίστα μεταβλητών Οι τελεστές προσαρμογής του r και του Α ορίζουν πως: Το r θα εμφανισθεί με 10 ψηφία (%10), από τα οποία τα 3 μετά την υποδιαστολή (.3), σε κλασσική δεκαδική μορφή (f).
Τελεστής προσαρμογής του r Τελεστής προσαρμογής του A Αλλαγή γραμμής (νέα γραμμή) fprintf('r = %10.3f A = %10.3e\n', r, A) Συμβολοσειρά εξόδου με τελεστές προσαρμογής Λίστα μεταβλητών Το Α θα εμφανισθεί επίσης με 10 ψηφία (%10), από τα οποία τα 3 μετά την υποδιαστολή (.3), σε επιστημονική όμως μορφή (e). Μετά από αυτά, θα αλλάξει η γραμμή (\n).
Εάν τρέξουμε το πρόγραμμα θα έχουμε: Δώσε την ακτίνα r: 5 r = 5.000 A = 3.142e+02 Πρώτα το πρόγραμμα μας ζητάει την ακτίνα r. Αφού την δώσουμε (=5), μετά συνεχίζει παρακάτω, κάνει τους υπολογισμούς και μας δίνει τα αποτελέσματα.
Το πρόβλημα Εάν θέλουμε τώρα να γράψουμε ένα πρόγραμμα που θα υπολογίζει την αύξηση του εμβαδού δα μιας σφαίρας (σε m 2 ) όταν η ακτίνα της r, αυξάνεται κατά μια μικρή ποσότητα δr (σε mm). Το πρόγραμμα θα ζητάει κατ αρχή να δώσουμε τα r και δr, και στο τέλος θα δίνει το αποτέλεσμα.
Το εμβαδόν της σφαίρας είναι: A r = 4πr 2 Καθώς η ακτίνα της αυξάνεται κατά δr η αύξηση στην επιφάνειά της θα είναι: δα = 4π r + δr 2 4πr 2 = 4π r 2 + 2. r. δr + δr 2 4πr 2 = 4π 2. r. δr + δr 2 8πr. δr Εάν θεωρήσουμε πως η ποσότητα δr 2 είναι αμελητέα. Το πρόγραμμα, με τις 3 εκδοχές του Α, θα είναι:
% Script Eg1_1 % Αύξηση εμβαδού επιφανείας σφαίρας % Διάβασε και εμφάνισε τα δεδομένα εισόδου... r = input('δώσε την ακτίνα(χιλιόμετρα):'); delta_r = input('δώσε την αύξηση (χιλιοστά):'); clc fprintf('ακτίνα σφαίρας = %12.6f χιλιόμετρα\n',r) fprintf('αύξηση ακτίνας = %12.6f χιλιοστά\n\n',delta_r) disp('αύξηση εμβαδού επιφανείας:') % Μετατροπή από χιλιοστά σε χιλιόμετρα... dr = delta_r/10^6; % Μέθοδος 1 delta_a1 = (4*pi*(r + dr)^2-4*pi*r^2)*10^6; fprintf('\n Μέθοδος 1: %15.6f τετραγωνικά μέτρα\n',delta_a1) % Method 2 delta_a2 = (4*pi*(2*r + dr)*dr)*10^6; fprintf(' Μέθοδος 2: %15.6f τετραγωνικά μέτρα \n',delta_a2) % Method 3 delta_a3 = (8*pi*r*dr)*10^6; fprintf(' Μέθοδος 3: %15.6f τετραγωνικά μέτρα \n',delta_a3)
Το πρόγραμμα Script Eg1_1 είναι δομημένο έτσι ώστε: να υπολογίζει την αύξηση του εμβαδού της σφαίρας σύμφωνα με τις τρεις μεθόδους Κάνει μερικές παραδοχές ως προς τις μονάδες μέτρησης για την είσοδο των τιμών (ζητάει την ακτίνα r σε χιλιόμετρα και την αύξησή της δr σε χιλιοστά) και την έξοδο δα (σε τετραγωνικά μέτρα) Η εντολή clc «καθαρίζει» το παράθυρο εντολών πριν εμφανιστούν τα αποτελέσματα Ένα σημαντικό στοιχείο στο πρόγραμμα (και σε κάθε πρόγραμμα) είναι η εντολή εκχώρησης.
Εντολή εκχώρησης (υπενθύμιση) delta_a1 = (4*pi*(r + dr)^2-4*pi*r^2)*10^6; Όνομα μεταβλητής Αριθμητική έκφραση Ο τελεστής εκχώρησης (=) λέει: «υπολόγισε την αριθμητική έκφραση στα δεξιά και αποθήκευσε την τιμή στην μεταβλητή στα αριστερά». Να αποφεύγουμε να σκεφτόμαστε τον τελεστή εκχώρησης (=) σαν μια αλγεβρική πράξη.
Ένα άλλο πολύ σημαντικό στοιχείο σε κάθε πρόγραμμα είναι τα σχόλια. Θα ξεκινάμε κάθε script με δύο σχόλια: Το ένα θα αναφέρει το όνομά του Το άλλο θα περιγράφει το τι κάνει Επίσης σχόλια πρέπει να προσθέτουμε σε κάθε σημαντικό τμήμα του κώδικα. Στο Script Eg1_1 π.χ. έχουμε προσθέσει σχόλια για την ανάγνωση και την εμφάνιση των δεδομένων, καθώς και για την κάθε μέθοδο υπολογισμού.
Εάν τρέξουμε το πρόγραμμα, θα δώσουμε τις τιμές που θα μας ζητήσει για την ακτίνα και την αύξησή της και θα πάρουμε τα αποτελέσματα: Ακτίνα σφαίρας = Αύξηση ακτίνας = 6367.000000 χιλιόμετρα 1.234000 χιλιοστά Αύξηση εμβαδού επιφανείας: Μέθοδος 1: Μέθοδος 2: Μέθοδος 3: 197464.823723 τετραγωνικά μέτρα 197464.881659 τετραγωνικά μέτρα 197464.881640 τετραγωνικά μέτρα
Η μέθοδος 3 δίνει διαφορετικά αποτελέσματα γιατί ο τύπος υπολογισμού χρησιμοποιείται με προσέγγιση. Στις μεθόδους 1 και 2 όμως, ενώ χρησιμοποιούμε ακριβώς τον ίδιο τύπο, παίρνουμε διαφορετικά αποτελέσματα, λόγω της διαφορετικής στρογγυλοποίησης που κάνει ο υπολογιστής (π.χ. στις τιμές 1/3, π).
Το πρόβλημα: Ακρότατο εξίσωσης 2 ου βαθμού Έστω μια δευτεροβάθμια εξίσωση της μορφής: f x = x 2 + bx + c Η f x έχει την ελάχιστη τιμή της στο κρίσιμο σημείο x c το οποίο είναι το σημείο μηδενισμού της 1 ης παραγώγου της: f x! = 2x + b = 0 x c = b 2
Το πρόβλημα: Ακρότατο εξίσωσης 2 ου βαθμού Το πεδίο ορισμού της εξίσωσης είναι: [L, R]. Η τιμή του x c απαιτεί κάποιον έλεγχο, ανάλογα με το αν βρίσκεται αριστερά, δεξιά, ή εντός του πεδίου ορισμού. Αν δηλαδή το x c βρίσκεται μέσα στο πεδίο, τότε: f min x = f x c Εάν όχι, τότε θα ελαχιστοποιείται είτε στο x=l είτε στο x=r. Δηλαδή: f min x = f R f min x = f L
Το πρόβλημα: Ακρότατο εξίσωσης 2 ου βαθμού Να γραφεί ένα πρόγραμμα που να ζητάει τους πραγματικούς αριθμούς: L, R, b, c, και εν συνεχεία να εκτυπώνει την ελάχιστη τιμή της δευτεροβάθμιας εξίσωσης f x = x 2 + bx + c στο διάστημα [L, R], καθώς και την τιμή του x στην οποία εμφανίζεται το ελάχιστο. Για να έχουμε μια γεωμετρική θεώρηση του προβλήματος, θα απεικονίσουμε τις 3 διαφορετικές περιπτώσεις της θέσης του κρίσιμου σημείου x c.
Εάν R x c f min x = f R
Εάν L x c R f min x = f x c
Εάν x c L f min x = f L
Σύμφωνα με τις τρεις ανωτέρω περιπτώσεις, πρέπει να πραγματοποιήσουμε περίπου τον εξής ψευδοκώδικα*: If x c < L Εκτύπωσε f L και L Else if L x c R Εκτύπωσε f x c και x c else Εκτύπωσε f R και R end *Ο ψευδοκώδικας είναι μία «χονδροειδής» αποτύπωση των εργασιών που πρέπει να κάνει ένα πρόγραμμα, που δεν είναι γραμμένος όμως σε αυστηρή γλώσσα προγραμματισμού.
Για να κάνουμε κάτι τέτοιο στο Matlab, χρειαζόμαστε μια δομή της γλώσσας που: a) Να επιτρέπει την σύγκριση των τιμών και b) Να εκτελεί το κατάλληλο τμήμα του προγράμματος, ανάλογα με το αποτέλεσμα της σύγκρισης. Η εντολή if είναι ακριβώς σχεδιασμένη γι αυτόν τον σκοπό. Υποθέτουμε πως ήδη το πρόγραμμα γνωρίζει τις τιμές των L, R, b, c, καθώς και το κρίσιμο σημείο x c :
Σύμφωνα με τις εντολές: b = input('δώσε το b:'); c = input('δώσε το c:'); L = input('δώσε το L:'); R = input('δώσε το R (L<R):'); xc = -b/2; Ακολουθεί ένα τμήμα του προγράμματος που εκχωρεί στη μεταβλητή minendpointval την μικρότερη από τις δύο τιμές της συνάρτησης στα οριακά σημεία:
fl = L^2 + b*l + c; fr = R^2 + b*r + c; If fl<=fr minendpointval = fl; else minendpointval = fr; end
Η δομή If-else είναι η πιο συχνή παραλλαγή του if. Υπάρχει μια πολύ στενή αντιστοιχία του πως διαβάζεται και τι κάνει ο κώδικας. Στο παράδειγμα τίθεται μια «αληθής ψευδής» ερώτηση: Είναι η τιμή του fl μικρότερη ή ίση της τιμής του fr; Αν η απάντηση είναι «ναι» τότε σημαίνει ότι η μικρότερη τιμή της συνάρτησης στα οριακά σημεία είναι αυτή στα αριστερά και μας οδηγεί στο νακάνουμε: minendpointval = fl Αν η απάντηση είναι «όχι» τότε σημαίνει ότι η μικρότερη τιμή είναι αυτή στα δεξιά και μας οδηγεί στο να κάνουμε το εξής: minendpointval = fr
Μια λογική έκφραση που είναι είτε αληθής είτε ψευδής If fl<=fr Λέξεις Κλειδιά else end minendpointval = fl; minendpointval = fr; Εκτελείται αν η λογική έκφραση είναι αληθής Εκτελείται αν η λογική έκφραση είναι ψευδής Η Εντολή if-else
Η σύγκριση fl<=fr είναι μια λογική έκφραση η οποία (όπως και οι αριθμητικές εκφράσεις) παράγει εκτελούμενη ένα αποτέλεσμα: την τιμή «αληθές» (true) ή «ψευδές» (false). Οι υπό-συνθήκη σχέσεις μπορούν να περιέχουν πιο σύνθετους ελέγχους. Εάν π.χ. θέλουμε να εκτυπώσουμε το x c και το f x c, αν το x c ανήκει στο διάστημα [L,R], ή (εάν δεν ανήκει), ένα πληροφοριακό μήνυμα. Για να γίνει αυτός ο έλεγχος (ανήκει ή όχι), απαιτούνται δύο συγκρίσεις: Πρέπει το x c να είναι στα δεξιά του L και στα αριστερά του R. Αυτό υλοποιείται ως εξής:
% Λύση 1 xc = -b/2; if L <= xc && xc <= R fc = c - (b/2)^2; fprintf(' f(xc) = %6.3f xc=%6.3f\n',fc,xc) else disp('είτε το xc<l είτε το R<xc') end H fc είναι η f min = c b 2 Η βασική διαφορά από την προηγούμενη συνθήκη είναι ότι ο έλεγχος αληθούς-ψευδούς είναι πιο πολύπλοκος. Πρέπει να ικανοποιούνται δύο συνθήκες για να συμπεράνουμε πως το x c ανήκει στο διάστημα [L,R]: το x c πρέπει να είναι στα δεξιά του L και το x c πρέπει να είναι στα αριστερά του R. 2
Ο τελεστής «και» που συμβολίζεται με && χρησιμοποιείται για να συνδέει τα δύο κριτήρια: L <= xc && xc <= R Μπορούμε, για την πραγματοποίηση της ίδιας συνθήκης, να χρησιμοποιήσουμε και άλλους λογικούς τελεστές. Π.χ. με τον λογικό τελεστή «ή» που συμβολίζεται με : % Λύση 2 xc = -b/2; if xc < L xc > R disp('είτε το xc < L είτε το R < xc') else fc = c - (b/2)^2; fprintf(' f(xc) = %6.3f xc=%6.3f\n',fc,xc) end
Η μεθοδολογία εδώ είναι ότι το x c δεν ανήκει στο διάστημα [L,R]: το x c είναι στα αριστερά του L ή το x c είναι στα δεξιά του R. Με τον λογικό τελεστή «όχι» που συμβολίζεται με ~: % Λύση 3 xc = -b/2; if ~(L <=xc && xc <= R) disp('είτε το xc < L είτε το R < xc') else fc = c - (b/2)^2; fprintf(' f(xc) = %6.3f xc=%6.3f\n',fc,xc) end
Έχουμε 3 διαφορετικές λύσεις if-else για το ίδιο λογικό πρόβλημα. Αυτό συμβαίνει με τους λογικούς υπολογισμούς, όπως συμβαίνει και με τους αλγεβρικούς υπολογισμούς. Αυτή η πολλαπλότητα επιβάλλει μια πιο γενική μορφή της εντολής if. Ο αρχικός ψευδοκώδικας πρέπει να προσαρμοσθεί για να γίνει κανονικό πρόγραμμα MATLAB. Βασικά το κομβικό σημείο είναι να βρούμε, ποια από τις τρεις περιπτώσεις ισχύει, για να εκτελεστεί στην συνέχεια το αντίστοιχο τμήμα του προγράμματος. Αυτή η λογική οδηγεί:
if xc < L % Τμήμα 1 fl = L^2 + b*l + c; fprintf('l = %6.3f f(l) = %6.3f\n',L,fL) elseif L <= xc && xc <=R % Τμήμα 2 fxc = c - (b/2)^2; fprintf('xc = %6.3f f(xc)= %6.3f\n',xc,fxc) else % Τμήμα 3 fr = R^2 + b*r + c; fprintf('r = %6.3f f(r) = %6.3f\n',R,fR) end disp('συνέχεια στο επόμενο θέμα!')
Η λογική εξέλιξη του προγράμματος λέει πως: Αν η έκφραση xc < L είναι αληθής, τότε εκτελείται το Τμήμα 1 και ο έλεγχος περνάει στην εντολή disp. Διαφορετικά υπολογίζεται η λογική έκφραση: L <= xc && xc <=R. Αν είναι αληθής, τότε εκτελείται το Τμήμα 2 και ο έλεγχος περνάει στην εντολή disp. Διαφορετικά εκτελείται το Τμήμα 3 και μετά ο έλεγχος περνάει στην εντολή disp.
Σε μια δομή if-elseif-else εκτελείται μόνο ένα από όλα τα εναλλακτικά τμήματα του κώδικα. Τέλος, υπάρχει και μια εκδοχή της εντολής if που είναι χρήσιμη όταν θέλουμε να κάνουμε κάτι, όταν η τιμή του λογικού ελέγχου είναι αληθής, ενώ δεν θέλουμε να γίνει τίποτα όταν είναι ψευδής: if L > R temp = L; L = R; R = temp; end
Στην περίπτωση αυτή, η ιδέα είναι να αλλάξουμε τα περιεχόμενα των μεταβλητών L και R, αν η τιμή του L είναι μεγαλύτερη από την τιμή του R. To τμήμα του else δεν είναι απαραίτητο. Αυτό το μέρος του κώδικα θα μπορούσε να τοποθετηθεί αμέσως μετά τις εντολές Input, ως ένας τρόπος για να εξασφαλισθεί πως η τιμή του R δεν είναι μικρότερη της τιμής του L. Στο πρόγραμμα Eg1_2 σημειώστε την σημαντική παρουσία των σχολίων, τα οποία καθοδηγούν τον αναγνώστη στις λογικές υποπεριπτώσεις του προγράμματος.
% Script Eg1_2 % Ελάχιστο της δευτ/θμιας x^2+bx+c στο διάστημα [L,R]. % Διάβασε και εμφάνισε τα δεδομένα εισόδου... b = input('δώσε το b:'); c = input('δώσε το c:'); L = input('δώσε το L:'); R = input('δώσε το R (L<R):'); clc fprintf('δευτ/θμια: x^2 + bx + c, b = %5.2f, c = %5.2f\n',b,c) fprintf('διάστημα : [L,R], L = %5.2f, R = %5.2f\n\n',L,R) % Το κρίσιμο σημείο... xc = -b/2; if xc < L % Ελάχιστο στο αριστερό όριο... fl = L^2 + b*l + c; fprintf('x ελαχιστοποίησης = %5.2f\n',L) fprintf('ελάχιστη τιμή της f = %5.2f\n',fL) elseif L <= xc && xc <= R % Ελάχιστο στο κρίσιμο σημείο... fxc = c - (b/2)^2; fprintf('x ελαχιστοποίησης = %5.2f\n',xc) fprintf('ελάχιστη τιμή της f = %5.2f\n',fxc) else % Ελάχιστο στο δεξί όριο... fr = R^2 + b*r + c; fprintf('x ελαχιστοποίησης = %5.2f\n',R) fprintf('ελάχιστη τιμή της f = %5.2f\n',fR) end
% Script Eg1_2 % Ελάχιστο της δευτ/θμιας x^2+bx+c στο διάστημα [L,R]. % Διάβασε και εμφάνισε τα δεδομένα εισόδου... b = input('δώσε το b:'); c = input('δώσε το c:'); L = input('δώσε το L:'); R = input('δώσε το R (L<R):'); clc fprintf('δευτ/θμια: x^2 + bx + c, b = %5.2f, c = %5.2f\n',b,c) fprintf('διάστημα : [L,R], L = %5.2f, R = %5.2f\n\n',L,R)
% Το κρίσιμο σημείο... xc = -b/2; if xc < L % Ελάχιστο στο αριστερό όριο... fl = L^2 + b*l + c; fprintf('x ελαχιστοποίησης = %5.2f\n',L) fprintf('ελάχιστη τιμή της f = %5.2f\n',fL) elseif L <= xc && xc <= R % Ελάχιστο στο κρίσιμο σημείο... fxc = c - (b/2)^2; fprintf('x ελαχιστοποίησης = %5.2f\n',xc) fprintf('ελάχιστη τιμή της f = %5.2f\n',fxc) else % Ελάχιστο στο δεξί όριο... fr = R^2 + b*r + c; fprintf('x ελαχιστοποίησης = %5.2f\n',R) fprintf('ελάχιστη τιμή της f = %5.2f\n',fR) end
Εάν τρέξουμε το πρόγραμμα, και δώσουμε αρχικά (όπως θα μας ζητηθεί) τις τιμές για τους συντελεστές της εξίσωσης, καθώς και το πεδίο ορισμού, θα έχουμε τα εξής αποτελέσματα: Δευτ/θμια: x^2 + bx + c, b = 2.00, c = 4.00 Διάστημα : [L,R], L = 1.00, R = 5.00 x ελαχιστοποίησης = 1.00 Ελάχιστη τιμή της f = 7.00
Το πρόβλημα: Κάλυψη κυκλικού δίσκου Η εξίσωση που περιγράφει έναν κύκλο είναι: x 2 + y 2 = n 2 Όπου n είναι η ακτίνα του και x και y είναι οι συντεταγμένες σε ένα σημείο της περιφέρειάς του. Ο n είναι ένας θετικός ακέραιος αριθμός. Εάν σχεδιάσουμε έναν κύκλο σε χαρτί μιλιμετρέ, με τετράγωνα 1x1, για n=10, αυτός θα είναι:
Το εμβαδόν του κύκλου, ακτίνας n, θα είναι: A = π. n 2 Κάθε τετραγωνάκι θα είναι 1x1 και το εμβαδόν του 1x1=1. Εάν υπάρχουν N ολόκληρα τετραγωνάκια, τότε μπορούμε να πούμε πως το εμβαδόν θα είναι, κατά προσέγγιση: Ν π. n 2
Από τις δύο σχέσεις για το εμβαδόν του κύκλου: A = π. n 2 π = Α n 2 Ν π. n 2 π = Ν n 2 Φαίνεται πως στην 2 η περίπτωση η τιμή του π που θα προκύπτει, θα είναι προσεγγιστική (την λέω ρ n ): ρ n Ν n 2 Αφού τα τετραγωνάκια καλύπτουν σχεδόν όλο τον κύκλο το σφάλμα να είναι: ρ n π. Να γραφεί ένα πρόγραμμα που θα υπολογίζει την προσέγγιση του π, την ρ n, καθώς και το σφάλμα.
Λόγω της συμμετρίας που υπάρχει στον κύκλο, κάθε τεταρτημόριό του θα έχει τον ίδιο αριθμό ακέραιων τετραγώνων. row 10 row 9 row 8 row 7 row 6 row 5 row 4 row 3.9 τετράγωνα row 2.9 τετράγωνα row 1.9 τετράγωνα
Άρα αν βρούμε τον αριθμό Ν 1 των τετραγώνων του ενός τεταρτημορίου, ο συνολικός αριθμός τετραγώνων του κύκλου θα είναι 4Ν 1 και η προσεγγιστική τιμή του π που θα προκύπτει, θα είναι : ρ n 4Ν 1 n 2 Ο ψευδοκώδικας που θα πραγματοποιεί την ως άνω διαδικασία, θα είναι περίπου της ακόλουθης μορφής:
Αρχικά θέσε το Ν 1 = 0 Επανέλαβε για τις γραμμές 1 έως n Υπολόγισε το πλήθος των ολόκληρων τετραγώνων στην γραμμή και πρόσθεσε το πλήθος αυτό στο Ν 1. Θέσε ρ n = 4Ν 1 n 2 Ο ψευδοκώδικας εισάγει την λειτουργία της επανάληψης. Το τρέχον άθροισμα Ν 1 επαναλαμβάνεται n φορές. Τώρα που είναι το n=10, μπορούμε να το περιγράψουμε αναλυτικότερα:
Αρχικά θέσε το Ν 1 = 0 Υπολόγισε το πλήθος των ολόκληρων τετραγώνων στην γραμμή 1. Πρόσθεσε το πλήθος αυτό στο Ν 1. Υπολόγισε το πλήθος των ολόκληρων τετραγώνων στην γραμμή 2. Πρόσθεσε το πλήθος αυτό στο Ν 1. Υπολόγισε το πλήθος των ολόκληρων τετραγώνων στην γραμμή 10. Πρόσθεσε το πλήθος αυτό στο Ν 1. Θέσε ρ n = 4Ν 1 10 2
Δηλαδή χρειαζόμαστε 10 επαναλήψεις των ενεργειών. Εάν δηλαδή έχουμε περισσότερες επαναλήψεις (για μεγάλες τιμές του n) η στρατηγική αυτή είναι «βαρετή» και μη αποτελεσματική. Εδώ έρχεται η εντολή βρόχος for που μετατρέπει τον ψευδοκώδικα σε: Αρχικά θέσε το Ν 1 = 0 for k=1 :n Υπολόγισε το πλήθος των ολόκληρων τετραγώνων στην γραμμή k. Πρόσθεσε το πλήθος αυτό στο Ν 1. end Θέσε ρ n = 4Ν 1 n 2
Το πλήθος των επαναλήψεων καθορίζεται μέσα στην εντολή for, η οποία αναγνωρίζει το k ως μεταβλητή-μετρητή των επαναλήψεων. Δηλαδή εν προκειμένω το k παίρνει διαδοχικά τις τιμές 1,2,3,10. Τώρα θα πρέπει να αναπτύξουμε και μια μέθοδο για την εύρεση του πλήθους των ακέραιων τετραγώνων της κάθε γραμμής k. Σε κάθε γραμμή (row), για k=0 10, του σχήματος του τεταρτημόριου, η κάθετη συντεταγμένη θα είναι y = k.
Εάν θέσουμε την τιμή αυτή του y = k εξίσωση του κύκλου, θα είναι: στην x 2 + y 2 = n 2 x 2 + k 2 = n 2 x = n 2 k 2 Δηλαδή το πλήθος των ολόκληρων τετραγώνων της γραμμής (row) k είναι ο μεγαλύτερος ακέραιος που είναι της τιμής του x. Υπάρχει μια συνάρτηση floor του MATLAB που είναι ιδανική για την περίπτωση. Δέχεται μια πραγματική τιμή και επιστρέφει τον μεγαλύτερο ακέραιο που είναι ίσος ή μικρότερος της τιμής αυτής.
Δηλαδή η ανωτέρω σχέση: x = n 2 k 2 θα γίνει: m = floor(sqrt(n^2-k^2)) Αναθέτει στο m το πλήθος των ολόκληρων τετραγώνων της γραμμής k. Αυτός ο αριθμός m είναι που προστίθεται κάθε φορά για να ανανεωθεί ο αριθμός Ν 1 των τετραγώνων, πριν από κάθε επανάληψη. Μέσα στον βρόχο της επανάληψης, και αμέσως μετά την εκχώρηση στο m, ανανεώνουμε την τιμή του Ν 1 ως εξής: N1 = N1 + m Εδώ φαίνεται ακόμα μια φορά πως η συγκεκριμένη εντολή είναι μια εντολή εκχώρησης και όχι μια αλγεβρική πράξη.
Σύμφωνα με τα ανωτέρω (την μεθοδολογία για το m και την ανανέωση για το Ν 1 ) η εκτίμηση για την τιμή του π θα υπολογίζεται από το πρόγραμμα: N1 = 0; for k = 1:n end m = floor(sqrt(n^2-k^2)); N1 = N1 + m; Rho_n = 4*N1/n^2; Όπου Rho_n είναι η μεταβλητή ρ n του ψευδοκώδικα. Η δομή της εντολής for καθώς και ή εξέλιξη της διαδικασίας θα είναι:
Μεταβλητή Μετρητής Όριο Έναρξης Όριο Τερματισμού Λέξεις Κλειδιά for k = 1:10 m = floor(sqrt(n^2-k^2)); N1 = N1 + m; end Το σώμα του Βρόχου Η διαδικασία N o περάσματος k m N1 Μετά από 1 πέρασμα 1 9 9 Μετά από 2 περάσματα 2 9 18..και η επανάληψη ολοκληρώνεται ως εξής: Μετά από 8 περάσματα 8 6 65 Μετά από 9 περάσματα 9 4 69 Μετά από 10 περάσματα 10 0 69
% Script Eg2_1 % Προσέγγιση του π μέσω "κάλυψης" % Διάβασε την ακτίνα του δίσκου... clc n = input('δώσε την ακτίνα του κύκλου n: '); % Κάλυψε το πρώτο τεταρτημόριο και μετά πολλαπλασίασε επί 4... N1 = 0; for k = 1:n % Πρόσθεσε το πλήθος των ολόκληρων τετραγώνων της % γραμμής k... m = floor(sqrt(n^2 - k^2)); N1 = N1 + m; end % Εμφάνισε την προσέγγιση... rho_n = 4*N1/n^2; clc fprintf('n = %1d\n',n) fprintf('rho_n = %12.8f\n',rho_n) fprintf('σφάλμα = %12.8f\n',abs(pi-rho_n)) Η floor στρογγυλοποιεί την τιμή προς τον προς τον μικρότερο ακέραιο
Αποτελέσματα για n=10000 n = 10000 rho_n = 3.14119052 Σφάλμα = 0.00040213
Επισκόπηση Η εντολή for χρησιμοποιείται σε περιπτώσεις όπου ένα τμήμα του κώδικα πρέπει να εκτελεσθεί κατ επανάληψη και το πλήθος των επαναλήψεων είναι εκ των προτέρων γνωστό: for μετρητής = 1: αριθμητική έκφραση τμήμα κώδικα end Το πλήθος των επαναλήψεων καθορίζεται από την αριθμητική έκφραση. Το τμήμα κώδικα λέγεται και σώμα του βρόχου. Ο μετρητής λέγεται και μεταβλητή βρόχου ή δείκτης βρόχου και η τιμή του δεν πρέπει ποτέ να τροποποιείται μέσα στον βρόχο.
for k = 1:3 fprintf('k=%1d\n',k) end itmax = 100; for k = 1:itMax fprintf('k=%1d\n',k) end Παραδείγματα itn = input('δώσε το πλήθος των επαναλήψεων: '); for k = 1:min(itN,100) fprintf('k=%1d\n',k) end