Professional Documents
Culture Documents
Επιστημονικός Προγραμματισμός
με χρήση του GNU Octave / Matlab®
Π ΡΟΛΟΓΟΣ
Το ανά χείρας έργο, εκπονήθηκε στο πλαίσιο των σεμιναρίων με τίτλο Επι-
στημονικός Προγραμματισμός με χρήση του GNU Octave / Matlab ® ,
τα οποία οργάνωσε ο εκπαιδευτικός όμιλος ΠΛ ΑΤ Ω Ν σε συνεργασία με το
συγγραφέα. Κύριος στόχος του εγχειριδίου είναι η εξυπηρέτηση των ανα-
γκών του σεμιναρίου και ως εκ τούτου, παρέχει μία συλλογή εργαστηριακών
ασκήσεων διεπιστημονικής θεματολογίας, ώστε να επιτύχει την ανάπτυξη
λειτουργικής αλγοριθμικής σκέψης, για την αντιμετώπιση επιστημονικών
προβλημάτων. Το έργο αυτό, όπως και το αντίστοιχο σεμινάριο, απευθύνεται
σε ερευνητές, εκπαιδευτικούς και σπουδαστές θετικών, πολυτεχνικών, οικο-
νομικών και ιατρικών ειδικοτήτων, καθώς και στους λοιπούς επαγγελματίες
που επιθυμούν να εκσυγχρονίσουν τις γνωσιακές τους υποδομές με χρήση
υπολογιστικών μοντέλων, προσομοιώσεων και στατιστικών μεθόδων.
1
2
ΠΕ ΡΙΕ ΧΟΜΕ ΝΑ
Ε ΝΟ ΤΗ ΤΑ Β . Στοιχεία Προγραμματισμού
1 Πρελούδιο 27
2 Λογικοί τελεστές 31
3 Δομές ελέγχου ροής 34
4 Ομαδοποίησης δεδομένων 37
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 3
4
Ε ΝΟ ΤΗ ΤΑ Α
>> lookfor('quit') E NT E R
dbquit Quit debugging mode immediately without further
code execution and return to the Octave prompt.
quit Exit the current Octave session.
lu luinc luupdate
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 5
τρέχουσα συνεδρία, δηλαδή για την έξοδο μας από το Octave, πληκτρολο-
γούμε μία από τις συναρτήσεις quit ή exit, ακολουθούμενη από χτύπο του
πλήκτρου E NTE R .
Το Octave τυπώνει την απάντηση στην οθόνη και εκχωρεί την υπολογισθεί-
σα τιμή στη μεταβλητή ans. Για να αλλάξουμε τη μορφοποίηση εκτύπωσης
των αριθμών στην οθόνη, χρησιμοποιούμε τη συνάρτηση format με βασικά
ορίσματα short (προεπιλογή) και long.
>> pi
ans = 3.1416
>> format('long')
>> pi
ans = 3.14159265358979
6
Το Octave γνωρίζει μεγάλο πλήθος μαθηματικών συναρτήσεων. Μία
συνάρτηση καλείται με το όνομά της, ακολουθούμενο από πιθανά ορίσματα
εγκλεισμένα εντός παρενθέσεων και χωρισμένα με κόμματα.
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 7
όπου sqrt(x) είναι η τετραγωνική ρίζα του x.
>> var = 3
var = 3
>> x = 1
x = 1
>> var, x
var = 3
x = 1
>> x0 = sin(2*pi)
x0 = -2.4493e-16
>> y_0 = factorial(4)
y_0 = 24
>> 1x
parse error:
syntax error
>>> 1x
^
8
όπου η συνάρτηση factorial επιστρέφει το παραγοντικό 4, δηλαδή τον
αριθμό 4!=1·2·3·4=24. Γράμματα διαφορετικής κεφαλαιοποίησης αντιστοι-
χούν σε διαφορετικά αναγνωριστικά ονόματα, δηλαδή το πεζό όνομα a λαμ-
βάνεται από το Octave ως διαφορετικό του αντίστοιχου κεφαλαίου A,
>> namelengthmax
ans = 63
>> this_is_a_long_var_name = ( pi*(A - a) + pi*(a - A) ) / pi
this_is_a_long_var_name = 0
>> tan(pi/4)
ans = 1.00000
>> tan = 7.2
tan = 7.2000
>> tan(pi/4)
error: subscript indices must be either positive integers
less than
2^31 or logicals
>> which('tan')
'tan' is a variable
>> clear('all')
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 9
>> which('tan')
'tan' is a built-in function from the file
libinterp/corefcn/mappers.cc
4 Συστοιχίες δεδομένων
Ένας πίνακας A με m γραμμές και n στήλες είναι ένα σύνολο m·n πραγματι-
κών ή μιγαδικών αριθμών aij που τοποθετούνται στη δομή
και γράφουμε A=(aij). Αν m=n, δηλαδή στην περίπτωση που το πλήθος των
γραμμών του πίνακα ισούται με το πλήθος των στηλών του, ο πίνακας A
10
ονομάζεται τετραγωνικός. Ένας πίνακας, για τον οποίο m=1 ονομάζεται
διάνυσμα γραμμή, ενώ αν n=1, τότε ο πίνακας ονομάζεται διάνυσμα στήλη.
Συμβατικά, θεωρούμε ότι κάθε διάνυσμα x είναι διάνυσμα στήλη και ως εκ
τούτου το ανεστραμμένο διάνυσμα x⊤ είναι διάνυσμα γραμμή.
Για να εισάγουμε έναν πίνακα στο Octave, πληκτρολογούμε τα στοιχεία
αυτού εντός αγκυλών [], χωρίζοντας τα στοιχεία που βρίσκονται στην ίδια
γραμμή με κόμματα , (ή διάκενα), ενώ το τέλος κάθε γραμμής επιτυγχάνε-
ται με το χαρακτήρα ;, για παράδειγμα
>> A = [1, 3, 5; 2, 4, 6]
A =
1 3 5
2 4 6
Στο παράδειγμα αυτό, ο πίνακας A έχει m=2 γραμμές και n=3 στήλες. Η συ-
νάρτηση size επιστρέφει τον αριθμό των γραμμών και τον αριθμό των στη-
λών ενός πίνακα,
>> numel(A)
ans = 6
Το στοιχείο aij του πίνακα A μπορεί να ληφθεί με χρήση του ονόματος της
μεταβλητής του πίνακα A, ακολουθούμενο από τους ακεραίους i, j εντός
παρενθέσεων, δηλαδή A(i,j). Για παράδειγμα
>> A(1,2)
ans = 3
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 11
Η i γραμμή του πίνακα A μπορεί να ληφθεί με την έκφραση A(i,:), ενώ η j
στήλη αυτού με την έκφραση A(:,j). Επιπλέον, τμήματα του πίνακα A μπο-
ρούν να εξαχθούν με εκφράσεις της μορφής A(idx_r,idx_c), όπου τα διανύ-
σματα idx_r, idx_c είναι διανύσματα με στοιχεία τους δείκτες των γραμμών
και των στηλών που επιθυμούμε να λάβουμε, όπως φαίνεται στο ακόλουθο
παράδειγμα.
όπου η λέξη end, ανάλογα με τη θέση της, αναφέρεται στον αριθμό των
γραμμών ή στον αριθμό των στηλών του πίνακα A, δηλαδή στους αριθμούς
size(A,1) και size(A,2), αντίστοιχα.
Ένας νέος πίνακας μπορεί να σχηματιστεί με συνένωση δύο συστοιχιών
A και Β. Αν οι συστοιχίες A και B έχουν ίδιο αριθμό γραμμών, τότε είναι δυνα-
τή η οριζόντια συνένωση αυτών, η οποία πραγματοποιείται με χρήση της συ-
νάρτησης horzcat ή πιο απλά πληκτρολογώντας [A,B]. Στην περίπτωση που
οι Α, Β έχουν ίδιο αριθμό στηλών, τότε μπορούμε να πραγματοποιήσουμε κα-
τακόρυφη συνένωση με τη συνάρτηση vertcat ή με την έκφραση [A;B].
12
2 4 2 4
1 3 1 3
2 4 2 4
>> kron(ones(2), A)
ans =
1 3 1 3
2 4 2 4
1 3 1 3
2 4 2 4
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 13
σχήμα του με τη συνάρτηση reshape, να παράγουμε ένα διάνυσμα στήλη το-
ποθετώντας διαδοχικά τις στήλες αυτού με την έκφραση A(:) και να ανα-
διατάξουμε τα στοιχεία του με περιστροφή και με συμμετρική αναστροφή ως
προς τις γραμμές ή ως προς τις στήλες με τις συναρτήσεις rot90, flipud και
fliplr.
>> A = [1, 3; 2, 4]
A =
1 3
2 4
>> fliplr(rot90(A(:)))
ans =
4 3 2 1
>> x = 0:0.1:0.4
x =
0.00000 0.10000 0.20000 0.30000 0.40000
>> y = 0:4
y =
0 1 2 3 4
>> ( x.*y ).^2
ans =
0.00000 0.01000 0.16000 0.81000 2.56000
14
Σημειώνουμε ότι οι εκφράσεις της μορφής a:h:b παράγουν τα διανύσματα
γραμμές (a a+h a+2h ... b-h b), τα οποία ονομάζονται και εύρη. Εναλλα-
κτικά, για να παράγουμε ένα εύρος, μπορούμε να χρησιμοποιήσουμε τη συ-
νάρτηση linspace, η οποία εξασφαλίζει ότι τα άκρα a, b περιέχονται στο εύ-
ρος.
>> linspace(4, 5, 6)
ans =
4.0000 4.2000 4.4000 4.6000 4.8000 5.0000
όπου οι αριθμοί 4, 5 καθορίζουν την αρχή και το πέρας του εύρους, ενώ ο
αριθμός 6 ορίζει το πλήθος των στοιχείων του παραγόμενου διανύσματος,
δηλαδή έχουμε numel(linspace(a,b,n))=n.
Ακολουθεί μία εφαρμογή των παραπάνω, στην οποία υπολογίζουμε το
άθροισμα των στοιχείων ενός διανύσματος με χρήση του εσωτερικού γινο-
μένου ( ∙ , ∙ ) : ℝn×ℝn→ℝ, το οποίο μπορεί να γραφεί
>> x = transpose(0:0.5:3);
>> m = size(x, 1);
>> u = ones(m, 1);
>> transpose(x) * u
ans = 10.500
>> transpose(u) * x
ans = 10.500
>> sum(x)
ans = 10.500
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 15
όπου η συνάρτηση transpose κατασκευάζει την ανάστροφη συστοιχία και η
συνάρτηση sum υπολογίζει το άθροισμα των στοιχείων ενός διανύσματος.
Η αριθμητική επίλυση προβλημάτων συνεχών χωροχρονικών μεταβλη-
τών απαιτεί τη διακριτοποίηση του χώρου και του χρόνου. Αρκετά συχνά, η
μετάβαση από το συνεχές πρόβλημα στο διακριτό οδηγεί στο σχηματισμό
γραμμικών συστημάτων και προβλημάτων ιδιοτιμών, τα οποία στο Octave
επιλύονται με χρήση των συναρτήσεων mldivide (ή \) και eig (και eigs)
αντίστοιχα.
16
ΣΥ ΝΑΡΤ ΗΣ Η ΠΕ ΡΙΓ ΡΑΦΗ ΠΑΡΑΔΕ ΙΓΜΑ
5 Παραγωγή γραφικών
Η κύρια συνάρτηση παραγωγής γραφικών είναι η συνάρτηση plot. Για να
παράγουμε τη γραφική παράσταση μίας συνάρτησης f : X→ℝ, όπου Χ⊂ℝ,
ορίζουμε μία διακριτή εκδοχή Χh του πεδίου ορισμού Χ της f με χρήση της
συνάρτησης linspace, υπολογίζουμε τις τιμές της f στα στοιχεία του Χh και
καλούμε τη συνάρτηση plot. Για παράδειγμα, η γραφική παράσταση της συ-
νάρτησης f : [0,2π]→ℝ με τύπο f(x)=x2sin(x) μπορεί να παραχθεί ως ακο-
λούθως.
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 17
>> x = linspace(0, 2*pi, 100);
>> f = x.^2 .* sin(x);
>> plot(x, f, 'k', 'LineWidth', 3);
18
όπου το όρισμα της συνάρτησης axis είναι το διάνυσμα με στοιχεία τα άκρα
του οριζόντιου και κατακόρυφου άξονα διαδοχικά, το όρισμα 'k' ορίζει το
μαύρο ως χρώμα γραμμής και το πάχος της γραμμής καθορίζεται από το
όρισμα 'LineWidth'. Για να αποθηκεύσουμε τη γραφική παράσταση ως έγ-
χρωμη εικόνα διανυσματικών γραφικών eps, πληκτρολογούμε στη γραμμή
εντολών
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 19
ylabel('J0(x)');
title('Inaccurate Bessel function');
lgnd = legend('Bessel function', ...
'Measured data', ...
'Upper bound', 'Lower bound');
set(lgnd, 'Color', 'w', 'FontSize', 18);
axis('tight');
>> besselplot
>> print('-deps', 'besselplot.eps')
>> pwd
ans = /home/fotis/Desktop/seminar
>> ls
code pics refs themes
20
>> cd code
>> pwd
ans = /home/fotis/Desktop/seminar/code
όπου η εντολή pwd εκτυπώνει στην οθόνη τη διαδρομή του τρέχοντα κα-
τάλογου και η εντολή ls εμφανίζει τα αρχεία του καταλόγου αυτού.
Κατά την κίνηση Brown θεωρούμε μία τυχαία μεταβλητή W(t), όπου
t∈[0,Τ], για την οποία W(0)=0 με πιθανότητα ένα, W(t)-W(s)=(t-s)1/2N(0,1),
όπου 0≤s<t και Ν(0,1) τυχαία μεταβλητή κανονικής κατανομής μηδενικής
μέσης τιμής και μοναδιαίας διακύμανσης και οι μεταβολές W(t)-W(s) και
W(v)-W(u), όπου 0≤s<t<u<v≤Τ, είναι ανεξάρτητες. Έπειτα από διακριτο-
ποίηση Τ=Nδt του χρονικού διαστήματος [0,Τ], λαμβάνουμε τον ακόλουθο
κώδικα προσομοίωσης, όπου υπολογίζουμε τις τιμές U(W(t))=et+0.5W(t).
randn('state', 100);
T = 1; N = 500; dt = T/N; t = dt:dt:T;
M = 50;
dW = sqrt(dt) * randn(M, N);
W = cumsum(dW, 2);
U = exp(repmat(t, [M, 1]) + 0.5*W);
Umean = mean(U);
plot([0, t], [1, Umean], 'k', 'LineWidth', 3); hold('on');
plot([0, t],[ones(M, 1), U(1:M, :)], 'k'); hold('off');
xlabel('t'); ylabel('U(t)');
legend('Mean of 50 paths', 'Individual paths', ...
'location', 'northwest');
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 21
Η συνάρτηση plot μπορεί να χρησιμοποιηθεί για το σχεδιασμό καμπύλων
που δίνονται σε παραμετρική μορφή, για παράδειγμα, η καμπύλη με εξι-
σώσεις x(t)=cos(20t)·(1-sin(t)) και y(t)=sin(20t), όπου 0≤t≤2π μπορεί να σχε-
διαστεί ως ακολούθως.
22
Για τη γραφική αναπαράσταση επιφανειών χρησιμοποιούμε τις συναρτήσεις
surf και mesh, όπως στο παράδειγμα που ακολουθεί, όπου η συνάρτηση
meshgrid κατασκευή των ζευγών (x,y), στα οποία υπολογίζουμε τις τιμές της
συνάρτησης που επιθυμούμε να σχεδιάσουμε.
x = -2:0.1:2; y = -2:0.1:2;
[X, Y] = meshgrid(x, y);
Z = X .* exp(- X.^2 - Y.^2);
surf(X, Y, Z);
xlabel('x'); ylabel('y'); zlabel('z');
axis('tight');
colormap('gray');
colorbar();
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 23
Ακολουθούν παραδείγματα των συναρτήσεων quiver και contourf. Η
συνάρτηση quiver σχεδιάζει το διανυσματικό πεδίο u(x,y), v(x,y) και η συ-
νάρτηση contourf τις ισοϋψείς επιφάνειες μίας συνάρτησης. Αν θέλουμε
μόνο τις ισοϋψείς γραμμές, τότε αντί της contourf κάνουμε χρήση της
contour.
x = -2:0.1:2; y = -2:0.1:2;
[X, Y] = meshgrid(x, y);
Z = X .* exp(- X.^2 - Y.^2);
xlabel('x'); ylabel('y');
axis('tight', 'square');
contourf(X, Y, Z, 20);
colormap('gray'); colorbar();
24
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 25
26
Ε ΝΟ ΤΗ ΤΑ B
Στοιχεία Προγραμματισμού
1 Αρχεία .m και συναρτήσεις
Στην παράγραφο Α.5 παρατηρήσαμε ότι ένα σύνολο οδηγιών μπορεί να το-
ποθετηθεί σε ένα αρχείο απλού κειμένου (κείμενο χωρίς δυνατότητα μορφο-
ποίησης) με επέκταση .m και να εκτελεστεί με πληκτρολόγηση του ονόματός
του στην προτροπή του Octave. Τα αρχεία αυτά τα ονομάσαμε αρχεία συλ-
λογής εντολών και η χρησιμότητά τους έγκειται στη δυνατότητα άμεσης
επανάληψης του υπολογιστικού πειράματος που καθορίζει το περιεχόμενό
τους. Εκτός από συνήθεις εντολές, ένα αρχείο .m, δύναται να ορίζει μία συ-
νάρτηση, η οποία εξυπηρετεί την επίλυση ενός συγκεκριμένου προβλήμα-
τος. Η γενική δομή ενός αρχείου συνάρτησης του Octave είναι
function [ y ] = dsquare( x )
y = 2 .* x.^2;
endfunction
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 27
Αποθηκεύοντας τις παραπάνω οδηγίες σε ένα αρχείο ονόματος dsquare.m,
μπορούμε να καλέσουμε τη συνάρτηση dsquare στη γραμμή εντολών του
Octave, όπως κάθε άλλη συνάρτηση, αρκεί το αρχείο να βρίσκεται στον
τρέχοντα κατάλογο, για παράδειγμα
>> a = dsquare(2)
a = 8
>> A = [1, 2; 3, 4]
A =
1 2
3 4
>> B = dsquare(A)
B =
2 8
18 32
Η συνάρτηση complexder δέχεται δύο ή τρία ορίσματα στην είσοδο και επι-
στρέφει την τιμή της παραγώγου της δοθείσας συνάρτησης f στα x0. Παρα-
28
τηρούμε ότι, στο Octave, όταν ορίζουμε μία συνάρτηση και σε κάποια από
τις μεταβλητές εισόδου δώσουμε τιμή, όπως στο παράδειγμα όπου h=1e-8,
τότε η τιμή αυτή είναι η προεπιλεγμένη και δεν είναι αναγκαίο να εισαχθεί
από το χρήστη κατά την κλίση της συνάρτησης. Ωστόσο, ο τρόπος αυτός
αφορά αποκλειστικά στο Octave και δε λειτουργεί στο Matlab, στο οποίο θα
πραγματοποιείται με την προσθήκη του κώδικα
if (nargin == 2)
h = 1e-8;
end
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 29
Σε αυτό το σημείο σημειώνουμε ότι η παράγωγος της συνάρτησης με τύπο
f(x)=sin(x) έχει τύπο f´(x)=cos(x) και από το σχήμα συμπεραίνουμε ότι η
προσέγγιση της παραγώγου με τη μέθοδο του μιγαδικού βήματος είναι ικα-
νοποιητική στην οπτική στάθμη.
Οι μεταβλητές που χρησιμοποιούμε εντός των αρχείων που ορίζουν συ-
ναρτήσεις είναι τοπικές, δηλαδή δημιουργούνται για να εξυπηρετήσουν την
εκτέλεση μίας συνάρτησης και καταστρέφονται μετά το πέρας της εκτέλε-
σης, ώστε το Octave δε θυμάται τις τιμές τους μετά της εμφάνισης της προ-
τροπής.
Πολύ συχνά, ο κώδικας που έχουμε γράψει επιστρέφει εσφαλμένα ή και
καθόλου αποτελέσματα εξαιτίας συντακτικών ή άλλων λαθών. Η τεχνική
της αποσφαλμάτωσης, δηλαδή της εύρεσης των σφαλμάτων αυτών, πραγμα-
τοποιείται με εισαγωγή της οδηγίας keyboard στον κώδικα μας. Η συνάρτη-
ση keyboard διακόπτει τη ροή εκτέλεσης μίας συνάρτησης και δίνει τον
έλεγχο στο πληκτρολόγιο, ώστε να ελεγχθούν ενδιάμεσες τιμές των τοπι-
κών μεταβλητών και να βρεθούν τα σφάλματα. Για τη διακοπή της λειτουρ-
γίας αποσφαλμάτωσης, ο χρήστης πληκτρολογεί την εντολή dbcont, η οποία
επιτρέπει στη συνάρτηση να ολοκληρωθεί, ή την εντολή return (ή dbquit),
η οποία διακόπτει άμεσα την εκτέλεση της συνάρτησης.
Επιπλέον, το Octave παρέχει χρήσιμα εργαλεία που αφορούν στη με-
λέτη της χρονικής απόδοσης του κώδικα μας, όπως είναι η μέτρηση του
χρόνου εκτέλεσης με τις συναρτήσεις tic και toc,
30
>> profile('on'); sqrt(randn(1000,1000)); profile('off');
>> profshow(profile('info'))
# Function Attr Time (s) Time (%) Calls
------------------------------------------------------------------
1 randn 0.049 71.61 1
2 sqrt 0.019 28.29 1
3 profile 0.000 0.08 1
6 false 0.000 0.01 1
4 nargin 0.000 0.00 1
5 binary != 0.000 0.00 1
7 __profiler_enable__ 0.000 0.00 1
>> profile('on');
>> <οδηγίες>
>> profile('viewer');
Στο Octave, παρά τον ασθενή βαθμό ωρίμανσης, η profile παρέχει μία αρ-
κούντως ικανοποιητική εικόνα των στενώσεων και των κωλυμάτων του
κώδικα μας και προσφέρει ένα δείκτη που συνεισφέρει στη βελτίωση της
απόδοσής του.
2 Λογικοί τελεστές
Ένας λογικός τελεστής συγκρίνει δύο προτάσεις και αποτέλεσμα της σύ-
γκρισης αυτής είναι μία εκ των τιμών αληθής ( 1), ψευδής (0). Αν μία μετα-
βλητή ονόματος x έχει την τιμή 1 και γράψουμε x=x+1, τότε επαναορίζουμε
το περιεχόμενό της και μετά την εκχώρηση, η τιμή του x είναι 2. Επιπλέον,
παρατηρούμε ότι η x=x+1 δεν έχει υπολογιστικό νόημα ως εξίσωση διότι, αν
ήταν εξίσωση, θα είχαμε 0=1, δηλαδή θα ήταν μονίμως αδύνατη, αφού το
αποτέλεσμα είναι προφανώς αναληθές. Ο τελεστής ελέγχου της λογικής
αλήθειας είναι ο τελεστής ==, για παράδειγμα, η δήλωση 2==2 είναι αληθής
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 31
και, στο Octave, επιστρέφει την τιμή 1. Για να αποφευχθεί σύγχυση των πα-
ραπάνω, στη θεωρία αλγορίθμων ο τελεστής εκχώρησης πολλές φορές
γράφεται ←, για παράδειγμα x←2, χωρίς ωστόσο να χρησιμοποιείται ευρέως
στις γλώσσες προγραμματισμού. Ένα παράδειγμα γλώσσας που επιτρέπει
την εκχώρηση x<-2 είναι η γλώσσα στατιστικού προγραμματισμού R. Η κα-
τάσταση περιπλέκεται περισσότερο, αν σκεφτούμε ότι για πίνακες, η λογική
ισότητα μπορεί να οριστεί τοπικά (ή στοιχειακά) και καθολικά, για πα-
ράδειγμα έχουμε
>> A = [1, 2; 3, 4]
A =
32
1 2
3 4
>> A > 2
ans =
0 0
1 1
>> A(A>2)
ans =
3
4
>> A .* (A > 2)
ans =
0 0
3 4
>> find(A>2)
ans =
2
4
όπου η συνάρτηση find επιστρέφει τις θέσεις στις οποίες η συνθήκη A>2 εί-
ναι αληθής, δεδομένης της εσωτερικής αναπαράστασης Α(:) του πίνακα Α.
Αναφέρουμε ότι ο τελεστής & (και ή λογική σύζευξη) επιστρέφει την τιμή
αληθής, αν και οι δύο προτάσεις είναι αληθείς, ενώ ο τελεστής | (ή ή λογική
διάζευξη) επιστρέφει την τιμή αληθής, αν μία τουλάχιστον από τις προτάσεις
είναι αληθής, δηλαδή
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 33
3 Δομές ελέγχου ροής
Στον προγραμματισμό, είναι ιδιαίτερα σημαντικό να μπορούμε να αλλάζου-
με τη ροή ενός προγράμματος. Για το σκοπό αυτό, το Octave προσφέρει δο-
μές απόφασης if/else/elseif, switch/case και οι επαναληπτικοί βρόγχοι
for και while. Στο ακόλουθο παράδειγμα, το οποίο αφορά στη χρήση της
if, θεωρούμε έναν τυχαίο αριθμό στο διάστημα (0,1) και θέλουμε να αποφα-
σίσουμε τη διαδρομή που θα ακολουθήσει ένα σωματίδιο ανάλογα με το εύ-
ρος, στο οποίο ανήκει ο τυχαίος αριθμός. Έχουμε
>> r = rand();
>> if (r < 0.25)
>> x = -1; y = 0;
>> elseif (r < 0.5)
>> x = +1; y = 0;
>> elseif (r < 0.75)
>> x = 0; y = -1;
>> else
>> x = 0; y = +1;
>> endif
>> x, y
x = -1
y = 0
if (<λογική_έκφραση>)
<οδηγίες>
elseif (<λογική_έκφραση>)
<οδηγίες>
...
else (<λογική_έκφραση>)
<οδηγίες>
endif
34
λαδή true ή 1, τότε έπεται ο υπολογισμός της οδηγίας που ακολουθεί. Επι-
πλέον, σημειώνουμε ότι δε χρειάζεται να ορίσουμε διαστήματα με εκφράσεις
(r < 0.5) & (r >= 0.25), αφού για να βρεθούμε στη γραμμή elseif (r <
0.5) έχουμε προσπεράσει τη γραμμή if (r < 0.25) ως αναληθή και ως εκ
τούτου, είναι r >= 0.25. Τέλος, ορίσαμε το πέρας της δομής απόφασης με
χρήση της λέξης endif. Ο τρόπος αυτός γίνεται αποδεκτός μόνο από το
Octave και προτείνεται από την κοινότητά του, αντί της λέξης end, η οποία
είναι συντακτικά ορθή και στα δύο προγράμματα.
Ο επαναληπτικός βρόγχος for εξυπηρετεί αλγόριθμους, οι οποίοι εκτε-
λούν επαναλαμβανόμενα ένα σύνολο οδηγιών και συντάσσεται ως ακολού-
θως.
for count=<αρχική_τιμή>:<βήμα>:<τελική_τιμή>
<οδηγίες>
end
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 35
οι επαναληπτικοί βρόγχοι εκτελούνται ιδιαίτερα αργά και ως εκ τούτου, εί-
ναι προτιμότερο να αποφεύγονται και να αντικαθιστώνται με διανυσματι-
κούς υπολογισμούς, όταν αυτό είναι εφικτό. Αν ένας βρόγχος είναι ανα-
πόφευκτος και πρέπει να προσπελάσει τα στοιχεία ενός πίνακα, τότε λόγω
του τρόπου που το Octave αποθηκεύει τους πίνακες στη μνήμη του η/υ, η
προσπέλαση αυτή είναι ταχύτερη, αν γίνει κατά τις στήλες του πίνακα. Κλεί-
νουμε την παράγραφο αυτή με το παράδειγμα που ακολουθεί.
36
4 Ομαδοποίησης δεδομένων
Το Octave υποστηρίζει δύο μηχανισμούς, οι οποίοι επιτρέπουν τη συλλογή
δεδομένων διαφορετικών τύπων στην ίδια μεταβλητή, τις δομές και τα κε-
λιά. Οι δομές προσφέρουν έναν εύχρηστο τρόπο ονομαστικής ομαδοποίη-
σης των δεδομένων μας. Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να
προσομοιώσουμε τη βολή ενός υλικού σημείου και ως εκ τούτου, απαιτείται
η αποθήκευση της μάζας m του υλικού σημείου, του διανύσματος θέσης r
και του διανύσματος της ταχύτητας v. Μπορούμε να συλλέξουμε τα παρα-
πάνω δεδομένα σε μία δομή ως ακολούθως.
Κάθε συνιστώσα της δομής ονομάζεται πεδίο και το περιεχόμενο κάθε πεδί-
ου μπορεί να εξεταστεί ή να αλλαχθεί,
Σε αυτό το σημείο, πρέπει να αναφέρουμε ότι το πεδίο size είναι τύπου συμ-
βολοσειράς, δηλαδή μίας ακολουθίας χαρακτήρων, και αποθηκεύεται ως μη
αριθμητικό διάνυσμα,
>> typeinfo(ball.size)
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 37
ans = sq_string
Εξετάζοντας μία προς μία τις συνιστώσες του διανύσματος του πεδίου size
της δομής ball παίρνουμε
>> ball.size(1)
ans = h
>> ball.size(2)
ans = u
>> ball.size(3)
ans = g
>> ball.size(4)
ans = e
Τα κελιά είναι πίνακες γενικής (και όχι μαθηματικής) χρήσης και κατα-
σκευάζονται με το συνήθη τρόπο κατασκευής πινάκων, αλλά με χρήση άγκι-
στρων {} αντί αγκύλων []. Κάθε στοιχείο ενός κελιού μπορεί να περιέχει δε-
δομένα διαφορετικού τύπου και διάστασης.
38
[1,1] =
0.518049 0.358001 0.077326 0.706761
[1,2] = Monday
[1,3] = 10.280
[1,4] = January
}
>> A{1}(2)
ans = 0.35800
>> A{2}
ans = Monday
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 39
40
Ε ΝΟ ΤΗ ΤΑ Γ
>> format('bit')
>> 3.23
ans = 0100000000001001110101110000101000
111101011100001010001111010111
>> format('short')
ενώ η συνάρτηση eps επιστρέφει το έψιλον της μηχανής εM=2-52, δηλαδή την
απόσταση του αριθμού 1.0 από τον επόμενο αναπαραστήσιμο αριθμό κινη-
τής υποδιαστολής.
>> eps()
ans = 2.2204e-16
>> eps(1)
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 41
ans = 2.2204e-16
42
>> format('long');
>> a = 1e-4; b = 1/a; c = -a;
>> x1 = (-b + sqrt(b^2 - 4*a*c)) / (2*a)
x1 = 9.09494701772928e-09
>> rer = 100 * abs(x1 - 1e-8) / 1e-8
rer = 9.05052982270718
2 Πολυώνυμα
Στο Octave, ο ορισμός ενός πολυωνύμου p(x)=anxn+an-1xn-1+...+a1x+a0 πραγ-
ματοποιείται με εισαγωγή των συντελεστών ai σε ένα διάνυσμα, συμπερι-
λαμβανομένων των μηδενικών συντελεστών. Για παράδειγμα, το διάνυσμα
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 43
>> transpose(roots(p))
ans =
-1 1
>> polyder(p)
ans =
2 0
>> polyint(p)
ans =
0.33333 0.00000 -1.00000 0.00000
ΘΕΩ ΡΗ ΜΑ B OL Z A NO
Έστω ένα διάστημα Δ=[α,β] και μία ορισμένη στο Δ συνάρτηση f. Αν η f εί-
ναι συνεχής στο Δ και αλλάζει πρόσημο σε αυτό, δηλαδή αν f(α)f(β)<0, τότε
η εξίσωση f(x)=0 έχει τουλάχιστον μία ρίζα στο διάστημα (α,β).
44
Ένας αλγόριθμος που υλοποιεί τον παραπάνω αλγόριθμο παρέχεται από τη
συνάρτηση fzero, της οποίας η χρήση φαίνεται ακολούθως.
f = @(x) x.^2 - 1;
x = linspace(-2, 2, 100);
plot(x, f(x), 'k', 'LineWidth', 3);
hold('on');
plot([-1, 1], [0, 0], '.k', 'MarkerSize', 12);
hold('off');
grid('minor'); axis('tight');
xlabel('x'); ylabel('f(x)');
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 45
sin(xy)+e-xy-0.95908=0, z(x2+y2)1/2-6.7082=0, tan(x/y)+cos(z)+3.17503=0
function [ J ] = systemEq(x)
J = zeros (3, 1);
J(1) = sin(x(1)*x(2)) + exp(-x(1)*x(3)) - 0.95908;
J(2) = x(3)*sqrt(x(1)^2 + x(2)^2) - 6.7082;
J(3) = tan(x(2)/x(1)) + cos (x(3)) + 3.17503;
endfunction
4 Ελάχιστα τετράγωνα
Έστω το σύστημα Ax=b, το οποίο είναι υπερπροσδιορισμένο, δηλαδή ο
αριθμός των εξισώσεων είναι μεγαλύτερος από το πλήθος των αγνώστων.
Αυτό σημαίνει ότι ο αριθμός των γραμμών του πίνακα Α είναι μεγαλύτερος
από τις στήλες αυτού. Στην περίπτωση αυτή, το σύστημα δεν έχει λύση και
το υπόλοιπο είναι ε(x)=Ax-b για κάθε x. Η μέθοδος των ελάχιστων τετρα-
γώνων στοχεύει στην εύρεση του x* που ελαχιστοποιεί το άθροισμα των τε-
τραγώνων των συνιστωσών του διανύσματος ε(x), δηλαδή
min [ε1(x)]2+[ε2(x)]2+...+[εn-1(x)]2+[εn(x)]2
46
Αποδεικνύεται ότι, υπό προϋποθέσεις, η λύση x* ικανοποιεί το σύστημα
A⊤Ax*=A⊤b. Ο παραπάνω φορμαλισμός της γραμμικής άλγεβρας είναι ιδιαί-
τερα χρήσιμος, ωστόσο δεν είναι ο συνήθης τρόπος γραφής από τους στατι-
στικολόγους, οι οποίοι ονομάζουν την παραπάνω στρατηγική παλινδρόμη-
ση. Στο Octave, η συνάρτηση polyfit λύνει το πρόβλημα των ελάχιστων τε-
τραγώνων, του οποίου η λύση είναι βέλτιστη υπό την έννοια που προανα-
φέρθηκε. Για παράδειγμα, θεωρούμε ένα νέφος σημείων του επιπέδου και
θέλουμε να βρούμε την ευθεία της γραμμικής παλινδρόμησης.
5 Αριθμητική ολοκλήρωση
Στο Octave, το ορισμένο ολοκλήρωμα μίας συνάρτησης f υπολογίζεται με τη
συνάρτηση quad (quadl, quadv, trapz). Υποθέτουμε ότι θέλουμε να υπολογί-
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 47
σουμε το μήκος s της γραφικής παράστασης της συνάρτησης με τύπο
f(x)=x2sin(5x) στο διάστημα [0,1]. Έχουμε
1 1
2 2 2
s=∫ √ 1+[f '( x)] dx ή s=∫ √ 1+x ( 5x cos (5x)+2sin (5 x)) dx
0 0
όπου η πρώτη τιμή είναι η τιμή του ολοκληρώματος, η δεύτερη τιμή είναι ο
δείκτης επιτυχούς υπολογισμού (0 για επιτυχία), ο τρίτος αριθμός δηλώνει
το πλήθος των κλίσεων της f, και o τελευταίος παρέχει μία εκτίμηση του
σφάλματος.
48
Ε ΝΟ Τ Η ΤΑ Δ
Ε ΡΓΑΣ ΙΕ Σ
α) Να αναπτύξετε έναν αλγόριθμο για τον εντοπισμό των R κορυφών.
β) Να βρείτε τις χρονικές στιγμές εμφάνισης των R κορυφών και τις αντί-
στοιχες τιμές του ηλεκτροκαρδιογραφήματος.
γ) Να υπολογίσετε τη μέση συχνότητα της καρδιακής λειτουργίας σε χτύ-
πους ανά λεπτό (bpm).
δ) Δεχόμενοι ότι στην ιδεατή φυσιολογική καρδιακή λειτουργία τα χρονι-
κά διαστήματα (Δt)n=tn+1-tn μεταξύ διαδοχικών R κορυφών παρουσιάζουν
μεταβολές της τάξης του 5% το πολύ, ποια από τα ηλεκτροκαρδιογραφήματα
αφορούν ασθενείς με πιθανή παθολογική καρδιακή λειτουργία;
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 49
2 Διάσπαση ραδιενεργών πυρήνων
Έστω μία ποσότητα ενός ραδιενεργού υλικού. Ο αριθμός των ραδιενεργών
πυρήνων που περιέχονται στη δοθείσα ποσότητα ύλης, ελαττώνεται με το
χρόνο, καθώς οι πυρήνες διασπώνται. Αν σε κάποια χρονική στιγμή t υπάρ-
χουν N(t) αδιάσπαστοι πυρήνες, τότε ο αριθμός dN(t)=N(t+dt)-N(t) των δια-
σπάσεων που πραγματοποιούνται σε χρόνο dt είναι ανάλογος του χρόνου dt
και του αριθμού N(t) των πυρήνων, δηλαδή dN(t)=-λN(t) ή N-1(t)dN(t)=-λdt,
όπου ο συντελεστής λ>0 ονομάζεται σταθερά διάσπασης και εξαρτάται μόνο
από το είδος των διασπώμενων πυρήνων. Αν ο αριθμός των πυρήνων είναι
N0=N(0) στην αρχή του χρόνου, τότε η λύση της παραπάνω εξίσωσης είναι
lnN(t)=-λt+lnΝ0 ή N(t)=N0e-λt. Για παράδειγμα, το ισότοπο 131Ι (ιώδιο-131) εί-
ναι ραδιενεργό με σταθερά διάσπασης λ=10-6s-1 και χρόνο ημιζωής
T1/2=ln2/λ≈8.02 ημέρες. Για να μετρήσουμε πειραματικά τη σταθερά διάσπα-
σης, καταγράφουμε τον αριθμό των αδιάσπαστων πυρήνων τις χρονικές
στιγμές tn, δηλαδή συλλέγουμε τα δεδομένα (tn,N(tn)), για 30 ημέρες. Έπειτα,
με χρήση της εξίσωσης lnN(t)=-λt+lnΝ0 κατασκευάζουμε το γραμμικό σύ-
στημα Ax=b, όπου o πίνακας A είναι διάστασης 30×2, το διάνυσμα x είναι
διάστασης 2×1 και το διάνυσμα b διάστασης 30×1, του οποίου η λύση επι-
τυγχάνεται με τη μέθοδο των ελάχιστων τετραγώνων, δηλαδή με επίλυση
του συστήματος Α⊤Αx=A⊤b.
Ε ΡΓΑΣ ΙΕ Σ
α) Αν είναι γνωστά τα λ=10 s , N0=100, να κατασκευάσετε τα πειραματι-
-6 -1
50
3 Εκτόξευση πυραύλου
Έστω ότι επιθυμούμε να εκτοξεύσουμε έναν πύραυλο και θέλουμε να βρού-
με τη βέλτιστη στρατηγική καύσης, ώστε ο πύραυλος να φτάσει το μέγιστο
δυνατό ύψος. Δοθείσας στρατηγικής καύσης, πρέπει να μπορούμε να υπολο-
γίσουμε το ύψος. Αν m είναι η μάζα του πυραύλου, v η ταχύτητά του, μ η συ-
νάρτηση κατανάλωσης καυσίμων σε Kg/s και η δυναμική του πυραύλου πε-
ριγράφεται από την εξίσωση m´v+mv´=c1μ-c2v|v|-mg, όπου δεξιά του συμ-
βόλου της ισότητας είναι η δύναμη της μηχανής, η αντίσταση του αέρα και η
βαρύτητα. Ο όρος c1μ μοντελοποιεί τη δύναμη της μηχανής και θεωρούμε
ότι c1=1000m/s, ενώ ο δεύτερος όρος δίνει την αντίσταση του αέρα σαν δύ-
ναμη ανάλογη του τετραγώνου της ταχύτητας και δεχόμαστε c2=1/3Kg/m. Η
επιτάχυνση της βαρύτητας είναι g=9.82m/s2. Ο πύραυλος του παραδείγμα-
τος μπορεί να καταναλώσει 10Kg καυσίμων ανά δευτερόλεπτο το πολύ, δη-
λαδή 0≤μ≤10 και η μάζα του ελαττώνεται όπως ορίζει η εξίσωση m´=-μ.
Χωρίς καύσιμα, ο πύραυλος ζυγίζει 100Kg και αρχικά, τα καύσιμα του ζυγί-
ζουν 900Kg, δηλαδή, στην αρχή του χρόνου η συνολική μάζα του συστήμα-
τος είναι m(0)=1000Kg. Ενδιαφερόμαστε για το ύψος h από το επίπεδο της
θάλασσας, και ως εκ τούτου, θεωρούμε ότι βρισκόμαστε σε μία περιοχή με
h(0)=14m και επιπλέον, η αρχική ταχύτητα του πυραύλου είναι v(0)=0m/s.
Υπενθυμίζουμε ότι έχουμε h´=v.
Ε ΡΓΑΣ ΙΕ Σ
α) Να γράψετε το σύστημα των διαφορικών εξισώσεων στην κανονική
μορφή u=[h v m]⊤.
β) Να λύσετε το σύστημα των διαφορικών εξισώσεων με την ενσωματω-
μένη συνάρτηση lsode (Octave) ή ode45 (Matlab), αν μ=10Kg/s, όταν t≤90s
και μ=0Kg/s, όταν t>90s.
γ) Μπορείτε να βρείτε μία καλύτερη συνάρτηση κατανάλωσης καυσίμων
μ; Υπενθυμίζουμε ότι υπάρχουν μόνο 900Kg καυσίμων. Να περιγράψετε τη
στρατηγική σας και να υπολογίσετε το μέγιστο ύψος, στο οποίο φτάνει ο πύ-
ραυλος με τη στρατηγική που ορίσατε.
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 51
4 Εξάπλωση πυρκαγιάς σε δάσος
Τα κυψελωτά αυτόματα (κ.α.) είναι μαθηματικές μηχανές που αποτελούνται
από κελιά/κυψέλες/στοιχεία, των οποίων η κατάσταση καθορίζεται από ένα
πεπερασμένο σύνολο τοπικών κανόνων. Οι κανόνες ονομάζονται τοπικοί,
επειδή χρησιμοποιούν τη γειτονιά του κάθε κελιού σαν είσοδο. Δύο συχνά
χρησιμοποιούμενες γειτονιές κ.α. δύο διαστάσεων είναι η περιοχή von
Neumann NN={(0,-1),(-1,0),(0,0),(+1,0),(0,+1)} και η περιοχή Moore, η οποία
περιέχει και τα στοιχεία (-1,1), (-1,+1), (+1,-1), (+1,+1), όπως στο σχήμα.
Ε ΡΓΑΣ ΙΑ
Να γράψετε κώδικα που να προσομοιώνει το παραπάνω σύστημα και να
εκτελέσετε πειράματα για διάφορες τιμές πιθανοτήτων στους κανόνες 3, 4.
52
5 Επεξεργασία εικόνας με φίλτρα
Μία ασπρόμαυρη εικόνα μπορεί να παρασταθεί με έναν πίνακα, τα στοιχεία
του οποίου λαμβάνουν τιμές μεταξύ 0 και 1 και παριστάνουν τις αποχρώσεις
του γκρι. Ένας συνήθης τρόπος εφαρμογής ενός γραμμικού, χωρικού φίλ-
τρου είναι η συνέλιξη της εικόνας με μία μάσκα, η οποία ορίζει το φίλτρο και
ονομάζεται πυρήνας της συνέλιξης. Η μάσκα αυτή περιλαμβάνει τους συ-
ντελεστές που δρουν στα τρέχοντα στοιχεία της εικόνας, καθώς η μάσκα με-
ταφέρεται μία θέση δεξιά μετά από κάθε εφαρμογή της. Για παράδειγμα,
Μάσκα: 1| 1 1
Εικόνα: 0| 0 0.5 1 0.5 0.5 |0
Έξοδος: 0.5=1·0+1·0+1·0.5
Μάσκα: 1 1 1
Εικόνα: 0| 0 0.5 1 0.5 0.5 |0
Έξοδος: 0.5 1.5=1·0+1·0.5+1·1
όπου συμπληρώσαμε την εικόνα με ένα μηδενικό αριστερά και ένα δεξιά,
ώστε στην έξοδο να λάβουμε εικόνα ίδιων διαστάσεων με τη δοθείσα. Πα-
ρόμοια είναι η κατάσταση σε δύο διαστάσεις, ενώ η μάσκα μετατοπίζεται και
στην κατακόρυφη διεύθυνση, ώστε να καλυφθεί κάθε στοιχείο της εικόνας.
Οι συναρτήσεις του Octave για τη συνέλιξη δύο διαστάσεων είναι οι
filter2, conv2, με μόνη διαφορά μία περιστροφή κατά 180 μοίρες. Μπορού-
με να εισάγουμε μία εικόνα png στο Octave με τη συνάρτηση imread και να
κατασκευάσουμε μία μάσκα η οποία αντικαθιστά κάθε στοιχείο της εικόνας
με το μέσο όρο των γειτνιαζόντων στοιχείων, m=ones(5)/25. Το φίλτρο αυτό
έχει ως αποτέλεσμα το θόλωμα της εικόνας. Επιπλέον, παρατηρούμε ότι
sum(m(:))=1. Τέλος εφαρμόζουμε το φίλτρο fim=uint8(filter2(m, im)).
Ε ΡΓΑΣ ΙΕ Σ
α) Να γράψετε μία συνάρτηση συμπλήρωσης εικόνας με μηδενικά ή με κα-
τοπτρική συμμετρία.
β) Να εισάγετε μία εικόνα, την οποία να θολώσετε με το φίλτρο m και να
μελετήσετε την επίδραση της συμπλήρωσης στο σύνορο της εικόνας.
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 53
6 Πληθυσμιακή δυναμική
Υποθέτουμε ότι θέλουμε να μοντελοποιήσουμε τον πληθυσμό ενός ζωικού
είδους. Κάθε χρόνο, ο πληθυσμός αυξάνεται κατά έναν παράγοντα R, τον
ρυθμό ανάπτυξης. Αυτό σημαίνει ότι αν ο αριθμός των μελών του πληθυ-
σμού είναι Nn το χρόνο n, τότε θα είναι RΝn το χρόνο n+1, δηλαδή
Nn+1=RNn. Για να γίνει το μοντέλο μας πιο ρεαλιστικό, θεωρούμε ότι ο ρυθ-
μός ανάπτυξης είναι συνάρτηση του πληθυσμού, δηλαδή R(Nn). Επιπλέον,
υποθέτουμε ότι υπάρχει ένας μέγιστος αριθμός μελών που μπορεί να φιλοξε-
νηθεί από το περιβάλλον. Ο αριθμός αυτός ονομάζεται φέρουσα ικανότητα
ή χωρητικότητα του περιβάλλοντος και συμβολίζεται Nmax. Τέλος, αν ο πλη-
θυσμός τείνει στο Nmax, αναμένουμε ο ρυθμός ανάπτυξης να τείνει στο μη-
δέν. Μία συνάρτηση που ικανοποιεί τα παραπάνω κριτήρια έχει τύπο
R(Nn)=r(1-Nn/Nmax), όπου r είναι μία σταθερά. Με αντικατάσταση του R(Nn)
στην Nn+1=RNn παίρνουμε Nn+1=r(1-Nn/Nmax)Nn, η οποία, αν διαιρέσουμε με
Nmax και θέσουμε xn=Nn/Nmax γράφεται xn+1=rxn(1-xn) με xn στο διάστημα
[0,1]. Περιορίζοντας τις τιμές της παραμέτρου r στο διάστημα [0,4], η συ-
νάρτηση με τύπο f(x)=rx(1-x) απεικονίζει το διάστημα [0,1] στον εαυτό του.
Η συνάρτηση f ονομάζεται λογιστική απεικόνιση και δοθείσας αρχικής κα-
τάστασης x0, η αναδρομική σχέση xn+1=f(xn) παράγει τροχιές x1, x2, ..., το εί-
δος των οποίων εξαρτάται από την τιμή του r. Πιο συγκεκριμένα, υπάρχουν
τιμές του r, για τις οποίες το σύστημα είναι χαοτικό, δηλαδή οι τροχιές δεν
εμφανίζουν καμία κανονικότητα και μικρές μεταβολές στον αρχικό πληθυ-
σμό επιφέρουν δραματικά διαφορετική εξέλιξη σε αυτόν.
Ε ΡΓΑΣ ΙΑ
Να γράψετε μία συνάρτηση logmap(x0,r,k), όπου x0 είναι ο αρχικός πλη-
θυσμός, r η σταθερά r και k ο αριθμός των επαναλήψεων, η οποία επιστρέφει
τις τροχιές της λογιστικής απεικόνισης. Να σχεδιάσετε το αποτέλεσμα σαν
χρονοσειρά του xn συναρτήσει του n για x0=0.1, k=100 και για κάθε μία από
τις τιμές 2.8, 3.3, 3.5 και 3.9 της παραμέτρου r. Να χαρακτηρίσετε τις τροχιές
σαν τακτικές ή χαοτικές.
54
7 Υπολογισμός του PageRank TM της Google TM
Έστω W το σύνολο των n ιστοσελίδων, στις οποίες μπορούμε να φτάσουμε
ακολουθώντας μία αλυσίδα συνδέσμων, ξεκινώντας από μία αρχική σελίδα.
Μπορούμε να κατασκευάσουμε έναν τετραγωνικό πίνακα μεγέθους n×n, τα
στοιχεία του οποίου είναι gij=1, αν υπάρχει σύνδεσμος από τη σελίδα i στη
σελίδα j, και gij=0 διαφορετικά. Ο πίνακας αυτός ονομάζεται πίνακας συνδε-
σιμότητας, συμβολίζεται G και το άθροισμα όλων των στοιχείων του είναι ο
αριθμός των συνδέσμων του συνόλου W. Αν p=0.85 είναι η πιθανότητα ένας
τυχαίος δρόμος να ακολουθήσει ένα σύνδεσμο, τότε 1-p είναι η πιθανότητα
επιλογής τυχαίας σελίδας και δ=(1-p)/n είναι η πιθανότητα επιλογής συγκε-
κριμένης τυχαίας σελίδας. Έστω ο πίνακας A με στοιχεία aij=pgij / Σigij+δ,
όταν Σigij0, και aij=1/n, όταν Σigij=0. Ο πίνακας A είναι ο πίνακας της πιθα-
νότητας μετάβασης της αλυσίδας Markov. Επιπλέον, είναι γνωστό από το
θεώρημα Perron-Frobenius ότι η εξίσωση Ax=1x έχει μοναδική λύση με
απροσδιοριστία πολλαπλασιαστικής σταθεράς, όπως κάθε πρόβλημα ιδιοτι-
μών που έχει λύση. Παρατηρούμε ότι το πρόβλημα ιδιοτιμών αναζητά τα
ιδιοδιανύσματα x του πίνακα πιθανότητας μετάβασης A και ως εκ τούτου, οι
συνιστώσες του x είναι θετικοί αριθμοί, μικρότεροι της μονάδας. Αν επι-
λέξουμε την πολλαπλασιαστική σταθερά, ώστε Σixi=1, τότε το x είναι το κα-
ταστατικό διάνυσμα της αλυσίδας Markov ή το PageRank της Google.
Ε ΡΓΑΣ ΙΕ Σ
α) Να γράψετε τον πίνακα Α στη μορφή A=pGD+ez⊤, όπου e είναι το
διάνυσμα μήκους n, του οποίου τα στοιχεία είναι 1.
β) Να κατασκευάσετε τον πίνακα G με χρήση της συνάρτησης sparse, αν
i=[ 2 6 3 4 4 5 6 1 1 ] και j=[ 1 1 2 2 3 3 3 4 6 ] . Να σχεδιάσετε
τον πίνακα G με τη συνάρτηση spy. Τι παρατηρείτε όσο αφορά το πλήθος
των μη μηδενικών στοιχείων του G, τα οποία βρίσκονται και με χρήση της
συνάρτησης nnz.
γ) Να γράψετε κώδικα για τον υπολογισμό του PageRank του δικτύου του
ερωτήματος β. Να σχεδιάσετε το αποτέλεσμα με τη συνάρτηση bar.
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 55
56
Βιογραφικό σημείωμα
ΦΩΤ Ι Ο Σ Κ Α ΣΟ ΛΗ Σ 57