ΚΩΝΣΤΑΝΤΙΝΟΣ Ν. ΑΝΑΓΝΩΣΤΟΠΟϒΛΟΣ
Αναπληρωτής Καθηγητής
Εθνικό Μετσόβιο Πολυτεχνείο
ϒπολογιστική Φυσική
Μία Πρακτική Εισαγωγή στην ϒπολογιστική Φυσική και
τον Επιστημονικό Προγραμματισμό
ϒπολογιστική Φυσική
Συγγραφή
Κωνσταντίνος Ν. Αναγνωστόπουλος
Κριτικός Αναγνώστης
Ιωάννης Ρίζος
Συντελεστές έκδοσης
Γλωσσική Επιμέλεια: Αναστασία Τσιαδήμου
Γραφιστική Επιμέλεια: Κωνσταντίνος Ν. Αναγνωστόπουλος
Τεχνική Επεξεργασία: Κωνσταντίνος Ν. Αναγνωστόπουλος
ISBN: 978-960-603-112-0
Copyright ©ΣΕΑΒ, 2015
Το παρόν έργο αδειοδοτείται υπό τους όρους της άδειας Creative Commons Αναφορά
Δημιουργού - Μη Εμπορική Χρήση - Παρόμοια Διανομή 3.0. Για να δείτε ένα αντίγραφο
της άδειας αυτής επισκεφτείτε τον ιστότοπο
https://creativecommons.org/licenses/by-nc-sa/3.0/gr/
ΣϒΝΔΕΣΜΟΣ ΕΛΛΗΝΙΚΩΝ ΑΚΑΔΗΜΑΪΚΩΝ ΒΙΒΛΙΩΝ
Εθνικό Μετσόβιο Πολυτεχνείο
Ηρώων Πολυτεχνείου 9, 15780 Ζωγράφου
www.kallipos.gr
Η ιστοσελίδα του βιβλίου είναι στη θέση
http://www.physics.ntua.gr/~konstant/ComputationalPhysics/
Εκεί θα βρείτε συμπληρωματικό υλικό, το συνοδευτικό λογισμικό με τα προγράμματα
που παρουσιάζονται στο βιβλίο, καθώς και τη μετάφραση του βιβλίου στα Αγγλικά
(ελεύθερα διαθέσιμη).
Μερικές συμβάσεις: Κείμενο με γραμματοσειρά όπως η παρακάτω, αφορά εντολές που δίνονται στον υπολογιστή, είσοδο και έξοδο προγραμμάτων, κώδικα γραμμένο σε Fortran ή άλλη γλώσσα και ονόματα αρχείων:
΄Οταν μια γραμμή αρχίζει με τον χαρακτήρα “προτροπής” (prompt),
όπως παραπάνω, αυτή είναι μία εντολή που δίνουμε από τη γραμμή εντολών του φλοιού. Η δεύτερη γραμμή δείχνει αυτά που τυπώνει η εντολή στην κονσόλα.
Παρακάτω, δίνονται τα περιεχόμενα ενός αρχείου Fortran:
Τι χρειάζεστε για να δουλέψετε στον υπολογιστή σας:
Αν έχετε μια διανομή GNU/Linux εγκατεστημένη στον υπολογιστή σας, η εγκατάσταση του παραπάνω λογισμικού γίνεται πολύ εύκολα από τον διαχειριστή πακέτων (software center) της διανομής. Λ.χ., σε μια διανομή τύπου Debian (Ubuntu, ...), αφού εκτελέσετε τις απλές εντολές
θα βρείτε όλο το λογισμικό εγκατεστημένο στον υπολογιστή σας.
Αν δεν θέλετε να εγκαταστήσετε μια διανομή GNU/Linux στον υπολογιστή σας, έχετε τις εξής εναλλακτικές δυνατότητες:
Στην ιστοθέση https://goo.gl/2pLXT2 θα βρείτε βίντεο που θα σας βοηθήσουν με τα παραπάνω.
blas | - | Basic Linear Algebra Subprograms. |
CPU | - | Central Processing Unit. |
FIFO | - | First In First Out (queue). |
FORTRAN | - | FORmula TRANslator. |
GNU | - | GNU’s Not Unix! |
ΗΜ | - | Ηλεκτρομαγνητικό (πεδίο). |
lapack | - | Linear Algebra PACKage. |
LDA | - | Leading Dimension of A. |
LIFO | - | Last In First Out (stack). |
NRRW | - | Non Reversal Random Walk. |
- | Portable Document Format. | |
RK45 | - | Runge–Kutta τάξης 4 προσαρμοζόμενου βήματος. |
RW | - | Random Walk (απλό). |
SAW | - | Self Avoiding Walk. |
SOR | - | Successive OverRelaxation. |
tcsh | - | Trusted C SHell. |
allocation | - |
Εκχώρηση (memory allocation = εκχώρηση μνήμης υπολογιστή σε ένα πρόγραμμα, array κλπ). |
anharmonic (oscillator) | - |
Αναρμονικός (ταλαντωτής). |
animation | - |
Κινούμενα σχέδια. Αναφέρεται σε γραφική παράσταση δεδομένων που αλλάζουν στον χρόνο. |
ansatz | - |
Δοκιμαστική λύση σε ένα πρόβλημα ή μία εξίσωση. |
argument | - |
΄Ορισμα εντολής: λέξεις που το πρόγραμμα διαβάζει από τη γραμμή εντολών. |
array | - |
Δομές δεδομένων στη Fortran στα οποία αναφερόμαστε με χρήση ακέραιων δεικτών (λ.χ. διανύσματα, πίνακες κλπ). |
attractor | - |
Ελκυστής: υποσύνολο του φασικού χώρου ενός δυναμικού συστήματος στο οποίο κινείται οριακά το σύστημα για μεγάλους χρόνους. |
attribute | - |
Χαρακτηρισμός που δίνεται στη δήλωση μίας μεταβλητής Fortran (λ.χ. parameter, allocatable κλπ). |
autocorrelation | - |
Αυτοσυσχετισμός: στατιστικός συσχετισμός τυχαίας μεταβλητής με τον εαυτό της στον χρόνο. |
bifurcation | - |
Διακλάδωση (εδώ των σταθερών σημείων της λογιστικής απεικόνισης). |
binning | - |
Μέθοδος υπολογισμού σφαλμάτων με χωρισμό των δεδομένων σε ομάδες (bins - “δοχεία”). |
boundary | - |
Σύνορο (boundary conditions = συνοριακές συνθήκες διαφορικής εξίσωσης). |
buffer | - |
Βοηθητική περιοχή στη μνήμη. Στον Emacs, buffers είναι περιοχές στα παράθυρα που συνήθως περιέχουν δεδομένα αρχείων. |
cluster | - |
Σύμπλεγμα από πλεγματικές θέσεις με το ίδιο σπιν που έχουν επιλεγεί με κάποια διαδικασία. |
compiler | - |
Μεταγλωττιστής εντολών μιας γλώσσας προγραμματισμού σε μία άλλη γλώσσα (λ.χ. από Fortran σε assembly). |
constraints | - |
Περιορισμοί στους οποίους υπόκειται ένα δυναμικό σύστημα. |
correlation | - |
Στατιστικός συσχετισμός. |
debugger | - |
Ειδικό εργαλείο αποσφαλμάτωσης προγραμμάτων. |
diffusion | - |
Διάχυση. |
directory | - |
Κατάλογος αρχείων. |
eigenvalue | - |
Ιδιοτιμή πίνακα. |
eigenvector | - |
Ιδιοδιάνυσμα πίνακα. |
eigenfunction | - |
Ιδιοσυνάρτηση προβλήματος ιδιοτιμών διαφορικής εξίσωσης. |
file | - |
Αρχείο δεδομένων. |
filesystem | - |
Σύστημα οργάνωσης αρχείων ενός λειτουργικού συστήματος. |
fit | - |
Προσαρμογή δεδομένων σε μία συνάρτηση. |
format | - |
Μορφοποίηση δεδομένων στη Fortran (λ.χ. για την εκτύπωσή τους). |
harmonic (oscillator) | - |
Αρμονικός (ταλαντωτής). |
impurities | - |
Προσμείξεις (σε ένα υλικό). |
integer | - |
Μεταβλητές της Fortran που καταχωρούν τα δεδομένα για έναν ακέραιο αριθμό. |
interface | - |
Διεπαφή (εδώ ενός προγράμματος με τον χρήστη). |
iteration | - |
Επανάληψη μίας επαναληπτικής (αλγοριθμικής) διεργασίας. |
jackknife | - |
Μέθοδος υπολογισμού σφαλμάτων με χωρισμό των δεδομένων σε ομάδες. |
logistic map | - |
Λογιστική απεικόνιση. |
minibuffer | - |
Ειδικό buffer στον Emacs στο οποίο μπορούμε να δίνουμε εντολές. |
modes | - |
Ειδικές καταστάσεις στις οποίες βρίσκονται buffers του Emacs ανάλογα με το περιεχόμενο των δεδομένων (Fortran mode, C mode κλπ). |
observable | - |
Παρατηρήσιμη φυσική ποσότητα. |
path | - |
Διαδρομή που οδηγεί σε μία μοναδική θέση σε ένα filesystem. |
plot | - |
Γραφική παράσταση δεδομένων ή συνάρτησης. |
prompt | - |
Ακολουθία χαρακτήρων που τυπώνει ένα πρόγραμμα όταν περιμένει είσοδο δεδομένων από τον χρήστη (μήνυμα προτροπής). |
|
||
random | - |
Τυχαίο. |
random number | - |
Τυχαίος αριθμός. ΄Ενας μεγάλος αριθμός από αυτούς ακολουθεί μια ζητούμενη κατανομή πιθανότητας. |
random walk | - |
Τυχαία διαδρομή. |
real | - |
Μεταβλητές της Fortran που καταχωρούν τα (προσεγγιστικά) δεδομένα για έναν πραγματικό αριθμό. |
relaxation | - |
Μέθοδος ολοκλήρωσης προβλήματος συνοριακών τιμών, που στην είσοδο δίνεται δοκιμαστική λύση και η οποία, με την επαναληπτική εφαρμογή του αλγόριθμου, προσεγγίζει τη ζητούμενη λύση. |
residual | - |
ϒπολειπόμενο μιας εξίσωσης που αντιστοιχεί στο σφάλμα προσέγγισής της από έναν αλγόριθμο. |
scattering | - |
Σκέδαση (λ.χ. σωματιδίων). |
script | - |
Εντολές-σενάριο οι οποίες ερμηνεύονται, χωρίς να μεταγλωττίζονται, από κάποιο πρόγραμμα (λ.χ. τον φλοιό). |
seed | - |
Αρχική τιμή σε μια γεννήτρια ψευδοτυχαίων αριθμών. Αρχική πλεγματική θέση σε ένα Wolff cluster. |
semicolon | - |
Ο χαρακτήρας “;” (ελληνικό ερωτηματικό). |
shell | - |
Φλοιός, ειδικό πρόγραμμα αλληλεπίδρασης ενός χρήστη με το λειτουργικό σύστημα. |
shell script | - |
Σενάριο φλοιού: πρόγραμμα που εκτελεί μία ακολουθία εντολών ενός φλοιού. |
stdin (standard input) | - |
ειδικό αρχείο εισόδου δεδομένων. |
stdout (standard output) | - |
ειδικό αρχείο εξόδου δεδομένων. |
stderr (standard error) | - |
ειδικό αρχείο εξόδου δεδομένων για σφάλματα εκτέλεσης προγραμμάτων. |
subroutine | - |
ϒπορουτίνα: αυτόνομη διαδικασία στη Fortran, μία συνάρτηση που δεν επιστρέφει αποτέλεσμα (δηλ. τύπου void). |
sweep | - |
Ενημέρωση ή απόπειρα ενημέρωσης όλων των βαθμών ελευθερίας ενός πλέγματος σε μια διαδικασία Μόντε Κάρλο. |
thermalization | - |
Διαδικασία εύρεσης κατάστασης θερμικής ισορροπίας σε έναν αλγόριθμο Μόντε Κάρλο. |
transient state | - |
Μεταβατική συμπεριφορά ενός δυναμικού συστήματος, προτού φτάσει στη σταθερή κατάσταση. |
|
||
|
||
|
Το βιβλίο είναι αποτέλεσμα της εντεκάχρονης εμπειρίας μου στη διδασκαλία τριών εισαγωγικών μαθημάτων με θέμα την υπολογιστική φυσική και τον επιστημονικό προγραμματισμό στο Εθνικό Μετσόβιο Πολυτεχνείο. Απευθύνεται, κυρίως, σε τριτοετείς και τεταρτοετείς φοιτητές των φυσικών επιστημών και των επιστημών του μηχανικού. Τα πρώτα του κεφάλαια μπορούν να διδαχθούν χωρίς πρόβλημα και σε δευτεροετείς φοιτητές που έχουν παρακολουθήσει τα βασικά μαθήματα φυσικής και μαθηματικής ανάλυσης, τα οποία διδάσκονται στο πρώτο έτος σε ένα οποιοδήποτε τμήμα θετικών επιστημών. Το υλικό που παρουσιάζεται στο βιβλίο μπορεί να διδαχθεί άνετα σε δύο εξαμηνιαία μαθήματα, συμπεριλαμβανομένων και των εργαστηριακών ασκήσεων.
Το βασικό κίνητρο που με οδήγησε στη συγγραφή του βιβλίου είναι, καταρχήν, η απουσία ελληνικής βιβλιογραφίας η οποία να θεραπεύει τα θέματα που παρουσιάζονται στα περιεχόμενά του σε προπτυχιακό επίπεδο, αλλά και η ανάγκη μου να δείξω στους δικούς μου φοιτητές όλες τις τεχνικές λεπτομέρειες ενός αριθμητικού υπολογισμού σε ένα επιστημονικό μοντέλο, από τον σχεδιασμό μέχρι την υλοποίηση και την ανάλυση των αποτελεσμάτων. Οι φοιτητές μου αντιμετωπίζουν περισσότερες δυσκολίες στον προγραμματισμό και στον χειρισμό των δεδομένων, παρά στην κατανόηση των φυσικών εννοιών.
Το βιβλίο δεν αποσκοπεί στο να γίνει ένα βιβλίο αναφοράς για τα θέματα που διαπραγματεύεται, αλλά να διδάξει βήμα-βήμα πώς να λυθεί ένα επιστημονικό πρόβλημα με υπολογιστικές μεθόδους. Τονίζεται πως, για να επιτευχθούν οι εκπαιδευτικοί στόχοι, είναι απαραίτητο ο αναγνώστης να εργάζεται, ταυτόχρονα με τη μελέτη του βιβλίου, πάνω στον προσωπικό του υπολογιστή και να υλοποιεί τα γραφόμενα. Το μάθημα το διδάσκω, ακολουθώντας την παραπάνω φιλοσοφία, μέσα σε ένα εργαστήριο υπολογιστών, όπου οι φοιτητές ασκούνται ταυτόχρονα με τη διδασκαλία της ύλης.
Οι απαραίτητες υπολογιστικές δεξιότητες διδάσκονται με τη μέθοδο του παραδείγματος και, για τον λόγο αυτό, καλό είναι η ύλη να διδαχθεί με τη σειρά που παρουσιάζεται στο βιβλίο. Στο πρώτο κεφάλαιο, παρουσιάζονται οι απολύτως απαραίτητες έννοιες και η εμβάθυνση επιτυγχάνεται στην πράξη, λύνοντας προβλήματα (όπως και στον πραγματικό κόσμο...). Η λύση των προβλημάτων παρουσιάζεται σε διαφορετικά επίπεδα υπολογιστικής δεξιοτεχνίας και, ανάλογα με το επίπεδο του αναγνώστη, μπορούν να λυθούν χρησιμοποιώντας απλά ή σύνθετα εργαλεία. Σε κάθε κεφάλαιο παρατίθεται βιβλιογραφία που έχει στόχο να βοηθήσει τον αναγνώστη να εμβαθύνει τη γνώση του πάνω σε ζητήματα που δεν υπάρχει αρκετός χώρος να αναπτυχθούν στο βιβλίο.
΄Ενας άλλος βασικός στόχος του βιβλίου είναι να βοηθήσει τον αναγνώστη να αποκτήσει εμπειρία και στερεό υπόβαθρο, προκειμένου, αν θέλει, να προχωρήσει σε αριθμητικούς υπολογισμούς υψηλής απόδοσης. Για τον λόγο αυτό, ως γλώσσα προγραμματισμού των βασικών προγραμμάτων που υλοποιούν έναν αλγόριθμο υψηλών αριθμητικών απαιτήσεων έχει επιλεγεί η Fortran. Η γλώσσα αυτή είναι δημοφιλής σε ομάδες που προγραμματίζουν επιστημονικά προγράμματα στους σημερινούς υπερυπολογιστές. Είναι δομημένη με σκοπό να κάνει εύκολο τον προγραμματισμό αριθμητικών αλγόριθμων υψηλών απαιτήσεων, έχει τους πιο αποδοτικούς μεταγλωττιστές στη βελτιστοποίηση εκτέλεσης προγραμμάτων και ένα μεγάλο μέρος αριθμητικών βιβλιοθηκών έχουν προγραμματιστεί στη γλώσσα αυτή. Από παιδαγωγικής άποψης είναι μια πολύ απλή γλώσσα, που επιτρέπει στον μη έμπειρο προγραμματιστή να αρχίσει να προγραμματίζει άμεσα ένα αριθμητικό πρόβλημα, χωρίς να χρειάζεται να καθορίσει δευτερεύουσας σημασίας παραμέτρους του υπολογιστικού περιβάλλοντος. Η εκτέλεση των προγραμμάτων και η ανάλυση των αποτελεσμάτων γίνεται σε ένα λειτουργικό σύστημα της οικογένειας του Unix (όπως είναι λ.χ. το Linux), εμπλουτισμένο από την πλούσια και πανίσχυρη εργαλειοθήκη GNU. Η τελευταία παρέχεται ελεύθερα από την FSF8 και είναι απαραίτητη για τον πολύπλοκο χειρισμό δεδομένων που απαιτούνται σε ένα ερευνητικό πρόγραμμα. Η Fortran δεν είναι η καλύτερη επιλογή για τον προγραμματισμό λειτουργιών στις οποίες είναι απαραίτητος ο χειρισμός πολύπλοκων αντικειμένων ή η σε βάθος αλληλεπίδραση με το λειτουργικό σύστημα. Η φιλοσοφία είναι να αφήσει κάποιος τη Fortran να κάνει αυτό για το οποίο έχει φτιαχτεί να κάνει καλύτερα (αριθμητικούς υπολογισμούς) και να αναθέσει τον χειρισμό των δεδομένων και τη διαχείριση του συστήματος σε άλλα, εξωτερικά, εργαλεία. Εργαλεία όπως η awk, ο προγραμματισμός του φλοιού, το gnuplot, η Perl και άλλα, είναι πολύ ισχυρά και ευέλικτα, και συμπληρώνουν τις αδυναμίες της Fortran. Το πρόγραμμα που χρησιμοποιείται στην απεικόνιση των δεδομένων είναι το gnuplot, το οποίο παρέχει πανίσχυρα εργαλεία χειρισμού των δεδομένων και δημιουργίας μεγάλου αριθμού από πολύπλοκες γραφικές παραστάσεις. ΄Ολα τα εργαλεία που χρησιμοποιούνται στο βιβλίο δίνονται με άδεια ανοιχτού λογισμικού και είναι προσβάσιμα χωρίς χρέωση. Μπορούν να χρησιμοποιηθούν σε περιβάλλον Linux, Windows και Mac OS.
Η πιο δύσκολη έννοια που πρέπει να εμπεδωθεί σε ένα μάθημα επιστημονικού προγραμματισμού, είναι ότι ο τρόπος λύσης ενός προβλήματος με αριθμητική μέθοδο είναι τελείως διαφορετικός από τον τρόπο που λύνεται αναλυτικά. Συνήθως, οι φοιτητές προσέρχονται έχοντας ένα ισχυρό υπόβαθρο στην ανάλυση και τη θεμελιώδη πανεπιστημιακή φυσική και είναι δύσκολο να τους εξηγήσεις πώς μπορείς να λύσεις ένα πρόβλημα ανάλυσης, χρησιμοποιώντας μόνο απλές αριθμητικές πράξεις. Ακόμα πιο δύσκολο είναι να γίνει κατανοητό πως το πρόβλημα λύνεται, συνήθως, με τη διακριτοποίηση ενός μοντέλου ορισμένου στο συνεχές, κάτι το οποίο μπορεί να γίνει με πολλούς τρόπους, ανάλογα με τις ανάγκες ακρίβειας και χρήσης υπολογιστικών πόρων. Η προσεγγιστική αριθμητική λύση πρέπει να προεκταθεί στο απειροστικό όριο, έτσι ώστε ληφθεί η αναλυτική λύση με ικανοποιητική ακρίβεια. Το βιβλίο προσπαθεί να εκθέσει τον αναγνώστη σε αυτή την ιδέα προοδευτικά, αρχίζοντας από προβλήματα απλής κίνησης σωματιδίων και φτάνοντας στην παρουσίαση της μεθόδου βάθμισης πεπερασμένου μεγέθους στη στατιστική φυσική ενός μοντέλου που βρίσκεται στην περιοχή μιας συνεχούς μετάβασης φάσης.
Το βιβλίο δίνεται μαζί με συνοδευτικό υλικό που μπορεί να βρεθεί και στην ιστοθέση του 9 . Το συνοδευτικό λογισμικό περιέχει όλα τα προγράμματα που παρουσιάζονται στο βιβλίο, μαζί με χρήσιμα εργαλεία και λύσεις μερικών από τα προβλήματα. Κάθε κεφάλαιο συμπληρώνεται από ασκήσεις που ο αναγνώστης πρέπει να λύσει για να αποκτήσει “hands on” εμπειρία στον επιστημονικό προγραμματισμό. Ελπίζω πως έχω ήδη τονίσει αρκετά, πως είναι απαραίτητο ο αναγνώστης να εκτελεί τις εντολές που παρουσιάζονται στο βιβλίο κατά τη διάρκεια της μελέτης του.
Σας εύχομαι μια δημιουργική εμπειρία επιστημονικού προγραμματισμού!
Αθήνα 2015.
Σε κάθε περιβάλλον εργασίας ενός υπολογιστικού προγράμματος, είναι ανάγκη να γίνουν επιλογές. Αυτές εξαρτώνται από τις συγκεκριμένες ανάγκες του προγράμματος: Απαιτήσεις αριθμητικής αποτελεσματικότητας, μικρή/μεγάλη ομάδα εργασίας, πολυπλοκότητα κώδικα, ανάγκες για αναβαθμίσεις ... αναμνήσεις από το μέλλον.
Εμείς εδώ θα διαλέξουμε να πάρουμε ένα άρωμα από τις ανάγκες ενός προγράμματος με κατεύθυνση επιστημονική/υπολογιστική. Ενός προγράμματος με μεγάλες ανάγκες σε εκμετάλλευση των υπολογιστικών πόρων για γρήγορους αριθμητικούς υπολογισμούς και για ευέλικτη ανάλυση (...πολλών) δεδομένων. ΄Ενα τέτοιο περιβάλλον που προσφέρει ευελιξία, αξιοπιστία, απλότητα, δυνατά εργαλεία για ανάλυση δεδομένων και μεταγλώττιση προγραμμάτων και που προσφέρει στο χρήστη τη δυνατότητα να κάνει αποδοτικότερη χρήση των υπολογιστικών πόρων του συστήματός του είναι η ομάδα λειτουργικών συστημάτων Unix. Η σύγχρονη, δημοφιλής και ελεύθερα διαθέσιμη έκδοση τέτοιου συστήματος είναι το GNU/Linux1 , μια προσπάθεια η οποία πραγματοποιήθηκε χάρη στην εθελοντική δουλειά εκατομμυρίων προγραμματιστών παγκοσμίως και που βασίστηκε στην ιδέα του Ελεύθερου Λογισμικού (όχι με την έννοια “τσάμπα”, αλλά με την έννοια της ελεύθερης διακίνησης ιδεών στο λογισμικό) που θεμελίωσε ο Richard Stallman2 .
Η γλώσσα προγραμματισμού που θα διαλέξουμε είναι η Fortran. Μερικοί λόγοι για την επιλογή είναι ότι η γλώσσα αυτή είναι προσανατολισμένη σε αριθμητικές εφαρμογές και χρησιμοποιείται ευρέως από επιστήμονες και μηχανικούς. Είναι απλή και οι μεταγλωττιστές κάνουν βελτιστοποίηση, παραλληλοποίηση και διανυσματοποίηση αποτελεσματικότερα. ϒπάρχουν πολλές, καλές και δοκιμασμένες βιβλιοθήκες με μαθηματικό λογισμικό από τις οποίες μερικές είναι ελεύθερα διαθέσιμες. Φυσικά, η γλώσσα αυτή υστερεί στη διεκπεραίωση πολύπλοκων διεργασιών που έχουν σχέση με το λειτουργικό σύστημα και την επεξεργασία κειμένου, αλλά το κενό καλύπτεται εύκολα με το συνδυασμό χρήσης εργαλείων του συστήματος. Επίσης, είναι απλή στη δομή της, οπότε ο αναγνώστης δεν θα δυσκολευτεί να κάνει απλούς υπολογισμούς, ακόμα και αν δεν έχει προηγούμενη εμπειρία προγραμματισμού. Τέλος, είναι μαθηματικά προσανατολισμένη: ΄Εχει απλή, κτισμένη μέσα της, χρήση μιγαδικών αριθμών και μαθηματικών συναρτήσεων, βιβλιοθήκες διαθέσιμες για υπολογισμούς διαφορετικής ακρίβειας και αποτελεσματικότερη διαχείριση της μνήμης του υπολογιστή. Η απλότητά της και η ... ηλικία της κάνει τους αντίστοιχους μεταγλωττιστές να κάνουν την καλύτερη διαθέσιμη βελτιστοποίηση και παραλληλοποίηση του κώδικα σε σύγκριση με όλες τις άλλες γλώσσες. Οι επιστημονικές εφαρμογές συνήθως χρησιμοποιούν γλώσσα δομημένου (procedural) και όχι αντικειμενοστραφούς (object oriented) προγραμματισμού. Η Fortran έχει δυνατότητες και αντικειμενοστραφούς προγραμματισμού, αλλά συνήθως εκεί είναι πιο δημοφιλείς γλώσσες όπως οι C++/Java.
Η Fortran όπως και οι C, C++, Java είναι γλώσσες που μεταγλωττίζονται από έναν μεταγλωττιστή. Μια άλλη κατηγορία γλωσσών προγραμματισμού είναι οι ερμηνευόμενες (interpreted), όπως είναι οι perl, Basic, awk, shell programming, Macsyma, Mathematica, Matlab, Octave, Maple, .... Οι ερμηνευτές των γλωσσών αυτών ερμηνεύουν το πρόγραμμα εντολή - εντολή. Αυτό δεν επιτρέπει την ανάλυση του προγράμματος που κάνει ο μεταγλωττιστής, το οποίο είναι απαραίτητο για τη βελτιστοποίηση της απόδοσης. Οι ερμηνευόμενες γλώσσες είναι απλούστερες στη χρήση (λ.χ. με μία εντολή Inverse[A] ή 1/A παίρνουμε τον αντίστροφο ενός πίνακα κάτι που χρειάζεται περισσότερη δουλειά σε μία γλώσσα όπως η Fortran, C, ...), αλλά γίνονται απαγορευτικά αργές για απαιτητικά προβλήματα. Ο χρόνος προγραμματισμού τους όμως είναι πολύ μικρότερος και ο προγραμματιστής θα πρέπει να εξετάσει αν μπορεί να λύσει το πρόβλημά του με τη βοήθειά τους, προτού αρχίσει να σχεδιάζει ένα πρόγραμμα σε μία γλώσσα όπως η Fortran.
Τέλος, αρκετές από τις εντολές του λειτουργικού συστήματος που θα συζητήσουμε παρακάτω, ερμηνεύονται έτσι μόνο από το φλοιό tcsh. Αυτή είναι μία ακόμα από τις επιλογές μας και δε θα αναλύσουμε τις διαφορές με άλλους φλοιούς έτσι ώστε η παρουσίαση να μη γίνει πολυπλοκότερη από όσο χρειάζεται.
΄Εχετε βρεθεί στην κατάσταση να θέλετε να λύσετε ένα πρόβλημα και το πολυδιαφημισμένο και ακριβοπληρωμένο λογισμικό σας που “ψήνει και καφέ” να μην μπορεί να κάνει αυτό που αρχικά δεν προβλέψατε ότι θα ήταν αναγκαίο να γίνει; Η λύση σε αυτό το πρόβλημα είναι ένα περιβάλλον στο οποίο οι πολύπλοκες διεργασίες να καταμερίζονται σε διαφορετικά εργαλεία τα οποία επιλέγονται και συνδυάζονται με ευελιξία ανάλογα με τις ανάγκες του υπολογισμού.
Αυτή είναι η βασική φιλοσοφία των λειτουργικών συστημάτων τύπου Unix. Θεμελιώδης αρχή στο σύστημα αυτό είναι ότι όλα τα δομικά του χαρακτηριστικά είναι αρχεία, είτε πρόκειται για δεδομένα σε μορφή κειμένου, είτε εκτελέσιμα προγράμματα σε γλώσσα μηχανής, είτε σκληροί δίσκοι, εξωτερικές συσκευές, οθόνες, κάρτες ήχου ... ΄Αρα, το πρώτο που πρέπει να κατανοήσουμε είναι η δομή του συστήματος αρχείων (filesystem).
Καταρχήν, σε κάθε αρχείο μας οδηγεί ένα ... μονοπάτι (path). ϒπάρχουν δύο τρόποι να γράψουμε ένα path. Το σχετικό (relative) και το απόλυτο (absolute). Δύο παραδείγματα είναι:
Στα παραπάνω και τα δύο μπορεί να αναφέρονται στο ίδιο αρχείο, μπορεί
όμως και σε διαφορετικό. Εξαρτάται “που είμαστε”. Αν “είμαστε” στον
κατάλογο /home/george/, τότε αναφερόμαστε στο ίδιο αρχείο. Αν είμαστε
στον κατάλογο /home/john/ ή /home/george/CompPhys/, τότε όχι. Στις
τελευταίες περιπτώσεις από το relative path γίνεται αναφορά στα αρχεία
/home/john/bin/RungeKutta/rk.exe και
/home/george/CompPhys/bin/RungeKutta/rk.exe αντίστοιχα. Πώς τα
ξεχωρίζουμε; Το absolute path αρχίζει πάντα από τον χαρακτήρα /, ενώ το
relative path όχι.
Παραπάνω, το “είμαστε” αναφέρεται σε μια θέση στο σύστημα των αρχείων που ονομάζεται “τρέχων κατάλογος ” (“current directory” ή “working directory”). Σε κάθε διεργασία στο λειτουργικό σύστημα αντιστοιχεί ένας μοναδικός τρέχων κατάλογος. Το σύστημα αρχείων στο Unix είναι ενιαίο. Ακόμα και αν πρόκειται για διαφορετικούς σκληρούς δίσκους, συστήματα αρχείων που συνδέονται στον υπολογιστή μας μέσω δικτύου, το CD/DVD, ο εξωτερικός USB δίσκος, τα αρχεία-οδηγοί που αλληλεπιδρούν με το hardware (οθόνη, ποντίκι, modem, ....), όλα αναρτώνται στο ίδιο λογικά σύστημα αρχείων. Ο χρήστης/διαχειριστής έχει απόλυτη ελευθερία να τα βάλει εκεί που αυτή/ός θέλει3 .
Το filesystem χτίζεται πάνω στη ρίζα του (“root”) σαν ένα ανάποδο δέντρο. Το σύμβολο του root είναι η /.
Ξεκινώντας από τον κατάλογο root φτιάχνουμε καταλόγους και μέσα στους καταλόγους υποκαταλόγους κ.ο.κ. Κάθε κατάλογος χρειάζεται να γνωρίζει τον γονεϊκό του κατάλογο (“parent directory”) και τα αρχεία που περιέχει (και από αυτά μερικά μπορεί να είναι υποκατάλογοι - και αυτοί αρχεία είναι).
΄Οπως είπαμε στο Unix έχουμε την ελευθερία να βάλουμε τα αρχεία μας όπου θέλουμε. Ευτυχώς όμως, υπάρχουν μερικές συμβάσεις που μπορούμε να περιμένουμε ότι στα περισσότερα συστήματα θα ακολουθούνται. ΄Ετσι, στον κατάλογο /home συνήθως βρίσκουμε τις προσωπικές περιοχές (home directories) των χρηστών, στον /etc τα αρχεία παραμετροποίησης λειτουργίας συστήματος (system configuration files), σε καταλόγους με όνομα bin τα εκτελέσιμα αρχεία των προγραμμάτων, σε καταλόγους με όνομα lib τις βιβλιοθήκες των προγραμμάτων.
Μερικές σημαντικές συμβάσεις για θέσεις στο filesystem είναι η . (τελεία = ο
τρέχων κατάλογος - current directory), οι .. (δύο τελείες = ο “γονεϊκός”
κατάλογος - parent directory) και η ~ (περισπωμένη = προσωπική περιοχή χρήστη -
home directory). ΄Εστω, για παράδειγμα, ότι είμαστε ο χρήστης george στον
τρέχοντα κατάλογο /home/george/Music/Rock (βλ. σχήμα 1.1). Τότε τα παρακάτω
paths αναφέρονται στο ίδιο αρχείο
/home/george/Doc/lyrics.doc:
Εισάγουμε τώρα παρακάτω τις βασικές εντολές για να πλοηγούμαστε στο filesystem4 . Η εντολή cd (change directory) αλλάζει τον τρέχοντα κατάλογο, ενώ η pwd (print working directory) μας αναφέρει τον τρέχοντα κατάλογο:
Το όρισμα της εντολής cd είναι ένα absolute ή relative path στο οποίο (αν είναι σωστό και έχουμε την άδεια πρόσβασης) “μεταβαίνουμε”5 . Εξαιρέσεις είναι να μη δοθεί όρισμα (πάμε στο home directory) ή ο χαρακτήρας - (πάμε εκεί που βρισκόμασταν πριν). Η εντολή mkdir δημιουργεί καινούργιους καταλόγους, ενώ η rmdir τους σβήνει αν είναι άδειοι. Δοκιμάστε:
Προσέξτε πως η mkdir δεν μπορεί να δημιουργήσει καταλόγους δύο επίπεδα πιο κάτω, ενώ η mkdir -p μπορεί. Ο “διακόπτης” -p αλλάζει τον τρόπο λειτουργίας της εντολής αυτής.
Για να δούμε τα περιεχόμενα ενός καταλόγου χρησιμοποιούμε την εντολή ls:
Με την πρώτη εντολή βλέπουμε τα περιεχόμενα του καταλόγου που βρισκόμαστε, ενώ στη δεύτερη (προφανώς το αρχείο Programs είναι υποκατάλογος) τα περιεχόμενα του καταλόγου που βάζουμε στην εντολή σαν όρισμα. ΄Ενας άλλος τρόπος να δώσουμε την εντολή είναι
O “διακόπτης ” (switch) -l κάνει την εντολή ls να συμπεριφερθεί διαφορετικά. Μας δίνει τα περιεχόμενα του current directory μαζί με χρήσιμες πληροφορίες για τα αρχεία που περιέχει. Η πρώτη στήλη έχει κωδικοποιημένες τις άδειες χρήσης για κάθε αρχείο (βλ. παρακάτω). Η δεύτερη τον αριθμό των συνδέσμων (links) των αρχείων. Η τρίτη το όνομα του χρήστη (user = george) στον οποίο ανήκουν τα αρχεία. Η τέταρτη την ομάδα (group = users) του αρχείου6 . Η πέμπτη το μέγεθος του αρχείου σε bytes = 8 bits. Οι επόμενες 3 τον χρόνο τελευταίας μετατροπής του αρχείου. Και τέλος, το όνομα του αρχείου.
Οι άδειες πρόσβασης r, w, x είναι άδειες πρόσβασης για read, write, execute. ΄Οποιος έχει άδεια r έχει άδεια να διαβάσει και να αντιγράψει ένα αρχείο. ΄Οποιος έχει άδεια w μπορεί να μεταβάλλει τα περιεχόμενα ενός αρχείου. ΄Οποιος έχει άδεια x μπορεί να εκτελέσει ένα αρχείο ως πρόγραμμα7 . Ειδικά για τους καταλόγους, για να μπορεί ο χρήστης/ομάδα/κόσμος να “μπει” σε έναν κατάλογο με την εντολή cd πρέπει να έχει άδεια x. Για να μπορέσει να σβήσει ένα αρχείο πρέπει να έχει άδεια w στον κατάλογο που ανήκει.
Οι άδειες χωρίζονται σε τρεις ομάδες: Ο ιδιοκτήτης του αρχείου (user- θέσεις 2-4), η ομάδα (group- θέσεις 5-7) και ο υπόλοιπος κόσμος (others-θέσεις 8-10). Παραδείγματος χάρη
Στην πρώτη περίπτωση, ο ιδιοκτήτης έχει άδεια read, write, αλλά όχι execute και η ομάδα/κόσμος έχει μόνο άδεια read. Στη δεύτερη, ο χρήστης έχει άδεια read, write, execute, η ομάδα άδεια read και ο κόσμος τίποτα. Στην τρίτη, ο χρήστης έχει άδεια read, write, execute, η ομάδα/κόσμος άδεια execute. Ειδικά στην τρίτη βρίσκουμε το χαρακτήρα d στην πρώτη θέση που δηλώνει ότι το αρχείο είναι κατάλογος (directory). Η πρώτη αυτή θέση, όταν είναι “κατειλημμένη”, δηλώνει αρχείο ειδικού τύπου.
Οι άδειες πρόσβασης αλλάζουν με την εντολή chmod:
Με την πρώτη εντολή ο ιδιοκτήτης (u user) παίρνει (+) άδεια x στο αρχείο
file. Με τη δεύτερη, ο κόσμος (o
others) και η ομάδα (g
group) χάνουν
(-) άδεια w, ενώ στην τρίτη όλοι (a
all) αποκτούν άδεια πρόσβασης
r.
Τελειώνουμε την παράγραφο αυτή αναφέροντας μερικές ακόμα βασικές εντολές που αναφέρονται στη διαχείριση των αρχείων. Η εντολή cp (copy) φτιάχνει αντίγραφα αρχείων:
Η πρώτη εντολή αντιγράφει τα δεδομένα του αρχείου file1.f90 σε ένα καινούργιο αρχείο file2.f90, αν αυτό δεν υπάρχει ήδη, ή αντικαθιστά το αρχείο file2.f90 από ένα καινούργιο με τα περιεχόμενα του file1.f90. Η δεύτερη αντιγράφει τα αρχεία file1.f90 file2.f90 file3.f90 στον κατάλογο Programs (αν δεν είναι κατάλογος εισπράττουμε ... παράπονα).
Η εντολή mv (move) “μετακινεί” ή μετονομάζει αρχεία:
Η πρώτη εντολή έχει ως αποτέλεσμα να μετονομάσει το αρχείο file1.f90 σε file2.f90. Η δεύτερη εντολή μετακινεί τα αρχεία file1.f90 file2.f90 file3.f90 στον κατάλογο Programs.
Τέλος, η εντολή rm (remove) διαγράφει αρχεία8 . Η εντολή αυτή δε “χαρίζει κάστανα”. ΄Οταν το αρχείο διαγράφεται, το λειτουργικό σύστημα δεν μπορεί να το επαναφέρει. Προσοχή λοιπόν
τα αρχεία file1.f90 file2.f90 file3.f90 δεν υπάρχουν πια για το λειτουργικό σύστημα9 . Για να είμαστε πιο προσεκτικοί μπορούμε να χρησιμοποιήσουμε τον διακόπτη -i. Τότε η εντολή ζητάει επιβεβαίωση πριν την καταστροφή:
Στην τελευταία γραμμή απαντήσαμε αρνητικά και έτσι το αρχείο file4.csh δεν διαγράφτηκε.
Η εντολή rm δε διαγράφει καταλόγους. Χρησιμοποιήστε την εντολή rmdir για τη διαγραφή άδειων καταλόγων. Για να διαγράψετε καταλόγους με περιεχόμενα χρησιμοποιήστε την εντολή10 rm -r. Λ.χ. έστω ότι έχουμε στους καταλόγους dir1 και dir1/dir2 τα αρχεία:
Οι εντολές
Με την τελευταία εντολή όλα τα παραπάνω αρχεία διαγράφονται. Εναλλακτικά, πρώτα αδειάζουμε τους καταλόγους από τα αρχεία και μετά τους διαγράφουμε με rmdir:
Παρατηρήστε ότι το ελληνικό ερωτηματικό (semicolon = “;”) χωρίζει εντολές οι οποίες εκτελούνται η μία μετά την άλλη.
Οι εντολές στο Unix είναι, όπως είπαμε, αρχεία με άδεια πρόσβασης x (execute). ΄Οταν στη γραμμή εντολών γράψουμε μία πρόταση λ.χ.
ο φλοιός (το πρόγραμμα με το οποίο ο χρήστης αλληλεπιδρά με το λειτ. σύστημα) την ερμηνεύει ως εξής: Η πρόταση χωρίζεται σε λέξεις και η πρώτη λέξη (ls) ερμηνεύεται ως εντολή. Οι υπόλοιπες περνάνε στην εντολή ως τα ορίσματά της. Κατά σύμβαση, λέξεις που αρχίζουν από τον χαρακτήρα - (λ.χ. -l, --help, --version, -O3) έχουν συνήθως ειδική ερμηνεία και ονομάζονται “διακόπτες” (options, switches) και κάνουνε το πρόγραμμα να εκτελείται με διαφορετικό τρόπο ανάλογα με τις τιμές τους. Είδαμε ήδη τη διαφορά με το πρόγραμμα ls που ανάλογα με το αν το καλούμε ως “ls” ή “ls -l”, τα αποτελέσματα τυπώνονται με διαφορετικό τρόπο.
Για να εκτελεστεί η εντολή ls ο φλοιός αναζητεί ένα αρχείο με το όνομα ls που να έχει άδεια πρόσβασης x. Για να καταλάβουμε πώς γίνεται η αναζήτηση αυτή πρέπει να εξηγήσουμε τι είναι οι μεταβλητές φλοιού και οι μεταβλητές περιβάλλοντος. Αυτές έχουν ένα όνομα που δίνεται από μια ακολουθία χαρακτήρων και οι τιμές τους λαμβάνονται προτάσσοντας τον χαρακτήρα $ στο όνομά τους. ΄Ετσι η μεταβλητή με το όνομα PATH έχει τιμή $PATH. Οι τιμές των μεταβλητών περιβάλλοντος τίθενται με την εντολή11 setenv για τις μεταβλητές περιβάλλοντος και με την εντολή set για τις μεταβλητές φλοιού:
Δύο μεταβλητές των οποίων αναλαμβάνει ο φλοιός να τις ορίσει σωστά στο περιβάλλον του χρήστη είναι οι PATH και path:
Βλέπουμε ότι η τιμή τους (που ο χρήστης μπορεί να αλλάξει!) αποτελείται από συνιστώσες που είναι διαδρομές στο σύστημα αρχείων. Στην πρώτη περίπτωση οι συνιστώσες χωρίζονται από κενό, ενώ στη δεύτερη από : (άνω-κάτω τελεία).
΄Ετσι, επιστρέφοντας στην ερώτηση πώς βρίσκει ο φλοιός την εντολή ls, θα είναι ήδη φανερό πως ψάχνει κάθε συνιστώσα της τιμής της μεταβλητής path μέχρι να τη βρει. Αν είστε περίεργοι, δώστε τις εντολές
από όπου είναι προφανές ότι το ζητούμενο αρχείο είναι το /bin/ls. Αν η διαδικασία αποτύχει, ο φλοιός δίνει μήνυμα σφάλματος. Αν πετύχει, το πρόγραμμα φορτώνεται από το λειτουργικό σύστημα στη μνήμη για εκτέλεση. Τα ορίσματα περνάνε στην εντολή, ώστε αυτή να τα ερμηνεύσει όπως έχει προγραμματιστεί. Στην εντολή
το όρισμα -l είναι διακόπτης που ερμηνεύεται από την εντολή να δώσει long listing των αρχείων. Τα ορίσματα test.f90 και test.dat ερμηνεύονται από την εντολή ως τα αρχεία που θα αναζητήσει για να μας δώσει πληροφορίες.
Μία σημαντική πληροφορία στην ερμηνεία των ορισμάτων είναι η χρήση “μπαλαντέρ” (wildcard):
θα κάνει τον φλοιό να αναπτύξει τα αστεράκια πριν να περάσει τα ορίσματα στο πρόγραμμα σε οποιαδήποτε ακολουθία χαρακτήρων δίνει ένα υπάρχον αρχείο. ΄Ετσι, αν ο κατάλογος που βρισκόμαστε περιέχει τα αρχεία test.f90, test1.f90, myprog.f90, test.dat, hello.dat, η εντολή που θα “δει” το λειτουργικό είναι
Αυτό συμβαίνει για οποιαδήποτε άλλη εντολή.
Σε κάθε εντολή συναρτάται η καθιερωμένη είσοδος stdin (standard input), η καθιερωμένη έξοδος stdout ( standard output) και η καθιερωμένη έξοδος σφαλμάτων stderr (standard error). Αυτές είναι συμβάσεις για αρχεία στα οποία το πρόγραμμα μπορεί να διαβάζει ή να τυπώνει δεδομένα. ΄Οταν ο χρήστης δουλεύει σε ένα τερματικό, όλες οι παραπάνω θεωρούνται αρχικά ότι είναι το τερματικό12 . Δηλ. μια εντολή που διαβάζει δεδομένα από το stdin, αυτά ο χρήστης θα τα εισάγει μέσω του τερματικού τυπώνοντάς τα με το πληκτρολόγιο. Αν μια εντολή τυπώνει στο stdout ή στο stderr, αυτά τυπώνονται στο τερματικό.
Η δυνατότητα που δίνει μεγάλη ευελιξία στον χρήστη να χειριστεί τις εντολές
είναι η δυνατότητα επαναορισμού των παραπάνω αρχείων. Ο χρήστης μπορεί να τα
ορίσει να είναι οποιοδήποτε αρχείο. Ο επαναορισμός του stdout γίνεται με το
σύμβολο .
Στην πρώτη εντολή βλέπουμε τα περιεχόμενα του καταλόγου. Στη δεύτερη
επαναορίζουμε το stdout να είναι το αρχείο results. Μετά την εκτέλεση της
εντολής παρατηρούμε τη δημιουργία του αρχείου results το οποίο περιέχει σαν
δεδομένα τα ονόματα των αρχείων file1.f90 file2.f90 file3.f90 file4.csh.
Αν το αρχείο results δεν υπάρχει, δημιουργείται, αν υπάρχει, τα περιεχόμενα του
καταστρέφονται και αντικαθίστανται από το stdout της εντολής. Για να
επισυνάψουμε (append) τα δεδομένα του stdout στο τέλος ενός ήδη υπάρχοντος
αρχείου, χρησιμοποιούμε το σύμβολο . ΄Ετσι, αν μετά από τις παραπάνω εντολές
εκτελέσουμε
τότε τα περιεχόμενα του αρχείου results θα είναι
Ο επαναορισμός του stdin γίνεται με το σύμβολο , ενώ του stderr με το σύμβολο
&13 .
Σχετικά παραδείγματα θα δούμε στην παράγραφο 1.2.
Είναι δυνατόν το stdin/stdout μιας εντολής να οριστεί να είναι το stdout/stdin μιας άλλης εντολής. Με τον τρόπο αυτό μπορούν να συνδυαστούν οι λειτουργίες διαφορετικών εντολών, έτσι ώστε να παράγουν αποτελέσματα για τα οποία θα χρειαζόταν να γράψουμε ένα αρκετά πολύπλοκο πρόγραμμα για να τα πάρουμε. Η διαδικασία αυτή λέγεται “διασωλήνωση” (piping) και χρησιμοποιείται κυρίως για τη δημιουργία ισχυρών φίλτρων. Για τον σκοπό αυτό χρησιμοποιείται το σύμβολο |
Με την παραπάνω πρόταση το stdout της εντολής cmd1 γίνεται stdin της εντολής cmd2, το stdout της εντολής cmd2 γίνεται stdin της εντολής cmd3 κοκ. Σχετικά παραδείγματα θα δούμε στη παράγραφο 1.2.
Το Unix απέκτησε τη φήμη λειτουργικού συστήματος μη φιλικού προς τον χρήστη. Τίποτα δεν απέχει περισσότερο από την πραγματικότητα. Παρόλο που έχει μια αρχική δυσκολία, η οποία λύνεται αν ο χρήστης μεθοδικά διαβάσει και εξασκηθεί στις βασικές εντολές του συστήματος, στη συνέχεια, όλες οι πληροφορίες για να κάνει ο χρήστης οτιδήποτε είναι διαθέσιμες online14 .
Το κλειδί για άνετη πλεύση σε αυτό το ταξίδι είναι να μάθει ο χρήστης να χρησιμοποιεί το σύστημα βοήθειας που παρέχεται εντός και εκτός συστήματος. Οι περισσότερες εντολές παρέχουν βασικές πληροφορίες από μόνες τους. Από τη γραμμή εντολών, για τυχαία εντολή cmd δοκιμάστε:
Για παράδειγμα, δώστε την εντολή ls --help. Αν είναι εφαρμογή παραθυρική, αρχίστε από το σχεδόν πάντοτε διαθέσιμο menu “Help”. Μη φοβηθείτε να διαβάσετε...
Ας υποθέσουμε πως έχουμε ακούσει κάτι για μια εντολή που λέγεται printf ή κάτι τέτοιο τέλος πάντων. Το πρώτο σύστημα βοήθειας είναι τα man pages. Αυτό είναι ένα σύστημα από help files που τα αναζητούμε με την εντολή man:
Η εντολή info δίνει περισσότερες πληροφορίες σε μορφή “βιβλίου” με βασικές δυνατότητες ξεφυλλίσματος (browsing).
οι εντολές
μας πληροφορούν ότι υπάρχουν και άλλες, πιθανώς σχετιζόμενες εντολές fprintf, fwprintf, wprintf, sprintf.... Ειδικά το αποτέλεσμα της δεύτερης το παραθέτουμε γιατί είναι διδακτικό:
Η δεύτερη στήλη είναι το “τμήμα” (section) των man pages στο οποίο αναφέρεται η εντολή. Η πρόσβαση στα τμήματα γίνεται δίνοντας το σαν όρισμα στην εντολή:
δίνει πρόσβαση στις αντίστοιχες πληροφορίες. Στο τμήμα ένα βρίσκουμε το printf ως “κοινή εντολή”, στο τμήμα 3 ως συνάρτηση της γλώσσας C. ΄Αλλα τμήματα είναι το 2 (εντολές διαχείρισης συστήματος), 4, 5, 8 κλπ. Περιηγηθείτε στον κατάλογο /usr/share/man/ για να δείτε με τα μάτια σας περισσότερα.
Δίνοντας την εντολή
παίρνουμε πάλι αρκετή πληροφορία. Η εντολή
μας δείχνει πολλά σχετικά αρχεία στο σύστημα. Οι εντολές
μας δίνουν πληροφορία για το πού βρίσκονται τα αρχεία-προγράμματα που εκτελούνται, όταν δίνεται η εντολή printf.
Μια άλλη σημαντική ευκολία που μας προσφέρει ο φλοιός είναι η “συμπλήρωση εντολών”. Μπορούμε να γράψουμε μέρος του ονόματος μιας εντολής και να πατήσουμε τον συνδυασμό πλήκτρων [Ctrl-d]15 (δηλ. ταυτόχρονα το πλήκτρο Ctrl και το πλήκτρο d). Τότε ο φλοιός θα μας συμπληρώσει όλες τις εντολές των οποίων το όνομα αρχίζει με τα γράμματα που έχουμε ήδη γράψει16 :
Δοκιμάστε λ.χ. την εντολή x[Ctrl-d] και θα μάθετε (σχεδόν) τα πάντα για τις εντολές διαθέσιμες στο παραθυρικό σύστημα X: xterm, xeyes, xclock, xcalc, ....
Τέλος, μεγάλη πηγή πληροφοριών είναι το διαδίκτυο. Google your blues... και θα εκπλαγείτε πόσοι άλλοι έχουν ασχοληθεί με το πρόβλημά σας.
Για την ανάλυση των δεδομένων που θα παράγουμε χρειαζόμαστε εργαλεία τα οποία να επεξεργάζονται ευέλικτα τα αρχεία κειμένου17 . Μερικά εργαλεία που μπορούν να φτιάξουν περίπλοκα και ισχυρά φίλτρα είναι τα προγράμματα cat, less, head, tail, grep, sort και awk. Ας αναφέρουμε και τα προγράμματα perl και sed για τον αναγνώστη που ενδιαφέρεται να πλουτίσει το οπλοστάσιό του, παρόλο που δε θα τα περιγράψουμε εδώ λόγω χώρου.
Ας υποθέσουμε ότι έχουμε το αρχείο με δεδομένα με όνομα data18 με τα περιεχόμενα μιας αποθήκης τροφίμων και το κοστολόγιό τους:
Η εντολή
απλά τυπώνει τα περιεχόμενα στο stdout. Η εντολή παίρνει τα αρχεία από το όρισμα της εντολής ή αν δε δοθούν, το stdin και τυπώνει τα περιεχόμενά τους στο stdout. Αφού αυτά μπορεί να επαναοριστούν, η εντολή
παίρνει τα περιεχόμενα του αρχείου data από το stdin και τα τυπώνει στο stdout που εδώ έχει επαναοριστεί να είναι το αρχείο data1. Η εντολή έχει ισοδύναμο αποτέλεσμα με την
Η εντολή
τυπώνει πρώτα τα περιεχόμενα του data και μετά του data1 μέσα στο αρχείο data2.
Η εντολή
τυπώνει στο stdout τα περιεχόμενα του data σελίδα-σελίδα. Πατήστε [space] για να προχωρήσετε μια σελίδα, [b] για να γυρίσετε πίσω μια σελίδα και τα πάνω/κάτω βελάκια για να προχωρήστε μια γραμμή. Με [g] πάτε στην αρχή του αρχείου και με [G] στο τέλος. Με [h] παίρνετε βοήθεια και με [q]... αναχωρείτε (quit).
Με τις εντολές
παίρνουμε την πρώτη γραμμή του αρχείου data, τις δύο τελευταίες και την δεύτερη από το τέλος αντίστοιχα. Προσέξτε πώς με piping των δύο εντολών τις συνδυάσαμε για να φτιάξουμε το φίλτρο “τύπωσε τη δεύτερη γραμμή από το τέλος ”.
Η εντολή sort τυπώνει τα περιεχόμενα του αρχείου κατά αύξουσα διάταξη των γραμμών, όπου η σύγκριση γίνεται χαρακτήρα–χαρακτήρα (όχι αριθμητικά):
Για αντίστροφη διάταξη δοκιμάστε την εντολή sort -r data. Για να διατάξουμε τα περιεχόμενα συγκρίνοντας τους αριθμούς στη δεύτερη στήλη χρησιμοποιούμε τον διακόπτη -k 2 (=δεύτερη στήλη) και -n (=αριθμητική – numerical – διάταξη):
Αν αμελήσω τον διακόπτη -n οι γραμμές συγκρίνονται με βάση τους χαρακτήρες της λέξης στη δεύτερη στήλη:
Η τελευταία στήλη έχει αριθμούς με υποδιαστολή (όχι ακεραίους). Για να κάνουμε τη διάταξη με βάση την αξία τέτοιων αριθμών βάζουμε το διακόπτη -g:
Η εντολή grep αναλύει ένα αρχείο κειμένου γραμμή–γραμμή αναζητώντας μια ακολουθία χαρακτήρων που έχουμε ζητήσει. Κάθε τέτοια γραμμή που βρίσκει την τυπώνει στο stdout:
τυπώνει κάθε γραμμή που έχει το “kilos”. Αν θέλουμε να τυπώνει κάθε γραμμή που δεν περιέχει το kilos, προσθέτουμε τον διακόπτη -v:
Η ακολουθία χαρακτήρων που αναζητούμε μπορεί να είναι ένα regular expression. Για να περιγράψουμε πλήρως τα θηρία αυτά, θέλουμε μισό βιβλίο... Μερικά παραδείγματα:
Η πρώτη τυπώνει τις γραμμές που αρχίζουν από b (αγνοεί την 2η γραμμή), η δεύτερη αυτές που τελειώνουν σε 0 (αγνοεί την πρώτη γραμμή) ενώ η τρίτη γραμμές που περιέχουν τις ακολουθίες χαρακτήρων 32 ή 34 (αγνοεί την τελευταία γραμμή).
Το πιο δυνατό όμως εργαλείο για ανάλυση είναι το πρόγραμμα awk. Στην πιο απλή του χρήση, αναλύει το κείμενο του αρχείου γραμμή–γραμμή και ορίζει μεταβλητές $1, $2, ... στις οποίες αποθηκεύει την τιμή της πρώτης, δεύτερης, ... λέξης της γραμμής. Στη μεταβλητή $0 αποθηκεύει όλη τη γραμμή, ενώ η μεταβλητή NF μετράει τον αριθμό των λέξεων στη γραμμή. Η μεταβλητή NR μετράει τις γραμμές που έχει επεξεργαστεί μέχρι στιγμής.
΄Ενα πρόγραμμα awk μπορεί να γραφτεί στη γραμμή εντολών. Είναι εντολές που περικλείονται ανάμεσα σε αγκύλες { ... } και εκτελούνται για κάθε γραμμή του αρχείου. Ειδική περίπτωση αποτελούν οι εντολές που γράφονται μέσα στο κατασκεύασμα BEGIN{ ... } και END{ ... } που είναι εντολές που εκτελούνται μια φορά πριν την επεξεργασία και μετά την επεξεργασία των γραμμών του αρχείου. Για παράδειγμα η εντολή:
τυπώνει το είδος (1η στήλη= $1) και την συνολική αξία του: ποσότητα
(2η στήλη= $2) αξία μονάδας (4η στήλη= $4). ΄Αλλα παραδείγματα
είναι
Στην πρώτη εντολή υπολογίζουμε τη συνολική αξία των προϊόντων: Σε κάθε γραμμή προσθέτουμε (+=) στη μεταβλητή value την συνολική αξία του προϊόντος. Στο τέλος (END{ ... }) τυπώνουμε το άθροισμα που συσσωρεύσαμε στο τέλος του αρχείου. Η δεύτερη εντολή τυπώνει τη μέση τιμή των τιμών. Με τον ίδιο τρόπο προσθέτουμε στη μεταβλητή av την τιμή κάθε προϊόντος (2η στήλη= $2) και στο τέλος, τυπώνουμε το σύνολο δια τον αριθμό των προϊόντων (=αρ. γραμμών = NR). Η τελευταία εντολή κάνει μια αυθαίρετη αριθμητική πράξη: Τυπώνει το τετράγωνο της δεύτερης στήλης επί το ημίτονο της τέταρτης και προσθέτει το εκθετικό της -4ης στήλης.
Οι δυνατότητες των παραπάνω εργαλείων δεν εξαντλούνται σε ένα μικρό κεφάλαιο. Διαβάστε τις man και info pages και θα μάθετε να τις κάνετε να ψήνουν και ... καφέ!
Στο κεφάλαιο αυτό θα παρουσιάσουμε τα θεμελιώδη για τη χρήση ενός editor19 για προγραμματισμό. Για έναν προγραμματιστή που προγραμματίζει αρκετές ώρες κάθε μέρα, το περιβάλλον και τα εργαλεία επεξεργασίας του κειμένου των εντολών προγραμματισμού καθορίζουν κατά ένα σημαντικό ποσοστό τη συνολική ...ποιότητα της ζωής του/της. Και όπως βλέπετε είμαστε αρκετά προσεκτικοί στη διατύπωση: Δε μιλάμε για προγράμματα επεξεργασίας κειμένου μορφοποιημένων εγγράφων (λ.χ. Open Office) που δίνουν έμφαση στη φόρμα του κειμένου, αλλά για επεξεργαστές απλού κειμένου που αποτελείται από σκέτους (χωρίς φόρμα) χαρακτήρες που “διαβάζονται” (“printable characters” σε αντίθεση με τους “non printable characters”). Παραδείγματα απλών τέτοιων επεξεργαστών στο Linux είναι οι επεξεργαστές gedit, vi, pico, nano κλπ που θα μπορούσε κανείς να χρησιμοποιήσει εναλλακτικά για την επεξεργασία του κώδικα στα προγράμματα που παρουσιάζουμε στο μάθημα. Με αυτούς μπορεί κάποιος εύκολα να επεξεργαστεί απλά προγράμματα έχοντας βασικές λειτουργίες επεξεργασίας κειμένου (editing). ϒπάρχουν λειτουργίες σε έναν επεξεργαστή κειμένου που κάνει τον προγραμματισμό ανετότερο και βοηθά στην ... υγιεινή κρατώντας μακριά τα ενοχλητικά ... έντομα! Λ.χ. η αναγνώριση από τον επεξεργαστή των εντολών της γλώσσας προγραμματισμού, των μεταβλητών και των δομικών στοιχείων επιτρέπει την “όμορφη” παρουσίασή τους με κατάλληλο χρωματισμό ή/και font, επισημαίνει σφάλματα όταν δεν κλείνουν παρενθέσεις ή οι εντολές δεν μπαίνουν στο σωστό σημείο στο αρχείο του προγράμματος κλπ. ΄Ενας “πολύγλωσσος” και “πολυμορφικός” επεξεργαστής κειμένου με πολλές δυνατότητες και ευκολίες για τον προγραμματιστή είναι ο GNU Emacs editor20 . Ο Emacs είναι ανοιχτό λογισμικό, διατίθεται ελεύθερα και μπορεί να εγκατασταθεί σε λειτουργικό σύστημα Linux, Mac και MS Windows. Ο χρήστης μπορεί να τον προγραμματίσει21 να εκτελεί απλές, αλλά και σύνθετες λειτουργίες της αρεσκείας του/της, καθώς και να έχει μια σχεδόν ολοκληρωμένη αλληλεπίδραση με το λειτουργικό σύστημα και πολλές από τις εφαρμογές που βρίσκονται σε αυτό. Ο πιο προχωρημένος χρήστης μπορεί λ.χ. να επεξεργαστεί ένα αρχείο σε γλώσσα Fortran, να το μεταγλωττίσει και να το διορθώσει με τη βοήθεια του debugger δίνοντας εντολές μέσα από τον Emacs.
Για τον προγραμματισμό πολύπλοκων προγραμμάτων με πολλές χιλιάδες γραμμές κώδικα και πολύπλοκο συσχετισμό διεργασιών είναι συνηθισμένο να χρησιμοποιούνται εξειδικευμένα περιβάλλοντα προγραμματισμού. Αυτά προσφέρουν στον προγραμματιστή ολοκληρωμένες λύσεις για τον προγραμματισμό σε μια γλώσσα (λ.χ. C++, Java κλπ) ενσωματώνοντας σε ένα απλό interface και τις λειτουργίες μεταγλωττισμού, debugging, βοήθειας κλπ. Το μειονέκτημα σε αυτά είναι η εξειδίκευση που περιορίζει την ελευθερία του προγραμματιστή ως προς την επιλογή γλώσσας, βιβλιοθηκών, λειτουργικού συστήματος και συνήθως έχουν ακριβές άδειες χρήσης. Είναι, επίσης, δύσχρηστη η μεταφορά των εργασιών ενός προγραμματιστή από έναν υπολογιστή σε έναν άλλο και φυσικά η επεξεργασία του προγράμματος από διαφορετικά περιβάλλοντα προγραμματισμού. Η πολύπλοκη και εξειδικευμένη παραμετροποίησή τους συνήθως “δένει” τον προγραμματιστή και το πρόγραμμα με το συγκεκριμένο πακέτο περιβάλλοντος προγραμματισμού.
Στη γραμμή εντολών πληκτρολογήστε:
Προσέξτε τον χαρακτήρα & στο τέλος της εντολής. Χωρίς αυτόν το prompt του φλοιού δεν επιστρέφει και δεν μπορούμε να δώσουμε άλλη εντολή από τον φλοιό. Με αυτόν η εντολή (όπως και κάθε εντολή την οποία τελειώνουμε με το &) πάει στο “υπόβαθρο” (background) δηλ. ξεκινάει μία διεργασία ανεξάρτητη από τον φλοιό η οποία λειτουργεί ακόμα και αν η διεργασία του φλοιού τερματιστεί.
Τα παραπάνω ισχύουν όταν έχουμε παραθυρικό περιβάλλον και τότε ο Emacs ξεκινάει στο δικό του ανεξάρτητο παράθυρο. Μπορούμε όμως να τρέχουμε τον Emacs και σε ένα απλό τερματικό, είτε για γρήγορη επεξεργασία κειμένου είτε γιατί δε διαθέτουμε παραθυρικό περιβάλλον22 αλλά μόνο κονσόλα. Στην τελευταία περίπτωση απλά παραλείπουμε το & στο τέλος της εντολής, ενώ αν έχουμε παραθυρικό περιβάλλον και θέλουμε ο Emacs να τρέξει στην κονσόλα, δίνουμε την εντολή
και ο Emacs θα ξεκινήσει μέσα στην κονσόλα.
Με τον Emacs αλληλεπιδρούμε με διάφορους τρόπους. Οι “νεοφώτιστοι αρχάριοι” θα προτιμήσουν τα κουμπιά και τα μενού που προσφέρει που συνήθως έχουν διαισθητική μορφή και ονόματα που συναντά στους περισσότερους επεξεργαστές κειμένου. Αλλά για να χρησιμοποιήσει κανείς τις προχωρημένες δυνατότητες του Emacs είναι καλό να συνηθίσει τις άλλες μορφές αλληλεπίδρασης που είναι οι συντομεύσεις πλήκτρων και η εκτέλεση εντολών με το όνομά τους από τη γραμμή εντολών του Emacs, το minibuffer23 .
Οι εντολές που δίνονται με συντομεύσεις από το πληκτρολόγιο είναι συνδυασμός πλήκτρων που πατά κάποιος σε συνδυασμό με τα πλήκτρα Ctrl (Control key) και Alt. Θα ακολουθήσουμε την εξής σύμβαση: ΄Οταν γράφουμε έναν συνδυασμό πλήκτρων αρχίζοντας με C-, θα εννοούμε ότι τα πλήκτρα που ακολουθούν πατιούνται ταυτόχρονα με το Control key, ενώ αν γράφουμε M-, θα εννοούμε ότι τα πλήκτρα που ακολουθούν πατιούνται ταυτόχρονα με το Alt key24 . Μερικές εντολές συντομεύονται από μια ακολουθία από δύο ή περισσότερους χαρακτήρες. Λ.χ. πατώντας C-x C-c (δηλ. κρατάμε πατημένο το Ctrl key και ταυτόχρονα πατάμε το x και μετά κρατώντας πατημένο το Ctrl key πατάμε το c) δίνουμε την εντολή να βγούμε από τον Emacs, ενώ πατώντας C-x 2 (δηλ. κρατάμε πατημένο το Ctrl key και ταυτόχρονα πατάμε το x και μετά αφήνουμε το Ctrl key και πατάμε το 2) δίνουμε την εντολή να χωριστεί το παράθυρο του buffer που βρισκόμαστε σε δύο ίσα μέρη.
Οι πιο χρήσιμες συντομεύσεις είναι οι M-x (πατάμε το Alt και κρατώντας το πατημένο πατάμε το x) και η C-g. Η πρώτη μας οδηγεί στο minibuffer από όπου μπορούμε να δώσουμε μία εντολή με το όνομά της. Για παράδειγμα, δώστε την εντολή save-buffers-kill-emacs που απλά θα τερματίσει τη συνεδρία του Emacs. Η δεύτερη είναι το “κουμπί SOS” που διακόπτει οτιδήποτε κάνει ο Emacs (λ.χ. αν κάποια εντολή κολλήσει, δώσουμε λάθος εντολή κλπ): Πατώντας C-g ο Emacs σταματάει οποιαδήποτε διεργασία κάνει και επιστρέφει στο buffer που εργαζόμαστε. Λ.χ. αν πατήστε κατά λάθος M-x και βρεθείτε στο minibuffer χωρίς να το θέλετε, πατήστε C-g για να ακυρώσετε τη διαδικασία και να επιστρέψετε στο buffer που επεξεργαζόσαστε.
Είναι, επίσης, χρήσιμο να ορίσουμε συμβάσεις που να υποδηλώνουν τι κάνουμε με το ποντίκι. Με Mouse-1, Mouse-2, Mouse-3 υποδηλώνουμε ένα απλό κλικ με το αριστερό, μεσαίο25 και δεξί κουμπί αντίστοιχα. Με Drag-Mouse-1 υποδηλώνουμε ότι κρατάμε το αριστερό κουμπί διαρκώς κρατημένο και ταυτόχρονα σέρνουμε το ποντίκι.
Ανακεφαλαιώνουμε συνοψίζοντας τους δυνατούς τρόπους για να δίνουμε μία εντολή στον Emacs. Θεωρούμε λ.χ. την εντολή που ανοίγει ένα καινούργιο αρχείο σε ένα buffer:
Ο πρώτος τρόπος είναι διαθέσιμος για τις πολύ βασικές εντολές, ο δεύτερος για περισσότερες, ο τρίτος για τις περισσότερες (αλλά όχι όλες) και ο τέταρτος για όλες τις εντολές που είναι διαθέσιμες για διαδραστική χρήση.
Για να επεξεργαστούμε ένα αρχείο, ο Emacs τοποθετεί τα περιεχόμενά του σε ένα buffer. Το buffer είναι ένα κομμάτι της μνήμης όπου αντιγράφονται τα περιεχόμενα ενός αρχείου και όχι το ίδιο το αρχείο. Για να καταγραφούν οι αλλαγές στα περιεχόμενα ενός buffer πρέπει να τις “σώσουμε”, δηλ. ο Emacs να γράψει το buffer πίσω στο αρχείο. Μέχρι να γίνει αυτό το αρχικό αρχείο μένει ανέπαφο26 . Ο Emacs μπορεί να έχει ανοιχτά πολλά buffers τα οποία, όταν συνδέονται με ένα αρχείο, έχουν από προεπιλογή το ίδιο όνομα του αρχείου27 . Το όνομα ενός buffer φαίνεται στη mode line του Emacs όπως φαίνεται στο σχήμα 1.3. Ο κύκλος επεξεργασίας ενός αρχείου συνοψίζεται στα εξής σημεία:
Φυσικά αν το αρχείο δεν υπάρχει και δημιουργείται εξ’ αρχής, το πρώτο βήμα παραλείπεται.
Το σημείο στο οποίο βρισκόμαστε νοητά και εισάγουμε κείμενο λέγεται “το σημείο” (point). Αυτό καταδεικνύεται από τον δρομέα (cursor) που τυπικά είναι ένα κόκκινο τετραγωνάκι που αναβοσβήνει28 . Κάθε buffer έχει μία θέση που ονομάζεται “το σημάδι” (the mark) το οποίο μαζί με το σημείο ορίζει σε κάθε παράθυρο την “περιοχή” (the region). Αυτή είναι μια νοητή περιοχή κειμένου σε κάθε παράθυρο όπου μπορούν να δράσουν οι συναρτήσεις του Emacs (λ.χ. αποκοπή, αντιγραφή, αλλαγή κεφαλαίων σε μικρά γράμματα, έλεγχος ορθογραφίας κλπ). Την περιοχή τη θέτουμε ορίζοντας το σημάδι (mark) επιλέγοντας ένα σημείο και πληκτρολογώντας C-SPC29 (ή στο minibuffer M-x set-mark-command). Μετακινώντας τον δρομέα στο σημείο που θέλουμε, ορίζουμε την επιθυμητή περιοχή. Εναλλακτικά με το Drag-Mouse-1 (κρατάμε αριστερό κουμπί ποντικιού πατημένο και σέρνουμε το ποντίκι) μαρκάρουμε μία περιοχή. Το σημάδι μπορεί να τεθεί και με Mouse-3 δηλ. με απλό κλικ του δεξιού πλήκτρου του ποντικιού (άρα, Mouse-1 Mouse-3 ορίζουν μία περιοχή θέτοντας πρώτα το σημείο και μετά το σημάδι).
Ανοίγουμε ένα αρχείο με την εντολή C-x C-f και πληκτρολογώντας το όνομά του. Αν το αρχείο υπάρχει, βλέπουμε τα περιεχόμενά του στο buffer που δημιουργείται, αλλιώς παίρνουμε ένα άδειο buffer. Τότε:
Μόλις τελειώσουμε σώζουμε τις αλλαγές που κάναμε με την εντολή C-s ή από το
εικονίδιο “δισκέτα” ή από το μενού FileSave. Επίσης, η εντολή στο
minibuffer είναι M-x save-buffer.
Για πιο προχωρημένη επεξεργασία ακολουθούμε τις παρακάτω οδηγίες:
Το Edit μενού έχει πολλές από τις παραπάνω λειτουργίες για τους νεοσύλλεκτους.
Τίποτα, επίσης, δε μας εμποδίζει οι αποκοπές, αντιγραφές, επικολλήσεις να γίνονται από το ένα παράθυρο στο άλλο ακόμα και αν πρόκειται για buffer συνδεδεμένα με διαφορετικά αρχεία.
Πολλές φορές είναι βολικό να επεξεργαζόμαστε το ίδιο ή διαφορετικά αρχεία σε διαφορετικά παράθυρα. Το “παράθυρο” (window) στον Emacs αναφέρεται σε διαφορετικές περιοχές του ίδιου παράθυρου με την έννοια που δίνουμε σε ένα παραθυρικό περιβάλλον. Ο Emacs μπορεί να χωρίσει ένα παράθυρο σε ένα ή περισσότερα παράθυρα οριζόντια ή κάθετα. Μελετήστε το σχήμα 1.5 στη σελίδα 82 στο οποίο επεξηγούνται οι βασικές έννοιες. Επίσης, μπορεί να ανοίξει ένα διαφορετικό παράθυρο με την έννοια του παραθυρικού περιβάλλοντος. Τέτοια παράθυρα λέγονται “πλαίσια” (frames)32 . Θα κρατήσουμε αυτή την ορολογία όταν αναφερόμαστε στον Emacs.
Διαφορετικά παράθυρα μπορείτε να έχετε και όταν ο Emacs τρέχει στην κονσόλα, κάτι που μπορεί να είναι η μεγαλύτερη ευλογία για προχωρημένη επεξεργασία κειμένου, όταν δε βρίσκεστε σε παραθυρικό περιβάλλον. Φυσικά, τότε δεν μπορείτε να έχετε διαφορετικά πλαίσια.
Σε κάθε buffer που επισκεπτόμαστε ο Emacs μπορεί να βρίσκεται σε διαφορετικά modes (όχι ένα, αλλά πολλά). Σε διαφορετικά modes οι συντομεύσεις των εντολών από το πληκτρολόγιο μπορεί να είναι διαφορετικές, ο χρωματισμός των δομικών στοιχείων του buffer διαφορετικός κλπ. ϒπάρχουν major modes που είναι μοναδικές για κάθε buffer, αλλά και minor modes που μπορεί να συνυπάρχουν αρμονικά μαζί με άλλες major και minor modes. Ο Emacs μπορεί να ξεκινά αυτόματα μία major και μία ή περισσότερες minor modes ανάλογα με το όνομα ή/και το περιεχόμενο του αρχείου που επισκεπτόμαστε. Μπορούμε όμως και εμείς ρητά να επιλέξουμε και να επιβάλλουμε τις modes που επιθυμούμε με τις κατάλληλες εντολές.
Οι modes οι οποίες είναι ενεργές σε ένα buffer σημειώνονται μέσα σε παρένθεση στη mode line (βλ. σχήμα 1.3 και 1.5).
Minor modes που παρουσιάζουν ενδιαφέρον είναι οι:
Σε παραθυρικό περιβάλλον έχουμε τη δυνατότητα να επιλέξουμε modes από την mode line. Με το Mouse-3 πάνω στο όνομα μιας mode μας δίνονται επιλογές για την (απ)ενεργοποίηση minor modes. Με το Mouse-1 μπορούμε να (απ)ενεργοποιήσουμε την read-only mode κάνοντας κλικ αριστερά στο :%% ή :-- αντίστοιχα. Βλέπε σχήμα 1.5.
Ο Emacs έχει πολύ λεπτομερή online τεκμηρίωση. Στους νέους χρήστες συστήνεται
να ακολουθήσουν τις οδηγίες στο emacs tutorial το οποίο εκπαιδεύει τον χρήστη
στις βασικές εντολές χρήσης και επεξεργασίας κειμένου. Αυτό γίνεται με την εντολή
C-h t ή από το μενού HelpEmacs Tutorial. Αφεθείτε στις οδηγίες και είναι
... διασκεδαστικό. Η man page του (εντολή man emacs) έχει συνοπτικές
πληροφορίες, κυρίως για τον τρόπο που καλείται ο Emacs από τη γραμμή
εντολών.
Πολύ εκτενής τεκμηρίωση βρίσκεται στις info
pages33 .
Η χρήση του info είναι κεφάλαιο βιβλίου από μόνη της, αλλά στο παραθυρικό
περιβάλλον του Emacs είναι σχετικά απλή. Με την εντολή C-h r (μενού
HelpRead the Emacs Manual) ανοίγουμε απευθείας τη σελίδα του
Emacs. Πατώντας τα πλήκτρα SPC και Backspace διαβάζουμε την τεκμηρίωση
σελίδα–σελίδα. Αλλά στο info έχουμε υπερσυνδέσμους όπως στην πλοήγηση στο
διαδίκτυο. Με Mouse-1 επιλέγετε έναν σύνδεσμο και με τα βελάκια στα
εικονίδια μπορείτε να πάτε στον προηγούμενο/επόμενο σύνδεσμο όπως και στην
προηγούμενη θέση που είσαστε. Πατώντας πλήκτρα, δίνετε εντολές στο info,
λ.χ. πατώντας d βρίσκεστε στον κεντρικό κατάλογο του info και μπορείτε
να δείτε όλες τις εφαρμογές που έχουν info τεκμηρίωση. Με την εντολή
g (info) (πληκτρολογήστε τους χαρακτήρες όπως τους βλέπετε με τις
παρενθέσεις) βρίσκεστε στην τεκμηρίωση του info και εκεί μπορείτε να μάθετε την
προχωρημένη χρήση της για να διαβάζετε αποτελεσματικά την τεκμηρίωση των
εφαρμογών.
Ο Emacs είναι δομημένος διαισθητικά και φιλικά προς τον χρήστη. Τα περισσότερα θα τα μάθετε όχι από προσεκτική μελέτη του εγχειρίδιου χρήσης, αλλά από τα ίδια τα ονόματα των εντολών και τη συνοπτική τεκμηρίωσή τους. ΄Ολες οι εντολές του Emacs αποτελούνται από ολόκληρες λέξεις που χωρίζονται με ένα - που σχεδόν σχηματίζουν πλήρεις προτάσεις.
Ο Emacs έχει δυνατότητα παραμετροποίησης σε οποιοδήποτε βάθος: Από την απλή
σύνδεση πλήκτρων με εντολές που θέλουμε να συντομεύσουμε μέχρι τον
προγραμματισμό πολύπλοκων λειτουργιών στη γλώσσα Elisp. Ο πιο διαδεδομένος
τρόπος για τον μέσο χρήστη είναι να εισάγει τις κατάλληλες εντολές στο αρχείο
/.emacs στην προσωπική του περιοχή. Ο Emacs διαβάζει και εκτελεί τις
εντολές αυτές πριν ξεκινήσει. Παράδειγμα ενός τέτοιου αρχείου με ενδεικτικές
λειτουργίες είναι το παρακάτω:
Στα περιεχόμενα του παραπάνω αρχείου τα ελληνικά ερωτηματικά ; ορίζουν το υπόλοιπο της γραμμής να είναι σχόλια, τα οποία είναι για μας και αγνοούνται (δεν ερμηνεύονται). Οι πρώτες τρεις εντολές δεσμεύουν τα πλήκτρα F1, C-c s και M-s σε συγκεκριμένες συναρτήσεις-εντολές. Η επόμενη δείχνει πώς να ορίσουμε ψευδώνυμo (alias) μιας εντολής που χρησιμοποιούμε συχνά. Οι τελευταίες δύο ορίζουν δύο πολύ απλές συναρτήσεις (fm) και (sign) που μπορούμε να τις καλέσουμε από το minibuffer όπως αναφέρεται στα σχετικά σχόλια.
Για περισσότερα παραδείγματα αναζητήστε στο Google: “emacs .emacs file” για να δείτε τα αρχεία που χρησιμοποιούν άλλοι χρήστες.
Επίσης, είναι δυνατόν να παραμετροποιήσετε τον Emacs από το μενού Options
Customize Emacs.
Για τη σε βάθος εκμάθηση της γλώσσας Elisp σας παραπέμπουμε στο Emacs
Lisp Reference Manual στη διεύθυνση
www.gnu.org/software/emacs/manual/elisp.html
Με πολλή συντομία περιγράφουμε πώς γίνεται να επεξεργαστούμε αρχεία με ελληνικούς χαρακτήρες. Εδώ ο χρήστης πρέπει να προσδιορίσει αν οι ελληνικοί χαρακτήρες θα αναπαρίστανται από τους 8-bit χαρακτήρες του συστήματος iso8859-734 ή από τους πιο διαδεδομένους 16-bit Unicode χαρακτήρες.
Για να μπορέσουμε να διαβάσουμε αρχεία με χαρακτήρες Unicode πρέπει ο Emacs σε ένα παραθυρικό περιβάλλον να ξεκινήσει με μία κατάλληλη γραμματοσειρά Unicode (UTF)35 . Αν αυτό δεν είναι η προεπιλογή, επιλέγουμε εμείς μία γραμματοσειρά36 . Μια επιλογή δίνεται από την παρακάτω εντολή (ο χαρακτήρας ∖ συνεχίζει την εντολή στην επόμενη γραμμή, εσείς μπορείτε να τη γράψετε σε μία γραμμή):
Στη συνέχεια, μπορούμε να εισάγουμε ελληνικούς χαρακτήρες χρησιμοποιώντας την αλλαγή της μεθόδου πληκτρολογίου του παραθυρικού περιβάλλοντος (λ.χ. πληκτρολογώντας Alt-Shift) όπως και σε οποιαδήποτε άλλη εφαρμογή. Εναλλακτικά (αν λ.χ. δεν είμαστε σε UTF περιβάλλον) με την εντολή C-∖ (M-x toggle-input-method) και εισάγοντας –μόνο την πρώτη φορά – “greek” στο minibuffer εναλλάσσουμε από αγγλικά σε ελληνικά.
Για τους 8-bit χαρακτήρες τύπου ISO8859-7 καλούμε τον Emacs με την ανάλογη γραμματοσειρά. Μία επιλογή είναι
Αφού ανοίξουμε το αρχείο που επιθυμούμε σε ένα buffer, μπορούμε από το μενού
να διαλέξουμε περιβάλλον γλώσσας Options -> Mule (Multilingual
environment) -> Set Language Environment -> Greek (ή στο minibuffer M-x
set-language-environment) και επιλέγουμε μέθοδο εισαγωγής χαρακτήρων
Options -> Mule (Multilingual environment) -> Select Input Method->
‘‘greek’’ (ή στο minibuffer
M-x toggle-input-method). Στη συνέχεια, με τη συντόμευση εντολής C-∖
εναλλάσσουμε από αγγλικά σε ελληνικά.
Στην παράγραφο αυτή θα αναφέρουμε τα απολύτως απαραίτητα που χρειάζεται να ξέρετε προκειμένου να αρχίσετε να γράφετε και να τρέχετε προγράμματα σε γλώσσα Fortran. Δεν πρόκειται για συστηματική εκμάθηση της γλώσσας, αλλά για μία πρακτική προσέγγιση μέσω παραδειγμάτων. Ο αναγνώστης ενθαρρύνεται να ανατρέξει στη βιβλιογραφία [9, 10, 11] για περισσότερες λεπτομέρειες.
Για να ωφεληθεί ο/η αναγνώστης/τρια από το κεφάλαιο αυτό πρέπει απαραίτητα να γράφει τα προγράμματα και να τα εκτελεί στον υπολογιστή του/της.
Το πρώτο πρόγραμμα που γράφει κανείς σε μια καινούργια γλώσσα ή/και υπολογιστικό περιβάλλον, είναι ένα “Hello World” πρόγραμμα, το οποίο απλά τυπώνει στο stdout αυτή τη φράση. Καταφέρνοντας να δει τη φράση αυτή τυπωμένη, έχει κάνει τη μισή δουλειά που χρειάζεται για να προγραμματίσει στο περιβάλλον αυτό. Το εν λόγω πρόγραμμα σε Fortran το γράφουμε σε ένα αρχείο hello.f90 ως εξής:
Οι εντολές στη Fortran είναι ακολουθίες χαρακτήρων που γράφουμε από την 1η μέχρι και την 132η στήλη. Κάθε γραμμή αρχίζει μία καινούργια εντολή37 και μπορούμε σε μία γραμμή να γράψουμε περισσότερες από μία εντολές χωρίζοντάς τις με ένα ελληνικό ερωτηματικό (; - semicolon). Αν μια σειρά αρχίζει με ! (θαυμαστικό), αυτή η σειρά αγνοείται και μπορεί να χρησιμοποιηθεί για σχόλια που επεξηγούν και τεκμηριώνουν το πρόγραμμα. Αν μια σειρά έχει θαυμαστικό σε κάποια στήλη, οτιδήποτε μετά το θαυμαστικό αγνοείται και μπορεί να χρησιμοποιηθεί για σχολιασμό (εξαιρείται το θαυμαστικό μέσα σε μονά η διπλά εισαγωγικά, όπου εκεί θεωρείται ότι είναι μέρος του κειμένου μιας ακολουθίας χαρακτήρων όπως λ.χ. στο ’Hello World!’). Η σωστή και επαρκής τεκμηρίωση ενός προγράμματος είναι απαραίτητη για προγράμματα που σχεδιάζετε, ώστε να μπορούν να χρησιμοποιηθούν επανειλημμένα, να συντηρηθούν και να επεκταθούν από ομάδα πολλών προγραμματιστών και να είναι μεγαλύτερα από μερικές γραμμές κώδικα. Η ιδέα που είχατε σήμερα θα σας φαντάζει άγνωστη μετά από λίγες εβδομάδες και ο χρόνος που θα καταναλώσετε για να διορθώσετε, να βελτιώσετε και να εξηγήσετε στους άλλους αυτό που κάνατε, θα είναι σίγουρα περισσότερος από το χρόνο που θα ξοδέψετε για να συγγράψετε μια καλή και σαφή τεκμηρίωση του προγράμματός σας.
Η κύρια είσοδος σε ένα πρόγραμμα καθορίζεται από την εντολή program name όπου name είναι ό,τι θέλουμε, αρκεί να να αρχίζει από γράμμα A-Z ή a-z, να αποτελείται από το πολύ 31 αλφαριθμητικούς χαρακτήρες και το _ (underscore). Το τέλος του προγράμματος, όπως και κάθε αυτοδύναμης ενότητας του προγράμματος (υπορουτίνες, συναρτήσεις), καθορίζεται από την εντολή end στην οποία προσθέτουμε και το όνομα της ενότητας που κλείνει (εδώ end program hello).
Στην τέταρτη γραμμή είναι το “ζουμί”: Η εντολή print είναι ο απλούστερος τρόπος να τυπώσουμε κάτι στο stdout. Προσέξτε το “*,” που είναι μέρος του συντακτικού και φυσικά δεν τυπώνεται... Για τη Fortran τα κεφαλαία/μικρά γράμματα είναι ισοδύναμα και θα μπορούσαμε να γράψουμε PRINT, Print, .... Η φράση που θέλουμε να τυπώσουμε είναι μια ακολουθία χαρακτήρων που περικλείεται από μονά ή διπλά εισαγωγικά (’Hello World!’ ή "Hello World!").
Για να τρέξει το πρόγραμμα, πρέπει να μεταφραστεί σε γλώσσα μηχανής. Τη δουλειά αυτή την αναλαμβάνει ο μεταγλωττιστής (compiler). Σε κάθε σύστημα το πρόγραμμα αυτό μπορεί να έχει διαφορετικό όνομα ή ακόμα και ο προγραμματιστής να έχει περισσότερες από μία επιλογές. Πρέπει να ενημερωθείτε από τον διαχειριστή του συστήματος ή τα σχετικά εγχειρίδια. Τυπικά ονόματα τέτοιων προγραμμάτων είναι f90, ifort, gfortran, .... Η πρώτη μας δουλειά είναι να μελετήσουμε με προσοχή τα εγχειρίδια χρήσης. Εκεί μαθαίνουμε πώς να χρησιμοποιήσουμε τις δυνατότητές του με τον καλύτερο τρόπο για το δικό μας πρόγραμμα (λ.χ. βελτιστοποίηση - optimization)
Στο δικό μας σύστημα θα χρησιμοποιήσουμε τον gfortran38 . Η εντολή που θα δώσουμε για τη μεταγλώττιση είναι39
Ο διακόπτης -o ορίζει ο μεταγλωττισμένος κώδικας να γραφτεί στο αρχείο hello. Αν η μεταγλώττιση είναι επιτυχής, τότε το πρόγραμμα τρέχει με την εντολή:
όπου το ./ το βάλαμε για να προσδιορίσουμε ρητά πώς εκτελούμε το πρόγραμμα που περιέχεται στο αρχείο hello και πού βρίσκεται στον τρέχοντα κατάλογο (.).
Ας δοκιμάσουμε τώρα να κάνουμε έναν απλό υπολογισμό, την περίμετρο και το εμβαδόν ενός κύκλου ακτίνας R. Για τον λόγο αυτό θα χρειαστούμε να χρησιμοποιήσουμε μεταβλητές τύπου REAL. Στο αρχείο area_01.f90 πληκτρολογούμε
Στο παραπάνω πρόγραμμα ορίσαμε τις τιμές των δύο μεταβλητών R, PI στη 3η και
4η γραμμή. Το ότι οι μεταβλητές είναι τύπου REAL καθορίζεται από το όνομα της
μεταβλητής. Η Fortran έχει implicit rules για να το καθορίζει. Σύμφωνα με
αυτούς, μεταβλητές που το όνομά τους αρχίζει από i, j, k, l, m, n
είναι τύπου INTEGER (ακέραιοι), ενώ κάθε άλλη είναι τύπου REAL. Αλλαγή
γίνεται μόνο αν δηλώσουμε ρητά τον τύπο μιας μεταβλητής όπως θα δείξουμε
αργότερα40 .
Στην 5η και 6η γραμμή κάνουμε τον υπολογισμό και
κατευθείαν στο
όρισμα της εντολής print. Οι τελεστές πολλαπλασιασμού και δύναμης είναι * και
** αντίστοιχα. Προσέξτε ότι στις σταθερές 2.0 και 4.0 βάλαμε ρητά την
υποδιαστολή. Αν τις παραλείψουμε, οι σταθερές είναι τύπου INTEGER και, αν
δεν είναι αυτό που πραγματικά θέλουμε, το αποτέλεσμα μπορεί να μας ...
καταπλήξει41 .
Αν υποθέσουμε ότι το πρόγραμμα είναι αποθηκευμένο στο αρχείο area_01.f90, οι
εντολές μεταγλωττισμού και εκτέλεσης του προγράμματος είναι
Ας δοκιμάσουμε τώρα μια επαναλαμβανόμενη διεργασία. Ας κάνουμε τον παραπάνω
υπολογισμό για 10 διαφορετικούς κύκλους ακτίνας . Τις
ακτίνες θα τις αποθηκεύσουμε σε ένα array R(10) τύπου REAL. Το αρχείο
area_02.f90:
Η εντολή dimension R(10) ορίζει ένα μονοδιάστατο array με 10 στοιχεία. Με τον τρόπο αυτό στη Fortran, τα στοιχεία των arrays αναφέρονται με έναν δείκτη που παίρνει τιμές από 1 μέχρι το μήκος του array (εδώ 10). ΄Αρα R(4) είναι το τέταρτο στοιχείο του R.
Μεταξύ των εντολών
περιέχονται εντολές που εκτελούνται επαναληπτικά με την ακέραια μεταβλητή i να παίρνει τιμή από 2 έως 10 με βήμα 142 . Η εντολή
ορίζει την ακτίνα με δείκτη i να είναι κατά 1 μεγαλύτερη από την προηγούμενη. Για να είναι σωστή η επαγωγή θα πρέπει να ορίσουμε την τιμή της R(1), πριν αρχίσει το do loop. Μετά από αυτή την εξήγηση, νομίζω πως μπορεί εύκολα να γίνει κατανοητό τι γίνεται στο δεύτερο do loop του προγράμματος. Ο αναγνώστης θα πρέπει να δοκιμάσει το παραπάνω πρόγραμμα και να πειραματιστεί κάνοντας μικροαλλαγές.
Ας μετατρέψουμε τώρα το παραπάνω πρόγραμμα, έτσι ώστε ο χρήστης να δίνει
διαδραστικά τις ακτίνες του κύκλου, το πρόγραμμα να υπολογίζει τις ακτίνες και τα
εμβαδά και στη συνέχεια, να γράφει τα αποτελέσματα σε ένα αρχείο. ΄Αρα, το
πρόγραμμα πρέπει να πάρει ως input από τον χρήστη τα μέτρα των ακτίνων
. Γράφουμε στο αρχείο area_03.f90:
Παρατηρήστε τώρα ότι η πρώτη εντολή που δίνουμε είναι η implicit none. Αυτό δηλώνει ότι δε θέλουμε να χρησιμοποιήσουμε τους implicit κανόνες της Fortran, αλλά θέλουμε να υποχρεώσουμε τον εαυτό μας να δηλώσει ρητά κάθε μεταβλητή του προγράμματος. Αυτό σημαίνει πως θα μας πάρει λίγο παραπάνω χρόνο να πληκτρολογήσουμε τους ορισμούς, αλλά σας υπόσχομαι ότι αυτός ο κόπος δεν συγκρίνεται με τίποτα με τον πόνο να βρει κάποιος δύσκολα σφάλματα στο πρόγραμμα που οφείλονται σε μικρά ορθογραφικά λάθη στα ονόματα των μεταβλητών43 . Θα ακολουθήσουμε αυτή την πρακτική σε ολόκληρο το βιβλίο.
Μετά από αυτή την εντολή ακολουθούν οι δηλώσεις (declarations) των μεταβλητών. Οι μεταβλητές N, i δηλώνονται ως integer, ενώ οι PI, area, perimeter, R(N) ως real. Οι N, PI δηλώνονται να είναι παράμετροι (parameter) των οποίων η τιμή δεν μπορεί να αλλάξει στη ροή του προγράμματος.
Μετά τις δηλώσεις των μεταβλητών ακολουθούν οι εκτελέσιμες εντολές. Το πρώτο do loop δεν έχει τίποτα καινούργιο εκτός από την εντολή
Με την εντολή αυτή διαβάζουμε από το stdin την τιμή της μεταβλητής R(i). Ο χρήστης πρέπει να την πληκτρολογήσει στο τερματικό και να πατήσει το πλήκτρο [Enter]. Μπορούμε με την ίδια εντολή read να διαβάσουμε περισσότερες από μία μεταβλητές.
Για να τυπώσουμε δεδομένα σε ένα αρχείο, πρέπει να συνδέσουμε το όνομα του αρχείου με ένα UNIT που αντιστοιχεί σε έναν ακέραιο με τιμή μέσα σε κάποια όρια που καθορίζονται από το σύστημα44 . Η σύνδεση αυτή γίνεται με την εντολή open και μετά μπορούμε να γράφουμε με την εντολή write(unit_number,*)...45 . ΄Οταν τελειώσουμε, κλείνουμε το αρχείο με την εντολή close και μπορούμε να συνδέσουμε UNIT με ίδιο αριθμό σε άλλο αρχείο. Η λογική ροή είναι δηλαδή
Το όνομα του αρχείου καθορίζεται από το όρισμα FILE=’AREA.DAT’ της εντολής open και εδώ η διαφοροποίηση στα κεφαλαία ή τα μικρά γράμματα δίνει διαφορετικά αρχεία. Το όρισμα FILE=’path’ μπορεί να πάρει οποιοδήποτε path από το σύστημα των αρχείων.
Το τελευταίο που παρατηρούμε είναι η γραμμή
που μας δείχνει πώς να συνεχίζουμε μια μακριά εντολή στην επόμενη γραμμή. Αρκεί να βάλουμε το χαρακτήρα & στο τέλος της γραμμής και η επόμενη γραμμή θεωρείται συνέχεια της προηγούμενης. Αυτό μπορεί να γίνει μέχρι 39 φορές.
Το επόμενο βήμα είναι να μάθουμε πώς να χωρίζουμε το πρόγραμμά μας σε λογικά διαφορετικές διαδικασίες οι οποίες μπορεί να επαναλαμβάνονται πολλές φορές στο πρόγραμμά μας. Θα δείξουμε τη διαδικασία της υπορουτίνας (subroutine) ορίζοντας τον υπολογισμό του εμβαδού και της περιφέρειας του κύκλου να γίνεται από την subroutine area_of_circle. Ορίστε τι γράφουμε μέσα στο αρχείο area_04.f90:
Οι αλλαγές που κάναμε αφορούν καταρχήν το κυρίως πρόγραμμα. Οι υπολογισμοί της περιμέτρου και του εμβαδού αντικαταστάθηκαν από τη γραμμή
Η εντολή call κάνει αυτό που λέει: καλεί τη διαδικασία που ορίζεται στην υπορουτίνα area_of_circle. Τα (R(i),perimeter,area) είναι τα ορίσματα της υπορουτίνας. Το R(i) είναι μεταβλητή εισόδου η οποία παρέχει δεδομένα για να κάνει τον υπολογισμό η υπορουτίνα. Οι perimeter,area είναι οι μεταβλητές εξόδου στις οποίες κατά την έξοδό της η υπορουτίνα αποθηκεύει τα αποτελέσματα. Ο προγραμματιστής της υπορουτίνας πρέπει να μας δώσει σαφείς οδηγίες για τις μεταβλητές εισόδου/εξόδου έτσι ώστε να χρησιμοποιήσουμε σωστά την υπορουτίνα.
Η υπορουτίνα προγραμματίζεται ανάμεσα στις δηλώσεις
Τα ορίσματα R,L,A ορίζονται στην υπορουτίνα και τα ονόματά τους δεν είναι αναγκαστικό να είναι τα ίδια με αυτά που χρησιμοποιούμε για να καλέσουμε την υπορουτίνα. Δηλώνονται ρητά με τις δηλώσεις real :: R,L,A. Οι μεταβλητές περνούν by reference το οποίο σε απλά ελληνικά σημαίνει πως οποιαδήποτε αλλαγή στις τιμές τους μέσα στην υπορουτίνα, αλλάζει και τις αντίστοιχες τιμές στο πρόγραμμα που την κάλεσε. ΄Αρα με τις εντολές L= PI2*R, A= PI*R*R πετυχαίνουμε αυτό που θέλουμε, δηλ. να επιστρέψουμε στο χρήστη της υπορουτίνας την περίμετρο και το εμβαδόν κύκλου ακτίνας R. Τέλος με την εντολή return επιστρέφουμε τον έλεγχο στο πρόγραμμα που κάλεσε την υπορουτίνα. Οι μεταβλητές - παράμετροι PI, PI2 είναι “ιδιωτικές ” της area_of_circle και δεν “φαίνονται” από το κυρίως πρόγραμμα. Το ίδιο και οι μεταβλητές του κυρίως προγράμματος (i, N,...) δεν είναι γνωστές στην υπορουτίνα.
Τέλος ας δώσουμε χωρίς πολλά λόγια και ένα πρόγραμμα trionymo.f90 που υπολογίζει τις ρίζες ενός τριωνύμου:
Το πρόγραμμα ζητάει τους συντελεστές του τριωνύμου . Ελέγχει αν
είναι καλά ορισμένο
και αν όχι, σταματάει το πρόγραμμα με την εντολή stop.
Στη συνέχεια, υπολογίζει τη διακρίνουσα (discriminant)
καλώντας
τη συνάρτηση Discriminant(a,b,c). Η συνάρτηση (function) διαφέρει από τη
subroutine στο ότι καλείται απευθείας (χωρίς την εντολή call) και επιστρέφει μια
τιμή της οποίας ο τύπος πρέπει να δηλωθεί όπως οποιαδήποτε άλλη μεταβλητή (real
:: Discriminant). Στη συνέχεια, ξεχωρίζουμε τις γνωστές περιπτώσεις με τη
δομή
όπου παρατηρούμε και τους τελεστές σύγκρισης .gt. (greater than-αυστηρά μεγαλύτερο) και .eq. (equal-ίσο)46 .
Για τη συνάρτηση Discriminant πρέπει να δηλωθεί τι τύπου τιμή επιστρέφει (εδώ real), καθώς και ο τύπος των ορισμάτων της όπως και για τη subroutine. Η τιμή που επιστρέφει καθορίζεται τοποθετώντας τη σε μια μεταβλητή με όνομα ίδιο με αυτό της συνάρτησης:
Την παράγραφο αυτή μπορείτε να την αγνοήσετε την πρώτη φορά που διαβάζετε αυτό το κεφάλαιο. Σκοπός είναι περισσότερο να χρησιμεύσει σαν αναφορά, όταν θα έχετε απορίες στα επόμενα κεφάλαιο.
Ξεκινάμε αναφέροντας και άλλους ενδιαφέροντες τύπους μεταβλητών. Στο παρακάτω πρόγραμμα δείχνουμε πώς να χρησιμοποιήσετε μεταβλητές τύπου CHARACTER, πραγματικούς διπλής ακρίβειας REAL(8) και μιγαδικούς αριθμούς μονής COMPLEX και διπλής ακρίβειας COMPLEX(8):
Τα σημεία που πρέπει να προσέξουμε στο παραπάνω πρόγραμμα είναι:
΄Ενα άλλο σημαντικό στοιχείο της γλώσσας που παραλείψαμε στην προηγούμενη παράγραφο είναι η κοινή χρήση μεταβλητών από διαφορετικά μέρη του προγράμματος. Μία μεταβλητή που ορίζεται σε ένα υποπρόγραμμα (main program, subroutine, function) είναι τοπική και διαφορετικά υποπρογράμματα δεν μπορούν να έχουν πρόσβαση σε αυτή. Για να αποκτήσουμε πρόσβαση σε κοινό σημείο της μνήμης όπου αποθηκεύουμε τις τιμές των μεταβλητών, χρησιμοποιούμε την εντολή COMMON. Δείτε το παρακάτω παράδειγμα:
Το COMMON block εδώ έχει το όνομα CONSTANTS και μπορούμε να αναφερόμαστε σε αυτό από οποιαδήποτε υπορουτίνα ή συνάρτηση του προγράμματος. Στην πραγματικότητα, δείχνει σε ένα συγκεκριμένο σημείο της μνήμης και εδώ δεσμεύουμε τον χώρο για δύο μεταβλητές τύπου REAL τις k1, k2. Οι μεταβλητές αυτές διαβάζονται και αλλάζουν τιμές από τις υπορουτίνες s1 και s2, ενώ η k3 παρόλο που έχει κοινό όνομα και στο κύριο πρόγραμμα και στις υπορουτίνες, αναφέρεται σε διαφορετικές μεταβλητές κάθε φορά. Το πρόγραμμα τυπώνει:
΄Ενα από τα αδύναμα σημεία της Fortran είναι η περιορισμένη δυνατότητα να χειριστούμε ευέλικτα το Input/Output (I/O). Για τον λόγο αυτό θα χρησιμοποιήσουμε άλλα προγράμματα όπως awk, perl ή προγράμματα στη γλώσσα C. Ακόμα όμως και η Fortran έχει χειρισμό του I/O, αλλά όντας επιστημονικά προσανατολισμένη αυτός αφορά κυρίως την ακρίβεια παρουσίασης των αριθμών. Αν έχετε να χειρισθείτε κείμενο με πολύπλοκο τρόπο, καλύτερα να διαλέξτε μια άλλη γλώσσα προγραμματισμού... Μέχρι στιγμής οι μόνες εντολές φορμά που χρησιμοποιήσαμε για I/O είναι οι προκαθορισμένες χρησιμοποιώντας το *, λ.χ. print *, read *, write( ,*). Αλλά το * μπορεί να αντικατασταθεί με εντολές φορμά σύμφωνα με το παρακάτω παράδειγμα:
Προσέξτε τις παρενθέσεις μέσα στα εισαγωγικά: (A5,I6,F12.7) είναι εντολή φορμά για την εντολή print και δίνει οδηγίες για την εκτύπωση τριών μεταβλητών: A είναι για CHARACTER, I για INTEGER και F για REAL. Οι αριθμοί αμέσως μετά το γράμμα υποδηλώνουν τον αριθμό των χαρακτήρων που θα χρησιμοποιηθούν για την εκτύπωση. Προσοχή! Αν δεν είναι αρκετές οι θέσεις εκτύπωσης, η Fortran θα αρνηθεί να κάνει την εκτύπωση και θα τυπώσει μια σειρά από *, τα αστεράκια του τρόμου48 . Και στις θέσεις αυτές πρέπει να συνυπολογίσετε τον αριθμό των δεκαδικών ψηφίων, την υποδιαστολή, το πρόσημο, τα ψηφία και το πρόσημο του εκθέτη... Μην είστε τσιγκούνηδες λοιπόν, δώστε άπλετο χώρο και μπορεί να σας χρειαστεί... Εδώ A5 υποδηλώνει CHARACTER που θα τυπωθεί σε 5 θέσεις χαρακτήρων, I6 INTEGER 6 θέσεων και F12 REAL 12 χαρακτήρων. Μετά την υποδιαστολή στο F12.7 υποδηλώνουμε πόσα δεκαδικά ψηφία θέλουμε να τυπωθούν.
Στην εντολή φορμά (F18.16,E24.17,G24.17,G24.17) δίνουμε οδηγίες για την εκτύπωση μιας μεταβλητής διπλής ακρίβειας. Στην καλύτερη περίπτωση έχουμε περίπου 16 δεκαδικά ψηφία ακρίβειας οπότε δεν έχει νόημα να κρατάμε παραπάνω (σε έναν υπολογισμό, συνήθως χάνουμε ακρίβεια). Με την εντολή F θέλει προσοχή: Αν χρειαστεί εκθέτης για την αναπαράσταση, ο αριθμός δε θα τυπωθεί και συνήθως το αποφεύγουμε, εκτός αν είμαστε σίγουροι ότι δε χρειάζεται εκθέτης. Η επιλογή E γράφει τον αριθμό πάντα σε επιστημονική μορφή με εκθέτη. Η επιλογή G γράφει τον αριθμό χωρίς εκθέτη, αν δε χρειάζεται, και με εκθέτη αν χρειάζεται. Οι αριθμοί έχουν την ίδια έννοια όπως και πριν. Στην εντολή φορμά (3F20.16) δείχνουμε πώς δίνουμε ένα πολλαπλασιαστικό παράγοντα 3 στην εκτύπωση των REAL*8. Και στην τελευταία, δείχνουμε πώς να τυπώνουμε ένα μεγάλο διάνυσμα σε μία γραμμή: write(6,’(200F12.6)’)(a(i), i=1,10). Ο πολλαπλασιαστικός παράγοντας μπορεί να είναι μεγαλύτερος από αυτόν που θα χρησιμοποιήσουμε. Το πρόγραμμα τυπώνει (τη δεύτερη γραμμή τη διπλώσαμε για να φαίνεται):
Οι εντολές φορμά μπορούν να μοιράζονται με ... παραπομπές. Αν μια εντολή αρχίζει με έναν αριθμό 1-99999, ο αριθμός αυτός είναι μία “ετικέτα” στην εντολή που ακολουθεί (labeled statement). Αν η εντολή αυτή είναι εντολή FORMAT, τότε μπορούμε να αναφερθούμε σε αυτή με τον αριθμό της από τις εντολές PRINT, WRITE και READ. ΄Ετσι, πολλές εντολές I/O μπορούν να χρησιμοποιούν την ίδια εντολή FORMAT, αν τυπώνουν με τον ίδιο τρόπο. Το παρακάτω πρόγραμμα κάνει ακριβώς ό,τι και το παραπάνω με τη μόνη διαφορά ότι χρησιμοποιούμε labeled statements και εντολές FORMAT:
Τέλος, ο/η αναγνώστης/τρια θα πρέπει να μελετήσει τις διαθέσιμες συναρτήσεις της Fortran (intrinsic functions) που δίνονται στον Πίνακα 1.2 της σελίδας 182.
Την παράγραφο αυτή μπορείτε να την αγνοήσετε την πρώτη φορά που διαβάζετε αυτό το κεφάλαιο. Θα σας φανεί χρήσιμη αργότερα.
Τα arrays είναι ένας τρόπος να αναφερόμαστε σε μια συστοιχία τιμών συγκεκριμένου τύπου που είναι αποθηκευμένες στη μνήμη. Οι τιμές ή στοιχεία των arrays αναφέρονται με τους δείκτες οι οποίοι παίρνουν ακέραιες τιμές μέσα σε κάποια όρια. Για παράδειγμα
αναφέρεται στις δέκα επιτρεπόμενες real τιμές ενός array που έχει δηλωθεί ως real, dimension(10) :: A. Οι δείκτες μπορεί να είναι ακέραιες εκφράσεις, όπως
όπου στην τελευταία χρησιμοποιούμε την ακέραια τιμή της συνάρτησης INT(x). Παρατηρήστε ότι τα στοιχεία των arrays και οι τιμές συναρτήσεων χρησιμοποιούν ίδιου τύπου παρενθέσεις και για να καταλάβει ο μεταγλωττιστής τη διαφορά θα πρέπει να κοιτάξει τις δηλώσεις των ονομάτων τους. Οι δηλώσεις των arrays γίνονται με τον παρακάτω τρόπο:
ορίζει τα arrays a, b, c, d με στοιχεία a(1) ... a(10), b(1) ... b(10), c(1) ... c(20) και d(1) ... d(20) που είναι τύπου real. Ισοδύναμα θα μπορούσαν να οριστούν με τη δήλωση
ή
Στην τελευταία μορφή, χρησιμοποιήσαμε τις σταθερές n1, n2 για τις δηλώσεις και δείχνουμε πώς να κάνουμε δηλώσεις arrays με διαφορετική έκταση. Στην παραπάνω μορφή, το κατώτερο όριο (lower bound) των arrays είναι το 1 και το ανώτερο όριο (upper bound) 10 για τα a, b και 20 για τα c, d. Τα όρια αυτά μπορούμε να τα προσδιορίσουμε ρητά. ΄Ετσι, οι δηλώσεις
ορίζουν το array a με 11 τιμές a(0) ... a(10) και το array c με 31 τιμές c(-10) c(-9) ... c(-1) c(0) c(1) ... c(20).
Τα παραπάνω arrays έχουν μόνο μία διάσταση (“διανύσματα”). Μπορούμε όμως να ορίσουμε και arrays με περισσότερες από μία διαστάσεις προσθέτοντας περισσότερους δείκτες στο όνομα του array49 . ΄Ετσι, η δήλωση
δηλώνει ένα array με integer τιμές a(1,1), a(1,2), a(2,1), a(2,2). Παρακάτω δηλώνουμε δύο arrays με τρεις διαστάσεις:
Μερικοί σημαντικοί ορισμοί που θα συναντήσετε στη βιβλιογραφία (οι αγγλικοί όροι δίνονται με έντονη γραφή):
Για να καθορίσουμε τις τιμές των στοιχείων των arrays μπορούμε να τις χειριστούμε όπως τα scalars:
Εναλλακτικά, μπορούμε να χρησιμοποιήσουμε το όνομα του array ως αντικείμενο. Για παράδειγμα
στην πρώτη γραμμή θέτουμε τις τιμές στο array a χρησιμοποιώντας έναν array constructor. Στη δεύτερη γραμμή, όλα στοιχεία του b θέτονται ίσα με 0. Αυτό δείχνει μία εξαιρετική ευκολία που παρέχει η Fortran στη χρήση των arrays. Μπορούμε να χρησιμοποιήσουμε όλες τις intrinsic operations της Fortran με ολόκληρα arrays, αρκεί αυτά να είναι conformable. Δύο arrays είναι conformable, αν έχουν το ίδιο shape ή το ένα είναι scalar. ΄Ετσι, το παρακάτω πρόγραμμα
είναι ισοδύναμο με
Πολλές συναρτήσεις της Fortran έχουν την ιδιότητα να είναι elemental, δηλ. στα ορίσματά τους παίρνουν τα ονόματα των arrays και δρουν σε κάθε στοιχείο αυτού χωριστά. Για παράδειγμα οι εντολές
θέτουν c(i,j) = sin(d(i,j))+x*exp(-2.0*d(i,j)) για κάθε επιτρεπτή τιμή των i,j, και τα στοιχεία a(i) σε έναν διαφορετικό τυχαίο αριθμό μεταξύ του 0 και 1. Για να είναι τα arrays conformable δεν είναι αναγκαστικό να έχουν τα ίδια lower/upper bounds. Για παράδειγμα, η πρώτη εντολή παρακάτω b=c*d έχει το ίδιο αποτέλεσμα με το do loop
Παρακάτω δίνουμε μερικές χρήσιμες συναρτήσεις που δρουν σε arrays. ϒποθέστε ότι
τότε
Για περισσότερες συναρτήσεις και τις πλήρεις οδηγίες για τη χρήση τους δείτε τη βιβλιογραφία [11, 10, 9].
Παρακάτω δίνονται μερικές πληροφορίες σχετικά με την είσοδο / έξοδο (input / output ή I/O) για τα arrays. Η είσοδος (“διάβασμα”) και έξοδος (“εκτύπωση”) των arrays μπορεί να γίνεται απλά διαβάζοντας και εκτυπώνοντας τα στοιχεία τους με τη σειρά που θέλουμε. Για παράδειγμα στο παρακάτω πρόγραμμα διαβάζουμε το array a και εκτυπώνουμε το array b με δύο διαφορετικούς τρόπους:
Μέσα στα do loops η είσοδος και έξοδος γίνεται ένα στοιχείο ανά γραμμή. Οι εντολές (a(i), i=1,4) και ( (b(i,j) i=1,2), j=1,2) λέγονται implied do loops και διαβάζουν/εκτυπώνουν από/στην ίδια γραμμή. Αν η γραμμή εξαντληθεί από στοιχεία, τότε το πρόγραμμα συνεχίζει να διαβάζει από την επόμενη. Δοκιμάστε το...
Η είσοδος/έξοδος των arrays μπορεί να γίνει, αντί για implied do loops, χρησιμοποιώντας απλά το όνομα των arrays. Στην περίπτωση αυτή, τα στοιχεία των arrays διαβάζονται/εκτυπώνονται με συγκεκριμένη σειρά. Για παράδειγμα
θα διαβάσει από το stdin πρώτα τις τιμές a(1) a(2) a(3) a(4), θα προχωρήσει στην επόμενη γραμμή (record) και θα διαβάσει τα b(1,1), b(2,1), b(1,2), b(2,2). Προσέξτε, ότι ο πίνακας b θα διαβαστεί κατά στήλες! Η εκτύπωση θα δώσει σε ένα record τα a(1) a(2) a(3) a(4) b(1,1), b(2,1), b(1,2), b(2,2) (πάλι δηλ. το b τυπώνεται κατά στήλες).
Τέλος, χωρίς πολλά λόγια, αλλά παραπέμποντας τον αναγνώστη στη βιβλιογραφία, παραθέτουμε ορισμένες δυνατότητες που δίνει η γλώσσα Fortran στον χειρισμό των arrays. Διαβάστε τα σχόλια στον παρακάτω κώδικα για επεξηγήσεις:
Θα βρείτε τον παραπάνω κώδικα στο αρχείο f90_arrays.f90 του συνοδευτικού λογισμικού.
Η Fortran είναι μία γλώσσα προγραμματισμού που έχει μακρά ιστορία, η οποία ξεκινάει από το 1950.50 Δύο σημαντικοί σταθμοί στην ιστορία της, που σηματοδοτούν σημαντικές αλλαγές, είναι τα πρότυπα Fortran 77 και Fortran 90. Η μετάβαση από το ένα πρότυπο στο άλλο, σηματοδοτεί και την αλλαγή στον μορφότυπο του προγράμματος, από το λεγόμενο “fixed width format”, όπου οι εντολές πρέπει να γράφονται σε συγκεκριμένες στήλες ενός αρχείου, στο “free format” όπου αυτό δεν είναι πια απαραίτητο.51 Στο βιβλίο αυτό, τα προγράμματα γράφονται αποκλειστικά στη δεύτερη μορφή, αλλά καλό είναι ο έμπειρος προγραμματιστής της Fortran να γνωρίζει τα βασικά δομικά στοιχεία και της πρώτης μορφής, έτσι ώστε να μπορεί να διαβάζει και να επεξεργάζεται παλιότερα προγράμματα.
Παρόλο που σε κάθε αλλαγή των προτύπων της Fortran εισάγονται νέα στοιχεία, γίνεται μεγάλη προσπάθεια για να υπάρχει αναδρομική συμβατότητα και για να καταλαβαίνουν οι μεταγλωττιστές, μαζί με το νέο, και το παλιό συντακτικό. ΄Ετσι είναι δυνατόν, ένας προγραμματιστής να προσθέσει μεταγενέστερα στοιχεία σε έναν παλιό κώδικα και αυτός να συνεχίσει να τρέχει σωστά. Η πιο μεγάλη πρόσφατη αλλαγή έγινε με το πρότυπο Fortran 90, όπου εισάγονται στοιχεία αντικειμενοστραφούς και δομικού προγραμματισμού. Τα modules, η δυναμική εκχώρηση μνήμης, array section manipulation, operator overloading, pointers, έλεγχος ακρίβειας αριθμητικών πράξεων κλπ, εισάγονται με το πρότυπο αυτό. Στα πρότυπα Fortran 95, 2003 και 2008 γίνονται μικρές αλλαγές, ενισχύοντας κυρίως τα στοιχεία αντικειμενοστραφούς προγραμματισμού και το συντακτικό που ευνοεί την εκτέλεση παράλληλων εντολών. Η επόμενη αλλαγή στη Fortran αναμένεται το 2018, οι αλλαγές που θα γίνουν θα είναι λίγες και μάλλον θα ακούει στο όνομα Fortran 2015.
Στα προγράμματα Fortran που παρουσιάζουμε στο βιβλίο αυτό, χρησιμοποιούμε το free format. Τα προγράμματα που γράφουμε, πότε ακολουθούν ένα στυλ προγραμματισμού κοντύτερα στη φιλοσοφία του πρότυπου Fortran 77 (λ.χ. στατική εκχώρηση μνήμης, χρήση common blocks) και πότε πρότυπα της Fortran 90 ή και μετέπειτα (χρήση modules, δυναμική εκχώρηση μνήμης). Ο αναγνώστης πρέπει να κατανοήσει ότι η γλώσσα Fortran είναι κατά το μεγαλύτερο μέρος της ενιαία και ότι μπορεί να χρησιμοποιεί το στυλ που βρίσκει απλούστερο ή αποδοτικότερο για το πρόγραμμα που γράφει. Οι μοντέρνοι μεταγλωττιστές, όπως η gfortran, καταλαβαίνουν και μεταγλωττίζουν αποδοτικά όποιο πρότυπο Fortran και αν χρησιμοποιηθεί.
Για τον αναγνώστη που θέλει να ειδικευτεί στην προχωρημένη χρήση της Fortran, συστήνουμε την αναφορά [10]. Για μια εμπεριστατωμένη και καλή εισαγωγή, συστήνουμε την αναφορά [9], αλλά και την παλιότερη [11]. Για να μάθετε για τη Fortran 77, αλλά και το fixed width format, ανατρέξτε στην (ελεύθερα διαθέσιμη) [12].
Η γραφική απεικόνιση των δεδομένων είναι αναπόσπαστο μέρος της ποιοτικής, αλλά και ποσοτικής κατανόησης της πληροφορίας που περιέχουν. ΄Ενα καλό και ελεύθερα διαθέσιμο πρόγραμμα που παράγει γραφήματα υψηλής ποιότητας στις δύο και τρεις διαστάσεις είναι το gnuplot. Τα ειδικότερα πλεονεκτήματά του έναντι άλλων εφαρμογών είναι η ευελιξία στη χρήση του από τη γραμμή εντολών, αλλά και μέσα από άλλα προγράμματα, καθώς και οι μεγάλες δυνατότητες που δίνει στον χειρισμό και στον μετασχηματισμό των δεδομένων. ΄Εχει τη δικιά του στοιχειώδη γλώσσα προγραμματισμού και, όπου αυτή δεν επαρκεί, μπορούν να γίνουν πολύπλοκες διαδικασίες χρησιμοποιώντας άλλες εφαρμογές. Ο χρήστης έχει απευθείας πρόσβαση σε πολλές μαθηματικές συναρτήσεις και σε συνάρτηση προσαρμογής των δεδομένων (fitting). Διαθέτει διαδραστικά τερματικά όπου με το ποντίκι ο χρήστης μπορεί να μετασχηματίζει τα γραφήματα. Η παράγραφος αυτή είναι εξαιρετικά συνοπτική και παρουσιάζει τα εργαλεία που είναι απολύτως απαραίτητα για τα παρακάτω κεφάλαια. Για περισσότερες πληροφορίες παραπέμπουμε στην ιστοσελίδα του gnuplot http://gnuplot.info/ και ειδικότερα στη σελίδα με την Demo Gallery http://gnuplot.info/screenshots/ όπου θα βρείτε αμέσως πώς γίνεται η εργασία που σας ενδιαφέρει, καθώς και στη βιβλιογραφία [14].
Για να ξεκινήσετε το gnuplot δίνετε την εντολή όπως φαίνεται παρακάτω:
Παραπάνω δείχνεται το μήνυμα καλωσορίσματος και στην τελευταία γραμμή φαίνεται το prompt του προγράμματος. Εκεί, μπορούμε να πληκτρολογήσουμε μία εντολή η οποία εκτελείται πατώντας το Enter. Στη συνέχεια, όταν θα γράφουμε το prompt αυτό, θα υπονοούμε πως το ακολουθούν εντολές που ερμηνεύονται από το gnuplot.
Το γράφημα μιας συνάρτησης γίνεται απλά με την εντολή plot. Το σύμβολο x εννοείται πως είναι η ανεξάρτητη μεταβλητή52 . ΄Ετσι, η εντολή
κάνει τη γραφική παράσταση της (ευθεία κλίσης 1). Για να κάνουμε
ταυτόχρονα τις γραφικές παραστάσεις περισσοτέρων συναρτήσεων απλά τις γράφουμε
μαζί ως εξής:
Παραπάνω γίνεται το γράφημα των συναρτήσεων ,
,
,
. Στις
αγκύλες [:] βάζουμε τα όρια της γραφικής παράστασης στον άξονα
και
αντίστοιχα. Το [-5:5] καθορίζει το
να μεταβάλλεται από
έως
, ενώ
το [-2:4] καθορίζει το
να μεταβάλλεται από
έως
. Αν σε κάποιες
θέσεις δε βάλουμε αριθμό, τότε το gnuplot βάζει τα όρια αυτόματα: [1:][:5]
καθορίζει το κάτω όριο το
να είναι το
και το άνω όριο στο
να είναι το
, ενώ τα απροσδιόριστα άνω και κάτω όρια αφήνονται στα ... χέρια του
gnuplot.
Συχνά, θα θέλουμε να κάνουμε τη γραφική παράσταση δεδομένων που δίνονται
από διακριτά ζεύγη . Τα δεδομένα αυτά τα τοποθετούμε σε αρχεία σε
στήλες. Ας υποθέσουμε πως το αρχείο με τα δεδομένα μας ονομάζεται data και τα
περιεχόμενά του είναι:
Η πρώτη γραμμή αρχίζει με τον χαρακτήρα # και το gnuplot την αγνοεί (σχόλια για μας). Για να κάνουμε τη γραφική παράσταση της 2ης στήλης συναρτήσει της 1ης δίνουμε απλά την εντολή:
Το όνομα του αρχείου data δίνεται ανάμεσα σε εισαγωγικά, ενώ μετά την εντολή
using δίνουμε τις στήλες που θα αντιστοιχούν στον άξονα και
αντίστοιχα
(1:2= στήλη 1 τα
και στήλη 2 τα
). Η εντολή with points αναπαριστά τα
ζεύγη
με σημεία.
Η εντολή
κάνει τη γραφική παράσταση της 3ης στήλης συναρτήσει της 1ης και τα ζεύγη
ενώνονται με ευθύγραμμα τμήματα.
Οι γραφικές παραστάσεις μπορούν να συνδυαστούν:
Στην πρώτη γραμμή κάνουμε μαζί τη γραφική παράσταση της 1ης και 3ης στήλης
του αρχείου data μαζί με τη συνάρτηση . Στη δεύτερη γραμμή προσθέτουμε
με την εντολή replot στην ίδια γραφική παράσταση τα σημεία της 1ης και 3ης
στήλης. Και στην 3η βάζουμε μαζί και τη γραφική παράσταση της συνάρτησης
.
Η εντολή using έχει πολλές δυνατότητες. Αν αντί για αριθμούς βάλουμε
μαθηματικές εκφράσεις ανάμεσα σε παρενθέσεις [δηλ.
using (...):(...)], τότε το gnuplot τις υπολογίζει για κάθε σημείο και βάζει τα
αποτελέσματα στη γραφική παράσταση. Για να μπει η τιμή μιας στήλης στη
μαθηματική έκφραση χρησιμοποιούμε το ίδιο συντακτικό με την awk, δηλ. $i
αναφέρεται στη στήλη i=1,2,3,.... Παραδείγματα:
Κάνει τη γραφική παράσταση της 1ης στήλης με την αντίστοιχη τιμή της έκφρασης
, όπου
οι τιμές της 1ης, 2ης και 3ης στήλης αντίστοιχα. Η
δεύτερη γραμμή τοποθετεί στο σχήμα και τη γραφική παράσταση της συνάρτησης
.
Κάνει τη γραφική παράσταση του φυσικού λογαρίθμου της 1ης στήλης με το φυσικό λογάριθμο του τετραγώνου της 2ης.
Με το gnuplot μπορούμε να κάνουμε τη γραφική παράσταση των δεδομένων που τυπώνει στο stdout οποιοδήποτε πρόγραμμα εκτελείται από το φλοιό. ΄Εστω ότι έχουμε ένα πρόγραμμα με όνομα area που τυπώνει στο stdout την ακτίνα και το εμβαδόν ενός κύκλου:
Τα δεδομένα είναι στην 2η και 4η στήλη του stdout και μπορούμε να τα δούμε γραφικά από το gnuplot με την εντολή:
Δηλαδή στη θέση του ονόματος του αρχείου βάζουμε το όνομα της εντολής με τον χαρακτήρα < να προηγείται. Μπορούμε να συνδυάσουμε εντολές μέσω piping και να παράγουμε πολύπλοκα αποτελέσματα. Λ.χ.
όπου τα δεδομένα που αναπαρίστανται γραφικά είναι το αποτέλεσμα ενός φίλτρου τριών εντολών: Αυτή που παράγει τα δεδομένα ακτίνα–εμβαδόν όπως παραπάνω, η δεύτερη sort που τα διατάσσει ανάλογα με την αριθμητική τιμή της 2ης στήλης και η τρίτη awk που τυπώνει το λογάριθμο της 2ης στήλης και το λογάριθμο της 4ης. Παρατηρήστε πώς τώρα χρησιμοποιούμε την εντολή using 1:2, αφού η τελευταία εντολή τυπώνει τα δεδομένα σε δύο μόνο στήλες.
Για να σώσουμε τις γραφικές μας παραστάσεις σε αρχεία που μπορούμε να φυλάξουμε και πιθανώς να δημοσιεύσουμε, πρέπει να αλλάξουμε το “terminal” που χρησιμοποιεί ο gnuplot σε έναν οδηγό που μεταφράζει τη γραφική παράσταση σε μία γλώσσα που καταλαβαίνουν άλλα προγράμματα που δείχνουν εικόνες (λ.χ. PDF, postscript, jpeg, png, gif κλπ). Κατευθύνοντας την “έξοδο” του terminal σε ένα αρχείο πετυχαίνουμε το ζητούμενο. Για παράδειγμα
Η πρώτη γραμμή κάνει τη γραφική παράσταση στο τερματικό, ώστε να τη δούμε. Η δεύτερη καθορίζει πως το γράφημα θα σωθεί σε μορφή JPEG και η τρίτη το όνομα του αρχείου που θα το αποθηκεύσουμε. Στην τέταρτη επαναλαμβάνουμε το τελευταίο γράφημα (εδώ αυτό της 1ης γραμμής) και στην πέμπτη κλείνουμε το αρχείο data.jpg (μην το ξεχάσετε!). Η τελευταία γραμμή επιβάλλει η επόμενη γραφική παράσταση να γίνει πάλι στο τερματικό.
Συνήθως γραφικές παραστάσεις υψηλής ποιότητας αποθηκεύονται στη γλώσσα PDF. Επιλέξτε set terminal pdf και set output "data.pdf" στην περίπτωση αυτή.
Λίγα λόγια για τις τρισδιάστατες γραφικές παραστάσεις. Οι επόμενες εντολές
δείχνουν πώς με την εντολή splot μπορείτε να δείτε τη γραφική παράσταση της
συνάρτησης . Με το ποντίκι μπορείτε να την περιστρέψτε και να
τη δείτε υπό διαφορετική γωνία.
Αν έχετε δεδομένα στη μορφή και θέλετε να τα αναπαραστήσετε
γραφικά στη μορφή
, τακτοποιήσετε τα σε ένα αρχείο της
μορφής
Προσέξτε πως βάζουμε μία κενή γραμμή κάθε φορά που αλλάζει η τιμή του .
Αν ονομάσετε το αρχείο αυτό data3, δείτε τη γραφική παράσταση με τις
εντολές:
Κλείνουμε με δύο λόγια για τη γραφική παράσταση που δίνεται από παραμετρικές
εξισώσεις. Στις δύο διαστάσεις θεωρούμε τις καμπύλες και στις
τρεις τις επιφάνειες
. Με τις παρακάτω εντολές
κάνουμε τη γραφική παράσταση του κύκλου
και της σφαίρας
:
Η γλώσσα Fortran θα φανεί σε κάποιον που έχει συνηθίσει κάποια γλώσσα με περισσότερες δυνατότητες (C, C++, Java, ...) πως είναι δύσχρηστη, όταν κάποιος θέλει να κάνει πολύπλοκες διαδικασίες που αφορούν το σύστημα και δε θα είχε άδικο. ΄Οταν όμως χρησιμοποιήσει τα προγράμματα που γράφει σε Fortran σε συνδυασμό με τα πανίσχυρα εργαλεία που του παρέχει το λειτουργικό σύστημα, τα προβλήματα αυτά ξεπερνιόνται και έτσι μπορεί κανείς να χρησιμοποιήσει τα πλεονεκτήματα της γλώσσας σε high performance computing, χωρίς να ανησυχεί για τις διαχειριστικές και συχνά τετριμμένες εργασίες.
Για να αποφύγει κανείς την επαναλαμβανόμενη διαδικασία εκτέλεσης των ίδιων εντολών (που εμπεριέχει και τον κίνδυνο σφάλματος), μπορεί τις εντολές που θέλει να δώσει να τις κωδικοποιήσει μέσα σε ένα αρχείο. Αυτό ονομάζεται σενάριο φλοιού (shell script) και η πιο απλή μορφή του μπορεί να είναι απλά μια σειρά από εντολές. Γράφουμε στο αρχείο script01.csh:
Η πρώτη γραμμή (ακριβώς!!) αρχίζει με #!/bin/tcsh -f που ερμηνεύεται από το λειτουργικό σύστημα, ώστε να εκτελεστούν οι εντολές από τον φλοιό /bin/tcsh53 . Στη συνέχεια γράφουμε τις εντολές μεταγλώττισης και εκτέλεσης των προγραμμάτων που μελετήσαμε στην προηγούμενη παράγραφο. Αρχικά, κάνουμε το αρχείο εκτελέσιμο με την εντολή54
και στη συνέχεια με την εντολή
τρέχουν όλες οι παραπάνω εντολές η μία μετά την άλλη. ΄Ολα ωραία, εκτός από το γεγονός ότι πρέπει να δίνουμε τις 10 ακτίνες του κύκλου στα προγράμματα ./area κάθε φορά που τις ζητούν. Μια λύση είναι να γράψουμε τα δεδομένα εισόδου (τις ακτίνες) σε ένα αρχείο Input και να δώσουμε την εντολή
οπότε δεν χρειάζεται να παρέχουμε τα δεδομένα διαδραστικά. ϒπάρχει και πιο συμπαγής λύση, να βάλουμε τα περιεχόμενα των δεδομένων σε ένα “Here Document”, ένα “αρχείο” το οποίο ο χρήστης μπορεί να φανταστεί ότι υπάρχει όταν τρέχει το script, αλλά δεν δε θα το δει ποτέ στο filesystem! Το συντακτικό, λίγο στρυφνό για αρχή, αλλά συνηθίζεται (και γίνεται και εθισμός...) είναι ως εξής (στο αρχείο script02.csh):
δηλ. το πρόγραμμα ./area παίρνει stdin από τα περιεχόμενα μεταξύ των γραμμών55 :
Δεν υπάρχει τίποτα το ιδιαίτερο με το string “EOF” και μπορείτε να βάλετε όποιο σας αρέσει (αρκεί να είναι το ίδιο στην αρχή και το τέλος).
Η δύναμη του shell scripting είναι οι ικανότητες προγραμματισμού που παρέχει: Ορισμός μεταβλητών, loops, conditionals, ... Οι μεταβλητές ορίζονται όπως οι μεταβλητές φλοιού που αναφέραμε στην παράγραφο 1.1.2. Η τιμή μιας μεταβλητής με όνομα name είναι $name και μπορούμε να τη θέσουμε με την εντολή set name = value. ΄Ενα array μπορεί να οριστεί με την εντολή
και η πρόσβαση στα δεδομένα γίνεται με το συντακτικό $R[1] ... $R[10]
Ας δούμε τώρα ένα πιο ... προχωρημένο σενάριο:
Οι πρώτες γραμμές με τις εντολές set θέτουν τις τιμές των μεταβλητών files (4 τιμές) και R (10 τιμές). Η εντολή echo απλά “αντηχεί” στο stdout το όρισμά της. Εδώ o φλοιός αναπτύσσει στο όρισμα "Hello $USER Today is " ‘date‘ την τιμή της μεταβλητής USER η οποία είναι μεταβλητή περιβάλλοντος που το λειτουργικό σύστημα θέτει να είναι το όνομα χρήστη. Στη συνέχεια στη το ‘date‘ αντικαθίσταται από το stdout της εντολής date, λ.χ. Thu May 24 22:01:40 EEST 2007.
Στη συνέχεια, αρχίζει το foreach loop:
Η μεταβλητή $files αναπτύσσεται στις 4 τιμές της (τα ονόματα των αρχείων Fortran area_01.f90, area_02.f90, area_03.f90, area_04.f90) και ο βρόχος εκτελείται μια φορά για κάθε τιμή. Κάθε φορά η τιμή της μεταβλητής file είναι η εκάστοτε τιμή της files. ΄Αρα, η εντολή gfortran $file -o area θα μεταγλωττίσει κάθε φορά ένα από τα παραπάνω 4 αρχεία και στη συνέχεια, θα εκτελέσει το εκάστοτε πρόγραμμα ./area.
Η τελευταία γραμμή στο βρόχο
είναι ένα if-conditional: Εκτελεί την εντολή cat AREA.DAT, μόνο αν η συνθήκη -f AREA.DAT είναι αληθής, δηλ. το αρχείο AREA.DAT υπάρχει.
Τέλος, δίνουμε ένα παραδειγματικό script όπου μπορείτε να δείτε με παραδείγματα τις δυνατότητες που μπορεί να προσφέρει το shell scripting. Φυσικά είναι μόνο η αρχή, διαβάστε τη βιβλιογραφία για περισσότερες λεπτομέρειες [15, 16, 17, 18, 19]. Διαβάστε προσεκτικά τις εντολές μαζί με τα σχόλια τα οποία αρχίζουν με το χαρακτήρα “#”. Στη συνέχεια, αφού γράψετε τις εντολές σε ένα αρχείο script04.csh56 , μετατρέψτε το σε εκτελέσιμο με την εντολή chmod u+x script04.csh και εκτελέστε την εντολή
Το script θα τρέξει έχοντας ως arguments τη φράση “This is my first serious tcsh script”. Θα δείτε μέσα στο script πώς να την επεξεργαστείτε. Στη συνέχεια, το script θα σας ζητήσει δέκα ή παραπάνω ακτίνες κύκλων για να υπολογίσει την περίμετρο και το εμβαδόν τους. Πληκτρολογήστε τις και μετά διαβάστε την έξοδο του script για να καταλάβετε το αποτέλεσμα των εντολών που περιέχει. Θα είναι μια διαδικασία για την οποία δε θα μετανιώσετε να αφιερώσετε λίγο χρόνο!
awk | search for and process patterns in a file, |
cat | display, or join, files |
cd | change working directory |
chmod | change the access mode of a file |
cp | copy files |
date | display current time and date |
df | display the amount of available disk space |
diff | display the differences between two files |
du | display information on disk usage |
echo | echo a text string to output |
find | find files |
grep | search for a pattern in files |
gzip | compress files in the gzip (.gz) format (gunzip to uncompress) |
head | display the first few lines of a file |
kill | send a signal (like KILL) to a process |
locate | search for files stored on the system (faster than find) |
less | display a file one screen at a time |
ln | create a link to a file |
lpr | print files |
ls | list information about files |
man | search information about command in man pages |
mkdir | create a directory |
mv | move and/or rename a file |
ps | report information on the processes run on the system |
pwd | print the working directory |
rm | remove (delete) files |
rmdir | remove (delete) a directory |
sort | sort and/or merge files |
tail | display the last few lines of a file |
tar | store or retrieve files from an archive file |
top | dynamic real-time view of processes |
wc | counts lines, words and characters in a file |
whatis | list man page entries for a command |
where | show where a command is located in the path (alternatively: whereis) |
which | locate an executable program using ”path” |
zip | create compressed archive in the zip format (.zip) |
unzip | get contents of zip archive |
Σωματίδιο κινείται στο επίπεδο και η θέση του περιγράφεται σε ένα καρτεσιανό
σύστημα συντεταγμένων από τις συντεταγμένες η οποία ως συνάρτηση
του χρόνου δίνει την εξίσωση της τροχιάς του σωματιδίου. Το διάνυσμα θέσης του
σωματιδίου είναι το
, όπου
και
είναι τα μοναδιαία
διανύσματα στους άξονες
και
αντίστοιχα. Το διάνυσμα της ταχύτητας είναι το
όπου
Στην παράγραφο αυτή θα υποθέσουμε ότι μας δίνονται οι συναρτήσεις
. Από αυτές, παραγωγίζοντας σύμφωνα με τις παραπάνω σχέσεις,
μπορούμε να πάρουμε την ταχύτητα και την επιτάχυνση. Σκοπός μας είναι να
γράφουμε απλά προγράμματα τα οποία θα υπολογίζουν τις τιμές των συναρτήσεων
αυτών σε ένα χρονικό διάστημα
όπου
είναι η αρχική χρονική
στιγμή και
η τελική. Οι συνεχείς συναρτήσεις
θα
προσεγγίζονται από μια διακριτή ακολουθία τιμών των συναρτήσεων τις
χρονικές στιγμές
, έτσι ώστε όλες οι τιμές
1.
Αρχίζουμε σχεδιάζοντας το πρότυπο (template) ενός προγράμματος που θα κάνει τον παραπάνω υπολογισμό. Κάνοντας αυτό το σχεδιασμό προσεκτικά, το μόνο που θα μας απασχολεί κάθε φορά που θέλουμε να μελετήσουμε την κίνηση ενός άλλου κινητού θα είναι η ειδική εφαρμογή των εξισώσεων κίνησης. Στο σχήμα 2.2 φαίνεται το λογικό διάγραμμα των βασικών λειτουργιών του προγράμματος. Αυτό μας βοηθάει να έχουμε μία εποπτική εικόνα, όταν προγραμματίζουμε τις λεπτομέρειες και μας βοηθάει να ελέγξουμε τη βασική λογική του αλγόριθμου που θα χρησιμοποιήσουμε. Στα ορθογώνια παραλληλόγραμμα σκιαγραφούμε τις σημαντικές εντολές των δομικών στοιχείων του προγράμματος, ενώ στους ρόμβους σημειώνουμε τις διακλαδώσεις (branching points) του προγράμματος που προκύπτουν από τις δυνατές τιμές μιας λογικής πρότασης. Με γραμμές ενώνουμε τη λογική σειρά με την οποία εκτελούνται οι διαδικασίες.
Το πρώτο κομμάτι του προγράμματος κάνει τις απαραίτητες δηλώσεις των τύπων
των μεταβλητών που θα χρησιμοποιήσουμε. Αν υπάρχουν παράμετροι που
παραμένουν σταθερές κατά τη διάρκεια της εκτέλεσης του προγράμματος
(λ.χ. ,
, κλπ), τις ορίζουμε εδώ. Στη συνέχεια το
πρόγραμμα αλληλεπιδρά με το χρήστη (user interface) και ζητάει τις μεταβλητές
παραμέτρους που καθορίζει ο χρήστης:
,
,
,
,
. Το
πρόγραμμα τυπώνει αυτές τις τιμές στο stdout για να μπορεί ο χρήστης
να τις ελέγξει ως προς την ορθότητα και να τις αποθηκεύσει για αναφορά
στα δεδομένα του. Πριν τον κύριο υπολογισμό, ο χρήστης πρέπει να δώσει
τις κατάλληλες αρχικές τιμές σε ορισμένες μεταβλητές, ειδικά στο χρόνο
.
Ο κύριος υπολογισμός γίνεται σε ένα βρόχο (loop) ο οποίος εκτελείται όσο
ο χρόνος . ϒπολογίζονται οι τιμές της θέσης και της ταχύτητας
και τυπώνονται μαζί με το χρόνο
σε ένα αρχείο. Εδώ θα
κάνουμε τη σημαντική για μας σύμβαση στη μορφοποίηση της εξόδου. Αυτό είναι
σημαντικό ώστε να έχουμε ενιαίο λογισμικό ανάλυσης των αποτελεσμάτων. Ορίζουμε
σε κάθε γραμμή του αρχείου αυτού οι πρώτες πέντε στήλες να είναι οι τιμές t,
x, y, vx, vy. Μπορούν να υπάρχουν και άλλες στήλες, αν χρειαστεί, στο
ειδικό πρόβλημα που θα μελετάμε, αλλά οι πρώτες πέντε θα είναι πάντα
αυτές.
Αφού γίνει αυτό, ειδικευόμαστε στο πρόβλημα που θα μελετήσουμε. Ας
θεωρήσουμε αρχικά την περίπτωση ενός υλικού σημείου το οποίο εκτελεί ομαλή
κυκλική κίνηση. Θεωρούμε το κέντρο του κύκλου , την ακτίνα
και τη
γωνιακή ταχύτητα
ότι είναι οι βασικές παράμετροι που προσδιορίζουν την κίνηση.
Η θέση πάνω στον κύκλο μπορεί τότε να καθοριστεί από τη γωνία
όπως φαίνεται
στο σχήμα 2.3. Θα ορίσουμε την αρχική χρονική στιγμή
να είναι
.
΄Ετσι οι εξισώσεις που δίνουν τη θέση του κινητού κάθε χρονική στιγμή είναι:
Παραγωγίζοντας ως προς Μπορούμε τώρα να σχεδιάσουμε τη δομή των δεδομένων για το πρόγραμμα που
θα γράψουμε, η οποία στην περίπτωσή μας είναι πολύ απλή. Η σταθερή γωνιακή
ταχύτητα του υλικού σημείου αποθηκεύεται στην πραγματική (REAL) μεταβλητή
omega. Το κέντρο του κύκλου
, η ακτίνα
και η γωνία
αντιστοιχούν
στις REAL μεταβλητές x0, y0, R, theta. Οι χρονικές στιγμές που υπολογίζουμε
τη θέση και ταχύτητα του κινητού καθορίζονται από τις παραμέτρους
που
αντιστοιχούν στο πρόγραμμα στις REAL μεταβλητές t0, tf, dt. Η τρέχουσα θέση
του κινητού
υπολογίζεται και αποθηκεύεται στις REAL μεταβλητές
x, y και η στιγμιαία του ταχύτητα
στις REAL μεταβλητές
vx, vy. Οι δηλώσεις αυτές γίνονται στην αρχή του προγράμματος με τις
εντολές:
όπου ορίσαμε και την τιμή2
του με τον προσδιορισμό parameter.
Το διαδραστικό με το χρήστη κομμάτι του προγράμματος (user interface) ζητάει από το χρήστη τις τιμές των παραμέτρων που του δίνουμε τη δυνατότητα να προσδιορίζει: omega, x0, y0, R, t0, tf, dt. Αρχικά το πρόγραμμα τυπώνει ένα μήνυμα προτροπής (prompt) στο χρήστη, προσδιορίζοντας τη μεταβλητή που ζητά να διαβάσει. Αυτό γίνεται με απλές print εντολές. Η ανάγνωση των τιμών των παραμέτρων γίνεται από το stdin με εντολές read. Αφού διαβαστούν οι παράμετροι, το πρόγραμμα τυπώνει τις τιμές που διάβασε στο stdout3 :
Στη συνέχεια, το πρόγραμμα θέτει την αρχική κατάσταση των δεδομένων ώστε
να γίνει ο υπολογισμός. Αυτό, εκτός από το να θέσει την τιμή του αρχικού χρόνου t
= t0, περιλαμβάνει και βασικό έλεγχο για τη νομιμότητα των παραμέτρων που
εισήγαγε ο χρήστης. Οι έλεγχοι είναι απαραίτητοι, γιατί, όταν γράφουμε ένα
πρόγραμμα, κάνουμε ορισμένες υποθέσεις απαραίτητες για την ορθή λειτουργία του
προγράμματος που μπορεί ο χρήστης από σφάλμα ή άγνοια να μην έχει σεβαστεί.
΄Οταν, για παράδειγμα, γράφουμε την έκφραση 2.0*PI/omega, υποθέτουμε
ότι η τιμή του omega είναι μη μηδενική, ώστε να γίνει η διαίρεση χωρίς να
προκύψει μοιραίο σφάλμα κατά την εκτέλεση του προγράμματος. Το πρόγραμμά
μας για να λειτουργήσει όπως το σχεδιάσαμε θα απαιτήσουμε να έχουμε
και
. Αυτό θα το ελέγξουμε με μία εντολή if και, αν δεν
πληρούνται οι υποθέσεις, σταματάμε τελείως το πρόγραμμα με την εντολή
stop4 .
Το πρόγραμμα, επίσης, θα ανοίξει το αρχείο Circle.dat στο οποίο θα
αποθηκεύσουμε τις υπολογισμένες τιμές της θέσης και ταχύτητας του κινητού.
Αν ή
, τότε εκτελούνται οι αντίστοιχες εντολές stop οι οποίες
σταματούν την εκτέλεση του προγράμματος. Μετά την εντολή stop βάζουμε
(προαιρετικά) ένα μήνυμα στο χρήστη, ώστε να ξέρει γιατί σταμάτησε το
πρόγραμμα, το οποίο τυπώνεται στο stdout όταν εκτελείται η εντολή stop.
Επίσης, υπολογίζουμε και τυπώνουμε την περίοδο της κυκλικής κίνησης
. Στην εντολή open επιλέξαμε το unit 11 για να γράφουμε στο
Circle.dat. Η επιλογή του αριθμού αυτού είναι ελεύθερη για τον προγραμματιστή
που μπορεί με ασφάλεια να διαλέξει έναν οποιοδήποτε αριθμό από 10 έως
995 .
Τώρα είμαστε στη φάση που μπορεί να γίνει ο υπολογισμός. Αυτό θα γίνει με ένα βρόχο της μορφής
Η πρώτη εντολή (που τη δείξαμε και παραπάνω) θέτει την αρχική τιμή του χρόνου. Οι εντολές που περικλείονται ανάμεσα στο do while(συνθήκη) και enddo εκτελούνται όσο η συνθήκη είναι αληθής. Προσέξτε την εντολή t = t + dt, χωρίς την οποία ο βρόχος θα εκτελείται επ’ αόριστον. Στο ειδικό πρόβλημα που μελετάμε, οι εντολές που μπαίνουν στη θέση των ......... υπολογίζουν τη θέση και την ταχύτητα και τις τυπώνουν στο αρχείο Circle.dat:
Στον υπολογισμό χρησιμοποιούμε τις συναρτήσεις sin και cos που είναι κτισμένες
μέσα στη Fortran και οι οποίες δέχονται ως όρισμα μία γωνία μετρημένη σε radians.
Χρησιμοποιούμε την ενδιάμεση μεταβλητή theta για να υπολογίσουμε τη
φάση . Με την εντολή write(11,*) γράφουμε στο αρχείο
Circle.dat έχοντας κάνει παραπάνω τη σύνδεση με το unit 11 με την εντολή
open.
Το πρόγραμμα το πληκτρολογούμε στο αρχείο Circle.f90. Η κατάληξη “.f90” υποδηλώνει στο μεταγλωττιστή ότι το αρχείο περιέχει κώδικα στη γλώσσα Fortran. Για να το μεταγλωττίσουμε και να το τρέξουμε, δίνουμε τις εντολές:
Με το διακόπτη -o cl δίνουμε την εντολή στο μεταγλωττιστή gfortran να ονομάσει το εκτελέσιμο αρχείο6 cl. Η δεύτερη εντολή (./cl) φορτώνει τις μεταγλωττισμένες εντολές στη μνήμη του υπολογιστή για εκτέλεση. Στη συνέχεια, το πρόγραμμά μας ζητάει τα δεδομένα και εκτελεί τον υπολογισμό. Μια πλήρης τυπική συνεδρία εκτέλεσης του προγράμματος δείχνεται παρακάτω:
Οι γραμμές που αρχίζουν από “#” τυπώνονται από το πρόγραμμα, ενώ οι γραμμές με
αριθμούς χωρίς τη “#” είναι οι αριθμητικές τιμές των παραμέτρων που εισάγει ο
χρήστης. Αφού πληκτρολογήσει τα δεδομένα, ο χρήστης χρησιμοποιεί το
πλήκτρο Enter για να τα εισάγει στη μνήμη του υπολογιστή που τρέχει το
πρόγραμμα. Εδώ ,
,
,
,
και
.
Το πρόγραμμα μπορείτε να το εκτελέσετε πολλές φορές για διαφορετικές τιμές των παραμέτρων με τη βοήθεια του editor. Σε ένα αρχείο με όνομα λ.χ. Circle.in τυπώστε τα δεδομένα που θέλετε να εισάγετε στο πρόγραμμα:
Σε κάθε γραμμή του αρχείου βάζουμε τις τιμές των παραμέτρων που διαβάζει κάθε εντολή read με τη σωστή σειρά. Αφού διαβάσει όλες τις παραμέτρους της εντολής read, η Fortran αγνοεί την υπόλοιπη γραμμή. Η επόμενη εντολή read θα διαβάσει τα δεδομένα από μια νέα σειρά του αρχείου. ΄Ετσι, δίπλα στις παραμέτρους βάζουμε σχόλια για το χρήστη που του θυμίζουν τη σειρά που διαβάζονται οι μεταβλητές. Το πρόγραμμα τώρα μπορούμε να το τρέξουμε με την εντολή:
Η εντολή ./cl τρέχει τις εντολές που περιέχονται στο εκτελέσιμο αρχείο cl. Το < Circle.in οδηγεί τα περιεχόμενα του αρχείου Circle.in στο standard input (stdin) του προγράμματος, εξαναγκάζοντας το cl να διαβάσει τα δεδομένα από το αρχείο αυτό. Το > Circle.out οδηγεί το stdout του προγράμματος cl στο αρχείο Circle.out του οποίου τα περιεχόμενα μπορούμε να τα δούμε, αφού τρέξουμε το πρόγραμμα, με την εντολή cat:
Κλείνουμε την παράγραφο αυτή, παραθέτοντας για διευκόλυνση του αναγνώστη ολόκληρο το πρόγραμμα που πληκτρολογήσαμε στο αρχείο Circle.f90:
Οι γραφικές παραστάσεις των αποτελεσμάτων που πήραμε στην προηγούμενη
παράγραφο μελετώνται με τη βοήθεια του προγράμματος gnuplot. ϒπενθυμίζουμε
ότι τα δεδομένα, το πρόγραμμά μας τα αποθηκεύει στο αρχείο Circle.dat σε πέντε
στήλες: Η 1η είναι ο χρόνος t, η 2η και 3η οι συντεταγμένες x, y και η 4η και 5η οι
συντεταγμένες της ταχύτητας vx, vy. Τα διαγράμματα και
παράγονται
από τις εντολές (που δίνονται μέσα από το gnuplot) και μπορείτε να τα δείτε στο
(αριστερό) σχήμα 2.4:
Η δεύτερη εντολή (replot) βάζει τη δεύτερη γραφική παράσταση μαζί με την πρώτη.
Ας δούμε τώρα πώς μπορούμε να φτιάξουμε τη γραφική παράσταση της γωνίας
. Αυτό μπορούμε να το κάνουμε μέσα από το gnuplot, χωρίς να γράψουμε
κάποιο καινούργιο πρόγραμμα, χρησιμοποιώντας τα δεδομένα μέσα από το
αρχείο Circle.dat. Παρατηρούμε ότι
.
Η συνάρτηση atan2 (που υπάρχει και στη Fortran) είναι διαθέσιμη στο
gnuplot7 .
Για να βρούμε πώς δουλεύει, χρησιμοποιούμε τη βοήθεια στο gnuplot:
΄Αρα αρκεί να καλέσουμε τη συνάρτηση αυτή με εντολή της μορφής atan2(y-y0,x-x0). Στην περίπτωσή μας x0=y0=1, ενώ τα x,y είναι αντίστοιχα στη 2η και 3η στήλη κάθε γραμμής του αρχείου Circle.dat. Θα φτιάξουμε μία κατάλληλη έκφραση στην εντολή using στο gnuplot, όπως και στη σελίδα 154, όπου $2 είναι η τιμή της 2ης και $3 είναι η τιμή της 3ης στήλης:
Η δεύτερη εντολή δίνεται σε μία γραμμή την οποία σπάσαμε με το χαρακτήρα ∖ ώστε να χωράει
στο κείμενο8 .
Προσέξτε πώς ορίσαμε τις τιμές των μεταβλητών x0,y0 μέσα στο gnuplot και τις
χρησιμοποιήσαμε στην έκφραση atan2($3-x0,$2-y0) αντί (ισοδύναμα) να
γράφαμε atan2($3-1,$2-1). Επίσης, μαζί με τη γραφική παράσταση της
κάνουμε και τις γραφικές παραστάσεις των σταθερών συναρτήσεων
,
, ώστε να ελέγξουμε τα όρια των τιμών της
. Η
μεταβλητή9
pi στο gnuplot έχει ορισμένη εσωτερικά την τιμή
. Το αποτέλεσμα μπορείτε να
το δείτε στο (δεξί) σχήμα 2.4.
Οι συνιστώσες των ταχυτήτων ως συνάρτηση του χρόνου
και η τροχιά του υλικού σημείου
μπορούν να απεικονιστούν με τις
εντολές:
Η τελευταία εντολή τοποθετεί τα σημεία x,y στο επίπεδο, αφού αυτά βρίσκονται στις στήλες 2 και 3 αντίστοιχα.
Κλείνουμε αυτήν την παράγραφο δείχνοντας πώς μπορούμε να δούμε το υλικό σημείο να κινείται κάνοντας στοιχειώδες animation με το gnuplot. Για το σκοπό αυτό, έχουμε ένα αρχείο animate2D.gnu στο συνοδευτικό λογισμικό το οποίο θα πρέπει να αντιγράψετε μέσα στον κατάλογο που έχετε το αρχείο των δεδομένων σας Circle.dat και από όπου θα δώσετε και την εντολή gnuplot. Δεν είναι σκοπός εδώ να σας εξηγήσουμε πώς δουλεύει, αλλά πώς να το χρησιμοποιείτε10 . Στο σχήμα 2.5 φαίνεται το τελικό αποτέλεσμα. Οι εντολές είναι απλές. Αρκεί να ορίσουμε από ποιο αρχείο να διαβάσουμε τα δεδομένα11 , τον αρχικό χρόνο απεικόνισης t0 της τροχιάς, τον τελικό tf καθώς και το βήμα dt. Οι χρόνοι αυτοί δεν είναι ανάγκη να είναι οι ίδιοι με αυτούς που βάλαμε στα δεδομένα, όταν τρέχαμε το πρόγραμμα που βρίσκεται στο αρχείο Circle.f90. Οι εντολές που δίνουμε είναι οι
Η πρώτη εντολή καθορίζει το αρχείο από όπου το animate2D.gnu θα διαβάσει
τα δεδομένα. Η δεύτερη ορίζει τα όρια στους άξονες και
. Η τρίτη
εντολή καθορίζει τις παραμέτρους του χρόνου που θα χρησιμοποιηθούν στο
animation (αρχικός, τελικός και βήμα). Και η τέταρτη είναι η εντολή που
“τρέχει” το animation. Αν θέλετε να ξανατρέξει το animation, αρκεί να
δώσετε τις δύο τελευταίες εντολές όσες φορές θέλετε. Λ.χ. αν θέλετε να
τρέξετε το animation στα ίδια δεδομένα με τη “μισή ταχύτητα”, αρκεί να
ξαναορίσετε το dt=0.05, να επαναφέρετε το χρόνο t0=0 και να δώσετε μόνο τις
εντολές
Ας εφαρμόσουμε όσα κάναμε για την απλή κυκλική κίνηση και σε διαφορετικά παραδείγματα κίνησης στο επίπεδο. Το πρώτο πρόβλημα που θα παρουσιάσουμε είναι αυτό του απλού εκκρεμούς που εκτελεί μικρές ταλαντώσεις γύρω από την κατακόρυφο και που φαίνεται στο σχήμα 2.6.
Η κίνηση περιγράφεται από τη χρονική εξάρτηση του μοναδικού βαθμού
ελευθερίας του συστήματος, της γωνίας . Η κίνηση είναι περιοδική με γωνιακή
συχνότητα
και περίοδο
. Η γωνιακή ταχύτητα υπολογίζεται
από τη σχέση
και παίρνουμε:
Τα μόνα σημεία που θα επισημάνουμε στον αναγνώστη είναι ότι την επιτάχυνση της
βαρύτητας τη θέτουμε σταθερή παράμετρο στο πρόγραμμα, ο χρήστης μπορεί να
καθορίσει το μήκος του εκκρεμούς
και ότι το αρχείο των δεδομένων περιέχει
εκτός από τις στήλες 1-5 και άλλες 2 στις οποίες μπορούμε να δούμε τη γωνία και
στιγμιαία γωνιακή ταχύτητα του εκκρεμούς. Η εντολή write(11,100) γράφει στο
unit 11 με τη μορφή (format) που καθορίζει η εντολή FORMAT με label 100. Αυτό
γίνεται ώστε τα δεδομένα να τυπώνονται σε μία γραμμή (δείτε τη συζήτηση στη
σελίδα 121).
Μια απλή συνεδρία μελέτης του προβλήματος συνοψίζεται παρακάτω12 :
Το επόμενο πρόβλημα θα είναι η μελέτη της βολής υλικού σημείου κοντά στην επιφάνεια της γης13 αγνοώντας όλες τις δυνάμεις τριβής του αέρα. ΄Οπως γνωρίζουμε, η τροχιά του σωματιδίου και η ταχύτητά του δίνονται από τις παραμετρικές εξισώσεις, με παράμετρο το χρόνο
όπου έχουμε υποθέσει τις αρχικές συνθήκες Η δομή του προγράμματος είναι παρόμοια με τα προηγούμενα. Ο χρήστης εισάγει
το μέτρο της αρχικής ταχύτητας και τη γωνία σε μοίρες που σχηματίζει με την
οριζόντια διεύθυνση. Εδώ παίρνουμε το χρόνο
. Το πρόγραμμα υπολογίζει
τις
και
και τις τυπώνει στο χρήστη στο stdout. Τα δεδομένα
σώζονται στο αρχείο Projectile.dat. Το πρόγραμμα δίνεται ολόκληρο
παρακάτω και βρίσκεται στο αρχείο Projectile.f90 του συνοδευτικού
λογισμικού.
Για διευκόλυνση του αναγνώστη, δίνουμε πάλι τις εντολές μιας τυπικής συνεδρίας μελέτης του προβλήματος:
Στη συνέχεια, ας δούμε το σύστημα όταν στο υλικό σημείο δρα ομαλή αντίσταση
από ένα ρευστό της μορφής , δηλ. μια δύναμη που είναι αντίθετη με
την ταχύτητα σε κάθε χρονική στιγμή. Οι λύσεις των εξισώσεων κίνησης
Δίνουμε πάλι τις εντολές μιας τυπικής συνεδρίας μελέτης του προβλήματος:
΄Οπως και παραπάνω διπλώσαμε τις εντολές που δε χωρούσαν σε δύο γραμμές. Ορίσαμε τις μεταβλητές gnuplot v0x, v0y, g και k να έχουν τις τιμές που χρησιμοποιήσαμε όταν τρέξαμε το πρόγραμμα. Μπορούμε έτσι και κατασκευάζουμε τις ασύμπτωτες των συναρτήσεων15 . Τα αποτελέσματα φαίνονται στα σχήματα 2.9 και 2.10.
Το τελευταίο παράδειγμα που θα μελετήσουμε στην παράγραφο αυτή είναι αυτό του ανισότροπου αρμονικού ταλαντωτή. Αυτό είναι ένα υλικό σημείο υπό την επίδραση της δύναμης
![]() | (2.11) |
όπου οι “σταθερές των ελατηρίων” και
είναι διαφορετικές
στις δύο ορθογώνιες κατευθύνσεις που ορίζονται από τους καρτεσιανούς άξονες
και
. Οι λύσεις των εξισώσεων αυτών για
,
,
και
είναι
Στο παραπάνω πρόγραμμα έχουμε θέσει . Ο χρήστης εισάγει τις δύο
συχνότητες
και
και τους αντίστοιχους χρόνους. Εύκολα μπορούμε να το
μελετήσουμε με τις εντολές
Στο σχήμα 2.11 δείχνουμε το αποτέλεσμα για την τροχιά του ασύμμετρου αρμονικού
ταλαντωτή με και
.
Στην παράγραφο αυτή θα κάνουμε μια απλή γενίκευση των μεθόδων που
περιγράψαμε στις προηγούμενες παραγράφους για να μελετήσουμε την κίνηση ενός
υλικού σωματιδίου στο χώρο. Οι μόνες αλλαγές που θα κάνουμε, θα είναι η
προσθήκη μιας ακόμα εξίσωσης για τη συντεταγμένη και τη συνιστώσα της
ταχύτητας
και η μέθοδος απεικόνισης των τροχιών στο gnuplot. Τα
προγράμματα που θα γράψουμε θα έχουν παρόμοια δομή με αυτά που γράψαμε για
την κίνηση σωματιδίου στο επίπεδο.
Το πρώτο παράδειγμα που θα εξετάσουμε είναι το κωνικό εκκρεμές του σχήματος
2.12. Αυτό κινείται στο επίπεδο με σταθερή γωνιακή ταχύτητα
. Οι εξισώσεις
κίνησης δίνονται από τις σχέσεις
![]() | (2.13) |
όπου φυσικά . Λύνοντας τις παραπάνω
εξισώσεις16
βρίσκουμε:
![]() | (2.17) |
και ότι καθώς ,
.
Στο πρόγραμμα που θα γράψουμε ο χρήστης δίνει τις παραμέτρους και
, τον τελικό χρόνο
και το βήμα χρόνου
(παίρνουμε
). Η
σύμβαση για την έξοδο των δεδομένων από το πρόγραμμα είναι ότι γράφονται
σε ένα αρχείο, μία γραμμή ανά χρονική στιγμή, όπου οι 7 πρώτες στήλες
είναι οι τιμές των
,
,
,
,
,
και
. Επειδή η γραμμή είναι
μεγάλη και δε θέλουμε να τη σπάσει η Fortran, δίνουμε την κατάλληλη εντολή
FORMAT. Δείτε τη συζήτηση στη σελίδα 121. Το πρόγραμμα παρατίθεται
παρακάτω:
Για να το μεταγλωττίσουμε και να το τρέξουμε, κάνουμε τα γνωστά:
Τα αποτελέσματα θα τα βρούμε στο αρχείο ConicalPendulum.dat.
Για να δούμε τις γραφικές παραστάσεις των συναρτήσεων ,
,
,
,
,
, εκτελούμε τις γνωστές εντολές μέσα από το
gnuplot:
Το αποτελέσματα φαίνονται στο σχήμα 2.13.
Για να δούμε την τρισδιάστατη τροχιά στο χώρο, θα χρησιμοποιήσουμε την εντολή splot στο gnuplot:
Το αποτέλεσμα φαίνεται στο σχήμα 2.14. Μπορούμε να κάνουμε κλικ πάνω στην τροχιά και να περιστρέψουμε την καμπύλη, ώστε να τη δούμε από διαφορετικές οπτικές γωνίες.
Μπορούμε να αλλάξουμε τα όρια στους άξονες ορίζοντάς τα ρητά στην εντολή splot:
Στο συνοδευτικό λογισμικό περικλείεται και το αρχείο animate3D.gnu με το
οποίο μπορούμε να κάνουμε απλά animations της τροχιάς της κίνησης ενός υλικού
σημείου στο χώρο. Οι εντολές που πρέπει να δώσουμε είναι ανάλογες με αυτές που
δίναμε στην περίπτωση του animate2D.gnu με τη μόνη διαφορά ότι καλό είναι
να ορίσουμε τα όρια και στον άξονα των . Για να δούμε την τροχιά του
κωνικού εκκρεμούς από τα δεδομένα που παραγάγαμε παραπάνω, δίνουμε τις
εντολές:
Το αποτέλεσμα το βλέπουμε στο σχήμα 2.15.
Περιττό να πούμε πως το πρόγραμμα animate3D.gnu μπορεί να χρησιμοποιηθεί πάνω σε οποιοδήποτε αρχείο που περιέχει δεδομένα της μορφής t x y z στις πρώτες τέσσερις στήλες του. Απλά αλλάζουμε την τιμή της μεταβλητής file στο όνομα του αρχείου που θα μελετήσουμε. ΄Οπως και με το animate2D.gnu μπορούμε να αλλάξουμε μόνο όποιες από τις μεταβλητές file, t0, tf, dt είναι αναγκαίο πριν επαναλάβουμε το animation με την εντολή load "animate3D.gnu".
Στη συνέχεια, θα μελετήσουμε την τροχιά ενός φορτισμένου σωματιδίου που
εισέρχεται σε ένα ομογενές μαγνητικό πεδίο τη χρονική στιγμή
από τη θέση
με ταχύτητα
όπως φαίνεται στο σχήμα
2.16.
Στο φορτίο εξασκείται από το μαγνητικό πεδίο η δύναμη Lorentz
. Οι εξισώσεις κίνησης είναι
Με τα παραπάνω είναι εύκολο τώρα να γράψουμε ένα πρόγραμμα που να
υπολογίζει την τροχιά του παραπάνω φορτίου. Οι παράμετροι που θα εισάγει ο
χρήστης είναι το μέτρο της ταχύτητας , τη γωνία
σε μοίρες (βλ. σχήμα 2.16)
και τη συχνότητα
. Προφανώς θα έχουμε
και
. Η
αρχική θέση υπολογίζεται τότε από την
. Το πρόγραμμα δίνεται
αυτούσιο παρακάτω και μπορείτε να το βρείτε στο αρχείο ChargeInB.f90 στο
συνοδευτικό λογισμικό:
Παραθέτουμε εδώ τις εντολές μιας τυπικής συνεδρίας τα αποτελέσματα της οποίας δείχνονται στο σχήμα 2.17 και στο σχήμα 2.18.
Στην παράγραφο αυτή θα μελετήσουμε την κίνηση ενός σωματιδίου η οποία είναι ευθύγραμμη και ομαλή σε πεπερασμένα διαστήματα, αλλά σε συγκεκριμένα σημεία του χώρου έχουμε ελαστική κρούση σε ένα τοίχωμα αμετακίνητο και αδιαπέραστο. Η κρούση αυτή θα δούμε ότι περιγράφεται από τους αλγόριθμους που θα προγραμματίσουμε προσεγγιστικά. ΄Ετσι, θα μελετήσουμε για πρώτη φορά τα συστηματικά σφάλματα που εισάγονται από τους αλγόριθμους που χρησιμοποιούμε17 , όταν φτιάχνουμε ένα μοντέλο για το σύστημα που μελετάμε.
Το πιο απλό παράδειγμα που θα μελετήσουμε είναι η κίνηση ενός σωματιδίου σε ένα
“μονοδιάστατο κουτί”. Το σωμάτιο κινείται ελεύθερα πάνω στον άξονα των στο
διάστημα
όπως φαίνεται στο σχήμα 2.19. ΄Οταν φτάνει στα άκρα του
διαστήματος, ανακλάται στα τοιχώματα και η ταχύτητά του αναστρέφεται. Η
δυναμική του ενέργεια είναι
![]() | (2.21) |
που έχει σχήμα ενός απειρόβαθου πηγαδιού δυναμικού. Η δύναμη
μέσα στο κουτί, όπου το σωμάτιο κινείται ελεύθερα, και
στα τοιχώματα,
όπου ανακλάται.
Το σύστημα είναι πολύ απλό. Αρκεί να δώσουμε την αρχική θέση του σωματιδίου
και την αρχική του ταχύτητα
(το πρόσημό της δηλώνει και την αρχική
κατεύθυνση κίνησης). ΄Οσο δε συγκρούεται με τα τοιχώματα η κίνηση είναι
ευθύγραμμη και ομαλή και ισχύουν οι απλές σχέσεις
όπου η συνθήκη σύγκρουσης δίνεται στην προτελευταία γραμμή με τη λογική πρόταση “Αν x μικρότερο του 0 ή το x μεγαλύτερο του L”. Φαίνεται η αδυναμία του αλγόριθμου να ελέγξει την ακριβή χρονική στιγμή της κρούσης.
Ας δούμε τώρα ολόκληρο το πρόγραμμα, το οποίο βρίσκεται στο αρχείο box1D_1.f90 του συνοδευτικού λογισμικού. Ο χρήστης μπορεί να καθορίσει το μήκος του κουτιού L και τις αρχικές συνθήκες x0, v0. Δίνει τον αρχικό και τελικό χρόνο της κίνησης t0, tf, καθώς και το βήμα υπολογισμού dt και ο υπολογισμός ... ξεκινάει:
Τα δεδομένα τα βρίσκουμε σε τρεις στήλες στο αρχείο box1D_1.dat. Η μεταγλώττιση και το τρέξιμο γίνεται κατά τα γνωστά, ενώ η γραφική παράσταση της τροχιάς γίνεται με το gnuplot:
Τα αποτελέσματα για την τροχιά δείχνονται στο σχήμα 2.20. Είναι φανερή
η επίδραση του συστηματικού σφάλματος στα αποτελέσματα. Με τις απλές αρχικές
συνθήκες που επιλέξαμε, οι κρούσεις συμβαίνουν κάθε
μονάδες
χρόνου. ΄Αρα στο κομμάτι του διαγράμματος που μεγεθύναμε στο αριστερό του
σχήματος 2.20, η αντιστροφή της κίνησης θα έπρεπε να είχε συμβεί όταν
,
.
Ο αναγνώστης θα έχει ήδη καταλάβει ότι το παραπάνω πρόβλημα βελτιώνεται, αν
πάρουμε το ολοένα και πιο μικρό. ΄Αρα, αν έχουμε την απαραίτητη υπολογιστική
δύναμη, μπορούμε να κάνουμε το σφάλμα όσο μικρό θέλουμε; Ναι, αυτό
μέχρι ένα σημείο γίνεται. ΄Ομως η επόμενη θέση καθορίζεται από την πράξη
x+v*dt και η επόμενη χρονική στιγμή από το άθροισμα t+dt. Τι θα γίνει αν
παίρνοντας το dt αρκετά μικρό, το γινόμενο v*dt γίνει περισσότερο από επτά
τάξεις μεγέθους μικρότερο από την τρέχουσα τιμή του x; ΄Η το dt
t18 ;
Αφού τα x, v, dt είναι μεταβλητές τύπου REAL, η ακρίβεια στην αναπαράστασή
τους είναι περίπου επτά δεκαδικά ψηφία. Για να κάνει ο υπολογιστής πρόσθεση δύο
αριθμών, πρέπει να μετατρέψει τους δύο αριθμούς σε αναπαράσταση που θα έχουν
τον ίδιο εκθέτη. ΄Αρα ο αριθμός των σημαντικών ψηφίων του μικρότερου
αριθμού που θα μπορέσει να αποθηκεύσει στη μνήμη ο υπολογιστής θα
μειωθεί19
και το αποτέλεσμα της πρόσθεσης χάνει μέρος της υπάρχουσας ακρίβειας των
δεδομένων.
Αυτό όσο και να προσπαθούμε δε διορθώνεται20 . Η μόνη μας ελπίδα είναι να επινοήσουμε έναν καλύτερο αλγόριθμο. Αυτό τις περισσότερες φορές φορές δεν είναι δυνατόν, αλλά στο πρόβλημα που μελετάμε η λύση είναι απλή. Λ.χ. θεωρήστε τη σχέση που δίνει τη θέση του κινητού στην ευθύγραμμη ομαλή κίνηση:
![]() | (2.24) |
Ας χρησιμοποιήσουμε την παραπάνω σχέση για τα τμήματα της κίνησης μεταξύ των
συγκρούσεων. Το μόνο που έχουμε να κάνουμε είναι σε κάθε σύγκρουση με ένα από
τα τοιχώματα να αντιστρέφουμε τη , να ορίζουμε το
να είναι η τρέχουσα
θέση του κινητού και
να είναι η τρέχουσα χρονική στιγμή. Αυτό επιτυγχάνεται
με το βρόχο:
Στον παραπάνω αλγόριθμο δε γλιτώνουμε από το σφάλμα προσδιορισμού της
στιγμής της κρούσης, αλλά δεν έχουμε το πρόβλημα “αστάθειας” που είχε ο
προηγούμενος όταν dt. ΄Ετσι, έχουμε τη δυνατότητα να απομονώσουμε τη
συνεισφορά κάθε τύπου σφαλμάτων. Παρακάτω δίνουμε το πρόγραμμα που
χρησιμοποιεί τον παραπάνω αλγόριθμο που μπορείτε να βρείτε στο συνοδευτικό
λογισμικό στο αρχείο box1D_2.f90:
Το πρόγραμμα το μεταγλωττίζουμε και το τρέχουμε όπως το προηγούμενο. Τα αποτελέσματα θα τα βρούμε στο αρχείο box1D_2.dat.
Ο παραπάνω αλγόριθμος μπορεί να βελτιωθεί και να μας δώσει την ακριβή λύση. Σας το αφήνουμε για άσκηση21 .
Ας δούμε με λίγο περισσότερη λεπτομέρεια την επίδραση των συστηματικών
σφαλμάτων στα αποτελέσματα που πήραμε από τη μελέτη του απλού προβλήματος
που περιγράψαμε στην προηγούμενη παράγραφο. Θεωρήσαμε δύο κατηγορίες
σφαλμάτων: Πρώτα, το συστηματικό σφάλμα στον προσδιορισμό της χρονικής
στιγμής της κρούσης. Αυτό μειώνεται όταν ελαττώνουμε το βήμα χρόνου . Μετά,
το σφάλμα πρόσθεσης αριθμών με μεγάλη διαφορά τάξης μεγέθους και την αστάθεια
που αυτή προκαλεί. Αυτό αυξάνεται, όταν ελαττώνουμε αρκετά το βήμα χρόνου
.
΄Αρα, τα δύο σφάλματα ανταγωνίζονται και ο μελετητής του προβλήματος πρέπει να
προσδιορίσει τη βέλτιστη επιλογή για το
. Αυτή η κατάσταση παρουσιάζεται σε
πολλά ενδιαφέροντα προβλήματα για τα οποία δε γνωρίζουμε την ακριβή τους
λύση, οπότε είναι πολύ διδακτικό να τη μελετήσουμε στο απλό πρόβλημα που
επιλέξαμε.
΄Οταν δε γνωρίζουμε τη λύση, ο έλεγχος αυτών των συστηματικών σφαλμάτων
γίνεται μελετώντας τη συμπεριφορά της λύσης, καθώς ελαττώνεται το . Αν
παρατηρηθεί σύγκλιση των λύσεων για μια περιοχή αρκετά μικρών
, τότε
καταλήγουμε στο συμπέρασμα ότι η λύση είναι το όριο αυτό με ακρίβεια
συγκρινόμενη με τη διαφορά των λύσεων για τα μικρότερα
.
Χρησιμοποιήσαμε δύο αλγόριθμους, ο πρώτος υλοποιήθηκε στο πρόγραμμα που
γράψαμε στο αρχείο box1D_1.f90 και ο δεύτερος στο box1D_2.f90. Θα αναφερόμαστε
σε αυτούς στην παράγραφο αυτή ως η “μέθοδος 1” και “μέθοδος 2” αντίστοιχα. Θα
δοκιμάσουμε να δούμε πώς μπορούμε να κάνουμε την ανάλυση της σύγκλισης των
αποτελεσμάτων καθώς . Για κάθε μέθοδο θα καθορίσουμε όλες τις
παραμέτρους εκτός από το
. Στην ανάλυση παρακάτω θα χρησιμοποιήσουμε
,
,
,
,
, άρα το υλικό σημείο θα
πρέπει να κάνει μία κρούση ανά 10 μονάδες χρόνου. Θα πάρουμε διαδοχικά
μικρότερες τιμές του
και θα υπολογίσουμε την τελική θέση του κινητού
22
ως συνάρτηση του
. Θα μελετήσουμε αν, πόσο καλά και
πόσο γρήγορα συγκλίνει αυτή η τιμή σε ένα όριο, καθώς
23.
Η ανάλυση αποτελείται από πολλές επαναλαμβανόμενες εντολές: Η μεταγλώττιση
του κώδικα, ο καθορισμός των παραμέτρων, το τρέξιμο και ο υπολογισμός τις τιμής
για πολλές τιμές του
. Σε ένα αρχείο box1D_anal.in γράφουμε τις
τιμές των παραμέτρων που θα εισάγουμε στο πρόγραμμα:
Στη συνέχεια, μεταγλωττίζουμε το πρόγραμμα
και το τρέχουμε με την εντολή
που στέλνει τα περιεχόμενα του αρχείου box1D_anal.in στο stdin του προγράμματος ./box. Το αποτέλεσμα που ζητάμε είναι στην τελευταία γραμμή του αρχείου box1D_1.dat:
Η τρίτη τιμή είναι αυτή της ταχύτητας και δε μας ενδιαφέρει. Σε ένα αρχείο,
λ.χ. box1D_anal.dat τοποθετούμε το και τις δύο πρώτες τιμές
από την παραπάνω εντολή. Αλλάζουμε την τιμή του
στο
αρχείο box1D_anal.in 12 φορές μέχρι να γίνει ίση με
και
επαναλαμβάνουμε24 .
Επαναλαμβάνουμε τη διαδικασία25
για τη μέθοδο 2 τοποθετώντας τα αποτελέσματα για το
σε νέες στήλες
στο αρχείο box1D_anal.dat. Το αποτέλεσμα είναι
Η μελέτη της σύγκλισης μπορεί να φανεί εποπτικά στο αριστερό σχήμα 2.21. Η
1η μέθοδος βελτιώνει την ακρίβειά της μεγιστοποιώντας την όταν , ενώ
για
, το σφάλμα γίνεται
% και η μέθοδος δίνει άχρηστα
αποτελέσματα. Η 2η μέθοδος έχει πολύ καλύτερη συμπεριφορά από την
1η.
Παρατηρούμε ότι, καθώς μικραίνει το , η τελική τιμή του
πλησιάζει την
αναμενόμενη
. Γιατί όμως δεν παίρνουμε
, ειδικά όταν
είναι
ακέραιος αριθμός; Επίσης παρατηρούμε στην 9η γραμμή των δεδομένων
του πίνακα (dt=0.000195): Αφού
δεν είναι ακέραιος, γιατί
; Ακόμα χειρότερα: Αν θεωρητικά αναμένουμε να γίνουν
βήματα, πόσα γίνονται στην πραγματικότητα; Κάθε φορά που κάνετε μια
μέτρηση μετρήστε πόσες γραμμές έχει το αρχείο box1D_1.dat με την
εντολή26
και συγκρίνετε με τον αναμενόμενο αριθμό. Το αποτέλεσμα είναι ενδιαφέρον:
όπου η 2η στήλη έχει τον αριθμό των βημάτων που έγιναν και η 3η τον αριθμό των
βημάτων που έπρεπε να γίνουν. Παρατηρούμε ότι η ακρίβεια ελαττώνεται , όταν
μικραίνουμε το και στο τέλος η διαφορά είναι περίπου 5%! Ειδικά στην
τελευταία γραμμή, αν οι πράξεις γίνονταν με μεγαλύτερη ακρίβεια, θα έπρεπε ο
τελικός χρόνος να ήταν
κάτι που αλλάζει
δραματικά το αποτέλεσμα σε μια περιοδική κίνηση με περίοδο συγκρινόμενη με το
σφάλμα στο χρόνο... Επειδή η 1η μέθοδος προχωράει το χρόνο στις εξισώσεις
κίνησης ανάλογα με τον αριθμό των βημάτων, καταλαβαίνουμε ότι στην
πραγματικότητα η τιμή που παίρνουμε για τη θέση είναι για άλλο χρόνο από αυτόν
που νομίζουμε.
΄Αρα μια σημαντική πηγή σφαλμάτων είναι το σφάλμα συσσώρευσης στον
υπολογισμό του χρόνου που γίνεται μεγαλύτερο, καθώς μικραίνει το . Πώς θα
μπορούσαμε να βελτιώσουμε τη συμπεριφορά αυτή; Μια σημαντική βελτίωση μπορεί
να γίνει, αν αντί να υπολογίζουμε το χρόνο προσθετικά, τον υπολογίζουμε
πολλαπλασιαστικά. ΄Εστω i ένας μετρητής των βημάτων που έχουμε κάνει.
Τότε
Ο κύριος βρόχος του προγράμματος στο box1D_1.f90 γίνεται:
Το πλήρες πρόγραμμα θα το βρείτε στο αρχείο box1D_4.f90 του συνοδευτικού λογισμικού. Ας ονομάσουμε τη μέθοδο αυτή “μέθοδο 3”. Παρόμοια αλλαγή κάνουμε και στο αρχείο box1D_2.f90 που θα βρείτε στο box1D_5.f90 και καλούμε τη μέθοδο αυτή “μέθοδο 4”. Επαναλαμβάνουμε την παραπάνω ανάλυση και βρίσκουμε ότι το πρόβλημα ακριβούς προσδιορισμού του χρόνου πρακτικά εξαφανίζεται. Το αποτέλεσμα της ανάλυσης του σφάλματος το δείχνουμε στο δεξί σχήμα 2.21. Η μέθοδος 2 και 4 δεν παρουσιάζει σημαντική διαφορά. Στη μέθοδο 1 και 3 η διαφορά είναι δραματική με το σφάλμα να μειώνεται μέχρι και περισσότερο από 10 φορές.
Το πρόβλημα του αυξανόμενου σφάλματος καθώς μειώνουμε το δεν
εξαφανίζεται. Αλλά τώρα καταλαβαίνουμε ότι προέρχεται από τη συσσώρευση
σφάλματος στην επαναληπτική σχέση x=x+v*dt. Αυτόν τον τύπο σφάλματος είναι
δυσκολότερο να τον βελτιώσουμε και παρουσιάζεται συχνά σε μεθόδους επίλυσης
διαφορικών εξισώσεων που θα μελετήσουμε στο επόμενο κεφάλαιο.
Ας γενικεύσουμε τη μελέτη μας όταν το υλικό σημείο κινείται στις δύο διαστάσεις,
στο επίπεδο. Το σωμάτιο είναι περιορισμένο μέσα σε ένα κουτί ,
και σκεδάζεται ελαστικά πάνω στα τοιχώματά του. Βρίσκεται δηλαδή σε
ένα ορθογώνιο απειρόβαθο πηγάδι δυναμικού. Ο χρήστης τοποθετεί τη χρονική
στιγμή
το υλικό σημείο σε μια αρχική θέση
με αρχική ταχύτητα
και το πρόγραμμα υπολογίζει την τροχιά που ακολουθεί το υλικό σημείο
μέχρι το χρόνο
με βήμα
. Μία τέτοια τροχιά φαίνεται στο σχήμα
2.23.
Θα γενικεύσουμε τον αλγόριθμο που χρησιμοποιήσαμε στο πρόγραμμα
box2D_1.f90 για να μελετήσουμε την κίνηση στο μονοδιάστατο κουτί. Αν είναι
γνωστή η θέση και η ταχύτητα του κινητού σε μια χρονική στιγμή , τότε τη
χρονική στιγμή
η θέση και η ταχύτητά του θα δίνεται από τις σχέσεις
Παραθέτουμε το πλήρες πρόγραμμα παρακάτω το οποίο θα βρείτε στο αρχείο box2D_1.f90. Εκτός από τα εισαγωγικά και τις αρχικοποιήσεις, εισάγαμε και δύο μετρητές κρούσεων με τα τοιχώματα nx και ny:
Μια τυπική συνεδρία μελέτης μιας τροχιάς δίνεται παρακάτω:
Παρατηρούμε την τελευταία γραμμή εξόδου από το πρόγραμμα: Το υλικό σημείο ανακλάται από τα κάθετα τοιχώματα του κουτιού 6 φορές (nx= 6) και από τα οριζόντια 13 (ny=13). Με τις εντολές αυτές παίρνουμε τις γραφικές παραστάσεις που φαίνονται στα σχήματα 2.22 και 2.23.
Για να κάνουμε animation της τροχιάς αντιγράφουμε το αρχείο
box2D_animate.gnu από το συνοδευτικό λογισμικό στον κατάλογο που έχουμε τα
δεδομένα μας και δίνουμε τις εντολές στο gnuplot:
Στην τελευταία γραμμή επαναλάβαμε το animation στη ... μισή ταχύτητα. Μπορείτε να χρησιμοποιήσετε επίσης το ήδη γνωστό πρόγραμμα animate2D.gnu που παρουσιάσαμε στην παράγραφο 2.1.1. Οι αλλαγές που κάναμε στο box2D_animate.gnu απλά προσθέτουν ένα σχέδιο του κουτιού και υπολογίζουν αυτόματα τα όρια σχεδιασμού της γραφικής παράστασης. Επίσης, το διάνυσμα που παρακολουθεί την κίνηση του σωματιδίου δεν είναι το διάνυσμα θέσης, αλλά αυτό που ενώνει την αρχική με την τελική θέση του.
Το επόμενο βήμα είναι να ελέγξουμε την ακρίβεια των αποτελεσμάτων μας. Αυτό γίνεται στο πνεύμα της αντίστοιχης παρουσίασης του μονοδιάστατου προβλήματος και αφήνεται σαν άσκηση για τον αναγνώστη.
Στην παράγραφο αυτή θα παρουσιάσουμε απλά προβλήματα ελεύθερης κίνησης μετ’ εμποδίων για εξάσκηση στον προγραμματισμό τους.
Θα αρχίσουμε με ... μίνι γκολφ. Ο παίκτης ρίχνει το (σημειακό) μπαλάκι σε ένα
ορθογώνιο επίπεδο κουτί μήκους πλευρών ,
το οποίο είναι ανοιχτό στην
πλευρά
. Το κουτί έχει μια τρύπα κέντρου
και ακτίνας
. Αν η
μπάλα πέσει μέσα, ο παίκτης κερδίζει. Αν η μπάλα βγει από την ανοιχτή πλευρά, ο
παίκτης χάνει. Για να ελέγξουμε αν το υλικό σημείο μπήκε στην περιοχή της τρύπας
όταν είναι στη θέση
αρκεί να ελέγξουμε αν
.
Το υλικό σημείο υποτίθεται πως για βρίσκεται στη θέση
και ο
παίκτης το εκτοξεύει με ταχύτητα μέτρου
με γωνία
μοίρες που σχηματίζει με
τον άξονα
. Το πρόγραμμα δίνεται παρακάτω:
Για να το τρέξουμε κάνουμε τα συνηθισμένα:
Φτιάξτε τα διαγράμματα της θέσης και της ταχύτητας με το χρόνο καθώς και της τροχιάς κατά τα γνωστά. Για διασκέδαση του αναγνώστη παρέχουμε και ειδικό πρόγραμμα animation (μπορείτε να χρησιμοποιήσετε και το animate2D.gnu). Αντιγράψτε από το συνοδευτικό λογισμικό το αρχείο MiniGolf_animate.gnu, ξεκινήστε το gnuplot και δώστε τις εντολές:
Το σχήμα 2.24 αποτελεί αδιάψευστη μαρτυρία της επιτυχίας μας!
Η επόμενη εφαρμογή μας θα είναι τρισδιάστατη. Θα μελετήσουμε την κίνηση ενός
υλικού σημείου το οποίο κινείται μέσα σε ένα κύλινδρο ακτίνας και ύψους
. Η
κρούσεις στα τοιχώματα και τις βάσεις του κυλίνδρου είναι ελαστικές και ο κύλινδρος
είναι αμετακίνητος και απαραμόρφωτος. Στο πρόγραμμα που θα γράψουμε παίρνουμε
τον κύλινδρο να έχει τον άξονα συμμετρίας τον άξονα των
. Η μία βάση του
τοποθετείται στο επίπεδο
και η άλλη στο
. Η διάταξη φαίνεται στο
σχήμα 2.26.
Το πρόβλημα δεν παρουσιάζει καμία δυσκολία σε σχέση με τα προηγούμενα όσο
αφορά την κίνηση στον άξονα των , το σωμάτιο ανακλάται πάνω στα επίπεδα
τοιχώματα των βάσεων του κυλίνδρου. Το μόνο καινούργιο είναι η προβολή της
κίνησης στο επίπεδο
, όπου το υλικό σημείο φαίνεται να κινείται σε ένα
επίπεδο και να συγκρούεται ελαστικά στο εσωτερικό ενός κύκλου ακτίνας
και κέντρο πάνω στον άξονα των
. Η κατάσταση περιγράφεται στο
σχήμα 2.25. Κατά την ελαστική ανάκλαση του σωματίου απλά
,
ενώ η
μένει η ίδια. Η ταχύτητα του σωματιδίου πριν την κρούση είναι
Ο μετασχηματισμός ,
θα υλοποιηθεί σε μια υπορουτίνα
reflectVonCircle(vx,vy,x,y,xc,yc,R). Στην είσοδο της δίνουμε την αρχική ταχύτητα
(vx,vy), το σημείο κρούσης (x,y), το κέντρο του κύκλου (xc,yc) και την ακτίνα του
κύκλου27
R. Στην έξοδο, τα (vx,vy) έχουν αντικατασταθεί με τις νέες
τιμές28
.
Το πρόγραμμα που προκύπτει θα το βρείτε στο αρχείο Cylinder3D.f90:
Να επισημάνουμε μόνο τις ακόλουθες λεπτομέρειες: Χρησιμοποιούμε καταρχήν τη
συνάρτηση atan2 για τον προσδιορισμό της γωνίας theta. Η συνάρτηση αυτή με
ορίσματα atan2(y,x) επιστρέφει τη γωνία στο σωστό
τεταρτημόριο που βρίσκεται το σημείο
. Η γωνία που ζητάμε δίνεται από την
εντολή atan2(y-yc,x-xc). Στη συνέχεια εφαρμόζουμε τις σχέσεις (2.29) και
(2.31) , ενώ στις τελευταίες δύο γραμμές επιβάλλουμε μετά την κρούση το υλικό
σημείο να είναι πάνω στο σημείο του κύκλου
.
Η μεταγλώττιση και το τρέξιμο γίνονται κατά τα γνωστά:
Για να φτιάξουμε τις γραφικές παραστάσεις της θέσης/ταχύτητας συναρτήσει του χρόνου δίνουμε τις εντολές gnuplot κατά τα γνωστά:
Μπορούμε να δούμε και την απόσταση του κινητού από τον άξονα του κυλίνδρου
ως συνάρτηση με το χρόνο με την εντολή
Για να φτιάξουμε το σχήμα της τροχιάς μαζί με τον κύλινδρο δίνουμε τις εντολές
Με την εντολή set parametric μπορούμε να φτιάξουμε τη γραφική παράσταση
μιας δισδιάστατης επιφάνειας της μορφής .
Ο κύλινδρος (χωρίς τις βάσεις του) δίνεται από τις παραμετρικές εξισώσεις
με
,
.
Για το animation της τροχιάς αντιγράψτε το αρχείο Cylinder3D_animate.gnu στον κατάλογο που κάνετε την ανάλυση και μέσα από το gnuplot δώστε τις εντολές
βάζοντας φυσικά τις παραμέτρους που χρησιμοποιήσατε εσείς. Το αποτέλεσμα φαίνεται στο σχήμα 2.26.
Τελευταία εφαρμογή θα είναι ένα απλό πρότυπο χωροχρονικής σκουλικότρυπας (spacetime wormhole). Η χωροχρονική σκουλικότρυπα είναι η απλή χωροχρονική γεωμετρία που συνδέει δύο απομακρυσμένες περιοχές του χώρου οι οποίες είναι ασυμπτωτικά επίπεδες (δηλ. σε αρκετά μεγάλη απόσταση από τα στόμια της σκουλικότρυπας, ο χώρος είναι σχεδόν επίπεδος). Μια τέτοια γεωμετρία φαίνεται στο σχήμα 2.27. Η απόσταση που διανύει κάποιος περνώντας από τα στόμια της τρύπας, μπορεί να είναι πολύ μικρότερη από την απόσταση των στομίων που διανύει κανείς εκτός της σκουλικότρυπας οπότε, θεωρητικά τουλάχιστον, μπορούν να χρησιμοποιηθούν για διαστρικά / διαγαλαξιακά ταξίδια. ΄Η, όπως φαίνεται και στο σχήμα, να επικοινωνήσουν περιοχές του χώρου που θα ήταν διαφορετικά ασύνδετες μεταξύ τους. Να σημειώσουμε πάντως, ότι παρόλο που τέτοιες γεωμετρίες έχουν εξάψει την φαντασία των φυσικών, αλλά και των συγγραφέων επιστημονικής φαντασίας, η υλοποίηση τους στα πλαίσια της τρέχουσας θεωρίας για τη βαρύτητα, τη Γενική Θεωρία της Σχετικότητας, δεν είναι δυνατή. Για την κατασκευή τους, η εξίσωση του Einstein απαιτεί εξωτικού τύπου ύλη με αρνητική πυκνότητα ενέργειας η οποία δεν έχει παρατηρηθεί στη φύση. Τέτοιες εξωτικές γεωμετρίες είναι δυνατόν να παρουσιάζονται σε μικροσκοπικό επίπεδο ως κβαντικές διακυμάνσεις της γεωμετρίας29 .
Στην εφαρμογή αυτή θα μελετήσουμε μια πολύ απλή τέτοια γεωμετρία στο επίπεδο, καθώς και την ελεύθερη κίνηση σωματιδίου μέσα σε αυτή30 .
Παίρνουμε το επίπεδο και αφαιρούμε δύο δίσκους ακτίνας που τα κέντρα τους
απέχουν απόσταση
όπως φαίνεται στο σχήμα 2.28. Ταυτοποιούμε τα σημεία των
κύκλων έτσι ώστε το σημείο 1 στον αριστερό κύκλο να ταυτίζεται με το σημείο 1
στο δεξιό, το σημείο 2 με το σημείο 2 κ.ο.κ. Οι δύο κύκλοι δίνονται από τις
παραμετρικές εξισώσεις
,
,
για
το δεξί κύκλο και
,
,
για τον
αριστερό. Τα σημεία με το ίδιο
στους δύο κύκλους ταυτίζονται. ΄Ενα σωμάτιο
που βυθίζεται στο αριστερό στόμιο της σκουλικότρυπας με ταχύτητα
αναδύεται άμεσα από το δεξί με ταχύτητα
όπως φαίνεται στο σχήμα
2.28.
Οι στόχοι μας είναι:
Ορίζουμε το δεξί κύκλο από την παραμετρική σχέση
![]() | (2.32) |
και τον αριστερό κύκλο από την παραμετρική σχέση
![]() | (2.33) |
Σε κάθε χρονική στιγμή, προωθούμε το σωματίδιο σύμφωνα με τις σχέσεις
για
Το πέρασμα μέσα στον κύκλο το επισημαίνει η σχέση
![]() | (2.35) |
Στην περίπτωση αυτή, υπολογίζουμε τη γωνία από τη σχέση
![]() | (2.36) |
και το σημείο απεικονίζεται στο σημείο
όπου
![]() | (2.37) |
όπως φαίνεται στο σχήμα 2.29. Για την απεικόνιση της ταχύτητας
υπολογίζουμε πρώτα τα διανύσματα
![]() | (2.38) |
έτσι ώστε η ταχύτητα
![]() | (2.39) |
όπου οι ακτινικές συνιστώσες και
. ΄Ετσι, οι τελικές σχέσεις
που μας δίνουν την ταχύτητα “ανάδυσης”
είναι οι:
![]() | (2.40) |
Ανάλογα εργαζόμαστε και για το πέρασμα μέσα στον κύκλο το οποίο τώρα
επισημαίνει η σχέση
![]() | (2.41) |
Στην περίπτωση αυτή υπολογίζουμε τη γωνία από τη σχέση
![]() | (2.42) |
και το σημείο απεικονίζεται στο σημείο
όπου
![]() | (2.43) |
Για την απεικόνιση της ταχύτητας υπολογίζουμε τα διανύσματα
![]() | (2.44) |
έτσι ώστε η ταχύτητα
![]() | (2.45) |
Τώρα οι τελικές σχέσεις που μας δίνουν την ταχύτητα “ανάδυσης” είναι
οι:
![]() | (2.46) |
Τα συστηματικά σφάλματα προέρχονται μόνο από τα περάσματα μέσα στη
σκουλικότρυπα. Δεν υπάρχουν συστηματικά σφάλματα στο πέρασμα των ορίων
,
(γιατί;). Σκεφτείτε τρόπους να τα αντιμετωπίσετε στο
πρόγραμμά σας, καθώς και να τα μελετήσετε.
Οι κλειστές τροχιές που ζητούνται προκύπτουν, λ.χ., από τις αρχικές συνθήκες
![]() | (2.47) |
που ενώνει τα σημεία 1 του σχήματος 2.28. Είναι ασταθής, και αυτό μπορείτε να το
δείτε παίρνοντας .
Οι κλειστές τροχιές που περνούν τη σκουλικότρυπα, αλλά “περιτυλίγονται” προκύπτουν λ.χ. από τις αρχικές συνθήκες
που περνούν από
To πρόγραμμα μεταγλωττίζεται και τρέχει κατά τα γνωστά. Στο συνοδευτικό
λογισμικό θα βρείτε τα αρχεία Wormhole.csh και
Wormhole_animate.gnu που μπορούν να σας βοηθήσουν στην απεικόνιση της
τροχιάς. Ξεκινήστε το gnuplot, θέστε τις επιθυμητές παραμέτρους στο
Wormhole.csh και δώστε τις εντολές
Μπορείτε τώρα να απαντήσετε και τις υπόλοιπες ερωτήσεις που θέσαμε παραπάνω στους στόχους μας...
Η πιο γνωστή εφαρμογή της διακριτής λογιστικής εξίσωσης προέρχεται από τη μελέτη βιολογικών πληθυσμών οι οποίοι αναπαράγονται ανά τακτά χρονικά διαστήματα. Τα απλά πρότυπα προϋποθέτουν οι γενεές να μην επικαλύπτονται.
Το πιο απλό (και αφελές) πρότυπο είναι αυτό που κάνει την εύλογη υπόθεση ότι
ο ρυθμός αύξησης ενός πληθυσμού
είναι ανάλογος του ήδη
υπάρχοντος πληθυσμού:
![]() | (3.1) |
Η γενική λύση της παραπάνω εξίσωσης είναι και υποδηλώνει
εκθετική αύξηση του πληθυσμού για
και μείωση για
. Προφανώς αυτό
το μοντέλο μπορεί να ισχύει όσο ο πληθυσμός είναι πολύ μικρός και μπορεί να
αγνοηθεί η αλληλεπίδραση με το περιβάλλον (επάρκεια τροφής, ασθένειες, θηρευτές
κλπ), αλλά είναι φανερό ότι δεν μπορεί να ισχύει για αρκετά μεγάλους χρόνους. Ο
πιο απλός τρόπος για να λάβουμε υπόψη τους παράγοντες αλληλεπίδρασης του
πληθυσμού με το περιβάλλον είναι να εισάγουμε έναν μη γραμμικό όρο στην εξίσωση,
έτσι ώστε
![]() | (3.2) |
Η παράμετρος δίνει το μέγιστο ρυθμό ανάπτυξης του πληθυσμού, ενώ το
ελέγχει τη δυνατότητα του είδους να συντηρήσει ένα συγκεκριμένο επίπεδο
πληθυσμού. Η εξίσωση (3.1) μπορεί να διακριτοποιηθεί στο χρόνο υποθέτοντας ότι
κάθε γενεά αναπαράγεται, κάθε
και η n-οστή γενιά έχει πληθυσμό
όπου
. Τότε
και η εξίσωση (3.1)
γίνεται
![]() | (3.3) |
όπου . Οι λύσεις της παραπάνω εξίσωσης θα πρέπει να προσεγγίζουν
τις
και έχουμε εκθετική αύξηση πληθυσμού, όταν
και μείωση, όταν
. Η εξίσωση (3.2) μπορεί τότε να διακριτοποιηθεί ως
εξής:
![]() | (3.4) |
Με τον ορισμό παίρνουμε τη λογιστική απεικόνιση
![]() | (3.5) |
Ορίζουμε τις συναρτήσεις
![]() | (3.6) |
(η μόνη διαφορά τους είναι ότι στην πρώτη το θεωρείται δεδομένη παράμετρος),
έτσι ώστε
![]() | (3.7) |
όπου χρησιμοποιήσαμε το συμβολισμό ,
,
,
για τη σύνθεση συναρτήσεων. Η παράγωγος της
συνάρτησης
θα μας χρησιμεύσει αρκετά στα παρακάτω:
![]() | (3.8) |
Επειδή ερμηνεύουμε την ποσότητα ως ποσοστό επί
του μέγιστου δυνατού πληθυσμού, θα πρέπει
για
κάθε1
. Η συνάρτηση
παρουσιάζει μέγιστο για
το οποίο είναι ίσο με
. ΄Αρα, αν
, τότε
το οποίο με κατάλληλη επιλογή
του
θα οδηγήσει σε
για κάποιο
. Οπότε το ενδιαφέρον
εύρος των δυνατών τιμών της παραμέτρου
είναι
![]() | (3.9) |
Η λογιστική απεικόνιση (3.5) μπορεί να θεωρηθεί σαν εξίσωση
πεπερασμένων διαφορών, αλλά η τελική της έκφραση είναι μια επαγωγική
σχέση ενός βήματος. ΄Ετσι, δεδομένης μιας αρχικής τιμής , μέσω αυτής
παράγεται μια ακολουθία τιμών
στην οποία θα
αναφερόμαστε2
ως την τροχιά του
. Στις επόμενες παραγράφους του κεφαλαίου αυτού, θα
επικεντρωθούμε στη μελέτη των ιδιοτήτων των τροχιών αυτών ως συνάρτηση της
παραμέτρου
.
Οι λύσεις της λογιστικής απεικόνισης δεν είναι γνωστές παρά μόνο για
και
. Για
έχουμε
![]() | (3.10) |
ενώ3
για
![]() | (3.11) |
Για ,
, ενώ για
έχουμε περιoδικές τροχιές για
που δίνουν ρητό
και μη περιοδικές, όταν δίνουν άρρητο
. Για τις υπόλοιπες
τιμές του
θα εργαστούμε αριθμητικά για να μελετήσουμε τις ιδιότητες των
τροχιών της λογιστικής εξίσωσης.
Είναι φανερό ότι αν το σημείο είναι μία λύση της εξίσωσης
, τότε
για κάθε
. Για τη συγκεκριμένη συνάρτηση
έχουμε δύο λύσεις
![]() | (3.12) |
Θα δούμε ότι τα σημεία αυτά είναι ελκυστές των τροχιών για κατάλληλες
τιμές του . Αυτό σημαίνει ότι για ένα εύρος τιμών της αρχικής τιμής
, η ακολουθία
πλησιάζει ασυμπτωτικά κάποιο από αυτά τα
σημεία καθώς
. Προφανώς τα (μέτρου μηδέν) σύνολα αρχικών τιμών
και
δίνουν τροχιές που ελκύονται από τα
και
αντίστοιχα. Για να δούμε ποιες από τις δύο τιμές “προτιμούν” οι
αρχικές συνθήκες στο διάστημα
, αρκεί να μελετήσουμε την ευστάθεια
των δύο σταθερών σημείων
και
. Ας υποθέσουμε ότι για κάποιο
η τιμή
είναι απειροστά κοντά στο σταθερό σημείο
, έτσι ώστε
![]() | (3.14) |
όπου χρησιμοποιήσαμε το ανάπτυγμα κατά Taylor της γύρω από το
, καθώς και τη σχέση
, έχουμε ότι
. Οπότε ισχύει
ότι
![]() | (3.15) |
΄Αρα, αν , τότε
και το σταθερό σημείο
είναι
ευσταθές: η ακολουθία
πλησιάζει ασυμπτωτικά κοντά στο
. Αν
, τότε η ακολουθία
απομακρύνεται από το
και το
σταθερό σημείο είναι ασταθές. Η περίπτωση
είναι οριακή και
καταδεικνύει αλλαγή συμπεριφοράς. Πρέπει να μελετηθεί κατά περίπτωση
και συνδέεται με την εμφάνιση σημείων διακλάδωσης που θα συζητήσουμε
παρακάτω.
Για την ειδική περίπτωση της με
έχουμε ότι
και
. ΄Αρα, όταν
, το σημείο
είναι ελκυστής, ενώ το
και δεν εμφανίζεται. ΄Οταν
, το
δίνει
, οπότε το
είναι ασταθές.
Οποιαδήποτε αρχική συνθήκη
κοντά στο
απομακρύνεται από αυτό.
Επειδή για
έχουμε
, το
είναι
ελκυστής. Οποιαδήποτε αρχική συνθήκη
πλησιάζει ασυμπτωτικά
κοντά στην τιμή
. ΄Οταν
, έχουμε την οριακή
κατάσταση
και λέμε ότι στην κρίσιμη τιμή
το κρίσιμο
σημείο
διακλαδώνεται (bifurcates) στα δύο σταθερά σημεία
και
.
Οι διακλαδώσεις αυτές συνεχίζονται, καθώς το αυξάνει. Πράγματι, όταν
, έχουμε
και για
το
γίνεται
ασταθές σταθερό σημείο. Θεωρήστε τη λύση της εξίσωσης
. Αν
είναι μία λύση της και για κάποιο
έχουμε
, τότε
, καθώς και
(άρα και το
είναι λύση της ίδιας
εξίσωσης). Αν
είναι δύο τέτοιες διαφορετικές λύσεις με
,
, τότε το σύστημα εκτελεί μια περιοδική τροχιά με
περίοδο 2. Τα
,
είναι τέτοια, ώστε να είναι πραγματικές λύσεις της
εξίσωσης
![]() | (3.16) |
ενώ ταυτόχρονα θα πρέπει να μην είναι οι λύσεις
της
εξίσωσης
. Επειδή τα σημεία
είναι
λύσεις4
και της
, το παραπάνω πολυώνυμο μπορεί να γραφτεί στη μορφή (δείτε
[21] για περισσότερες λεπτομέρειες)
![]() | (3.17) |
οπότε αναπτύσσοντας τα πολυώνυμα (3.16) , (3.17) και συγκρίνοντας
τους συντελεστές τους συμπεραίνουμε ότι ,
και
. Οι ρίζες του διωνύμου στην (3.17) καθορίζονται από τη
διακρίνουσα
. Για τις τιμές του
που μας ενδιαφέρουν
(
) η διακρίνουσα γίνεται θετική, όταν
και τότε έχουμε δύο
διακριτές λύσεις
![]() | (3.18) |
΄Οταν έχουμε μια διπλή ρίζα, άρα ένα μοναδικό σταθερό σημείο όπως
είδαμε και παραπάνω.
Για τη μελέτη της ευστάθειας των λύσεων της ακολουθούμε την
ίδια πορεία που μας οδήγησε στην εξίσωση (3.15) και εξετάζουμε αν η
έχει απόλυτη τιμή μικρότερη, μεγαλύτερη ή ίση της μονάδας. Παρατηρώντας
ότι5
, βλέπουμε ότι για
,
και για
,
. Στις ενδιάμεσες τιμές
οι παράγωγοι
για
. ΄Αρα τα σημεία αυτά είναι ευσταθείς λύσεις της
και έχουμε διακλάδωση των σταθερών σημείων
στα
,
για
. Σχεδόν όλες οι τροχιές με αρχικές συνθήκες στο
διάστημα
ελκύονται ασυμπτωτικά από την περιοδική τροχιά με περίοδο 2, τον
“2-κύκλο”
.
Με τον ίδιο τρόπο μπορούμε να βρούμε πως στο σημείο
έχουμε διακλάδωση των σταθερών σημείων
,
σε
οκτώ σημεία
,
. Αυτά είναι πραγματικές λύσεις της
εξίσωσης του 4-κύκλου της λογιστικής εξίσωσης
. Για
τα τελευταία σημεία
,
αποτελούν
ελκυστή που είναι ένας 4-κύκλος μιας γενικής τροχιάς της λογιστικής
εξίσωσης6 .
Παρόμοια για
έχουμε διακλάδωση σε 16 σταθερά σημεία της
που οδηγούν σε 8-κύκλο και για
σε 16-κύκλο
κ.ο.κ7 .
Το φαινόμενο αυτό λέγεται διπλασιασμός περιόδου και συνεχίζει επ’ άπειρον. Τα σημεία
πλησιάζουν διαρκώς μεταξύ τους έτσι, ώστε
.
΄Οπως θα δούμε, η τιμή
σηματοδοτεί την έναρξη μη περιοδικής, χαοτικής
συμπεριφοράς των τροχιών της λογιστικής απεικόνισης.
Οι αλγεβρικοί υπολογισμοί των σημείων διακλάδωσης είναι πολύπλοκοι και έτσι
αναγκαζόμαστε να καταφύγουμε σε αριθμητικές μεθόδους υπολογισμού τους.
Αρχικά θα γράψουμε ένα πρόγραμμα που να μας δίνει τροχιές της λογιστικής
απεικόνισης για επιλεγμένες τιμές του και
. Το πρόγραμμα θα το βρείτε στο
αρχείο logistic.f90 και παρατίθεται παρακάτω.
Το πρόγραμμα μεταγλωττίζεται και τρέχει κατά τα γνωστά:
όπου με την εντολή echo εκτυπώνουμε στο stdout τις τιμές των παραμέτρων
NSTEPS=100, r=0.5 και x0=0.1, και τις διοχετεύουμε μέσω pipe στο stdin του
προγράμματος που τρέχει με την εντολή ./l. Τα αποτελέσματα θα τα βρούμε σε δύο
στήλες στο αρχείο log.dat και μπορούμε να τα δούμε με το gnuplot. Με τον
τρόπο αυτό φτιάχνουμε τα σχήματα 3.1. Σε αυτά μπορούμε να δούμε τις δύο
πρώτες διακλαδώσεις, καθώς αυξάνεται το και ξεπερνάει τις τιμές
και
. Με τον ίδιο τρόπο μπορούμε να μελετήσουμε τροχιές που βρίσκονται
ασυμπτωτικά κοντά σε
-κύκλους κάθε φορά που το
ξεπερνάει την τιμή
.
΄Ενας άλλος τρόπος να μελετήσουμε και να καταλάβουμε γραφικά τους
-κύκλους είναι το διάγραμμα που κατασκευάζεται με τον ακόλουθο τρόπο
(cobweb plot): Στο επίπεδο επιλέγουμε αρχικά το σημείο
. Στη συνέχεια,
υπολογίζουμε το σημείο
, όπου
και το οποίο είναι πάνω στην
καμπύλη της γραφικής παράστασης της
. Το
το “προβάλλουμε” πάνω
στη διαγώνιο
παίρνοντας το σημείο
. Επαναλαμβάνουμε αυτή τη
διαδικασία παίρνοντας τα σημεία
και
πάνω στην καμπύλη
και
αντίστοιχα. Tα σταθερά σημεία
είναι
η τομή των καμπύλων αυτών και αν η τροχιά ελκύεται από αυτά, τότε η
ακολουθία των παραπάνω σημείων θα συγκλίνει σε αυτά. Αν είμαστε σε
-κύκλο, τότε θα παρατηρήσουμε την περιοδική τροχιά που περνά από τα σημεία
που είναι λύσεις της
. Για να υλοποιήσουμε την παραπάνω
άσκηση, γράφουμε το ακόλουθο πρόγραμμα το οποίο θα βρείτε στο αρχείο
logistic1.f90:
Η μεταγλώττιση και το τρέξιμο γίνεται ακριβώς όπως και για το πρόγραμμα logistic.f90. Τα αποτελέσματα μπορούμε να τα δούμε με το gnuplot. Για παράδειγμα, η πάνω αριστερά γραφική παράσταση στο σχήμα 3.2 μπορεί να γίνει με τις εντολές:
Με την εντολή plot τρέχουμε το πρόγραμμα όπως από τη γραμμή εντολών
και στη συνέχεια κάνουμε τη γραφική παράσταση από το αρχείο trj.dat.
Στην επόμενη γραμμή προσθέτουμε τις γραφικές παραστάσεις της ,
και της διαγωνίου
. Στα σχήματα 3.2 και 3.3
βλέπουμε παραδείγματα από ελκυστές σταθερών σημείων, 2-κύκλων και
4-κύκλων. Επίσης, δίνεται και το παράδειγμα μιας μη περιοδικής τροχιάς
που παρουσιάζεται, όταν το σύστημα παρουσιάζει χαοτική συμπεριφορά για
.
Οι διακλαδώσεις της λογιστικής εξίσωσης μπορούν να απεικονιστούν γραφικά στο
“διάγραμμα διακλάδωσης”. Θυμίζουμε ότι οι πρώτες διακλαδώσεις συμβαίνουν για
κρίσιμες τιμές του
![]() | (3.19) |
όπου ,
,
και
.
Για
έχουμε
σταθερά σημεία
,
της
. Απεικονίζοντας αυτά τα σημεία
ως συνάρτηση του
φτιάχνουμε το διάγραμμα διακλάδωσης. Αυτά θα τα υπολογίσουμε αριθμητικά με το
πρόγραμμα bifurcate.f90. Στο πρόγραμμα αυτό επιλέγουμε τις τιμές του
που
θέλουμε να μελετήσουμε και για κάθε μία από αυτές καταγράφουμε τα σημεία των
-κύκλων8
,
. Αυτό μπορεί να γίνει εύκολα αν
εφαρμόσουμε επαγωγικά τη λογιστική εξίσωση αρκετές φορές, έτσι ώστε οι τροχιές
να φτάσουν να εκτελούν πρακτικά μόνο τους
-κύκλους. Στο πρόγραμμα, η
παράμετρος που καθορίζει τα σημεία της τροχιάς που “πετάμε” είναι η NTRANS. Μετά
καταγράφουμε NSTEPS σημεία της τροχιάς τα οποία υποθέτουμε ότι το NTRANS είναι
αρκετά μεγάλο, έτσι ώστε να καταγράψουμε μόνο τα σημεία των
-κύκλων. Το
πρόγραμμα δίνεται παρακάτω:
Το πρόγραμμα μεταγλωττίζεται και τρέχει πολύ απλά με τις εντολές
και μπορούμε να κατασκευάσουμε το αριστερό σχήμα 3.4 με το gnuplot
Παρατηρούμε τα ευσταθή σταθερά σημεία και τους -κύκλους για
. Μόλις
το
ξεπεράσει την τιμή
, οι τροχιές είναι μη-περιοδικές και το σύστημα
παρουσιάζει χαοτική συμπεριφορά. Θα συζητήσουμε την έννοια της χαοτικής
συμπεριφοράς με περισσότερη λεπτομέρεια σε επόμενη παράγραφο. Για την ώρα, απλά
επισημαίνουμε ότι από το διάγραμμα μπορούμε να μετρήσουμε την απόσταση μεταξύ
των κρίσιμων σημείων
η οποία διαρκώς μειώνεται σχεδόν
γεωμετρικά με το
, έτσι ώστε
![]() | (3.20) |
όπου είναι η σταθερά του Feigenbaum. Επίσης, παρατηρείται ότι τα πλάτη των
διακλαδώσεων
επίσης μειώνονται, έτσι ώστε
![]() | (3.21) |
Είναι ενδιαφέρον, επίσης να επισημάνουμε την εμφάνιση σταθερού 3-κύκλου για
! Χρησιμοποιώντας το θεώρημα Sharkovskii, οι Li and
Yorke9
δείξανε πως οποιοδήποτε μονοδιάστατο σύστημα έχει 3-κύκλους, τότε θα έχει και
κύκλους οποιουδήποτε μήκους και χαοτικές τροχιές. Ο 3-κύκλος και η ευστάθειά
του μπορεί να υπολογιστεί μελετώντας τις λύσεις της εξίσωσης
όπως
κάναμε με τις σχέσεις (3.16) και (3.17) (δείτε [21] για λεπτομέρειες).
Μεγεθύνουμε ένα κλάδο αυτού του 3-κύκλου στο σχήμα 3.5. Κύκλους όμοιους με
τον 3-κύκλο μπορούμε να δούμε να επαναλαμβάνονται σε διαφορετικές κλίμακες
όπως φαίνεται και στο δεξί σχήμα 3.4.
Στο σχήμα 3.4 παρατηρούμε ότι ανάμεσα στις χαοτικές τροχιές της λογιστικής εξίσωσης παρουσιάζονται “παράθυρα” περιοδικών τροχιών. Αυτά είναι άπειρα στον αριθμό, αλλά αριθμήσιμα. Ακόμα πιο ενδιαφέρον είναι το γεγονός ότι, αν πάρουμε ένα κλάδο μέσα σε αυτά τα παράθυρα και τον μεγεθύνουμε, αυτός είναι όμοιος με ολόκληρο το διάγραμμα! ΄Ενα τέτοιο παράδειγμα μπορούμε να δούμε στο δεξί σχήμα 3.4. Λέμε ότι το διάγραμμα διακλάδωσης παρουσιάζει ιδιότητες αυτομοιότητας (self-similarity). ϒπάρχουν και άλλες ενδιαφέρουσες ιδιότητες του διαγράμματος διακλάδωσης για τις οποίες παραπέμπουμε τον αναγνώστη στη βιβλιογραφία.
Κλείνοντας, να σημειώσουμε ότι οι ποιοτικές ιδιότητες του διαγράμματος
διακλάδωσης είναι όμοιες για μια ολόκληρη κλάση από συναρτήσεις. Ο Feigenbaum
ανακάλυψε ότι εκτός από τη λογιστική απεικόνιση, κάθε συνάρτηση που είναι
κοίλη με μοναδικό μέγιστο έχει τις ίδιες ιδιότητες, όπως για παράδειγμα οι
συναρτήσεις10
,
και
. Οι σταθερές
και
των σχέσεων (3.20) και (3.21) είναι οι ίδιες για όλες αυτές τις
συναρτήσεις. Οι απεικονίσεις που παράγουν χαοτική συμπεριφορά μελετώνται με
πολύ ενδιαφέρον και μπορείτε να βρείτε μια λίστα από αυτές στην αναφορά
[27].
Για τον εντοπισμό των σημείων διακλάδωσης θα χρειαστεί να λύσουμε τις, μη
γραμμικές πολυωνυμικές αλγεβρικές εξισώσεις και
.
Για το λόγο αυτό πρέπει να καταφύγουμε σε προσεγγιστικό, αριθμητικό
υπολογισμό, και η απλή μέθοδος Newton-Raphson θα αποδειχθεί μια καλή
επιλογή.
Η μέθοδος Newton-Raphson για την εύρεση των ριζών μιας εξίσωσης
είναι μια επαγωγική μέθοδος που χρησιμοποιεί ένα αρχικό σημείο
και υπολογίζει με τη βοήθεια της παραγώγου
διαδοχικά σημεία
τα οποία είναι ολοένα και καλύτερες προσεγγίσεις μιας από
τις ρίζες της εξίσωσης. Η επαγωγή σταματάει όταν αποφασίσουμε ότι πετύχαμε το
επιθυμητό επίπεδο σύγκλισης. ϒποθέτοντας ότι η συνάρτηση
είναι
αναλυτική, από το ανάπτυγμά της κατά Taylor γύρω από το σημείο
παίρνουμε
![]() | (3.22) |
Αν θέλουμε να έχουμε , τότε πρέπει να πάρουμε
![]() | (3.23) |
Η παραπάνω εξίσωση δίνει και τον αλγόριθμο της μεθόδου ο οποίος είναι μια επαγωγική σχέση ενός βήματος.
Διαφορετικά σημεία θα οδηγήσουν σε διαφορετικές ρίζες της εξίσωσης, όταν
η σύγκλιση είναι επιτυχής. Η σύγκλιση της μεθόδου είναι τετραγωνική με τον αριθμό
των επαναλήψεων, όταν οι παράγωγοι
,
είναι μη μηδενικές στη ρίζα και
η τρίτη παράγωγος είναι φραγμένη: ϒπάρχει μια περιοχή της ρίζας, έστω
, τέτοια
ώστε η απόσταση
να είναι
. Αν η ρίζα
είναι πολλαπλή, τότε η σύγκλιση είναι πιο αργή. Οι αποδείξεις είναι απλές και
μπορούν να βρεθούν στην [28].
Η μέθοδος αυτή είναι απλή στον προγραμματισμό και τις περισσότερες φορές
αρκετή για τη λύση αρκετών προβλημάτων. Αλλά στη γενική περίπτωση δουλεύει
καλά μόνο κοντά στην περιοχή των ριζών. Θα πρέπει επίσης να έχουμε στο νου μας
ότι η μέθοδος αυτή αποτυγχάνει σε απλές περιπτώσεις: ΄Οταν για κάποιο
, η μέθοδος σταματάει. Σε συναρτήσεις που τείνουν στο 0 όταν
είναι εύκολο να κάνουμε κακή επιλογή του
που να μη συγκλίνει προς
κάποια ρίζα. Για να αποφύγουμε την κακή επιλογή του
μπορούμε να
συνδυάσουμε τη μέθοδο Newton-Raphson με τη μέθοδο της διχοτόμησης
(bisection method). ΄Οταν η παράγωγος
αποκλίνει στη ρίζα, μπορεί να
έχουμε προβλήματα. Για παράδειγμα, η εξίσωση
με
δεν δίνει συγκλίνουσα ακολουθία. Σε ορισμένες περιπτώσεις, η μέθοδος
μπορεί να οδηγήσει και σε μη-συγκλίνοντες κύκλους [8]. Σε ποιο ομαλές
συναρτήσεις η περιοχή ελκυσμού (basin of attaraction) μιας ρίζας μπορεί να είναι
πάρα πολύ μικρή. Αυτές είναι οι περιοχές στον πραγματικό άξονα που αν
επιλεγούν ως
θα οδηγήσουν στη συγκεκριμένη ρίζα. Δείτε την άσκηση
13.
Για να προγραμματίσουμε τη μέθοδο Newton-Raphson ας πάρουμε το παράδειγμα της εξίσωσης
![]() | (3.24) |
η οποία προκύπτει από την επίλυση της εξίσωσης Schrödinger για την εύρεση του
ενεργειακού φάσματος ενός σωματιδίου μάζας σε ένα μονοδιάστατο πηγάδι
δυναμικού βάθους
και πλάτους
. Οι σταθερές
και
. Επιλύοντας ως προς
δεδομένου του
μπορούμε να
υπολογίσουμε τις δυνατές τιμές της ενέργειας
. Η συνάρτηση
της οποίας
αναζητούμε τις ρίζες και η παράγωγός της
είναι
Στο παραπάνω πρόγραμμα ζητάμε από το χρήστη μόνο το αρχικό σημείο x0,
ενώ θέτουμε την παράμετρο
rho
. Για να λύσουμε το πρόβλημα,
βοηθάει να κάνουμε τη γραφική παράσταση της (3.24) . Με το gnuplot
παριστάνουμε γραφικά τα δύο μέλη της (3.24) και από τα σημεία τομής τους
μπορούμε να εκτιμήσουμε πού βρίσκονται οι ρίζες που αναζητάμε έτσι ώστε να
επιλέξουμε κατάλληλα αρχικά σημεία
:
Μπορούμε τώρα να μεταγλωττίσουμε και να τρέξουμε το πρόγραμμα:
Συμπεραίνουμε πως μια ρίζα της εξίσωσης είναι η . Με ανάλογο
τρόπο υπολογίζουμε και τις υπόλοιπες ρίζες, κάτι το οποίο το αφήνουμε σαν άσκηση
στον αναγνώστη.
Η παραπάνω μέθοδος μπορεί να γενικευτεί και για ένα σύστημα από δύο
αλγεβρικές εξισώσεις. ΄Εστω ότι έχουμε να λύσουμε τις εξισώσεις
και
. Για να βρούμε το ανάλογο επαγωγικό σχήμα που θα οδηγήσει
σε μια συγκλίνουσα προς μια ρίζα ακολουθία
,
,
,
,
,
, αναπτύσσουμε κατά Taylor τις δύο
συναρτήσεις γύρω από το σημείο
Για παράδειγμα θα λύσουμε τις εξισώσεις με ,
. ΄Εχουμε
,
,
,
. Γράφουμε το πρόγραμμα στο αρχείο nr2.f90:
Για να πάρουμε μια ιδέα πού περίπου είναι οι πραγματικές ρίζες του συστήματος, κάνουμε ένα τρισδιάστατο γράφημα με το gnuplot:
Εκτός από τις κάνουμε και τη γραφική παράσταση του
επιπέδου
και από την τομή των τριών επιφανειών εντοπίζουμε τις ρίζες. Η μεταγλώττιση και
το τρέξιμο του προγράμματος δίνει:
Βρήκαμε έτσι τρεις ρίζες
,
,
.
Η μέθοδος Newton-Raphson για πολλές μεταβλητές γίνεται ακριβή: έχουμε εκτός από τον υπολογισμό της συνάρτησης και τον υπολογισμό των παραγώγων που μπορεί να γίνει απαγορευτικά ακριβός σε ορισμένα προβλήματα. Επίσης, γίνεται προβληματικός ο εντοπισμός των λύσεων αφού η μέθοδος συγκλίνει γρήγορα μόνο κοντά στην περιοχή των ριζών. Παραπέμπουμε τον αναγνώστη στην [8] για περισσότερες πληροφορίες για το πώς αντιμετωπίζονται αυτά τα προβλήματα.
Για τον εντοπισμό των σημείων διακλάδωσης για θα λύσουμε τις αλγεβρικές
εξισώσεις
και
. Στα σημεία αυτά, θα έχουμε τους
-κύκλους να γίνονται ασταθείς και να γίνονται σταθεροί οι
-κύκλοι. Αυτό
γίνεται όταν
με
. Θα αναζητήσουμε ως λύσεις τα σημεία
για
Ορίζουμε τις συναρτήσεις και
όπως κάναμε στην (3.6) . Για να εντοπίσουμε τα σημεία διακλάδωσης θα λύσουμε
τις αλγεβρικές εξισώσεις:
Η μεταγλώττιση του προγράμματος και η εκτέλεσή του γίνεται με τις εντολές:
Παραπάνω δείχνουμε τα σημεία του 2-κύκλου και μερικά από τα σημεία του
4-κύκλου. Επίσης μπορούμε να συγκρίνουμε την τιμή του που
υπολογίζουμε με την αναμενόμενη
. Αφήνουμε ως
άσκηση στον αναγνώστη να βελτιώσει την ακρίβεια μειώνοντας τα συστηματικά
σφάλματα του υπολογισμού, καθώς και να πετύχει μεγαλύτερη ακρίβεια στην τιμή
του
.
΄Οπως είδαμε, όταν οι τροχιές της λογιστικής εξίσωσης
παρουσιάζουν χαοτική συμπεριφορά. Αυτό κυρίως σημαίνει ότι οι τροχιές είναι
ευαίσθητες στην επιλογή των αρχικών συνθηκών, έτσι ώστε τροχιές που
ξεκινάνε από απειροστά κοντά αρχικά σημεία, σε μικρό αριθμό βημάτων
διαφέρουν σημαντικά. Αυτό συνεπάγεται, επίσης, πως υπάρχει σύνολο από
αρχικές συνθήκες που καλύπτουν πυκνά κάποια υποδιαστήματα του
των οποίων οι τροχιές δεν πλησιάζουν οριακά κανένα κύκλο οποιουδήποτε
μήκους.
Πιο συγκεκριμένα, έστω δύο τροχιές οι οποίες έχουν ως αρχικά σημεία τα ,
αντίστοιχα και
. ΄Οταν για αρκετά μικρά
τα επόμενα σημεία
,
απέχουν απόσταση
που αυξάνει εκθετικά με το
(“χρόνο”), δηλαδή
![]() | (3.34) |
αυτό αποτελεί ένδειξη χαοτικού
συστήματος11 .
Ο εκθέτης λέγεται εκθέτης Liapunov. Για τον υπολογισμό του εκθέτη είναι
χρήσιμο να χρησιμοποιήσουμε την ακόλουθη σχέση:
![]() | (3.35) |
Η ισχύς αυτής της σχέσης αποδεικνύεται θεωρώντας απειροστό έτσι
ώστε
. ΄Ετσι, έχουμε
Αρχικά, μπορούμε να υπολογίσουμε τους εκθέτες Liapunov χρησιμοποιώντας τον
ορισμό (3.34) . Μεταβάλλουμε κατάλληλα το πρόγραμμα logistic.f90,
έτσι ώστε να υπολογίζει δύο τροχιές που αρχικά απέχουν απόσταση
epsilon:
Αφού το τρέξουμε βρίσκουμε στην τέταρτη στήλη του αρχείου lia.dat την τιμή
. Μπορούμε έτσι να φτιάξουμε καμπύλες όπως στο σχήμα 3.7 με τις
εντολές:
Στην τελευταία γραμμή κάνουμε γραφική παράσταση από το stdout της εντολής
μέσα στα εισαγωγικά. Η πρώτη εντολή τρέχει το πρόγραμμα ./l διαβάζοντας
από το stdin τις παραμέτρους NSTEPS , r
, x0
και epsilon
. Η δεύτερη τυπώνει στο stdout τα περιεχόμενα
του αρχείου lia.dat το οποίο διαβάζεται από το gnuplot που κάνει τη
γραφική παράσταση. Με την εντολή set logscale y στο gnuplot, κάνουμε
λογαριθμική την κλίμακα μόνο στον
-άξονα. ΄Ετσι μια εκθετική συνάρτηση
παριστάνεται γραφικά από μία ευθεία. Στο σχήμα 3.7 παρατηρούμε τέτοια ευθεία
διάταξη των σημείων
η οποία γίνεται ολοένα και καλύτερη όσο
το
μικραίνει. Η κλίση των ευθυγράμμων αυτών τμημάτων μας δίνει τον
εκθέτη
. Επίσης, παρατηρούμε παράλληλα ευθύγραμμα τμήματα με την
ίδια περίπου κλίση που αντιστοιχούν στο ίδιο
. Η διάταξη των σημείων
δεν είναι ακριβώς ευθεία οπότε ο υπολογισμός του
ενέχει σφάλματα,
όπως σημειώνουμε και στο σχήμα 3.7. Αλλάζοντας την αρχική συνθήκη
παίρνουμε ελαφρά διαφορετική τιμή για το
και έτσι μπορούμε να πάρουμε για
την τιμή του
τη μέση τιμή των μετρήσεων μας και να εκτιμήσουμε το
σφάλμα ως το σφάλμα της μέσης τιμής. Αυτό αφήνεται για άσκηση στον
αναγνώστη.
Ας πούμε περιληπτικά πώς μπορεί κανείς να υπολογίσει το με προσαρμογή της
εκθετικής συνάρτησης στα σημεία
. Επειδή
, οπότε μπορούμε να κάνουμε προσαρμογή σε ευθεία
γραμμή. Αυτό γίνεται εύκολα με τη χρήση του gnuplot:
Με την παραπάνω εντολή προσαρμόζουμε στη συνάρτηση a*x+b τα δεδομένα της
1ης και του λογαρίθμου της 4ης στήλης (using 1:(log($4))) του stdout της
εντολής που παράγει τα δεδομένα όπως και στη γραφική παράσταση που κάναμε
παραπάνω. Τα δεδομένα που επιλέγουμε είναι για ([5:53]) και οι
παράμετροι που προσαρμόζονται οι a,b (via a,b). Στη δεύτερη γραμμή
προσθέτουμε τη γραφική παράσταση του εκθετικού της ευθείας που υπολογίζεται.
Θα χρησιμοποιήσουμε τώρα τη σχέση (3.35) για τον υπολογισμό του . Η
σχέση αυτή είναι προσεγγιστικά σωστή, όταν (α) έχουμε ήδη μπει στη μόνιμη
κατάσταση, και (β) στο όριο μεγάλου
. Για το λόγο αυτό θα πρέπει να
μελετήσουμε αν η σχέση συγκλίνει ικανοποιητικά, καθώς (α) “πετάξουμε” ένα
αριθμό από NTRANS βήματα, (β) υπολογίσουμε το άθροισμα (3.35) με ολοένα
αυξανόμενο NSTEPS=
και (γ) υπολογίσουμε το άθροισμα (3.35) ξεκινώντας τη
λογιστική εξίσωση από διαφορετικό αρχικό σημείο
. Θα πρέπει να κάνουμε τη
μελέτη αυτή προσεκτικά για κάθε τιμή του
που θα θεωρήσουμε, καθώς σε κάθε
περίπτωση η συνεισφορά κάθε παράγοντα στη σύγκλιση του
θα είναι
διαφορετική: Σε περιοχές έντονης χαοτικής συμπεριφοράς (μεγάλο
) η
σύγκλιση γίνεται με πιο αργό ρυθμό. Το πρόγραμμα θα το βρείτε στο αρχείο
liapunov2.f90:
Το πρόγραμμα, αφού εκτελέσει NTRANS βήματα , υπολογίζει NSTEPS
φορές το άθροισμα των όρων
το οποίο και αποθηκεύει
στη μεταβλητή sum. Σε κάθε βήμα τυπώνεται στο αρχείο lia.dat το άθροισμα
sum διαιρεμένο με τον αριθμό των βημάτων i. Στο σχήμα 3.6 δείχνουμε τα
αποτελέσματα των μετρήσεών μας για
. Είναι σημείο όπου το σύστημα έχει
ισχυρή χαοτική συμπεριφορά και για να βεβαιωθούμε για τη σύγκλιση του
αθροίσματος πρέπει να υπολογίσουμε ένα μεγάλο αριθμό από όρους στο άθροισμα.
Χρησιμοποιώντας NTRANS
και NSTEPS
πετυχαίνουμε ακρίβεια
περίπου
% με
. Η κύρια συνεισφορά
στο σφάλμα προέρχεται από τις διαφορετικές “διαδρομές” σύγκλισης για
κάθε αρχικό σημείο που επιλέξαμε. Το σχήμα (3.6) μπορεί να γίνει με τις
εντολές:
Μέσα στην εντολή plot τρέχουμε το πρόγραμμα ./l με παραμέτρους NTRANS
, NSTEPS
, r
και x0
. Στη
συνέχεια, το gnuplot διαβάζει από το stdout της εντολής cat lia.dat τα
περιεχόμενα των δεδομένων που έχουν καταχωρηθεί από το πρόγραμμα
./l.
Για να εντοπίσουμε τις περιοχές χαοτικής συμπεριφοράς θα εξετάσουμε την
εξάρτηση του εκθέτη Liapunov από την παράμετρο . Επωφελούμενοι από την
εμπειρία μας από τον προσεκτικό προσδιορισμό του
, θα τρέξουμε το
προηγούμενο πρόγραμμα για διαφορετικές τιμές του
έχοντας επιλέξει
σταθερές παραμέτρους NTRANS
, NSTEPS
και από δεδομένο
αρχικό σημείο x0
. Ο υπολογισμός θα μας δώσει αποτελέσματα με
ακρίβεια της τάξης του
%. Για προσεκτικά υπολογισμένες τιμές του
με
προσδιορισμό του σφάλματος στη μέτρηση, θα πρέπει να ακολουθήσουμε τη
μέθοδο που περιγράψαμε στα σχήματα 3.7 και 3.8. Το πρόγραμμα θα το βρείτε
στο αρχείο liapunov3.f90 και είναι απλή παραλλαγή του προηγούμενου
προγράμματος, έτσι ώστε να εκτελείται για πολλές τιμές της παραμέτρου
.
Το πρόγραμμα μεταγλωττίζεται και εκτελείται με τις εντολές
όπου η χρήση του & γίνεται, έτσι ώστε το πρόγραμμα ./l να εκτελεστεί στο υπόβαθρο (background).
Τα δεδομένα αποθηκεύονται στο αρχείο lia.dat και μπορούμε να φτιάξουμε και να μελετήσουμε το σχήμα 3.7 με το gnuplot:
Το σχήμα 3.9 μπορούμε τώρα να το συγκρίνουμε με το διάγραμμα διακλάδωσης
του σχήματος 3.4. Οι περιοχές αντιστοιχούν στις περιοχές με σταθερούς
-κύκλους, δηλαδή σταθερές περιοδικές τροχιές. Οι περιοχές
αντιστοιχούν
στις χαοτικές περιοχές, τις περιοχές όπου εμφανίζεται ισχυρό χάος (strong chaos).
Οι περιοχές αυτές χωρίζονται από κρίσιμα σημεία με
. Στα σημεία αυτά
έχουμε ασθενές χάος (weak chaos) όπου οι γειτονικές τροχιές αποκλίνουν μεταξύ
τους όχι εκθετικά, αλλά σαν μια δύναμη του
. ΄Εχουμε δηλαδή
,
όπου
είναι ένας θετικός εκθέτης που πρέπει να υπολογιστεί. Στη
βιβλιογραφία χρησιμοποιείται συνήθως ο εκθέτης
και η εκθετική συμπεριφορά
(ισχυρό χάος) παίρνεται στο όριο
. Παρατηρούμε τα “διαλείμματα χάους” που
είχαμε συζητήσει, όταν μελετούσαμε το διάγραμμα διακλάδωσης. Οι κρίσιμες τιμές
του
στις οποίες συμβαίνουν αυτές οι μεταβάσεις μπορούν να υπολογιστούν
με ακρίβεια εντοπίζοντας τον υπολογισμό στο κατάλληλο διάστημα τιμών
του
σε αρκετά μικρή γειτονιά του κρίσιμου σημείου. Με το παραπάνω
πρόγραμμα, αυτό γίνεται εύκολα αλλάζοντας τις τιμές των παραμέτρων rmin και
rmax.
΄Ενας άλλος τρόπος να μελετήσουμε τις χαοτικές ιδιότητες των τροχιών της
λογιστικής εξίσωσης είναι να υπολογίσουμε την κατανομή των τιμών του στο
διάστημα
. Στις περιοδικές τροχιές, αφού περάσουμε τη μεταβατική
περίοδο, η κατανομή θα συγκεντρώνεται στα σημεία των
-κύκλων, ενώ στις
χαοτικές, μη περιοδικές, τροχιές θα κατανέμεται πάνω σε υποδιαστήματα
του
. Η πυκνότητα πιθανότητας
να βρούμε μια τιμή
για
δεδομένο
είναι ανεξάρτητη του αρχικού σημείου της τροχιάς. Αντίστροφα,
αν μας δοθεί ένας μεγάλος αριθμός από σημεία που παράγει η λογιστική
εξίσωση, θα ήταν πρακτικά αδύνατο να καταλάβουμε πως προέρχονται από ένα
ντετερμινιστικό κανόνα. Για το λόγο αυτό, χαοτικά συστήματα μπορούν να
χρησιμοποιηθούν για την παραγωγή ψευδοτυχαίων αριθμών, όπως θα δούμε στο
κεφάλαιο 11. Για να μετρήσουμε την “τυχαιότητα” της κατανομής, μπορούμε να
χρησιμοποιήσουμε την εντροπία η οποία είναι ένα μέτρο της αταξίας ενός
συστήματος. ΄Οπως θα εξηγήσουμε λεπτομερέστερα στο κεφάλαιο 12, αυτή δίνεται
από τη σχέση
![]() | (3.37) |
όπου είναι η πιθανότητα εμφάνισης της κατάστασης
. Στην περίπτωσή μας, θα
υπολογίσουμε την κατανομή
χωρίζοντας το διάστημα
σε
υποδιαστήματα πλάτους
. Για δεδομένο
, θα πάρουμε ένα μεγάλο αριθμό
από μετρήσεις των τιμών
της λογιστικής εξίσωσης και θα υπολογίσουμε το
ιστόγραμμα
της κατανομής τους στα διαστήματα
που
επιλέξαμε. Η πυκνότητα κατανομής αντιστοιχεί στο όριο της ποσότητας
για μεγάλα
και μικρό
(μεγάλο
). Πράγματι, τότε
το οποίο συγκλίνει στο
. Θα ορίσουμε τότε
.
Το πρόγραμμα που θα γράψουμε θα υπολογίζει για τις επιλεγμένες τιμές του
την κατανομή
και από αυτή την εντροπία
σύμφωνα με την (3.37) . Αυτό θα
προκύψει μεταβάλλοντας το πρόγραμμα του αρχείου liapunov3.f90 προσθέτοντας
την παράμετρο NHIST που είναι ο αριθμός των διαστημάτων
για τα ιστογράμματα
και αποθηκεύοντας τις πυκνότητες πιθανότητας στο array p(NHIST). Το πρόγραμμα
θα το βρείτε στο αρχείο entropy.f90:
Για τον υπολογισμό των κατανομών και της εντροπίας θα πρέπει να επιλέξουμε
τις παραμέτρους με τις οποίες θα ελέγξουμε τα συστηματικά σφάλματα στους
υπολογισμούς μας. Η παράμετρος NTRANS θα πρέπει να είναι αρκετά μεγάλη, έτσι
ώστε η μεταβατική περίοδος να μη “μολύνει” τα αποτελέσματα. Οι μετρήσεις
μας θα πρέπει να ελεγχθούν ως προς τη σταθερότητά τους μεταβάλλοντας
την τιμή της. Το ίδιο και η τιμή της xstart που δίνει το αρχικό σημείο
για τη λογιστική εξίσωση για κάθε . Η NHIST ελέγχει τη διαμέριση του
διαστήματος
και το μέγεθος του
και θα πρέπει να είναι αρκετά
μεγάλη. Η NSTEPS είναι ο αριθμός των “μετρήσεων” για κάθε τιμή του
και
θα πρέπει να είναι αρκετός για να μειώνεται ο “θόρυβος” στην τιμή του
. Εννοείται ότι όσο μικρότερο είναι το
τόσο μεγαλύτερο πρέπει να
είναι το NSTEPS. Με κατάλληλες επιλογές παίρνουμε τις κατανομές
όπως φαίνεται στα σχήματα 3.10 και 3.11 για
,
και
.
Παρατηρούμε ότι ισχυρότερο χάος συνδέεται με πλατύτερη κατανομή των τιμών του
.
Ο υπολογισμός της εντροπίας φαίνεται στο σχήμα 3.12. Οι περιοδικές τροχιές
έχουν σχετικά χαμηλή εντροπία ενώ οι χαοτικές υψηλότερη. Η εντροπία αυξάνει
ξαφνικά με την έναρξη του χάους για και αυξάνει καθώς το χάος γίνεται
ισχυρότερο. Στα “διαλείμματα” χάους η εντροπία πέφτει απότομα και δραστικά.
Μπορούμε να διακρίνουμε πως τα διαστήματα αυτά είναι τα ίδια με αυτά που είδαμε
στο διάγραμμα διακλάδωσης (σχήμα 3.4) και στον εκθέτη Liapunov (σχήμα 3.9). Η
εντροπία αυξάνεται μέχρι την τιμή
, αλλά αυτό δε γίνεται ομαλά.
Μεγεθύνοντας περιοχές του διαγράμματος βλέπουμε άπειρο αριθμό από
απότομες πτώσεις της εντροπίας σε διαστήματα του
που είναι διαρκώς
μικρότερα.
Πολλά από τα προγράμματα που ζητούνται στις ασκήσεις, θα τα βρείτε μέσα στον υποκατάλογο Problems του συνοδευτικού λογισμικού του κεφαλαίου.
Παραπάνω θέσαμε NSTEPS = 1000, r = 0.5, x0 = 0.5. Θέτοντας τα
όρια [10:] στην εντολή fit, προσαρμόζουμε μόνο στα σημεία ,
αποφεύγοντας έτσι τη μεταβατική περίοδο και την απόκλιση από την
εκθετική συμπεριφορά για μικρά
.
Οι λύσεις της εξίσωσης (3.3) είναι . Τι συμπεραίνετε από τις τιμές
που υπολογίσατε στον πίνακα που φτιάξατε;
Τι προκύπτει;
Η εντολή r=1 καθορίζει την τιμή του . Πάρτε διαδοχικά
,
,
,
,
. Από τις τομές των καμπύλων με τη διαγώνιο,
προσδιορίστε τα σταθερά σημεία και τα σημεία των
-κύκλων.
![]() | ![]() | ![]() | ![]() |
2 | 3.0000000000 | 10 | 3.56994317604 |
3 | 3.4494897429 | 11 | 3.569945137342 |
4 | 3.544090360 | 12 | 3.5699455573912 |
5 | 3.564407266 | 13 | 3.569945647353 |
6 | 3.5687594195 | 14 | 3.5699456666199 |
7 | 3.5696916098 | 15 | 3.5699456707464 |
8 | 3.56989125938 | 16 | 3.56994567163008 |
9 | 3.56993401837 | 17 | 3.5699456718193 |
![]() | |||
όπου στο αρχείο rcrit έχετε αποθηκεύσει τις τιμές του πίνακα 3.1. Μεταβάλετε τις τιμές των nmin, nmax και επαναλάβετε μέχρι να πάρετε σταθερές τιμές και ικανοποιητική προσαρμογή στα δεδομένα.
![]() | (3.38) |
![]() | (3.39) |
![]() | (3.40) |
![]() | (3.41) |
Να φτιάξετε το διάγραμμα διακλάδωσης για . Μέσα σε ποια όρια
κινούνται οι τιμές του
; Στο ίδιο διάγραμμα να παραστήστε γραφικά τις
συναρτήσεις
,
.
Μεγεθύνετε την περιοχή του διαγράμματος για και
. Σε ποιο σημείο τα δύο μη συνεκτικά διαστήματα μέσα στα
οποία παίρνουν τιμές τα
συγχωνεύονται σε ένα; Στη συνέχεια μεγεθύνετε
τα διαστήματα
,
και
,
και εντοπίστε τα σημεία συγχώνευσης
δύο μη συνεκτικών διαστημάτων μέσα στα οποία παίρνουν τιμές τα
.
![]() | (3.42) |
Να φτιάξετε το διάγραμμα διακλάδωσης για και
.
Να κάνετε το πρόγραμμα υπολογισμού του διαγράμματος να παίρνει ως αρχικό
σημείο της νέας τροχιάς το τελευταίο της προηγούμενης και να επιλέξετε
για
. Επαναλάβατε με
. Τι παρατηρείτε;
Παρατηρήστε ότι, καθώς αυξάνει το
, έχουμε διακλαδώσεις και
“αντι-διακλαδώσεις”.
![]() | (3.43) |
(Προσοχή στο πρόγραμμα, οι τιμές του ). Να φτιάξετε το
διάγραμμα διακλάδωσης για
και
.
![]() |
Θεωρούμε το πρόβλημα της λύσης των εξισώσεων κίνησης σωματιδίου υπό την επίδραση δυνάμεων που δίνονται από το νόμο του Νεύτωνα. Οι εξισώσεις αυτές μπορούν να γραφτούν υπό τη μορφή
![]() | (4.1) |
όπου
![]() | (4.2) |
Η κλάση των προβλημάτων που θα συζητήσουμε σε επίπεδο αριθμητικής ανάλυσης είναι προβλήματα αρχικών τιμών, δηλ. επίλυση διαφορικών εξισώσεων για τις οποίες δίνονται οι αρχικές συνθήκες
![]() | (4.3) |
οι οποίες προσδιορίζουν μία μοναδική λύση . Οι διαφορικές εξισώσεις (4.1)
είναι δεύτερης τάξης ως προς τις συναρτήσεις
. Για την αριθμητική λύση τους
είναι βολικό να ανάγουμε τις εξισώσεις αυτές σε ένα σύστημα από διπλάσιο αριθμό
εξισώσεων πρώτου βαθμού:
![]() | (4.4) |
Ειδικά θα ενδιαφερθούμε για την κίνηση σωματιδίου πάνω στην ευθεία (1 διάσταση), οπότε το σύστημα των εξισώσεων γίνεται
καθώς και στο επίπεδο (2 διαστάσεις), οπότε το σύστημα των εξισώσεων γίνεται
Για να πάρουμε μια πρώτη γεύση του προβλήματος θα μελετήσουμε το πρόβλημα του
εκκρεμούς μήκους μέσα σε ομογενές πεδίο βαρύτητας
(σχήμα 4.1).
Οι εξισώσεις κίνησης δίνονται από το σύστημα των διαφορικών εξισώσεων
που εύκολα ανάγεται στο σύστημα πρώτης τάξης Το παραπάνω σύστημα πρέπει να γραφτεί σε διακριτή μορφή, έτσι ώστε να επιτευχθεί η αριθμητική του επίλυση με τη βοήθεια υπολογιστή. Ο πιο απλός τρόπος είναι να θεωρήσουμε την ολοκλήρωση του συστήματος από τον αρχικό χρόνο Μια μέθοδος που βελτιώνει τους παραπάνω αλγόριθμους ως προς το
σφάλμα διακριτοποίησης είναι ο αλγόριθμος Euler–Verlet ο οποίος δίνει ολικό
σφάλμα3
. Αυτός δίνεται από τις εξισώσεις
Η μέθοδος Euler–Verlet (4.11) είναι μια μέθοδος δύο βημάτων, αφού για την
προώθηση της λύσης είναι αναγκαίο να γνωρίζουμε την τιμή της συνάρτησης σε δύο
προηγούμενα βήματα. ΄Αρα, πρέπει να καθορίσουμε προσεκτικά τις αρχικές συνθήκες
για τα δύο πρώτα βήματα. Για το λόγο αυτό χρησιμοποιούμε τον αλγόριθμο Euler
για να προωθήσουμε τις αρχικές συνθήκες ένα βήμα πίσω. Αν ,
είναι οι αρχικές συνθήκες, τότε ορίζουμε
![]() | (4.12) |
Επίσης, στο τελευταίο βήμα θα πρέπει να πάρουμε
![]() | (4.13) |
Παρόλο που η μέθοδος έχει μικρότερο συνολικό σφάλμα από τη μέθοδο Euler, το
πρόβλημά της είναι ότι είναι ασταθής, όταν το γίνει αρκετά μικρό. Στη δεύτερη
των εξισώσεων (4.11) η γωνιακή ταχύτητα προκύπτει από το λόγο δύο μικρών
αριθμών, εκ των οποίων ο αριθμητής είναι η διαφορά δύο μεγάλων, σχεδόν ίσων,
αριθμών. Για μικρό χρόνο
, η τιμή της διαφοράς αυτής εξαρτάται μόνο από τα
τελευταία δεκαδικά ψηφία της αναπαράστασης των αριθμών
και
, επειδή ο
υπολογιστής έχει πεπερασμένη ακρίβεια στην αναπαράσταση τους και η ακρίβεια στον
υπολογισμό του λόγου
μειώνεται μέχρι ο λόγος αυτός να γίνει
ακριβώς μηδέν λόγω μηδενισμού του αριθμητή! Στην πρώτη των εξισώσεων
(4.11) , ο όρος
είναι μικρότερος από τον αντίστοιχο όρο
της
μεθόδου Euler κατά μία τάξη ως προς
. Μειώνοντας το
, γρήγορα
έχουμε
και η ακρίβεια της μεθόδου εκμηδενίζεται
λόγω της πεπερασμένης ακρίβειας των πραγματικών αριθμών στη μνήμη του
υπολογιστή4 .
΄Οταν οι αριθμοί
και
διαφέρουν περισσότερο από περίπου
επτά τάξεις μεγέθους, η πρόσθεση του πρώτου όρου στο δεύτερο είναι το
ίδιο σαν να προσθέταμε μηδέν και η συνεισφορά του όρου της επιτάχυνσης
εξαφανίζεται.5
Ο προγραμματισμός των μεθόδων αυτών είναι ιδιαίτερα απλός. Γράφουμε ένα
πρόγραμμα που θα κάνει σύγκριση και των τριών μεθόδων, Euler, Euler-Cromer
και Euler-Verlet. Για το λόγο αυτό, το κυρίως πρόγραμμα είναι απλά ένα
interface με το χρήστη και για τους υπολογισμούς καλούνται διαφορετικές
υπορουτίνες euler, euler_cromer και euler_verlet. Ο χρήστης απλά
πρέπει να προγραμματίσει την κοινή σε όλους τους υπολογισμούς συνάρτηση
accel(x) που δίνει τη γωνιακή επιτάχυνση συναρτήσει της γωνίας (εδώ η
μεταβλητή REAL x). Στην παράγραφο αυτή παίρνουμε accel(x)= -10.0 *
sin(x).
Η δομή των δεδομένων είναι πολύ απλή: Σε τρία arrays REAL T(P), X(P) και
V(P) αποθηκεύονται αντίστοιχα οι χρόνοι , οι γωνιακές θέσεις
και οι
γωνιακές ταχύτητες
για
. Ο χρήστης προσδιορίζει το χρονικό
διάστημα της ολοκλήρωσης από
σε
, καθώς και τον αριθμό των
χρονικών σημείων Nt τα οποία πρέπει να είναι λιγότερα από το μέγεθος P των
arrays. Μετά δίνει τις αρχικές συνθήκες
και
. Στη συνέχεια, οι
υπορουτίνες των μεθόδων καλούνται και στην είσοδο τους παρέχουμε τις αρχικές
συνθήκες, το διάστημα ολοκλήρωσης και τον αριθμό χρονικών σημείων
Xin,Vin,Tfi,Nt. Στην έξοδο μας παρέχουν τα αποτελέσματα αποθηκευμένα στα
arrays T,X,V. Στη συνέχεια, τα αποτελέσματα τυπώνονται στα αρχεία euler.dat,
euler_cromer.dat και euler_verlet.dat.
Οι υπορουτίνες υπολογισμού ακολουθούν τη διαδικασία καθορισμού των
αρχικών συνθηκών, υπολογισμού του χρόνου και
εκτελούν τους βρόχους που θα προωθούν τη λύση με βήμα
. Σε κάθε βήμα
τα αποτελέσματα αποθηκεύονται στα arrays T,X,V. ΄Ετσι, το τμήμα του
κώδικα
εκτελεί τις απαραίτητες εντολές για τη μέθοδο Euler. Λίγη προσοχή πρέπει να δοθεί στη μέθοδο Euler-Verlet όπου πρέπει να καθοριστούν τα δύο πρώτα βήματα, καθώς και το τελευταίο για την ταχύτητα:
Για διευκόλυνση του αναγνώστη παραθέτουμε ολόκληρο το πρόγραμμα παρακάτω:
Η μεταγλώττιση και το τρέξιμο του προγράμματος γίνονται με τις εντολές:
Η τελευταία εντολή μας δείχνει τις 5 πρώτες γραμμές του αρχείου euler.dat όπου βλέπουμε τις 3 στήλες με το χρόνο, θέση και ταχύτητα που δίνει η μέθοδος. Για να δούμε γραφικά τα αποτελέσματα μπορούμε να χρησιμοποιήσουμε το gnuplot. Οι εντολές
κάνουν τις γραφικές παραστάσεις των θέσεων και ταχυτήτων αντίστοιχα συναρτήσει του χρόνου. Στην τελευταία, μπορούμε να προσθέσουμε και τα αποτελέσματα των άλλων μεθόδων δίνοντας στη συνέχεια τις εντολές:
Τα αποτελέσματα φαίνονται στα σχήματα 4.2–4.7. Παρατηρούμε ότι η μέθοδος Euler
είναι ασταθής εκτός αν πάρουμε το βήμα χρόνου πάρα πολύ μικρό. Η μέθοδος
Euler–Cromer έχει καλύτερη συμπεριφορά. Τα αποτελέσματα συγκλίνουν γρήγορα
και παραμένουν σταθερά και για μεγάλο αριθμό χρονικών σημείων Nt.
Η μέθοδος Euler–Verlet συγκλίνει γρήγορα, αλλά σύντομα παρατηρούμε τα
σφάλματα συσσώρευσης. Το φαινόμενο αυτό είναι εντονότερο για αρχικές συνθήκες
με μεγάλη αρχική γωνιακή απόκλιση, όπως φαίνεται στο σχήμα 4.7. Στα
σχήματα 4.2–4.4, όπου η αρχική γωνιακή απόκλιση είναι μικρή, συγκρίνουμε τη
λύση που παίρνουμε με τη λύση για το αρμονικό εκκρεμές (
):
Η σύγκριση των αποτελεσμάτων με τα θεωρητικά, ιδιαίτερα όταν οι διαφορές δεν διακρίνονται με γυμνό μάτι ή όταν η ποσοτική ανάλυση είναι επιθυμητή, μπορεί να γίνει αναπαριστώντας γραφικά τις διαφορές των αριθμητικά υπολογισμένων τιμών από τις θεωρητικές τιμές. Οι σχετικές γραφικές παραστάσεις γίνονται με τις εντολές:
Η εντολή using 1:($2-x($1)) σε απλά ελληνικά λέει “Κάνε τη γραφική παράσταση χρησιμοποιώντας στο άξονα των y την τιμή της 2ης στήλης του euler.dat μείον την τιμή της συνάρτησης x(t) για t ίσο με την αντίστοιχη τιμή της πρώτης στήλης”. Με τον τρόπο αυτό (και με μικρή μετατροπή για να υπολογίζουμε την απόλυτη τιμή της διαφοράς) φτιάχνουμε τα σχήματα 4.11-4.14.
Στην προηγούμενη παράγραφο είδαμε μία μέθοδο πεπερασμένων διαφορών ενός
βήματος πρώτης τάξης, τη μέθοδο Euler. Αυτό σημαίνει πως όταν προσεγγίζουμε
την ολοκλήρωση με διακριτά βήματα από χρόνο
σε χρόνο
με βήμα
, το ολικό σφάλμα διακριτοποίησης είναι τάξης
.
Γεννάται το ερώτημα αν είναι δυνατόν να βρεθεί αλγόριθμος ολοκλήρωσης ο οποίος
να κάνει τα σφάλματα να είναι ανώτερης τάξης. Μια κλάση τέτοιων μεθόδων είναι οι
μέθοδοι Runge–Kutta. Οι μέθοδοι αυτοί είναι επαγωγικοί ενός βήματος, δηλ. η
επόμενη θέση προκύπτει απλά από τη γνώση της προηγούμενης. Σε μεθόδους δύο ή
πολλαπλών βημάτων, όπως είναι η μέθοδος Euler–Verlet, η γνώση της επόμενης
θέσης απαιτεί να γνωρίζουμε τη θέση του σωματιδίου για δύο ή περισσότερα
προηγούμενα βήματα. Η μέθοδος Runge–Kutta τάξης
έχει ολικό σφάλμα
. Αυτό σημαίνει ότι σε κάθε βήμα εισάγεται σφάλμα διακριτοποίησης τάξης
, αφού τότε το σφάλμα μετά από
βήματα θα είναι
τάξης
![]() | (4.15) |
Ας θεωρήσουμε για απλότητα το πρόβλημα με μια άγνωστη συνάρτηση η
οποία εξελίσσεται στο χρόνο σύμφωνα με τη διαφορική εξίσωση:
![]() | (4.16) |
Ας δούμε πρώτα μία μέθοδο πρώτης τάξης. Η πιο αφελής προσέγγιση θα ήταν να προσεγγίσουμε την παράγωγο από την πεπερασμένη διαφορά
![]() | (4.17) |
Αναπτύσσοντας κατά Taylor βλέπουμε ότι το σφάλμα σε κάθε βήμα είναι ,
άρα το σφάλμα για την εξέλιξη από
είναι
. Πράγματι
![]() | (4.18) |
Η γεωμετρία του βήματος φαίνεται στο σχήμα 4.8. Επιλέγεται το σημείο 1 και από
εκεί με γραμμική επέκταση στην κατεύθυνση της παραγώγου
προσδιορίζουμε το σημείο
.
Βελτίωση της μεθόδου προκύπτει αν πάρουμε ένα ενδιάμεσο σημείο 2.
Αυτή η διαδικασία φαίνεται στο σχήμα 4.9 και έγκειται στο να πάρουμε
το ενδιάμεσο σημείο 2 στο μέσο του διαστήματος με γραμμική
προέκταση από το
χρησιμοποιώντας την κλίση που δίνεται από την
παράγωγο στο
. Στη συνέχεια, χρησιμοποιούμε ως
εκτιμητή της παραγώγου στο διάστημα αυτό την κλίση στο σημείο 2 δηλ.
και τη χρησιμοποιούμε για να
προεκτείνουμε γραμμικά από το
στο
. Συνοψίζοντας, έχουμε
Η βελτίωση γίνεται περισσότερο αισθητή με τη μέθοδο Runge–Kutta
4ης τάξης. Στην περίπτωση αυτή έχουμε 4 υπολογισμούς της συνάρτησης
, αλλά το συνολικό σφάλμα είναι τώρα
, οπότε για τους
ίδιους λόγους η μέθοδος θα υπερτερήσει τελικά σε ακρίβεια της (4.19)
8. Η
διαδικασία που θα ακολουθήσουμε εξηγείται γεωμετρικά στο σχήμα 4.10.
Χρησιμοποιούμε τώρα 3 ενδιάμεσα σημεία για την προώθηση από το
στο
.
Αρχικά χρησιμοποιώντας την κλίση που δίνεται από την παράγωγο στο
, βρίσκουμε το ενδιάμεσο σημείο 2 στο μέσο του διαστήματος
δηλ.
. ϒπολογίζουμε την παράγωγο
της συνάρτησης στο σημείο 2 δηλ.
και τη
χρησιμοποιούμε για να προεκτείνουμε γραμμικά από το
στο ενδιάμεσο σημείο 3,
πάλι στο μέσο του διαστήματος
, δηλ.
. ϒπολογίζουμε
την παράγωγο της συνάρτησης
και τη
χρησιμοποιούμε για να προεκτείνουμε προς το σημείο 4, το οποίο τώρα το παίρνουμε
στο άκρο του διαστήματος δηλ. με
, οπότε παίρνουμε
.
Κάνουμε ένα τέταρτο υπολογισμό της παραγώγου
και
χρησιμοποιούμε και τις 4 παραγώγους
και
ως εκτιμητές της
παραγώγου της συνάρτησης. Εκείνο που έδειξαν οι Runge–Kutta είναι ότι το
σφάλμα διακριτοποίησης σε κάθε βήμα στην προώθηση της συνάρτησης γίνεται
, αν πάρουμε:
Τέλος θα κλείσουμε συζητώντας μία απορία που πιθανώς θα έχει δημιουργηθεί
στον αναγνώστη: Συζητήσαμε πώς είναι δυνατόν κανείς να μειώσει τα σφάλματα
διακριτοποίησης χρησιμοποιώντας αλγόριθμους των οποίων τα σφάλματα αυτά
μειώνονται κατά το δυνατόν γρηγορότερα με το βήμα στο χρόνο , συνήθως σαν
. ΄Αρα, μπορεί κανείς να υποθέσει ότι CPU χρόνου επιτρέποντος -το οποίο δεν
αποτελεί σοβαρό εμπόδιο στις απλές περιπτώσεις- μπορούμε να πλησιάσουμε
αυθαίρετα κοντά στην αναλυτική λύση σε επίπεδο ακρίβειας μηχανής. Αυτό
όμως δεν είναι σωστό. Μια άλλη κατηγορία σφαλμάτων είναι τα σφάλματα
στρογγυλοποίησης τα οποία προστίθενται σε κάθε βήμα εφαρμογής της μεθόδου.
Αυτά συσσωρεύονται ανάλογα με τον αριθμό των βημάτων, οπότε για πολύ
μικρό
, άρα και πολύ μεγάλο αριθμό βημάτων, αυτά θα γίνουν μεγαλύτερα
από την επιθυμητή ακρίβεια. Αυτή η κατηγορία σφαλμάτων εξαρτάται από
το hardware, τη γλώσσα προγραμματισμού ή/και το μεταγλωττιστή και
τέλος, από τον αλγόριθμο. Για το τελευταίο ας δώσουμε ένα παράδειγμα:
΄Εστω ότι θέλουμε να υπολογίσουμε την παράγωγο μιας συνάρτησης από τη
σχέση
Ας συζητήσουμε τώρα τον προγραμματισμό της μεθόδου Runge–Kutta 4ης τάξης
για την περίπτωση της κίνησης ενός σωματιδίου σε μία διάσταση. Για το λόγο αυτό
θα πρέπει να ολοκληρώσουμε το σύστημα διαφορικών εξισώσεων (4.5) που είναι
ένα σύστημα εξισώσεων για τις δύο συναρτήσεις του χρόνου και
για τις οποίες έχουμε
![]() | (4.21) |
Στην περίπτωση αυτή, η μέθοδος Runge–Kutta 4ης τάξης που δίνεται στην εξίσωση (4.20) γενικεύεται ως εξής:
Ο προγραμματισμός της μεθόδου είναι απλός. Στο κυρίως πρόγραμμα έχουμε
απλό interface με το χρήστη και του ζητάμε τα απαραίτητα δεδομένα: Το χρόνο
ολοκλήρωσης από Ti έως
Tf και τον αριθμό των χρονικών
σημείων Nt. Τις αρχικές συνθήκες
X10,
X20. Η δομή των
δεδομένων είναι απλή: Τρία arrays T(P), X1(P), X2(P) αποθηκεύουν τις
τιμές του χρόνου
και τις αντίστοιχες τιμές των
συναρτήσεων
και
,
. Το πρόγραμμα καλεί
την υπορουτίνα RK(T,X1,X2,Ti,Tf,X10,X20,Nt) η οποία είναι ο οδηγός
της μεθόδου, δηλ. οδηγεί την καρδιά του προγράμματος την υπορουτίνα
RKSTEP(t,x1,x2,dt) η οποία εφαρμόζει τους τύπους (4.22) και προωθεί τις τιμές
των συναρτήσεων x1, x2 τη χρονική στιγμή t κατά ένα βήμα
dt. Κάθε βήμα,
αφού οριστούν οι αρχικές συνθήκες καταγράφεται στην RK στα arrays T,
X1 και X2. ΄Οταν η RK επιστρέψει τον έλεγχο στο κυρίως πρόγραμμα, τα
αποτελέσματα είναι καταχωρημένα στα T, X1 και X2, τα οποία τυπώνονται στο αρχείο
rk.dat. Παρακάτω παραθέτουμε το πρόγραμμα για να διευκολύνουμε τον
αναγνώστη:
Στην παράγραφο αυτή θα κάνουμε έλεγχο ορθότητας των προγραμμάτων μας και θα
μετρήσουμε την ακρίβειά τους ως προς τα ολικά σφάλματα διακριτοποίησης. Το πιο
απλό τεστ στο οποίο μπορούμε να τα υποβάλλουμε είναι να συγκρίνουμε τα
αριθμητικά αποτελέσματα σε ένα σύστημα για το οποίο έχουμε γνωστή την
αναλυτική λύση. Θα διαλέξουμε να το κάνουμε για την περίπτωση του απλού
αρμονικού ταλαντωτή. Οι αλλαγές που θα κάνουμε στα προγράμματα είναι μικρές
και θα τις αναφέρουμε περιληπτικά. Κατ’ αρχήν, μετατρέπουμε όλες τις
μεταβλητές REAL σε διπλής ακρίβειας REAL(8). Απλά αλλάζουμε τις δηλώσεις
στα κατάλληλα σημεία του προγράμματος και προσθέτουμε ένα D0 σε όλες
τις σταθερές (λ.χ. 0.5 0.5D0 κλπ). Στη συνέχεια, μετατρέπουμε τις
συναρτήσεις της επιτάχυνσης σε αυτή του αρμονικού ταλαντωτή
και παίρνουμε
(
). ΄Ετσι, στο πρόγραμμα euler.f90
έχουμε
ενώ στο πρόγραμμα rk.f90 έχουμε
Στη συνέχεια, τρέχουμε τα προγράμματα για δεδομένο χρονικό διάστημα από
σε
με αρχικές συνθήκες
,
και μεταβάλλουμε το
χρονικό βήμα
αλλάζοντας τον αριθμό των βημάτων Nt-1. Στη συνέχεια,
συγκρίνουμε τη λύση που παίρνουμε με αυτή του απλού αρμονικού ταλαντωτή
Μία άλλη μέθοδος για να ελέγξουμε την ορθότητα των αποτελεσμάτων μας είναι να βρούμε μια διατηρούμενη ποσότητα όπως η ενέργεια, ορμή, στροφορμή κλπ και να εξετάζουμε αν αυτή αποκλίνει από την αρχική της τιμή. Στην περίπτωσή μας υπολογίζουμε τη μηχανική ενέργεια
![]() | (4.24) |
σε κάθε βήμα και από αυτή την απόκλιση . Τα αποτελέσματα
φαίνονται στα σχήματα 4.15–4.18.
Στην παράγραφο αυτή θα μελετήσουμε τον απλό αρμονικό ταλαντωτή του οποίου η κίνηση υπόκειται σε τριβή ανάλογη της ταχύτητάς του και σε εξωτερική δύναμη, την οποία για απλότητα θα πάρουμε να έχει ημιτονοειδή εξάρτηση από το χρόνο.
![]() | (4.25) |
με και
η κυκλική συχνότητα της οδηγούσας δύναμης.
Ας θεωρήσουμε αρχικά το σύστημα με . Οι πραγματικές λύσεις της διαφορικής
εξίσωσης10
που είναι πεπερασμένες για
δίνονται, διακρίνοντας τις περιπτώσεις,
![]() | (4.26) |
![]() | (4.27) |
Στην τελευταία περίπτωση η λύση ταλαντώνεται με πλάτος που φθίνει εκθετικά με το χρόνο.
Για την περίπτωση που , η γενική λύση προκύπτει από το άθροισμα μιας
ειδικής λύσης
και της λύσης της ομογενούς εξίσωσης
. Μια ειδική
λύση προκύπτει από τη δοκιμαστική λύση
την οποία
αντικαθιστούμε στην (4.25) και λύνουμε για τα
και
. Βρίσκουμε
ότι
![]() | (4.29) |
και
![]() | (4.30) |
Η λύση είναι εκθετικά φθίνουσα με το χρόνο και τελικά επικρατεί η
. Η
μόνη περίπτωση που αυτό δεν ισχύει είναι στην περίπτωση του συντονισμού χωρίς
απόσβεση
,
. Η λύση στην περίπτωση αυτή βρίσκεται εύκολα να είναι
η
![]() | (4.31) |
Οι δύο πρώτοι όροι είναι αυτοί του απλού αρμονικού ταλαντωτή, ενώ ο τελευταίος όρος αυξάνει το πλάτος της μετατόπισης γραμμικά με το χρόνο καταδεικνύοντας τη συνεχή ροή ενέργειας από την εξωτερική δύναμη στον ταλαντωτή.
Ο προγραμματισμός του συστήματος γίνεται με απλή μετατροπή του
κώδικα rk.f90. Οι βασικές ρουτίνες RK(T,X1,X2,T0,TF,X10,X20,Nt) και
RKSTEP(t,x1,x2,dt) μένουν ως έχουν και αλλάζει απλά το interface με το χρήστη.
Εισάγουμε τις βασικές παραμέτρους ,
,
,
διαδραστικά στην
καθιερωμένη είσοδο (standard input). Επειδή θέλουμε να τις χρησιμοποιήσουμε στη
συνάρτηση f2(t,x1,x2) που δίνει την επιτάχυνση χωρίς να αλλάξουμε τη δομή των
οδηγών της μεθόδου Runge-Kutta, πρέπει να τις ορίσουμε σε κοινή θέση στη μνήμη
για το κυρίως πρόγραμμα και την εν λόγω συνάρτηση. Αυτό στη Fortran γίνεται με
τη χρήση COMMON BLOCKS. Αυτά ορίζονται μετά τη δήλωση των μεταβλητών και
ορίζουν για αυτές μια συγκεκριμένη θέση στη μνήμη στις οποίες αποθηκεύονται οι
τιμές τους. Το κομμάτι κώδικα
σε οποιαδήποτε ρουτίνα δίνει πρόσβαση στη μνήμη στη “θέση” params στην οποία αποθηκεύονται οι τιμές των μεταβλητών. Το μόνο άλλο σημείο που χρειάζεται προσοχή στο πρόγραμμα είναι η συνάρτηση της επιτάχυνσης f2(t,x1,x2) η οποία τώρα έχει όρο που εξαρτάται από την ταχύτητα που εδώ συμβολίζουμε με τη μεταβλητή x2:
Για διευκόλυνση του αναγνώστη παραθέτουμε όλο το interface, παραλείποντας φυσικά τις υπορουτίνες RK, RKSTEP που έχουμε παραθέσει πρωτύτερα Το πρόγραμμα αποθηκεύεται στο αρχείο dlo.f90.
Τα αποτελέσματα φαίνονται στα σχήματα 4.19–4.22. Στο σχήμα 4.19
παρατηρούμε τη μετάβαση από την φάση που η κίνηση αποσβένεται χωρίς ταλάντωση
για στη φάση που το σύστημα ταλαντώνεται με εκθετικά φθίνων με το
χρόνο πλάτος για
. Η εκθετική μείωση του πλάτους φαίνεται στο σχήμα
4.21, ενώ η εξάρτηση της περιόδου
από το συντελεστή απόσβεσης
στο σχήμα
4.22. Το εν λόγω σχήμα προκύπτει από τη Σχέση (4.28) την οποία γράφουμε στη
μορφή
![]() | (4.32) |
Το δεξί μέλος της εξίσωσης τοποθετείται στον οριζόντιο άξονα, ενώ στον
κάθετο τοποθετούμε το αριστερό. Η παραπάνω σχέση προβλέπει ότι οι δύο
ποσότητες είναι ίσες και οι μετρήσεις πρέπει να βρίσκονται πάνω στη διαγώνιο
. Οι μετρήσεις για την “περίοδο”
παίρνονται μετρώντας το χρόνο
μεταξύ δύο διαδοχικών ακρότατων (
) στην τροχιά
(βλ. σχήμα
4.19).
Τέλος, σημαντικό είναι να μελετήσουμε το σχήμα 4.20 στο
οποίο βλέπουμε την τροχιά του συστήματος στο χώρο των
φάσεων11
Το σύστημα για καταλήγει στο σημείο
για οποιαδήποτε τιμή
της σταθεράς
. Το σημείο αυτό για το σύστημα είναι ένας “ελκυστής”
(attractor).
Στη συνέχεια, προσθέτουμε την εξωτερική δύναμη και μελετούμε την απόκριση
του συστήματος σε αυτή. Το πρώτο που παρατηρούμε στο σχήμα 4.23 είναι ότι το
σύστημα μετά από μια μεταβατική κατάσταση (transient state) η οποία εξαρτάται από
τις αρχικές συνθήκες, καταλήγει σε μία σταθερή κατάσταση η οποία δεν εξαρτάται
από τις αρχικές συνθήκες. Στη συγκεκριμένη περίπτωση αυτό προβλέπεται εύκολα
από τις Σχέσεις (4.26) – (4.28) όπου, αφού οι εκθετικοί όροι γίνουν αμελητέοι,
επικρατεί ο όρος της (4.29) . Ο τελευταίος μπορεί να γραφτεί στη μορφή
Στην παράγραφο αυτή θα μελετήσουμε ένα μη γραμμικό δυναμικό σύστημα με μη-τετριμμένες, χαοτικές, ιδιότητες. Πολλά ενδιαφέροντα δυναμικά συστήματα στη φύση παρουσιάζουν χαοτική συμπεριφορά. Αυτά είναι ντετερμινιστικά συστήματα των οποίων, δεδομένων των αρχικών συνθηκών, η κατάστασή τους μπορεί να υπολογιστεί για οποιαδήποτε χρονική στιγμή. Αλλά, ελάχιστα διαφορετικές αρχικές συνθήκες, δίνουν πολύ διαφορετικές τροχιές, με αποτέλεσμα να είναι πρακτικά αδύνατο να κάνουμε προβλέψεις σε βάθος χρόνου. Το σύστημα αυτό είναι το εκκρεμές στο ομογενές πεδίο βαρύτητας της γης με δύναμη απόσβεσης ανάλογη της ταχύτητας του εκκρεμούς και μια εξωτερική οδηγούσα δύναμη, κατακόρυφη στη διεύθυνση και μέτρο/φορά που μεταβάλλεται συνημιτονοειδώς με το χρόνο:
![]() | (4.34) |
Στην παραπάνω εξίσωση είναι η γωνία με την κατακόρυφο,
ο συντελεστής
απόσβεσης,
η φυσική κυκλική συχνότητα του εκκρεμούς και
,
η
κυκλική συχνότητα και το πλάτος της εξωτερικής γωνιακής επιτάχυνσης που
προκαλείται από την εξωτερική δύναμη.
΄Οταν δεν υπάρχει εξωτερική δύναμη το σύστημα έχει, εξαιτίας των αποσβέσεων,
ελκυστή το σημείο . Αυτό θα συνεχίσει να συμβαίνει, καθώς
αυξάνουμε το
από το μηδέν και ο ελκυστής παραμένει σταθερός για αρκετά μικρό
. Για κάποια τιμή
ο ελκυστής γίνεται ασταθής και η συμπεριφορά του
συστήματος γίνεται πολυπλοκότερη. Αυτή θα μελετηθεί λεπτομερέστερα σε επόμενο
κεφάλαιο, εδώ θα κάνουμε μια εισαγωγική προσέγγιση έχοντας κατά νου ότι το
σύστημα αυτό παρουσιάζει ενδιαφέρον.
Ο προγραμματισμός του συστήματος γίνεται με τετριμμένες αλλαγές του
προγράμματος dlo.f90. Οι μετατροπές στο πρόγραμμα φαίνονται παρακάτω,
έχοντας κατά νου πως X1 , X2
, a_0
. Το πρόγραμμα το
αποθηκεύουμε στο αρχείο fdp.f90 (fdp= Forced Damped Pendulum). Οι εντολές
ανάμεσα στις τελίτσες είναι πανομοιότυπες με τα προγράμματα dlo.f90,
rk.f90.
Τις τελευταίες γραμμές στο πρόγραμμα τις προσθέσαμε, ώστε να κρατήσουμε τη
γωνία στο διάστημα .
Για να μελετήσουμε τις ιδιότητες του συστήματος θα θέσουμε ,
,
και
, εκτός αν αναφέρουμε ρητώς διαφορετικά. Η φυσική περίοδος του
εκκρεμούς είναι
, ενώ αυτή της
εξωτερικής δύναμης
. Το σύστημα για
με
έχει σταθερό ελκυστή το σημείο
, ενώ για
ο ελκυστής είναι κλειστή καμπύλη. Η περίοδος της ταλάντωσης
βρίσκεται να είναι διπλάσια αυτής της εξωτερικής δύναμης. Για
ο
ελκυστής είναι ανοιχτή καμπύλη, επειδή το εκκρεμές εκτελεί ολόκληρους
κύκλους στη σταθερή του κατάσταση. Η περίοδος στο διάστημα αυτό γίνεται
ίση με αυτή της εξωτερικής δύναμης. Για
η περίοδος
διπλασιάζεται διαδοχικά για κρίσιμες τιμές του
, η τροχιά όμως συνεχίζει να είναι
περιοδική. Για μεγαλύτερες τιμές του
η τροχιά παύει να είναι περιοδική και το
σύστημα έχει χαοτική συμπεριφορά. Για
βρίσκουμε το σύστημα
να έχει πάλι περιοδική κίνηση, ενώ για
–
να έχουμε το
φαινόμενο διπλασιασμού της περιόδου. Για
έχουμε καθαρή χαοτική
συμπεριφορά κ.ο.κ. Τα αποτελέσματα αυτά περιγράφονται στα σχήματα 4.27–4.29.
Για την ανάλυση της συμπεριφοράς του εκκρεμούς και κυρίως για τη διευκόλυνση
της διάκρισης μεταξύ περιοδικής και χαοτικής συμπεριφοράς μπορεί κανείς να
μελετήσει τα λεγόμενα διαγράμματα Poincaré. Στα διαγράμματα αυτά τοποθετούμε
ένα σημείο στο χώρο των φάσεων κάθε φορά που ο χρόνος είναι ακέραιο
πολλαπλάσιο της περιόδου της εξωτερικής δύναμης. Με τον τρόπο αυτό, αν η κίνηση
είναι περιοδική με περίοδο ίση με την περίοδο της εξωτερικής δύναμης, θα έχουμε ένα
σημείο στο διάγραμμα και γενικότερα θα έχουμε n σημεία, αν η περίοδος είναι
n–πολλαπλάσιο της . Οπότε κανείς περιμένει, όταν παρατηρείται το
φαινόμενο διπλασιασμού της περιόδου, το διάγραμμα Poincaré να αποκτά επί πλέον
μεμονωμένα σημεία, ενώ όταν η συμπεριφορά είναι χαοτική, τα σημεία να
ανήκουν σε έναν υπόχωρο του χώρου των φάσεων που έχει πολυπλοκότερη
δομή. Αυτό μπορούμε εύκολα να το προγραμματίσουμε στον κώδικά μας στο
fdp.f90 ή εναλλακτικά να πάρουμε τη σχετική πληροφορία από το αρχείο
εξόδου fdp.dat με το πρόγραμμα awk το οποίο τρέχουμε από τη γραμμή
εντολών12 :
όπου $omega, $Nt, $TF οι τιμές της κυκλικής συχνότητας , αριθμού χρονικών
σημείων και τελικού χρόνου
. Στο πρόγραμμα υπολογίζουμε την περίοδο T και το
βήμα χρόνου dt. Στη συνέχεια, τυπώνουμε εκείνες τις γραμμές του αρχείου των
οποίων ο χρόνος είναι ακέραιο πολλαπλάσιο της περιόδου με ακρίβεια χρόνου
dt13 .
Αυτό γίνεται με την πράξη modulo $1 % T < dt που είναι TRUE, όταν το υπόλοιπο
της διαίρεσης της πρώτης στήλης ($1) του αρχείου fdp.dat έχει υπόλοιπο διαίρεσης
με την περίοδο T μικρότερο από dt. Τα αποτελέσματα για τη χαοτική φάση φαίνονται
στο σχήμα 4.30.
Κλείνουμε τη μελέτη μας με την παρουσίαση μιας ακόμα έννοιας που μας βοηθάει
στην ανάλυση των ιδιοτήτων του εκκρεμούς. Αυτή είναι η έννοια της “λεκάνης του
ελκυστή” (basin of attraction) η οποία είναι το σύνολο των αρχικών συνθηκών στο
χώρο των φάσεων που οδηγούν το σύστημα στο συγκεκριμένο ελκυστή. Στην
περίπτωσή μας, το εκκρεμές για εκτελεί κυκλική κίνηση είτε με θετική
είτε με αρνητική φορά (μετά την παρέλευση της παροδικής φάσης φυσικά)
οι οποίες αποτελούν τους δύο ελκυστές του συστήματος. Παίρνοντας ένα
μεγάλο δείγμα από αρχικές συνθήκες και σημειώνοντας το πρόσημο της
γωνιακής ταχύτητας μετά την παρέλευση της παροδικής φάσης, παίρνουμε
το σχήμα 4.31. Στην περιοδική φάση διακρίνουμε περιοχές, των οποίων τα
περιγράμματα δεν είναι καθαρά, οι οποίες δεν οδηγούν στο συγκεκριμένο ελκυστή.
Οι Σχέσεις (4.11) προκύπτουν από το ανάπτυγμα κατά Taylor
Προσθέτοντας και αφαιρώντας κατά μέλη παίρνουμε που δίνουν που είναι οι σχέσεις (4.11) . Από την πρώτη σχέση παίρνουμε και τις εξισώσεις της μεθόδου Euler (4.9) :
![]() | (4.37) |
Στις προσομοιώσεις το σημαντικό είναι το συνολικό σφάλμα που συσσωρεύεται
μετά από τα βήματα της ολοκλήρωσης. Ειδικά για τη συγκεκριμένη μέθοδο
πρέπει να δούμε τα σφάλματα που συσσωρεύονται ιδιαίτερα προσεκτικά:
![]() | (4.38) |
΄Αρα το ολικό σφάλμα είναι .
Για πληρότητα αναφέρουμε και τον αλγόριθμο Velocity Verlet ή μέθοδο Leapfrog. Στην περίπτωση αυτή χρησιμοποιούμε ρητά την ταχύτητα:
Στο τελευταίο βήμα χρειαζόμαστε την επιτάχυνσηΟι μέθοδοι Verlet είναι δημοφιλείς σε προσομοιώσεις molecular dynamics, κυρίως συστημάτων με πολλά σωμάτια. ΄Εχουν το ιδιαίτερο προσόν ότι υλοποιούνται σχετικά εύκολα οι περιορισμοί (constraints) στους οποίους υπόκειται τα σωματίδια που αποτελούν το σύστημα.
Στην παράγραφο αυτή θα δείξουμε με δύο τρόπους γιατί η επιλογή του ενδιάμεσου
σημείου 2 στην εξίσωση (4.17) μειώνει το σφάλμα κατά μία δύναμη του βήματος
. ΄Οπως θα φανεί, η επιλογή του μέσου του διαστήματος για το σημείο 2 δεν είναι
τυχαία (οπότε λ.χ. το σημείο με
δεν θα είχε το ίδιο αποτέλεσμα).
Πράγματι από τη σχέση
![]() | (4.40) |
Αναπτύσσοντας κατά Taylor γύρω από το σημείο , παίρνουμε
![]() | (4.41) |
Οπότε
Παρατηρούμε ότι για την εξαφάνιση του όρου Η επιλογή αυτή δεν είναι μοναδική. Αυτό μπορεί να φανεί και από μια διαφορετική
ανάλυση του αναπτύγματος κατά Taylor. Αναπτύσσοντας τώρα γύρω από το σημείο
, παίρνουμε
![]() | (4.48) |
Πάρτε ,
και υπολογίστε την ενέργεια συναρτήσει του
χρόνου. Είναι η τιμή της μονοτονική; Γιατί; (Δείξτε ότι
).
Επαναλάβατε για
. Πότε το σύστημα ταλαντώνεται και πότε
όχι; ϒπολογίστε αριθμητικά την κρίσιμη τιμή του
για την οποία το σύστημα
μετατρέπεται από ταλαντούμενο σε μη ταλαντούμενο. Συγκρίνετε το
αποτέλεσμά σας με την αναλυτική λύση.
Στις δύο διαστάσεις, το πρόβλημα αρχικών τιμών που έχουμε να λύσουμε δίνεται από το σύστημα (4.6)
Ο κώδικας που θα τρέχει τη μέθοδο Runge–Kutta 4ης τάξης προκύπτει με
μικρές μετατροπές του κώδικα rk.f90. Κατ’ αρχήν, για διευκόλυνση της μελέτης
διαφορετικών δυνάμεων ξεχωρίζουμε τον κοινό κώδικα με το user interface και τον
αλγόριθμο της μεθόδου από τις συναρτήσεις της επιτάχυνσης που αλλάζουν ανάλογα
με τη δύναμη σε ξεχωριστά αρχεία. Στο αρχείο rk2.f90 τοποθετούμε τα πρώτα και
σε αρχείο rk_XXX.f90 τα δεύτερα. XXX είναι ακολουθία χαρακτήρων που
ταυτοποιούν τη δύναμη λ.χ. rk2_hoc.f90 έχει την επιτάχυνση του αρμονικού
ταλαντωτή, rk2_g.f90 την επιτάχυνση από ομογενές πεδίο βαρύτητας
κ.ο.κ.
Στον κώδικα στο rk2.f90 κάνουμε μερικές μικροαλλαγές στο user interface. Τοποθετούμε δυο απροσδιόριστες σταθερές σύζευξης k1, k2 που μπορούν να δοθούν διαδραστικά από το χρήστη και να καθορίσουν το μέγεθος της δύναμης που ασκείται κάθε φορά στο σώμα. Τοποθετούνται σε common block
το οποίο θα “φαίνεται” και από τις συναρτήσεις επιτάχυνσης f3, f4 και της
ενέργειας energy. Ο χρήστης πρέπει τώρα να παρέχει τις αρχικές συνθήκες και για
τις δύο συντεταγμένες στο επίπεδο ,
. Αυτές αντιστοιχούν στις μεταβλητές
X10
, X20
, V10
, V20
, ενώ οι συναρτήσεις
του χρόνου αντιστοιχούν στα arrays X1(P)
, X2(P)
,
V1(P)
, V2(P)
. Η ολοκλήρωση γίνεται όπως και πριν
καλώντας
και στο αρχείο rk2.dat αποθηκεύουμε τα αποτελέσματα μαζί με τη συνολική
μηχανική ενέργεια που υπολογίζεται από τη συνάρτηση
energy(t,x1,x2,v1,v2) η οποία βρίσκεται στο ίδιο αρχείο με τις επιταχύνσεις μια
και η μορφή της εξαρτάται από τον τύπο της δύναμης:
Τέλος, πρέπει να γίνουν αλλαγές στον κώδικα της βασικής υπορουτίνας
RKSTEP(t,x1,x2,x3,x4,dt) λόγω του μεγαλύτερου αριθμού μεταβλητών στο
πρόβλημα. Παραθέτουμε ολόκληρο τον κώδικα για να διευκολύνουμε τον
αναγνώστη:
Θεωρούμε αρχικά σωματίδιο υπό την επίδραση δύναμης που του προσδίδει
επιτάχυνση
![]() | (5.2) |
Το σωματίδιο, όπως γνωρίζουμε καλά, κινείται πάνω σε μια παραβολή στην οποία εμείς απλά διαλέγουμε το σημείο στο οποίο τοποθετείται αρχικά το σωμάτιο:
όπου
Κωδικοποιούμε την επιτάχυνση
(
f3 ,
f4)
καθώς και τη συνολική μηχανική ενέργεια στο αρχείο rk2_g.f90:
Στη συνέχεια παραθέτουμε τη σειρά εντολών που δίνει ο χρήστης για να υπολογίσει την τροχιά
Στη συνέχεια, επεξεργαζόμαστε τα αποτελέσματά μας αναλύοντας τα δεδομένα από το αρχείο rk2.dat με το πρόγραμμα gnuplot:
Τα αποτελέσματα φαίνονται στο σχήματα 5.1 και 5.2. Παρατηρούμε μικρή αύξηση της ενέργειας που μας δίνει και το μέτρο της ακρίβειας της μεθόδου.
Με τη βοήθεια του gnuplot μπορούμε να φτιάξουμε κινούμενα σχέδια της τροχιάς. Για το λόγο αυτό ομαδοποιούμε μερικές εντολές του gnuplot σε αρχείο σεναρίου, έστω στο rk2_animate.gpl
Το παραπάνω αρχείο υποθέτει ότι, όταν τρέξουμε το gnuplot, έχουμε
αρχικοποιήσει τις μεταβλητές icount, skip, nlines να είναι οι τιμές του αρχικού
αριθμού γραμμών του αρχείου rk2.dat που θα μπουν στο διάγραμμα, ο
αριθμός γραμμών που θα προστίθενται σε κάθε καινούργιο πλαίσιο που
σχεδιάζεται στα κινούμενα σχέδια και ο συνολικός αριθμός γραμμών που
περιέχει το αρχείο, ώστε να σταματήσει η διαδικασία. Η ιδέα είναι ότι οι
εντολές του αρχείου διαβάζονται από το gnuplot κάνοντας ένα plot και αν
πληρείται το κριτήριο του if το αρχείο ξαναδιαβάζεται με την εντολή reread.
Ας εξηγήσουμε την γραμμή με την εντολή plot: Το “αρχείο” "<cat -n
rk2.dat" είναι το standard output της εντολής cat -n rk2.dat η οποία
τυπώνει στο standard output το αρχείο rk2.dat βάζοντας στην πρώτη
στήλη τον αριθμό γραμμής που διαβάζεται. ΄Ετσι η εντολή plot διαβάζει
δεδομένα στα οποία η πρώτη στήλη είναι ο αριθμός γραμμής, η δεύτερη ο
χρόνος, η τρίτη η συντεταγμένη , η τέταρτη η συντεταγμένη
κ.ο.κ. Η
γραμμή
λέει να χρησιμοποιηθεί η 3η στήλη στον οριζόντιο άξονα και αν η πρώτη
στήλη είναι μικρότερη από την τιμή της μεταβλητής icount να μπει στον
κατακόρυφο άξονα η τιμή της 4ης στήλης αλλιώς τίποτα (βάζοντας κάτι που δεν
είναι νόμιμο, όπως διαίρεση με το κάνει το gnuplot να αγνοήσει το
συγκεκριμένο σημείο). Με τον τρόπο αυτό, καθώς η τιμή της μεταβλητής
icount αυξάνει, τοποθετούμε στο διάγραμμα περισσότερα σημεία της τροχιάς
δημιουργώντας την ψευδαίσθηση της κίνησης. Τη γραμμή με την εντολή
pause την έχουμε βάλει ως σχόλιο. Αν τα κινούμενα σχέδια είναι πολύ
γρήγορα για σας, βγάλτε το χαρακτήρα του σχολίου # και αντικαταστήστε
τη μονάδα με τον αριθμό δευτερολέπτων που θέλετε να σταματάει κάθε
πλαίσιο. Για να χρησιμοποιήσουμε το σενάριο αυτό από το gnuplot δίνουμε τις
εντολές
Τα παραπάνω σενάρια θα τα βρείτε στο συνοδευτικό λογισμικό του κεφαλαίου. Εκεί θα βρείτε και σενάρια φλοιού τα οποία θα σας βοηθήσουν να αυτοματοποιήσετε πολλές από τις εντολές που περιγράψαμε παραπάνω. Περιγράφουμε τη χρήση δύο από αυτών. Πρώτα το σενάριο rk2_animate.csh:
Η τελευταία γραμμή πραγματοποιεί τα κινούμενα σχέδια με πλαίσια που κάθε φορά έχουν 500 παραπάνω σημεία, ενώ τα όρια των πλαισίων υπολογίζονται αυτόματα από το σενάριο με το διακόπτη -r. Ο διακόπτης -h δίνει σύντομες οδηγίες για τη χρήση του σεναρίου, μια σύμβαση που την ακολουθούμε συχνά στα σενάρια/προγράμματα που γράφουμε.
΄Ενα πιο πλήρες σενάριο που κάνει όλες τις δουλειές είναι το rk2.csh. Οδηγίες χρήσης παίρνουμε με την εντολή
όπου φαίνεται ότι έχουμε την επιλογή να τρέξουμε το πρόγραμμα με διαφορετικές δυνάμεις που επιλέγονται με το διακόπτη -f. Στην υπόλοιπη γραμμή εντολών δίνουμε τα δεδομένα εισόδου για το πρόγραμμα rk2.f90, τις σταθερές ζεύξης k1, k2, τις αρχικές συνθήκες x10, x20, v10, v20 και τις συνθήκες ολοκλήρωσης STEPS, t0, tf. ΄Ετσι για παράδειγμα οι εντολές
μας δίνουν την κίνηση του σωματιδίου στο πεδίο βαρύτητας που μελετήσαμε ως
τώρα, την κίνηση ανομοιογενούς αρμονικού ταλαντωτή (k1 = , k2 =
) και τη σκέδαση φορτίου σε πεδίο Coulomb - δοκιμάστε τα! Ελπίζω να
σας δημιουργηθεί και η περιέργεια να δείτε “μέσα” στα σενάρια, έτσι ώστε να τα
τροποποιείτε και δημιουργείτε από μόνοι/ες σας. Από μένα μερικές οδηγίες για
τους τεμπέληδες: Αν θελήσετε να προσθέσετε μια δική σας δύναμη στο
ρεπερτόριο του σεναρίου ακολουθήστε τη συνταγή: Προγραμματίστε τη
δύναμή σας σε ένα αρχείο με όνομα rk2_myforce.f90 σύμφωνα με τις
προδιαγραφές του rk2_g.f90. Επεξεργαστείτε το αρχείο rk2.csh και αλλάξτε τη
γραμμή
σε
(φυσικά μπορεί η μεταβλητή $forcecode να έχει και άλλες εγγραφές στο σενάριο αλλά αυτό δεν θα σας εμποδίσει). Μετρήστε σε ποια σειρά έχετε βάλει το myforce, εδώ την 6η, και τρέξτε την εντολή με το διακόπτη -f 6 όπου το 6 αντικαταστήστε το με τη σειρά στο δικό σας σενάριο (οι τελίτσες είναι οι δικές σας σταθ. ζεύξης και αρχικές συνθήκες):
Ας μελετήσουμε τώρα την επίδραση της αντίστασης του αέρα ή ενός ρευστού
στην πτώση/βολή του σωματιδίου. Για μικρές ταχύτητες η αντίσταση γίνεται
ανάλογη της ταχύτητας και έχουμε οπότε
Ο προγραμματισμός της επιτάχυνσης καταγράφεται στο αρχείο (k1 , k2
) rk2_vg.f90:
Τα αποτελέσματα καταγράφονται στα σχήματα 5.3 όπου φαίνεται η επίδραση της
αυξανόμενης αντίστασης στην τροχιά του σωματιδίου. Στο σχήμα 5.4 δίνεται για
σύγκριση η επίδραση δύναμης .
Θα θεωρήσουμε το απλό πλανητικό μοντέλο του “ήλιου” με μάζα και ενός
πλανήτη “γη” με μάζα
έτσι ώστε
. Ο νόμος του Νεύτωνα μας δίνει ότι
η επιτάχυνση της “γης” δίνεται από τη σχέση
![]() | (5.6) |
Θυμίζουμε στον αναγνώστη ότι ,
,
. Επίσης, όταν η υπόθεση
δεν είναι ικανοποιητική,
τότε το πρόβλημα των δύο σωμάτων ανάγεται σε αυτό του ενός χρησιμοποιώντας την
ανηγμένη μάζα
Η δύναμη της βαρύτητας είναι κεντρική με αποτέλεσμα να διατηρείται η
στροφορμή . Αυτό σημαίνει ότι η κίνηση γίνεται πάνω σε ένα επίπεδο και
μπορούμε να πάρουμε τον άξονα των
, έτσι ώστε
![]() | (5.7) |
Η δύναμη είναι διατηρητική και η ενέργεια
![]() | (5.8) |
διατηρείται. Αν πάρουμε την αρχή των αξόνων να είναι το κέντρο της δύναμης, τότε οι εξισώσεις κίνησης (5.6) γίνονται
μεΓια την περίοδο περιστροφής των πλανητών ισχύει ο τρίτος νόμος του Κέπλερ
![]() | (5.10) |
όπου εδώ είναι ο μεγάλος ημιάξονας της ελλειπτικής τροχιάς και
ο μικρός
ημιάξονας. Το πόσο “πλατιά” είναι η έλλειψη χαρακτηρίζεται από την εκκεντρότητα
της τροχιάς
![]() | (5.11) |
η οποία είναι 0 για τον κύκλο και τείνει προς τη 1 όταν την “πατάμε” να γίνει ευθεία.
Σε απόσταση από το κέντρο της έλλειψης βρίσκονται οι εστίες της
και
. Αυτές έχουν την ιδιότητα ότι κάθε σημείο
της τροχιάς
έχει
![]() | (5.12) |
Για να προγραμματίσουμε τη δύναμη του Νεύτωνα γράφουμε στο αρχείο rk2_cb.f90:
Στο παραπάνω πρόγραμμα k1= και έχουμε προσέξει την περίπτωση το
σωμάτιο να προσκρούσει στο ιδιάζον σημείο
, το κέντρο της δύναμης.
Προφανώς ο ίδιος κώδικας μπορεί να χρησιμοποιηθεί και για το ηλεκτροστατικό
πεδίο Coulomb με k1=
.
Κατ’ αρχήν μελετάμε τροχιές οι οποίες είναι δέσμιες. Διαλέγουμε ,
,
,
και
μεταβλητό. Μετράμε την περίοδο και το
μήκος των ημιαξόνων της έλλειψης. Προκύπτει ο πίνακας 5.1.
![]() | ![]() | ![]() |
3.2 | 1.032 | 2.051 |
3.4 | 1.282 | 2.371 |
3.6 | 1.682 | 2.841 |
3.8 | 2.398 | 3.598 |
4.0 | 3.9288 | 5.002 |
4.1 | 5.5164 | 6.272 |
4.2 | 8.6952 | 8.481 |
4.3 | 16.95 | 13.256 |
4.35 | 28.168 | 18.6 |
4.38 | 42.81 | 24.58 |
4.40 | 61.8 | 31.393 |
4.42 | 99.91 | 43.252 |
Μερικές από τις τροχιές φαίνονται στο σχήμα 5.5 όπου φαίνεται η εξάρτηση του μεγέθους της έλλειψης από την περίοδο. Στο σχήμα 5.6, επιβεβαιώνουμε τον 3ο νόμο του Κέπλερ, Σχέση (5.10) .
Πώς θα μπορούσαμε να προβλέψουμε το νόμο του Κέπλερ χωρίς να γνωρίζαμε το αποτέλεσμα εκ των προτέρων; Αν πάρουμε το λογάριθμο και στα δύο μέλη της εξίσωσης (5.10) προκύπτει:
![]() | (5.13) |
΄Αρα σε ένα διάγραμμα των σημείων τα σημεία πρέπει να βρίσκονται
πάνω σε μια ευθεία. Με τη μέθοδο των ελαχίστων τετραγώνων μπορούμε να
υπολογίσουμε το συντελεστή κατεύθυνσης και το σημείο τομής των αξόνων που θα
πρέπει να είναι
και
αντίστοιχα. Το αφήνουμε σαν άσκηση για
τον αναγνώστη.
Σε περίπτωση που η αρχική ταχύτητα του σωματιδίου υπερβεί την ταχύτητα
διαφυγής , το σωμάτιο ξεφεύγει από την επίδραση του πεδίου βαρύτητας. Αυτό
γίνεται όταν η μηχανική του ενέργεια (5.8) είναι 0 ή όταν
![]() | (5.14) |
που στην περίπτωση που εξετάζουμε με ,
,
,
παίρνουμε
. Αφήνουμε για άσκηση στον αναγνώστη τον αριθμητικό
προσδιορισμό της
.
Στην παράγραφο αυτή θεωρούμε σκέδαση σωματιδίων από ένα κεντρικό δυναμικό
1.
ϒποθέτουμε ότι στο δυναμικό αυτό υπάρχουν τροχιές που ξεκινούν από το άπειρο
και καταλήγουν στο άπειρο, στο οποίο τα σωματίδια κινούνται σχεδόν ελεύθερα από
την επίδραση της δύναμης. ΄Ετσι αρχικά τα σωματίδια κινούνται ελεύθερα προς την
περιοχή της αλληλεπίδρασης μέσα στην οποία αλλάζουν κατεύθυνση και κινούνται
πάλι έξω από αυτή σε διαφορετική διεύθυνση. Λέμε τότε ότι το σωμάτιο
σκεδάστηκε και ότι η γωνία μεταξύ της αρχικής και τελικής διεύθυνσης της
ταχύτητας είναι η γωνία σκέδασης . Το ενδιαφέρον στην περίπτωση αυτή
έγκειται στο γεγονός ότι από την κατανομή της γωνίας σκέδασης μιας δέσμης
σωματιδίων μπορούμε να πάρουμε χρήσιμη πληροφορία για το δυναμικό
σκέδασης. Αυτή η τεχνική χρησιμοποιείται κατά κόρον στους σημερινούς
επιταχυντές για την μελέτη των θεμελιωδών αλληλεπιδράσεων των στοιχειωδών
σωματιδίων.
Για να κατανοήσουμε τους ορισμούς είναι χρήσιμο να θεωρήσουμε τη σκέδαση μικρών
σκληρών σφαιρών ακτίνας από άλλες σκληρές σφαίρες ακτίνας
. Το δυναμικό
αλληλεπίδρασης2
είναι δηλαδή:
![]() | (5.15) |
όπου είναι η απόσταση του κέντρου της
από το κέντρο της
.
ϒποθέτουμε ότι τα σωματίδια της δέσμης δεν αλληλεπιδρούν μεταξύ
τους και ότι κατά τη σκέδαση κάθε σωμάτιο αλληλεπιδρά μόνο με ένα
κέντρο σκέδασης του στόχου. ΄Εστω η πυκνότητα ροής ή ένταση της
δέσμης3
και
η διατομή της δέσμης. ΄Εστω ότι ο στόχος έχει
σωματίδια ανά μονάδα
επιφάνειας. Η ενεργός διατομή της αλληλεπίδρασης είναι
όπου
και
οι ακτίνες των σκεδαζομένων σφαιρών και των στόχων αντίστοιχα [βλ.
σχήμα (5.8) ]: όλες οι σφαίρες έξω από την επιφάνεια αυτή στη δέσμη δεν
σκεδάζονται από το συγκεκριμένο στόχο. Η συνολική ενεργός διατομή που
παρουσιάζουν όλα τα κέντρα αλληλεπίδρασης του στόχου είναι
![]() | (5.16) |
όπου είναι ο συνολικός αριθμός των κέντρων του στόχου που βρίσκονται μέσα
στην δέσμη. Κατά μέσο όρο, ο ρυθμός σκέδασης, δηλ. ο αριθμός των σκεδάσεων ανά
μονάδα χρόνου θα είναι
![]() | (5.17) |
Η παραπάνω εξίσωση αποτελεί και τον ορισμό της συνολικής ενεργούς διατομής
της αλληλεπίδρασης για οποιαδήποτε άλλη περίπτωση σκέδασης που πληρεί τις
βασικές υποθέσεις που κάναμε. Η ποσότητα αυτή εξαρτάται από το είδος
της αλληλεπίδρασης. Η διαφορική ενεργός διατομή
ορίζεται από τη
σχέση
![]() | (5.18) |
όπου ο αριθμός των σωματιδίων ανά μονάδα χρόνου που σκεδάζονται μέσα στη
στερεά γωνία
.
Η συνολική ενεργός διατομή είναι
![]() | (5.19) |
Στην τελευταία σχέση χρησιμοποιήσαμε την κυλινδρική συμμετρία της αλληλεπίδρασης ως προς τον άξονα της κρούσης. Καταλήγουμε στη σχέση
![]() | (5.20) |
Αυτή η σχέση μπορεί να χρησιμοποιηθεί πειραματικά για τη μέτρηση της διαφορικής
ενεργούς διατομής μετρώντας το ρυθμό ανίχνευσης σωματιδίων μέσα σε δύο κώνους
που ορίζονται από τις γωνίες και
. Τη σχέση αυτή θα χρησιμοποιήσουμε
και στον αριθμητικό υπολογισμό της
.
Για να προσδιορίσουμε τη διαφορική ενεργό διατομή από μια θεωρία,
μπορούμε να ακολουθήσουμε την εξής γενική διαδικασία. ΄Εστω ότι σωμάτιο
βάλλεται προς τον στόχο όπως φαίνεται στο σχήμα 5.9. ονομάζεται η
παράμετρος κρούσης και η τελική γωνία
εξαρτάται από αυτή. ΄Αρα το μέρος
της δέσμης που σκεδάζεται σε γωνίες μεταξύ
και
βρίσκεται σε
ένα κυκλικό δαχτυλίδι ακτίνας
, πάχους
και εμβαδού
.
Αφού έχουμε ένα σωμάτιο στο στόχο
. Ο αριθμός των σωματιδίων
ανά μονάδα χρόνου που περνούν μέσα από το δαχτυλίδι είναι
,
άρα
![]() | (5.21) |
(το οφείλεται στο γεγονός ότι, όταν το
αυξάνει, το
μικραίνει). Από το
δυναμικό μπορούμε να υπολογίσουμε το
οπότε προκύπτει η
.
Αντίστροφα, αν μετρήσουμε τη
, μπορούμε να προσδιορίσουμε την
.
Η σκέδαση φορτισμένου σωματιδίου φορτίου (“ηλεκτρονίου’) μέσα σε δυναμικό
Coulomb πολύ βαρύτερου σημειακού ηλεκτρικού φορτίου
(“πυρήνας ”)
ονομάζεται σκέδαση Rutherford. Στην περίπτωση αυτή το δυναμικό αλληλεπίδρασης
είναι
![]() | (5.22) |
το οποίο προσδίδει επιτάχυνση στο σωματίδιο ίση με
![]() | (5.23) |
Η ενέργεια του σωματιδίου είναι και το μέτρο της στροφορμής του είναι
, όπου εδώ
. Η σχέση μεταξύ της παραμέτρου κρούσης και της
γωνίας σκέδασης βρίσκεται να είναι [37]
![]() | (5.24) |
όπου σε συνδυασμό με την (5.21) προκύπτει ότι
![]() | (5.25) |
Αρχικά εξετάζουμε τις τροχιές σκέδασης. Τα αποτελέσματα φαίνονται ποιοτικά
στο σχήμα 5.10 στην περίπτωση που τα φορτισμένα σωμάτια έχουν ομώνυμα φορτία.
Ανάλογο σχήμα προκύπτει και για ετερώνυμα φορτία. Στην περίπτωση αυτή
πρέπει να δοθεί ιδιαίτερη προσοχή στην ακρίβεια της μεθόδου για μικρές
παραμέτρους κρούσης (και τις υπόλοιπες παραμέτρους όπως στο σχήμα
5.10) όπου η γωνία σκέδασης γίνεται
. Πολύ μεγαλύτερος αριθμός
βημάτων απαιτείται για την επίτευξη ικανοποιητικής ακρίβειας. Βρίσκουμε
ότι η ποσότητα που μπορεί να χρησιμοποιηθεί σαν δείκτης που δείχνει την
σύγκλιση των αριθμητικών αποτελεσμάτων με αυτά της Σχέσης (5.24) είναι
η ενέργεια, η οποία πρέπει να διατηρείται κατά την κρούση. Αυτό θα μας
χρησιμεύσει όταν θα μελετήσουμε δυναμικά για τα οποία δεν έχουμε αναλυτική
λύση.
Για να μελετήσουμε ποσοτικά τα αποτελέσματά μας αυξάνουμε την ακρίβεια, έτσι ώστε να πετύχουμε ικανοποιητική σύγκλιση των αναλυτικών και αριθμητικών αποτελεσμάτων. Καταρτίζουμε έτσι τον πίνακα 5.2.
![]() | ![]() | ![]() | ![]() | Nt |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | STEPS |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Θα περιγράψουμε τώρα ένα τρόπο για τον υπολογισμό της ενεργούς διατομής
χρησιμοποιώντας τη Σχέση (5.20) . Εναλλακτικά θα μπορούσε να χρησιμοποιηθεί η
(5.21) υπολογίζοντας την κατάλληλη παράγωγο αριθμητικά. Αυτό όμως το
αφήνουμε για άσκηση στον ανήσυχο και επιμελή αναγνώστη. Ο υπολογισμός
που θα κάνουμε μοιάζει να είναι “πειραματικός”. Τοποθετούμε “ανιχνευτή”
που “ανιχνεύει” τα σωμάτια που σκεδάζονται από μέχρι
. Για
το λόγο αυτό χωρίζουμε το διάστημα
σε
διαστήματα (bins),
έτσι ώστε
. Κάνουμε “πειράματα” σκέδασης μεταβάλλοντας την
παράμετρο σκέδασης
με βήμα
. Λόγω της συμμετρίας το
προβλήματος, κρατάμε το
σταθερό, οπότε δεδομένο
αντιστοιχεί σε κώνο
ανοίγματος
και κορυφή το κέντρο σκέδασης. Παρατηρούμε σε ποια γωνία
σκεδάζεται το σωμάτιο με το συγκεκριμένο
και καταχωρούμε τον αριθμό των
σωματιδίων ανά μονάδα χρόνου
, επειδή αυτός είναι ανάλογος του
εμβαδού του δακτυλιδιού ακτίνας
. Απομένει να υπολογίσουμε τη ροή
η
οποία είναι ο συνολικός αριθμός των σωματιδίων ανά μονάδα χρόνου που δεν
είναι άλλος από
(στο λόγο
η σταθερά αναλογίας και
το
απλοποιούνται) και τη στερεά γωνία
. Τέλος, εύκολα
χρησιμοποιείται η σχέση (5.19) για τον υπολογισμό της συνολικής ενεργούς
διατομής
. Ο προγραμματισμός της διαδικασίας γίνεται μεταβάλλοντας
απλά το κυρίως πρόγραμμα του rk2.f90 το οποίο καταγράφουμε στο αρχείο
scatter.f90.
Η μεταγλώττιση γίνεται όπως και με την περίπτωση το rk2.f90, ενώ τα αποτελέσματα βρίσκονται στο αρχείο scatter.dat. ΄Ετσι, για να παράγουμε τα αποτελέσματα των Σχημάτων 5.11 και 5.12 εκτελούμε τις εντολές:
και ακολούθως βλέπουμε τα αποτελέσματα με το gnuplot:
Τα αποτελέσματα που παίρνουμε είναι σε πολύ καλή συμφωνία με τα αναμενόμενα από την αναλυτική έκφραση (5.25) . Το επόμενο βήμα θα είναι να μελετήσουμε διαφορετικά δυναμικά για τα οποία δεν έχουμε αναλυτική λύση με την οποία θα μπορούσαμε να συγκρίνουμε τα αποτελέσματά μας.
Ας εξετάσουμε πρώτα τη σκέδαση από μία δύναμη της μορφής
![]() | (5.26) |
η οποία είναι ένα απλό μοντέλο της σκέδασης ποζιτρονίου (θετικό φορτίο
)
με άτομο υδρογόνου που αποτελείται από θετικά φορτισμένο πυρήνα (θετικό φορτίο
) που περιβάλλεται από νέφος ηλεκτρονίου αντίθετου φορτίου. Φυσικά έχουμε
θέσει τις κλίμακες, έτσι ώστε
και
. Στην περίπτωση αυτή
δεν έχουμε αναλυτική λύση, οπότε θα χρησιμοποιήσουμε αριθμητικές μεθόδους για
τον υπολογισμό των συναρτήσεων
,
, καθώς και της συνολικής ενεργού
διατομής
.
Η δυναμική ενέργεια δίνεται από τη σχέση:
![]() | (5.27) |
όπου επιλέξαμε για
. Ο προγραμματισμός της δύναμης γίνεται
εύκολα στο αρχείο rk_hy.f90:
Τα αποτελέσματα δίνονται στα σχήματα 5.13–5.14. Βρίσκουμε ότι
(΄Ασκηση 5.10).
΄Ενα άλλο δυναμικό που παρουσιάζει ενδιαφέρον είναι το δυναμικό Yukawa ως φαινομενολογικό μοντέλο πυρηνικών αλληλεπιδράσεων:
![]() | (5.28) |
Το πεδίο αυτό μπορεί να χρησιμοποιηθεί και ως μοντέλο ενεργούς αλληλεπίδρασης των ηλεκτρονίων στα μέταλλα (Thomas–Fermi) ή ως το δυναμικό Debye στο κλασικό πλάσμα. Η δύναμη που ασκείται σε ένα σώμα υπό την επίδραση του δυναμικού αυτού είναι:
![]() | (5.29) |
Ο προγραμματισμός της δύναμης γίνεται στο αρχείο rk2_yu.f90 κατά απόλυτη αναλογία με την προηγούμενη περίπτωση. Τα αποτελέσματα φαίνονται στα σχήματα 5.15–5.16.
Στην παράγραφο αυτή γενικεύουμε τη μελέτη των προηγούμενων παραγράφων προσθέτοντας στο δυναμικό σύστημα που μελετάμε περισσότερους βαθμούς ελευθερίας. Ο αριθμός των δυναμικών εξισώσεων που έχουμε να λύσουμε αυξάνει, οπότε θα γενικεύσουμε το πρόγραμμα ολοκλήρωσης με τη μέθοδο Runge–Kutta 4ης τάξης για αυθαίρετο αριθμό εξισώσεων NEQ. Θα εξηγήσουμε στον αναγνώστη πώς να κάνει δυναμική εκχώρηση μνήμης (dynamic memory allocation), έτσι ώστε να καθορίζεται δυναμικά όταν τρέχει το πρόγραμμα, ο χώρος στη μνήμη για τα arrays που είναι απαραίτητα για τις NEQ συναρτήσεις που ολοκληρώνουμε.
Μέχρι τώρα χρησιμοποιούσαμε στατική εκχώρηση μνήμης (static memory allocation). Αυτό σημαίνει ότι ο μεταγλωττιστής γνωρίζει τη στιγμή της μεταγλώττισης το μέγεθος των χρησιμοποιούμενων arrays. Για παράδειγμα, στο πρόγραμμα rk2.f90 ορίζαμε την παράμετρο P να έχει μια δεδομένη τιμή, και τα arrays δηλώνονταν με τις εντολές:
Αυτό σημαίνει πως αν θελήσουμε να αλλάξουμε το P, πρέπει να μεταβάλλουμε την τιμή του στον πηγαίο κώδικα και μετά να ξαναμεταγλωττίσουμε. Με τη δυναμική εκχώρηση της μνήμης, μπορούμε να πάρουμε την τιμή του αριθμού των χρονικών σημείων Nt, καθώς και τον αριθμό των εξισώσεων NEQ, όταν τρέχει το πρόγραμμα και να ζητήσουμε από το λειτουργικό σύστημα την απαραίτητη μνήμη, αφού οι τιμές τους γίνουν γνωστές. Για να γίνει αυτό, πρέπει να προσδιορίσουμε το shape των arrays (πόσους δείκτες έχουν) και να τους δώσουμε τον προσδιορισμό allocatable. Τότε μπορούμε σε οποιαδήποτε στιγμή να ζητήσουμε τη μνήμη που απαιτείται καλώντας τη συνάρτηση ALLOCATE. ΄Ενα παράδειγμα φαίνεται παρακάτω:
Στον παραπάνω κώδικα, δηλώνουμε τα arrays να έχουν την ιδιότητα allocatable και για κάθε “:” έχουμε ένα δείκτη. ΄Ετσι τα arrays T,X0 έχουν ένα δείκτη (rank-1 arrays) και το X έχει δύο δείκτες (rank-2 array). Στη συνέχεια, ζητάμε τις τιμές για τις μεταβλητές Nt, NEQ από το χρήστη και από την υπορουτίνα finit και καλούμε τη συνάρτηση ALLOCATE για να ζητήσει από το λειτουργικό σύστημα την εκχώρηση της ζητούμενης μνήμης για τα στοιχεία των arrays4 . Αν η εκχώρηση μνήμης γίνει με επιτυχία, μπορούμε να χρησιμοποιήσουμε τα arrays όπως κάναμε μέχρι τώρα. ΄Οταν δε χρειαζόμαστε πια τα arrays, επιστρέφουμε τη μνήμη που ζητήσαμε στο σύστημα με την συνάρτηση DEALLOCATE. Αν το αμελήσουμε και ζητάμε μνήμη ανεξέλεγκτα χωρίς να την επιστρέφουμε, όταν αυτή δεν είναι πια αναγκαία (λ.χ. σε μια επαναλαμβανόμενη διαδικασία), το πρόγραμμά μας μπορεί να παρουσιάσει αυτό που λέγεται “διαρροές μνήμης” (memory leaks). Η δυναμική εκχώρηση μνήμης είναι πολύ βολική, αλλά θα πρέπει να σημειώσουμε ότι σε υπολογισμούς υψηλών επιδόσεων (high performance computing) η στατική εκχώρηση μνήμης μπορεί να οδηγήσει σε προγράμματα που τρέχουν πιο γρήγορα.
Μετά από αυτό, οι αλλαγές που πρέπει να κάνουμε στο πρόγραμμα δεν είναι σημαντικές. Θα γράψουμε το κυρίως πρόγραμμα στο αρχείο rkA.f90, ενώ θα κωδικοποιήσουμε τις δυναμικές εξισώσεις σε συνοδευτικό αρχείο με όνομα της μορφής rkA_XXX.f90. Στο τελευταίο, ο χρήστης θα πρέπει να προγραμματίσει μια υπορουτίνα f(t,X,dXdt) η οποία θα παίρνει στην είσοδο τη χρονική στιγμή t και τις τιμές των υπό ολοκλήρωση συναρτήσεων X(NEQ) και θα δίνει στην έξοδο τις τιμές των παραγώγων τους dXdt(NEQ) τη χρονική στιγμή t. Επίσης, η συνάρτηση finit(NEQ) θα θέτει τον αριθμό των εξισώσεων της f και η οποία θα καλείται μία φορά στην αρχή του κυρίως προγράμματος.
Το κυρίως πρόγραμμα, που βρίσκεται στο αρχείο rkA.f905 είναι:
Να επεξηγήσουμε μερικές λεπτομέρειες. Παρατηρήστε τη χρήση sections των arrays:
Παραπάνω X (1,:) είναι ολόκληρη η πρώτη γραμμή του array X, η οποία είναι conformable με το array X0, και η οποία τίθεται στοιχείο προς στοιχείο ίση με το array X0. Δηλαδή X(1,1)=X0(1), X(1,2)=X0(2), ... , X(1,NEQ)=X0(NEQ). Παρομοίως, η εντολή write(...) X(i,:) τυπώνει ολόκληρη τη γραμμή i του X, ενώ η εντολή X(i,:)= XS θέτει X(i,1)=XS(1), X(i,2)=XS(2), ... , X(i,NEQ)=XS(NEQ).
Επίσης παρατηρήστε τις διανυσματικές πράξεις
που είναι ισοδύναμες με τα do loops
Τέλος, θα εξηγήσουμε την έννοια του INTERFACE block. Τις συναρτήσεις μέχρι τώρα τις δηλώναμε στο καλούν πρόγραμμα, δηλώνοντας απλά τον τύπο της τιμής που επέστρεφαν. Σε μερικές περιπτώσεις, όπως εδώ όπου έχουν ως ορίσματα (dummy arguments) arrays που δεν είναι γνωστό παρά μόνο το shape τους (assumed-shape arrays), ο μεταγλωττιστής χρειάζεται περισσότερη πληροφορία. Πρέπει να δώσουμε τα ορίσματα, τους τύπους τους καθώς και το shape τους αν είναι arrays. ΄Ετσι, σε κάθε πρόγραμμα που καλεί τις συναρτήσεις αυτές, πρέπει να βάλουμε ένα INTERFACE block που να δίνει τις παραπάνω πληροφορίες. Εδώ, για τις συναρτήσεις f και energy το INTERFACE block είναι
Μπορείτε να δημιουργήσετε αρχεία με ονόματα όπως λ.χ. interfaces.inc που να έχει ομάδες από INTERFACE blocks και να το εισάγετε σε κάθε ρουτίνα που τις χρησιμοποιεί με την εντολή include "interfaces.inc".
Προχωράμε τώρα να λύσουμε ένα συγκεκριμένο πρόβλημα. Θεωρήστε ότι τρία σωματίδια ίδιας μάζας κινούνται υπό την επίδραση της βαρυτικής δύναμης που ασκεί το ένα στο άλλο (ή ίδιου φορτίου με την επίδραση απωστικής ηλεκτροστατικής δύναμης) όπως φαίνεται στο σχήμα 5.17. Η δυνάμεις που ασκούν το ένα στο άλλο είναι
![]() | (5.30) |
όπου και οι εξισώσεις κίνησης γίνονται (
)
![]() | (5.32) |
Προγραμματίζουμε τις παραπάνω σχέσεις στο αρχείο rkA_3pcb.f90, τα περιεχόμενα του οποίου δίνονται παρακάτω:
Για να το τρέξετε και για να δείτε τα αποτελέσματα μελετήστε τις εντολές στο σενάριο φλοιού rkA_3pcb.csh. Ενδεικτικά εκτελέστε την εντολή
που θα τρέξει το πρόγραμμα για ,
,
,
,
,
,
, Nt
και
.
![]() | (5.33) |
με . Λύστε αριθμητικά το πρόβλημα αρχικά στη μία διάσταση και
συγκρίνετε με τις γνωστές αναλυτικές λύσεις για ενέργεια
:
![]() | (5.34) |
με τη σταθερά ολοκλήρωσης να δίνεται ως συνάρτηση της αρχικής θέσης και της ενέργειας από
![]() | (5.35) |
Η κίνηση είναι περιοδική με περίοδο που εξαρτάται από την ενέργεια
. Για
έχουμε
![]() | (5.36) |
ενώ για
![]() | (5.37) |
Στις τελευταίες σχέσεις η σταθερά ολοκλήρωσης δίνεται από άλλη σχέση
και όχι από την (5.35) . Μελετήστε την κίνηση στο χώρο των φάσεων
και μελετήστε τη μετάβαση από ανοιχτές σε κλειστές τροχιές του
συστήματος.
Mελετήστε αριθμητικά τις λύσεις ,
,
,
στο επίπεδο για
,
, και
. Στην τελευταία περίπτωση μελετήστε και το
πρόβλημα σκέδασης, υπολογίζοντας αριθμητικά τη συνάρτηση
,
και
τη συνολική ενεργό διατομή
.
Μελετήστε το πρόβλημα σκέδασης, υπολογίζοντας αριθμητικά τη συνάρτηση
,
και τη συνολική ενεργό διατομή
. Πόσο εξαρτάται ο
υπολογισμός σας από την ελάχιστη γωνία σκέδασης;
Στόχος του κεφαλαίου είναι να μάθετε να αναζητάτε λύσεις στα προβλήματά σας από λογισμικό που διατίθεται από άλλους προγραμματιστές και να αποκτήσετε εμπειρία στο πώς να βρίσκετε την πληροφορία, πώς να το χρησιμοποιήσετε και πώς να το συνδέσετε με το δικό σας πρόγραμμα. Στο τέλος, θα έχετε και ένα εργαλείο καλής ποιότητας για να λύνετε προβλήματα με τη μέθοδο αριθμητικής ολοκλήρωσης Runge-Kutta με προσαρμοζόμενο βήμα, μέθοδος που χρησιμοποιείται από πολλούς ερευνητές.
Στις τρεις διαστάσεις, το πρόβλημα αρχικών τιμών που έχουμε να λύσουμε δίνεται από το σύστημα (4.6)
Στην περίπτωση αυτή θα χρησιμοποιήσουμε για αυξημένη ακρίβεια και υψηλότερη απόδοση έναν αλγόριθμο της οικογένειας Runge–Kutta με προσαρμοζόμενο έλεγχο βήματος (adaptive stepsize control). Για λεπτομέρειες παραπέμπουμε τον αναγνώστη στο βιβλίο [30]. Σκοπός μας εδώ δεν είναι να αναλύσουμε το συγκεκριμένο αλγόριθμο, αλλά να εξασκηθούμε στη χρήση προγραμμάτων που έχουν γράψει άλλοι για το συγκεκριμένο πρόβλημα που έχουμε να λύσουμε.
Φυσικά, το πρώτο που έχουμε να κάνουμε είναι να προσδιορίσουμε το κατάλληλο λογισμικό για το προς λύση πρόβλημα. Για το λόγο αυτό, ανάλογα με τη δυσκολία του προβλήματος αναζητούμε πληροφορίες στο δίκτυο, βιβλία σχετικά με το πρόβλημα και φυσικά, αν το πρόβλημά μας είναι ερευνητικού επιπέδου, αναζητούμε πληροφορίες στις ερευνητικές εργασίες και τους ειδικούς. Στη συγκεκριμένη περίπτωση, το πρόβλημά μας είναι σχετικά απλό και έχει πολλές και καλές λύσεις. Αναζητώντας λύση στο χώρο του ποιοτικού ελεύθερου λογισμικού αριθμητικών εφαρμογών, η πρώτη στάση που κάνουμε είναι στο www.netlib.org repository. Από τη λίστα του διαθέσιμου λογισμικού1 επιλέγουμε τη βιβλιοθήκη ode και από αυτή τη σουίτα rksuite. Στο σύνδεσμο http://www.netlib.org/ode/ διαβάζουμε
από όπου μαθαίνουμε ότι το πακέτο έχει αλγόριθμους τύπου Runge-Kutta γραμμένους σε γλώσσα Fortran και αφορά πραγματικές μεταβλητές διπλής ακρίβειας (double precision). Κατεβάζουμε τα αρχεία rksuite.f, rksuite.doc, details.doc, templates, readme.
Για να χρησιμοποιήσουμε υπορουτίνες στο πρόγραμμά μας το πρώτο βήμα είναι να διαβάσουμε προσεκτικά τα εγχειρίδια χρήσης του πακέτου. Αυτό μπορεί να βρίσκεται (ανάλογα με την περίπτωση φυσικά) σε τυπωμένα έγγραφα, σε ηλεκτρονικά έγγραφα [html, pdf, ..., σε συνοδευτικά αρχεία με ονόματα τύπου README, INSTALL, ... ή αρχεία που βρίσκονται σε υποκαταλόγους με ονόματα όπως doc/..., σε online αρχεία βοήθειας (man pages) κ.ο.κ.]. Το καλό λογισμικό έχει όλη τη χρήσιμη πληροφορία στα αρχεία που περιέχουν τον πηγαίο κώδικα, κάτι που ισχύει και στην περίπτωσή μας.
Για να συνδέσουμε υποπρογράμματα στο δικό μας πρόγραμμα χρειαζόμαστε τις εξής βασικές πληροφορίες:
Η εγκατάσταση του λογισμικού είναι απλή. ΄Ολος ο κώδικας είναι μέσα στο αρχείο rksuite.f και όπως μαθαίνουμε από το αρχείο rksuite.doc2 αρκεί να δώσουμε στο πρόγραμμα την τιμή τριών μεταβλητών που καθορίζουν την ακρίβεια υπολογισμού με υποδιαστολή στον υπολογιστή μας. Διαβάζουμε:
Δηλ. οι μεταβλητές OUTCH, MCHEPS, DWARF ορίζονται στην υπορουτίνα ENVIRN την οποία μπορεί να χρησιμοποιήσει για να τις χρησιμοποιήσει οπουδήποτε θέλει στο πρόγραμμα. Παρακάτω διαβάζουμε ότι το πρόγραμμα τις προ–ορίζει σε μάλλον ασφαλείς τιμές, αλλά αν ο προγραμματιστής πρέπει να τις αλλάξει3 , τότε πρέπει να επέμβει στην υπορουτίνα ENVIRN και να τις αλλάξει. ΄Αρα, πρέπει να κοιτάξουμε μέσα στο αρχείο rksuite.f για να διαβάσουμε τα σχόλια της εν λόγω ρουτίνας:
΄Αρα, αρκεί να αφαιρέσουμε τις έξι εντολές WRITE και STOP κάνοντας τις σχόλια της Fortran4 , αφού βεβαιωθούμε ότι οι επιλογές για τις τιμές των μεταβλητών OUTCH, MCHEPS, DWARF είναι ικανοποιητικές:
΄Ενας τρόπος να το ελέγξουμε με τη βοήθεια ελεύθερα διαθέσιμου λογισμικού είναι να αναζητήσουμε και να κατεβάσουμε τα αρχεία d1mach.f, i1mach.f από τη netlib.org, να τις τοποθετήσουμε στον υποκατάλογο blas/5 και να γράψουμε το μικρό πρόγραμμα test_envirn_blas.f90
΄Οπως βλέπετε και από το παραπάνω πρόγραμμα, οι μεταβλητές MCHEPS και DWARF μπορούν να υπολογιστούν και από τις intrinsic συναρτήσεις της Fortran EPSILON() και TINY() χωρίς να χρειαστούμε τις συναρτήσεις της blas. Μεταγλωττίζουμε και τρέχουμε
και προκύπτει ότι οι επιλογές μας είναι ικανοποιητικές.
Το επόμενο βήμα είναι να μάθουμε να χρησιμοποιούμε τη ρουτίνα. Για το λόγο αυτό διαβάζουμε προσεκτικά το αρχείο rksuite.doc από το οποίο περιληπτικά μαθαίνουμε τα εξής: Το πρόγραμμα χρησιμοποιεί τη ρουτίνα UT (UT = “Usual Task”) για να κάνει την ολοκλήρωση με τη μέθοδο Runge-Kutta με προσαρμοζόμενο βήμα. Το βήμα προσαρμόζεται χρησιμοποιώντας Runge-Kutta 2ης-3ης τάξης (METHOD=1), 4ης-5ης τάξης (METHOD=2) ή 7ης-8ης τάξης (METHOD=3) από τις οποίες θα διαλέξουμε METHOD=2. Πριν καλέσουμε την UT, πρέπει να καλέσουμε μια υπορουτίνα αρχικοποίησης, την SETUP. Τέλος, ο χρήστης παρέχει την υπορουτίνα F η οποία ορίζει τις παραγώγους των συναρτήσεων, δηλ. στην περίπτωσή μας το δεξί μέλος των 6.1. ΄Ενας γρήγορος τρόπος για να μάθουμε να χρησιμοποιούμε ένα πρόγραμμα είναι “by example”. Στην περίπτωσή μας στο πακέτο παρέχονται δοκιμαστικά προγράμματα για εκμάθηση και έλεγχο ορθότητας. Αυτά βρίσκονται στο αρχείο templates το οποίο ανοίγει από μόνο του με το πρόγραμμα φλοιού sh:
Το πρόγραμμα tmpl1a.f έχει τη λύση για τον αρμονικό ταλαντωτή και φαίνεται με πολλά επεξηγηματικά σχόλια η απλή χρήση του προγράμματος, την οποία επιλέγουμε τελικά στη δικιά μας περίπτωση. ΄Ετσι καταλήγουμε στο παρακάτω πρόγραμμα για την οδήγηση της ολοκλήρωσης, το οποίο αποθηκεύουμε στο αρχείο rk3.f90
Παρατηρούμε ότι τους κοινούς ορισμούς τους τοποθετήσαμε στο ξεχωριστό αρχείο rk3.inc για να χρησιμοποιηθούν και από τη συνάρτηση των παραγώγων. Τα περιεχόμενα του αρχείου αυτού τοποθετούνται στη σειρά include ’rk3.inc’:
Παρατηρούμε ότι εδώ θέτουμε τον αριθμό των διαφορικών εξισώσεων NEQ=6, καθώς
και τη μέθοδο ολοκλήρωσης METHOD=2. Η μεταβλητή LENWRK καθορίζει το μέγεθος
της μνήμης που χρειάζεται το πρόγραμμα για τους ενδιάμεσους υπολογισμούς. Το
πρόγραμμα αρχίζει ακριβώς όπως και τα προηγούμενα, αφήνοντας έτσι το interface
με το χρήστη αναλλοίωτο. Οι αρχικές θέσεις και ταχύτητες αποθηκεύονται
στο array YSTART στις θέσεις . Στις 3 πρώτες θέσεις έχουμε τις
συντεταγμένες χώρου, ενώ στις 3 τελευταίες τις συντεταγμένες της ταχύτητας.
Αφού καθορίσουμε μερικές μεταβλητές που καθορίζουν τη συμπεριφορά του
προγράμματος (δες αρχείο rksuite.doc για λεπτομέρειες), καλούμε την
υπορουτίνα SETUP. Στη συνέχεια, τυπώνουμε τις αρχικές συνθήκες στο
αρχείο εξόδου rk3.dat και φτάνουμε στην καρδιά του προγράμματος, την
ολοκλήρωση:
F είναι η συνάρτηση που υπολογίζει τις παραγώγους, γραμμένη από εμάς παρακάτω.
t είναι ο χρόνος στον οποίο επιθυμούμε να έχουμε το αποτέλεσμα της ολοκλήρωσης.
Λόγω προσαρμοζόμενου βήματος, αυτός μπορεί να μην είναι ακριβώς ο ίδιος με αυτόν
που τελικά μας επιστρέφει η υπορουτίνα, δηλ. τον tstep. Y είναι οι τιμές των
συναρτήσεων, δηλ. = Y(1),
= Y(2),
= Y(3) και
= Y(4),
= Y(5),
= Y(6). energy(t,Y) είναι η συνάρτηση που υπολογίζει τη μηχανική ενέργεια
του συστήματος την οποία θα γράψουμε στο ίδιο αρχείο με τη συνάρτηση F.
Τέλος, η μεταβλητή UFLAG είναι “σημαία” που δείχνει ότι η UT επιστρέφει με
σφάλμα, οπότε το πρόγραμμα τερματίζει. Παρακάτω, παραθέτουμε τον κώδικα
δοκιμής, την κίνηση βλήματος στο πεδίο βαρύτητας με δύναμη αντίστασης από
ρευστό ανάλογη της ταχύτητας του βλήματος
. Ο κώδικας
αποθηκεύεται στο αρχείο rk3_g.f90. Παίρνουμε
-k1
και
k2.
Για ευκολία, “μεταφράσαμε” τις τιμές του array Y(NEQ) σε μεταβλητές θέσης και ταχύτητας και μετά χρησιμοποιήσαμε τους γνωστούς τύπους6 . Η μεταγλώττιση, υποθέτοντας ότι τη σουίτα rksuite.f την τοποθετήσαμε στον υποκατάλογο rksuite/, το τρέξιμο και η επισκόπηση των αποτελεσμάτων με το gnuplot γίνεται με τις εντολές:
Την παραπάνω εργασία την έχουμε κωδικοποιήσει σε σενάριο φλοιού (shell script) με όνομα rk3.csh. Από το αρχείο αυτό χρησιμοποιείται το ανάλογο αρχείο για animation με το όνομα rk3_animate.csh. ΄Ετσι, η παραπάνω δουλειά συνοψίζεται στην παρακάτω εντολή:
Μετά την ανάλυση της προηγούμενης παραγράφου, έχουμε τα απαραίτητα εργαλεία να μελετήσουμε τη μη–σχετικιστική κίνηση φορτισμένου σωματίου μέσα σε ηλεκτρομαγνητικό (ΗΜ) πεδίο. Αυτό υπόκειται στην επίδραση της δύναμης Lorentz:
![]() | (6.2) |
Ας θεωρήσουμε πρώτα την απλή περίπτωση σταθερού ΗΜ πεδίου της μορφής
,
. Οι συνιστώσες της επιτάχυνσης του σωματίου
θα είναι:
Με παρόμοιο τρόπο μπορούμε να μελετήσουμε πεδία τα οποία είναι χωροεξαρτημένα.
Οι επιλογές μας πρέπει να ικανοποιούν τις εξισώσεις του Maxwell! Για να δούμε τον
περιορισμό στο χώρο φορτισμένου σωματιδίου με την επίδραση μαγνητικού πεδίου,
παίρνουμε τις απλές περιπτώσεις με
,
και
,
. Παρατηρούμε ότι
ισχύει
. Εσείς υπολογίστε την πυκνότητα ρεύματος από την εξίσωση
.
Τα αποτελέσματά μας φαίνονται στα σχήματα 6.1–6.4.
Στην παράγραφο αυτή θα συζητήσουμε τον υπολογισμό τροχιάς σωματιδίου μη
μηδενικής μάζας ηρεμίας, όταν η ταχύτητά του γίνεται συγκρίσιμη με αυτή του
φωτός. Παρακάτω, θα θέσουμε την ταχύτητα του φωτός στο κενό . Οι
εξισώσεις κίνησης σωματιδίου μάζας ηρεμίας
, μάζας
,
ορμής
και ενέργειας
μέσα σε δυναμικό πεδίο
δίνονται από τις σχέσεις:
![]() | (6.4) |
Για να τις γράψουμε σε σύστημα διαφορικών εξισώσεων πρώτης τάξης χρησιμοποιούμε τις σχέσεις:
![]() | (6.5) |
οι οποίες μαζί με την μας δίνουν:
![]() | (6.8) |
Για τον προγραμματισμό του παραπάνω προβλήματος χρειάζεται να μεταβάλλουμε ελαφρά το πρόγραμμα rk3.f90. Οι αλλαγές αφορούν το κυρίως πρόγραμμα μόνο στη σχέση ταχυτήτων ορμών που μπορεί να επιθυμεί να μελετήσει ο χρήστης. ΄Οσο για το αρχείο με το οποίο προγραμματίζουμε το δυναμικό πεδίο, χρειάζεται να μεταβάλλουμε μόνο τις σχέσεις για την ταχύτητα, αφού η προς ολοκλήρωση συνάρτηση είναι τώρα η ορμή. Ας αρχίσουμε πρώτα με το κυρίως πρόγραμμα, sr.f90:
Παρατηρούμε το ρόλο που παίζουν οι υπορουτίνες momentum και velocity οι οποίες αναλαμβάνουν τους μετασχηματισμούς (6.7) . Εκεί γίνεται και ο έλεγχος της συνθήκης (6.8) . Θα τις χρησιμοποιήσουμε και στο αρχείο που θα γράψουμε το πρόγραμμα που θα δίνει τις παραγώγους των συναρτήσεων για κάθε πεδίο δυνάμεων που θα θελήσουμε να μελετήσουμε.
Η πρώτη μας απόπειρα είναι να μελετήσουμε την κίνηση σχετικιστικού φορτισμένου σωματιδίου μέσα σε σταθερό ΗΜ πεδίο. Μέσα στο πεδίο αυτό η επιτάχυνση του σωματιδίου δίνεται από τις σχέσεις (6.3) . Οι σχέσεις αυτές προγραμματίζονται μέσα στο αρχείο sr_B.f90. Πέρα από τις αλλαγές που αναφέραμε μέχρι τώρα, πρέπει να προσέξουμε και τον ορισμό της κινητικής ενέργειας:
![]() | (6.9) |
Το περιεχόμενο του sr_B.f90 είναι:
Τα αποτελέσματά μας τα δείχνουμε στα σχήματα 6.5–6.6.
Αφού βεβαιωθήκαμε για την επιτυχία της προσέγγισης του προβλήματος για το φορτισμένο σωμάτιο σε σταθερό ΗΜ πεδίο, μπορούμε να προσπαθήσουμε να μελετήσουμε ένα πιο ενδιαφέρον πρόβλημα. Θα φτιάξουμε ένα απλό μοντέλο για την ακτινοβολία Van Allen της γης. Θα υποθέσουμε ότι τα ηλεκτρόνια κινούνται στο μαγνητικό πεδίο της γης το οποίο προσεγγίζεται ως μαγνητικό πεδίο διπόλου της μορφής:
![]() | (6.10) |
όπου η μαγνητική ροπή διπόλου του μαγνητικού πεδίου της γης και φυσικά
. Ενδεικτικά οι τιμές για τις παραμέτρους που υπεισέρχονται στην παραπάνω
εξίσωση είναι
,
, και
η ακτίνα της γης. Στις
αποστάσεις αυτές, τυπικές ενέργειες για τα κινούμενα ηλεκτρόνια είναι
MeV
που αντιστοιχούν σε ταχύτητες
.
Διαλέγοντας το σύστημα αξόνων έτσι ώστε
και μετρώντας τις αποστάσεις σε
μονάδες7
, παίρνουμε:
Τα αποτελέσματα φαίνονται στο σχήμα 6.8 στο οποίο έχουμε υπερβάλλει τις
παραμέτρους, ώστε να έχουμε ένα κατατοπιστικό οπτικό αποτέλεσμα. Στην
πραγματικότητα, τα ηλεκτρόνια διαγράφουν πολύ λεπτές σπείρες και ο αναγνώστης
ενθαρρύνεται να μελετήσει αριθμητικά το πρόβλημα για φαινομενολογικά ρεαλιστικές
τιμές των παραμέτρων ,
,
και να κατανοήσει γιατί το φαινόμενο συμβαίνει
μόνο κοντά στους πόλους.
΄Εστω σημειακά ηλεκτρικά φορτία
τα οποία βρίσκονται σε σταθερές θέσεις
στο επίπεδο που δίνονται από τα διανύσματα θέσης τους
,
. Ο
νόμος του Coulomb μας δίνει την τιμή του ηλεκτρικού πεδίου
![]() | (7.1) |
όπου το είναι το μοναδιαίο διάνυσμα στη διεύθυνση του
. Οι συνιστώσες του πεδίου είναι
Το ηλεκτροστατικό δυναμικό στη θέση είναι
![]() | (7.3) |
και ισχύει
![]() | (7.4) |
Οι δυναμικές γραμμές είναι οι ολοκληρωτικές καμπύλες του διανυσματικού πεδίου
, δηλ. οι καμπύλες εκείνες πάνω στις οποίες εφάπτεται το διάνυσμα του
ηλεκτρικού πεδίου σε κάθε σημείο τους. Μια σύμβαση που ακολουθείται στο
σχεδιασμό των δυναμικών γραμμών είναι ότι η πυκνότητα τους ανά μονάδα
επιφανείας είναι ανάλογη του μέτρου του
. Δηλ. ο αριθμός των δυναμικών
γραμμών που τέμνει μια επιφάνεια
είναι ανάλογη της ροής
του
ηλεκτρικού πεδίου που τη διαπερνά.
Οι ισοδυναμικές επιφάνειες είναι ο γεωμετρικός τόπος των σημείων εκείνων όπου
η συνάρτηση του δυναμικού έχει σταθερή τιμή. Η σχέση (7.4) μας λέει πως πυκνές
ισοδυναμικές επιφάνειες (που σημαίνουν γρήγορη χωρική μεταβολή του δυναμικού)
συνεπάγονται ισχυρό ηλεκτρικό πεδίο στην περιοχή και αντίστροφα. Επίσης, μας λέει ότι
η διεύθυνση του ηλεκτρικού πεδίου είναι κάθετη στις ισοδυναμικές επιφάνειες σε κάθε
σημείο1
(η διεύθυνση ταχύτερης μεταβολής του ) και με φορά αυτή της μείωσης του
δυναμικού. ΄Οταν περιοριζόμαστε στο επίπεδο που βρίσκεται η κατανομή των
φορτίων, οι ισοδυναμικές επιφάνειες δίνουν κλειστές καμπύλες που είναι η τομή τους
με το εν λόγω επίπεδο.
Στον υπολογιστή δεν μπορούμε να λύσουμε το πρόβλημα στο συνεχές.
Η συνεχής καμπύλη που θέλουμε να υπολογίσουμε θα προσεγγιστεί με
ένα μεγάλο αλλά πεπερασμένο αριθμό από μικρά ευθύγραμμα τμήματα. Η
ιδέα περιγράφεται στο σχήμα 7.1: Το μικρό ευθύγραμμο τμήμα μήκους
είναι στη διεύθυνση του ηλεκτρικού πεδίου, οπότε από τα όμοια τρίγωνα
παίρνουμε
![]() | (7.5) |
όπου .
Για τον υπολογισμό των ισοδυναμικών καμπύλων χρησιμοποιούμε την ιδιότητα
που έχουν οι δυναμικές γραμμές να είναι παντού κάθετες στις ισοδυναμικές
επιφάνειες (εδώ στις καμπύλες). ΄Αρα αν δίνει την εφαπτόμενη στην
ισοδυναμική γραμμή, τότε το
είναι σε κάθετη κατεύθυνση, αφού
. Οπότε για τις ισοδυναμικές
καμπύλες του επιπέδου προκύπτει η εξίσωση
![]() | (7.6) |
Μπορούμε τώρα να σχεδιάσουμε μια αλγοριθμική διαδικασία που θα μας επιτρέψει
τον προσεγγιστικό υπολογισμό των δυναμικών και ισοδυναμικών καμπύλων:
Επιλέγουμε αρχικό σημείο από το οποίο περνάει η (μοναδική) δυναμική
γραμμή ή ισοδυναμική επιφάνεια που επιθυμούμε. Από την κατανομή των
φορτίων υπολογίζουμε το ηλεκτρικό πεδίο χρησιμοποιώντας τις σχέσεις
(7.2) . Επιλέγοντας αρκετά μικρό βήμα , μετακινούμαστε στη διεύθυνση
![]() | (7.7) |
χρησιμοποιώντας τις σχέσεις (7.5) ή (7.6) ανάλογα με την περίπτωση. Επαναλαμβάνουμε τη διαδικασία μέχρι να τελειώσει ο σχεδιασμός για ένα μεγάλο αριθμό βημάτων. Το κριτήριο για αυτό θα το καθορίσει ο προγραμματιστής ή ο χρήστης ανάλογα με τις ανάγκες του υπολογισμού, λ.χ. η δυναμική γραμμή φεύγει έξω από τα όρια σχεδιασμού ή πλησιάζει κοντύτερα σε ένα φορτίο από μια ελάχιστη απόσταση.
Ο βιαστικός, αλλά και ελαφρά καταρτισμένος αναγνώστης μπορεί να συνεχίσει τη μελέτη του πηγαίνοντας κατευθείαν στην παράγραφο 7.4 και να επιστρέψει εδώ αργότερα για διευκρινίσεις. Εκεί θα βρει την τελική και πλήρη μορφή του προγράμματος, καθώς και συνοπτικές οδηγίες χρήσης του.
Για τον προγραμματισμό του αλγόριθμου που περιγράψαμε στην προηγούμενη παράγραφο, θα χωρίσουμε τις διαδικασίες σε τέσσερις ξεχωριστές και ανεξάρτητες μεταξύ τους ομάδες οι οποίες έχουν καλά ορισμένους στόχους και μπορούν να χρησιμοποιηθούν σε διαφορετικά τμήματα ενός προγράμματος.
Στο κυρίως πρόγραμμα ο χρήστης πρέπει να ορίσει τις μεταβλητές N, X(N), Y(N), Q(N). Το πρόγραμμα θα πρέπει να ζητήσει από το χρήστη τις σχετικές πληροφορίες (“διεπαφή με χρήστη”) και, χρησιμοποιώντας τις, να καλέσει τις σχετικές ρουτίνες που υλοποιούν τον υπολογισμό. Μια μινιμαλιστική προσέγγιση θα είναι να γράψουμε σε ένα αρχείο ELines.f90 ένα πρόγραμμα όπως το παρακάτω (“πρώτη έκδοση” - version 1):
Οι εντολές
τοποθετούν δύο ίσα και αντίθετα φορτία Q(1)= -Q(2)= 1.0 στις θέσεις και
αντίστοιχα. Οι επόμενες γραμμές καλούν την υπορουτίνα eline να κάνει
τον υπολογισμό για 8 δυναμικές γραμμές που περνούν από τα σημεία
,
,
,
:
Οι εντολές αυτές τυπώνουν τις συντεταγμένες των σημείων των δυναμικών γραμμών στο standard output, τις οποίες ο χρήστης θα πρέπει να επεξεργαστεί περαιτέρω.
Για τον υπολογισμό των ισοδυναμικών καμπύλων ο κώδικας είναι ακριβώς ο ίδιος
αντικαθιστώντας call eline call epotline.
Για να συμπληρωθεί το πρόγραμμα θα πρέπει να προγραμματίσουμε τις υπορουτίνες eline, efield, mdist. Αυτό θα το συζητήσουμε παρακάτω. Για την ώρα, αν θέλετε να χρησιμοποιήσετε το πλήρες πρόγραμμα, αναζητήστε το αρχείο ELines.f90 από το συνοδευτικό λογισμικό. Μεταγλωττίζουμε και τρέχουμε το πρόγραμμα κατά τα γνωστά:
όπου με το χαρακτήρα > επαναορισμού του standard output μεταφέρουμε τα αποτελέσματα που τυπώνει το πρόγραμμα στο αρχείο el.out. Για να δούμε τα αποτελέσματα, χρησιμοποιούμε το gnuplot:
Το αποτέλεσμα φαίνεται στο σχήμα 7.2.
Ας γράψουμε τώρα το πρόγραμμα δίνοντας στο χρήστη την ευκαιρία να μελετήσει ευκολότερα διαφορετικές κατανομές φορτίων και να επιλέξει τις δυναμικές γραμμές που θα υπολογιστούν. Ο χρήστης θα παρέχει διαδραστικά τον αριθμό και τη θέση/μέγεθος των ηλεκτρικών φορτίων καθώς και τον αριθμό και τα αρχικά σημεία των δυναμικών γραμμών που θα υπολογιστούν. Ο πρώτος στόχος επιτυγχάνεται αλλάζοντας τον κώδικα στο σημείο που θέτει την κατανομή φορτίων ως εξής:
Η πρώτη εντολή ζητάει από το χρήστη τον αριθμό των φορτίων της κατανομής, τον οποίο διαβάζει από το standard input. Στη συνέχεια, για κάθε τιμή του i διαβάζουμε τις τιμές της θέσης/μέγεθος φορτίου και τις αποθηκεύουμε στις αντίστοιχες θέσεις των arrays X(i), Y(i), Q(i). Τα αποτελέσματα τυπώνονται για να τα βλέπει ο χρήστης και για να ελέγχει ότι πέρασαν σωστά στη μνήμη του υπολογιστή.
Ο σχεδιασμός των δυναμικών γραμμών γίνεται αλλάζοντας τον κώδικα στο σημείο σχεδίασης των γραμμών ως εξής:
Το πρόγραμμα το τρέχουμε, όπως φαίνεται παρακάτω, για ένα φορτίο στην
αρχή των αξόνων ζητώντας να σχεδιάζει μία δυναμική γραμμή που περνάει από το
σημείο
.
Για μεγαλύτερες κατανομές φορτίων χρησιμοποιείστε έναν editor και σε ένα αρχείο με όνομα λ.χ. Input γράψτε τα δεδομένα εισόδου
Αν δώσετε τώρα την εντολή 3
θα πάρετε τα αποτελέσματα για τις δυναμικές γραμμές που ζητήσατε να υπολογιστούν και τα οποία θα αποθηκευτούν στο αρχείο el.out. Μπορείτε έτσι να φτιάξετε τη δικιά σας “βιβλιοθήκη” από κατανομές φορτίων και δυναμικές γραμμές του ηλεκτρικού πεδίου που δημιουργούν. Ο παραπάνω κώδικας (“δεύτερη έκδοση” - version 2) παρατίθεται παρακάτω:
΄Ηδη ο προσεκτικός αναγνώστης θα έχει ασκηθεί αρκετά, ώστε να καταλάβει πως για να φτιάξει μια ωραία εικόνα από αντιπροσωπευτικές δυναμικές γραμμές χρειάζεται αρκετό χρόνο για να το κάνει... Πώς θα μπορούσαμε, τουλάχιστον αρχικά, να πάρουμε γρήγορα μια αντιπροσωπευτική εικόνα του ηλεκτρικού πεδίου; Για τις δυναμικές γραμμές η απάντηση είναι εύκολη: Αρκετά κοντά σε ένα σημειακό ηλεκτρικό φορτίο, το ηλεκτρικό πεδίο είναι κατά πολύ καλή προσέγγιση ισοτροπικά ακτινικό. Ο αριθμός των δυναμικών γραμμών που ξεκινούν/καταλήγουν από/σε ένα σημειακό θετικό/αρνητικό ηλεκτρικό φορτίο είναι ανάλογος του μεγέθους του φορτίου. ΄Ετσι, αρκεί να επιλέξουμε ως αρχικά σημεία έναν αριθμό ανάλογο του φορτίου από ισότροπα κατανεμημένα σημεία πάνω σε ένα αρκετά μικρό κυκλάκι γύρω από κάθε φορτίο της κατανομής. Παρακάτω παραθέτουμε τον κώδικα (“τρίτη έκδοση” - version 3) για φορτία ίσα σε μέγεθος και αφήνουμε ως άσκηση στον αναγνώστη την περίπτωση φορτίων που είναι διαφορετικού μεγέθους:
Θα παρατηρήσατε ήδη πως η μόνη αλλαγή που κάναμε είναι στο κομμάτι σχεδιασμού των γραμμών. Θέτουμε τον αριθμό των αρχικών γραμμών γύρω από κάθε φορτίο να είναι 12 με την εντολή nd = 6 και μετά γύρω από κάθε φορτίο καλούμε την eline με αρχικά σημεία (x0,y0) πάνω σε ένα κύκλο κέντρου (X(i),Y(i)) και ακτίνας 0.1. Αυτό γίνεται 2*nd φορές σε σημεία που καθορίζονται από τη γωνία theta=(PI/nd)*j.
Για να το τρέξουμε, γράφουμε ένα αρχείο Input με περιεχόμενα την κατανομή
των φορτίων. Για παράδειγμα, για μια κατανομή τεσσάρων φορτίων πάνω
στις κορυφές ενός τετραγώνου γράφουμε:
και μετά δίνουμε τις εντολές:
Στα σχήματα 7.3-7.4 δείχνουμε τα αποτελέσματα για μερικές κατανομές φορτίου. Αφήνουμε ως άσκηση στον αναγνώστη να βρει από ποιες κατανομές προκύπτουν και να αναπαράγει τα σχήματα αυτά για εξάσκηση.
Με παρόμοιο τρόπο γράφουμε πρόγραμμα και για τις ισοδυναμικές καμπύλες. Η μόνη διαφορά είναι ότι αν θέλουμε τα αρχικά σημεία να επιλέγονται αυτόματα, θα πρέπει να επινοήσουμε ένα νέο αλγόριθμο που να ζωγραφίζει τις δυναμικές γραμμές για δεδομένες πτώσεις δυναμικού. Λόγω της πολυπλοκότητας του αλγόριθμου, αυτό αφήνεται ως άσκηση για τον αναγνώστη (δες σχετική άσκηση με οδηγίες). Εμείς στον παρακάτω κώδικα επιλέγουμε για αρχικά σημεία ισαπέχοντα σημεία πάνω σε ένα τετραγωνικό πλέγμα. Ο κώδικας αποθηκεύεται στο αρχείο EPotential.f90:
Ο κώδικας είναι πανομοιότυπος με τον προηγούμενο στο πρώτο και δεύτερο μέρος
του. Στο τρίτο μέρος, όπου ζητείται ο σχεδιασμός των καμπύλων, καλείται τώρα η
υπορουτίνα epotline να κάνει το σχεδιασμό. ΄Ολα τα υπόλοιπα αναφέρονται στον
προσδιορισμό των αρχικών σημείων που γίνεται ως εξής: Επιλέγουμε τον αριθμό των
σημείων του πλέγματος με την εντολή nd=4, η οποία δίνει (2*nd+1)*(2*nd+1)= 81
σημεία. Με την εντολή L=1.0 καθορίζουμε τα όρια του πλέγματος να είναι το
τετράγωνο ,
,
,
. Στη συνέχεια, για κάθε σημείο
του πλέγματος (x0,y0) υπολογίζουμε την ισοδυναμική καμπύλη που περνάει
από αυτό με την προϋπόθεση το σημείο αυτό να μην είναι πολύ κοντά σε
ένα από τα φορτία. Αυτό γίνεται καλώντας την υπορουτίνα mdist από την
οποία παίρνουμε την ελάχιστη απόσταση rmin του σημείου και βάζοντας
κάτω όριο σε αυτή τον αριθμό L/(nd*10). Για να το τρέξουμε δίνουμε τις
εντολές:
Μερικά από τα αποτελέσματα φαίνονται στο σχήμα 7.5.
Στην παράγραφο αυτή περιγράφουμε τη λειτουργία και τον προγραμματισμό των κύριων κομματιών του προγράμματος: Τις υπορουτίνες υπολογισμού των καμπύλων eline, epotline, του ηλεκτρικού πεδίου efield και της ελάχιστης απόστασης από τα φορτία mdist.
Αρχίζουμε από την ρουτίνα eline. Ο χρήστης την καλεί με την εντολή
δίνοντας στην είσοδο το αρχικό σημείο της γραμμής (x0,y0), τον αριθμό των
φορτίων N, καθώς και τις θέσεις των φορτίων (X(N),Y(N)) και μεγέθη των φορτίων
Q(N). Για να σχεδιαστεί η δυναμική γραμμή χρειάζονται το βήμα της
σχέσης (7.5) , καθώς και τα όρια σχεδίασης των γραμμών. Τα όρια αυτά
είναι δύο: Πρώτα όταν πλησιάζουμε πολύ κοντά σε ένα φορτίο. Τότε το
ηλεκτρικό πεδίο τείνει στο άπειρο και αυτό θα δημιουργήσει προβλήματα.
Το βήμα
είναι μια καλή κλίμακα μικρού μήκους και θέτουμε το όριο
προσέγγισης σε
. Επίσης, δε θέλουμε να απομακρυνθούμε πολύ από την
κατανομή, οπότε θέτουμε μια αυθαίρετη μέγιστη απόσταση από όλα τα φορτία
ίση με max_dist=20.0. ΄Αλλες προβληματικές καταστάσεις που πρέπει να
προβλέψουμε, είναι να μηδενιστεί το ηλεκτρικό πεδίο, οπότε το αποτέλεσμα του
υπολογισμού στη Σχέση (7.5) γίνεται απροσδιόριστο. Τέλος, παίρνοντας
μετακινούμαστε πάνω στη δυναμική γραμμή μόνο προς την κατεύθυνση του
ηλεκτρικού πεδίου καταλήγοντας πάντα πάνω σε ένα αρνητικό φορτίο ή
στη μέγιστη απόσταση (γιατί;). Για να σχεδιάσουμε τη δυναμική γραμμή
ολόκληρη, θα επαναλάβουμε τον υπολογισμό από το ίδιο αρχικό σημείο με
.
Η κωδικοποίηση της διαδικασίας φαίνεται παρακάτω:
Στο πρώτο κομμάτι του κώδικα δηλώνονται οι μεταβλητές. Το μόνο καινούργιο που έχουμε να πούμε είναι η δήλωση
αντί για dimension(P). Αυτό δεν πειράζει σε τίποτα, αρκεί φυσικά ο προγραμματιστής
να έχει ήδη ελέγξει ότι N P. Στο αρχικό πρόγραμμα που δηλώθηκαν τα arrays
X,Y,Q, ζητήθηκε και ο φυσικός χώρος στη μνήμη του υπολογιστή όπου θα
αποθηκευτούν τα δεδομένα. Τα arrays X,Y,Q περνάνε στην υπορουτίνα “by
reference”, δηλ. δίνεται η θέση στη μνήμη στην οποία είναι αποθηκευμένα
και όχι “by value”. Το μέγεθος του βήματος
, καθώς και η μέγιστη
απόσταση σχεδιασμού, καθορίζονται με τον προσδιορισμό parameter στις δύο
δηλώσεις:
Οι τιμές αυτές θα πρέπει να καθοριστούν προσεκτικά από τον προγραμματιστή ανάλογα με τη ζητούμενη ακρίβεια επίλυσης του προβλήματος.
Στο κυρίως πρόγραμμα παρατηρούμε τον εξωτερικό βρόχο
ο οποίος αλλάζει την κατεύθυνση κίνησης πάνω στη δυναμική γραμμή. Η εντολή do
direction = -1,1,2 εκτελεί το βρόχο για direction από έως
με βήμα
. Δηλ. θα εκτελεστεί δύο φορές για direction=
. ΄Αρα το βήμα dl έχει
κάθε φορά διαφορετικό πρόσημο.
Στη συνέχεια, οι εντολές x0 = xin, y0 = yin ορίζουν το αρχικό σημείο της
δυναμικής γραμμής. (x0, y0) είναι το εκάστοτε σημείο της δυναμικής γραμμής το
οποίο τυπώνουμε στο standard output με την εντολή print. (dx, dy) είναι το
βήμα μετακίνησης πάνω στη δυναμική γραμμή, έτσι ώστε (x0, y0) (x0+dx,
y0+dy) μετά από κάθε υπολογισμό. Ο σχεδιασμός της δυναμικής γραμμής γίνεται
στον εσωτερικό βρόχο
ο οποίος εκτελείται, όταν η συνθήκη rmin .gt. (2.0*step) .and. rmax .lt. max_dist έχει την τιμή .TRUE., είναι δηλ. αληθής. Αυτό ισχύει όσο η ελάχιστη απόσταση από όλα τα φορτία στο εκάστοτε σημείο που βρισκόμαστε δεν έχει γίνει μικρότερη ή ίση από 2.0*step και η μέγιστη απόσταση από οποιοδήποτε φορτίο παραμένει μικρότερη από max_dist4 . Οι μέγιστες και ελάχιστες αποστάσεις προσδιορίζονται με κάλεσμα στην υπορουτίνα mdist την οποία θα μελετήσουμε παρακάτω.
Το ηλεκτρικό πεδίο που θα χρησιμοποιηθεί στη Σχέση (7.5) υπολογίζεται καλώντας efield(x0+0.5*dx,y0+0.5*dy,X,Y,Q,N,Ex,Ey). Τα δύο πρώτα ορίσματα της υπορουτίνας είναι το σημείο στο οποίο ζητούμε το ηλεκτρικό πεδίο, και αυτό επιλέγεται να είναι το (x0+dx/2,y0+dy/2) αντί για το (x0,y0). Αυτό γίνεται για να μειώσουμε το συστηματικό σφάλμα από τη διακριτοποίηση του προβλήματος παίρνοντας συνεισφορά από το μέσο του διαστήματος (x0,x0+dx) και (y0,y0+dy) και όχι από το ένα άκρο μόνο.
Μετά τον υπολογισμό του ηλεκτρικού πεδίου, η εφαρμογή της σχέσης (7.5) γίνεται απλά με τις εντολές
Ο έλεγχος των παθολογικών καταστάσεων E=0.0 και dx=dy=0.0 γίνεται με την εντολή
όπου, όταν το μέτρο του πεδίου γίνει πολύ μικρό σταματάει ο υπολογισμός βγαίνοντας από το βρόχο με την εντολή exit. Ομολογουμένως, χάριν απλότητας, δεν είμαστε πολύ προσεκτικοί και ο αναγνώστης καλείται να θεραπεύσει και άλλες παθολογικές καταστάσεις σε σχετική άσκηση.
Με παρόμοιο τρόπο προγραμματίζουμε και την epotline. Ο σχετικός κώδικας παρατίθεται παρακάτω:
Οι διαφορές με το προηγούμενο πρόγραμμα είναι λίγες: Οι ισοδυναμικές καμπύλες είναι κλειστές, άρα τις διασχίζουμε μόνο κατά μία φορά και το κριτήριο τερματισμού του υπολογισμού είναι το να φτάσουμε αρκετά κοντά στο αρχικό σημείο:
Ο παραπάνω βρόχος εκτελείται μέχρι η απόσταση από το αρχικό σημείο να γίνει μικρότερη από 0.9*dl ή να φύγουμε εκτός της περιοχής σχεδιασμού. Τα dx, dy υπολογίζονται σύμφωνα με την (7.6) :
Η υπορουτίνα efield προγραμματίζεται εφαρμόζοντας τους τύπους (7.2) 5:
Τέλος, η υπορουτίνα mdist που χρησιμοποιούμε αρκετά στα παραπάνω υπολογίζει την ελάχιστη και μέγιστη απόσταση rmin και rmax από ένα δεδομένο σημείο (x0,y0):
Εδώ η αρχική τιμή του rmin πρέπει να οριστεί προσεκτικά ανάλογα με τα όρια σχεδίασης των δυν. γραμμών.
Στην παράγραφο αυτή παρατίθενται για διευκόλυνση του αναγνώστη ολόκληρα τα προγράμματα των δύο τελευταίων παραγράφων, καθώς και συνοπτικές οδηγίες για τη μεταγλώττιση και ανάλυση των αποτελεσμάτων. Μπορείτε, αν θέλετε, πρώτα να αντιγράψετε τα προγράμματα στα αντίστοιχα αρχεία και να εκτελέσετε τις εντολές συλλογής και ανάλυσης των δεδομένων που δίνονται εδώ χωρίς εξήγηση και μετά να επιστρέψετε στις προηγούμενες παραγράφους για βαθύτερη κατανόηση των πεπραγμένων.
Πρώτα δίνουμε τα περιεχόμενα του αρχείου ELines.f90:
Στη συνέχεια, δίνουμε τα περιεχόμενα του αρχείου EPotential.f90:
όπου οι ... είναι οι υπορουτίνες efield και mdist οι οποίες είναι ίδιες με αυτές του αρχείου ELines.f90.
Τέλος, υπενθυμίζουμε στον αναγνώστη πώς να τα τρέξει και να δει τα αποτελέσματα. Μεταγλωττίζουμε το πρόγραμμα με την εντολή
Στη συνέχεια, γράφουμε σε ένα αρχείο Input τα δεδομένα της κατανομής των φορτίων. Για παράδειγμα:
Τα αποτελέσματα τα παίρνουμε με τις εντολές:
Καλή ... διασκέδαση!
Θεωρούμε ηλεκτρικό πεδίο το οποίο είναι ανεξάρτητο του χρόνου σε περιοχή του χώρου που είναι άδεια από ηλεκτρικά φορτία. Οι εξισώσεις του Maxwell στην περίπτωση αυτή είναι η εξίσωση Gauss
![]() | (7.8) |
μαζί με την εξίσωση που ορίζει το ηλεκτροστατικό δυναμικό6
Οι εξισώσεις (7.8) και (7.9) μας δίνουν μία εξίσωση Laplace για τη
![]() | (7.10) |
Η λύση της παραπάνω εξίσωσης είναι ένα πρόβλημα συνοριακών συνθηκών:
Ζητούμε το δυναμικό σε μία περιοχή του χώρου
η οποία
περιβάλλεται από το όριό της, μία κλειστή επιφάνεια
. ΄Οταν το δυναμικό
είναι γνωστό πάνω στην
, η λύση της (7.10) είναι μοναδική και το
δυναμικό, και κατ’ επέκταση το ηλεκτρικό πεδίο, προσδιορίζεται παντού στην
.
Για απλότητα θεωρούμε το πρόβλημα ανηγμένο στο επίπεδο, οπότε .
Στην περίπτωση αυτή, ο τελευταίος όρος στην (7.10) απουσιάζει, η
είναι
συμπαγές τμήμα του επιπέδου και η
είναι μια κλειστή καμπύλη.
Για να μελετήσουμε το πρόβλημα αριθμητικά, προσεγγίζουμε το
χώρο με ένα τετραγωνικό και τετράγωνο πλέγμα με το δυναμικό να
ορίζεται μόνο πάνω σε πλεγματικές θέσεις. Αν το μήκος κάθε
πλευράς είναι
και τα γειτονικά πλεγματικά σημεία απέχουν μεταξύ τους
απόσταση7
, τότε
, όπου
είναι ο αριθμός των πλεγματικών σημείων
σε κάθε πλευρά του πλέγματος. Η προσέγγιση της συνεχούς λύσης επιτυγχάνεται,
όταν η διακριτοποίηση αυτή εκλεπτύνεται διαρκώς, παίρνοντας τον αριθμό των
πλεγματικών σημείων
και
, έτσι ώστε το μήκος
να
παραμένει σταθερό. Η καμπύλη
προσεγγίζεται από τις πλεγματικές θέσεις που
αποτελούν το όριο του πλέγματος και πιθανώς από άλλα σημεία στο εσωτερικό στα
οποία η τιμή του δυναμικού είναι δεδομένη. Το φυσικό σύστημα που αντιστοιχεί στο
μοντέλο μας είναι μια διάταξη από αγωγούς στην επιφάνεια των οποίων το
δυναμικό είναι σταθερό και ζητείται το ηλεκτρικό πεδίο που δημιουργείται
στον περιβάλλοντα χώρο τους. Μία τέτοια διάταξη φαίνεται στο σχήμα 7.6.
Για να βρούμε την εξίσωση πεπερασμένων διαφορών που θα προσεγγίζει την εξίσωση (7.10) , θεωρούμε το ανάπτυγμα κατά Taylor:
Παίρνοντας το άθροισμα και των δύο μελών της παραπάνω εξίσωσης, Θεωρώντας τις συντεταγμένες των πλεγματικών σημείων να δίνονται
από ακέραιους τέτοιους, ώστε
και
με
, και παίρνοντας
, έτσι ώστε
και
, η
παραπάνω εξίσωση γίνεται:
![]() | (7.12) |
η οποία έχει την ακόλουθη απλή ερμηνεία: Το δυναμικό στη θέση
είναι απλά ο μέσος όρος του δυναμικού των πλησιέστερων γειτόνων του.
Ο αλγόριθμος που θα ακολουθήσουμε εντάσσεται στη γενική κατηγορία
μεθόδων “χαλάρωσης ” (relaxation methods) και τα βασικά του βήματα
είναι:
Η προσεκτική χρήση του παραπάνω αλγόριθμου απαιτεί να τον μελετήσουμε με διαφορετικά κριτήρια “ικανοποιητικά μικρής ” διαφοράς και διαφορετικές αρχικές συνθήκες.
Παρακάτω, παραθέτουμε πρόγραμμα που χρησιμοποιεί τον παραπάνω αλγόριθμο
για τον υπολογισμό του ηλεκτροστατικού δυναμικού δύο παράλληλων επίπεδων
μεταλλικών αγωγών που βρίσκονται μέσα σε ένα γειωμένο, τετράγωνο, μεταλλικό
αγώγιμο κουτί. Το πλέγμα φαίνεται στο σχήμα 7.6, όπου οι μαύρες κουκκίδες
αναπαριστούν τους αγωγούς. Το κουτί έχει δυναμικό , ενώ οι αγωγοί
δυναμικό
και
αντίστοιχα. Ο χρήστης στην είσοδο δίνει τις τιμές
και
, το μέγεθος
του πλέγματος και την ακρίβεια σύγκλισης που
επιθυμεί. Η τελευταία καθορίζεται ποσοτικά από ένα μικρό αριθμό
. Η
μέγιστη μεταβολή στο δυναμικό ανάμεσα σε δύο διαφορετικά περάσματα του
πλέγματος θα πρέπει να είναι μικρότερη από
για επίτευξη σύγκλισης της
μεθόδου.
Η δομή των δεδομένων είναι απλή. Χρειαζόμαστε ένα πραγματικό array V(L,L) με αποθηκευμένες τις τιμές του δυναμικού και ένα logical array isConductor(L,L) το οποίο καθορίζει αν μια πλεγματική θέση έχει καθορισμένο δυναμικό (“αγωγός ” = .TRUE.) ή όχι (“κενός χώρος ” = .FALSE.).
Το κυρίως πρόγραμμα, αφού διαβάσει τα δεδομένα από το χρήστη, καλεί τρεις υπορουτίνες:
΄Ολο το πρόγραμμα ακολουθεί παρακάτω:
Το παραπάνω πρόγραμμα το αποθηκεύουμε στο αρχείο LaplaceEq.f90. Η μεταγλώττιση του προγράμματος γίνεται με τον μεταγλωττιστή gfortran και για να το τρέξουμε δίνουμε τις εντολές:
Το πρόγραμμα κάνει 112 περάσματα στο πλέγμα μέχρι το μέγιστο σφάλμα να γίνει 0.00958048937 < 0.01. Τα αποτελέσματα αποθηκεύονται στο αρχείο data. Για να δούμε τα αποτελέσματα χρησιμοποιούμε το πρόγραμμα gnuplot:
Τα αποτελέσματα φαίνονται στο σχήμα 7.7
Στην παράγραφο αυτή αναφέρουμε περιληπτικά τη λύση του προβλήματος
που μελετήσαμε στις προηγούμενες παραγράφους, όταν υπάρχει κατανομή
στατικού ηλεκτρικού φορτίου που δίνεται από την πυκνότητα φορτίου .
Στην περίπτωση αυτή, η εξίσωση Laplace για το δυναμικό γίνεται η εξίσωση
Poisson:
![]() | (7.13) |
Η μορφή της εξίσωσης στο επίπεδο πλέγμα που μελετήσαμε γίνεται
![]() | (7.14) |
όπου9
, και είναι πάρα πολύ απλό να μετατρέψουμε τον κώδικα της
προηγούμενης παραγράφου, έτσι ώστε να μελετήσουμε κατανομές φορτίου που
επιθυμούμε.
Παρακάτω, παραθέτουμε το πρόγραμμα PoissonEq.f90 που λύνει την (7.14)
για ομοιόμορφη κατανομή του φορτίου (σχήμα 7.10), στο οποίο έχουμε θέσει
. Ο αναγνώστης καλείται να αναπαράγει το σχήμα αυτό, καθώς και τα 7.8,
7.9.
Στη βιβλιογραφία ο παραπάνω αλγόριθμος αναφέρεται ως η μέθοδος Gauss–Seidel.
Χαρακτηρίζεται από το ότι στο δεξί μέλος της εξίσωσης (7.14) χρησιμοποιούμε τις
ήδη ενημερωμένες τιμές για το δυναμικό και ενημερώνουμε αμέσως τη νέα
τιμή
. Μια άλλη μέθοδος είναι η μέθοδος του Jacobi όπου στο δεξί μέλος
χρησιμοποιούμε τις παλιές τιμές του δυναμικού από το προηγούμενο πέρασμα
του πλέγματος. Η μέθοδος Gauss–Seidel υπερέχει της Jacobi ως προς την
ταχύτητα σύγκλισης. Μπορούμε όμως να γενικεύσουμε τη μέθοδο Jacobi
ως εξής. Ορίζουμε το υπολειπόμενο (residual) της εξίσωσης (7.14) να
είναι
![]() | (7.15) |
το οποίο μηδενίζεται, όταν είναι η λύση της (7.14) . Τότε, χρησιμοποιώντας
τα
η μέθοδος Jacobi μπορεί να γραφτεί ως
![]() | (7.16) |
όπου οι ποσότητες με άνω δείκτη αναφέρονται στις τιμές που υπολογίζονται
από τις τιμές που έχει το δυναμικό
στο
-οστό πέρασμα του πλέγματος. Η
μέθοδος “successive overrelaxation” (SOR) δίνεται από τη γενίκευση της παραπάνω
σχέσης:
![]() | (7.17) |
΄Οταν η παράμετρος , έχουμε “underrelaxation” και η μέθοδος συγκλίνει πιο
αργά από τη μέθοδο Jacobi. ΄Οταν
, έχουμε “overrelaxation” και, αν η
μέθοδος συγκλίνει, η κατάλληλη επιλογή της
μπορεί να οδηγήσει σε αισθητή
βελτίωση σε σχέση με τη μέθοδο Jacobi. ΄Οταν
, η SOR αποκλίνει. Η μελέτη
της μεθόδου SOR αφήνεται ως άσκηση στον αναγνώστη.
και φτιάξτε τα αντίστοιχα σχήματα.
για L=31,61,121,241,501 και φτιάξτε τα αντίστοιχα σχήματα. Μεταβάλετε
την ακρίβεια προσδιορισμού της λύσης epsilon=0.1, 0.01, 0.001,
0.0001, 0.00001, 0.000001. Πως εξαρτάται ο αριθμός περασμάτων του
πλέγματος από το epsilon; Φτιάξτε τη γραφική παράσταση
(epsilon)
στην οποία θα τοποθετήσετε τις καμπύλες
(epsilon) για τα διαφορετικά L
που χρησιμοποιήσατε.
Η εξίσωση διάχυσης είναι στενά συνδεδεμένη με τη διαδρομή ενός τυχαίου περιπατητή (random walker). Ας υποθέσουμε ότι μελετάμε την κίνηση ενός τέτοιου σωματίου πάνω στην ευθεία (“μία διάσταση”). Η διαδικασία της κίνησης είναι στοχαστική και η συνάρτηση (“πυρήνας”)
![]() | (8.1) |
ερμηνεύεται ως η πυκνότητα πιθανότητας τη χρονική στιγμή να παρατηρηθεί το
σωμάτιο στη θέση
αν τη χρονική στιγμή
το σωμάτιο βρίσκεται στη θέση
. Η εξίσωση που καθορίζει το
είναι η
![]() | (8.2) |
που είναι η εξίσωση διάχυσης. Ο συντελεστής διάχυσης μπορεί να καθοριστεί
από τις λεπτομέρειες του συστήματος που μελετάμε. Για την κίνηση Brown ενός
σωματιδίου σκόνης μέσα σε ένα υγρό, το οποίο κινείται με την επίδραση των
τυχαίων θερμικών κρούσεων με τα μόρια του υγρού παίρνουμε
,
όπου
είναι η απόλυτη θερμοκρασία του υγρού,
ο συντελεστής
τριβής1
του σωματιδίου μέσα στο υγρό και
είναι η σταθερά του Boltzmann.
Συνήθως επιλέγουμε για αρχικές συνθήκες () το σωμάτιο να είναι εντοπισμένο σε ένα
σημείο
, δηλ.2
![]() | (8.3) |
Η ερμηνεία της ως συνάρτηση πυκνότητας
πιθανότητας συνεπάγεται ότι για κάθε
θα πρέπει να
έχουμε3
![]() | (8.4) |
Αυτή η σχέση δεν είναι προφανές ότι μπορεί να ισχύει για κάθε χρονική στιγμή.
Ακόμα και αν την επιβάλλουμε για , η χρονική εξέλιξη που καθορίζεται από
την (8.2) μπορεί να την αλλάξει σε μεγαλύτερους χρόνους.
Αυτό είναι εύκολο να αναλυθεί. Αν επιβάλλουμε την (8.4) όταν , η
συνθήκη θα ισχύει για κάθε χρονική στιγμή αν
![]() | (8.5) |
Λαμβάνοντας υπόψη ότι
και ότι
παίρνουμε
Η προσεκτική ανάλυση της εξίσωσης (8.2) δίνει ότι, για μικρούς χρόνους, η
ασυμπτωτική συμπεριφορά του είναι
![]() | (8.7) |
Η σχέση αυτή δείχνει πως η διάχυση είναι ισότροπη (ίδια προς όλες τις κατευθύνσεις) και η πιθανότητα ανίχνευσης ελαττώνεται δραστικά με την απόσταση από την αρχική θέση του σωματιδίου. Αυτή η σχέση δεν μπορεί να ισχύει για πάντα, αφού για αρκετά μεγάλους χρόνους το σωμάτιο κατανέμεται ομοιόμορφα μέσα στο χώρο4 .
Η πιθανότητα επιστροφής του σωματιδίου στην αρχική του θέση ορίζεται να είναι
![]() | (8.8) |
που ορίζει τη φασματική διάσταση του χώρου. Στην περίπτωση που μελετάμε
.
Η μέση τιμή του τετραγώνου της απόστασης από την αρχή των
αξόνων που βρίσκεται το σωματίδιο σε χρόνο είναι εύκολο να
υπολογιστεί5
![]() | (8.9) |
Η τελευταία σχέση είναι πολύ σημαντική. Μας λέει πως η κίνηση του τυχαίου
περιπατητή (κίνηση Brown) δεν μπορεί να έχει κλασική περιγραφή αλλά μόνο
στοχαστική: Για ένα κλασικό σωμάτιο που κινείται πάνω σε μια ομαλή τροχιά
άρα
.
Στα επόμενα κεφάλαια, για απλότητα
παίρνουμε6
και ορίζουμε
![]() | (8.10) |
΄Εστω μια λεπτή ευθύγραμμη ράβδος μήκους και
η κατανομή της
θερμοκρασίας της τη χρονική στιγμή
, και έστω ότι τα άκρα της τα κρατάμε σε
σταθερή θερμοκρασία
. Αν η αρχική κατανομή της
θερμοκρασίας είναι
, η θερμοκρασία σε κάθε άλλη χρονική στιγμή
προσδιορίζεται από την εξίσωση διάχυσης
![]() | (8.11) |
όπου ο θερμικός συντελεστής διάχυσης (thermal diffusivity),
η
θερμική αγωγιμότητα ,
η πυκνότητα και
η ειδική θερμότητα της
ράβδου.
Ορίζουμε
![]() | (8.12) |
όπου . Με τον ορισμό αυτό, η συνάρτηση
είναι καθαρός αριθμός
(αδιάστατη) και εκφράζει το κλάσμα της διαφοράς θερμοκρασίας σε σχέση με αυτής
των άκρων της ράβδου και
![]() | (8.13) |
Αυτές λέγονται συνοριακές συνθήκες τύπου Dirichlet7
Η (8.11) γίνεται
![]() | (8.14) |
Η σχέση (8.6) γίνεται
![]() | (8.15) |
Η παραπάνω σχέση δεν μπορεί να δίνει πάντα 0 λόγω των συνοριακών συνθηκών (8.13) . Αυτό μπορούμε να το δούμε με ένα παράδειγμα. ΄Εστω
![]() | (8.16) |
τότε μπορείτε εύκολα να επιβεβαιώσετε ότι ικανοποιούνται οι απαιτούμενες συνοριακές συνθήκες και ότι η συνάρτηση
![]() | (8.17) |
είναι η ζητούμενη λύση της εξίσωσης διάχυσης που ικανοποιεί επίσης τις συνοριακές συνθήκες. Είναι εύκολο να διαπιστώσετε ότι το
Η εκθετική πτώση του μέτρου της είναι σε συμφωνία με την φυσική
απαίτηση ότι η ράβδος σε αρκετά μεγάλο χρόνο θα έχει ομοιόμορφη θερμοκρασία,
ίση με αυτή που επιβάλαμε στα άκρα της (
).
Η αριθμητική λύση της εξίσωσης (8.14) θα αναζητηθεί στο διάστημα και
. Το πρόβλημα πρέπει να οριστεί πάνω σε ένα διακριτό πλέγμα και η
διαφορική εξίσωση να προσεγγιστεί από αλγεβρικές εξισώσεις πεπερασμένων
διαφορών.
Το πλέγμα ορίζεται από χωρικά σημεία
![]() | (8.18) |
όπου τα διαστήματα έχουν σταθερό πλάτος
![]() | (8.19) |
και από χρονικά πλεγματικά σημεία
![]() | (8.20) |
όπου τα διαστήματα έχουν σταθερό πλάτος
![]() | (8.21) |
Σημειώνουμε ότι τα άκρα των διαστημάτων αντιστοιχούν στα
![]() | (8.22) |
Η συνάρτηση προσεγγίζεται από τις τιμές της πάνω στο διακριτό
πλέγμα
![]() | (8.23) |
Οι παράγωγοι διακριτοποιούνται σύμφωνα με τις σχέσεις
![]() | (8.24) |
Εξισώνοντας τα δύο μέλη των παραπάνω σχέσεων σύμφωνα με την (8.14) , παίρνουμε τη δυναμική εξέλιξη της
![]() | (8.26) |
Αυτή είναι μια επαγωγική σχέση ενός βήματος ως προς το χρόνο. Αυτό είναι πολύ
σημαντικό γιατί δε χρειάζεται στο πρόγραμμα να αποθηκεύσουμε στη μνήμη τις τιμές
για κάθε
.
Ο δεύτερος όρος της “δεύτερης παραγώγου” στην (8.26) περιέχει μόνο
τους πλησιέστερους γείτονες κάθε πλεγματικού σημείου
μιας
χρονικής φέτας
του πλέγματος, άρα μπορεί να χρησιμοποιηθεί για κάθε
. Για τα σημεία
και
δε χρειάζεται να
χρησιμοποιηθούν οι σχέσεις (8.26) , αφού κρατάμε τις τιμές
αμετάβλητες.
Τέλος, η παράμετρος
![]() | (8.27) |
είναι αυτή που καθορίζει τη χρονική εξέλιξη στον αλγόριθμο. Ονομάζεται παράμετρος του Courant και για να έχουμε χρονική εξέλιξη χωρίς να παρουσιάζονται γρήγορα αστάθειες, θα πρέπει
![]() | (8.28) |
Αυτό είναι κάτι που εμείς θα το ελέγξουμε εμπειρικά με την αριθμητική ανάλυση που θα κάνουμε.
Τα μόνα σημεία που τονίζουμε σχετικά με το σχεδιασμό του προγράμματος είναι ότι
η σχέση (8.26) είναι μια επαγωγική σχέση ενός βήματος ως προς το χρόνο. ΄Αρα,
σε κάθε χρονικό βήμα αρκεί να αποθηκεύσουμε σε ένα array τις τιμές του δεύτερου
όρου (τη “δεύτερη παράγωγο”) και να το χρησιμοποιήσουμε για να ενημερώσουμε
τις νέες τιμές της συνάρτησης . ΄Αρα, στην επαναλαμβανόμενη διαδικασία (8.26)
υπολογισμού της
από την
αρκεί να χρησιμοποιήσουμε μονάχα ένα array
,
και ένα
,
που δίνουν τις αντίστοιχες
τιμές της
και
τη χρονική στιγμή
αντίστοιχα. Στο παρακάτω πρόγραμμα αυτά κωδικοποιούνται στα arrays u(P) και
d2udx2(P).
Τα χρήσιμα δεδομένα βρίσκονται στις θέσεις u(1) ... u(Nx) d2udx2(1) ... d2udx2(Nx) και η παράμετρος P επιλέγεται αρκετά μεγάλη, ώστε οι τιμές του Nx που θα μελετηθούν να είναι πάντα μικρότερες.
Ο χρήστης δίνει στην είσοδο τις τιμές Nx,
Nt,
tf. Οι τιμές
,
και
courant υπολογίζονται στα αρχικά στάδια του
προγράμματος.
Στην έξοδο παίρνουμε το αρχείο d.dat που περιέχει σε στήλες τις τιμές
. ΄Οταν τελειώνει μια χρονική φέτα
, το πρόγραμμα τυπώνει μια κενή
γραμμή, έτσι ώστε το gnuplot να κάνει αμέσως την τρισδιάστατη γραφική
παράσταση.
Το πρόγραμμα μπορεί να βρεθεί στο αρχείο diffusion.f90 στο συνοδευτικό λογισμικό και ο κώδικας που περιέχει δίνεται παρακάτω:
Αρχικά γίνεται η μεταγλώττιση και το τρέξιμο του προγράμματος
Στη δεύτερη σειρά, εισάγουμε στο stdin του προγράμματος τις τιμές Nx=10, Nt=100, tf= 0.4 από το stdout της εντολής echo. Οι επόμενες γραμμές είναι το output του προγράμματος.
Στη συνέχεια, μπορούμε να κάνουμε μια τρισδιάστατη γραφική αναπαράσταση της
με τη βοήθεια του gnuplot:
Στη συνέχεια, θέλουμε να δούμε τη συνάρτηση ως συνάρτηση του
για δεδομένες τιμές του χρόνου. Παρατηρούμε ότι ο χρόνος αλλάζει κάθε φορά που
συναντάμε μια κενή γραμμή στο αρχείο d.dat. Το παρακάτω πρόγραμμα awk μετράει
τις κενές γραμμές και τυπώνει μόνο εκείνη που εμείς επιθυμούμε. Ο μετρητής n=0,
1, ..., Nt-1 μπορεί να καθορίσει την τιμή του
. Τα αποτελέσματα τα
σώζουμε σε ένα αρχείο tj το οποίο μπορούμε να το δούμε με το gnuplot.
Επαναλαμβάνουμε όσες φορές χρειάζεται:
Την παραπάνω εργασία μπορούμε να την κάνουμε χωρίς τη δημιουργία ενδιάμεσων αρχείων tj χρησιμοποιώντας το φίλτρο της awk μέσα από το gnuplot. ΄Ετσι, για παράδειγμα, οι εντολές
τρέχουν το πρόγραμμα για Nx=10, Nt=800, tf= 2 και παράγουν το σχήμα 8.2
Στη συνέχεια είναι ενδιαφέρον να συγκρίνει κανείς τα αποτελέσματα του με την
ακριβή λύση . ΄Ενας τρόπος να γίνει είναι να ορίσουμε το
σχετικό σφάλμα
Τα αποτελέσματα μπορούμε να τα δούμε στο σχήμα 8.3.
Για να μελετήσουμε τον πυρήνα στο πρόβλημα της διάχυσης ή των
τυχαίων διαδρομών, πρέπει να επιβάλλουμε τη συνθήκη κανονικοποίησης (8.4) για
κάθε χρονική στιγμή. Στην περίπτωση της
ορισμένης για
η
σχέση γίνεται
![]() | (8.29) |
η οποία για να ισχύει για κάθε χρονική στιγμή είναι αναγκαίο το δεξί μέλος της
(8.15) να είναι 0. ΄Ενας τρόπος να επιβάλλουμε αυτή τη συνθήκη είναι να
θεωρήσουμε το πρόβλημα της διάχυσης πάνω στον κύκλο. Αν παραμετροποιήσουμε
τα σημεία του κύκλου με τη μεταβλητή , τότε τα σημεία
και
ταυτίζονται και έχουμε
![]() | (8.30) |
Η δεύτερη από τις παραπάνω σχέσεις μηδενίζει το δεξί μέλος της (8.15) με
αποτέλεσμα, αν θέσουμε , να έχουμε
,
.
Με τις παραπάνω παραδοχές, η διακριτοποίηση της διαφορικής εξίσωσης γίνεται
ακριβώς όπως και στο πρόβλημα της απαγωγής της θερμότητας. Αντί τώρα να
κρατάμε τις τιμές σταθερές, θα εφαρμόσουμε την εξίσωση
δυναμικής εξέλιξης (8.26) και για τα σημεία
,
αφού πάνω στον κύκλο
αυτά τα σημεία δεν ξεχωρίζουν από τα υπόλοιπα. Για να λάβουμε υπόψη την κυκλική
τοπολογία αρκεί να πάρουμε
![]() | (8.31) |
και
![]() | (8.32) |
αφού ο γείτονας εκ “δεξιών” του σημείου είναι το σημείο
και ο γείτονας
εξ “αριστερών” του σημείου
είναι το σημείο
. Για τα υπόλοιπα σημεία
η σχέση (8.26) εφαρμόζεται κανονικά.
Το πρόγραμμα που κωδικοποιεί το παραπάνω πρόβλημα δίνεται παρακάτω και βρίσκεται στο αρχείο diffusionS1.f90. H επιβολή των συνοριακών συνθηκών (8.30) γίνεται στις γραμμές
Οι αρχικές συνθήκες τη χρονική στιγμή επιλέγονται έτσι, ώστε να είναι
το σωμάτιο στη θέση
. Σε κάθε χρονική στιγμή γίνονται μετρήσεις με σκοπό
να επαληθευτούν οι εξισώσεις (8.4) , (8.9) και το γεγονός ότι
σταθ.
Η μεταβλητή prob και ελέγχεται αν διατηρεί την αρχική της τιμή
που είναι ίση με 1.
Η μεταβλητή r2 είναι η διακριτή εκτίμηση της μέσης
τιμής του τετραγώνου της απόστασης από την αρχική θέση η οποία για αρκετά
μικρούς χρόνους θα πρέπει να ακολουθεί το νόμο που δίνει η εξίσωση (8.9)
.
Οι παραπάνω μεταβλητές αποθηκεύονται στο αρχείο e.dat μαζί με τις τιμές
,
και
. Οι τελευταίες ελέγχονται αν μετά από αρκετά μεγάλο
χρόνο αποκτούν την ίδια σταθερή τιμή, σύμφωνα με το αναμενόμενο αποτέλεσμα
σταθ.
΄Ολος ο πηγαίος κώδικας είναι:
Το πρόγραμμα αποθηκεύει στο αρχείο e.dat για κάθε χρονική στιγμή τις ποσότητες
![]() | (8.33) |
που είναι ο διακριτός εκτιμητής της (8.29) και περιμένουμε να παίρνουμε
για κάθε τιμή του
,
![]() | (8.34) |
που είναι ο διακριτός εκτιμητής της (8.9) και περιμένουμε για μικρούς χρόνους να ισχύει
![]() | (8.35) |
καθώς και τις τιμές ,
,
.
Οι τιμές ,
,
,
,
,
βρίσκονται αντίστοιχα στις
στήλες 2, 3, 4, 5, 6 και 7 του αρχείου e.dat. Ξεκινάμε το gnuplot και μέσα από
αυτό δίνουμε τις εντολές
που ορίζουν τις τιμές ,
,
,
,
,
.
Με τις εντολές
φτιάχνουμε το σχήμα 8.4 από όπου βλέπουμε την ομοιόμορφη κατανομή της διάχυσης για αρκετά μεγάλους χρόνους.
Η σχέση επιβεβαιώνεται με απλό κοίταγμα στο αρχείο e.dat.
Η ασυμπτωτική σχέση επιβεβαιώνεται με τις εντολές
που μας δίνει το σχήμα 8.5.
Τέλος, κάνουμε μια επισκόπηση της συνάρτησης με τις εντολές
και το αποτέλεσμα φαίνεται στο σχήμα 8.6.
ϒπόδειξη: Να κάνετε το πρόγραμμά σας να τυπώνει μόνο την τελική κατανομή
της θερμοκρασίας .
Για τον υπολογισμό των ιδιοτιμών θα χρησιμοποιήσουμε τις υπορουτίνες που βρίσκουμε στην βιβλιοθήκη LAPACK. Το κεφάλαιο αυτό, εκτός των άλλων, θα είναι και μια άσκηση για το πώς να συνδέουμε το πρόγραμμά μας με προγράμματα που βρίσκονται σε βιβλιοθήκες λογισμικού. Για να λύσετε το ίδιο πρόβλημα με Mathematica ή Matlab δείτε τις αναφορές [39] και [40] αντίστοιχα.
Η Χαμιλτονιανή του αρμονικού ταλαντωτή δίνεται από τη σχέση:
![]() | (9.1) |
και ορίζοντας ,
παίρνουμε την εξίσωση αδιάστατων
μεγεθών:
![]() | (9.2) |
Μετρώντας την ενέργεια σε μονάδες , τις αποστάσεις σε μονάδες
και τις
ορμές σε μονάδες
παίρνουμε
![]() | (9.3) |
Ο τελεστής μπορεί να διαγωνιοποιηθεί εύκολα με τη βοήθεια των τελεστών
δημιουργίας/καταστροφής:
![]() | (9.4) |
ή
![]() | (9.5) |
που ικανοποιούν τη σχέση μετάθεσης
![]() | (9.6) |
και τότε
![]() | (9.7) |
Οι ιδιοκαταστάσεις ,
της
καλύπτουν τον χώρο Hilbert
και ικανοποιούν τις σχέσεις
![]() | (9.8) |
οπότε
![]() | (9.9) |
και
![]() | (9.10) |
Η αναπαράσταση θέσης των ιδιοκαταστάσεων είναι:
![]() | (9.11) |
όπου τα πολυώνυμα Hermite.
Από τις σχέσεις (9.4) , (9.8) προκύπτει ότι
Από την παραπάνω σχέση μπορούμε εύκολα να υπολογίσουμε την Χαμιλτονιανή του αναρμονικού ταλαντωτή
![]() | (9.15) |
και τα στοιχεία του πίνακα αναπαράστασης στον :
![]() | (9.18) |
Το πρόβλημα εύρεσης του ενεργειακού φάσματος ανάγεται στον υπολογισμό των
ιδιοτιμών του πίνακα .
Αρχικά επιλέγουμε τη διάσταση του υπόχωρου
του χώρου Hilbert
των καταστάσεων στον οποίο θα περιοριστούμε. Χρησιμοποιούμε τις σχέσεις που
αναφέραμε στην προηγούμενη παράγραφο για να υπολογίσουμε τους πίνακες
αναπαράστασης των τελεστών
,
,
μέσα σε αυτόν τον υπόχωρο. Για
παράδειγμα, όταν
έχουμε:
![]() | (9.19) |
![]() | (9.20) |
![]() | (9.21) |
Σκοπός μας είναι να γράψουμε ένα πρόγραμμα που θα υπολογίζει τις ιδιοτιμές
του
πίνακα
. Αντί, όμως, να γράψουμε το δικό μας
κώδικα για τον υπολογισμό των ιδιοτιμών και ιδιοδιανυσμάτων των πινάκων που
μας ενδιαφέρουν θα χρησιμοποιήσουμε τις έτοιμες ρουτίνες που υπάρχουν
στη βιβλιοθήκη LAPACK. Η βιβλιοθήκη αυτή υπάρχει στον δικτυακό τόπο
http://www.netlib.org/lapack/ και λεπτομέρειες για τη χρήση της μπορούν να
βρεθούν στο
http://www.netlib.org/lapack/lug/. Επισκεφτείτε το δικτυακό τόπο και αναζητήστε ρουτίνες
που σας ενδιαφέρουν1 .
Ως απλοί, άπειροι χρήστες, θα αναζητήσουμε “ρουτίνες οδηγούς” (driver routines) που κάνουν μια εργασία διαγωνιοποίησης. ΄Εχουμε να διαγωνιοποιήσουμε έναν πίνακα συμμετρικό και διαλέγουμε τη ρουτίνα DSYEV (D = double precision, SY = symmetric, EV = eigenvalues with optional eigenvectors). Οι συναρτήσεις της LAPACK έχουν βοήθεια online από τα man pages του συστήματος (Unix/Linux). Η εντολή που δίνουμε είναι η
Από εκεί μαθαίνουμε ότι η χρήση της είναι:
Σελίδες όπως τις παραπάνω, τις διαβάζουμε αναζητώντας τα δεδομένα που
πρέπει να δώσουμε στην είσοδο στην υπορουτίνα που μας ενδιαφέρει και τα
δεδομένα που θα πάρουμε στην έξοδο με την πληροφορία που θέλουμε να
χρησιμοποιήσουμε. Μαθαίνουμε πως ο προς διαγωνιοποίηση πίνακας A έχει
αριθμό γραμμών και στηλών που είναι . Ο αριθμός των γραμμών
LDA (LDA= “leading dimension of A”) μπορεί να είναι μεγαλύτερος από
N και η DSYEV θα διαγωνιοποιήσει το πάνω αριστερά N
N κομμάτι του
πίνακα2 .
Αυτό θα το χρησιμοποιήσουμε προς όφελός μας, έτσι ώστε να ορίσουμε ένα πίνακα
μεγάλου μεγέθους A(LDA,LDA) διαγωνιοποιώντας κάθε φορά μεταβλητού μεγέθους
τετράγωνο κομμάτι του A(N,N). Η υπορουτίνα μπορεί να χρησιμοποιηθεί με δύο
τρόπους:
Κάτι άλλο που μπορεί να προκαλέσει απορίες είναι η χρήση του array WORK. Αυτός είναι βοηθητικός χώρος στη μνήμη που δίνεται στην DSYEV για να μπορέσει να κάνει τους ενδιάμεσους υπολογισμούς. Αυτό είναι ένα array μεγέθους LWORK και η επιλογή του LWORK δεν είναι μοναδική. Εμείς θα επιλέξουμε την απλή περίπτωση LWORK=3*LDA-1. Η μεταβλητή INFO είναι η “σημαία” για τον αν εξελίχθηκε ο υπολογισμός ομαλά και στο πρόγραμμα ελέγχουμε αν η τιμή της είναι 0 και αν όχι, σταματάμε το πρόγραμμα.
Για την κατανόηση της χρήσης ενός προγράμματος μιας βιβλιοθήκης είναι πάντα απαραίτητο να γράφουμε ένα δοκιμαστικό πρόγραμμα που να το χρησιμοποιεί και του οποίου τα αποτελέσματα μπορούμε εύκολα να ελέγξουμε. Οδηγούμαστε λοιπόν στο να γράψουμε τον εξής κώδικα για να δοκιμάσουμε τη χρήση της DSYEV σε ένα πίνακα A(N,N):
Το επόμενο βήμα είναι να μεταγλωττίσουμε τον κώδικα. Το σημείο που πρέπει να προσέξουμε είναι ότι στο στάδιο της σύνδεσης (linking) πρέπει να δώσουμε οδηγίες στον linker ld πού βρίσκονται οι βιβλιοθήκες LAPACK και η BLAS (οι βασικές υπολογιστικές ρουτίνας γραμμικής άλγεβρας είναι στην BLAS). ΄Ολες οι συναρτήσεις είναι μεταγλωττισμένες και τα object files τους είναι αρχειοθετημένα στα αρχεία liblapack.a libblas.a που μπορούμε να αναζητήσουμε με τις εντολές:
Για να δούμε τα περιεχόμενά τους δίνουμε τις εντολές3 :
(ή αντικαθιστούμε το /usr/lib με τη διαδρομή που αντιστοιχεί στο σύστημά μας). Αν ο κώδικάς μας είναι στο αρχείο test.f90 για τη μεταγλώττιση δίνουμε την εντολή:
Η επιλογή -L/usr/lib λέει στον linker να αναζητήσει τις βιβλιοθήκες στο /usr/lib4 , ενώ οι -llapack -lblas του λένε να αναζητήσει όποια σύμβολα5 δεν έχουν ξεκαθαριστεί κατά τη μεταγλώττιση του αρχείου test.f90 πρώτα στη βιβλιοθήκη liblapack.a και μετά στην libblas.a
Η παραπάνω εντολή έχει ως αποτέλεσμα το εκτελέσιμο αρχείο test που, όταν το τρέξουμε, παίρνουμε το αποτέλεσμα:
Τώρα είμαστε έτοιμοι να λύσουμε το πρόβλημα του αναρμονικού ταλαντωτή. Το
πρόγραμμα βρίσκεται στο συνοδευτικό λογισμικό στο αρχείο anharmonic.f90. Στην
κύρια ρουτίνα του προγράμματος ο χρήστης εισάγει τις βασικές παραμέτρους, τη
διάσταση DIM του
και την τιμή του
για την οποία επιθυμεί να
υπολογιστούν οι ιδιοτιμές
του πίνακα αναπαράστασης
του
τελεστή
στην
αναπαράσταση στον
. Το πρόγραμμα
καλεί την υπορουτίνα calculate_X4 για να υπολογίσει τον
πίνακα
αναπαράστασης
του τελεστή
. Ο υπολογισμός στην υπορουτίνα αυτή
μπορεί να γίνει γρηγορότερα υπολογίζοντας τα
αναλυτικά. Αυτό αφήνεται
ως άσκηση στον αναγνώστη. Στη συνέχεια, υπολογίζονται οι ιδιοτιμές του
καλώντας την υπορουτίνα calculate_evs και τα αποτελέσματα τυπώνονται στο
stdout (standard output).
Η υπορουτίνα calculate_evs καλεί την calculate_H να υπολογίσει τον πίνακα
η οποία κάνει χρήση των σχέσεων (9.16) . Στη συνέχεια, καλείται η
DSYEV της LAPACK να κάνει τη διαγωνιοποίηση. Προσέχουμε στο όρισμα LDA της
DSYEV να βάλουμε τη σωστή διάσταση του πίνακα H που είναι P και όχι DIM. Στη
συνέχεια, παρατίθεται ο κώδικας:
Για να τρέξουμε το πρόγραμμα, μεταγλωττίζουμε και δίνουμε τα δεδομένα στο πρόγραμμα
όπου παραπάνω τρέξαμε το πρόγραμμα για και
. Αυτό αντιστοιχεί
στον απλό αρμονικό ταλαντωτή και βλέπουμε πως παίρνουμε τις αναμενόμενες
λύσεις:
,
και οι ιδιοκαταστάσεις
(ιδιοδιανύσματα του
)
. Ανάλογα αποτελέσματα
θα πάρουμε και για μεγαλύτερα
.
Για μη μηδενικές τιμές του , ο υπολογισμός για πεπερασμένο
ενέχει
συστηματικά σφάλματα, επειδή αγνοούνται όλα τα στοιχεία του πίνακα
για
ή
. Το πρόγραμμά μας υπολογίζει τις ιδιοτιμές
του πεπερασμένου πίνακα
,
και αναμένεται
ότι
![]() | (9.22) |
όπου
![]() | (9.23) |
είναι η πραγματική ιδιοτιμή της Χαμιλτονιανής . Στην πράξη, το όριο 9.22 για
δεδομένα
και
υπολογίζεται από τις αριθμητικές τιμές
για ολοένα
και μεγαλύτερες τιμές του
. Αν επιτευχθεί σύγκλιση σε ένα επιθυμητό επίπεδο
για τις τιμές του
που είναι εφικτές, τότε το όριο είναι μια προσέγγιση στην
. Η διαδικασία αυτή δείχνεται γραφικά στα σχήματα 9.1-9.3 για
.
Η σύγκλιση είναι ικανοποιητική για αρκετά μικρά
για
, αλλά για
είναι αναγκαίοι υπολογισμοί σε μεγαλύτερες τιμές του
. Η αύξηση
του
για δεδομένο
κάνει αναγκαία την πρόσβαση με μεγαλύτερες
τιμές του
. Για δεδομένο ενεργειακό επίπεδο
, η αύξηση του
κάνει
επίσης αναγκαίο τον υπολογισμό σε μεγαλύτερα
. Μια πλήρης συνεδρία
υπολογισμού της ενέργειας της θεμελιώδους κατάστασης
παρατίθεται
παρακάτω6 :
Περαιτέρω αυτοματοποίηση της διαδικασίας μπορεί να βρεθεί στο σενάριο φλοιού
anharmonic.csh στο συνοδευτικό λογισμικό. Παρατηρήστε τη σύγκλιση για μεγάλο
της ιδιοτιμής
και ότι τελικά παίρνουμε
. Αν
είναι επιθυμητή η επίτευξη μεγαλύτερης ακρίβειας, τότε είναι αναγκαίο να γίνουν
υπολογισμοί σε μεγαλύτερα
.
Είναι, επίσης, δυνατόν να υπολογίσουμε τις αναμενόμενες τιμές ενός
τελεστή
, όταν ο αναρμονικός ταλαντωτής βρίσκεται στην κατάσταση
:
![]() | (9.24) |
Στην πράξη, η αναμενόμενη τιμή θα υπολογιστεί από το όριο
![]() | (9.25) |
όπου είναι τα ιδιοδιανύσματα του πεπερασμένου
πίνακα
τα οποία υπολογίζονται αριθμητικά από την DSYEV. Αυτά καθορίζονται από τις
συνιστώσες τους
, όπου
![]() | (9.26) |
οι οποίες αποθηκεύονται στο array H, αφού επιστρέψει η DSYEV:
![]() | (9.27) |
Αντικαθιστώντας την εξίσωση (9.26) στην (9.24) , παίρνουμε
![]() | (9.28) |
και μπορούμε να χρησιμοποιήσουμε την (9.27) στον υπολογισμό του αθροίσματος.
Τα παραπάνω θα τα εφαρμόσουμε στον υπολογισμό των αναμενόμενων τιμών των
τελεστών ,
και
. Λαμβάνοντας υπόψη ότι
,
παίρνουμε και για τις αβεβαιότητες
και
. Από αυτές μπορούμε να υπολογίσουμε και το γινόμενο των
αβεβαιοτήτων που θα πρέπει να ικανοποιεί τη σχέση αβεβαιότητας του Heisenberg
. Τα αποτελέσματα παρουσιάζονται στον πίνακα 9.1 και στα
σχήματα 9.4-9.5 και ο υπολογισμός αφήνεται ως άσκηση για τον αναγνώστη.
![]() | ![]() | |||||
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
0 | 0.305814 | 0.826297 | 0.502686 | 0.21223 | 1.19801 | 0.504236 |
1 | 0.801251 | 2.83212 | 1.5064 | 0.540792 | 4.21023 | 1.50893 |
2 | 1.15544 | 5.38489 | 2.49438 | 0.761156 | 8.15146 | 2.49089 |
3 | 1.46752 | 8.28203 | 3.48627 | 0.958233 | 12.6504 | 3.48166 |
4 | 1.75094 | 11.4547 | 4.47845 | 1.13698 | 17.596 | 4.47285 |
5 | 2.01407 | 14.8603 | 5.47079 | 1.30291 | 22.9179 | 5.46443 |
6 | 2.2617 | 18.4697 | 6.4632 | 1.45905 | 28.5683 | 6.45619 |
7 | 2.49696 | 22.2616 | 7.45562 | 1.60735 | 34.5124 | 7.44805 |
8 | 2.72198 | 26.2196 | 8.44804 | 1.74919 | 40.7234 | 8.43998 |
9 | 2.93836 | 30.3306 | 9.44045 | 1.88558 | 47.1801 | 9.43194 |
Τέλος, θα προσπαθήσουμε να καταλάβουμε καλύτερα τη φυσική του αναρμονικού
ταλαντωτή μελετώντας τις ιδιότητες του φάσματός του, καθώς . ΄Οπως
παρατηρούμε στο σχήμα 9.5, καθώς μεγαλώνει το
, ο όρος
επικρατεί και η
αναμενόμενη τιμή
ελαττώνεται, άρα ευνοούνται καταστάσεις που
περιορίζουν τον ταλαντωτή σε μικρότερη περιοχή του χώρου. Από την αρχή της
αβεβαιότητας συμπεραίνουμε ότι η τυπική ορμή του ταλαντωτή θα αυξάνει κατά
μέτρο. Αυτό επιβεβαιώνεται από το σχήμα 9.5 όπου βλέπουμε την αναμενόμενη τιμή
να αυξάνει με το
. Για να δούμε ποσοτικά το αποτέλεσμα των
ανταγωνιστικών αυτών τάσεων θα χρησιμοποιήσουμε ένα απλό επιχείρημα
βάθμισης του Symanzik. Στη Χαμιλτονιανή
επαναορίζουμε
(άρα και
) και για
αρκετά μεγάλο
παίρνουμε7
την ασυμπτωτική συμπεριφορά
![]() | (9.29) |
όπου είναι η Χαμιλτονιανή του αναρμονικού “ταλαντωτή” με
. Εφόσον ο τελεστής
είναι ανεξάρτητος του
, το ενεργειακό φάσμα
θα έχει την ασυμπτωτική συμπεριφορά
![]() | (9.30) |
Στην εργασία [41] δείχνεται ότι για ισχύει ότι
![]() | (9.31) |
με ακρίβεια καλύτερη από ένα μέρος στα . Για μεγάλες τιμές του
, στην ίδια
εργασία υπολογίζεται η ασυμπτωτική συμπεριφορά
![]() | (9.32) |
όπου
. Η σχέση αυτή εξετάζεται στο σχήμα
9.6 όπου βρίσκουμε ικανοποιητική συμφωνία με τους υπολογισμούς μας.
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
0.002 | 0.501 489 66 | 1.507 419 39 | 2.519 202 12 | 3.536 744 13 | 4.559 955 56 |
0.006 | 0.504 409 71 | 1.521 805 65 | 2.555 972 30 | 3.606 186 33 | 4.671 800 37 |
0.01 | 0.507 256 20 | 1.535 648 28 | 2.590 845 80 | 3.671 094 94 | 4.774 913 12 |
0.05 | 0.532 642 75 | 1.653 436 01 | 2.873 979 63 | 4.176 338 91 | 5.549 297 81 |
0.1 | 0.559 146 33 | 1.769 502 64 | 3.138 624 31 | 4.628 882 81 | 6.220 300 90 |
0.3 | 0.637 991 78 | 2.094 641 99 | 3.844 782 65 | 5.796 573 63 | 7.911 752 73 |
0.5 | 0.696 175 82 | 2.324 406 35 | 4.327 524 98 | 6.578 401 95 | 9.028 778 72 |
0.7 | 0.743 903 50 | 2.509 228 10 | 4.710 328 10 | 7.193 265 28 | 9.902 610 70 |
1 | 0.803 770 65 | 2.737 892 27 | 5.179 291 69 | 7.942 403 99 | 10.963 5831 |
2 | 0.951 568 47 | 3.292 867 82 | 6.303 880 57 | 9.727 323 19 | 13.481 2759 |
50 | 2.499 708 77 | 8.915 096 36 | 17.436 9921 | 27.192 6458 | 37.938 5022 |
200 | 3.930 931 34 | 14.059 2268 | 27.551 4347 | 43.005 2709 | 60.033 9933 |
1000 | 3.694 220 85 | 23.972 2061 | 47.017 3387 | 73.419 1140 | 102.516 157 |
8000 | 13.366 9076 | 47.890 7687 | 93.960 6046 | 146.745 512 | 204.922 711 |
20000 | 18.137 2291 | 64.986 6757 | 127.508 839 | 199.145 124 | 278.100 238 |
![]() | ![]() | ![]() | ![]() | ![]() | |
0.002 | 5.588 750 05 | 6.623 044 60 | 7.662 759 33 | 8.707 817 30 | |
0.006 | 5.752 230 87 | 6.846 948 47 | 7.955 470 29 | 9.077 353 66 | |
0.01 | 5.901 026 67 | 7.048 326 88 | 8.215 837 81 | 9.402 692 31 | |
0.05 | 6.984 963 10 | 8.477 397 34 | 10.021 9318 | 11.614 7761 | |
0.1 | 7.899 767 23 | 9.657 839 99 | 11.487 3156 | 13.378 9698 | |
0.3 | 10.166 4889 | 12.544 2587 | 15.032 7713 | 17.622 4482 | |
0.5 | 11.648 7207 | 14.417 6692 | 17.320 4242 | 20.345 1931 | |
0.7 | 12.803 9297 | 15.873 6836 | 19.094 5183 | 22.452 9996 | |
1 | 14.203 1394 | 17.634 0492 | 21.236 4362 | 24.994 9457 | |
2 | 17.514 1324 | 21.790 9564 | 26.286 1250 | 30.979 8830 | |
50 | 49.516 4187 | 61.820 3488 | 74.772 8290 | 88.314 3280 | |
200 | 78.385 6232 | 97.891 3315 | 118.427 830 | 139.900 400 | |
1000 | 133.876 891 | 167.212 258 | 202.311 200 | 239.011 580 | |
8000 | 267.628 498 | 334.284 478 | 404.468 350 | 477.855 700 | |
20000 | 363.201 843 | 453.664 875 | 548.916 140 | 648.515 330 | |
Θα χρησιμοποιήσουμε τις μεθόδους πινάκων που αναφέραμε για να υπολογίσουμε τα ενεργειακά επίπεδα σωματιδίου μέσα στο διπλό πηγάδι δυναμικού. Αυτό δίνεται από τη Χαμιλτονιανή:
![]() | (9.33) |
και τα σημεία ισορροπίας στην κλασική κίνηση βρίσκονται στα ελάχιστα:
![]() | (9.34) |
΄Οταν το πηγάδι είναι πολύ βαθύ τότε, για τις χαμηλότερες στάθμες, μπορούμε να
θεωρήσουμε ότι το δυναμικό προσεγγίζεται αρκετά καλά από αυτό του αρμονικού
ταλαντωτή με συχνότητα , οπότε
![]() | (9.35) |
Στην περίπτωση αυτή το φαινόμενο σήραγγας είναι πολύ ασθενές, με αποτέλεσμα τα ενεργειακά επίπεδα να χωρίζονται ελαφρά μεταξύ τους ανά ζεύγη. Αυτό γίνεται γιατί οι αντίστοιχες ιδιοκαταστάσεις είναι συμμετρικοί και αντισυμμετρικοί συνδυασμοί καταστάσεων που αντιστοιχούν σε καταστάσεις εντοπισμένες στο αριστερό ή δεξιό ελάχιστο της δυναμικής ενέργειας. Π.χ. για τα δύο χαμηλότερα ενεργειακά επίπεδα περιμένουμε ότι
![]() | (9.36) |
όπου και
![]() | (9.37) |
όπου οι καταστάσεις και
είναι εντοπισμένες στο αριστερό και δεξί
πηγάδι του δυναμικού αντίστοιχα (δείτε και τα σχήματα 10.4 του Κεφαλαίου
10).
Ως βάση για τον υπολογισμό της Χαμιλτονιανής (9.33) θα χρησιμοποιήσουμε
τις σχέσεις (9.12) . Οι απαραίτητες μεταβολές στον κώδικα μας είναι ελάχιστες.
Απλά θα προσθέσουμε μία ρουτίνα που να υπολογίζει τους πίνακες . Παίρνουμε
έτσι τον κώδικα που αποθηκεύουμε στο αρχείο doublewell.f90:
Πού προτιμάει να βρίσκεται το σωμάτιο, όταν βρίσκεται στις καταστάσεις και
; Αυτό μπορεί να απαντηθεί αν υπολογίσουμε την αναμενόμενη τιμή
του τελεστή θέσης
σε κάθε μια από τις καταστάσεις. Γνωρίζουμε ότι,
όταν το σωματίδιο είναι σε κάποια από τις ενεργειακές ιδιοκαταστάσεις,
έχουμε
![]() | (9.38) |
εξαιτίας της αρτιότητας του δυναμικού . ΄Αρα,
![]() | (9.40) |
Δεδομένου ότι για πεπερασμένο , η DSYEV μας επιστρέφει προσεγγιστικά τους
συντελεστές
στις στήλες του πίνακα H(DIM,DIM), έτσι ώστε
H(m+1,n+1), μπορείτε να συγκρίνετε την τιμή του
με τις κλασικές τιμές
, καθώς το
αυξάνεται.
![]() | (9.41) |
και να υπολογίσετε τις για
για
και
.
Από άποψη αριθμητικής ανάλυσης, το πρόβλημα είναι η λύση απλών διαφορικών
εξισώσεων ιδιοτιμών με συνοριακές συνθήκες. Μέρος της λύσης είναι και η ιδιοτιμή
της ενέργειας η οποία θα πρέπει, επίσης, να υπολογιστεί. Θα χρησιμοποιήσουμε δύο
μεθόδους, μία για τη λύση του προβλήματος του σωματίου μέσα σε απειρόβαθο
πηγάδι δυναμικού το οποίο είναι άρτιο , και μία που θα εφαρμόσουμε
σε γενικότερα δυναμικά και προτιμάται στις εφαρμογές. Η πρώτη είναι μια εισαγωγή
στο πρόβλημα και έχει μόνο ακαδημαϊκό και εκπαιδευτικό ενδιαφέρον και ο βιαστικός
αναγνώστης μπορεί να παραλείψει τη μελέτη της παραγράφου 10.2 και να προχωρήσει
στην παράγραφο 10.3.
Η εξίσωση Schrödinger που ικανοποιούν οι κυματοσυναρτήσεις που
αναπαριστάνουν τις ιδιοκαταστάσεις ενέργειας είναι η
![]() | (10.1) |
μαζί με τη συνθήκη κανονικοποίησης
![]() | (10.2) |
Θυμίζουμε ότι ο τελεστής που σε αναπαράσταση θέσης δίνεται από
![]() | (10.3) |
είναι ερμιτιανός, δηλ. . Η εξίσωση (10.1) είναι μια εξίσωση ιδιοτιμών
![]() | (10.4) |
η οποία έχει λύσεις ένα διακριτό σύνολο από πραγματικές συναρτήσεις
τέτοιες, ώστε
. Οι αριθμοί
είναι
πραγματικοί και αποτελούν το ενεργειακό φάσμα του σωματιδίου στο
πεδίο1
. Η ελάχιστη ενέργεια
αντιστοιχεί στη θεμελιώδη κατάσταση που
βρίσκεται το σωματίδιο που δίνεται από μία μη τετριμμένη συνάρτηση
. Σε
συμφωνία με την αρχή απροσδιοριστίας του Heisenberg, στην κατάσταση αυτή
και
, έτσι ώστε
.
Οι ιδιοκαταστάσεις αποτελούν μια ορθοκανονική βάση
![]() | (10.5) |
έτσι ώστε οποιαδήποτε κυματοσυνάρτηση που αναπαριστά την κατάσταση
να δίνεται από το γραμμικό συνδυασμό
![]() | (10.6) |
Οι αριθμοί δίνουν την πιθανότητα
να μετρηθεί η ενέργεια
στην κατάσταση
.
Επίσης, θυμίζουμε ότι για οποιαδήποτε κατάσταση η συνάρτηση
![]() | (10.7) |
είναι η πυκνότητα πιθανότητας εύρεσης του σωματιδίου στη θέση , δηλ. η
πιθανότητα εύρεσης του σωματιδίου στο διάστημα
δίνεται από τη
σχέση
![]() | (10.8) |
Η σχέση κανονικοποίησης (10.2) σύμφωνα με την παραπάνω ερμηνεία απηχεί τη
διατήρηση της πιθανότητας (ανεξάρτητη του χρόνου, ιδιότητα της χρονοεξαρτημένης
εξίσωσης Schrödinger) και την πληρότητα (εδώ τη βεβαιότητα παρατήρησης του
σωματιδίου κάπου στον άξονα των ).
Οι μετρήσιμες ποσότητες του παραπάνω κβαντομηχανικού συστήματος δίνονται
από τελεστές και οι αναμενόμενες τιμές τους, όταν το σύστημα είναι σε μια
κατάσταση
, δίνονται από τη σχέση
![]() | (10.9) |
Από αριθμητικής άποψης, το πρόβλημα ιδιοτιμών (10.1) ανάγεται στη λύση μιας διαφορικής εξίσωσης δεύτερης τάξης. Οι διαφορές σε σχέση με τις περιπτώσεις που μελετήσαμε σε προηγούμενα κεφάλαια είναι:
Θα παρουσιάσουμε μερικές απλές μεθόδους επίλυσης του προβλήματος, ειδικές στη μία διάσταση, ως μια εισαγωγή στον τρόπο αριθμητικής λύσης ενός προβλήματος με τα παραπάνω χαρακτηριστικά.
Για την αριθμητική λύση της παραπάνω εξίσωσης καταφεύγουμε σε επανακανονικοποίηση των συναρτήσεων και των παραμέτρων τους, έτσι ώστε να έχουμε να κάνουμε με αδιάστατες ποσότητες. Για το λόγο αυτό, η (10.1) γράφεται αρχικά στη μορφή:
![]() | (10.10) |
Επιπλέον, επιλέγουμε μια χαρακτηριστική κλίμακα μήκους στο πρόβλημα και
επαναορίζουμε
. Ορίζουμε
και παίρνουμε
![]() | (10.11) |
Ορίζουμε
,
και
αλλάζουμε συμβολισμό
,
, οπότε παίρνουμε
![]() | (10.12) |
Οι λύσεις της (10.1) παίρνονται εύκολα από τις λύσεις της (10.12) χρησιμοποιώντας το “λεξικό”2 :
![]() | (10.13) |
Τέλος, να σημειώσουμε ότι, αν πάρουμε
για την ορμή,
τότε θα έχουμε
![]() | (10.14) |
Η σχέση μετάθεσης γίνεται τώρα
. Για την κινητική ενέργεια
έχουμε
![]() | (10.15) |
και για τη Χαμιλτονιανή
![]() | (10.16) |
Στις εξισώσεις των επόμενων παραγράφων, η περισπωμένη θα παραλείπεται και θα
γράφουμε αντί για
.
Το απλούστερο πρότυπο για τη μελέτη των ποιοτικών χαρακτηριστικών των δέσμιων
καταστάσεων είναι το απειρόβαθο πηγάδι δυναμικού πλάτους όπου το σωμάτιο
είναι περιορισμένο να βρίσκεται στο διάστημα
:
![]() | (10.17) |
Εδώ, σύμφωνα με τα λεγόμενα στο τέλος της προηγούμενης παραγράφου, έχουμε
επιλέξει το να είναι το πλάτος του πηγαδιού και η μεταβλητή
να είναι
αδιάστατη και να αντιστοιχεί στο
όταν το
έχει διαστάσεις
μήκους.
Η λύση της (10.12) υπολογίζεται εύκολα. Τα χαρακτηριστικά που πρέπει να τονίσουμε είναι ότι λόγω της συμμετρίας
![]() | (10.18) |
του δυναμικού (άρτια συνάρτηση της θέσης), οι λύσεις έχουν συγκεκριμένη ομοτιμία
(parity), ιδιότητα που θα μας βοηθήσει σημαντικά στην αριθμητική αναζήτηση των
λύσεων. Αυτό θα κάνει τη μέθοδο που θα παρουσιάσουμε ειδική για δυναμικά που
είναι άρτιες συναρτήσεις της θέσης. Στην επόμενη παράγραφο θα αναπτύξουμε μία
πιο γενική μέθοδο που θα περιλαμβάνει και μη άρτια δυναμικά. Οι λύσεις χωρίζονται
σε δύο κατηγορίες, μία με άρτια ομοτιμία
για
και μία με περιττή ομοτιμία
για
.
![]() | (10.19) |
όπου
![]() | (10.20) |
και η κανονικοποίηση έχει επιλεγεί, έτσι
ώστε3
.
Οι λύσεις που αναζητάμε είναι δυνατόν να βρεθούνε χρησιμοποιώντας τις ιδιότητες ομοτιμίας των κυματοσυναρτήσεων. Παρατηρούμε ότι για τις λύσεις θετικής ομοτιμίας
![]() | (10.21) |
ενώ για τις λύσεις αρνητικής ομοτιμίας
![]() | (10.22) |
Η σταθερά εξαρτάται από την κανονικοποίηση της κυματοσυνάρτησης. ΄Αρα,
μπορούμε να θέσουμε
και στη συνέχεια, να επανακανονικοποιήσουμε την
κυματοσυνάρτηση, έτσι ώστε να ισχύει η (10.2) . Οι σχέσεις (10.21) και (10.22)
μπορούν να θεωρηθούν ως οι αρχικές συνθήκες στην (10.12) , αν η ενέργεια είναι
γνωστή, οπότε με έναν αλγόριθμο της αρεσκείας μας (λ.χ. Runge–Kutta 4ης τάξης)
να προωθήσουμε τη λύση προς τα
. Φυσικά, το πρόβλημα είναι
ότι η ενέργεια
δεν είναι γνωστή. Αν η ενέργεια δεν είναι η επιτρεπτή
από την κβαντική θεωρία, τότε θα βρούμε ότι παραβιάζονται οι συνοριακές
συνθήκες
![]() | (10.23) |
΄Οσο πλησιάζουμε τη σωστή ενέργεια, τόσο .
Οπότε ακολουθούμε την παρακάτω διαδικασία:
Για την οργάνωση του κώδικα, αναφέρουμε πρώτα την εξέλιξη της
κυματοσυνάρτησης από σε
με χρήση της μεθόδου Runge-Kutta 4ης
τάξης. Για τα βήματα ολοκλήρωσης χρησιμοποιούμε τον κώδικα από το Κεφάλαιο 4
που βρίσκεται στο αρχείο rk.f90. Απομονώνουμε μόνο την subroutine RKSTEP, που
θα βρείτε στο πρόγραμμα της σελίδας 549, και την αποθηκεύουμε σε ένα αρχείο
rk.f90. Για την ολοκλήρωση της (10.12) χρησιμοποιούμε τη συνάρτηση
και παίρνουμε:
Τονίζουμε πως η ενέργεια energy τοποθετείται σε common block, ώστε να
μπορούμε να τη μεταβάλλουμε από το κυρίως πρόγραμμα.
Το κυρίως πρόγραμμα βρίσκεται στο αρχείο well.f90. Αφού ζητήσουμε τα δεδομένα από το χρήστη (energy, parity, Nx) ξεκινάει η αναζήτηση της σωστής ενέργειας ξεκινώντας από την αρχικά επιλεγμένη τιμή
η οποία σταματάει όταν psinew έχει απόλυτη τιμή μικρότερη από
epsilon, δηλ. όταν θεωρήσουμε ότι η συνθήκη (10.23) ικανοποιείται με την
επιθυμητή ακρίβεια. Αν το πρόσημο της κυματοσυνάρτησης στο
αλλάξει
(psinew*psiold
), τότε έχουμε ξεπεράσει τη σωστή τιμή της ενέργειας, οπότε
αλλάζουμε το πρόσημο του βήματος de και μειώνουμε το μέγεθός του στο μισό.
Μέσα στο βρόχο εκτελείται ο αλγόριθμος που περιγράφεται στη σελίδα 1076. Μετά
την έξοδο από τον παραπάνω βρόχο, η ενέργεια έχει προσδιοριστεί με τη
ζητούμενη ακρίβεια και το υπόλοιπο πρόγραμμα απλά καταγράφει τη λύση
στο array psifinal(STEPS). Τα αποτελέσματα καταγράφονται στο αρχείο
psi.dat. Παρατηρήστε τη χρήση της μεταβλητής parity για την ενοποιημένη
αντιμετώπιση των περιπτώσεων parity
. Ολόκληρος ο κώδικας παρατίθεται
παρακάτω:
Η μεταγλώττιση και το τρέξιμο γίνεται εύκολα με τις εντολές
Η τιμή της ενέργειας προσδιορίζεται σε 2.467401123 που μπορεί να συγκριθεί
με την ακριβή τιμή
2.467401100. Το ποσοστό σφάλματος είναι
, άρα μάλλον καλά πήγαμε! Η διαδικασία της σύγκλισης φαίνεται στο σχήμα
10.2.
Για την εύρεση των διεγερμένων καταστάσεων αλλάζουμε την ομοτιμία και
διαλέγουμε κάθε φορά ενέργεια ελαφρά μεγαλύτερη από τη λύση που έχουμε ήδη
βρει5 .
Τα αποτελέσματα δίνονται στον πίνακα 10.1. Παρατηρούμε την εξαιρετική συμφωνία
του αριθμητικού υπολογισμού συγκρινόμενου με το αναλυτικά γνωστό αποτέλεσμα
.
![]() | ![]() | Τετραγωνικό | Τριγωνικό | Διπλό Πηγάδι |
1 | 2.467401100 | 2.467401123 | 5.248626709 | 15.294378662 |
2 | 9.869604401 | 9.869604492 | 14.760107422 | 15.350024414 |
3 | 22.2066099 | 22.2066040 | 27.0690216 | 59.1908203 |
4 | 39.47841 | 39.47839 | 44.51092 | 59.96887 |
5 | 61.6850275 | 61.6850242 | 66.6384315 | 111.3247375 |
6 | 88.82643 | 88.82661 | 93.84588 | 126.37628 |
7 | 120.902653 | 120.902664 | 125.878830 | 150.745215 |
8 | 157.91367 | 157.91382 | 162.92569 | 194.07578 |
9 | 199.859489 | 199.859490 | 204.845026 | 235.017471 |
10 | 246.74011 | 246.74060 | 251.74813 | 275.67383 |
11 | 298.555533 | 298.555554 | 303.545814 | 331.428306 |
12 | 355.3057 | 355.3064 | 360.3107 | 388.7444 |
Τελειώνουμε την παράγραφο με δύο ακόμα παραδείγματα δυναμικών. Πρώτα του δυναμικού με τριγωνικό σχήμα στον πάτο
![]() | (10.26) |
καθώς και ένα διπλό πηγάδι δυναμικού με
![]() | (10.27) |
όπου οι παράμετροι είναι θετικοί αριθμοί. Η μορφή των δυναμικών δείχνεται
πρόχειρα στο σχήμα 10.1.
Για το τριγωνικό δυναμικό επιλέγουμε , ενώ για το διπλό πηγάδι
και
. Οι μεταβολές στον κώδικά γίνονται στο αρχείο
wellInfSq.f90 και αποθηκεύονται μέσα στα αρχεία wellInfTr.f90 και
wellInfDbl.f90 αντίστοιχα. Αλλάζουμε μόνο τη γραμμή του κώδικα που
αφορά τη συνάρτηση του δυναμικού μέσα στη συνάρτηση f2. Λ.χ. στο αρχείο
wellInfTr.f90
ενώ στο αρχείο wellInfDbl.f90
Η ανάλυση γίνεται με τον ίδιο ακριβώς τρόπο και τα αποτελέσματα για το
ενεργειακό φάσμα δίνονται στον πίνακα 10.1. Παρατηρούμε ότι οι υψηλές ενεργειακές
στάθμες των τριών δυναμικών τείνουν να γίνουν οι ίδιες, καθώς το γίνεται πολύ
μεγάλο. Ο λόγος είναι ότι όταν το σωμάτιο έχει πολύ υψηλή ενέργεια σε σχέση με το
, επηρεάζεται πολύ λίγο από τις λεπτομέρειες της μορφής του δυναμικού στον
πάτο και ουσιαστικά βλέπει ένα απειρόβαθο πηγάδι δυναμικού. Στην περίπτωση του
τριγωνικού δυναμικού, οι πρώτες ενεργειακές στάθμες είναι υψηλότερες από αυτές
του τετραγωνικού δυναμικού, αφού κατά μέσο όρο η δυναμική ενέργεια
είναι μεγαλύτερη και η μορφή του δυναμικού τείνει να περιορίσει το σωμάτιο
σε μικρότερη περιοχή (
μειώνεται, άρα
αυξάνεται). Το τελευταίο
φαίνεται και στο σχήμα 10.3, όπου συγκρίνονται οι κυματοσυναρτήσεις των δύο
δυναμικών.
Το ίδιο παρατηρούμε και για το διπλό πηγάδι δυναμικού. Επιπλέον, βλέπουμε και
τον προσεγγιστικό εκφυλισμό των 4 πρώτων ενεργειακών σταθμών ανά
ζεύγη, κάτι που αναμένεται σε δυναμικά της μορφής αυτής. Αυτό σας θυμίζω
μπορεί να κατανοηθεί ποιοτικά παρατηρώντας λ.χ. ότι οι κυματοσυναρτήσεις
και
αντιστοιχούν σε κυματοσυναρτήσεις καταστάσεων στις οποίες το σωμάτιο σχεδόν
περιορίζεται στο αριστερό και δεξί πηγάδι αντίστοιχα. Αυτό μπορείτε να το δείτε στο
σχήμα 10.4. Καθώς
, τα δύο πηγάδια αποσυζεύγνυνται και οι
τείνουν προς τις κυματοσυναρτήσεις θεμελιώδους κατάστασης δύο
ανεξάρτητων απειρόβαθων πηγαδιών πλάτους
και οι αντίστοιχες ενέργειες
σε
. Η διαφορά των
και
από τις τιμές
αυτές οφείλεται στην πεπερασμένη τιμή του δυναμικού
(δείτε άσκηση 4).
Τέλος, να τονίσουμε τους περιορισμούς της μεθόδου αυτής. Καταρχήν,
θυμίζουμε ότι μπορούμε να την χρησιμοποιήσουμε μόνο σε απειρόβαθα πηγάδια
δυναμικού που είναι άρτια . Αυτό χρησιμοποιήθηκε στις αρχικές
συνθήκες (10.21) και (10.22) που ισχύουν για καταστάσεις δεδομένης ομοτιμίας.
΄Οταν το δυναμικό είναι άρτιο, οι ιδιοκαταστάσεις της ενέργειας έχουν καλά
καθορισμένη ομοτιμία. Το άλλο πρόβλημα γίνεται αντιληπτό, αν κάνετε την άσκηση
4: Αν η κυματοσυνάρτηση είναι σχεδόν μηδέν για
, όπως συμβαίνει όταν
, τότε τα αριθμητικά σφάλματα μας εμποδίζουν να ολοκληρώσουμε με
μεγάλη ακρίβεια από
σε
. Το ίδιο θα συμβαίνει και όταν έχουμε να
περάσουμε μέσα από ψηλά φράγματα δυναμικού. Παρόλα αυτά είναι μια απλή
μέθοδος που μπορεί να χρησιμοποιηθεί και στην περίπτωση που έχουμε δέσμιες
καταστάσεις σε ένα άρτιο δυναμικό που δεν είναι απειρόβαθο: Στην περίπτωση
αυτή παίρνουμε το δυναμικό που μας δίνεται και απλά τοποθετούμε τους
αδιαπέραστους τοίχους σε σημεία όπου η κυματοσυνάρτηση αναμένεται να είναι στην
περιοχή τους πρακτικά παντού μηδέν. Τότε η επίδραση του τείχους θα είναι
πολύ μικρή πάνω στις λύσεις του αρχικού προβλήματος. Δείτε το πρόβλημα
3.
Το σπουδαιότερο πρόβλημα με την απλή μέθοδο που παρουσιάσαμε στην παράγραφο
10.2 είναι ότι παρουσιάζει αριθμητική αστάθεια, όταν προσπαθούμε να λύσουμε ένα
πρόβλημα δέσμιων καταστάσεων. Αυτό θα το συναντήσατε ήδη αν προσπαθήσατε να
λύσετε την άσκηση 3 όπου μετακινώντας τα τείχη μακρύτερα από η
σύγκλιση του αλγόριθμου γίνεται ιδιαίτερα δυσχερής. Για να το καταλάβουμε αυτό,
όταν ολοκληρώνουμε την εξίσωση Schrödinger από την ελεύθερη περιοχή προς την
κλασικά απαγορευμένη, περνάμε από ταλαντούμενη κυματοσυνάρτηση μέτρου της
τάξης της μονάδας σε κυματοσυνάρτηση η οποία έχει εκθετική απόσβεση. Δεν
πρέπει όμως να ξεχνάμε ότι για
, μαζί με τη φυσικά αποδεκτή λύση
έχουμε και τη λύση
η οποία αποκλίνει εκθετικά
γρήγορα και την απορρίπτουμε λόγω της (10.2) . ΄Ετσι, χρειάζεται πολύ
λεπτή ρύθμιση της τιμής της ενέργειας για την επίτευξη σύγκλισης, ειδικά αν
ολοκληρώνουμε για μεγάλα
. Για το λόγο αυτό, είναι προτιμότερο να
ολοκληρώνουμε από την περιοχή εκθετικής απόσβεσης προς την κλασικά
επιτρεπόμενη περιοχή. Η ιδέα είναι να ξεκινήσουμε από τέτοιες περιοχές και να
ταιριάξουμε τις τιμές των λύσεων και των παραγώγων τους σε κατάλληλα επιλεγμένα
σημεία. Το ταίριασμα γίνεται προσπαθώντας να εντοπίσουμε την ενέργεια που η τιμή
της κάνει το λόγο
![]() | (10.28) |
να είναι μηδέν μέσα στα όρια της αριθμητικής ακρίβειας που θέτουμε σε κατάλληλα
επιλεγμένο σημείο . Το σημείο
είναι καλό να βρίσκεται μέσα στην κλασικά
επιτρεπόμενη περιοχή (
) και, συνήθως, το παίρνουμε στο σημείο όπου
. Με κατάλληλη επανακανονικοποίηση των
, επιλέγουμε
, οπότε
σημαίνει ότι
. Ο
παρονομαστής της (10.28) απλά θέτει την κλίμακα στην ακρίβεια που θέλουμε να
πετύχουμε6 .
Η ιδέα σκιαγραφείται γραφικά στο σχήμα 10.5. Ο αλγόριθμος έχει ως εξής:
Μετά από τον παραπάνω αλγόριθμο, η κυματοσυνάρτηση αποτελεί καλή προσέγγιση της
ιδιοκατάστασης με ιδιοενέργεια
. Περαιτέρω επεξεργασία αφορά την
κανονικοποίηση σύμφωνα με την (10.2) και ο υπολογισμός των αναμενόμενων
τιμών σύμφωνα με την (10.9) . Ενδιαφέρον παρουσιάζει και ο αριθμός
των
σημείων μηδενισμού της κυματοσυνάρτησης που δίνει την τάξη του ενεργειακού
επιπέδου
της ενέργειας
(
).
Παρατίθεται το πρόγραμμα που κωδικοποιεί τον παραπάνω αλγόριθμο. Κατ’ αρχήν, όπως και στην προηγούμενη παράγραφο, χρησιμοποιούμε τη ρουτίνα RKSTEP (βλ. σελίδα 549) που πραγματοποιεί ένα βήμα Runge-Kutta 4ης τάξης την οποία προγραμματίζουμε στο αρχείο rk.f90.
Το δυναμικό προγραμματίζεται σε μια συνάρτηση V(x). Οι αρχικές συνθήκες στα
σημεία xmin και xmax προγραμματίζονται στη ρουτίνα boundary(xmin, xmax,
psixmin, psipxmin, psixmax, psipxmax) η οποία επιστρέφει στο κυρίως
πρόγραμμα τις τιμές psixmin= , psipxmin=
, psixmax=
, psipxmax=
. Αυτές τις τοποθετούμε σε ένα αρχείο του
οποίου το όνομα έχει σχέση με το δυναμικό
. Για παράδειγμα, για το
απειρόβαθο πηγάδι δυναμικού (10.17) δημιουργούμε το αρχείο schInfSq.f90. Στο
ίδιο αρχείο προγραμματίζουμε και τις συναρτήσεις των παραγώγων f1, f2, όπως
κάναμε και στην προηγούμενη παράγραφο.
Παρατηρούμε ότι τα σημεία απειρισμού του δυναμικού καθορίζονται από τις συνοριακές συνθήκες στα xmin, xmax.
Το κυρίως πρόγραμμα παρουσιάζεται στο αρχείο sch.f90. Παρακάτω παραθέτουμε τον κώδικα ο οποίος συμπεριλαμβάνει κανονικοποίηση της κυματοσυνάρτησης και υπολογισμό του αριθμού των δεσμών της κυματοσυνάρτησης. Η κανονικοποίηση γίνεται από τη συνάρτηση integrate(psi, dx, Nx) η οποία ολοκληρώνει αριθμητικά με τη μέθοδο Simpson το τετράγωνο μιας συνάρτησης που οι τιμές της psi(i) i=1,...,Nx δίνονται σε ένα περιττό αριθμό από Nx σημεία τα οποία ισαπέχουν απόσταση dx.
Αφήνουμε ως άσκηση στον αναγνώστη να αναπαράγει τα αποτελέσματα της προηγούμενης παραγράφου για το απειρόβαθο πηγάδι δυναμικού. Για το τρέξιμο του προγράμματος, μεταγλωττίστε τον κώδικα και τρέξτε τον με την εντολή:
Παραπάνω θέσαμε xmin= -1, xmax = 1, Nx= 2000, καθώς και ,
. Τελικά, πήραμε ότι η ενέργεια της πρώτης (θεμελιώδους, n=1)
ενεργειακής κατάστασης είναι
. Η κυματοσυνάρτηση
βρίσκεται στο αρχείο psi.dat και μπορούμε να τη δούμε γραφικά με το gnuplot με
την εντολή
Η διαδικασία σύγκλισης στην κυματοσυνάρτηση είναι αποθηκευμένη στο αρχείο all.dat. Η πρώτη στήλη έχει τον αριθμό προσπάθειας σύγκλισης (εδώ iter = 0, ... 31) και μπορούμε εύκολα να φιλτράρουμε κάθε προσπάθεια με τις εντολές
οι οποίες παράγουν το σχήμα 10.6.
΄Οταν για μια κατάσταση γνωρίζουμε την κυματοσυνάρτηση σε αναπαράσταση
θέσης
, είναι εύκολο να υπολογίσουμε τη δράση τελεστών που αντιστοιχούν σε
παρατηρήσιμες ποσότητες
που είναι συνάρτηση της θέσης και της ορμής. Η
δράση των τελεστών
![]() | (10.29) |
δίνουν8
![]() | (10.30) |
Χρησιμοποιώντας την (10.9) μπορούμε να υπολογίσουμε την αναμενόμενη (ή μέση)
τιμή του τελεστή
, όταν το σύστημα βρίσκεται στην κατάσταση
.
Ενδιαφέροντα παραδείγματα αποτελούν οι παρατηρήσιμες ποσότητες “θέση”
,
“θέση τετράγωνο”
, “ορμή”
, “ορμή τετράγωνο”
, “κινητική ενέργεια”
, “δυναμική ενέργεια”
, “ενέργεια” ή “Χαμιλτονιανή”
των
οποίων οι μέσες τιμές δίνονται από τις σχέσεις
![]() | (10.32) |
Στις προηγούμενες παραγράφους εξηγούμε πώς να υπολογίζουμε αριθμητικά τις
κυματοσυναρτήσεις των ιδιοκαταστάσεων της ενέργειας. Σε αυτές, επειδή
, παίρνουμε
, αλλά οι υπόλοιποι τελεστές
θέλουν κάποια αριθμητική προσέγγιση για τον υπολογισμό των μέσων τιμών
τους. Αν οι τιμές της κυματοσυνάρτησης δίνονται σε
ισαπέχοντα σημεία
, θα πάρουμε
![]() | (10.33) |
όπου και
![]() | (10.34) |
Και οι δύο τύποι έχουν ακρίβεια . Θα πρέπει να προσέξουμε λίγο την εφαρμογή
των τύπων στα άκρα του διαστήματος
. Αρχικά, θα χρησιμοποιήσουμε τις
προσεγγίσεις9
Για τη χρήση του προγράμματος χρειάζεστε την κυματοσυνάρτηση στα σημεία
στο φορμά που παράγουν τα προγράμματα που γράψαμε μέχρι τώρα.
Στην πρώτη γραμμή θα πρέπει να είναι καταγεγραμμένη η ενέργεια στην 3η στήλη,
ενώ από τη 2η γραμμή και μετά έχουμε δύο στήλες με τα ζευγάρια
. Η
κυματοσυνάρτηση δεν είναι αναγκαίο να είναι κανονικοποιημένη, το κάνει το
πρόγραμμα. Αν τα παραπάνω δεδομένα είναι καταγεγραμμένα στο αρχείο psi.dat,
τότε η χρήση του προγράμματος γίνεται με τις εντολές
Το πρόγραμμα τυπώνει στο stdout τη σταθερά κανονικοποίησης της , την
ενέργεια (διαβασμένη από το αρχείο - όχι υπολογισμένη), και στη συνέχεια οι
,
,
,
,
,
και το γινόμενο
.
Μερικές διευκρινήσεις πάνω στις λεπτομέρειες του προγράμματος. Για να διαβάσουμε τα δεδομένα από το αρχείο psi.dat χρησιμοποιούμε τις συναρτήσεις iargc(), getarg(n,string). Η πρώτη επιστρέφει τον αριθμό των arguments στη γραμμή εντολών και η δεύτερη αποθηκεύει το n-οστό argument στην CHARACTER μεταβλητή string. Οπότε, οι εντολές
σταματάνε το πρόγραμμα, αν η εντολή δεν έχει ακριβώς ένα argument, αλλιώς το πρώτο argument αποθηκεύεται στη μεταβλητή file.
Η εντολή
ανοίγει ένα αρχείο που πρέπει να υπάρχει ήδη (status=’OLD’), αλλιώς παράγεται σφάλμα. Ο προσδιορισμός err=100 μεταφέρει τότε τον έλεγχο του προγράμματος στο statement με label ’100’. Στο παραπάνω παράδειγμα, σταματάει το πρόγραμμα με μήνυμα σφάλματος ’Cannot open filename’.
Οι εντολές
διαβάζουν το αρχείο που ανοίγουμε γραμμή-γραμμή. Ο προσδιορισμός end=101 στο statement read(11,*,end=101) μεταφέρει τον έλεγχο του προγράμματος στο statement με label 101 (δηλ. εκτός του do loop), όταν φτάσουμε στο τέλος του αρχείου.
Οι υπόλοιπες εντολές είναι εφαρμογές των σχέσεων (10.33) , (10.34) , (10.35) και (10.36) στους τύπους (10.31) και ο αναγνώστης παρακαλείται να τις μελετήσει προσεκτικά. Επίσης, χρησιμοποιείται και η ρουτίνα integrate για τα απαραίτητα ολοκληρώματα.
Στο Κεφάλαιο 9 μελετήσαμε τον αρμονικό και αναρμονικό ταλαντωτή στην
αναπαράσταση των ιδιοκαταστάσεων ενέργειας του αρμονικού ταλαντωτή . Στην
παράγραφο αυτή, θα επανεξετάσουμε το πρόβλημα στην αναπαράσταση θέσης. Θα
υπολογίσουμε τις κυματοσυναρτήσεις
που διαγωνιοποιούν τη Χαμιλτονιανή
(9.15) , είναι δηλ. λύσεις της εξίσωσης Schrödinger. Θέτοντας
στην
(10.13) , η (10.12) γίνεται:
![]() | (10.37) |
με . Για
παίρνουμε τον αρμονικό ταλαντωτή με
![]() | (10.38) |
όπου είναι τα πολυώνυμα Hermite.
Για έλεγχο του προγράμματος και της ακρίβειας της διαδικασίας, ξεκινάμε από τον αρμονικό ταλαντωτή. Το δυναμικό και οι αρχικές συνθήκες προγραμματίζονται στο αρχείο schHOC.f90. Οι αλλαγές που γίνονται αφορούν τις συναρτήσεις V(x), boundary(xmin, xmax, psixmin, psipxmin, psixmax, psipxmax):
όπου ο κώδικας στις τελείες παραλείπεται, επειδή είναι ίδιος με αυτόν
της προηγούμενης παραγράφου. Οι αρχικές συνθήκες λαμβάνουν
υπόψη τη γνωστή ασυμπτωτική συμπεριφορά των λύσεων της εξίσωσης
Schrödinger10
,
. Δοκιμάστε να τις αλλάξετε για να δείτε αν
υπάρχει επίδραση στα αποτελέσματα.
Τα αποτελέσματα δίνονται γραφικά στο σχήμα 10.7 όπου πέρα από την ποιοτική
συμφωνία, διαγράφεται και η απόκλιση από τις αναλυτικά υπολογισμένες τιμές
(10.38) που είναι της τάξης –
. Οι τιμές των ενεργειών
βρίσκονται
σε συμφωνία με την (10.38) με σχετική ακρίβεια καλύτερη από
για
.
Στη συνέχεια, υπολογίζουμε τις τιμές των μέσων τιμών ,
,
,
,
και
. Αυτές υπολογίζονται πολύ εύκολα από τις σχέσεις (9.4) και (9.8) .
Βλέπουμε ότι
,
,
ενώ
![]() | (10.39) |
Το πρόγραμμα observables.f90 μας δίνει με ακρίβεια
και
με ακρίβεια
. Οι τιμές των
,
δίνονται στον πίνακα
10.2.
![]() | ![]() | ![]() | ![]() |
0 | 0.500000000 | 0.4999977 | 0.4999989 |
1 | 1.500000284 | 1.4999883 | 1.4999943 |
2 | 2.499999747 | 2.4999711 | 2.4999854 |
3 | 3.499999676 | 3.4999441 | 3.4999719 |
4 | 4.499999607 | 4.4999082 | 4.4999539 |
5 | 5.499999520 | 5.4998633 | 5.4999314 |
6 | 6.499999060 | 6.4998098 | 6.4999044 |
7 | 7.499999642 | 7.4995484 | 7.4997740 |
8 | 8.499999715 | 8.4994203 | 8.4997100 |
9 | 9.499999837 | 9.4992762 | 9.4996380 |
10 | 10.500000012 | 10.4991160 | 10.4995580 |
11 | 11.499999542 | 11.4994042 | 11.4997019 |
12 | 12.499999610 | 12.4992961 | 12.4996479 |
13 | 13.499999705 | 13.4991791 | 13.4995894 |
14 | 14.499999835 | 14.4990529 | 14.4995264 |
Στη συνέχεια, επαναλαμβάνουμε τον υπολογισμό μας για τον αναρμονικό
ταλαντωτή και για . Αυτό γίνεται μετατρέποντας το αρχείο schHOC.f90
που αποθηκεύεται στο αρχείο schUOC.f90. Απλά αλλάζουμε το δυναμικό
σε:
![]() | ![]() | ![]() | ![]() |
0 | 1.0000 | 1.3924 | 1.9031 |
1 | 3.0000 | 4.6488 | 6.5857 |
2 | 5.0000 | 8.6550 | 12.6078 |
3 | 7.0000 | 13.1568 | 19.4546 |
4 | 9.0000 | 18.0576 | 26.9626 |
5 | 11.0000 | 23.2974 | 35.0283 |
6 | 13.0000 | 28.8353 | 43.5819 |
7 | 15.0000 | 34.6408 | 52.5723 |
8 | 17.0000 | 40.6904 | 61.9598 |
9 | 19.0000 | 46.9650 | 71.7129 |
![]() | ![]() | |||||
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
0 | 0.3058 | 0.8263 | 0.5027 | 0.2122 | 1.1980 | 0.5042 |
1 | 0.8013 | 2.8321 | 1.5064 | 0.5408 | 4.2102 | 1.5089 |
2 | 1.1554 | 5.3848 | 2.4944 | 0.7612 | 8.1513 | 2.4909 |
3 | 1.4675 | 8.2819 | 3.4862 | 0.9582 | 12.6501 | 3.4816 |
4 | 1.7509 | 11.4545 | 4.4784 | 1.1370 | 17.5955 | 4.4728 |
5 | 2.0141 | 14.8599 | 5.4707 | 1.3029 | 22.9169 | 5.4643 |
6 | 2.2617 | 18.4691 | 6.4631 | 1.4590 | 28.5668 | 6.4560 |
7 | 2.4970 | 22.2607 | 7.4555 | 1.6074 | 34.5103 | 7.4478 |
8 | 2.7220 | 26.2184 | 8.4478 | 1.7492 | 40.7206 | 8.4397 |
9 | 2.9384 | 30.3289 | 9.4402 | 1.8856 | 47.1762 | 9.4316 |
Οι κυματοσυναρτήσεις δείχνονται στο σχήμα 10.8 όπου φαίνεται ότι η αύξηση του
οδηγεί σε επιπλέον περιορισμό του σωματιδίου στο χώρο όπως αναμένεται. Στον
πίνακα 10.3 καταχωρούνται οι τιμές της
για
. Παρατηρείται
η αύξηση των τιμών της ενέργειας για αυξανόμενο
. Στον πίνακα 10.4
καταχωρούνται οι αναμενόμενες τιμές των
,
,
για τον
αναρμονικό ταλαντωτή για τις καταστάσεις
,
. Παρατηρούμε τη
μείωση της
και αύξηση
, καθώς αυξάνεται το
. Το
γινόμενο
φαίνεται να είναι πολύ κοντά στις τιμές που παίρνουμε από
τον αρμονικό ταλαντωτή και για τις δύο τιμές του
. Τα αποτελέσματα
μπορείτε να τα συγκρίνετε με αυτά που πήραμε στο κεφάλαιο 9, στον πίνακα
9.1.
Το δυναμικό Lennard–Jones είναι ένα απλό φαινομενολογικό μοντέλο που περιγράφει την αλληλεπίδραση δύο ουδέτερων ατόμων σε ένα διατομικό μόριο. Αυτό δίνεται από
![]() | (10.40) |
Ο απωστικός όρος περιγράφει την άπωση επικάλυψης των ηλεκτρονικών νεφών κατά
Pauli, ενώ ο ελκτικός όρος τη δύναμη Van der Waals. Επιλέγουμε στην
(10.13) και ορίζουμε
. Η (10.40) γίνεται
![]() | (10.41) |
ενώ οι υπολογιζόμενες ιδιοτιμές συνδέονται με την ενέργεια μέσω της
σχέσης
![]() | (10.42) |
Το δυναμικό αναπαρίσταται γραφικά στο σχήμα 10.5 για . Το ελάχιστο
του δυναμικού βρίσκεται στη θέση
και η τιμή του είναι
. Ο προγραμματισμός του δυναμικού γίνεται στο αρχείο schLJ.f90. Το
κομμάτι του κώδικα που μεταβάλλουμε από τα προηγούμενα αρχεία δίνεται
παρακάτω:
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
0 | -173.637 | 1.186 | 1.0e-10 | 1.415 | 34.193 | 0.091 | 5.847 | 0.534 |
1 | -70.069 | 1.364 | 6.0e-11 | 1.893 | 56.832 | 0.178 | 7.539 | 1.338 |
2 | -18.191 | 1.699 | -4.5e-08 | 2.971 | 39.480 | 0.291 | 6.283 | 1.826 |
3 | -1.317 | 2.679 | -2.6e-08 | 7.586 | 9.985 | 0.638 | 3.160 | 2.016 |
Για την ολοκλήρωση επιλέγουμε τις παραμέτρους και xmin = 0.7,
xmax
. Τα αποτελέσματα παρουσιάζονται στο σχήμα 10.9, όπου
φαίνονται τα τέσσερα ενεργειακά επίπεδα των δέσμιων καταστάσεων μαζί με τις
κυματοσυναρτήσεις τους. Αυτές είναι περιορισμένες μέσα στο πηγάδι του δυναμικού για
τις δύο πρώτες στάθμες, ενώ αρχίζουν να “ξεχειλίζουν” για τις δύο τελευταίες. Στον
πίνακα 10.5 παραθέτουμε τις μετρήσεις μας. Παρατηρούμε ότι
μέσα στα
όρια της ακρίβειας που έχουμε θέσει, όπως περιμένουμε για πραγματικές, δέσμιες
κυματοσυναρτήσεις11 .
Η γεωμετρία μιας τυπικής διαδρομής του απλού τυχαίου περιπατητή παύει να είναι
κλασική και αυτό μπορεί να φανεί καθαρά από δύο μη κλασικές ιδιότητες της. Το
μήκος της διαδρομής που διανύει ο περιπατητής είναι ανάλογος της τετραγωνικής
ρίζας του χρόνου, με αποτέλεσμα να μην ισχύει η κλασική σχέση . Ο
δεύτερος λόγος είναι ότι η γεωμετρία του χώρου που πατάει ο περιπατητής
(με τη στατιστική έννοια) έχει δομή fractal με διάσταση μεγαλύτερη της
μονάδας1 ,
δηλαδή δεν είναι ένα απλό μονοδιάστατο μονοπάτι. Παρόμοια φαινόμενα
παρουσιάζονται στις τυχαίες επιφάνειες και κβαντικές θεωρίες πεδίου όπου η
απόκλιση από την κλασική συμπεριφορά μπορεί να γίνει κατανοητή με κατάλληλες
γενικεύσεις των παραπάνω ιδεών. Για περαιτέρω μελέτη παραπέμπουμε στα
συγγράμματα [7, 42, 43, 44].
Για να προσομοιώσουμε ένα τέτοιο σύστημα στον υπολογιστή είναι αναγκαία η χρήση γεννητριών τυχαίων αριθμών. Αυτές, τις περισσότερες φορές, είναι αλγόριθμοι που παράγουν μια ακολουθία από ψευδοτυχαίους αριθμούς οι οποίοι κατανέμονται ομοιόμορφα. Από αυτούς είναι δυνατόν να παράξουμε πιο πολύπλοκες κατανομές πιθανοτήτων και έτσι να προσομοιώσουμε συστήματα που έχουν στοχαστική συμπεριφορά. Στο κεφάλαιο αυτό θα μελετήσουμε μερικές απλές τέτοιες γεννήτριες και τις βασικές τους ιδιότητες, καθώς και θα εξασκηθούμε στη χρήση ποιοτικών γεννητριών που είναι μεταφερόμενες (portable) σε οποιοδήποτε υπολογιστικό περιβάλλον.
Η παραγωγή ψευδοτυχαίων αριθμών είναι στην καρδιά της προσομοίωσης Μόντε Κάρλο. Η παραγωγή των ψευδοτυχαίων αριθμών είναι κατά κανόνα ντετερμινιστική: Στη γεννήτρια τυχαίων αριθμών (δηλ. στον αλγόριθμο) δίνονται κάποιες αρχικές συνθήκες από τις οποίες η παραγωγή των αριθμών αφήνεται να εξελιχθεί στο “χρόνο”. Ο επόμενος αριθμός προκαθορίζεται από την κατάσταση της γεννήτριας εξ’ ου και η ντετερμινιστική εξέλιξη. ΄Ιδιες αρχικές συνθήκες δίνουν την ίδια ακριβώς ακολουθία αριθμών. Η εξέλιξη αυτή όμως είναι χαοτική. Ελάχιστα διαφορετικές αρχικές συνθήκες φτιάχνουν ακολουθίες που αποκλίνουν εκθετικά στο χρόνο η μία από την άλλη. Για παρόμοιο λόγο, ο αριθμός που παράγεται σε κάθε βήμα θεωρείται πως είναι ασυσχέτιστος από τον προηγούμενο. Εδώ βρίσκεται και το αδύνατο σημείο που προκαλεί τα δυσκολότερα προβλήματα, γιατί στις προβληματικές γεννήτριες βρίσκονται λεπτοί συσχετισμοί που είναι δύσκολο να προσδιοριστούν. Πραγματικά τυχαίοι αριθμοί (χρήσιμοι στην κρυπτογραφία) μπορούν να παραχθούν από ειδικές συσκευές που βασίζονται στο χρόνο διάσπασης ραδιενεργών υλικών ή τον ατμοσφαιρικό θόρυβο2 . Σχεδόν τυχαίοι αριθμοί κρυπτογραφικής ποιότητας παράγονται από τα ειδικά αρχεία /dev/random και /dev/urandom, τα οποία διαβάζουν bits από μια δεξαμενή εντροπίας που φτιάχνεται από διάφορους εξωτερικούς παράγοντες (θερμοκρασία υπολογιστή, θόρυβο από οδηγούς συσκευών κλπ) που είναι διαθέσιμα σε αρκετά λειτουργικά συστήματα και θα δούμε τη χρήση τους σε επόμενη παράγραφο.
Οι πιο δημοφιλείς γεννήτριες, λόγω της απλότητάς τους, είναι οι γεννήτριες
modulo (D.H. Lehmer, 1951). Αυτές χρειάζονται μόνο έναν αριθμό (seed)
ως αρχική συνθήκη και από τον αριθμό
παράγουν τον
από τη
σχέση
![]() | (11.1) |
για κατάλληλα επιλεγμένες τιμές των ,
και
. Η κατάσταση της γεννήτριας
προσδιορίζεται πλήρως από ένα μόνο αριθμό, την τρέχουσα τιμή του
. ϒπάρχει
βιβλιογραφία σχετικά με τη σωστή επιλογή των
,
και
, εδώ ας σημειώσουμε
πως αυτή είναι διαφορετική για γλώσσα C ή FORTRAN και για συστήματα που είναι
32–bit ή 64-bit. Για λεπτομέρειες παραπέμπουμε στο ειδικό κεφάλαιο των Numerical
Recipes [8].
Η τιμή του καθορίζει την μέγιστη περίοδο της γεννήτριας. Είναι σαφές
πως αν σε κάποια στιγμή της ακολουθίας πάρω τον ίδιο αριθμό που πήρα
πριν από
βήματα, η γεννήτρια θα αρχίσει να παράγει ακριβώς την ίδια
ακολουθία και αυτό θα συνεχίζεται περιοδικά. Αφού έχω
δυνατούς
διαφορετικούς αριθμούς, η περίοδος είναι το πολύ
. Για μια κακή επιλογή των
παραμέτρων
,
και
η περίοδος θα είναι πολύ μικρότερη. Η τιμή
του
όμως δεν μπορεί να είναι αυθαίρετα μεγάλη, αφού σε οποιοδήποτε
υπολογιστή υπάρχει ένας μέγιστος ακέραιος που καθορίζεται από τον αριθμό
των bits που χρησιμοποιεί να τον αναπαραστήσει. Για ακεραίους 4-bytes
(32-bits) χωρίς πρόσημο ο μέγιστος αριθμός είναι
, ενώ αν έχουν
πρόσημο
. Καλή επιλογή των
,
και
μπορεί να αποδειχθεί (βλ.
Knuth [45]) ότι δίνει ακολουθία που είναι αναδιάταξη
των
αριθμών
. Μια τέτοια επιλογή δίνει αρκετά καλούς τυχαίους
αριθμούς για απλές εφαρμογές, αλλά για σοβαρούς υπολογισμούς θα πρέπει να
ανατρέξουμε σε μια προσεκτικά επιλεγμένη γεννήτρια τυχαίων αριθμών. Σε
αυτές, η κατάσταση της γεννήτριας είναι πιο πολύπλοκη και καθορίζεται από
περισσότερους από έναν ακέραιους αριθμούς. Για κώδικα ο αναγνώστης μπορεί
να ανατρέξει στις αναφορές [4], [5], [8], [46]. Για portable προγράμματα
προτείνονται οι γεννήτριες RANLUX [46] και η γεννήτρια των Marsaglia, Zaman
and Tsang. Πρόγραμμα Fortran για την πρώτη θα βρείτε στο συνοδευτικό
λογισμικό, ενώ για την τελευταία μπορεί να βρεθεί στο βιβλίο/site του Berg
[5].
Για να γίνει κατανοητή η χρήση των γεννητριών, αλλά και να αναδειχθεί ένα βασικό πρόβλημα των modulo γεννητριών παραθέτουμε παρακάτω τις συναρτήσεις naiveran() και drandom(). Η πρώτη είναι προβληματική και θα μελετήσουμε τους συσχετισμούς που κρύβονται στις ακολουθίες τυχαίων αριθμών που παράγει, καθώς και την επίδρασή τους στις προσομοιώσεις του τυχαίου περιπατητή. Η δεύτερη μπορεί να χρησιμοποιηθεί και για μη τετριμμένες εφαρμογές, όπως οι προσομοιώσεις του τυχαίου περιπατητή και του πρότυπου Ising που θα κάνουμε σε επόμενες παραγράφους.
Η naiveran() είναι απλή εφαρμογή της σχέσης (11.1) με ,
και
:
Η drandom() είναι πάλι εφαρμογή της ίδιας σχέσης, αλλά με ,
και
. Η επιλογή έγινε από τους Lewis, Goodman και Miller (1969)
και δίνει μια γεννήτρια που έχει περάσει από πολλά τεστ και, ακόμα πιο
σημαντικό, έχει δοκιμαστεί με επιτυχία πολλές φορές. Το πρόβλημα που
παρουσιάζεται είναι ότι πολλαπλασιασμός του
με το
θα δώσει
πολλές φορές αριθμό που είναι εκτός του διαστήματος που καλύπτουν οι
ακέραιοι τεσσάρων bytes και θα έχουμε integer overflow. Για να έχουμε
κώδικα που να μεταφέρεται παντού, αλλά και για να είναι γρήγορος, είναι
θεμιτό να παραμείνουμε στον χώρο των
, θετικών 32-μπιτων (4 byte)
ακέραιων με πρόσημο. Η πρόταση του Schrage είναι να χρησιμοποιήσουμε τη
σχέση
![]() | (11.2) |
όπου ,
και
. Μπορεί να δειχθεί ότι αν
και αν
, τότε
,
και ότι ισχύει η (11.2) . Η περίοδος της γεννήτριας είναι
.
.
Η γραμμή ελέγχου των τιμών της γεννήτριας είναι αναγκαία μόνο για την τιμή
που παρουσιάζεται μια φορά στην ακολουθία και βάζει ένα επιπλέον
φορτίο χρόνου της τάξης του
% εξαρτώμενο από το μεταγλωττιστή.
Αν δε σας ενδιαφέρει, μπορείτε να το βγάλετε. Επίσης, προσέξτε πως ο
αριθμός seed είναι σε common block και μπορεί να αλλάξει από το καλών
πρόγραμμα.
Παρακάτω, παραθέτουμε ένα απλό πρόγραμμα χρήσης των παραπάνω γεννητριών
το οποίο και θα αναδείξει το πρόβλημα συσχετισμού ζευγαριών των τιμών της
naiveran(). Θα παράξουμε ζεύγη ακέραιων τιμών με
τα
οποία στη συνέχεια θα απεικονίσουμε στο επίπεδο. Αυτό γίνεται παίρνοντας το
ακέραιο μέρος των αριθμών
με
και
ο τυχαίος αριθμός
που δίνει η κάθε γεννήτρια:
Το πρόγραμμα βρίσκεται στο αρχείο correlations2ran.f90. Για να δοκιμάσουμε τη naiveran() το μεταγλωττίζουμε
ενώ για να δοκιμάσουμε την drandom(), μεταβάλλουμε τις γραμμές print ως εξής
και ξαναμεταλωττίζουμε
παράγοντας έτσι τα δύο εκτελέσιμα αρχεία naiveran και drandom. Για να δούμε τα αποτελέσματα τρέχουμε με τις εντολές
με τις οποίες παράγουμε σημεία τα οποία, στη συνέχεια, βλέπουμε με το
gnuplot.
Οι παραπάνω εντολές παράγουν τα σχήματα 11.1 και 11.2 στα οποία βλέπουμε
καθαρά το συσχετισμό των ζευγών που παράγονται από την naiveran(). Τα
σχήματα βέβαια δίνουν αρκετά ποιοτική αναπαράσταση. Προσεκτική μελέτη της
drandom() δείχνει πως τα σημεία που παράγει δεν περνάνε το τεστ
,
όταν έχουμε περισσότερα από
σημεία, που είναι πολύ λιγότερα από την περίοδο
της γεννήτριας. Για να αποφύγουμε τέτοια προβλήματα έχουν προταθεί πολλές
λύσεις, οι πιο απλές “ανακατεύουν” τα αποτελέσματα, ώστε να εξαφανίζουν τους
σειριακούς συσχετισμούς χαμηλής τάξης. Τέτοιες γεννήτριες θα συζητήσουμε στην
επόμενη παράγραφο.
Η ομοιόμορφη κατανομή των τυχαίων αριθμών μπορεί να δειχθεί γραφικά φτιάχνοντας το ιστόγραμμα της σχετικής συχνότητας των τυχαίων αριθμών. Για να κάνουμε ιστογράμματα χρησιμοποιούμε το script histogram γραμμένο σε awk3 ως εξής:
Με την εντολή histogram -v f=0.01 φτιάχνεται ιστόγραμμα των δεδομένων στο
αρχείο drandom.out, έτσι ώστε το πλάτος των περιοχών τιμών (bin width) να είναι
. Γενικά, το αντίστροφο του αριθμού μετά το -f ορίζει το πλάτος των
περιοχών τιμών του ιστογράμματος.
Τα αποτελέσματα φαίνονται στα σχήματα 11.3 και 11.4. Στη συνέχεια, μελετούμε
τη διασπορά των μετρήσεων μας, οι οποίες είναι εμφανείς ήδη από το σχήμα 11.3. Η
διασπορά αυτή μειώνεται με το μέγεθος του δείγματος των τυχαίων αριθμών
που συλλέγουμε. Αυτό φαίνεται στο ιστόγραμμα του σχήματος 11.5. Για
να δούμε ποσοτικά την εξάρτηση των διακυμάνσεων από το μέγεθος του
δείγματος , υπολογίζουμε την ποσότητα (
είναι η ακολουθία των τυχαίων
αριθμών)
![]() | (11.3) |
την οποία αποδίδουμε γραφικά στο σχήμα 11.6. Η σχέση
![]() | (11.4) |
όπως φαίνεται από την ευθεία που προσαρμόζουμε στα σημεία, δείχνει ότι
![]() | (11.5) |
Θα κλείσουμε το κεφάλαιο αυτό αναφέροντας σύντομα την παραγωγή
ψευδοτυχαίων αριθμών με κατανομή διαφορετική από την ομοιόμορφη. Για μια
τυχαία κατανομή με συνάρτηση πυκνότητας πιθανότητας μπορούμε να
πάρουμε ψευδοτυχαίους αριθμούς που ακολουθούν την
από ομοιόμορφα
κατανεμημένους αριθμούς στο διάστημα
. ΄Εστω η συνάρτηση κατανομής
![]() | (11.6) |
που δεν είναι άλλο από το εμβαδόν κάτω από την στο
και ισούται με
την πιθανότητα
. Αν επιλέξουμε το
ομοιόμορφα κατανεμημένο στο
διάστημα
, τότε θα έχουμε
. Tότε το
είναι
τέτοιο, ώστε
, άρα κατανέμεται σύμφωνα με την
.
Οπότε αν
είναι ομοιόμορφα κατανεμημένοι ψευδοτυχαίοι αριθμοί, τότε
οι
![]() | (11.7) |
είναι μια ακολουθία ψευδοτυχαίων αριθμών που κατανέμεται σύμφωνα με την .
Για παράδειγμα, θεωρούμε την κατανομή κατά Cauchy
![]() | (11.8) |
Τότε
![]() | (11.9) |
Σύμφωνα με τα παραπάνω η γεννήτρια τυχαίων αριθμών θα δίνεται από τη σχέση
![]() | (11.10) |
ή ισοδύναμα (για πιο γρήγορο πρόγραμμα)
![]() | (11.11) |
Περισσότερες εφαρμογές έχει η γεννήτρια Gaussian τυχαίων αριθμών. Η κατανομή αυτή δίνεται από τη συνάρτηση πυκνότητας πιθανότητας
![]() | (11.12) |
Η συνάρτηση κατανομής είναι η
![]() | (11.13) |
όπου η είναι η error function η οποία μπορεί να
υπολογιστεί αριθμητικά, καθώς και η αντίστροφή της. Αυτό θα οδηγούσε σε πολύ
αργό αλγόριθμο για τη γεννήτριά μας, οπότε χρησιμοποιούμε την πυκνότητα
πιθανότητας
δύο τυχαίων μεταβλητών
,
![]() | (11.14) |
όπου ,
. Τότε, έχουμε ότι
![]() | (11.15) |
η οποία όταν αντιστραφεί θα μας δώσει
![]() | (11.16) |
Οπότε, αρκεί να παράγουμε ακολουθία ομοιόμορφα κατανεμημένων τυχαίων
αριθμών και να πάρουμε:
Το αποτέλεσμα φαίνεται στο σχήμα 11.7. Προσέξτε το attribute SAVE στις μεταβλητές new και x. Αυτό σημαίνει πως η τιμή τους διατηρείται ανάμεσα στα διαφορετικά καλέσματα της συνάρτησης drandom. Αυτό γίνεται γιατί σε κάθε εφαρμογή της (11.17) παράγουμε 2 τυχαίους αριθμούς, ενώ η συνάρτηση επιστρέφει τον ένα. Για το λόγο αυτό η συνάρτηση διατηρεί μνήμη το αν θα πρέπει να παράγει καινούργιο ζευγάρι (η “σημαία” (flag) new) και αν όχι, να επιστρέψει την τιμή ενός από τους τυχαίους αριθμούς (μεταβλητή x). Η ανάλυση των αποτελεσμάτων αφήνεται για άσκηση.
Η χρήση της drandom() μπορεί να εξυπηρετήσει σχεδόν όλες μας τις ανάγκες για την παραγωγή (ψευδο)τυχαίων αριθμών στο βιβλίο αυτό. Πολλές φορές είναι αναγκαίο να χρησιμοποιήσουμε γεννήτριες που δίνουν καλύτερης ποιότητας τυχαίους αριθμούς και στην παράγραφο αυτή θα δώσουμε οδηγίες για το πώς να χρησιμοποιήσετε δύο άλλες, καλής ποιότητας και διαθέσιμες σχεδόν παντού, γεννήτριες.
Η πρώτη είναι intrinsic στη γλώσσα Fortran και είναι η
υπορουτίνα RANDOM_NUMBER. Στο περιβάλλον Fortran που δίνει η
gfortran5
η RANDOM_NUMBER αυτή χρησιμοποιεί τον αλγόριθμο “multiply-with-carry” του
George Marsaglia σε συνδυασμό με γεννήτρια modulo και “shift-register” με
περίοδο μεγαλύτερη από . Η κατάσταση της γεννήτριας είναι πιο
πολύπλοκη από αυτή της drandom(), η οποία καθορίζεται από ένα μόνο
αριθμό, οπότε προκειμένου να τη χρησιμοποιήσουμε πρέπει να μάθουμε
Ειδικά το πώς να σώζουμε την τρέχουσα κατάσταση μιας γεννήτριας είναι πολύ σημαντικό, όταν έχουμε μια εργασία την οποία εκτελούμε χωρίζοντάς την σε μέρη, συνήθως γιατί θέλουμε κάθε μέρος της εργασίας να εκτελείται μέσα σε συγκεκριμένο χρονικό διάστημα. Στην περίπτωση αυτή, θέλουμε η ακολουθία των τυχαίων αριθμών που θα πάρουμε όταν ξεκινάει ένα νέο μέρος της εργασίας να είναι ακριβώς από το σημείο που την είχαμε αφήσει στο προηγούμενο. Η διαδικασία αυτή λέγεται checkpointing.
Το ξεκίνημα από μια νέα κατάσταση λέγεται seeding. Το seeding για τη RANDOM_NUMBER γίνεται από ένα απροσδιόριστο αριθμό από NSEEDS ακέραιους. Για να μάθουμε ποιος είναι αυτός ο αριθμός, πρέπει να καλέσουμε τη ρουτίνα RANDOM_SEED(size = NSEEDS) η οποία με το συγκεκριμένο όρισμα size = NSEEDS θα μας δώσει τον αριθμό των seeds, NSEEDS. Στη συνέχεια, πρέπει να ορίσουμε τις integer τιμές σε ένα array μεγέθους NSEEDS, έστω το seeds(NSEEDS) και να καλέσουμε ξανά την RANDOM_SEED(PUT = seeds) με το όρισμα PUT = seeds, η οποία θα αποθηκεύσει την κατάλληλη πληροφορία από το array seeds. Αυτό εμείς θα το κάνουμε χρησιμοποιώντας ένα μόνο integer αριθμό seed. Ο απαραίτητος κώδικας για τα παραπάνω είναι:
Η τελευταία γραμμή6 χρησιμοποιεί τις τιμές στο array seeds(1) ... seeds(NSEEDS) για να αρχικοποιήσει την κατάσταση της RANDOM_NUMBER. Το σημαντικό είναι ότι για την ίδια τιμή του seed θα πάρουμε κάθε φορά την ίδια ακολουθία τυχαίων αριθμών.
Πολλές φορές θέλουμε να ξεκινήσουμε τη γεννήτρια των τυχαίων αριθμών από μια όσο το δυνατόν πιο τυχαία κατάσταση, έτσι ώστε κάθε φορά που τρέχουμε το πρόγραμμα να παίρνουμε μια διαφορετική ακολουθία τυχαίων αριθμών. Στα συστήματα τύπου Unix όπως το GNU/Linux μπορούμε να χρησιμοποιήσουμε δύο ειδικά αρχεία που δίνουν σχεδόν κρυπτογραφικής ποιότητας τυχαίους αριθμούς, τα /dev/random και /dev/urandom. Αυτά παράγουν τυχαία bits από την τρέχουσα κατάσταση του υπολογιστή και είναι πρακτικά αδύνατον να προβλέψει κανείς την ακολουθία bits που θα πάρει. Η /dev/urandom είναι προτιμότερη, γιατί η /dev/random σταματά να δουλεύει, όταν δεν έχει τελείως καινούργια τυχαία bits στη δεξαμενή της και μπορεί να χρειαστεί να περιμένουμε να μας δώσει τα bits που ζητάμε. Ο απαραίτητος κώδικας για seeding από την /dev/urandom είναι
Το αρχείο /dev/urandom δίνει binary data και το ανοίγουμε ως unformatted, για τον ίδιο λόγο η εντολή read δεν έχει οδηγία format, αλλά μόνο τον αριθμό του unit. Η εντολή read διαβάζει όσα bits χρειάζονται για να γεμίσει όλο το array seeds. Μερικές φορές μπορεί να χρειαστεί να δουλέψουμε σε περιβάλλοντα που δε διαθέτουν το αρχείο /dev/urandom. Για να ξεκινήσουμε τότε τη γεννήτρια χρησιμοποιούμε το τρέχοντα χρόνο του λειτουργικού συστήματος και τον αριθμό της διεργασίας (process ID = pid) του προγράμματος, όταν τρέχει. Στο συνοδευτικό λογισμικό, στο αρχείο seed.f90, μπορείτε να δείτε πώς7 .
Στη συνέχεια, θα δούμε πώς να σώζουμε την τρέχουσα κατάσταση της γεννήτριας. Χρησιμοποιούμε πάλι την υπορουτίνα RANDOM_SEED(get = seeds) η οποία θα τοποθετήσει στο array seeds την απαραίτητη πληροφορία. Στη συνέχεια, γράφουμε τα seeds σε ένα αρχείο για να τα διαβάσουμε αργότερα. Ο απαραίτητος κώδικας είναι:
Για να ξεκινήσουμε τη γεννήτρια από την κατάσταση που έχει σωθεί μέσα στο αρχείο state, απλά διαβάζουμε τα seeds από το αρχείο και ξεκινάμε τη γεννήτρια όπως πριν:
Για να παράγουμε τυχαίους αριθμούς, μπορούμε να χρησιμοποιήσουμε μεταβλητή scalar για να τους διαβάζουμε έναν-έναν ή ένα array το οποίο η RANDOM_NUMBER θα γεμίσει με τυχαίους αριθμούς. Η πρώτη μέθοδος έχει ένα ελαφρό overhead στην απόδοση και αν μπορούμε να χρησιμοποιήσουμε arrays το προτιμούμε. Ο απαραίτητος κώδικας για την παραγωγή τυχαίων αριθμών με την πρώτη μέθοδο είναι
ενώ με τη δεύτερη:
Τα παραπάνω συνοψίζονται στον κώδικα που βρίσκεται στο αρχείο test_random_number.f90 τον οποίο παραθέτουμε παρακάτω:
Μεταγλωττίστε και δείτε τα αποτελέσματα με τις εντολές
Μια πολύ καλή γεννήτρια τυχαίων αριθμών προτάθηκε από τον Martin Lüscher
[46] και το πρόγραμμα που τη χρησιμοποιεί λέγεται Ranlux. Εκτός από την άριστη
ποιότητα τυχαίων αριθμών με περίοδο μεγαλύτερη από , το μεγάλο
πλεονέκτημα της RANLUX είναι ότι ο κώδικας θα τρέξει σε οποιαδήποτε πλατφόρμα
διαθέτει Fortran, οπότε μπορείτε να τη χρησιμοποιήσετε σε όλα σας τα
προγράμματα, παντού. Το πρόγραμμα, το οποίο θα βρείτε και στο συνοδευτικό
λογισμικό με κάποιες μικρές μετατροπές ως προς τον αρχικό κώδικα, έχει
γραφτεί από τον Fred James και μπορείτε να το κατεβάσετε στην αρχική
του μορφή από τους συνδέσμους που δίνονται στη βιβλιογραφία [46]. Η
γεννήτρια βασίζεται στον αλγόριθμο subtract-with-borrow των Marsaglia
και Zaman [48], ο οποίος έχει πολύ μεγάλη περίοδο, αλλά αποτυγχάνει
σε ορισμένα στατιστικά τεστ στα οποία υποβάλλεται. Βασιζόμενος στις
χαοτικές ιδιότητες του προαναφερόμενου αλγόριθμου, ο Lüscher πρότεινε την
εξαφάνιση των προβλημάτων αποδίδοντάς τα στους συσχετισμούς των τυχαίων
αριθμών που βρίσκονται κοντά μεταξύ τους στην ακολουθία που παράγει ο
αλγόριθμος.
Για να ξεκινήσετε τη γεννήτρια από ένα συγκεκριμένο σημείο που δίνεται από ένα seed που θα παρέχετε, χρησιμοποιείτε την υπορουτίνα RLUXGO και ο απαραίτητος κώδικας είναι
Προσέξτε την επιλογή της μεταβλητής ranlux_level: Αυτή καθορίζει την ποιότητα των τυχαίων αριθμών που παράγει η ρουτίνα και μπορεί να παίρνει τιμές 1, 2, 3 ή 4. Για τις ανάγκες στο βιβλίο αυτό, ranlux_level=2 είναι αρκετό, ranlux_level=3 είναι η προκαθορισμένη τιμή. Φυσικά, όσο μεγαλύτερη η τιμή της ranlux_level, τόσο μεγαλύτερος και ο χρόνος που χρειάζεται για την παραγωγή τυχαίων αριθμών (δείτε σχετική άσκηση).
Για να σώσουμε την κατάσταση που βρίσκεται η ρουτίνα, πρέπει να έχουμε ορίσει ένα integer array μεγέθους 25 και να καλέσουμε την υπορουτίνα RLUXUT για να αποθηκεύσει την κατάλληλη πληροφορία στο array αυτό. Στη συνέχεια, μπορούμε να σώσουμε το array σε ένα αρχείο για να το διαβάσουμε αργότερα. Ο απαραίτητος κώδικας για τη λειτουργία αυτή είναι:
Για να ξεκινήσουμε τη RANLUX από την κατάσταση που σώσαμε στο προαναφερόμενο αρχείο, χρησιμοποιούμε την υπορουτίνα RLUXIN ως εξής:
Για να παράγουμε τυχαίους αριθμούς έναν-έναν χρησιμοποιώντας μια μεταβλητή scalar, καλούμε την RANLUX ως εξής
ενώ για να πάρουμε πολλούς τυχαίους αριθμούς σε ένα μονοδιάστατο array χρησιμοποιούμε τις εντολές
όπου η παράμετρος NR τίθεται κάθε φορά στην επιθυμητή τιμή. Βάζοντας όλα τα παραπάνω μαζί σε ένα πρόγραμμα που θα βρείτε στο αρχείο test_ranlux.f90, μπορούμε να δοκιμάσουμε τη χρήση της RANLUX:
Μεταγλωττίστε, μαζί με το αρχείο ranlux.F που περιέχει τον κώδικα για τη Ranlux, και τρέξτε το παραπάνω πρόγραμμα με τις εντολές
ϒποθέτουμε ότι ένα σωμάτιο μπορεί να βρεθεί στις θέσεις ενός τετραγωνικού πλέγματος στις δύο διαστάσεις (στο επίπεδο). Αν σε κάποια χρονική στιγμή βρίσκεται σε μια από τις θέσεις του πλέγματος και αφού ισορροπήσει σε αυτή, τότε μπορεί να πηδήξει τυχαία σε μια γειτονική θέση όπου με τη σειρά του κάθεται για κάποιο χρόνο και ισορροπεί. Καθώς ισορροπεί, η ορμή που είχε και το βοήθησε να κάνει το πήδημα χάνεται, οπότε χάνει τη μνήμη της θέσης που βρισκόταν προηγουμένως. Η διαδικασία αυτή επαναλαμβάνεται συνεχώς. Ο μηχανισμός του φαινομένου δεν θα μας απασχολήσει8 και αναζητούμε μόνο ένα απλό φαινομενολογικό μοντέλο της διαδικασίας.
ϒποθέτουμε ότι το σωμάτιο πηδάει με ίση πιθανότητα σε μια από τις
πλησιέστερες θέσεις του πλέγματος κάθε φορά που περνάει σταθερός χρόνος . Οι
θέσεις του πλέγματος απέχουν μεταξύ τους απόσταση
(πλεγματική σταθερά). Το
διάνυσμα που περιγράφει την μεταβολή της θέσης του σωματιδίου στο
–οστό
πήδημα είναι μια τυχαία μεταβλητή
μέτρου
. Δηλαδή, δεδομένης της
θέσης
του σωματιδίου τη χρονική στιγμή
, η θέση του
τη
χρονική στιγμή
θα είναι
![]() | (11.21) |
όπου
![]() | (11.22) |
Σύμφωνα με τα παραπάνω, οι τιμές των είναι ανεξάρτητες από την τιμή της
θέσης που είχε προηγουμένως το σωμάτιο, οπότε οι τιμές
και
είναι
ασυσχέτιστες για
και ισχύει ότι
![]() | (11.23) |
Οι τιμές που παίρνουν τα είναι ισοπίθανες, οπότε, επειδή οι θετικές και αρνητικές
τιμές συμβαίνουν το ίδιο συχνά οι θετικοί και αρνητικοί όροι στον υπολογισμό της
αλληλοαναιρούνται και έχουμε
![]() | (11.24) |
και έτσι για
. Επειδή το μήκος των διανυσμάτων είναι σταθερό
, παίρνουμε επομένως τη σχέση
![]() | (11.25) |
Η πιθανότητα να εμφανιστεί μια διαδρομή μήκους
είναι9
![]() | (11.26) |
όπου ο αριθμός των πλησιέστερων γειτόνων μιας πλεγματικής θέσης. Η
πιθανότητα αυτή εξαρτάται από το μήκος της διαδρομής και όχι από τη γεωμετρία
της. Αυτό προκύπτει από την προφανή σχέση
, αφού
υπάρχουν ακριβώς
ισοπίθανες περιπτώσεις. Οπότε η συνάρτηση επιμερισμού
είναι
![]() | (11.27) |
και είναι ίση με τον αριθμό των διαφορετικών διαδρομών μήκους .
Μέσα σε χρόνο το σωμάτιο μετατοπίζεται κατά
![]() | (11.28) |
Η μέση τιμή της μετατόπισης είναι 0
![]() | (11.29) |
Η μέση τιμή της μετατόπισης στο τετράγωνο είναι
![]() | (11.30) |
Βγάζουμε λοιπόν το πολύ σημαντικό αποτέλεσμα ότι ο τυχαίος περιπατητής απομακρύνεται πολύ αργά από το αρχικό του σημείο
![]() | (11.31) |
Για σωμάτιο με μη μηδενική μέση ταχύτητα (δες πρόβλημα) αναμένεται .
Η παραπάνω σχέση ορίζει έναν κρίσιμο εκθέτη
![]() | (11.32) |
όπου το σύμβολο σημαίνει ασυμπτωτική συμπεριφορά για
. Για ένα
κλασικό περιπατητή
, ενώ για τον τυχαίο περιπατητή
.
Παραλλαγές του Τυχαίου Περιπατητή (Random Walker – RW για συντομία)
αποτελούν ο Μη Επιστρέφων Τυχαίος Περιπατητής (Non Reversal Random Walk –
NRRW για συντομία) και ο Αυτοαποφεύγων Τυχαίος Περιπατητής (Self Avoiding
Random Walk – SAW για συντομία). Ο NRRW ορίζεται όταν τα διανύσματα
επιλέγονται ισοπίθανα αποκλείοντας την επιστροφή στο αρχικό σημείο. Ο SAW είναι
ένας NRRW όπου κάθε φορά που ο περιπατητής επισκέπτεται μία πλεγματική θέση
που έχει ήδη επισκεφτεί, το ... περπάτημα σταματάει. Επί πλέον είναι δυνατόν να
προσθέσουμε, εκτός από την άπειρη απωστική ενέργεια για σημεία που συμπίπτουν,
και μια ελκτική ενέργεια
για κάθε ζευγάρι σημείων που ανήκουν στη
διαδρομή και είναι πλησιέστεροι γείτονες. Κάθε επιτρεπόμενη διαδρομή θα
ζυγίζεται τότε με πιθανότητα κατά Boltzmann σύμφωνα με την (12.4)
.
Για τον NRRW η σχέση (11.32) είναι ίδια με τον RW, δηλαδή . Παρόλο
που οι λεπτομέρειες των διαδρομών σε μικρές αποστάσεις είναι διαφορετικές, οι
ιδιότητες τους σε μακροσκοπικές κλίμακες είναι παρόμοιες. Είναι περίπτωση
συστημάτων που ανήκουν στην ίδια κλάση παγκοσμιότητας (universality class)
σύμφωνα με τη συζήτηση που θα βρείτε στην ενότητα 13.1.
Δεν συμβαίνει το ίδιο και για τον SAW. Για το σύστημα αυτό προβλέπεται ότι [49]
![]() | (11.33) |
οπότε οι τυπικές διαδρομές στο πρότυπο αυτό είναι μεγαλύτερες από τον RW. Αν
εισάγουμε την έλξη μεταξύ πλησιέστερων γειτόνων σύμφωνα με τα παραπάνω, τότε
υπάρχει κρίσιμη θερμοκρασία τέτοια ώστε για θερμοκρασία
να έχουμε
παρόμοια συμπεριφορά με την (11.33) , ενώ για
οι διαδρομές να
“συνθλίβονται” από την αλληλεπίδραση και να παίρνουμε
. Για
έχουμε
. Για περισσότερες λεπτομέρειες παραπέμπουμε στο βιβλίο
των Binder-Heermann [7].
Μπορούμε τώρα να προγραμματίσουμε τον τυχαίο περιπατητή. Ο αλγόριθμος είναι πολύ απλός και οι μετρήσεις γίνονται με απλή δειγματοληψία:
Η μόνη έννοια που χρειάζεται να εξηγήσουμε πώς θα προγραμματίσουμε είναι αυτή της επιλογής της “τυχαίας διεύθυνσης ”. Το πρόγραμμα που δείχνεται παρακάτω θα το βρείτε στο αρχείο rw.f90
Στο πρόγραμμα αυτό το μήκος των διαδρομών Nstep και ο αριθμός των διαδρομών
Nwalk είναι παράμετροι που έχουν προκαθορισμένες τιμές. Οπότε για την αλλαγή
των τιμών τους απαιτείται επαναμεταγλωττισμός του προγράμματος. Τα
αποτελέσματά μας τα αποθηκεύουμε στα αρχεία dataR και data στα οποία
αποθηκεύουμε το τετράγωνο της τελικής μετατόπισης του RW και τις
συντεταγμένες των σημείων
που επισκέπτεται ο περιπατητής, αντίστοιχα, σε
κάθε διαδρομή. Για να κάνουμε τα περιεχόμενα των αρχείων άμεσα διαθέσιμα,
αδειάζουμε τα I/O buffers με την υπορουτίνα flush(unit). Παρατηρούμε ότι το
αρχείο data ανοίγει και μηδενίζεται στην αρχή κάθε διαδρομής, οπότε περιέχει της
συντεταγμένες μιας μόνο διαδρομής.
Κάθε διαδρομή εκτελείται σε Nstep βήματα, όπου αφού επιλεγεί το τυχαίο
διάνυσμα , προστίθεται στην εκάστοτε θέση
. To
επιλέγεται στη γραμμή
όπου ο ir λόγω της συνάρτησης INT που κόβει το δεκαδικό μέρος
ενός real. Οι τιμές του ir αντιστοιχούν στις τέσσερις δυνατές τιμές του
. Η
ενημέρωση της θέσης του περιπατητή γίνεται με το select case(ir) που ανάλογα
με την τιμή του ir ενημερώνει τις συντεταγμένες που μεταβάλλονται στην
αντίστοιχη διεύθυνση.
Για τη μεταγλώττιση του κώδικα και την εκτέλεση του προγράμματος δίνουμε τις εντολές
που μας δίνει το εκτελέσιμο αρχείο rw που τρέχει το πρόγραμμα. Λόγω της εντολής call sleep(2), το πρόγραμμα σταματάει για 2 δευτερόλεπτα κάθε φορά που ολοκληρώνεται μια διαδρομή (αφαιρέστε την, όταν θα θέλετε να παράγετε πολλές διαδρομές). Αυτό μας επιτρέπει να παρακολουθήσουμε γραφικά τις διαδρομές που παράγονται. Κατά τη διάρκεια που το πρόγραμμα τρέχει, δώστε από το gnuplot την εντολή
Επαναλάβετε την όσες φορές θέλετε για να δείτε άλλες τυχαίες διαδρομές. Για να γίνεται αυτή η διαδικασία αυτόματα χρησιμοποιήστε το script eternal-rw από το συνοδευτικό λογισμικό:
όπου την τελευταία εντολή τη δίνετε όταν θέλετε να τερματίσετε την εκτέλεση των προγραμμάτων.
Στο σχήμα 11.8 παρουσιάζονται τυπικές διαδρομές από το τρέξιμο του παραπάνω
προγράμματος. Στο σχήμα 11.9 φαίνονται τα αποτελέσματα για την ποσότητα
για
τα οποία επιβεβαιώνουν τη σχέση (11.30)
.
Το σχήμα αυτό μπορεί να αναπαραχθεί ως εξής:
και σημειώνουμε τα αποτελέσματα σε ένα αρχείο r2.dat σε
δύο στήλες με το μήκος των διαδρομών στην πρώτη και το
υπολογιζόμενο
στη δεύτερη. Το πρόγραμμα awk με την
εντολή10
{av+=$1} προσθέτει την πρώτη στήλη κάθε γραμμής του αρχείου dataR στη
μεταβλητή av. Αφού διαβάσει το αρχείο, με την εντολή END{print av/NR},
τυπώνει τη μεταβλητή av διαιρεμένη με τον αριθμό των γραμμών στο αρχείο
(NR = “Number of Records”). Παίρνουμε έτσι το μέσο όρο της πρώτης στήλης
του dataR.
Φυσικά τα παραπάνω αποτελέσματα δεν έχουν νόημα αν δεν γνωρίζουμε τα στατιστικά
σφάλματα που υπεισέρχονται. Αφού πρόκειται για στατιστικές ποσότητες
ανεξάρτητες μεταξύ τους, η αναμενόμενη τιμή προσεγγίζεται στο όριο άπειρων
μετρήσεων με μια ταχύτητα , όπου
είναι ο αριθμός των
μετρήσεων. Επειδή παράγουμε στοχαστικά ανεξάρτητες μεταξύ τους τυχαίες
διαδρομές11 ,
το σφάλμα στις μετρήσεις μας θα δίνεται από τη σχέση (11.3) , λ.χ.
![]() | (11.34) |
Το σφάλμα υπολογίζεται εύκολα, είτε προσθέτοντας τον υπολογισμό στο πρόγραμμα rw.f90, είτε κρατώντας το βασικό πρόγραμμα στη δυνατόν απλούστερη μορφή και αφήνοντας την επαναλαμβανόμενη εργασία σε εξωτερικά βοηθητικά προγράμματα (utilities). Στο αρχείο average γράφουμε τις εντολές awk:
Το παραπάνω αρχείο είναι παράδειγμα από script το οποίο ερμηνεύεται από την awk. Αυτό γίνεται αντιληπτό στο λειτουργικό σύστημα από την πρώτη γραμμή #!/bin/awk -f που καλεί το πρόγραμμα όταν εκτελεστεί το αρχείο average ως μια οποιαδήποτε εντολή. Για να γίνει αυτό, το αρχείο πρέπει να γίνει εκτελέσιμο με την εντολή chmod a+x average. Στη συνέχεια, μπορούμε να εκτελέσουμε τις εντολές που περιέχει πάνω στο αρχείο dataR από τη γραμμή εντολών:
Θυμίζουμε πως στην awk οι εντολές που έχουμε μεταξύ { ... } εκτελούνται για κάθε γραμμή του αρχείου dataR. Aυτές που είναι μεταξύ END{ ... } εκτελούνται, αφού διαβαστεί όλο το αρχείο12 . Οπότε οι γραμμές
προσθέτουν στις μεταβλητές av και er την τιμή της πρώτης στήλης κάθε γραμμής του αρχείου dataR και του τετραγώνου αυτής αντίστοιχα. Οι γραμμές
εκτελούνται αφού διαβαστεί όλο το αρχείο dataR και διαιρούν τις παραπάνω μεταβλητές με την προκαθορισμένη μεταβλητή της awk NR. Αυτή έχει σε κάθε στιγμή τιμή ίση με τον αριθμό των γραμμών του αρχείου που έχει επεξεργαστεί το πρόγραμμα, άρα όταν εκτελείται το END{ ... } έχει τιμή ίση με το συνολικό αριθμό γραμμών του αρχείου. Οι τελευταίες γραμμές του script κάνουν τον τελικό υπολογισμό του σφάλματος σύμφωνα με τη σχέση (11.34) και τυπώνουν το αποτέλεσμα. Στο συνοδευτικό λογισμικό, θα βρείτε το αρχείο rw1-anal.csh όπου όλες οι παραπάνω εντολές κωδικοποιούνται σε ένα σενάριο φλοιού. Διαβάστε τις οδηγίες χρήσεις στα αρχικά σχόλια που υπάρχουν εκεί.
΄Οταν τελειώσει η εκτέλεση της εντολής, το πρόγραμμα /usr/bin/time θα
τυπώσει στο stderr το χρόνο CPU που κατανάλωσε το πρόγραμμα σε
δευτερόλεπτα. Μετρήστε το χρόνο που χρειάζεται για την παραγωγή
τυχαίων αριθμών από την drandom(), την random_number και την ranlux.
Στην τελευταία θα μεταβάλετε τον ranlux_level από 1 έως 4. Πώς
μεταβάλλεται ο χρόνος αυτός αν παράγετε τυχαίους αριθμούς με τις
random_number και ranlux έναν-έναν και πώς αν τους ζητάτε σε ένα array
μεγέθους 1000; Αν αυξήσετε το μέγεθος του array σε 10000, μεταβάλλεται ο
χρόνος αυτός; (ϒπόδειξη: Δείτε το αρχείο performance_ran.f90 στο
συνοδευτικό λογισμικό)
Δεν υπάρχει ενδιαφέρον φυσικό σύστημα του οποίου ο υπολογισμός της συνάρτησης
επιμερισμού να γίνεται με απ’ ευθείας υπολογισμό. Στις περισσότερες περιπτώσεις
καταφεύγουμε σε στατιστική δειγματοληψία και η πιο διαδεδομένη μέθοδος, λόγω της
αποτελεσματικότητας της και της γενικής της εφαρμογής, είναι η μέθοδος Μόντε
Κάρλο. Είναι αξιοσημείωτο ότι σε συστήματα όπως το απλό πρότυπο Ising χρήσιμα
αποτελέσματα μπορούν να εξαχθούν σε μία τυπική προσομοίωση που γίνεται σε ένα
λάπτοπ με τη μελέτη δειγμάτων της τάξης του συνολικού χώρου των
καταστάσεων1 .
Για πιο πολύπλοκα συστήματα, ο λόγος αυτός γίνεται ακόμα πιο εντυπωσιακός. Αυτό
γίνεται διαισθητικά αποδεκτό λαμβάνοντας υπόψη ότι και στο εργαστήριο ένα
πραγματικό στατιστικό σύστημα μας δίνει πειραματική πληροφορία, όταν μέσα στο χρόνο
του πειράματος το σύστημα επισκέπτεται ακόμα μικρότερα ποσοστά του φασικού
χώρου2 .
Η Στατιστική Φυσική έχει σκοπό να περιγράψει συστήματα με πολύ μεγάλο αριθμό
βαθμών ελευθερίας . Απλά συστήματα έχουν τυπικά
–
. Για τα
συστήματα αυτά οι εξισώσεις που περιγράφουν μικροσκοπικά το σύστημα είναι
πρακτικά αδύνατον και τελικά μάλλον άχρηστο να λυθούν. Αρκούν μερικά σωστά
ορισμένες “ιδιότητες όγκου” (bulk properties) του συστήματος για να μας δώσουν
τις χρήσιμες φυσικές πληροφορίες για το σύστημα. Λ.χ. σε έναν μαγνήτη πολλές
φορές μας αρκεί να γνωρίζουμε την εσωτερική ενέργεια και μαγνήτιση του υλικού,
σε ένα ρευστό την ενέργεια και πυκνότητά του κ.ο.κ. και όχι αναλυτικά την θέση,
ενέργεια, ορμή και στροφορμή κάθε σωματιδίου που τα αποτελούν. Αυτά είναι
γνωστά από τη θερμοδυναμική, στη στατιστική φυσική όμως γίνεται η απόπειρα να
παραχθούν οι παραπάνω ιδιότητες των συστημάτων από τις μικροσκοπικές τους
ιδιότητες, δηλ. κινηματική – βαθμοί ελευθερίας και δυναμική – Hamiltonian του
συστήματος.
Στην περίπτωσή μας θα κάνουμε τις, όχι ιδιαίτερα περιοριστικές, υποθέσεις ότι το
σύστημά μας περιγράφεται από διακριτές καταστάσεις που μπορούν να απαριθμηθούν
μέσα σε ένα σύνολο με αντίστοιχες ενέργειες
Το
σύστημα αυτό είναι σε επαφή με μεγάλη δεξαμενή θερμότητας θερμοκρασίας
με το οποίο μπορεί να αλληλεπιδρά. Η επαφή με τη δεξαμενή και η
δυναμική των βαθμών ελευθερίας έχει σαν αποτέλεσμα να συμβαίνουν τυχαίες
μεταβάσεις μεταξύ καταστάσεων οι οποίες μπορούν να αλλάζουν την ενέργεια του
συστήματος3 .
Η θεμελιώδεις ποσότητες που μας ενδιαφέρουν είναι τα βάρη (weights)
που
μας δίνουν την πιθανότητα να είναι το σύστημα στην κατάσταση
τη χρονική
στιγμή
. Αυτές κωδικοποιούν την μικροσκοπική φυσική στη στατιστική
φυσική.
΄Εστω ότι δίνουν το ρυθμό μετάβασης από την κατάσταση
,
δηλ.
![]() | (12.1) |
Τότε μπορούμε να γράψουμε την πολύ γενική “δεσπόζουσα εξίσωση” (master equation):
Η πρώτη από τις παραπάνω εξισώσεις μας λέει απλά ότι η μεταβολή του βάρους Οι ρυθμοί μετάβασης προκύπτουν από τη θερμική φύση της
αλληλεπίδρασης του συστήματος με τη θερμική δεξαμενή. Στην πράξη αυτοί
προσομοιώνονται με κατάλληλες επιλογές κατά τη διάρκεια των υπολογισμών
Μόντε Κάρλο. Τα
θεωρούνται ανεξάρτητα του χρόνου, οπότε το
παραπάνω σύστημα εξισώσεων για τα
είναι γραμμικό, και ο περιορισμός
οδηγεί στο (μη τετριμμένο) συμπέρασμα ότι σε άπειρο χρόνο τα
συγκλίνουν γρήγορα (για μεγάλα συστήματα) σε αριθμούς
,
τις πιθανότητες κατάληψης ισορροπίας. Δηλαδή μετά από κάποιο χρόνο
![]() | (12.4) |
Η παράμετρος θα αναφέρεται απλά ως η θερμοκρασία του συστήματος
και βλέπουμε ότι μέσω του εκθετικού στην εξίσωση (12.4) καθορίζει μία
χαρακτηριστική ενέργεια για το σύστημα. H μέτρησή της σε βαθμούς Kelvin κλπ
οφείλεται σε ιστορικό ατύχημα εξαιτίας της άγνοιας της μικροσκοπικής της
προέλευσης κατά την αρχική θεμελίωση της θερμοδυναμικής.
Η σταθερά στην (12.4) είναι η συνάρτηση επιμερισμού του συστήματος και
είναι η σταθερά κανονικοποίησης της κατανομής
. Η σχέση
μας
δίνει
![]() | (12.5) |
Η τιμή μιας φυσικής ποσότητας που μετριέται στο εργαστήριο έχει στοχαστικό
χαρακτήρα. Για συστήματα με πολύ μεγάλο αριθμό βαθμών ελευθερίας
πρακτικά κάποιος ενδιαφέρεται για τη μέση τιμή μιας ποσότητας. Αυτό γίνεται
γιατί η πιθανότητα να μετρηθεί μια τιμή που διαφέρει σημαντικά από τη
μέση τιμή είναι αμελητέα. Σύμφωνα με τα παραπάνω η μέση τιμή
μιας
φυσικής ποσότητας
η οποία παίρνει την τιμή
στην κατάσταση
θα
είναι
![]() | (12.6) |
΄Οπως θα δούμε παρακάτω, η τυπική απόκλιση για ένα τυπικό θερμοδυναμικό
σύστημα είναι τέτοια, ώστε
![]() | (12.7) |
ποσοστό το οποίο είναι αμελητέο για συνήθη μακροσκοπικά συστήματα
(π.χ. για έχουμε
). Για το λόγο αυτό, όταν το
σύστημα είναι μεγάλο, οι διακυμάνσεις μπορούν να αγνοηθούν. Το όριο
ονομάζεται θερμοδυναμικό όριο και το ενδιαφέρον μας εστιάζεται στην
συμπεριφορά του συστήματος στο όριο αυτό. Στην πράξη, ενώ τα συστήματα στο
εργαστήριο είναι τις περισσότερες φορές πολύ κοντά στο όριο αυτό, στις
προσομοιώσεις μας, πολύ συχνά, δεν είναι δυνατόν να μελετήσουμε αρκετά
μεγάλα συστήματα. Η όλη τέχνη επικεντρώνεται στο σχεδιασμό αλγορίθμων
προσομοίωσης και μεθόδων ανάλυσης, έτσι ώστε να έχουμε εμπιστοσύνη ότι τα
αποτελέσματά μας αντανακλούν τη συμπεριφορά του συστήματος στο θερμοδυναμικό
όριο.
Η συνάρτηση επιμερισμού κωδικοποιεί λόγω του ορισμού (12.5) όλη τη
στατιστική πληροφορία για το σύστημα. Δεν είναι μια απλή συνάρτηση μίας
μεταβλητής (της ), αλλά απαριθμεί με σχετικό βάρος τις δυνατές καταστάσεις του
συστήματος. Απλό παράδειγμα αποτελεί ο υπολογισμός μέσω αυτής της μέσης
ενέργειας
(εσωτερικής ενέργειας
στη θερμοδυναμική) του συστήματος:
Με τον ίδιο τρόπο μπορεί κανείς να υπολογίσει την ειδική θερμότητα
![]() | (12.9) |
Από τη θερμοδυναμική γνωρίζουμε ότι η εντροπία ενός θερμοδυναμικού
συστήματος ορίζεται από τη σχέση
![]() | (12.10) |
όπου είναι η ελεύθερη ενέργεια του συστήματος. Θα επιχειρήσουμε τώρα να
δώσουμε ορισμούς που να είναι συνεπείς με τους παραπάνω και να προκύπτουν από
τις μικροσκοπικές καταστάσεις του συστήματος.
Ορίζουμε την ελεύθερη ενέργεια από τη σχέση
ή ισοδύναμα Παρατηρήστε ότι ο παραπάνω ορισμός τηςΟ ορισμός (12.11) είναι συνεπής με την (12.10) , γιατί
![]() | (12.13) |
Η σύνδεση της εντροπίας με τη μικροφυσική γίνεται με τις σχέσεις (12.11)
και (12.10) :
![]() | (12.14) |
Αλλά
![]() | (12.15) |
οπότε
Τελικά
![]() | (12.17) |
Ας κάνουμε μία διερεύνηση του παραπάνω τύπου. Ας υποθέσουμε ότι σε ένα (ομολογουμένως ασυνήθιστο 5 ) σύστημα όλες οι καταστάσεις έχουν την ίδια ενέργεια. Στην περίπτωση αυτή, με απλή αντικατάσταση στην εξίσωση (12.17) παίρνουμε ότι
![]() | (12.18) |
Δηλαδή η εντροπία μετράει τον αριθμό των καταστάσεων του συστήματος, όπως ακριβώς και στην περίπτωση της μικροκανονικής συλλογής. Πράγματι, η τελευταία σχέση προκύπτει και για την κατανομή
![]() | (12.19) |
που μπορεί να θεωρηθεί πως δίνει την μικροκανονική συλλογή αφού βάζει τον
περιορισμό Η συνάρτηση
[σε πολλά βιβλία συμβολίζεται με
] μετράει τον αριθμό των καταστάσεων με ενέργεια ίση με
. Από
αυτή προκύπτει η πιθανότητα
το σύστημα να βρεθεί να έχει ενέργεια
![]() | (12.20) |
Επειδή προφανώς , παίρνουμε
![]() | (12.21) |
Για ένα τυπικό σύστημα σαν αυτά που θα μελετήσουμε ισχύει
![]() | (12.22) |
όπου ο αριθμός των βαθμών ελευθερίας του συστήματος και
μια σταθερά.
Η ποιοτική συμπεριφορά της κατανομής (12.21) φαίνεται στο σχήμα 12.1.
Γενικά παρατηρούμε ότι οι πιθανές τιμές της ενέργειας επικεντρώνονται γύρω από
μια τιμή και η απόκλιση
είναι ένα μέτρο της διασποράς των τιμών
που, όπως θα δείξουμε παρακάτω, ο λόγος
μειώνεται με το
με
χαρακτηριστική συμπεριφορά
. Πράγματι, η συνάρτηση (ανάλογη της
)
![]() | (12.23) |
έχει μέγιστο, όταν
![]() | (12.24) |
ή
![]() | (12.25) |
Το μετατοπίζεται προς μεγαλύτερες τιμές με την αύξηση της θερμοκρασίας
(μείωση του
) και είναι, όπως αναμένεται, ανάλογο του μεγέθους του συστήματος.
Αναπτύσσοντας κατά Taylor
![]() | (12.27) |
Η παραπάνω κατανομή είναι Gaussian με τυπική απόκλιση
![]() | (12.28) |
όπου κρατήσαμε μόνο την εξάρτηση από το μέγεθος του συστήματος και τη
θερμοκρασία
. Οπότε πράγματι επιβεβαιώνουμε τη σχέση (12.7)
![]() | (12.29) |
Η παραπάνω ανάλυση υπέθεσε αναλυτική συμπεριφορά [ανάπτυγμα Taylor, σχέση (12.26) ] η οποία δεν ισχύει όταν είμαστε σε ένα κρίσιμο σημείο μιας μετάβασης φάσης.
Μια άλλη σημαντική περίπτωση που η παραπάνω ανάλυση δεν
ισχύει είναι όταν η κατανομή έχει παραπάνω από ένα μέγιστα
6 .
Αυτό συμβαίνει όταν το σύστημα υπόκειται σε μετάβαση φάσης πρώτης τάξης, π.χ.
όταν ο πάγος γίνεται νερό ή όταν ένα μαγνητικό υλικό που βρίσκεται σε ένα
μαγνητικό πεδίο χάσει τη μαγνήτισή του λόγω αύξησης της θερμοκρασίας του. Στην
περίπτωση αυτή, οι δύο καταστάσεις πάγος – νερό/μαγνήτης – παραμαγνήτης έχουν
την ίδια πιθανότητα εμφάνισης (“συνυπάρχουν”) και μία τυπική κατανομή με δομή
δύο κορυφών φαίνεται στο σχήμα 12.2.
Κάθε παρατηρήσιμη ποσότητα έχει στοχαστική συμπεριφορά σύμφωνα με μια
κατανομή πιθανότητας
που προκύπτει από την κατανομή Boltzmann (12.4) .
Μια τέτοια κατανομή χαρακτηρίζεται πλήρως από τη μέση τιμή
και τις ροπές
ανώτερης τάξης, δηλ. τις μέσες τιμές
,
Η πιο χρήσιμη
ποσότητα από αυτές δίνεται από τη διακύμανση γύρω από τη μέση τιμή για
![]() | (12.30) |
Η ποσότητα αυτή δίνει τις περισσότερες φορές ένα μέτρο της απόκλισης της
από τη μέση τιμή της
. Για την περίπτωση της ενέργειας
παίρνουμε
![]() | (12.31) |
και από τις σχέσεις
![]() | (12.32) |
και
![]() | (12.33) |
προκύπτει ότι
![]() | (12.34) |
που σύμφωνα με τη σχέση (12.9) είναι η ειδική θερμότητα
![]() | (12.35) |
΄Αρα, καταλήγουμε στο ενδιαφέρον συμπέρασμα ότι η ειδική θερμότητα ενός συστήματος (θερμοδυναμική ποσότητα) συνδέεται άμεσα με τις μικροσκοπικές στατιστικές διακυμάνσεις της ενέργειας του συστήματος.
Αυτό ισχύει γενικά για οποιαδήποτε φυσική ποσότητα του συστήματος που έχει
γραμμική σύζευξη με ένα εξωτερικό πεδίο. Μία τέτοια ποσότητα για ένα μαγνητικό
σύστημα που βρίσκεται μέσα σε ένα ομογενές μαγνητικό πεδίο είναι η μαγνήτιση
. Αν
είναι η μαγνήτιση του συστήματος στην κατάσταση
και αν
υποθέσουμε ότι είναι στην διεύθυνση του
, τότε η Hamiltonian του συστήματος
γίνεται
![]() | (12.36) |
και η συνάρτηση επιμερισμού
![]() | (12.37) |
Ο όρος “γραμμική σύζευξη” οφείλεται στο γραμμικό όρο στη Hamiltonian.
Οι ποσότητες
και
ονομάζονται συζυγείς. Παρόμοια σχέση έχουν η
πίεση/όγκος (
/
) σε ένα αέριο ή το χημικό δυναμικό/αριθμός σωματιδίων
(
/
) στη μεγαλοκανονική συλλογή.
Εξαιτίας αυτής της γραμμικής σύζευξης παίρνουμε
![]() | (12.38) |
σχέση που είναι ανάλογη με την (12.8) . Η αντίστοιχη της (12.34) προκύπτει από
(12.30) για
![]() | (12.39) |
και από
![]() | (12.40) |
οπότε
![]() | (12.41) |
Η μαγνητική επιδεκτικότητα ορίζεται από τη σχέση
![]() | (12.42) |
από όπου φαίνεται ότι σχετίζεται άμεσα με τις διακυμάνσεις της μαγνήτισης. Η παραπάνω ανάλυση μπορεί να γίνει πανομοιότυπα για οποιοδήποτε ζεύγος συζυγών ποσοτήτων.
Οι συναρτήσεις συσχετισμού προκύπτουν από τη συζήτηση της προηγούμενης
παραγράφου, αν θεωρήσουμε μαγνητικά πεδία τα οποία έχουν τιμή
που εξαρτάται από τη θέση στο χώρο. Για λόγους απλότητας (αλλά και
επειδή πρόκειται να μελετήσουμε μόνο τέτοια συστήματα) το σύστημά μας
βρίσκεται μέσα σε ένα “χώρο” στον οποίο οι δυνατές θέσεις είναι οι
διακριτές θέσεις ενός πλέγματος τις οποίες αντιστοιχούμε σε φυσικούς
αριθμούς7
. Τότε το μαγνητικό πεδίο
θα είναι συνάρτηση της θέσης στο
πλέγμα και αλληλεπιδρά με το σπιν
![]() | (12.43) |
και η μαγνήτιση ανά πλεγματική θέση
8
στη θέση πλέγματος
είναι
![]() | (12.44) |
Η συνάρτηση συσχετισμού δύο σημείων (connected two point correlation function) ορίζεται ως
![]() | (12.45) |
Η παραπάνω συνάρτηση έχει μεγάλη θετική τιμή, όταν οι τιμές ,
είναι ισχυρά
συσχετισμένες, δηλ. “μεταβάλλονται μαζί” στα τυχαία δείγματα που παίρνουμε από
το σύστημα, ενώ αντίθετα είναι σχεδόν μηδέν όταν η τιμή της
εξαρτάται ελάχιστα
από την
(ασυσχέτιστες τυχαίες μεταβλητές). ϒπάρχει, φυσικά, και οι περίπτωση
οι
,
να είναι ισχυρά αντι-συσχετισμένες και η συνάρτηση συσχετισμού να
είναι αρνητική.
Η συνάρτηση συσχετισμού παίρνει τη μέγιστη τιμή της
για
. Στη συνέχεια, πέφτει γρήγορα κατά απόλυτη τιμή. Για ένα σύνηθες
σύστημα
![]() | (12.46) |
όπου η απόσταση των σημείων
,
. Το μήκος συσχετισμού
, είναι ένα
χαρακτηριστικό μήκος για το σύστημα που δίνει ένα μέτρο της απόστασης όπου
υπάρχει ουσιαστικός συσχετισμός μεταξύ των τιμών της μαγνήτισης σε δύο
πλεγματικές θέσεις. Εξαρτάται από τις παραμέτρους που ορίζουν το σύστημα
. Είναι σημαντικό να κατανοηθεί ότι το μήκος συσχετισμού
ορίζει μια κλίμακα μήκους που προκύπτει δυναμικά. Αντίθετα κλίμακες μήκους όπως
το μέγεθος
του συστήματος ή η απόσταση
μεταξύ δύο πλεγματικών σημείων
(πλεγματική σταθερά) είναι κλίμακες μήκους που δίνονται από τον ορισμό του
συστήματος και δεν εξαρτώνται από τις δυναμικές παραμέτρους. Συνήθως το
είναι της τάξης μεγέθους της πλεγματικής σταθεράς
και το σύστημα δεν
παρουσιάζει συσχετισμούς σε μακροσκοπικές κλίμακες (δηλ. της τάξης του
).
Πολύ ενδιαφέρουσα φυσική προκύπτει όταν σε κάποια συστήματα μπορούμε να
ρυθμίσουμε με λεπτότητα τις παραμέτρους από τις οποίες εξαρτάται το , έτσι
ώστε στο θερμοδυναμικό όριο να πάρουμε
. Αυτό γίνεται στην
περιοχή μίας συνεχούς (όχι πρώτης τάξης) μετάβασης φάσης. Στην περίπτωση,
αυτή η εκθετική συμπεριφορά χάνεται και έχουμε πολύ βραδύτερη πτώση
της
(βλ. σχήμα 12.3), που σε
χωρικές διαστάσεις δίνεται
από
![]() | (12.47) |
Καθώς πλησιάζουμε το κρίσιμο σημείο, οι συσχετισμοί εκτείνονται σε αποστάσεις
. Τότε το σύστημα παύει να “βλέπει” τις λεπτομέρειες του πλέγματος και
συμπεριφέρεται με πολύ καλή προσέγγιση σαν το πλέγμα να ήταν ένας συνεχής
χώρος. Το όριο αυτό αναφέρεται ως το “συνεχές όριο” (continuum limit) μιας
θεωρίας που ορίζεται σε ένα πλέγμα. Εξαιτίας του ότι οι λεπτομέρειες του πλέγματος
γίνονται ασήμαντες στο όριο αυτό, θεωρίες που ορίζονται μικροσκοπικά με
διαφορετικό τρόπο (λ.χ. μια σε τετραγωνικό πλέγμα και μία σε εξαγωνικό) έχουν το
ίδιο συνεχές όριο. Το φαινόμενο αυτό ονομάζεται παγκοσμιότητα (universality) και
παίζει κεντρικό ρόλο στη μελέτη στατιστικών συστημάτων, καθώς και στην κβαντική
θεωρία πεδίου.
Ο κύριος στόχος μας είναι ο προσδιορισμός της μέσης τιμής μιας φυσικής
ποσότητας
(λ.χ. ενέργειας, μαγνήτισης, συνάρτησης συσχετισμού) σε ένα
στατιστικό σύστημα στην κανονική συλλογή
![]() | (12.48) |
Για το λόγο αυτό επιλέγουμε δείγμα από καταστάσεις
οι
οποίες κατανέμονται σύμφωνα με την κατανομή πιθανότητας
και ορίζουμε τον
εκτιμητή (estimator)
της
![]() | (12.49) |
Ο παραπάνω τύπος γίνεται εύκολα κατανοητός αφού, για μεγάλο δείγμα,
, και περιμένουμε
ότι
![]() | (12.50) |
Ο στόχος μας είναι η κατάλληλη επιλογή της κατανομής , έτσι ώστε η σύγκλιση
(12.50) να γίνεται γρήγορα. Διακρίνουμε τις εξής περιπτώσεις:
Διαλέγουμε , οπότε η (12.49) γίνεται
![]() | (12.51) |
Το πρόβλημα με την επιλογή αυτή είναι ότι έχουμε πρόβλημα επικάλυψης του
δείγματος με τις καταστάσεις που πραγματικά συνεισφέρουν στο άθροισμα (12.48)
. ΄Οπως αναφέραμε και στην εισαγωγή, ο αριθμός των καταστάσεων που
επιλέγεται σε μια προσομοίωση Μόντε Κάρλο στο δείγμα είναι ένα ελάχιστο
ποσοστό του χώρου των καταστάσεων του συστήματος. ΄Αρα, η πιθανότητα να
πάρουμε εκείνες τις καταστάσεις που δίνουν σημαντική συνεισφορά στο
άθροισμα (12.48) είναι εν γένει πολύ μικρή. Ας πάρουμε για παράδειγμα την
περίπτωση σε ένα τυπικό μοντέλο. Σύμφωνα με τη σχέση (12.21)
έχουμε
![]() | (12.52) |
όπου είναι η πιθανότητα εμφάνισης ενέργειας
στο σύστημα. Η ποιοτική
μορφή της φαίνεται στο σχήμα 12.1. Από τις σχέσεις (12.25) και (12.28) έχουμε
ότι
και
, οπότε για τις περιπτώσεις
και
παίρνουμε ποιοτικά τη συμπεριφορά που φαίνεται στο σχήμα 12.4.
Η κατανομή της απλής δειγματοληψίας αντιστοιχεί στην περίπτωση (βλ.
σχέση (12.4) ). Για να υπολογίσουμε με ακρίβεια το άθροισμα (12.52) για
πρέπει να πάρουμε καλό δείγμα στην περιοχή όπου το γινόμενο
είναι
σχετικά σημαντικό. ΄Οπως βλέπουμε και στο σχήμα 12.4, η πιθανότητα να πάρουμε
στο δείγμα κατάσταση με ενέργεια τέτοια ώστε το
να είναι σχετικά
σημαντικό είναι πολύ μικρή, όταν η δειγματοληψία γίνεται με την κατανομή
.
Παρόλο που η συγκεκριμένη μέθοδος έχει το μειονέκτημα αυτό, μπορεί να φανεί
χρήσιμη σε ορισμένες περιπτώσεις. Την εφαρμόσαμε ήδη στην περίπτωση του
τυχαίου περιπατητή. Παρατηρήστε επίσης ότι το δείγμα που παίρνουμε είναι
ανεξάρτητο του και χρησιμοποιώντας τη σχέση (12.51) υπολογίζουμε τις μέσες
τιμές για κάθε
.
Από ότι είδαμε παραπάνω, ένα πολύ μικρό μέρος του χώρου των καταστάσεων δίνει
σημαντική συνεισφορά στον υπολογισμό του . Αν επιλέξουμε το δείγμα με
πιθανότητα
![]() | (12.53) |
περιμένουμε να δειγματοληπτήσουμε ακριβώς μέσα στον υπόχωρο αυτό. Πράγματι, ο υπολογισμός του εκτιμητή (12.49) γίνεται με τη σχέση
![]() | (12.54) |
Η παραπάνω δειγματοληψία λέγεται δειγματοληψία με κριτήριο σημαντικότητας
(importance sampling) και είναι ο τρόπος ο οποίος χρησιμοποιείται για
προσομοιώσεις στατιστικών συστημάτων στην κανονική συλλογή. Το δείγμα
εξαρτάται από τη θερμοκρασία και ο υπολογισμός των μέσων τιμών
(12.54) απαιτεί καινούργια δειγματοληψία κάθε φορά σε αντίθεση με τη
(12.51) . Αυτή η δυσκολία όμως, στις περισσότερες περιπτώσεις, είναι πολύ
μικρότερη από το πρόβλημα της επικάλυψης που συζητήθηκε στην παράγραφο
12.5.1.
Για να πάρουμε ένα δείγμα το οποίο κατανέμεται σύμφωνα με την κατανομή δεν
αρκεί να το κάνουμε απευθείας. Λ.χ. αν επιχειρήσουμε να δημιουργήσουμε δείγμα με
επιλέγοντας τυχαία κατάσταση
και δεχόμαστε ή απορρίπτουμε την
εισαγωγή στο δείγμα με πιθανότητα
θα έχουμε ελάχιστη πιθανότητα η
κατάσταση να γίνει αποδεκτή στο δείγμα. Οπότε θα βρεθούμε στην ίδια δυσκολία
που βρήκαμε στην περίπτωση της απλής δειγματοληψίας. Για το λόγο αυτό θα
χρησιμοποιήσουμε μια διαδικασία Markov για τη δημιουργία του δείγματος. Αυτή
είναι μια διαδικασία όπου δεδομένου του συστήματος σε μια κατάσταση
παράγει
με στοχαστικό τρόπο μια νέα κατάσταση
. ΄Ετσι δημιουργείται μια αλυσίδα
καταστάσεων
![]() | (12.55) |
η οποία θα αποτελέσει το ζητούμενο δείγμα .
Φανταζόμαστε ότι η επιλογή της κατάστασης
γίνεται στο “χρόνο’
. Η
πιθανότητα μετάβασης
(transition probability) στην κατάσταση
,
όταν το σύστημα είναι στην κατάσταση
πρέπει να ικανοποιεί τις παρακάτω
συνθήκες:
![]() | (12.56) |
Προσοχή, συνήθως και το σύστημα έχει πιθανότητα να
παραμείνει στην ίδια κατάσταση.
Η προσομοίωση Μόντε Κάρλο με τον τρόπο αυτό γίνεται επιλέγοντας κατάλληλα μια
αρχική κατάσταση για το σύστημα και εφαρμόζοντας τον παραπάνω
αλγόριθμο. Η μεγαλύτερη προσπάθεια επικεντρώνεται στον προσδιορισμό των
πιθανοτήτων μετάβασης
, έτσι ώστε η σύγκλιση 4 να επιτυγχάνεται
γρήγορα.
Σημαντική είναι και η επιλογή της αρχικής κατάστασης . Αν αυτή δεν
είναι μια τυπική κατάσταση του τελικού δείγματος θα πρέπει να περάσει
κάποιος χρόνος μέχρι το σύστημα να βρεθεί σε “κατάσταση ισορροπίας”
όπου πια η διαδικασία Markov δειγματοληπτεί μέσα στη σωστή κατανομή. Ο
χρόνος που απαιτείται (thermalization time) μπορεί να γίνει σημαντικό
μέρος της προσπάθειάς μας, αν γίνει λάθος επιλογή της
ή/και των
.
Απαραίτητη προϋπόθεση για να πετύχουμε το δείγμα να ακολουθεί την
ζητούμενη κατανομή σε μια τέτοια διαδικασία είναι να ικανοποιεί το κριτήριο της
εργοδικότητας. Αυτό σημαίνει ότι από κάθε κατάσταση που επιλέγουμε, κάθε
άλλη δυνατή κατάσταση
είναι προσβάσιμη μέσω της διαδικασίας με ένα
πεπερασμένο αριθμό από βήματα. Αν αυτό το κριτήριο δεν ικανοποιείται και
υπάρχουν σημαντικές περιοχές του χώρου των καταστάσεων στις οποίες δεν
μπορούμε να δειγματοληπτήσουμε, δεν θα είναι δυνατόν να πετύχουμε τη
ζητούμενη κατανομή. Στην πράξη, επειδή δεδομένης της
οι καταστάσεις
για τις οποίες
είναι ελάχιστες, πρέπει να είμαστε ιδιαίτερα
προσεκτικοί, ώστε ο αλγόριθμος που επιλέγουμε να μην παραβιάζει τη συνθήκη της
εργοδικότητας9 .
Από την εξίσωση (12.2) μπορούμε εύκολα να καταλάβουμε ότι για να βρεθεί το
σύστημα σε κατάσταση ισορροπίας στην κατανομή , οι πιθανότητες μετάβασης
πρέπει να ικανοποιούν τη σχέση
![]() | (12.57) |
Αυτό σημαίνει ότι ο ρυθμός με τον οποίο το σύστημα μεταβαίνει από την κατάσταση
σε κάποια άλλη, είναι ίσος με το ρυθμό με τον οποίο το σύστημα μεταβαίνει
στην κατάσταση
από κάποια άλλη. Προφανώς, η σχέση (12.56) μας
δίνει
![]() | (12.58) |
Η παραπάνω συνθήκη είναι αναγκαία αλλά δεν είναι ικανή (δες κεφάλαιο 2.2.3 του [4]). Μια ικανή, αλλά όχι αναγκαία, συνθήκη είναι η συνθήκη λεπτομερούς ισορροπίας (detailed balance condition) η οποία όταν ικανοποιείται από τις πιθανότητες μετάβασης, τότε το σύστημα αργά ή γρήγορα θα φτάσει σε κατάσταση θερμικής ισορροπίας
![]() | (12.59) |
Αθροίζοντας και τα δύο μέλη της (12.59) προκύπτει η συνθήκη ισορροπίας (12.57) . Για την κατανομή της κανονικής συλλογής (12.4) έχουμε
![]() | (12.60) |
Μπορεί να δειχτεί ότι, αν οι πιθανότητες μετάβασης ικανοποιούν τις παραπάνω συνθήκες, η κατανομή ισορροπίας του συστήματος θα είναι η κατανομή Boltzmann (12.4) . Το πρόγραμμα της προσομοίωσης Μόντε Κάρλο μπορεί να συνοψιστεί στα επόμενα βήματα:
Η εξίσωση (12.60) έχει πολλές λύσεις. Το ποια θα επιλέξουμε εξαρτάται από την αποδοτικότητά τους σε ένα συγκεκριμένο πρόβλημα και πρέπει να εξεταστεί προσεκτικά κατά περίπτωση. Παραδείγματα τέτοιων επιλογών είναι:
![]() | (12.61) |
![]() | (12.62) |
![]() | (12.63) |
για κατάλληλα επιλεγμένες καταστάσεις ,
![]() | (12.64) |
ενώ για οποιαδήποτε άλλη κατάσταση
. Οι σταθερές
πρέπει
να επιλεγούν κατάλληλα, έτσι ώστε
![]() | (12.65) |
για να έχει νόημα η (12.64) .
Η σχέση (12.65) μας δίνει μεγάλη ελευθερία στην επιλογή των πιθανοτήτων
μετάβασης. Στην πράξη οι σπάνε σε δύο κομμάτια
![]() | (12.66) |
τα οποία αντιστοιχούν σε διακριτά βήματα στον αλγόριθμο.
Η πιθανότητα είναι η πιθανότητα επιλογής (selection probability)
της κατάστασης
, όταν το σύστημα βρίσκεται στην κατάσταση
. Το
πρώτο βήμα δηλαδή είναι να επιλέξουμε μια κατάσταση
με πιθανότητα
.
Το δεύτερο βήμα είναι να επιλέξουμε με πιθανότητα , αν το σύστημα
θα μεταβεί στην κατάσταση
. Αν η απάντηση είναι όχι, τότε παραμένουμε στην
κατάσταση
. Με τον τρόπο αυτό ικανοποιείται η σχέση (12.64) . Οι πιθανότητες
ονομάζονται λόγοι αποδοχής.
Ο στόχος μας επικεντρώνεται στην εύρεση αλγόριθμου τέτοιου, ώστε οι
πιθανότητες επιλογής να δίνουν τους μέγιστους δυνατούς λόγους αποδοχής για
καταστάσεις ασυσχέτιστες κατά το μέγιστο δυνατόν από την κατάσταση
.
Ιδανική περίπτωση είναι να έχω
για όλα τα
για τα οποία
. Αυτό συμβαίνει για παράδειγμα στους cluster αλγόριθμους
συστημάτων σπιν (λ.χ. πρότυπα Ising, Potts) όπως ο αλγόριθμος του Wolff που θα
μελετήσουμε αργότερα.
Το πρότυπο Ising (1925) [54] έχει παίξει ιστορικά πολύ σημαντικό ρόλο στις εξελίξεις των ιδεών της στατιστικής φυσικής και της κβαντικής θεωρίας πεδίου. Ειδικότερα στις δύο διαστάσεις, το πρότυπο είναι αρκετά σύνθετο, ώστε να έχει ενδιαφέρουσες μη τετριμμένες ιδιότητες και αρκετά απλό, ώστε να μπορούμε να αντλήσουμε αναλυτικά πολύτιμες πληροφορίες για τη φυσική των μεταβάσεων φάσης. Το πρότυπο εκδηλώνει μετάβαση φάσης 2ης τάξης με αποτέλεσμα να μπορούν να μελετηθούν οι ιδιότητες των συνεχών μεταβάσεων φάσης (κρίσιμοι εκθέτες, παγκοσμιότητα, ομάδα επανακανονικοποίησης, συνεχές όριο). Με την αναλυτική λύση1 του Onsager (1948) [55] και άλλων παίρνουμε αποτελέσματα με τα οποία μπορούμε να ελέγξουμε προσεγγιστικές μεθόδους, όπως οι προσομοιώσεις Μόντε Κάρλο, αναπτύγματα μεγάλης και μικρής θερμοκρασίας, mean field theory κλπ. Επιπλέον έχει και φυσικό ενδιαφέρον, επειδή είναι ένα πρότυπο ενός μαγνητικού υλικού που, παρόλη την απλότητά του, περιγράφει ποιοτικά πολλές από τις μη τετριμμένες ιδιότητες τους. Επίσης, λόγω της παγκοσμιότητας μπορεί να θεωρηθεί πρότυπο και για τη μετάβαση φάσης σε υγρό-αέριο (τριπλό σημείο). Εξαίρετο βιβλίο για πρότυπα της στατιστικής φυσικής που λύνονται επακριβώς με αναλυτικές μεθόδους αποτελεί το βιβλίο του Baxter [53].
Για τον ορισμό του προτύπου θεωρήστε ένα δισδιάστατο τετραγωνικό πλέγμα,
όπως αυτό του σχήματος 13.1 στο οποίο τοποθετείτε σε κάθε πλεγματική θέση
(node) “άτομα” ή “μαγνητάκια” με σπιν . Η γεωμετρία καθορίζεται από την
ελάχιστη απόσταση μεταξύ των γειτόνων, την πλεγματική σταθερά
, και τον
αριθμό των πλεγματικών θέσεων
. Σε κάθε πλευρά έχουμε
πλεγματικές
θέσεις, έτσι ώστε
, με
τη διάσταση του χώρου. Η
τοπολογία καθορίζεται από τις σχέσεις γειτονίας, και ιδιαίτερα από τις σχέσεις
γειτονίας των πλεγματικών θέσεων που βρίσκονται στο σύνορο του τετραγώνου.
Η τοροϊδής τοπολογία λαμβάνεται, αν δημιουργήσουμε δεσμό μεταξύ των
γειτόνων που ανήκουν στις κάθετες και οριζόντιες πλευρές του τετραγώνου του
σχήματος (13.1) . Η δυναμική του συστήματος καθορίζεται από τη μαγνητική
αλληλεπίδραση (spin–spin interaction) την οποία απλοποιούμε, ώστε να είναι
κοντινής εμβέλειας και ιδιαίτερα μόνο μεταξύ των πλησιέστερων γειτόνων.
Στο σιδηρομαγνητικό πρότυπο Ising θεωρούμε ότι οι δυνατές τιμές των
σπιν είναι δύο, ή
. Στην πιο απλή περίπτωση, η αλληλεπίδραση
είναι αλληλεπίδραση σπιν–σπιν μόνο μεταξύ πλησιέστερων γειτόνων με την
κατάσταση που έχει τα σπιν ομόρροπα να βρίσκεται στην κατάσταση χαμηλότερης
ενέργειας2 .
Αυτό απεικονίζεται στο σχήμα 13.2. Το σύστημα μπορεί να βρίσκεται υπό
την επίδραση ομογενούς μαγνητικού πεδίου
του οποίου η διεύθυνση
θεωρείται ότι είναι παράλληλη ή αντιπαράλληλη με αυτή των σπιν. Είμαστε τώρα
έτοιμοι να γράψουμε την Hamiltonian και τη συνάρτηση επιμερισμού του
συστήματος.
Θεωρούμε τετραγωνικό πλέγμα από πλεγματικές θέσεις (sites ή vertices)
διατεταγμένες σε τετράγωνο με πλευρές από
πλεγματικές θέσεις τις οποίες
απαριθμούμε με αριθμούς
. Το πλέγμα έχει
δεσμούς
(bonds ή links) μεταξύ των πλησιέστερων γειτόνων. Αυτοί χαρακτηρίζονται
από τα ζεύγη των πλεγματικών θέσεων
,
που ενώνουν και θα τους
συμβολίζουμε με
. Ταυτίζουμε τις πλευρές του τετραγώνου, όπως
στο σχήμα 13.1. Επειδή τότε κάθε δεσμός ενώνει ακριβώς δύο πλεγματικές
θέσεις και από κάθε πλεγματική θέση ξεκινούν ακριβώς τέσσερις δεσμοί, θα
ισχύει
![]() | (13.1) |
Σε κάθε πλεγματική θέση τοποθετούμε σπιν .
Η Hamiltonian του συστήματος θα δίνεται από τη σχέση
![]() | (13.2) |
Ο πρώτος όρος δίνει την αλληλεπίδραση μεταξύ των σπιν και για – το
οποίο υποθέτουμε στο βιβλίο αυτό – το σύστημα είναι σιδηρομαγνητικό.
Κάθε δεσμός που ενώνει ομόρροπα σπιν έχει ενέργεια
που είναι κατά
μικρότερη από έναν δεσμό με αντίρροπα σπιν. Το σύστημα ενεργειακά
προτιμά καταστάσεις με δεσμούς ομόρροπους, δηλ. τα σπιν να είναι όλα
προσανατολισμένα προς την ίδια κατεύθυνση. Η ελάχιστη ενέργεια αντιστοιχεί στη
μοναδική3
κατάσταση με όλα τα σπιν να κοιτούν προς την κατεύθυνση του
, την θεμελιώδη
κατάσταση4 .
Η ενέργειά της είναι
![]() | (13.3) |
Η συνάρτηση επιμερισμού είναι
![]() | (13.4) |
όπου είναι μια διάταξη (configuration) των σπιν στο
πλέγμα. Ο αριθμός των όρων του αθροίσματος είναι ίσος με τον αριθμό των δυνατών
διατάξεων
των σπιν που είναι
, δηλ. αυξάνουν εκθετικά με το
. Για ένα
πλέγμα, ο αριθμός των όρων είναι
.
Το δισδιάστατο πρότυπο Ising με έχει την εξαιρετικά ενδιαφέρουσα
ιδιότητα ότι για
, όπου
![]() | (13.5) |
το σύστημα παρουσιάζει μετάβαση φάσης από τη διατεταγμένη φάση ή φάση χαμηλής
θερμοκρασίας, όπου το σύστημα είναι μαγνητισμένο () στην άτακτη φάση
ή φάση υψηλής θερμοκρασίας, όπου η μαγνήτιση χάνεται (
). Η
θερμοκρασία
είναι η κρίσιμη θερμοκρασία, η θερμοκρασία Curie. Η μετάβαση
φάσης είναι συνεχής και δευτέρας τάξης, γιατί η συνάρτηση
είναι συνεχής
για
, αλλά όχι η παράγωγός της. Αυτό φαίνεται ποιοτικά στο σχήμα 13.3.
Επειδή η τιμή της
ξεχωρίζει τις δύο φάσεις του συστήματος, η
λέγεται παράμετρος τάξης.
Για , η συνάρτηση συσχετισμού (12.45) συμπεριφέρεται όπως στη
σχέση (12.46) με πεπερασμένο μήκος συσχετισμού
. Καθώς πλησιάζουμε την
κρίσιμη θερμοκρασία το μήκος συσχετισμού τείνει στο άπειρο και μάλιστα
συμπεριφέρεται ασυμπτωτικά σαν
![]() | (13.6) |
Η συνάρτηση συσχετισμού συμπεριφέρεται σύμφωνα με την εξίσωση (12.47)
![]() | (13.7) |
ενώ παρόμοια συμπεριφορά βάθμισης (scaling) παρουσιάζουν και η ειδική θερμότητα
, μαγνήτιση
και μαγνητική επιδεκτικότητα
σύμφωνα με τις
σχέσεις
![]() | (13.11) |
Οι εκθέτες που παρουσιάζονται στις παραπάνω σχέσεις λέγονται κρίσιμοι εκθέτες ή εκθέτες βάθμισης (critical ή scaling exponents) και οι τιμές τους παρουσιάζουν την ιδιότητα της παγκοσμιότητας. Δηλ. οι τιμές τους δεν εξαρτώνται από τις λεπτομέρειες του πλέγματος (τετραγωνικό, τριγωνικό κλπ) ή της αλληλεπίδρασης (πλησιέστερων ή μη γειτόνων, μεγαλύτερες δυνάμεις του σπιν κλπ) και μία ολόκληρη κλάση από πρότυπα έχουν την ίδια συμπεριφορά! Απαραίτητη προϋπόθεση είναι τα πρότυπα αυτά να έχουν τις ίδιες ιδιότητες συμμετρίας, να ορίζονται σε χώρο ίδιας διάστασης και οι αλληλεπιδράσεις να είναι κοντινής εμβέλειας. Στο συγκεκριμένο πρότυπο οι εκθέτες παίρνουν τις λεγόμενες τιμές Onsager
![]() | (13.12) |
Η συμπεριφορά (13.6–13.11) χαρακτηρίζεται από τη μη αναλυτικότητα των
αντίστοιχων συναρτήσεων. Αυτή δεν είναι δυνατόν να προκύψει από τη συνάρτηση
επιμερισμού (13.4) για πλέγμα με θέσεις, αφού σε ένα πεπερασμένο
άθροισμα από εκθετικά είναι αναγκαστικά αναλυτική συνάρτηση (άρα και οι
παράγωγοί της). Η μη αναλυτική συμπεριφορά φανερώνεται στο όριο απείρου
μεγέθους (θερμοδυναμικό όριο) όπου οι παραπάνω συναρτήσεις τείνουν
προς μια μη–αναλυτική συνάρτηση όπως στο σχήμα 13.3. Η απώλεια της
αναλυτικότητας οφείλεται στους συσχετισμούς των σπιν σε μακροσκοπικές
αποστάσεις.
Σε πολλά συστήματα που μελετάμε τα παραπάνω μη αναλυτικά σημεία,
αναζητούμε μια παράμετρο τάξης (order parameter) η οποία χαρακτηρίζει τη
συμμετρία του συστήματος. Στη συγκεκριμένη περίπτωση του πρότυπου Ising, η
παράμετρος τάξης είναι η μαγνήτιση με τη συμμετρία . Συνήθως, στη μία
φάση η παράμετρος τάξης είναι μη μηδενική, ενώ στην άλλη μηδενίζεται. Αυτό
συνεπάγεται μη αναλυτική συμπεριφορά, αφού μια αναλυτική συνάρτηση που είναι
μηδενική σε ένα διάστημα, είναι παντού μηδέν.
Η συμπεριφορά παγκοσμιότητας ή ανεξαρτησίας κλίμακας (scale invariance)
παρουσιάζεται κάθε φορά που έχουμε απόκλιση του μήκους συσχετισμού .
Στην περίπτωσή μας, για να φτάσουμε το κρίσιμο σημείο, έχουμε να ρυθμίσουμε
μόνο μια παράμετρο, τη θερμοκρασία, οπότε αναμένει κανείς να εμφανιστεί μόνο μια
καινούργια κλίμακα στο πρότυπο. Ανεξαρτησία κλίμακας εμφανίζεται, όταν το μήκος
συσχετισμού γίνει πολύ μεγαλύτερο από τη μικροσκοπική κλίμακα
, οπότε
οποιαδήποτε ποσότητα που είναι συνάρτηση της απόστασης
μπορεί να εξαρτάται
μόνο από το λόγο
. Η παγκοσμιότητα προκύπτει από το γεγονός ότι, στην
περίπτωση αυτή, φαίνεται ότι τα πάντα εξαρτώνται από εκείνες τις διακυμάνσεις με
μεγάλο μήκος κύματος που απαιτούνται από τη συμμετρία της παραμέτρου τάξης. Η
σημαντική απλούστευση που προκύπτει είναι ότι για να μελετήσουμε ένα
πραγματικό φυσικό σύστημα σε μια συνεχή μετάβαση φάσης
, αρκεί να
μελετήσουμε το απλούστερο πρότυπο με τη δεδομένη συμμετρία και χωρικές
διαστάσεις.
Θεωρούμε την περίπτωση του τετραγωνικού πλέγματος με πλεγματικές θέσεις σε
κάθε πλευρά, έτσι ώστε
να είναι ο συνολικός αριθμός
πλεγματικών θέσεων και
να είναι ο συνολικός αριθμός των “δεσμών”
μεταξύ των πλησιέστερων γειτόνων. Η τελευταία σχέση ισχύει, επειδή επιλέγουμε
ελικοειδείς συνοριακές συνθήκες στο πλέγμα, όπως στο σχήμα 13.6, όπως
θα αναλύσουμε στην επόμενη παράγραφο. Σε κάθε πλεγματική θέση
έχουμε ένα βαθμό ελευθερίας, το “σπιν”
το οποίο παίρνει δύο τιμές, έστω
. Θεωρούμε το σύστημα για την περίπτωση του μηδενικού μαγνητικού
πεδίου
, οπότε η Hamiltonian του συστήματος θα δίνεται από τη
σχέση5
![]() | (13.13) |
Θυμίζουμε πως είναι άθροισμα πάνω στους δεσμούς
, δηλ. πάνω στα
ζεύγη γειτονικών πλεγματικών θέσεων.
αφού
στη δεύτερη περίπτωση κάθε δεσμός αθροίζεται δύο φορές, μία από κάθε
πλεγματική θέση που βρίσκεται στα άκρα του. Η συνάρτηση επιμερισμού είναι
η
![]() | (13.14) |
Στόχος μας είναι η δημιουργία ενός δείγματος του συστήματος που κατανέμεται σύμφωνα με την κατανομή Boltzmann (12.4) και θα το δημιουργήσουμε φτιάχνοντας μια αλυσίδα Markov σύμφωνα με αυτά που ειπώθηκαν στην παράγραφο 12.6. Η δειγματοληψία θα γίνει σύμφωνα με την (12.53) και οι μέσες τιμές θα υπολογίζονται από το δείγμα από την (12.54) . Επιλέγοντας σε κάθε βήμα της διαδικασίας την επόμενη κατάσταση του συστήματος σύμφωνα με την (12.60) , το δείγμα μας θα βρίσκεται προσεγγιστικά στην επιθυμητή κατανομή για αρκετά μεγάλο πλήθος στοιχείων. Αυτό επιτυγχάνεται κάνοντας έναν αρκετά μεγάλο αριθμό βημάτων (“χρόνο”) στην διαδικασία Markov.
΄Εστω ότι το σύστημά μας βρίσκεται αρχικά στην κατάσταση
6.
Η πιθανότητα να βρεθεί στο επόμενο βήμα της διαδικασίας στην κατάσταση
,
σύμφωνα με την (12.66) είναι
![]() | (13.15) |
όπου είναι η πιθανότητα επιλογής της κατάστασης
, όταν το σύστημα
βρίσκεται στην κατάσταση
και
ο λόγος αποδοχής, δηλ. η πιθανότητα
τότε το σύστημα να μεταβεί στη νέα κατάσταση. Αν ικανοποιείται η συνθήκη
λεπτομερούς ισορροπίας (12.60)
![]() | (13.16) |
τότε η κατανομή στο δείγμα μας θα συγκλίνει στην (12.4) . Για να
είναι οι πιθανότητες
αρκετά μεγάλες, ώστε το σύστημα να αλλάζει
συχνά κατάσταση, οι μεταβολές στην ενέργεια
δε θα πρέπει να είναι πολύ
μεγάλες. Θα πρέπει το γινόμενο με τη θερμοκρασία να είναι αριθμός της τάξης της
μονάδας. ΄Ενας τρόπος να το πετύχουμε αυτό είναι να εφαρμόσουμε έναν αλγόριθμο
που σε κάθε βήμα θα μεταβάλλει την τιμή ενός από τα σπιν του πλέγματος
. Επειδή η ενέργεια (13.13) είναι τοπική ποσότητα, η
μεταβολή της θα είναι μικρή. Πιο συγκεκριμένα, αν κάθε πλεγματική θέση
έχει
πλησιέστερους γείτονες, με μια τέτοια μεταβολή το πρόσημο
του όρου
αλλάζει για
όρους της (13.13) , αυτούς που έχουν στο
ένα άκρο τους τη θέση
. Η μεταβολή της ενέργειας είναι
για κάθε
δεσμό. Αν η κατάσταση
ορίζεται να είναι η
και η
κατάσταση
είναι η
(δηλ. με όλα τα σπιν ίδια, εκτός
από το
το οποίο αλλάζει πρόσημο), τότε η μεταβολή της ενέργειας θα
είναι
![]() | (13.17) |
Αν επιλέξουμε τη θέση τυχαία, τότε
![]() | (13.18) |
και ο αλγόριθμος είναι εργοδικός. Θα πρέπει, τότε, να ισχύει
![]() | (13.19) |
΄Ενας απλός τρόπος να ικανοποιήσουμε τη συνθήκη αυτή είναι να πάρουμε τη σχέση (12.61)
![]() | (13.20) |
Για να μεγιστοποιήσουμε τους λόγους αποδοχής, αφού θα πρέπει να ισχύει
,
, παίρνουμε
. ΄Αρα,
![]() | (13.21) |
Στο σχήμα 13.4 φαίνεται η εξάρτηση του από τη μεταβολή της
ενέργειας για διάφορα
. Παρατηρούμε ότι η πιθανότητα αυτή γίνεται μικρή, ακόμα
και για μηδενική μεταβολή της ενέργειας, με αποτέλεσμα η αποδοτικότητα της
επιλογής αυτής να είναι μικρή.
Είναι πολύ αποδοτικότερο να χρησιμοποιήσουμε τον αλγόριθμο των Nicolas Metropolis et. al. 1953 [58] ο οποίος δίνεται από την (12.63)
![]() | (13.22) |
Σύμφωνα με την παραπάνω σχέση, το σύστημα πάντα δέχεται την αλλαγή μιας
κατάστασης, όταν αυτή ελαττώνει την ενέργεια, ενώ όταν η αλλαγή οδηγεί σε
αύξηση της ενέργειας, αυτή γίνεται δεκτή με πιθανότητα μικρότερη της μονάδας.
΄Οπως φαίνεται και από το σχήμα 13.4, το σύστημα δέχεται αλλαγές καταστάσεων
πολύ συχνότερα από την προηγούμενη επιλογή μας. Ο αλγόριθμος αυτός έχει πολύ
γενικότερη εφαρμογή από την περίπτωση που μελετάμε και έχει ευρεία χρήση
σε ένα μεγάλο φάσμα προβλημάτων λόγω της γενικότητας, απλότητας και
αποδοτικότητάς του. Να σημειώσουμε πως η επιλογή μας να αλλάζουμε την
κατάσταση , αλλάζοντας την τιμή ενός μόνο σπιν δεν είναι περιορισμός της
μεθόδου αυτής και θα μπορούσε να εφαρμοστεί για οποιαδήποτε αλλαγή
καταστάσεων.
Για τον σχεδιασμό του κώδικα, το πιο σημαντικό βήμα είναι να ορίσουμε τη δομή των
δεδομένων. Οι βαθμοί ελευθερίας είναι τα σπιν ορισμένα στις
πλεγματικές θέσεις. Το πιο σημαντικό για την καλή απόδοση του προγράμματος είναι
να ορίσουμε τις σχέσεις γειτονίας των πλεγματικών θέσεων στη μνήμη του
υπολογιστή και τις συνοριακές συνθήκες. Οι τελευταίες είναι πολύ σημαντικές και
μια λάθος επιλογή θα μπορούσε να κάνει την επίδραση του ορίου του πλέγματος
σημαντική και έτσι, να έχουμε σημαντικά σφάλματα πεπερασμένου μεγέθους του
πλέγματος (finite size effects). Οι πιο δημοφιλείς επιλογές είναι οι περιοδικές ή
τοροειδείς συνοριακές συνθήκες, αλλά και οι ελικοειδείς συνοριακές συνθήκες. Ο
σημαντικός παράγοντας στις επιλογές αυτές είναι ότι κάθε πλεγματική θέση έχει
τον ίδιο αριθμό πλησιέστερων γειτόνων και έτσι, έχουμε την ίδια τοπική
γεωμετρία. Για παράδειγμα, αυτό δε συμβαίνει αν επιλέξουμε το πλέγμα να έχει
σύνορο πάνω στο οποίο τα σπιν να παίρνουν καθορισμένες ή ελεύθερες
τιμές.
Για την τοποθέτηση των βαθμών ελευθερίας στη μνήμη, μια πρώτη επιλογή είναι
να δώσουμε συντεταγμένες ,
σε κάθε πλεγματική
θέση. Τα σπιν τοποθετούνται σε ένα array s(L,L) και αν επιλέξουμε μια
θέση στο πλέγμα s(i,j), οι τέσσερις πλησιέστεροι γείτονες θα είναι οι
s(i
1,j), s(i,j
1). Οι τοροειδείς συνοριακές συνθήκες εφαρμόζονται
εύκολα προσθέτοντας/αφαιρώντας
στα i,j, όποτε αυτά γίνονται μικρότερα
του 1/μεγαλύτερα του
αντίστοιχα. Αυτό φαίνεται στα σχήματα 13.5 και
13.34.
Για να υπολογιστεί όμως μια θέση στο πλέγμα πρέπει να υπολογιστεί η θέση της
στη μνήμη (j-1)*L+i η οποία εμπεριέχει έναν (αθέατο) πολλαπλασιασμό. Μπορούμε
να αποφύγουμε τον πολλαπλασιασμό αυτό εύκολα με εφαρμογή των ελικοειδών
συνοριακών συνθηκών. Οι συντεταγμένες των πλεγματικών θέσεων καθορίζονται
από έναν μόνο αριθμό όπως φαίνεται στα σχήματα 13.6 και
13.35. Τα σπιν αποθηκεύονται στη μνήμη σε ένα μονοδιάστατο array s(N) και για να
προσδιορίσουμε τους γείτονες μιας θέσης s(i) αρκεί να πάρουμε τα σπιν
s(i
1) και s(i
L). Η απλότητα των ελικοειδών συνοριακών συνθηκών
οφείλεται στο ότι για τους πλησιέστερους γείτονες των σπιν που βρίσκονται στο
όριο του τετραγώνου, αρκεί να επαναφέρουμε τον δείκτη του array στα
αποδεκτά όρια 1
i
N προσθέτοντας ή αφαιρώντας κατάλληλα
τον αριθμό N. ΄Ετσι, αν στο πρόγραμμά μας θέλουμε να υπολογίσουμε τους
τέσσερις πλησιέστερους γείτονες nn της θέσης i, αρκεί το παρακάτω κομμάτι
κώδικα:
Εμείς θα επιλέξουμε τις ελικοειδής συνοριακές συνθήκες λόγω του πλεονεκτήματος ταχύτητας υπολογισμού της θέσης των πλησιέστερων γειτόνων. Αν και για μικρά πλέγματα μπορεί η μικρή παραμόρφωση που εισάγουν να δώσει ένα μικρό σφάλμα, για τα μεγέθη πλεγμάτων που θα μελετήσουμε αυτό θα είναι αμελητέο.
Η δυναμική της Μόντε Κάρλο εξέλιξης καθορίζεται από την αρχική κατάσταση
του συστήματος και τον αλγόριθμο του Metropolis. Κατάλληλη επιλογή αρχικών
συνθηκών μπορεί να είναι εξαιρετικά σημαντική για προσομοιώσεις συστημάτων με
τη μέθοδο Μόντε Κάρλο. Από αυτή θα εξαρτηθεί το πόσο γρήγορα, ακόμα και το αν
το σύστημα θα βρεθεί σε κατάσταση θερμικής ισορροπίας. Στην περίπτωση μας, αυτό
δε θα είναι ιδιαίτερα σημαντικό πρόβλημα, αλλά θα το μελετήσουμε λόγω της
σημασίας του σε άλλα προβλήματα. Εδώ η αρχική κατάσταση μπορεί να επιλεγεί να
είναι “παγωμένη” ( - όλα τα σπιν να έχουν την ίδια τιμή) ή “θερμή”
(
- τα σπιν να έχουν τιμή
με ίση πιθανότητα
). Για μεγάλα
πλέγματα όπου η εύρεση της κατάστασης θερμικής ισορροπίας μπορεί να
απαιτεί αρκετά βήματα, επιλέγουμε τη σταδιακή μεταβολή της θερμοκρασίας
από
ή
στις επιθυμητές τιμές. Σε κάθε βήμα μεταβολής
της θερμοκρασίας χρησιμοποιούμε τη διάταξη σπιν από την προηγούμενη
προσομοίωση, έτσι ώστε να βρισκόμαστε γρήγορα στη νέα κατάσταση θερμικής
ισορροπίας.
Ξεκινώντας από διαφορετικές αρχικές συνθήκες και συγκρίνοντας τα αποτελέσματά μας ελέγχουμε την ορθότητα τους, δηλ. αν το σύστημά μας έχει πετύχει τη θερμική ισορροπία και αν η μέθοδός μας πάσχει από προβλήματα εργοδικότητας.
Εξετάζουμε τώρα τα βήματα της διαδικασίας Markov που παράγεται από τον
αλγόριθμο Metropolis. ΄Εστω ότι το σύστημά μας είναι στην κατάσταση
και εξετάζουμε τη μετάβαση στη νέα κατάσταση
που προκύπτει από την αλλαγή της τιμής του σπιν
(spin flip), ενώ τα υπόλοιπα σπιν παραμένουν τα ίδια
.
Η μεταβολή της ενέργειας θα είναι
όπου στη δεύτερη σειρά απαλείψαμε τους κοινούς όρους των δύο αθροισμάτων και στην τρίτη χρησιμοποιήσαμε τη σχέση Ο αλγόριθμος Metropolis εφαρμόζεται τώρα εύκολα. ϒπολογίζοντας το άθροισμα
στην παρένθεση της τελευταίας σειράς της (13.23) παίρνουμε τη μεταβολή της
ενέργειας . Αν
, δεχόμαστε ότι η κατάσταση
είναι η νέα
κατάσταση του συστήματος. Αν
, τότε
.
Επιλέγουμε έναν ομοιόμορφα κατανεμημένο τυχαίο αριθμό
. Η
πιθανότητα να έχουμε
είναι
. ΄Αρα αν
,
δεχόμαστε τη μεταβολή. Αν
, η μεταβολή απορρίπτεται και
παραμένουμε στην κατάσταση
.
Μια μικρή τεχνική παρατήρηση στον σχεδιασμό του προγράμματος είναι ότι οι
δυνατές τιμές του αθροίσματος . Οι τιμές που
υπεισέρχονται στον υπολογισμό της
είναι μόνο αυτές που αυξάνουν την
ενέργεια, δηλ. οι δύο τιμές
. Οι δύο αυτές τιμές για τα
μπορούν να αποθηκευτούν στη μνήμη του υπολογιστή και να αποφύγουμε
την ακριβή σε χρόνο επανάληψη υπολογισμού των εκθετικών
.
Τέλος, το πρόγραμμά μας θα πρέπει να υπολογίζει τις φυσικές ποσότητες που θα μετρήσουμε κατά τη μελέτη του συστήματός μας. Αυτές είναι η ενέργεια (13.13)
![]() | (13.27) |
και η μαγνήτιση
![]() | (13.28) |
Η απόλυτη τιμή στην τελευταία σχέση μπαίνει λόγω της συμμετρίας ανάκλασης των
σπιν του συστήματος (ομάδα ). Επειδή είναι ισοπίθανο να έχουμε δύο
διατάξεις με όλα τα σπιν τους να έχουν αντίθετες τις τιμές τους σε κάθε
πλεγματική θέση, η μέση τιμή
είναι πάντα 0. Για αρκετά μεγάλο
αριθμό μετρήσεων, όσες φορές το σύστημά μας θα είναι σε μία διάταξη με
, θα είναι και σε μία αντίστοιχη διάταξη με
.
Στην πράξη, όπως θα δούμε, η μετάβαση από την κατάσταση με μαγνήτιση
στην κατάσταση με μαγνήτιση
μπορεί να χρειάζεται μεγάλο
αριθμό βημάτων Μόντε Κάρλο, ιδιαίτερα όταν
, και αυτό να μην
παρατηρείται στην προσομοίωσή μας. Στο όριο
(θερμοδυναμικό όριο)
το σύστημα επιλέγει τη μία από τις δύο καταστάσεις (αυθόρμητο σπάσιμο
συμμετρίας).
Οι μετρήσεις της ενέργειας και της μαγνήτισης μπορούν να γίνονται με δύο
τρόπους. Στον πρώτο ενημερώνουμε την τιμή της ενέργειας και της μαγνήτισης σε
κάθε βήμα Μόντε Κάρλο. Αυτό γίνεται εύκολα, γιατί η μεταβολή των τιμών των
αθροισμάτων στις (13.27) και (13.28) εξαρτάται μόνο από την τιμή του σπιν
που αλλάζει και των τιμών του σπιν των πλησιέστερων γειτόνων. Τη
μεταβολή της ενέργειας την υπολογίζουμε έτσι κι αλλιώς από τη σχέση
(13.23) , ενώ η μεταβολή του αθροίσματος στην (13.28) δίνεται απλά από
την
![]() | (13.29) |
Ο δεύτερος τρόπος είναι να υπολογίζουμε τα αθροίσματα (13.27) και (13.28)
κάθε φορά που θέλουμε να πάρουμε μια μέτρηση. Ποια μέθοδος είναι πιο
συμφέρουσα εξαρτάται από το πόσο συχνά παίρνουμε μια στατιστικά ανεξάρτητη
μέτρηση7
και από τον λόγο αποδοχής των βημάτων Μόντε Κάρλο. Λ.χ. για τον υπολογισμό
της μαγνήτισης, αν ο μέσος λόγος αποδοχής είναι , τότε με τον πρώτο τρόπο έχω
προσθέσεις ανά
Μόντε Κάρλο βήματα (1 sweep), ενώ με τον δεύτερο έχω
προσθέσεις ανά μέτρηση.
Είναι συνηθισμένο να κανονικοποιούμε την ενέργεια ανά δεσμό
![]() | (13.30) |
η οποία παίρνει τιμή από -1 (θεμελιώδης κατάσταση, όλοι οι δεσμοί έχουν τιμή
-1) μέχρι +1, ενώ τη μαγνήτιση ανά πλεγματική θέση
![]() | (13.31) |
η οποία παίρνει τιμή από 0 (πλήρης αταξία - ) έως 1 (θεμελιώδης κατάσταση -
). Για τον λόγο αυτό, η μαγνήτιση είναι μια παράμετρος τάξης (order
parameter), δηλ. μια φυσική ποσότητα της οποίας η μέση τιμή μας υποδεικνύει πότε
το σύστημα βρίσκεται σε φάση τάξης (ordered phase) ή σε φάση αταξίας (disordered
phase).
Από τις ποσότητες αυτές υπολογίζουμε τις διακυμάνσεις της ενέργειας από την ειδική θερμότητα
![]() | (13.32) |
και της μαγνήτισης από τη μαγνητική επιδεκτικότητα
![]() | (13.33) |
Για να εκτιμήσουμε πόσα δεδομένα πρέπει να συλλέξουμε για μια καλή μέτρηση
των παραπάνω ποσοτήτων, ανατρέχουμε στο αποτέλεσμα της στατιστικής που μας
λέει ότι αν έχουμε ανεξάρτητες μετρήσεις, τότε το στατιστικό σφάλμα
ελαττώνεται σαν
. Το πρόβλημα είναι πότε έχουμε ανεξάρτητες μετρήσεις,
το οποίο θα το αντιμετωπίσουμε παρακάτω.
Στην παράγραφο αυτή θα παρουσιάσουμε και αναλύσουμε τον κώδικα8 που θα χρησιμοποιήσουμε στην προσομοίωση του πρότυπου Ising. Ο κώδικας αυτός βρίσκεται στο συνοδευτικό λογισμικό, στον κατάλογο Ising_Introduction του κεφαλαίου αυτού.
Θα ακολουθήσουμε τη φιλοσοφία του modular programming όπου θα τοποθετήσουμε σε διαφορετικά αρχεία ξεχωριστές ενότητες του κώδικα. Αυτό κάνει ευκολότερη την ανάπτυξη, έλεγχο και συντήρηση του κώδικα από έναν ή και περισσότερους προγραμματιστές. Αρχικά, σε ένα αρχείο–επικεφαλίδα (header file) τοποθετούμε τους ορισμούς που είναι κοινοί για ένα ή περισσότερα αρχεία. Το πλεονέκτημα μιας τέτοιας επιλογής είναι ότι έχουμε συγκεντρωμένες σε ένα αρχείο, όλες τις βασικές παραμέτρους και κοινές μεταβλητές (common blocks), ώστε κάθε αλλαγή τους να γίνεται αυτόματα και χωρίς λάθη παντού στον κώδικα. Το αρχείο αυτό, εδώ το ονομάζουμε include.inc, θα συμπεριλαμβάνεται σε κάθε αρχείο που θα το χρησιμοποιεί με μια εντολή του include:
Το μέγεθος του πλέγματος εισάγεται ως σταθερή παράμετρος, ενώ οι μεταβλητές
σπιν και παράμετροι της προσομοίωσης τοποθετούνται σε common blocks. To array
s(N) είναι τα σπιν στις πλεγματικές θέσεις και παίρνουν τιμές . Η
μεταβλητή beta είναι η θερμοκρασία
του συστήματος και στην prob(0:4)
τοποθετούμε τις δυνατές τιμές των πιθανοτήτων
όπως εξηγήσαμε
στη σελίδα 1332. Η drandom() είναι αυτή που θα χρησιμοποιήσουμε για
γεννήτρια ψευδοτυχαίων αριθμών και ο σπόρος seed είναι ορατός από όλο
το πρόγραμμα, έτσι ώστε να μπορούμε να τον θέσουμε από διαφορετικές
συναρτήσεις, όποτε το επιθυμούμε. Τέλος, οι παράμετροι XNN και YNN είναι
αυτές που μας οδηγούν στους πλησιέστερους γείτονες μιας πλεγματικής
θέσης σύμφωνα με όσα είπαμε στην αρχή της ενότητας 13.3. Για παράδειγμα
i+XNN είναι ο πλησιέστερος γείτονας της (εσωτερικής) θέσης i κατά την
διεύθυνση και i-YNN είναι ο πλησιέστερος γείτονας κατά την
διεύθυνση.
Το κυρίως πρόγραμμα βρίσκεται στο αρχείο main.f90 και οδηγεί την προσομοίωση:
Εδώ θέτουμε τις παραμέτρους της προσομοίωσης. Η αρχική κατάσταση καθορίζεται από την τιμή της start και είναι ψυχρή για start=0 και θερμή για start=1. Η θερμοκρασία τίθεται από την τιμή της beta και ο αριθμός των sweeps του πλέγματος από την nsweep. Από το μικρό αυτό αρχείο βλέπουμε τη βασική δομή της προσομοίωσης: Στην αρχή τίθεται η αρχική κατάσταση του συστήματος (init), ενώ μετά για κάθε sweep κάνουμε ένα Metropolis sweep (met) και μία μέτρηση (measure).
Σε ένα επίπεδο παρακάτω, βλέπουμε το πρόγραμμα της init στην οποία περνάμε τη μεταβλητή start, προκειμένου να θέσει το πλέγμα στην αρχική του κατάσταση:
Η δομή της συνάρτησης είναι πολύ απλή. Αρχικοποιεί το array prob(0:4) με τις
τιμές των πιθανοτήτων
. Οι
πιθανότητες αυτές μας ενδιαφέρουν, όταν
και οι δυνατές τιμές
που μπορεί τότε να πάρει είναι 2 και 4. Αυτές είναι και οι τιμές που αποθηκεύουμε
και θυμόμαστε ότι ο δείκτης του array είναι η έκφραση
, όταν αυτή
είναι θετική.
Στη συνέχεια, καθορίζουμε την αρχική διάταξη των σπιν ανάλογα με την τιμή
που παίρνει ο ακέραιος start. Το select case block μας επιτρέπει να
προσθέσουμε στο μέλλον και άλλες δυνατότητες, αν τυχόν αναβαθμίσουμε τον
κώδικα. Αν start=0, οι τιμές όλων τον σπιν τίθενται ίσες με 1, ενώ αν
start=1 θέτουμε τις τιμές των σπιν με ίση πιθανότητα . Η πιθανότητα
drandom()<0.5 είναι
, οπότε στην περίπτωση αυτή s(i)=1, αλλιώς
(πιθανότητα
) s(i)=-1.
Η καρδιά του προγράμματος είναι η υπορουτίνα met(). Αυτή εκτελεί N Metropolis βήματα. Επισκέπτεται N φορές μία τυχαία πλεγματική θέση και θέτει το ερώτημα αν θα μεταβάλλει την τιμή του σπιν (spin flip). Αυτό γίνεται σύμφωνα με τον αλγόριθμο Metropolis υπολογίζοντας τη μεταβολή στην ενέργεια πριν και μετά την αλλαγή του σπιν σύμφωνα με τη σχέση (13.23) :
Η γραμμή
επιλέγει ισοπίθανα μια πλεγματική θέση i=1,...,N. Εδώ, είναι σημαντικό να μην παρουσιαστεί ποτέ η τιμή i=N+1 που θα μπορούσε να γίνει, αν drandom()=1.0. Την τιμή αυτή την έχουμε αποκλείσει, όπως συζητήσαμε στην Παράγραφο 11.1.
Στη συνέχεια, υπολογίζουμε το άθροισμα της (13.23) . Για τον
λόγο αυτό πρέπει να βρούμε τους πλησιέστερους γείτονες της θέσης i και αυτό
γίνεται με τις γραμμές
Στη συνέχεια, θέτουμε στη μεταβλητή delta το γινόμενο (13.23) .
Αν αυτό είναι αρνητικό, τότε η μεταβολή της ενέργειας είναι αρνητική και
η αλλαγή του σπιν γίνεται δεκτή. Αν όχι, τότε εφαρμόζουμε το κριτήριο
(13.22) χρησιμοποιώντας την τιμή του array prob(delta) σύμφωνα με τον
τρόπο που το κατασκευάσαμε στην init. Η πιθανότητα του ομοιόμορφα
κατανεμημένου στο διάστημα
αριθμού drandom()<prob(delta) είναι
prob(delta) και στην περίπτωση αυτή η αλλαγή γίνεται δεκτή. Σε κάθε άλλη
περίπτωση, η αλλαγή δε γίνεται δεκτή και το σπιν s(i) διατηρεί την παλιά του
τιμή.
Μετά από κάθε Metropolis sweep έχουμε επιλέξει να κάνουμε μια μέτρηση της ενέργειας και της μαγνήτισης. Εδώ επιλέγουμε μινιμαλιστική προσέγγιση του κεντρικού κώδικα και υπολογίζουμε μόνο τα αναγκαία. Αφήνουμε στη διαδικασία της ανάλυσης τον υπολογισμό των μέσων τιμών, των στατιστικών σφαλμάτων, της ειδικής θερμότητας και της μαγνητικής επιδεκτικότητας. Δίνουμε στην ανάλυση τη μέγιστη δυνατή πληροφορία που θέλουμε να παρέχουμε και αφήνουμε στη φάση εκείνη να αποφασιστεί αν και πώς θα υπολογιστεί μια φυσική ποσότητα. Αυτό, αν δεν έχουμε πρόβλημα αποθηκευτικού χώρου, είναι προτιμητέο, αν η παραγωγή των δεδομένων είναι “ακριβή” και η ανάλυση “φτηνή”. ΄Ενας άλλος λόγος που παρέχουμε στην ανάλυση την εκάστοτε τιμή της ενέργειας και μαγνήτισης είναι ώστε να γίνει δυνατή η λεπτομερής παρακολούθηση της προσομοίωσης και να εντοπιστούν προβλήματα. Μπορούμε να δούμε αν το σύστημα έφτασε σε θερμική ισορροπία, αν παρουσιάζονται μεγάλοι αυτοσυσχετισμοί ή αν υπάρχουν λάθη στο πρόγραμμα.
Η measure υπολογίζει κάθε φορά που καλείται τη συνολική ενέργεια και μαγνήτιση (χωρίς την απόλυτη τιμή) καλώντας τις ξεχωριστές συναρτήσεις E() και M(). Αυτές απλά εφαρμόζουν τις σχέσεις (13.27) και (13.28) (χωρίς την απόλυτη τιμή).
Η μεταγλώττιση του κώδικα γίνεται με την εντολή
η οποία παράγει το εκτελέσιμο αρχείο is το οποίο μπορούμε τώρα να τρέξουμε:
Η έξοδος του προγράμματος είναι σε δύο στήλες, στην πρώτη τυπώνεται η συνολική ενέργεια και στη δεύτερη η μαγνήτιση (χωρίς απόλυτη τιμή). Για να φτιάξουμε τις λεγόμενες “χρονοσειρές ” των μετρήσεών μας μπορούμε να δώσουμε τις εντολές
Στην τελευταία γραμμή φτιάχνουμε το γράφημα της παίρνοντας την απόλυτη
τιμή του αθροίσματος
. Ζητάμε από το gnuplot να μας κάνει τη γραφική
παράσταση παίρνοντας τη δεύτερη στήλη $2, αν αυτή είναι θετική ($2>0)?, αλλιώς
το αντίθετό της -$2.
Στην ενότητα αυτή θα κάνουμε βελτιώσεις στον κώδικα, κυρίως στο επίπεδο αλληλεπίδρασης με το χρήστη (user interface). Τον κώδικα του προγράμματος που συζητείται παρακάτω θα τον βρείτε στον κατάλογο Ising_Metropolis στο συνοδευτικό λογισμικό αυτού του κεφαλαίου. Το πρόγραμμα στη μορφή που του δώσαμε στην προηγούμενη ενότητα έχει προγραμματισμένες (hard coded) τις διάφορες παραμέτρους της προσομοίωσης και κάθε φορά που θέλουμε να τις αλλάξουμε, πρέπει να τις κωδικοποιήσουμε στο αντίστοιχο αρχείο και να επαναμεταγλωττίσουμε. Επίσης αλλάζουμε τον κώδικα, έτσι ώστε να αποθηκεύεται η τελευταία διάταξη στην οποία βρίσκεται το σύστημα, καθώς και να εισάγεται διάταξη του συστήματος που έχει αποθηκευτεί στο δίσκο.
Ανάμεσα στις παραμέτρους που θα μπορεί ο χρήστης να ορίζει τη στιγμή που τρέχει το πρόγραμμα είναι και το μέγεθος του πλέγματος L. Αυτό καθορίζει την απαιτούμενη μνήμη για το array s(N) την οποία θα πρέπει να ζητήσουμε δυναμικά από το σύστημα με τη συνάρτηση ALLOCATE. Το πρόβλημα είναι πως το s(N) έχει δεδομένα που πρέπει να είναι προσβάσιμα από όλες τις διαδικασίες του προγράμματος και arrays που είναι allocatable και δεν μπορούν να μπουν σε common blocks. ΄Ενας άλλος τρόπος να μοιράζονται οι διαδικασίες δεδομένα είναι με τη χρήση modules. Αυτός είναι και ο προτιμότερος σε νέα προγράμματα Fortran όπου η χρήση των common blocks συνιστάται να αποφεύγεται. Τα δεδομένα (εδώ απλά παράμετροι και μεταβλητές) τοποθετούνται ανάμεσα στις δηλώσεις
Στις ... τοποθετούμε δηλώσεις μεταβλητών και χρησιμοποιούμε την εντολή SAVE. Το όνομα του module εδώ είναι global_data και όποια διαδικασία θέλει να μοιραστεί τα δεδομένα του module πρέπει να ξεκινήσει με την εντολή use global_data:
Σε ένα αρχείο global_data.f90 ορίζουμε τις μεταβλητές που θα είναι προσβάσιμες από όλες τις διαδικασίες:
Το array s(:) είναι τώρα allocatable και θα το ορίσουμε κατά την αρχικοποίηση του προγράμματος στην init, ενώ οι μεταβλητές L, N, XNN και YNN δεν ορίζονται πια ως παράμετροι και η τιμή τους θα καθοριστεί, επίσης, στην init. Οι καινούργιες μεταβλητές είναι οι acceptance που δίνει το ποσοστό των spin flips που γίνονται αποδεκτά κατά την προσομοίωση, ranlux_level που καθορίζει το luxury level της RANLUX και prog είναι το όνομα του προγράμματος που τρέχει την προσομοίωση.
Στο κυρίως πρόγραμμα δεν έχουμε μεγάλες αλλαγές:
Παρατηρήστε τη γραμμή use global_data που δίνει πρόσβαση στα δεδομένα του module global_data. Με αυτή τη γραμμή θα ξεκινάνε όλες οι διαδικασίες του προγράμματος της προσομοίωσης. Επίσης, η υπορουτίνα endsim κάνει τις εργασίες που απαιτούνται πριν κλείσει το πρόγραμμα. Ιδιαίτερα εδώ θα σταθούμε στην εγγραφή της τελικής διάταξης του συστήματος στον δίσκο για μετέπειτα χρήση.
Στην init έχουμε κάνει αρκετές αλλαγές, έτσι ώστε να ενσωματώσουμε τις νέες δυνατότητες του προγράμματος:
Ξεκινάμε με τον ορισμό των παραμέτρων του προγράμματος δίνοντάς τους προκαθορισμένες τιμές, οι οποίες, όταν είναι αρνητικές, αυτό είναι ένδειξη ότι δεν έχουν οριστεί από το χρήστη. Μετά, καλούμε την υπορουτίνα9 get_the_options η οποία διαβάζει τις τιμές που θέτει ο χρήστης από τη γραμμή εντολών:
΄Οταν επιστρέφει, θεωρείται ότι οι τιμές έχουν τεθεί και πρέπει να γίνει έλεγχος αν αυτό έχει γίνει σωστά. Για παράδειγμα, αν ο χρήστης ξεκινάει μια καινούργια προσομοίωση και έχει ξεχάσει να ορίσει το L, τότε καλείται η συνάρτηση locerr η οποία σταματάει το πρόγραμμα με το μήνυμα σφάλματος που περιέχεται στην παρένθεση:
΄Οταν γίνει γνωστή η τιμή του N, τότε το πρόγραμμα μπορεί να ζητήσει την εκχώρηση μνήμης για το s(N):
Η μεταβλητή chk που ορίζεται από το όρισμα STATUS είναι 0, όταν η εκχώρηση είναι επιτυχής. Αν δεν είναι, τότε το πρόγραμμα σταματάει με κλήση της locerr.
Στη συνέχεια, έχουμε το SELECT CASE(start) που αρχικοποιεί το πρόγραμμα ανάλογα με την τιμή της start. Αν start=0, ξεκινάμε όπως και πριν με όλα τα σπιν να έχουν την τιμή 1. Το μόνο καινούργιο είναι η κλήση της υπορουτίνας simmmessage(f_unit) που τυπώνει πληροφορίες για την προσομοίωση στο αρχείο που έχουμε συνδέσει με το unit f_unit. Επίσης, ξεκινάμε τη γεννήτρια τυχαίων αριθμών RANLUX με την RLUXGO όπως είχαμε πει στην Παράγραφο 11.2, σελ. 1214. Εδώ γίνεται και η χρήση της global μεταβλητής ranlux_level της οποίας την τιμή προκαθορίσαμε παραπάνω να είναι ίση με 3 και την οποία μπορεί, αν θέλει, να αλλάξει ο χρήστης από την get_the_options. Αν start=0, ξεκινάμε από θερμή διάταξη των σπιν, όπως κάναμε και στην προηγούμενη παράγραφο.
Αν start=2, τότε επιχειρούμε να διαβάσουμε διάταξη των σπιν η οποία έχει προηγουμένως αποθηκευτεί στο δίσκο. Αυτή υποθέτουμε πως είναι σε ένα αρχείο με όνομα conf το οποίο έχει αυστηρά προκαθορισμένο format (το οποίο ορίζεται στην υπορουτίνα endsim). Αν το αρχείο δεν υπάρχει, το όρισμα ERR=101 μεταφέρει τη ροή του προγράμματος στο τέλος, στην εντολή με ετικέτα 101, όπου τυπώνεται μήνυμα σφάλματος από την locerr. Για να καταλάβουμε τις επόμενες εντολές read πρέπει να ξέρουμε το format του conf το οποίο είναι (περίπου) της μορφής:
Τα σχόλια “πετιούνται’ στην character μεταβλητή buf, ενώ διαβάζονται δεδομένα που δίνουν το μέγεθος του πλέγματος, τη θερμοκρασία και την κατάσταση της RANLUX. Αυτά δεν αποθηκεύονται απευθείας στις μεταβλητές L, beta, αλλά σε προσωρινές μεταβλητές OL, obeta, έτσι ώστε να συγκριθούν με τις τιμές που μπορεί να έχει δώσει αρχικά ο χρήστης.
Αν ο χρήστης έχει δώσει δικό του seed, τότε η RANLUX αρχικοποιείται με το seed. Αν όχι, τότε η κατάσταση της RANLUX καθορίζεται από τα seeds της προηγούμενης προσομοίωσης. Και οι δύο επιλογές έχουν σοβαρούς λόγους: Μπορεί ο χρήστης να θέλει να συνεχίσει την προσομοίωση ακριβώς από το σημείο που την είχε αφήσει στο conf. Τότε θα θέλει η RANLUX να συνεχίσει να παράγει την ίδια ακολουθία τυχαίων αριθμών που είχε σταματήσει στο conf. Μπορεί όμως να θέλει να παράγει πολλά ανεξάρτητα αποτελέσματα από την ίδια διάταξη των σπιν. Τότε θα ξεκινήσει κάθε φορά τη RANLUX με διαφορετικό seed και θα κάνει έτσι ανεξάρτητες προσομοιώσεις10 . Αυτό επιτυγχάνεται με τις γραμμές
Τέλος, να σημειώσουμε πως διαβάζουμε τις τιμές των σπιν με
προσοχή, έτσι ώστε να έχουν μόνο τις επιτρεπτές τιμές και να
είναι ίσα σε αριθμό με αυτόν που καθορίζεται από το μέγεθος του
πλέγματος11 .
Το τελευταίο επιτυγχάνεται με το όρισμα END=102 της εντολής READ, όπου 102 είναι
η ετικέτα της εντολής όπου θα μεταφερθεί ο έλεγχος του προγράμματος από
την εντολή READ, όταν επιχειρήσει να διαβάσει μετά το τέλος του αρχείου.
Αυτό θα συμβεί, αν π.χ. επιχειρήσουμε να διαβάσουμε ένα κατεστραμμένο
αρχείο.
Ας δούμε τώρα την αποθήκευση της τελευταίας διάταξης των σπιν από την υπορουτίνα endsim. Αυτή βρίσκεται στο αρχείο end.f90:
Καταρχήν, καλούμε την RLUXUT να σώσει την κατάσταση της RANLUX στο array seeds. Με την υπορουτίνα RENAME μετονομάζουμε, αν υπάρχει, το αρχείο conf σε conf.old για να μην καταστραφεί η παλιά διάταξη των σπιν από τη νέα. Στη συνέχεια, γράφουμε τις παραμέτρους της προσομοίωσης και το seeds με το format (A4, I5, A4, I5, A6, G28.17, A6, 25I16) το οποίο είναι ακριβώς το ίδιο με αυτό που χρησιμοποιούμε στην εντολή READ στην init προκειμένου να διαβάσουμε τη διάταξη των σπιν.
Τέλος, παραθέτουμε και τον κώδικα για τις υπορουτίνες get_the_options(), η οποία διαβάζει τις παραμέτρους μέσω unix options, simmessage(), που τυπώνει πληροφορίες που καθορίζουν τις συνθήκες της προσομοίωσης και locerr(), που σταματάει το πρόγραμμα τυπώνοντας ένα μήνυμα στο stderr. Η επιλογή να περάσουμε τις παραμέτρους μέσω unix options έχει τα πλεονεκτήματα ότι τις περνάμε προαιρετικά και με όποια σειρά θέλουμε. Ας δούμε, κατ’ αρχήν, πώς δουλεύουν. ΄Εστω ότι το εκτελέσιμο αρχείο του προγράμματος είναι το is. Η εντολή
θα τρέξει το πρόγραμμα θέτοντας L=10 (-L 10), beta=0.44 (-b 0.44), start=1 (-s 1), seed=5342 (-S 5342) και nsweep=1000 (-n 1000). Τα -L, -b, -s, -S, -n είναι τα options ή switches και μπορούμε να τα βάλουμε με όποια σειρά θέλουμε. Οι τιμές που ακολουθούν είναι οι τιμές που θα περάσουν στις τιμές των αντίστοιχων μεταβλητών. ϒπάρχουν και options που δεν απαιτούν ορίσματα, αλλά μεταβάλλουν τον τρόπο που λειτουργεί το πρόγραμμα12 . Στην περίπτωσή μας, το option -h (help) τυπώνει ένα σύντομο μήνυμα βοήθειας πάνω στη χρήση του προγράμματος και σταματάει το πρόγραμμα:
΄Ετσι μπορούμε να θυμόμαστε τον τρόπο χρήσης του προγράμματος.
Ας δούμε πώς προγραμματίζουμε τα παραπάνω. Παίρνουμε τον κώδικα από το αρχείο options.f90:
Με την εντολή call getarg(0,prog) αποθηκεύουμε το όνομα του προγράμματος στη μεταβλητή character prog. Η συνάρτηση getopt είναι μια συνάρτηση προγραμματισμένη από τον Mark Gates που ο κώδικάς της είναι στο αρχείο getopt.f90. Είναι γραμμένη έτσι, ώστε να προσομοιάζει, ως προς τον τρόπο χρήσης, την αντίστοιχη συνάρτηση της C13 . Το όρισμά της "-hL:b:s:S:n:r:u" ορίζει ως επιτρεπτά options τους χαρακτήρες ’-’, ’L’, ’b’, ’s’, ’S’, ’n’, ’r’, ’u’. Κάθε φορά που ο χρήστης τους περνάει από τη γραμμή εντολών (ως λ.χ. -L 100, -h), το do loop μας πάει στο αντίστοιχο CASE από όπου εκτελούμε τις εντολές που θέλουμε. Αν κάποιο option δεν παίρνει argument (λ.χ. -h), τότε εκτελείται μια εντολή όπως η call usage. Αν ένα option θέλουμε να πάρει argument, τότε στο όρισμα της getopt μπαίνει μαζί με ’:’ (λ.χ. L:, b:, ...) και το argument είναι προσβάσιμο από το πρόγραμμα μέσω της μεταβλητής character optarg. Λ.χ. με τις γραμμές
η γραμμή εντολών που περιέχει -L 10 έχει σαν αποτέλεσμα η optarg να έχει την τιμή ’10’. Αυτό δεν είναι αριθμός, αλλά ακολουθία χαρακτήρων! Για να μετατρέψουμε το character ’10’ στον integer 10, χρησιμοποιούμε την εντολή READ σα να διαβάζαμε από ... αρχείο. Το ίδιο κάνουμε και με τις άλλες παραμέτρους.
Η υπορουτίνα locerr παίρνει στην είσοδο ένα μήνυμα σφάλματος, το τυπώνει στο stderr με το όνομα του προγράμματος και σταματάει το πρόγραμμα:
Προσέξτε τη χρήση της πολύ χρήσιμης συνάρτησης TRIM. Αυτή “κόβει” τα τελευταία κενά μιας μεταβλητής character. Αν δεν τη χρησιμοποιούσαμε, η μεταβλητή character(1024) :: prog θα έπαιρνε στην εκτύπωση 1024 θέσεις χαρακτήρων, κάτι που δε θα μας άρεσε και πολύ...
Η υπορουτίνα usage παίζει και αυτή πολύ σημαντικό ρόλο: Μας δίνει σύντομες πληροφορίες για τη χρήση του προγράμματος και σύντομα θα την εκτιμήσετε πολύ! Η σωστή τεκμηρίωση του προγράμματός μας είναι αναπόσπαστο μέρος της δουλειάς μας...
Τέλος, η υπορουτίνα simmessage τυπώνει πληροφορίες για την προσομοίωση που τρέχουμε. Δε χρειάζεται να τονίσουμε πόσο σημαντικό είναι αυτό: Δεδομένα χωρίς ετικέτα είναι καλύτερα να τα πετάμε, γιατί είναι επικίνδυνα, όπως κάνουμε και με τα ... φάρμακα. Εκτός από τις παραμέτρους της προσομοίωσης, τυπώνουμε και πληροφορίες από το περιβάλλον που τρέχει το πρόγραμμα: Το όνομα του υπολογιστή, το είδος του λειτουργικού συστήματος, την ημερομηνία και το όνομα του χρήστη που έτρεξε το πρόγραμμα. ΄Ολες αυτές οι πληροφορίες μπορεί να μας γίνουν πολύτιμες. Αλλάζοντας την μεταβλητή unit, μπορούμε να τυπώσουμε το μήνυμα σε όποιο αρχείο θέλουμε.
Για τη μεταγλώττιση του κώδικα απαιτείται η εντολή:
Είναι σημαντικό ότι τα αρχεία με τα modules global_data.f90, getopt.f90 προηγούνται των αρχείων με κώδικα που χρησιμοποιεί τα modules που περιέχουν.
Για να τρέξουμε το πρόγραμμα, περνάμε τις παραμέτρους μέσω των options, όπως για παράδειγμα:
όπου προσθέσαμε και την εντολή time για τη μέτρηση των αποδόσεων του προγράμματος.
΄Ενα χρήσιμο εργαλείο για τη μεταγλώττιση του προγράμματος είναι το πρόγραμμα make. Θα μπορούσε να γραφτεί ολόκληρο κεφάλαιο για το make, όμως παραπέμπουμε τον ενδιαφερόμενο αναγνώστη στις σχετικές info pages14 . Ας αρκεστούμε να πούμε πως, αν στον κατάλογο που βρίσκεστε, υπάρχει ένα αρχείο με όνομα Makefile που έχει περιεχόμενα15 :
είναι αρκετό για να “φτιάξει” το εκτελέσιμο αρχείο is. Τι κερδίσαμε; Για να δείτε, κάντε μια μετατροπή σε ένα από τα αρχεία του κώδικα, λ.χ. στο main.f90 και εκτελέστε την εντολή make ξανά. Θα δείτε πως μόνο το αρχείο που μεταβάλατε ξαναμεταγλωττίζεται και όχι τα άλλα. Θέτοντας κανόνες εξάρτησης (dependencies), μπορείτε να πετύχετε ακόμα πιο πολύπλοκες μεταγλωττίσεις. Με τη χρήση μεταβλητών μπορούμε να κωδικοποιήσουμε τη σύνδεση με βιβλιοθήκες, επίπεδα βελτιστοποίησης, μεταγλώττιση υπό συνθήκες (αρχιτεκτονική, μεταγλωττιστής κλπ) και άλλα ... πολλά! Ενθαρρύνουμε τον φοιτητή με ενδιαφέρον στον προγραμματισμό να επενδύσει λίγο χρόνο για να μάθει περισσότερα16 .
Στην ενότητα αυτή θα συζητήσουμε τα τεχνικά προβλήματα που συναντά μια προσομοίωση μέχρι να φέρουμε το σύστημα σε θερμική ισορροπία. Το πρόβλημα αυτό μπορεί να είναι από αμελητέο μέχρι και απαγορευτικό για την προσομοίωση κάποιων συστημάτων. ΄Ετσι παρόλο που δεν είναι ιδιαίτερα σημαντικό πρόβλημα για το δισδιάστατο πρότυπο Ising, θα το μελετήσουμε λόγω της σπουδαιότητάς του για άλλα προβλήματα.
΄Οπως ήδη είδαμε, όταν ξεκινούμε μια προσομοίωση, χρειάζεται να τοποθετήσουμε το σύστημά σε μια αρχική κατάσταση, έτσι ώστε με τον αλγόριθμο που έχουμε επιλέξει να ξεκινήσουμε μια διαδικασία Markov για την παραγωγή του δείγματός μας. Γνωρίζουμε όμως από την ενότητα 12.2, πως όταν το σύστημα είναι σε θερμική ισορροπία σε μια δεδομένη θερμοκρασία, τότε βρίσκεται κυρίως σε καταστάσεις με ενέργεια που διαφέρει λίγο από τη μέση τιμή της. Καταστάσεις με ενέργεια που διαφέρει κατά πολύ από τη μέση τιμή της, τις επισκέπτεται πολύ σπάνια17 . ΄Ετσι, αν η αρχική κατάσταση που θα επιλέξουμε δεν είναι μια τυπική κατάσταση, θα πρέπει το σύστημά μας να κάνει έναν τυχαίο ... περίπατο στον χώρο των καταστάσεων μέχρι να “βρει” την περιοχή των καταστάσεων εκείνη που αντιστοιχεί στη θερμοκρασία που έχουμε επιλέξει. Αυτή είναι η διαδικασία της εύρεσης της κατάστασης θερμικής ισορροπίας (thermalization).
Εδώ παρουσιάζονται δύο προβλήματα: Το πρώτο είναι η κατάλληλη επιλογή της αρχικής κατάστασης και το δεύτερο είναι να εντοπίσουμε πότε το σύστημά μας έχει βρεθεί σε κατάσταση θερμικής ισορροπίας. Ως προς το πρώτο, έχουμε ήδη δει πως η αρχική κατάσταση για το πρότυπο Ising μπορεί να επιλεγεί να είναι (α) παγωμένη, (β) θερμή, (γ) σε μια άλλη - πιθανώς γειτονική - θερμοκρασία από μια προηγούμενη προσομοίωση. Είναι φυσικά κατανοητό πως, αν επιλέξουμε την αρχική κατάσταση να είναι λ.χ. καυτή για να προσομοιώσουμε το σύστημα σε μια χαμηλή θερμοκρασία, το σύστημα θα αργήσει περισσότερο να βρεθεί σε θερμική ισορροπία από ότι αν επιλέγαμε την αρχική κατάσταση να είναι παγωμένη (ή σε κάποια κοντινή θερμοκρασία). Αυτό φαίνεται καθαρά στο σχήμα 13.7.
Η δυσκολία της διαδικασίας εξαρτάται από τη φυσική ποσότητα, τη θερμοκρασία και το μέγεθος του συστήματος. Η ενέργεια βρίσκει πιο γρήγορα τις τιμές που παίρνει στην κατάσταση θερμικής ισορροπίας, παρά η μαγνήτιση. Μια τοπική ποσότητα (local quantity, fast mode) μελετάται ευκολότερα από μια που έχει μη τοπικές εξαρτήσεις (non--local quantity, slow mode). Η κατάσταση θερμικής ισορροπίας βρίσκεται ευκολότερα, όταν είμαστε μακρυά από την κρίσιμη θερμοκρασία. Είναι ευκολότερο να φέρουμε σε θερμική ισορροπία ένα μικρό σύστημα, παρά ένα μεγάλο.
Το δεύτερο πρόβλημα είναι να εντοπίσουμε πότε το σύστημά έχει βρεθεί σε κατάσταση θερμικής ισορροπίας και φυσικά να αγνοήσουμε όλες τις μετρήσεις που έχουμε κάνει πιο πριν. Από το σχήμα 13.7 βλέπουμε πως η στιγμή αυτή, ακόμα και για την ίδια αρχική κατάσταση, μπορεί να έχει τιμή με μεγάλες διακυμάνσεις. Ο πιο απλός τρόπος είναι να ξεκινήσουμε αρκετές προσομοιώσεις με διαφορετικές αρχικές καταστάσεις ή/και από την ίδια αρχική κατάσταση, αλλά ακολουθώντας διαφορετική στοχαστική ... πορεία και να παρακολουθήσουμε την εξέλιξη στον (Μόντε Κάρλο) χρόνο των προς μέτρηση φυσικών ποσοτήτων. ΄Οταν όλα τα μονοπάτια συναντηθούν, τότε μάλλον έχουμε πετύχει θερμική ισορροπία και μπορούμε να ξεκινήσουμε τις μετρήσεις μας.
Πιο συστηματικά όμως αποκτούμε πεποίθηση ότι όντως έχουμε πετύχει θερμική ισορροπία, όταν τα αποτελέσματά μας έχουν σταθερή τιμή (μέσα στα όρια του στατιστικού σφάλματος), καθώς αποκόπτουμε από το δείγμα μας όλο και μεγαλύτερο αριθμό από μετρήσεις.
Η διαδικασία φαίνεται στο σχήμα 13.10 όπου για τις μετρήσεις του πάνω
σχήματος αποκόπτουμε διαδοχικά και
αρχικές μετρήσεις μέχρι η μέση τιμή της μαγνήτισης να πάρει μια σταθερή τιμή μέσα
στα όρια του στατιστικού σφάλματος.
Για να κατασκευάσουμε ένα δείγμα από στατιστικά ανεξάρτητες μετρήσεις από μια
διαδικασία Markov θα πρέπει το επόμενο βήμα να μην έχει στατιστικό συσχετισμό
με το προηγούμενο. Είναι, όμως, φανερό πως με τους αλγόριθμους που
χρησιμοποιούμε αυτό δεν είναι δυνατόν. Στον αλγόριθμο Metropolis το επόμενο
βήμα διαφέρει από το προηγούμενο το πολύ κατά την τιμή ενός σπιν. ΄Αρα, η
επόμενη διάταξη των σπιν είναι στατιστικά πολύ ισχυρά συσχετισμένη με την
προηγούμενη. Θα περίμενε κανείς να πάρει μία στατιστικά ανεξάρτητη διάταξη, όταν
κάνει ένα βήμα Metropolis ανά πλεγματική θέση, αυτό που ονομάζεται ένα
“sweep” του πλέγματος. Ενώ αυτό όντως συμβαίνει στην πράξη για πολλές
περιπτώσεις, λ.χ. στο πρότυπο Ising για θερμοκρασίες αρκετά διαφορετικές από την
κρίσιμη , στις περισσότερες ενδιαφέρουσες περιπτώσεις χρειαζόμαστε πολύ
μεγαλύτερο αριθμό από sweeps για να πάρουμε μια στατιστικά ανεξάρτητη διάταξη.
Αυτό γίνεται λ.χ. όταν το μήκος συσχετισμού
(12.46) γίνεται πολύ
μεγαλύτερο από μια πλεγματική θέση, κάτι που συμβαίνει στην κρίσιμη περιοχή
μιας συνεχούς μετάβασης φάσης. Αυτό μπορεί να γίνει κατανοητό από τα
σχήματα 13.36. Καθώς πλησιάζουμε την κρίσιμη θερμοκρασία από τη θερμή
περιοχή όπου τα σπιν είναι σε αταξία, δημιουργούνται μεγάλες περιοχές
(clusters) από όμοια σπιν. Καταλαβαίνουμε ότι για να έχουμε δύο ασυσχέτιστες
διατάξεις σπιν στην περίπτωση αυτή, πρέπει το μέγεθος, το σχήμα και η θέση
αυτών των clusters να είναι ασυσχέτιστα. Για να γίνει κάτι τέτοιο, πρέπει να
καταστραφούν τα υπάρχοντα clusters και να δημιουργηθούν κάπου αλλού. Με ένα
single–flip αλγόριθμο όπως ο Metropolis η διαδικασία αυτή παίρνει αρκετό
χρόνο.
Για την ποσοτική μελέτη του αυτοσυσχετισμού των διατάξεων σπιν που
παράγονται στην προσομοίωσή μας, χρησιμοποιούμε τη συνάρτηση αυτοσυσχετισμού
(autocorrelation function). ΄Εστω μια φυσική ποσότητα (λ.χ. ενέργεια,
μαγνήτιση, μαγνητική επιδεκτικότητα κλπ) και
η τιμή της μετά από Μόντε
Κάρλο “χρόνο”
. Οι μονάδες του
μπορεί να είναι sweeps ή (υπο)πολλαπλάσια
των sweeps. Η συνάρτηση αυτοσυσχετισμού
της φυσικής ποσότητας
ορίζεται για κάθε χρόνο
να είναι η
![]() | (13.34) |
όπου είναι η μέση τιμή πάνω σε όλα τα στοιχεία του δείγματος με
. Η κανονικοποίηση που βάζουμε στον παρονομαστή είναι τέτοια, ώστε
.
Ο ορισμός θυμίζει τη συνάρτηση συσχετισμού των σπιν στον χώρο (βλ. εξ.
(12.45) ). Η συζήτηση για τη σημασία του ορισμού είναι παράλληλη με αυτή της
ενότητας 12.4. Με λίγα λόγια, όταν η τιμή μιας ποσότητας μετά από χρόνο είναι
ισχυρά συσχετισμένη με την αρχική, τότε το γινόμενο στον αριθμητή της (13.34)
θα είναι σχεδόν πάντοτε θετικό, με αποτέλεσμα η μέση τιμή να είναι θετική. ΄Οταν ο
συσχετισμός είναι ασθενής, τότε το γινόμενο θα είναι πότε θετικό και πότε
αρνητικό στο δείγμα, έτσι ώστε ο μέσος όρος να είναι μικρός. Αν υπάρχει
αντισυσχετισμός, τότε το κλάσμα είναι αρνητικό. Αρνητικές τιμές για την
οφείλονται στο πεπερασμένο μέγεθος του δείγματος και πρέπει να
απορρίπτονται.
Ασυμπτωτικά, η συνάρτηση ελαττώνεται με εκθετικό τρόπο
![]() | (13.35) |
Η κλίμακα χρόνου χαρακτηρίζει τον αποσυσχετισμό των μετρήσεων
της
και ονομάζεται χρόνος αυτοσυσχετισμού της
. Μετά από
χρόνο
, η
έχει πέσει στο
της αρχικής της
τιμής. Συμβατικά θεωρούμε ότι τότε έχουμε μία ανεξάρτητη μέτρηση της
18.
΄Αρα, αν έχουμε
μετρήσεις, ο αριθμός των ανεξάρτητων μετρήσεων της
θα
είναι
![]() | (13.36) |
Αν μία μέτρηση κοστίζει σε χρόνο, τότε από τα παραπάνω βλέπουμε ότι θα τη
μετράμε σε διαστήματα χρόνου . Αν όμως το κόστος της μέτρησης δεν είναι
μεγάλο, τότε μετράμε συχνότερα. Αυτό συμβαίνει γιατί υπάρχει στατιστική
πληροφορία και στις μετρήσεις που είναι ελαφρά συσχετισμένες. Η ακριβής μέτρηση
του
, ειδικά αν είναι μεγάλο, είναι δύσκολη, γιατί πρέπει να πάρουμε μετρήσεις
για
.
΄Ενα παράδειγμα φαίνεται στο σχήμα 13.12 για την περίπτωση της μαγνήτισης
(). ϒπολογίζουμε τη συνάρτηση
και βλέπουμε ότι η προσαρμογή
στην (13.35) είναι πολύ καλή με
sweeps. Η μέτρηση έγινε σε ένα
δείγμα από
μετρήσεις με 1 μέτρηση/sweep. ΄Αρα, οι ανεξάρτητες μετρήσεις μας
ήταν στην πραγματικότητα
.
΄Ενας άλλος εκτιμητής του χρόνου αυτοσυσχετισμού είναι ο ολοκληρωμένος
χρόνος αυτοσυσχετισμού (integrated autocorrelation time). Ο ορισμός του
προκύπτει από την υπόθεση (13.35) από όπου παίρνουμε
![]() | (13.37) |
Προφανώς , αλλά στον υπολογισμό υπεισέρχονται συστηματικά σφάλματα,
γι’ αυτό οι δύο ορισμοί μπορεί να δίνουν τιμές που διαφέρουν λίγο στην πράξη. Αν το
δείγμα μας είναι καλό, τότε θα έχουμε καλύτερη συμφωνία. Επίσης, επειδή το δείγμα
μας δεν είναι άπειρο, πρέπει να επιλέξουμε ένα
όπου θα κόψουμε την
ολοκλήρωση19
![]() | (13.38) |
και κάνουμε τη γραφική παράσταση . ΄Οταν παρατηρήσουμε πως η τιμή
του
σταθεροποιείται για κάποιο διάστημα του
, παίρνουμε αυτή
την τιμή ως εκτιμητή του
.
Η διαδικασία αυτή φαίνεται στο σχήμα 13.14, όπου χρησιμοποιήσαμε τις ίδιες
μετρήσεις με αυτές του σχήματος 13.12. Το αποτέλεσμα είναι sweeps
που είναι μικρότερο από αυτό που υπολογίσαμε προηγουμένως. Η διαφορά
αυτή συχνά δεν είναι σημαντική. Συνήθως, αυτό που μας ενδιαφέρει είναι η
εξάρτηση του χρόνου αυτοσυσχετισμού από τις παραμέτρους του συστήματος,
εδώ το μέγεθος
και τη θερμοκρασία
. Και οι δύο εκτιμητές θα μας
δώσουν το ίδιο αποτέλεσμα για την κύρια (ασυμπτωτική) συμπεριφορά για
αρκετά μεγάλα
και για
αρκετά κοντά στην κρίσιμη θερμοκρασία
.
Συνήθως, προτιμάμε να υπολογίσουμε τον
λόγω της ευκολότερης
διαδικασίας.
Ο χρόνος αυτοσυσχετισμού δεν είναι σοβαρό πρόβλημα, όταν το σύστημα
βρίσκεται μακριά από την κρίσιμη περιοχή θερμοκρασιών. Στο σχήμα 13.15 βλέπουμε
πως αυτός είναι μόνο μερικά sweeps και ότι το γεγονός αυτό είναι ανεξάρτητο από το
μέγεθος του συστήματος . ΄Οταν όμως πλησιάζουμε την κρίσιμη περιοχή, ο
χρόνος αυτοσυσχετισμού μεγαλώνει. Στην κρίσιμη περιοχή η αύξηση αυτή
παρουσιάζει βάθμιση (scaling). Για τον αλγόριθμο του Metropolis αυτό σημαίνει ότι
για μεγάλα
έχουμε
![]() | (13.39) |
όπου για την περίπτωση της μαγνήτισης έχουμε [59]. Αυτή η
τιμή είναι μεγάλη και κάνει τον αλγόριθμο ακριβό. Σημαίνει πως ο χρόνος για την
προσομοίωση του συστήματος για δεδομένο αριθμό ανεξάρτητων διατάξεων σπιν θα
αυξάνει σαν
![]() | (13.40) |
Αυτό είναι το φαινόμενο της κρίσιμης επιβράδυνσης. Σε επόμενα κεφάλαια θα συζητήσουμε με περισσότερη λεπτομέρεια τη σχέση βάθμισης (13.39) , καθώς και καλύτερους αλγόριθμους που βελτιώνουν δραστικά τη συμπεριφορά αυτή.
Σε μια τυχαία μεταβλητή, όπως είναι μία παρατηρήσιμη ποσότητα σε μία προσομοίωση Μόντε Κάρλο, η μέση τιμή της, εκτιμώμενη από ένα δείγμα, δε δίνει καμιά πληροφορία για την αξία της μέτρησης. Η γνώση της πραγματικής στατιστικής κατανομής δίνει όλη τη σχετική πληροφορία, αλλά στην πράξη, συνήθως, αρκούμαστε από τη γνώση του “σφάλματος ” της μέτρησης. Για να ορίσουμε αυτό που θα ονομάζουμε στατιστικό σφάλμα στο βιβλίο αυτό, θα κάνουμε την πολύ απλή, αλλά πρακτική, υπόθεση ότι η κατανομή των μετρήσεων είναι Gaussian. Αυτό γενικά είναι μια πολύ καλή προσέγγιση, όταν έχουμε ανεξάρτητες μετρήσεις σε ένα πρότυπο στατιστικής φυσικής. Η αιτία του στατιστικού σφάλματος είναι οι θερμικές διακυμάνσεις γύρω από τη μέση τιμή που όπως έχουμε συζητήσει στην ενότητα 12.2 (βλ. και σχέση (12.27) ) έχουν συνήθως κατά πολύ καλή προσέγγιση Gaussian κατανομή. Χαρακτηριστικό των στατιστικών σφαλμάτων είναι ότι εξαλείφονται αυξάνοντας τον αριθμό των μετρήσεων. Αυτό γίνεται σχετικά σιγά αφού μειώνονται αντιστρόφως ανάλογα με την τετραγωνική ρίζα του μεγέθους το δείγματος.
Μια άλλη κατηγορία σφαλμάτων είναι τα συστηματικά σφάλματα τα οποία, συνήθως, δεν έχουν ... συστηματικό τρόπο να τα εκτιμήσουμε. Αυτά, στην περίπτωσή μας, μπορούν να έχουν απλή αιτία (λ.χ. να μην είναι το σύστημα σε θερμική ισορροπία) ή αρκετά δυσκολότερη να εντοπιστεί (λ.χ. μία κακή γεννήτρια ψευδοτυχαίων αριθμών).
Τέλος, στην περίπτωση που κάποιος χρησιμοποιεί ένα διακριτό και πεπερασμένο πρότυπο (όπως το Ising) για να προσομοιώσει ένα συνεχές και άπειρο μοντέλο, στους εκτιμητές υπεισέρχονται σφάλματα λόγω της διακριτοποίησης και του πεπερασμένου μεγέθους του συστήματος. Αυτά τα σφάλματα μειώνονται με την προσομοίωση μεγαλύτερων συστημάτων και αντιμετωπίζονται συστηματικά με μεθόδους όπως η βάθμιση πεπερασμένου μεγέθους (finite size scaling). Χρησιμοποιώντας βάθμιση πεπερασμένου μεγέθους, μπορούμε από τις μετρήσεις που παίρνουμε για πεπερασμένο μέγεθος συστήματος να εκτιμήσουμε την τιμή της μετρήσιμης ποσότητας για το απείρως μεγάλο σύστημα. Αυτό θα είναι αντικείμενο της μελέτης μας σε επόμενο κεφάλαιο.
Από την υπόθεση ότι η πηγή των σφαλμάτων στις μετρήσεις μας είναι οι θερμικές
διακυμάνσεις προκύπτει ότι η πραγματική τιμή μπορεί να εκτιμηθεί από τη μέση τιμή
του δείγματος και ότι το σφάλμα θα είναι το σφάλμα της μέσης τιμής. ΄Ετσι, αν
έχουμε ένα δείγμα από μετρήσεις
, η μέση τιμή τους είναι ένας
εκτιμητής της
και παίρνουμε
![]() | (13.41) |
Ενώ το σφάλμα της μέσης τιμής του δείγματος θα είναι εκτιμητής του σφάλματος
, οπότε έχουμε
![]() | (13.42) |
Οι παραπάνω σχέσεις υποθέτουν πως το δείγμα μας αποτελείται από ανεξάρτητες
μετρήσεις. Αυτό όπως είδαμε δε συμβαίνει σε μια προσομοίωση Μόντε Κάρλο λόγω
του αυτοσυσχετισμού των μετρήσεων. Είδαμε πως, αν ο χρόνος αυτοσυσχετισμού,
μετρημένος σε μονάδες “αριθμός μετρήσεων”, είναι , σύμφωνα με την 13.36 θα
έχουμε
ανεξάρτητες μετρήσεις. Στην περίπτωση αυτή, μπορεί να
δειχθεί ότι το πραγματικό στατιστικό σφάλμα στη μέτρηση της
είναι [60] (δείτε
επίσης Κεφ. 4.1 του [5])
![]() | (13.43) |
Αν , τότε παίρνουμε την (13.42) . Αν
, τότε παίρνουμε
Οι παραπάνω σχέσεις μας δίνουν την ελευθερία να επιλέξουμε όπως μας
βολεύει το πόσο συχνά θα παίρνουμε μετρήσεις πάνω στο σύστημα. Αλλά
έχουν μερικές δυσκολίες στην εφαρμογή τους. Η πρώτη είναι πως πρέπει να
κάνουμε τη μέτρηση του χρόνου αυτοσυσχετισμού με τις γνωστές δυσκολίες
που περιγράψαμε στην ενότητα 13.5. Η δεύτερη είναι ότι δεν ξέρουμε τα
αποτελέσματα που θα έχει στον υπολογισμό του σφάλματος η πραγματική
κατανομή των μετρήσεων, ιδιαίτερα αν η ποσότητα που μετράμε δεν είναι μια
απλή τοπική ποσότητα όπως λ.χ. η ενέργεια. Ας πάρουμε για παράδειγμα τη
μαγνητική επιδεκτικότητα (13.33) . Αυτό προϋποθέτει τη μέτρηση των
και
[ή ακόμα καλύτερα την ποσότητα
πάνω σε
κάθε διάταξη
] και δεν μπορεί να οριστεί πάνω σε μία μόνο διάταξη των
σπιν. Αν υπολογίσουμε τις παραπάνω ποσότητες, αφού συγκεντρώσουμε το
δείγμα μπαίνει το ερώτημα πώς θα υπολογιστεί το σφάλμα
. Αυτό δεν
είναι απλή συνάρτηση των
και
λόγω του συσχετισμού των
δύο ποσοτήτων και δεν ισχύει ο γνωστός τύπος διάδοσης των σφαλμάτων
.
Η πιο απλή λύση που βρίσκει κανείς στα προβλήματα που αναφέραμε στην
προηγούμενη υποενότητα είναι να χωρίσει κανείς το δείγμα του σε blocks ή bins. Το
όνομα προέρχεται από την εικόνα ότι τις μετρήσεις μας τις βάζουμε σε
“καλάθια” και κάθε καλάθι το χρησιμοποιούμε ως μία ανεξάρτητη μέτρηση. Αυτό θα
είναι σωστό, αν ο αριθμός των μετρήσεων σε κάθε καλάθι είναι
.
Αν
είναι οι μέσες τιμές της
στο καλάθι
, τότε το
σφάλμα θα δίνεται από την (13.42)
![]() | (13.47) |
Αυτή είναι η μέθοδος binning ή blocking και είναι απλή στη χρήση της.
Παρατηρήστε ότι ποσότητες όπως η μαγνητική επιδεκτικότητα υπολογίζονται σε
κάθε καλάθι σαν να ήταν ένα ανεξάρτητο δείγμα και το σφάλμα είναι τότε
εύκολο να υπολογιστεί από την (13.47) . ΄Οπως είπαμε, για να είναι δυνατή η
μέθοδος αυτή θα πρέπει κάθε καλάθι να είναι στατιστικά ανεξάρτητο από
το άλλο. Αν δεν είναι, τότε το σφάλμα θα είναι υποεκτιμημένο κατά τον
παράγοντα της σχέσης (13.43) . Τα καλάθια είναι στην
πράξη στατιστικά ανεξάρτητα όταν
. Αν δεν γνωρίζουμε τον
,
υπολογίζουμε επανειλημμένα το σφάλμα (13.47) μειώνοντας διαδοχικά
τον αριθμό των καλαθιών
. ΄Οταν το σφάλμα παύει να αυξάνεται και
πάρει σταθερή τιμή, τότε θεωρούμε πως η μέθοδος συγκλίνει στη σωστή
τιμή.
Η μέθοδος όμως που θα επιλέξουμε στις προσομοιώσεις μας είναι η μέθοδος του
... σουγιά (jackknife method). Είναι πιο σταθερή και δίνει πιο αξιόπιστα
αποτελέσματα. Η βασική ιδέα είναι ίδια με τη μέθοδο binning με τη μόνη διαφορά ότι
τα “καλάθια” φτιάχνονται με διαφορετικό τρόπο και η σχέση (13.47) ελαφρά
τροποποιείται. Χωρίζουμε τα δεδομένα μας σε bins τα οποία περιέχουν από
στοιχεία ως εξής: Το bin
προκύπτει από τα αρχικά
δεδομένα
, αν διαγράψουμε τα περιεχόμενα του
-καλαθιού
της μεθόδου binning. Η διαδικασία φαίνεται σχηματικά στο σχήμα 13.21.
Σε κάθε bin υπολογίζουμε τη μέση τιμή της . Προκύπτουν τότε οι
μέσες τιμές
. Τότε το σφάλμα στην μέτρηση της
είναι
![]() | (13.48) |
΄Οπως και στη μέθοδο binning, ο αριθμός των bins καθορίζεται μεταβάλλοντάς τον και προσδιορίζοντας εκείνες τις τιμές για τις οποίες η τιμή του σφάλματος σταθεροποιείται.
Για περισσότερες λεπτομέρειες και αποδείξεις των ισχυρισμών στην υποενότητα αυτή, παραπέμπουμε τον αναγνώστη στο βιβλίο του Berg [5]. Στο παράρτημα 13.8.1 δίνουμε πρόγραμμα για τη χρήση της μεθόδου και σχετικά παραδείγματα.
Η μέθοδος jackknife είναι η μέθοδος υπολογισμού των σφαλμάτων που προτιμάται από την πλειοψηφία της επιστημονικής κοινότητας και αυτή θα ακολουθήσουμε στο βιβλίο αυτό.
Μια άλλη μέθοδος, χρήσιμη στην εκτίμηση των σφαλμάτων, είναι η μέθοδος
bootstrap. ΄Εστω ότι έχουμε ανεξάρτητες μετρήσεις. Από αυτές δημιουργούμε
τυχαία δείγματα: Με ομοιόμορφη πιθανότητα διαλέγουμε μία μέτρηση από τις
μετρήσεις. Αυτό το κάνουμε
φορές από το ίδιο σύνολο των
μετρήσεων -
δηλ. χωρίς να αφαιρούμε τη μέτρηση που διαλέξαμε από αυτές που θα διαλέξουμε
την επόμενη φορά και έτσι φτιάχνουμε ένα δείγμα. Αυτό σημαίνει ότι το
δείγμα θα περιέχει
ίδιες μετρήσεις. Σε κάθε δείγμα
υπολογίζουμε την ποσότητα
και από αυτές τη μέση
τιμή
![]() | (13.49) |
και την
![]() | (13.50) |
Η εκτίμηση για το σφάλμα στη μέτρηση του είναι
τότε20
![]() | (13.51) |
Πρέπει να τονίσουμε ότι ο παραπάνω τύπος δίνει το σφάλμα για ανεξάρτητες μετρήσεις. Αν έχουμε μη αμελητέους χρόνους αυτοσυσχετισμού, πρέπει να χρησιμοποιήσουμε τη διόρθωση που δίνει η σχέση
![]() | (13.52) |
Στο παράρτημα 13.8.2 δείχνουμε πώς να χρησιμοποιήσουμε τη μέθοδο bootstrap για
να υπολογίσουμε το πραγματικό σφάλμα , χωρίς a priori γνώση του
.
Για περισσότερες λεπτομέρειες παραπέμπουμε τον αναγνώστη στα άρθρα του Bradley Efron [61]. Στο παράρτημα 13.8.2 δίνουμε πρόγραμμα για τη χρήση της μεθόδου και σχετικά παραδείγματα.
Στο παράρτημα αυτό θα δείξουμε τις τεχνικές λεπτομέρειες του υπολογισμού της συνάρτησης αυτοσυσχετισμού (13.34) και του χρόνου αυτοσυσχετισμού (13.35) και (13.37) . Τα προγράμματα σε αυτό και το επόμενο παράρτημα θα τα βρείτε στον κατάλογο Tools στο συνοδευτικό λογισμικό.
Σε ένα δείγμα από μετρήσεις
θα χρησιμοποιήσουμε
ως εκτιμητή της σχέσης (13.34) την
![]() | (13.53) |
όπου οι μέσες τιμές ορίζονται από τις σχέσεις21
![]() | (13.54) |
Η σταθερά επιλέγεται έτσι, ώστε
.
Το πρόγραμμα για τον υπολογισμό της συνάρτησης (13.34) και του χρόνου (13.37) είναι απλό να γραφτεί. Παραθέτουμε το αρχείο autoc.f90 από το συνοδευτικό λογισμικό. Διαβάστε τα ένθετα σχόλια για επεξηγήσεις των σημαντικών βημάτων.
Να σημειώσουμε ότι τον υπολογισμό της συνάρτησης αυτοσυσχετισμού την “πακετάραμε” σε ένα module rho_function και μπορείτε να τη χρησιμοποιήσετε σε οποιοδήποτε πρόγραμμα το οποίο ξεκινάει με την εντολή use rho_function. Αυτό γίνεται στο module μετά τη λέξη–κλειδί CONTAINS. Μετά, μπορούμε να προσθέσουμε κώδικα για υπορουτίνες και συναρτήσεις στις οποίες έχει πρόσβαση22 οποιοδήποτε πρόγραμμα χρησιμοποιεί το module. Φυσικά, όπως και σε άλλα προγράμματα, χρησιμοποιούμε το module για να ορίσουμε τις μεταβλητές NMAX, tmax και prog, έτσι ώστε να είναι προσβάσιμες από όλα τα μέρη του προγράμματος που χρησιμοποιούν το module.
Για τον μεταγλωττισμό του προγράμματος χρησιμοποιούμε την εντολή
Αν έχουμε τα δεδομένα μας σε μία στήλη στο αρχείο data υπολογίζουμε τη συνάρτηση αυτοσυσχετισμού και τον ολοκληρωμένο χρόνο αυτοσυσχετισμού με την εντολή
όπου τα αποτελέσματα στο αρχείο data.rho είναι σε τρεις στήλες. Η πρώτη είναι ο
χρόνος , η δεύτερη η
και η τρίτη η
[σχέση (13.38) ]. Τα
αντίστοιχα σχήματα φτιάχνονται με τις εντολές gnuplot:
Αν θέλουμε να αλλάξουμε τον μέγιστο αριθμό δεδομένων NMAX (λ.χ. αν έχουμε περισσότερα δεδομένα ή αν θέλουμε να μειώσουμε τη μνήμη που δεσμεύει το πρόγραμμα) ή το μέγιστο χρόνο tmax στη συνάρτηση αυτοσυσχετισμού, χρησιμοποιούμε τα options -n και -t αντίστοιχα:
Για την απευθείας εισαγωγή των δεδομένων δοκιμάστε την εντολή:
Η παραπάνω gnuplot εντολή είναι σπασμένη σε 3 γραμμές για να φαίνεται στη σελίδα. Για να τη χρησιμοποιήσετε, ενώστε τις γραμμές και αφαιρέστε τις ∖.
Στη συνέχεια, παραθέτουμε το script autoc_L το οποίο κάνει τους απαραίτητους υπολογισμούς για το σχήμα 13.19.
Στη συνέχεια, κατασκευάζουμε το σχήμα με το gnuplot:
Με παρόμοιο τρόπο φτιάχνουμε και τα σχήματα 13.17.
Για τον υπολογισμό του εργαζόμαστε ως εξής:
όπου με την τελευταία γραμμή συγκρίνουμε με την τιμή του . Η
εντολή fit είναι ενδεικτική. Πρέπει να δοκιμαστούν διάφορες τιμές για τα
όρια τα οποία εδώ επιλέχτηκαν να είναι τα [150:650]. Αφού με την πρώτη
εντολή plot δούμε πότε η συνάρτηση έχει την αναμενόμενη ασυμπτωτική
συμπεριφορά (τη συνάρτηση f(x) = c exp(-x/t)), μεταβάλουμε τα άνω
και κάτω όρια, έτσι ώστε η τιμή για τον
να σταθεροποιηθεί ενώ το
23
της προσαρμογής
να είναι ελάχιστο24 .
Το
της προσαρμογής το διαβάζουμε από το αποτέλεσμα της εντολής
fit
από τη γραμμή “variance of residuals”. Από τις επόμενες
γραμμές διαβάζουμε τις τιμές των παραμέτρων με τα σφάλματά
τους25
και συμπεραίνουμε ότι .
Πρέπει να τονιστεί ότι το σφάλμα αυτό είναι το στατιστικό σφάλμα της
προσαρμογής για τα δεδομένα όρια που επιλέξαμε και όχι το πραγματικό σφάλμα.
Συνήθως, όπως και εδώ, τα μεγαλύτερα σφάλματα στην προσαρμογή των δεδομένων
σε μία συνάρτηση είναι συστηματικά που οφείλονται (εδώ) κυρίως στην επιλογή των
ορίων26 .
Δοκιμάζοντας διάφορες τιμές μέχρι να διπλασιαστεί η τιμή του , βρίσκουμε
.
Στη συγκεκριμένη περίπτωση, το μεγαλύτερο συστηματικό σφάλμα προέρχεται από την παράλειψη της επίδρασης και άλλων χρόνων αυτοσυσχετισμού του συστήματος. Λάβαμε υπόψη μόνο την κύρια συνεισφορά από τον μεγαλύτερο χρόνο αυτοσυσχετισμού προσαρμόζοντας τα δεδομένα στη συνάρτηση
![]() | (13.55) |
Στην πραγματικότητα, λαμβάνοντας υπόψη και μικρότερους χρόνους
αυτοσυσχετισμού, περιμένουμε . Βρίσκουμε πως
τα δεδομένα μας προσαρμόζονται με πολύ σταθερό τρόπο στη συνάρτηση
![]() | (13.56) |
΄Οπως φαίνεται και στο σχήμα 13.22, πετυχαίνουμε άριστη προσαρμογή για πολύ
μικρούς χρόνους και τα αποτελέσματά μας για τον κύριο χρόνο αυτοσυσχετισμού
. Οι δευτερεύοντες χρόνοι αυτοσυσχετισμού είναι
,
οι οποίοι είναι αρκετά μικρότεροι από τον
.
Για διευκόλυνση του αναγνώστη παραθέτουμε τις βασικές εντολές για την αναφερόμενη ανάλυση:
Εδώ δίνουμε το πρόγραμμα που υπολογίζει τα σφάλματα με τη μέθοδο jackknife που
περιγράψαμε στην ενότητα 13.6.2. Στο σχήμα 13.21 φαίνεται πώς χωρίζουμε τα
δεδομένα μας σε bins. Σε κάθε bin υπολογίζουμε τη μέση τιμή της ποσότητας
που μας ενδιαφέρει και στη συνέχεια, από τη σχέση (13.48) τα σφάλματα.
Για την εφαρμογή της μεθόδου, παραθέτουμε πρόγραμμα από το αρχείο
jack.f90 (θα το βρείτε στον υποκατάλογο Tools/ στο συνοδευτικό λογισμικό)
το οποίο υπολογίζει τις ποσότητες
,
,
και
.
Για τη μεταγλώττιση χρησιμοποιούμε την εντολή
Αν τα δεδομένα μας είναι σε μία στήλη στο αρχείο data, τότε η εντολή για να κάνουμε τον υπολογισμό των σφαλμάτων με 50 jack bins είναι:
Το πρόγραμμα δέχεται το πολύ MAXDAT=1,000,000 μετρήσεις. Αν έχουμε παραπάνω, πρέπει να χρησιμοποιήσουμε τον διακόπτη -d 2000000 για 2,000,000 μετρήσεις λ.χ. Η επιλογή να διαβάζουμε από το stdin γίνεται για να μπορεί το πρόγραμμα να χρησιμοποιηθεί σε συνδυασμό με φίλτρα. Για παράδειγμα, για την ανάλυση της μαγνήτισης με το πρόγραμμα που έχουμε γράψει για το πρότυπο Ising μπορούμε να χρησιμοποιήσουμε την εντολή:
Η παραπάνω εντολή είναι μία γραμμή, αν αφαιρέσουμε τις τελευταίες ανάποδα
κάθετες γραμμές (backslash – ’∖’). Για πληρότητα ας την εξηγήσουμε: Η πρώτη
γραμμή τρέχει το πρόγραμμα is για το πρότυπο Ising για
πλεγματικές θέσεις (-L 20) και
(-b 0.4407). Αρχίζει από “καυτή”
διάταξη σπιν (-s 1) και κάνει 2,000,000 μετρήσεις (-n 2000000). Φιλτράρουμε με
την εντολή grep -v τα σχόλια από την έξοδο του προγράμματος. Στη δεύτερη
γραμμή, καλούμε την awk ορίζοντας τη μεταβλητή L=20 να τυπώσει την
απόλυτη τιμή της δεύτερης στήλης διαιρεμένης με τον αριθμό των πλεγματικών
θέσεων L*L. Στην τρίτη γραμμή, γίνεται ο υπολογισμός της μέσης τιμής
και
με τα σφάλματά τους από το πρόγραμμα jack. Από τα
αποτελέσματα αφαιρούνται τα σχόλια με την εντολή grep -v. Η τέταρτη
γραμμή γίνεται απλά για τον υπολογισμό της μαγνητικής επιδεκτικότητας
(13.33) , όπου πρέπει να πολλαπλασιάσουμε με τον παράγοντα
τις διακυμάνσεις
και το σφάλμα τους για να πάρουμε την
.
Στην υποενότητα αυτή, παραθέτουμε το πρόγραμμα για τον υπολογισμό των σφαλμάτων με τη μέθοδο bootstrap σύμφωνα με τα όσα είπαμε στην ενότητα 13.6.3. Το πρόγραμμα κωδικοποιείται στο αρχείο boot.f90:
Για τη μεταγλώττιση χρησιμοποιούμε την εντολή
Αν τα δεδομένα μας είναι σε μία στήλη στο αρχείο data, τότε η εντολή για να κάνουμε τον υπολογισμό των σφαλμάτων με 500 samples είναι:
Το πρόγραμμα δέχεται το πολύ 1,000,000 μετρήσεις, όπως και στο πρόγραμμα jack. Αν έχουμε παραπάνω, πρέπει να χρησιμοποιήσουμε το διακόπτη -d 2000000 για 2,000,000 μετρήσεις λ.χ. Για παράδειγμα, για την ανάλυση της μαγνήτισης με το πρόγραμμα που έχουμε γράψει για το πρότυπο Ising μπορούμε να χρησιμοποιήσουμε την εντολή:
Η παραπάνω εντολή είναι μία γραμμή, αν αφαιρέσουμε τις τελευταίες ανάποδα κάθετες γραμμές (backslash – ’∖’).
Στην υποενότητα αυτή θα χρησιμοποιήσουμε και θα συγκρίνουμε τις μεθόδους που
αναφέραμε στις προηγούμενες ενότητες για τον υπολογισμό των σφαλμάτων. Θα
χρησιμοποιήσουμε τη σχέση (13.43) , τη μέθοδο jackknife (13.48) και τη μέθοδο
bootstrap (13.52) . Για να φανούν οι διαφορές, θα χρησιμοποιήσουμε δεδομένα
με ισχυρό αυτοσυσχετισμό. Επιλέγουμε στο πρότυπο Ising τον αλγόριθμο
Metropolis για ,
. Ειδικότερα, θα μελετήσουμε τη
μαγνήτιση ανά πλεγματική θέση (13.31) . Κάνουμε
μετρήσεις με τις
εντολές:
Το αρχείο outL40b0.4407.m έχει σε μία στήλη τις μετρήσεις της μαγνήτισης, ενώ
το αρχείο outL40b0.4407.rhom τη συνάρτηση αυτοσυσχετισμού και τον
ολοκληρωμένο χρόνο αυτοσυσχετισμού. Με το gnuplot μελετούμε το χρόνο
αυτοσυσχετισμού, όπως περιγράψαμε από τη σελίδα 1441 και μετά. Παίρνουμε
. ϒπολογίζουμε και τον ολοκληρωμένο χρόνο αυτοσυσχετισμού με
αποτέλεσμα
.
Η μέση τιμή . Η εφαρμογή της σχέσης (13.42) (που
προϋποθέτει στατιστικά ανεξάρτητες μετρήσεις) δίνει το (υποεκτιμημένο) σφάλμα
στατιστικής απόκλισης
. Χρησιμοποιώντας τη σχέση (13.43) ,
έχουμε
. Τη μαγνητική επιδεκτικότητα δεν
είναι δυνατόν να την υπολογίσουμε με τον τρόπο αυτό. ΄Αρα, δίνουμε το
αποτέλεσμα
![]() | (13.57) |
Για τον υπολογισμό της μαγνητικής επιδεκτικότητας είναι αναγκαίο να
χρησιμοποιήσουμε μία από τις μεθόδους jackknife ή bootstrap. Η δεύτερη
εφαρμόζεται αρχικά με μεταβλητό αριθμό δειγμάτων , έτσι ώστε να
προσδιορίσουμε τον βέλτιστο αριθμό από αυτά για να χρησιμοποιήσουμε στην
ανάλυσή μας. Στο σχήμα 13.24 φαίνονται τα αποτελέσματα για τη μαγνήτιση.
Παρατηρούμε πολύ γρήγορη σύγκλιση στο σφάλμα της στατιστικής απόκλισης
για μικρό αριθμό δειγμάτων. Θα μπορούσαμε με ασφάλεια για
την ανάλυση των δεδομένων της μαγνήτισης να επιλέγαμε
. Για
την περίπτωση της μαγνητικής επιδεκτικότητας η σύγκλιση είναι πιο αργή,
αλλά πάλι θα μπορούσαμε να πάρουμε
. Παίρνουμε
και για το σφάλμα
. Η τιμή του σφάλματος, όμως, αφορά
ανεξάρτητες μετρήσεις, κάτι που δε συμβαίνει στην περίπτωσή μας. Η τιμή αυτή θα
πρέπει να διορθωθεί από τον παράγοντα
και να δώσει
.
΄Αρα,
![]() | (13.58) |
Αξίζει να παρατηρηθεί ότι το σφάλμα είναι αρκετά μεγάλο, κάτι που δείχνει την
πρακτική δυσκολία που φέρνουν οι μεγάλοι χρόνοι αυτοσυσχετισμού [στην
πραγματικότητα έχουμε μόνο ανεξάρτητες
μετρήσεις]. Επίσης, σημειώνουμε ότι για τον υπολογισμό του σφάλματος με τον
τρόπο αυτό είναι αναγκαία η γνώση του
.
Πιο ασφαλής, γρήγορη και ευσταθής μέθοδος είναι η μέθοδος jackknife. Εδώ, δε
θα χρειαστεί η εκ των προτέρων γνώση του . Για τον προσδιορισμό του
σφάλματος αρκεί να μελετήσουμε τα δεδομένα με μεταβλητό αριθμό από jackknife
bins
. Στο σχήμα 13.26 φαίνονται τα αποτελέσματά μας για τη μαγνήτιση. ΄Οταν
τα jackknife bins
, τότε τα δείγματά μας αποτελούνται από όλες τις
μετρήσεις εκτός από ένα στοιχείο. Τότε το σφάλμα θα είναι το ίδιο με το σφάλμα της
στατιστικής απόκλισης και θα είναι υποεκτιμημένο κατά τον γνωστό παράγοντα
. Αυτό φαίνεται στο σχήμα 13.26 όπου παρατηρείται μια πολύ αργή
σύγκλιση στην τιμή
. Η επίδραση των αυτοσυσχετισμών
εξαφανίζεται, καθώς από το δείγμα μας αφαιρούμε
μετρήσεις.
Αυτό γίνεται, όταν
.
Φυσικά, αυτή η εκτίμηση δίνει την τάξη μεγέθους και μια προσεκτική μελέτη είναι
αναγκαία για τον προσδιορισμό του σωστού αριθμού
. Στο σχήμα 13.26 βλέπουμε
ότι το σφάλμα συγκλίνει για
στην τιμή
που είναι
αρκετά κοντά στην τιμή
(και ακόμα κοντύτερα, αν
χρησιμοποιήσουμε τον ολοκληρωμένο χρόνο αυτοσυσχετισμού
).
Επίσης, παρατηρούμε ότι χοντρική εκτίμηση του σφάλματος μπορούμε να πάρουμε
για πολύ μικρό αριθμό
, κάτι που μπορεί να χρησιμοποιηθεί για
γρήγορους υπολογισμούς.
Παρόμοια αποτελέσματα παίρνουμε και για τη μαγνητική επιδεκτικότητα ,
όπου το σφάλμα συγκλίνει στην τιμή
σε συμφωνία με τις προηγούμενες
εκτιμήσεις μας. Για
, το σφάλμα συγκλίνει στο (υποεκτιμημένο) σφάλμα
.
Γεννιέται το ερώτημα αν η μέθοδος bootstrap μπορεί να χρησιμοποιηθεί με ανάλογο
τρόπο με αυτό της jackknife για τον προσδιορισμό του πραγματικού σφάλματος
,
χωρίς τη γνώση του
. Η απάντηση είναι ναι. Θα χρησιμοποιήσουμε τη
διαίσθησή μας από τη μέθοδο jackknife και binning. Χωρίζουμε τα δεδομένα μας σε
bins27
των οποίων το εύρος
. Κάθε bin θεωρείται ως μια ανεξάρτητη
μέτρηση που είναι η μέση τιμή της παρατηρήσιμης ποσότητας μέσα στο bin αυτό.
Παίρνουμε
και εφαρμόζουμε τη μέθοδο bootstrap στο δείγμα των
μετρήσεων. Στα σχήματα 13.30 και 13.32 δείχνουμε τα αποτελέσματά μας
ως συνάρτηση του
. ΄Οταν αυτό γίνει
οι
μετρήσεις μας θα είναι πρακτικά ανεξάρτητες και θα πρέπει να πάρουμε το
πραγματικό σφάλμα. Στο σχήμα 13.30 δείχνουμε τα αποτελέσματα για τη
μαγνήτιση όπου για bin width=1, έχουμε το αποτέλεσμα
. ΄Οταν
το εύρος γίνει
, το σφάλμα γίνεται
, το οποίο το
διαβάζουμε στο plateau για
, σε συμφωνία με
τη μέθοδο jackknife. Στο σχήμα 13.30 δείχνουμε τα αποτελέσματα για τη
μαγνητική επιδεκτικότητα. Πάλι για bin width=1, έχουμε το αποτέλεσμα
. ΄Οταν το εύρος γίνει
, το σφάλμα γίνεται
,
το οποίο το διαβάζουμε στο plateau για
που
δεν είναι πολύ διαφορετικό από το αποτέλεσμα που πήραμε με τη μέθοδο
jackknife.
Κλείνουμε την υποενότητα αυτή με μια σημαντική παρατήρηση. Στην παρουσίασή
μας υπολογίσαμε πρώτα το χρόνο αυτοσυσχετισμού από τη συνάρτηση
αυτοσυσχετισμού και στη συνέχεια, προσδιορίσαμε πότε οι μέθοδοι που
χρησιμοποιήσαμε έδωσαν το (υποεκτιμημένο) σφάλμα στατιστικής απόκλισης των
μετρήσεων και πότε το πραγματικό που λαμβάνει υπόψη τους αυτοσυσχετισμούς.
Στην πράξη όμως, οι μέθοδοι αυτοί αποτελούν μία ανεξάρτητη μέθοδο υπολογισμού
του
από τις σχέσεις
. ΄Ετσι, από τα παραπάνω συνάγεται
ότι
![]() | (13.59) |
σχέσεις που μπορούν να χρησιμοποιηθούν για τον έλεγχο της αυτοσυνέπειας της ανάλυσης των δεδομένων μας. Φυσικά θα υπενθυμίσουμε ότι ένα σύστημα έχει πολλούς χρόνους αυτοσυσχετισμού και διαφορετικές παρατηρήσιμες ποσότητες και μπορεί η συμπεριφορά τους να καθορίζεται από διαφορετικούς χρόνους αυτοσυσχετισμού (fast modes, slow modes).
Τι παρατηρείτε; Φτιάξατε μια κλειστή καμπύλη στο επίπεδο ; Ποιες
είναι οι τιμές της μαγνήτισης για
; Γιατί είναι διαφορετικές;
Τα συστήματα που παρουσιάζουν μετάβαση πρώτης τάξης, παρουσιάζουν
καταστάσεις που είναι τοπικά ελάχιστα της ελεύθερης ενέργειας, αλλά υπάρχει
μόνο ένα πραγματικό ελάχιστο. Αυτό φαίνεται στο σχήμα 12.2 όπου
απεικονίζονται οι δύο καταστάσεις να έχουν την ίδια ελεύθερη ενέργεια. Αυτό
συμβαίνει ακριβώς στο κρίσιμο σημείο. ΄Οταν φύγουμε από αυτό, τότε το ένα
ελάχιστο είναι το πραγματικό, ενώ το άλλο έχει μεγαλύτερη ελεύθερη ενέργεια.
΄Οταν το σύστημα βρεθεί σε αυτή την κατάσταση, τότε χρειάζεται μεγάλο
χρόνο για να μπορέσει να υπερπηδήσει το φράγμα ελεύθερης ενέργειας και
να βρει το πραγματικό ελάχιστο. Μία τέτοια κατάσταση ονομάζεται
μετασταθής. Σε μια προσομοίωση Μόντε Κάρλο μια τέτοια περίπτωση
παρουσιάζει μεγάλη δυσκολία, αφού μπορούμε να θεωρήσουμε κατά λάθος
ότι βρισκόμαστε στη θεμελιώδη κατάσταση. Εσείς επαναλάβετε τις
προσομοιώσεις που κάνατε παραπάνω, αλλά κάντε αυτή τη φορά
sweeps. Παρατηρήστε τη χρονοσειρά της μαγνήτισης και παρατηρήστε τις
μεταπτώσεις από τη μια μετασταθή κατάσταση στην άλλη. Κάνετε το
ιστόγραμμα των τιμών της μαγνήτισης και εντοπίστε τη μετασταθή
κατάσταση. Πώς μεταβάλλεται το ιστόγραμμα, καθώς αυξάνεται το
;
Ορίστε την staggered magnetization να είναι η μαγνήτιση ανά πλεγματική
θέση ενός υποπλέγματος το οποίο περιέχει τα πλεγματικά σημεία με
περιττή
και
συντεταγμένη. Θέστε
και υπολογίστε την
εξάρτηση της ενέργειας,
, ειδικής θερμότητας και μαγνητικής
επιδεκτικότητας
και της staggered μαγνητικής επιδεκτικότητας
.
Η παρουσιάζει ένα μέγιστο στην περιοχή
. ϒπολογίστε την
τιμή της στη θερμοκρασία αυτή για
. Δείξτε ότι η τιμή αυτή δεν
αποκλίνει για
, άρα δεν έχουμε ένδειξη μετάβασης φάσης από την
.
Επαναλάβετε για την . Τι συμπεραίνετε; Συγκρίνετε τη συμπεριφορά της
για το αντισιδηρομαγνητικό πρότυπο Ising με την
του
σιδηρομαγνητικού.
΄Ηδη αναφέραμε σε προηγούμενα κεφάλαια πως ένα φυσικό σύστημα
το οποίο εμφανίζει μία συνεχή μετάβαση φάσης κατά την οποία,
καθώς ή, ισοδύναμα, καθώς η αδιάστατη ή ανηγμένη
θερμοκρασία1
![]() | (14.1) |
το μήκος συσχετισμού στο θερμοδυναμικό όριο απειρίζεται
σύμφωνα με τη σχέση
![]() | (14.2) |
βρίσκεται σε μία κλάση παγκοσμιότητας (universality class) η οποία χαρακτηρίζεται από
κρίσιμους εκθέτες. Οι κρίσιμοι εκθέτες περιγράφουν την κύρια μη αναλυτική συμπεριφορά
των φυσικών ποσοτήτων που παρουσιάζεται ασυμπτωτικά στο θερμοδυναμικό
όριο2
, όταν
. Αυτό που χαρακτηρίζει μία κλάση παγκοσμιότητας είναι ότι,
ενώ αποτελείται από συστήματα που δίνονται από διαφορετικές Χαμιλτονιανές, τα
συστήματα αυτά έχουν τους ίδιους κρίσιμους εκθέτες. ΄Ετσι, αν στο πρότυπο Ising
αλλάξουμε την αλληλεπίδραση πλησιέστερων γειτόνων προσθέτοντας όρους από πιο
απομεμακρυσμένες πλεγματικές θέσεις (πάντα όμως σε απόσταση
) ή αν
αλλάξουμε την τοπολογία του πλέγματος από τετραγωνικό σε τριγωνικό, εξαγωνικό
κλπ, θα παραμείνουμε στην ίδια κλάση παγκοσμιότητας. ΄Ετσι, μπορούμε να
μελετήσουμε ένα πολύπλοκο φυσικό σύστημα στην περιοχή της μετάβασης φάσης
χρησιμοποιώντας το απλούστερο δυνατόν μοντέλο που ανήκει στην ίδια κλάση
παγκοσμιότητας. Για παράδειγμα, η μετάβαση φάσης υγρό/ατμός κοντά στο
τρικρίσιμο σημείο ανήκει στην ίδια κλάση παγκοσμιότητας με το πρότυπο Ising στο
επίπεδο.
Στο πρότυπο Ising είδαμε στο Κεφάλαιο 12 τους κρίσιμους εκθέτες
![]() | (14.3) |
![]() | (14.4) |
![]() | (14.5) |
Η παραπάνω συμπεριφορά παρουσιάζεται, μόνο όταν . Για πεπερασμένο
πλέγμα όλες οι ποσότητες είναι αναλυτικές, αφού υπολογίζονται από την αναλυτική
συνάρτηση επιμερισμού
που δίνεται από την (13.4) . Στο πεπερασμένο πλέγμα όσο
, το μοντέλο συμπεριφέρεται (προσεγγιστικά) όπως το άπειρο σύστημα
ενώ καθώς
και το
, παρουσιάζονται φαινόμενα επίδρασης του
πεπερασμένου μεγέθους (finite size effects). Οι διακυμάνσεις
,
στο πεπερασμένο
πλέγμα παρουσιάζουν μέγιστο για μια ψευδοκρίσιμη θερμοκρασία
η οποία
φυσικά3
![]() | (14.6) |
Θυμίζουμε στον αναγνώστη ότι για το πρότυπο Ising στο τετραγωνικό πλέγμα που
δίνεται από την (13.14) έχουμε .
Για
, λόγω της (14.2) , έχουμε
οπότε οι σχέσεις (14.3) – (14.5) γίνονται
![]() | (14.7) |
![]() | (14.8) |
![]() | (14.9) |
Τονίζουμε ότι οι παραπάνω σχέσεις αφορούν όλη την ψευδοκρίσιμη περιοχή, οπότε στην
πράξη μπορούμε να πάρουμε είτε τις τιμές των ποσοτήτων, όταν είτε όταν
4.
Στις επόμενες παραγράφους θα δείξουμε πώς να υπολογίσουμε τους κρίσιμους
εκθέτες από τις σχέσεις (14.3) – (14.5) και (14.7) – (14.9) .
Η μελέτη των κρίσιμων εκθετών απαιτεί προσομοιώσεις ακριβείας, άρα και υψηλής στατιστικής. Ο αλγόριθμος Metropolis που αναπτύχθηκε στο προηγούμενο κεφάλαιο πάσχει από κρίσιμη επιβράδυνση (critical slowing down) στην κρίσιμη περιοχή αλλαγής φάσης και είναι αδύνατον να μελετήσουμε αρκετά μεγάλα πλέγματα για την εξαγωγή αποτελεσμάτων ακριβείας. Στο κεφάλαιο αυτό, θα αναλύσουμε τους λόγους εμφάνισης και τις δυσκολίες που παρουσιάζει το φαινόμενο αυτό στις προσομοιώσεις Monte Carlo. Θα παρουσιάσουμε τον αλγόριθμο του Wolff που σχεδόν εξαλείφει το φαινόμενο. Αλγόριθμοι σαν και αυτόν βασίζονται στη μερική κατανόηση της δυναμικής των μοντέλων που μελετούμε και έχουν ειδική εφαρμογή σε αντίθεση με τον αλγόριθμο Metropolis που εφαρμόζεται σε όλα τα συστήματα στατιστικής φυσικής και έχει γενική εφαρμογή.
΄Οπως συζητήσαμε στην ενότητα 13.5, η προσομοίωση του πρότυπου Ising στην κρίσιμη περιοχή αλλαγής φάσης με τον αλγόριθμο Metropolis παρουσιάζει μεγάλη αύξηση του χρόνου αυτοσυσχετισμού που δίνεται από τη σχέση βάθμισης
![]() | (14.10) |
Στην ψευδοκρίσιμη περιοχή το μήκος συσχετισμού γίνεται και παίρνουμε τη
σχέση (13.39)
. ΄Οταν
, έχουμε το φαινόμενο της κρίσιμης
επιβράδυνσης στην προσομοίωση.
Εδώ αξίζει να αναφέρουμε ότι το φαινόμενο αυτό είναι που
ουσιαστικά περιορίζει τη δυνατότητα που έχουμε να προσομοιώσουμε
συστήματα με πολύ μεγάλο από την άποψη του διαθέσιμου
5. ΄Οταν
μετράμε μια τοπική ποσότητα, όπως η μαγνήτιση ανά πλεγματική θέση
, η αύξηση του
αυξάνει τον χρόνο6
, αλλά ταυτόχρονα οι μετρήσεις που παίρνουμε για την
αυξάνουν
με τον ίδιο ρυθμό. ΄Αρα, αν σε κάθε sweep του πλέγματος παίρναμε μία στατιστικά
ανεξάρτητη διάταξη των σπιν, τότε δε θα είχαμε επιπλέον κόστος για μια
δεδομένης ακρίβειας μέτρηση, αφού με την αύξηση του
το αυξημένο κόστος
παραγωγής της διάταξης θα αντισταθμιζόταν από τα περισσότερα σπιν πάνω στα
οποία θα μετρήσουμε την
και θα είχαμε για τον χρόνο συλλογής
δεδομένης στατιστικής για τη μαγνήτιση ανά πλεγματική θέση
.
Οπότε θα μας συνέφερε η μέτρηση στο μεγαλύτερο δυνατόν
, ώστε να
ελαχιστοποιήσουμε τα φαινόμενα επίδρασης του πεπερασμένου μεγέθους του
πλέγματος.
Η παρουσία κρίσιμης επιβράδυνσης, όμως, προσθέτει το κόστος παραγωγής
ανεξάρτητων μετρήσεων και παίρνουμε με αποτέλεσμα για κάποια τιμή
του
να γίνεται απαγορευτικά ακριβό να προσομοιώσουμε μεγαλύτερο σύστημα.
Στη συγκεκριμένη περίπτωση που μελετάμε, το πρότυπο Ising στο επίπεδο με τον
αλγόριθμο Metropolis,
και το πρόβλημα αυτό παρουσιάζεται πολύ
γρήγορα. Είναι ιδιαίτερα ενδιαφέρον να αναζητηθούν αλγόριθμοι που να
ελαχιστοποιούν το φαινόμενο και στην περίπτωση του πρότυπου Ising, αλλά και
άλλων μοντέλων με σπιν η λύση είναι αρκετά απλή. ΄Οπως θα δούμε όμως, η λύση
προκύπτει από τη βαθύτερη κατανόηση της δυναμικής που προκαλεί το φαινόμενο της
κρίσιμης επιβράδυνσης και αφορά μόνο τα πρότυπα εκείνα με παρόμοια δυναμική
δομή7 .
Ο λόγος που παρουσιάζεται το φαινόμενο της κρίσιμης επιβράδυνσης
είναι η αύξηση του μήκους συσχετισμού στην κρίσιμη περιοχή. Καθώς
πλησιάζουμε την κρίσιμη θερμοκρασία
από τη φάση αταξίας των σπιν,
δημιουργούνται στο πλέγμα μεγάλες περιοχές όπου τα σπιν δείχνουν προς την
ίδια κατεύθυνση. Η επικράτηση των περιοχών αυτών είναι αυτή που τελικά
θα οδηγήσει το σύστημα στη φάση τάξης με μη μηδενική μαγνήτιση ανά
πλεγματική θέση στο θερμοδυναμικό όριο. Ο αλγόριθμος Metropolis επιχειρεί
την αλλαγή των σπιν ένα–ένα, κάτι το οποίο είναι δύσκολο ειδικά για σπιν
μέσα στις περιοχές αυτές. Για ένα σπιν με τέσσερις γείτονες που έχουν
σπιν στην ίδια κατεύθυνση με αυτό, η αλλαγή γίνεται δεκτή με πιθανότητα
, η οποία είναι πολύ μικρή. Τα περισσότερα σπιν στα οποία η
αλλαγή γίνεται δεκτή βρίσκονται στα όρια των περιοχών αυτών και η αλλαγή από
μία διάταξη σε μια άλλη όπου οι περιοχές αυτές βρίσκονται σε ανεξάρτητες
θέσεις και έχουν ανεξάρτητα σχήματα απαιτεί μεγάλο χρόνο: Μια περιοχή
δημιουργείται/καταστρέφεται (στοχαστικά φυσικά) μετακινώντας το σύνορό
της.
Για τη βελτίωση της επίδρασης του φαινομένου της κρίσιμης επιβράδυνσης είναι ανάγκη να επινοηθούν αλγόριθμοι όπου θα μπορεί κανείς σε ένα βήμα να αλλάξει την τιμή των σπιν σε περιοχές συγκρίσιμες με τις μεγάλες περιοχές όμοιων σπιν. Οι περιοχές αυτές από κατάλληλα επιλεγμένα όμοια σπιν ονομάζονται τα clusters του αλγόριθμου. Το πρώτο βήμα έγινε με τον αλγόριθμο Swendsen-Wang [62], ενώ αργότερα παρουσιάστηκε και ο αλγόριθμος του Uli Wolff [63].
Από την ιδέα που παρουσιάσαμε προκύπτει ότι η διαδικασία κατασκευής των
clusters πρέπει να είναι στοχαστική και να εξαρτάται από τη θερμοκρασία.
Σε ψηλές θερμοκρασίες πρέπει να ευνοείται η κατασκευή μικρών
clusters με μέγεθος ίσο με μερικές πλεγματικές σταθερές, ενώ σε χαμηλές
θερμοκρασίες
να ευνοείται η κατασκευή μεγάλων clusters με μέγεθος
.
Η βασική ιδέα στον αλγόριθμο του Wolff είναι να επιλέξουμε έναν σπιν-“σπόρο”
(γεννήτορα, seed) και να κατασκευάσουμε ένα cluster γύρω από αυτόν. Σε κάθε
βήμα προσθέτουμε μέλη στο cluster με πιθανότητα . Με κατάλληλα
επιλεγμένη
το cluster θα αναπτύσσεται με τον αναμενόμενο τρόπο και θα
ικανοποιείται η συνθήκη λεπτομερούς ισορροπίας (12.59) . Η σχέση φαίνεται
γραφικά στο σχήμα 14.1. Στην κατάσταση
το cluster περιγράφεται από τη
διακεκομμένη γραμμή. Η νέα κατάσταση
είναι αυτή όπου όλα τα σπιν του cluster
αντιστρέφονται, ενώ όλα τα σπιν στις πλεγματικές θέσεις εκτός του cluster μένουν
τα ίδια.
Η κατάλληλη επιλογή της θα μας δώσει τη σχέση (12.60)
![]() | (14.11) |
και η συζήτηση που θα ακολουθήσει βασίζεται στην πολύ απλή απόδειξη που
βρίσκεται στο βιβλίο των Newman και Barkema [4]. Η κρίσιμη παρατήρηση είναι
πως η μεταβολή της ενέργειας στο δεξί μέλος της (14.11) οφείλεται στο
σπάσιμο/δημιουργία δεσμών στο σύνορο του cluster, αφού στο εσωτερικό του δεν
μεταβάλλονται οι δεσμοί από όμοια σπιν, ενώ εκτός του cluster δεν επέρχεται καμιά
μεταβολή. Αυτό μπορείτε να το δείτε στο απλό παράδειγμα του σχήματος 14.1. Με
κατάλληλη επιλογή πιθανότητας επιλογής της κατάστασης
και του
λόγου αποδοχής
, έτσι ώστε
![]() | (14.12) |
θα πετύχουμε να ισχύει η (14.11) και να μεγιστοποιηθούν οι λόγοι αποδοχής.
Μάλιστα, στην περίπτωσή μας, θα βρούμε ότι !
Η πιθανότητα επιλογής είναι η πιθανότητα να κατασκευάσουμε το
συγκεκριμένο cluster και σπάει σε 3 όρους από ανεξάρτητες επιλογές:
![]() | (14.13) |
Ο πρώτος όρος είναι η πιθανότητα να ξεκινήσουμε το cluster από το συγκεκριμένο seed. Επιλέγοντας με ομοιόμορφη πιθανότητα μια πλεγματική θέση έχουμε
![]() | (14.14) |
Στη συνέχεια, το cluster αναπτύσσεται γύρω από τον γεννήτορά του. Ο δεύτερος
όρος είναι η πιθανότητα να ενσωματώσουμε όλα τα μέλη του cluster.
Η πιθανότητα αυτή είναι πολύπλοκη σχέση του μεγέθους και σχήματος
του cluster, αλλά ευτυχώς δεν είναι σημαντική στον υπολογισμό μας. Ο
λόγος είναι ότι κατά τη μετάβαση
ο αντίστοιχος όρος είναι ακριβώς
ο ίδιος, αφού τα δύο cluster είναι ακριβώς τα ίδια (έχουν μόνο αντίθετα
σπιν)!
![]() | (14.15) |
Ο τρίτος όρος είναι ο πιο ενδιαφέρων. Το cluster σταματάει την ανάπτυξή του
όταν στις θέσεις πάνω στο σύνορο του πούμε “όχι” στην ενσωμάτωση των
γειτονικών όμοιων σπιν (τα αντίθετα σπιν, προφανώς, δεν ενσωματώνονται). Αν
είναι η πιθανότητα να πούμε “ναι” στην ενσωμάτωση, η πιθανότητα
να πούμε “όχι” είναι
. Ας υποθέσουμε πως τα γειτονικά με το
cluster όμοια σπιν στην κατάσταση
είναι
, ενώ στην κατάσταση
είναι
. Λ.χ. στο σχήμα 14.1
και
. ΄Αρα, η πιθανότητα
να σταματήσουμε το cluster της κατάστασης
στο σύνορό που φαίνεται
στο σχήμα είναι να πούμε “όχι”
φορές, κάτι που γίνεται με πιθανότητα
:
![]() | (14.16) |
Ανάλογα, το cluster στην κατάσταση σταματάει στο ίδιο σύνορο με
πιθανότητα
![]() | (14.17) |
Τελικά, παίρνουμε
![]() | (14.18) |
Το δεξί μέλος της παραπάνω εξίσωσης εξαρτάται πάλι μόνο από τους δεσμούς στο
σύνορο του cluster. Οι εσωτερικοί δεσμοί δε συνεισφέρουν, οπότε η μεταβολή στην
ενέργεια οφείλεται μόνο στη δημιουργία/καταστροφή των δεσμών στο σύνορο.
Κάθε δεσμός που δημιουργείται στο σύνορο κατά τη μετάβαση
μειώνει την ενέργεια κατά 2, ενώ κάθε δεσμός που σπάει την αυξάνει κατά
2:
![]() | (14.19) |
οπότε παίρνουμε
![]() | (14.20) |
Από την παραπάνω σχέση βλέπουμε ότι αν επιλέξουμε
![]() | (14.21) |
μπορούμε επίσης να επιλέξουμε
![]() | (14.22) |
΄Αρα, μπορούμε να έχουμε τη συνθήκη (14.11) να ισχύει φτιάχνοντας το cluster με
την της (14.21) , κάνοντας πάντα τη νέα κατάσταση που προκύπτει δεκτή στο
επόμενο βήμα του Μόντε Κάρλο.
Συνοψίζοντας, ένα βήμα του αλγόριθμου Wolff γίνεται ως εξής:
Ο αλγόριθμος είναι εργοδικός, αφού από μια οποιαδήποτε κατάσταση μπορούμε να πάμε σε μία άλλη με μια σειρά από clusters μεγέθους 1 (ισοδύναμο με single-flip).
Η πιθανότητα εξαρτάται από τη θερμοκρασία
και είναι μικρή για
μεγάλες θερμοκρασίες (
) και σχεδόν 1, όταν η θερμοκρασία τείνει στο
μηδέν (
). ΄Αρα, στην πρώτη περίπτωση ο αλγόριθμος φτιάχνει πολύ μικρά
clusters (μεγέθους 1 για
), ενώ μεγάλα στη δεύτερη. ΄Αρα, στις μεγάλες
θερμοκρασίες έχουμε σχεδόν τυχαία spin flips όπως και στον αλγόριθμο
Metropolis, ενώ στις μικρές θερμοκρασίες (μεγάλο
) ο αλγόριθμος έχει μεγάλη
πιθανότητα να αλλάξει το cluster που επικρατεί στο πλέγμα. Αυτό φαίνεται
καθαρά στο σχήμα 14.2 όπου υπολογίζουμε το ποσοστό του πλέγματος
που καλύπτεται από το τυπικό Wolff cluster
ως συνάρτηση της
θερμοκρασίας. Για μικρά
,
, ενώ για μεγάλα
.
Στο σχήμα 14.3 βλέπουμε τυπικές διατάξεις των σπιν σε μικρές και μεγάλες
θερμοκρασίες. Για μικρά , ο αλγόριθμος Wolff επιλέγει τυχαία πλεγματική θέση,
φτιάχνει (συνήθως) ένα μικρό cluster και του αλλάζει την τιμή των σπιν. Ο
αλγόριθμος Metropolis επιλέγει τυχαία πλεγματική θέση και με μεγάλη
πιθανότητα της αλλάζει το σπιν. Το αποτέλεσμα είναι η (σχεδόν) τυχαία κατανομή
των σπιν όπως αναμένεται στη φάση αταξίας. Για μεγάλα
, οι διατάξεις
των σπιν “παγώνουν” με μικρές θερμικές διακυμάνσεις σκορπισμένες στο
πλέγμα. Ο αλγόριθμός του Wolff τυπικά επιλέγει για seed μία πλεγματική θέση
στο cluster που επικρατεί στο πλέγμα και το νέο cluster είναι με μεγάλη
πιθανότητα σχεδόν όλο το προηγούμενο. Με την αλλαγή της τιμής των σπιν,
όλες οι θερμικές διακυμάνσεις των αντίθετων σπιν ενσωματώνονται στο νέο
cluster. Νέες θερμικές διακυμάνσεις προκύπτουν από τα (λίγα και σκόρπια)
spin που δεν ενσωματώθηκαν στο νέο cluster. Ο αλγόριθμος Metropolis
επιλέγει τυχαίες θέσεις στο πλέγμα και αλλάζει με μικρή πιθανότητα τα
σπιν μέσα στο μεγάλο cluster, ενώ εξαφανίζει με πιθανότητα 1 τις θερμικές
διακυμάνσεις. Οι δύο αλγόριθμοι λειτουργούν με όμοια αποτελεσματικότητα.
Στο σχήμα 14.3 βλέπουμε τυπικές διατάξεις των σπιν στην ψευδοκρίσιμη
περιοχή. Αυτές κυριαρχούνται από cluster μεγάλου μεγέθους με τυχαίο σχήμα,
μέγεθος και κατανομή θέσης στο πλέγμα. Ο αλγόριθμος Wolff φτιάχνει
με μεγάλη πιθανότητα μεγάλα clusters, με αποτέλεσμα μεγάλα cluster να
καταστρέφονται και να δημιουργούνται σε χρόνο ανάλογο με το μέγεθος των cluster
(στο σχήμα 14.2 βλέπουμε ότι ). Αντιθέτως, ο αλγόριθμος
Metropolis αλλάζει τα cluster κυρίως μεταβάλλοντας το σχήμα τους στο
σύνορο, με αποτέλεσμα να χρειάζονται πολλά sweeps για την καταστροφή
μιας διάταξης από spin clusters και τη δημιουργία μιας νέας και στατιστικά
ανεξάρτητης από την προηγούμενη. Αναμένεται λοιπόν δραστική μείωση του χρόνου
αυτοσυσχετισμού στην ψευδοκρίσιμη περιοχή με τη χρήση του αλγόριθμου του
Wolff.
Η μέση τιμή του μεγέθους των Wolff clusters είναι μια δυναμική ποσότητα. Για
να το δούμε αυτό καθαρά θα δείξουμε ότι στη φάση αταξίας ()
ισχύει
![]() | (14.23) |
Παρουσιάζουμε την απόδειξη από τους Newmann και Barkema [4]: Αντί να
κατασκευάσουμε ένα Wolff cluster, επισκεπτόμαστε κάθε ζευγάρι από πλεγματικές θέσεις
και αν έχουν το ίδιο σπιν, τότε δημιουργούμε μεταξύ τους έναν δεσμό με πιθανότητα
. ΄Οταν τελειώσει η διαδικασία, το πλέγμα έχει χωριστεί σε
Wolff8
clusters κάθε ένα από τα οποία έχει
μέλη και σπιν
. Επιλέγουμε
τυχαία μία πλεγματική θέση και αλλάζουμε το σπιν του cluster στο
οποίο ανήκει. Καταστρέφουμε τους δεσμούς και επαναλαμβάνουμε τη
διαδικασία9 .
Η συνολική μαγνήτιση τότε είναι:
![]() | (14.24) |
και
![]() | (14.25) |
Οι τιμές είναι ισοπίθανες λόγω της συμμετρίας του μοντέλου, άρα ο
πρώτος όρος είναι μηδέν. Επειδή
, παίρνουμε τελικά
![]() | (14.26) |
Στον αλγόριθμο Wolff η κατασκευή ενός cluster ισοδυναμεί με την επιλογή ενός
από τα cluster που φτιάξαμε παραπάνω. Σύμφωνα με τα παραπάνω (τυχαία επιλογή
πλεγματικής θέσης και αλλαγή του σπιν στο cluster που ανήκει), η πιθανότητα
επιλογής του cluster είναι
![]() | (14.27) |
άρα, η μέση τιμή των Wolff clusters θα είναι
![]() | (14.28) |
Χρησιμοποιώντας τη Σχέση (14.26) και το γεγονός ότι για έχουμε
10,
παίρνουμε τελικά
![]() | (14.29) |
Στην παράγραφο αυτή θα σχεδιάσουμε την υλοποίηση του αλγόριθμου Wolff όπως αυτός παρουσιάστηκε στη σελίδα 1526. Για να αναπτύξουμε ένα cluster γύρω από το seed που επιλέγεται, θα χρειαστεί να χρησιμοποιηθεί μια βοηθητική θέση στη μνήμη (buffer) από την οποία θα ανασύρουμε τα νέα μέλη του cluster για να εξετάσουμε αν θα προσθέσουμε στο cluster τους πλησιέστερους γείτονές τους. Κάθε πλεγματική θέση που θα προσθέτουμε θα αποθηκεύεται στο buffer για να εξεταστεί με τη σειρά του αργότερα.
ϒπάρχουν δύο τέτοιες δομές δεδομένων που αρκούν για τη δουλειά που θέλουμε να κάνουμε. Η πρώτη είναι το stack (ή LIFO: last in – first out) και η δεύτερη το queue (ή FIFO: first in – first out). Kαι οι δύο είναι arrays στα οποία η διαφορά είναι το πώς ανασύρουμε τα δεδομένα από αυτά. Αυτό γίνεται ακριβώς όπως λέει και το όνομά τους. Στο stack, όταν ανασύρουμε ένα στοιχείο, παίρνουμε αυτό που είχαμε βάλει τελευταίο. Στο queue, όταν ανασύρουμε ένα στοιχείο, παίρνουμε αυτό που είχαμε βάλει πρώτο.
Το stack υλοποιείται από ένα μονοδιάστατο array stack(0:N-1) στο οποίο “σπρώχνουμε” (push) μια νέα τιμή και “αντλούμε” (pop) μια τιμή που θέλουμε να χρησιμοποιήσουμε. Για τη χρήση αυτή χρειαζόμαστε έναν ακέραιο m ίσο με τα ενεργά στοιχεία στο stack. Το στοιχείο που θα αντλήσουμε ανά πάσα στιγμή είναι το stack(m-1). Για να σπρώξουμε ένα στοιχείο e στο stack ακολουθούμε τα εξής βήματα:
Αντίθετα, για να τραβήξουμε μια τιμή και να την αποθηκεύσουμε στη μεταβλητή e, κάνουμε τα εξής:
Η υλοποίηση του queue γίνεται διαφορετικά. Η τοπολογία της διάταξης των στοιχείων είναι κυκλική αντί για γραμμική, όπως φαίνεται στο σχήμα 14.5. Χρησιμοποιούμε ένα array queue(0:N-1) και δύο ακέραιους m, n να δείχνουν την αρχή και τέλος του buffer. Η αρχή των δεδομένων είναι το στοιχείο queue(m-1), ενώ το τέλος το queue(n). ΄Οταν το queue είναι άδειο m=n ενώ το ίδιο ισχύει και όταν είναι γεμάτο. ΄Αρα, θα χρειαστούμε και μια μεταβλητή flag στην οποία αρχικά θα δώσουμε την τιμή 0 (άδειο queue)11 . Ο αριθμός (m-n) mod N είναι ο αριθμός των αποθηκευμένων στοιχείων12 . ΄Οταν το queue περιέχει δεδομένα θα παίρνει την τιμή 1. ΄Αρα, για να προσθέσουμε ένα στοιχείο e στο queue ακολουθούμε τα εξής βήματα:
Για να τραβήξουμε μια τιμή και να την αποθηκεύσουμε στη μεταβλητή e κάνουμε τα εξής:
Συνοψίζοντας, η αλγοριθμική διαδικασία κατασκευής ενός Wolff cluster στην περίπτωση του πρότυπου Ising είναι η εξής:
Η επιλογή stack ή queue δεν έχει ουσιαστική διαφορά. Τα αποτελέσματα είναι ίδια και δεν υπάρχουν σημαντικές διαφορές στην ταχύτητα. Η διαφορά είναι μόνο στον τρόπο που αναπτύσσονται τα clusters (για stack το cluster αναπτύσσεται σπειροειδώς γύρω από το seed, ενώ για queue το cluster αναπτύσσεται πρώτα σε μία διεύθυνση και μετά στην άλλη). Ο προσεκτικός προγραμματιστής θα δοκιμάσει και τις δύο, ώστε να ελέγξει τα αποτελέσματά του για λάθη στον κώδικα. Πιο σημαντικός λόγος είναι να ελέγξει την ποιότητα της γεννήτριας τυχαίων αριθμών, αφού ο αλγόριθμος του Wolff είναι ιδιαίτερα ευαίσθητος στις ατέλειές τους.
Στην παράγραφο αυτή θα παρουσιάσουμε και θα αναλύσουμε τον κώδικα που θα χρησιμοποιήσουμε στην προσομοίωση του πρότυπου Ising με τον αλγόριθμο Wolff.
Η καρδιά του αλγόριθμου βρίσκεται στην υπορουτίνα wolff() την οποία αποθηκεύουμε στο αρχείο wolff.f90. Κάθε κλήση της από το κυρίως πρόγραμμα κατασκευάζει ένα Wolff cluster, του αλλάζει το σπιν και σημειώνει το μέγεθός του.
Στο πρώτο μέρος της υπορουτίνας δημιουργούμε το buffer τύπου stack stack(0:N-1) το οποίο θα χρησιμοποιήσουμε στην κατασκευή του cluster. Αυτό το κάνουμε δυναμικά με τη χρήση της ALLOCATE και είμαστε προσεκτικοί στο τέλος να ελευθερώσουμε τη ζητούμενη μνήμη με την DEALLOCATE (αλλιώς θα έχουμε “memory leak” και η μνήμη που ζητά το πρόγραμμα θα αυξηθεί ανεξέλεγκτα).
Παρατηρούμε πως αν το σύστημα αδυνατεί να μας δώσει τη ζητούμενη μνήμη, τότε θέτει chk>0 και η locerr() σταματάει το πρόγραμμα.
Στη συνέχεια, αρχικοποιούμε το cluster με την επιλογή του seed.
cseed είναι το seed και τοποθετείται αμέσως στο cluster [stack(0) = cseed]. Η μεταβλητή nstack είναι ο αριθμός των στοιχείων του stack και αρχικά τίθεται ίση με 1. Η ncluster μετράει τον αριθμό των πλεγματικών θέσεων στο cluster και τίθεται αρχικά ίση με 1. sold=s(cseed) είναι η παλιά τιμή του σπιν του cluster και snew=-sold η νέα. Η τιμή του σπιν του νέου μέλους του cluster αλλάζεται αμέσως (s(cseed)=snew)! Αυτό βοηθάει στην πιο αποτελεσματική εφαρμογή του αλγόριθμου. Ελέγχοντας αν το σπιν ενός πλησιέστερου γείτονα είναι ίσο με sold, ελέγχει ταυτόχρονα αν το σπιν του είναι ίδιο με του cluster και αν ήδη έχει ήδη μπει στο cluster από προηγούμενο έλεγχο!
Ο βρόχος επανάληψης πάνω στα νέα μέλη του cluster συνοψίζεται παρακάτω:
Ο βρόχος do while(nstack > 0) εκτελείται όσο nstack>0, δηλ. όσο το stack
είναι γεμάτο και έχουμε νέα μέλη στο cluster. Η μεταβλητή scluster είναι η
τρέχουσα πλεγματική θέση που τραβάμε από το stack για να κοιτάξουμε τους
πλησιέστερους γείτονές της. Η γραμμή nn = scluster + XNN; if(nn > N) nn =
nn - N επιλέγει τον πλησιέστερο γείτονα προς τα δεξιά και τον αποθηκεύει στη
μεταβλητή nn. Αν το σπιν s(nn) του nn είναι ίσο με sold, τότε ο γείτονας
αυτός έχει σπιν ίδιο με αυτό του cluster και δεν έχει ήδη μπει στο cluster
(γιατί τότε θα είχαμε αλλάξει το σπιν του). Η μεταβλητή padd είναι ίση με
(αυτό τίθεται στην init) και αν r<padd (το οποίο συμβαίνει με πιθανότητα
), προσθέτουμε τον nn στο cluster: Τον προσθέτουμε στο stack,
αλλάζουμε το σπιν [s(nn)=snew] και αυξάνουμε το μέγεθος του cluster κατά 1.
Επαναλαμβάνουμε ακριβώς τα ίδια και για τους υπόλοιπους πλησιέστερους
γείτονες. Ολόκληρος ο κώδικας παρατίθεται παρακάτω για τη διευκόλυνση του
αναγνώστη:
Για να συνδέσουμε τη συνάρτηση με το υπόλοιπο πρόγραμμα, ώστε να έχουμε κατασκευή ενός cluster ανά “sweep”13 , μεταβάλλουμε τη main() ως εξής:
Ορίσαμε τη (global) μεταβλητή algorithm, ώστε ο χρήστης να
μπορεί να ελέγχει τον αλγόριθμο που θα χρησιμοποιήσει (Wolff ή
Metropolis)14 .
Μένει να οριστεί η (global) μεταβλητή padd, κάτι το
οποίο κάνουμε στην init(). Στο αρχείο global_data.f90 προσθέτουμε τις
γραμμές
στο init.c
ενώ μεταβάλλουμε το αρχείο options.f90, ώστε να παίρνει ένα διακόπτη -w όπου θα θέτει algorithm=1, ώστε το πρόγραμμα να λειτουργεί τον αλγόριθμο του Wolff:
Προσθέτουμε τη σχετική πληροφορία στο μήνυμα βοήθειας usage και simmessage και ... είμαστε έτοιμοι! Για τη μεταγλώττιση χρησιμοποιούμε το Makefile
και με τις εντολές
μεταγλωττίζουμε, υπενθυμίζουμε στον εαυτό μας τον τρόπο χρήσης του
εκτελέσιμου αρχείου is και κάνουμε ένα δοκιμαστικό τρέξιμο για ,
φτιάχνοντας 5000 clusters ξεκινώντας από μία “θερμή” διάταξη των σπιν
αποθηκεύοντας τα δεδομένα στο αρχείο outL20b0.44.
Για να πάρουμε τα αποτελέσματά μας, επιλέγουμε αρχικά το μέγεθος ενός πλέγματος που θέλουμε να προσομοιώσουμε και στη συνέχεια, τις θερμοκρασίες που θα προσομοιώσουμε. Η δουλειά γίνεται γρήγορα βαρετή, επαναλαμβανόμενη, κουραστική και τότε είναι που υπεισέρχονται απρόσκλητοι επισκέπτες τα ... ζουζούνια! Η τεμπελιά στην περίπτωση αυτή είναι αρετή και αξίζει να μάθουμε μερικές τεχνικές που κάνουν τη ζωή μας ευκολότερη, αλλά και τα αποτελέσματά μας πιο αξιόπιστα (συνήθως...). Στη βοήθειά μας έρχεται ο φλοιός (Shell) και τα εργαλεία του. Ο φλοιός μας επιτρέπει να εκτελέσουμε μια σειρά εντολών με το ίδιο ακριβώς συντακτικό που θα χρησιμοποιούσαμε στη γραμμή εντολών γράφοντάς τις σε ένα απλό αρχείο κειμένου. ΄Ενα απλό παράδειγμα είναι η σειρά εντολών που γράφουμε στο αρχείο run1:
Η πρώτη γραμμή που αρχίζει από τον χαρακτήρα # είναι σχόλιο και θα αγνοηθεί από
τον φλοιό. Η δεύτερη ξεκινάει από την αρχή μια προσομοίωση από “καυτή” διάταξη
σπιν (-s 1) για πλέγμα με L=20 (-L 20) και θερμοκρασία (-b 0.10).
Αρχικό seed καθορίζεται ο αριθμός 3423 (-S 3423) και κάνουμε μετρήσεις πάνω σε
5000 Wolff clusters (-n 5000 -w). Τα αποτελέσματα ανακατευθύνονται από το
stdout στο αρχείο outL20b0.10 (> outL20b0.10).
Οι επόμενες δέκα γραμμές συνεχίζουν την προσομοίωση στις θερμοκρασίες
–
. Κάθε προσομοίωση συνεχίζει από τη διάταξη σπιν που
αποθήκευσε το πρόγραμμα στο αρχείο conf στην προηγούμενη προσομοίωση.
Μόλις φτιάξαμε ένα (πρωτόγονο είναι αλήθεια) σενάριο φλοιού (shell script)! Για να τρέξουν οι εντολές αυτές πρέπει να κάνουμε το αρχείο εκτελέσιμο, δίνοντάς του (την πρώτη φορά μόνο) άδεια πρόσβασης x
και στη συνέχεια, να το εκτελέσουμε καλώντας το
Δεν τα πήγαμε και άσχημα... Αλλά μπορούμε και καλύτερα! Αντί να βάλουμε μία γραμμή για κάθε προσομοίωση, μπορούμε να χρησιμοποιήσουμε τις δυνατότητες προγραμματισμού του φλοιού. Ας δούμε πώς. Στο αρχείο run2 γράφουμε:
Η πρώτη γραμμή καλεί τον φλοιό tcsh να ερμηνεύσει το σενάριο. Αυτό δε χρειαζόταν στο run1, γιατί οποιοσδήποτε φλοιός μπορούσε να ερμηνεύσει τις εντολές που είχαμε γράψει. Εδώ όμως βάζουμε συντακτικό που είναι κατανοητό μόνο από τον συγκεκριμένο φλοιό. Το ζεύγος χαρακτήρων #! πρέπει να είναι οι δύο πρώτοι χαρακτήρες του αρχείου.
Η δεύτερη γραμμή είναι σχόλιο.
Η τρίτη γραμμή ορίζει μία μεταβλητή φλοιού με το όνομα L. Η τιμή της μεταβλητής είναι "20" (string, όχι αριθμός ακέραιος) και έχουμε πρόσβαση σε αυτή βάζοντας ένα $ μπροστά από το όνομά της. Δηλ. όπου γράφουμε στο σενάριο $L (ή ${L}), ο φλοιός θα αντικαθιστά το string 20. Για παράδειγμα όταν γράφουμε στο σενάριο outL${L}b, ο φλοιός θα φτιάχνει το string outL20b.
Η τέταρτη γραμμή ορίζει ένα array με το όνομα betas. Πρόσβαση στα στοιχεία του array παρέχεται από το συντακτικό $betas[αριθμός], όπου “αριθμός” είναι το στοιχείο του array αρχίζοντας από το 1. Στο παραπάνω παράδειγμα $betas[1] = 0.10, $betas[2] = 0.20, ..., $betas[11] = 0.70. Ειδικά η μεταβλητή $#betas = 11 είναι ο αριθμός των στοιχείων του array. ΄Οταν γράφουμε $betas, ο φλοιός αντικαθιστά όλες τις τιμές του array15 .
Η πέμπτη γραμμή ορίζει τη μεταβλητή start να έχει την τιμή $start ίση με το string "-s 1 -S 3423". Τα εισαγωγικά μπήκαν επειδή οι λέξεις χωρίζονται με κενά και ορίζουν έτσι επακριβώς το string. Οτιδήποτε γράφουμε από τον χαρακτήρα # και μετά είναι σχόλιο και ο φλοιός το αγνοεί.
Η εντολή foreach είναι ένας τρόπος να τρέξουμε έναν βρόχο στον φλοιό tcsh.
Οι επαναλαμβανόμενες εντολές αρχίζουν από την επόμενη γραμμή και τελειώνουν
στη γραμμή με την εντολή end. Οι επαναλήψεις γίνονται μία για κάθε τιμή του array
που βάζουμε ανάμεσα στις παρενθέσεις. Εδώ θα γίνει μία φορά για κάθε τιμή της
μεταβλητής $betas. Κάθε φορά που γίνεται μια επανάληψη, η μεταβλητή βρόχου, το
όνομα της οποίας μπαίνει αμέσως μετά τη λέξη foreach αντικαθίσταται από το
επόμενο στοιχείο του array. ΄Αρα, ο βρόχος που γράψαμε θα εκτελεστεί μία φορά για
κάθε τιμή του betas και η μεταβλητή beta θα παίρνει διαδοχικά τις τιμές
,
, ... ,
. Οι επόμενες τρεις γραμμές είναι οι εντολές που
θα εκτελεστούν έντεκα φορές. Η echo “αντηχεί” τα ορίσματά της και μας
πληροφορεί για την τρέχουσα τιμή των παραμέτρων της προσομοίωσης που τρέχει
(πολύ χρήσιμο, ειδικά αν οι προσομοιώσεις θέλουν αρκετό χρόνο). Η ./is
τρέχει το πρόγραμμα, κάθε φορά με διαφορετική τιμή για τη beta. Προσέξτε
πώς το αρχείο στο οποίο ανακατευθύνουμε τα δεδομένα αλλάζει όνομα,
κάθε φορά που αλλάζει η τιμή της beta. ΄Αρα, στο τέλος θα έχουμε τα
δεδομένα μας στα αρχεία outL20b0.10, outL20b0.20, ..., outL20b0.70. Η
τρίτη εντολή αλλάζει τον τρόπο που αρχίζει η προσομοίωση, από θερμή
διάταξη σπιν στο να διαβάσει τη διάταξη από το αρχείο conf. Την πρώτη
φορά που τρέχει ο βρόχος η τιμή της start είναι "-s 1 -S 3423" (θερμή
διάταξη, seed ίσο με 3423), ενώ στις επόμενες η τιμή της είναι "-s 2" (old
configuration).
΄Οταν λοιπόν θέλουμε να τρέξουμε για μια άλλη τιμή του L, δεν έχουμε παρά να αλλάξουμε την τιμή της αντίστοιχης μεταβλητής και να τρέξουμε πάλι το ίδιο script. ΄Η μήπως όχι... Χτύπησε πάλι η τεμπελιά:
Δεν έχουμε παρά να προσθέσουμε έναν βρόχο για κάθε τιμή του L ορίζοντας τώρα τη μεταβλητή–array Ls και βάζοντας όσα L τραβάει η ψυχή μας... Προσέξτε μόνο πού μετακινήσαμε τον ορισμό της μεταβλητής start (γιατί;).
Ο πρώτος έλεγχος στα δεδομένα μας είναι να εξετάσουμε γραφικά την εξέλιξή τους στον Μόντε Κάρλο χρόνο (time histories). Από εκεί θα κάνουμε μια πρώτη διάγνωση για τυχόν προβλήματα και λάθη και θα αποκτήσουμε μία αίσθηση για τους χρόνους εύρεσης της κατάστασης θερμικής ισορροπίας (thermalization) και των χρόνων αυτοσυσχετισμού. Από τα αρχεία που παράγαμε στην προηγούμενη παράγραφο μπορούμε να το καταφέρουμε εύκολα με τη βοήθεια του gnuplot. Για παράδειγμα, οι εντολές μέσα από το gnuplot16 :
μας δίνουν με απλό τρόπο τα time histories της ενέργειας, της απόλυτης τιμής της
μαγνήτισης και του μεγέθους των cluster που κατασκευάζονται από τον αλγόριθμο
του Wolff για ,
.
Για να υπολογίσουμε τις τιμές της μέσης ενέργειας ανά link και
της (απόλυτης τιμή της) μαγνήτισης ανά πλεγματική θέση
μπορούμε
να χρησιμοποιήσουμε το πρόγραμμα για jackknife που περιγράψαμε στο Παράρτημα
13.8. Αυτό θα το βρείτε και στα Tools στο συνοδευτικό λογισμικό στο αρχείο
jack.f90. Το μεταγλωττίζουμε στο εκτελέσιμο αρχείο jack και αντιγράφουμε το
αρχείο στον κατάλογο που εργαζόμαστε. Η μέση τιμή
μπορεί τότε να
υπολογιστεί με την εντολή
όπου με την awk ορίσαμε, χρησιμοποιώντας το option -v, τη μεταβλητή L=40 και
τυπώσαμε την πρώτη στήλη διαιρεμένη με . Με τη συνθήκη NR>500
τυπώνουμε αφού περάσουν οι πρώτες 500 γραμμές, απορρίπτοντας τις πρώτες
μετρήσεις για να είμαστε σίγουροι για την εύρεση της θερμικής ισορροπίας. Το
αποτέλεσμα τυπώνεται στο stdout ως εξής:
Οι γραμμές που αρχίζουν με # είναι σχόλια του προγράμματος και μας εξηγούν τα
αποτελέσματα. Οι δύο πρώτοι αριθμοί είναι η και το σφάλμα της, ενώ ο τρίτος
και ο τέταρτος οι διακυμάνσεις της ενέργειας
και το σφάλμα της.
Πολλαπλασιάζοντας την τελευταία με
, παίρνουμε την ειδική θερμότητα
και
το σφάλμα της σύμφωνα με την εξίσωση (13.32) . Μπορούμε να τυπώσουμε τις
πληροφορίες αυτές βολικά για να τις αποθηκεύσουμε σε ένα αρχείο με την
εντολή:
Γιατί το κάναμε αυτό; ΄Οχι λόγω ... μαζοχισμού! Οι παραπάνω εντολές
δίνονται σε μία γραμμή στη γραμμή εντολών (φυσικά εμείς τη σπάμε για να
φαίνεται στο κείμενο με τη γνωστή σύμβαση της ∖). Ανακαλώντας τις και
αλλάζοντας μόνο την τιμή της L ή/και της b, παίρνουμε χωρίς καινούργιο κόπο τα
αποτελέσματα για διαφορετική τιμή του ή/και
. Επίσης, το shell script που θα
φτιάξουμε σε λίγο θα μας φαίνεται λιγότερο ακατανόητο... Το αποτέλεσμα
είναι
που δίνει και
.
Η εντολή για τον υπολογισμό της μαγνήτισης δεν παρουσιάζει τώρα ιδιαίτερη δυσκολία. Το μόνο που έχουμε να κάνουμε είναι να υπολογίσουμε την απόλυτη τιμή της δεύτερης στήλης του αρχείου των δεδομένων για τις γραμμές που δεν αρχίζουν από #
Η απόλυτη τιμή υπολογίζεται από την έκφραση ($2>0)?$2:-$2, αποθηκεύεται στη
μεταβλητή m και τυπώνεται αφού διαιρεθεί με . Το αποτέλεσμα
είναι
που δίνει και
.
Παρόμοια δίνουμε την εντολή για τον υπολογισμό του :
Το αποτέλεσμα είναι
που δίνει .
΄Οσα είπαμε παραπάνω τα γράφουμε όλα μαζί στο script run3:
Το τρέχουμε με την εντολή
και αφού τελειώσει μπορούμε να δούμε τα αποτελέσματα με το gnuplot17 :
Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της μαγνήτισης.
Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της μαγνητικής επιδεκτικότητας.
Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της ενέργειας.
Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της ειδικής θερμότητας.
Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της .
Στην περίπτωση του αλγόριθμου του Metropolis ορίσαμε τη “μονάδα του χρόνου”
στην κατασκευή του δείγματος στην προσομοίωση Μόντε Κάρλο το “sweep”.
΄Ενα sweep ορίζεται, όταν έχουμε απόπειρες αλλαγής των σπιν του
πλέγματος.
Στην περίπτωση του αλγόριθμου του Wolff έχουμε την επιπλέον πολυπλοκότητα
που εισάγει το μεταβλητό μέγεθος των Wolff clusters με τη θερμοκρασία. ΄Αρα, αν
ορίσουμε ένα βήμα του αλγόριθμου να είναι η κατασκευή ενός cluster, τότε δεν
έχουμε έναν καλό ορισμό του sweep. Για πολύ χαμηλές θερμοκρασίες , η
κατασκευή ενός cluster είναι σχεδόν ισοδύναμη με μία αλλαγή σπιν ανά πλεγματική
θέση. Αν κρατήσουμε αυτό να είναι η μονάδα μέτρησης του χρόνου στην
προσομοίωση, τότε ένα τέτοιο sweep θα είναι ίσο με
![]() | (14.30) |
Για μεγάλες θερμοκρασίες χρειαζόμαστε περίπου
Wolff
clusters για να έχουμε ένα sweep του πλέγματος. Ανάλογα θα ορίσουμε και
τους χρόνους αυτοσυσχετισμού. Για μια φυσική ποσότητα
ο χρόνος
αυτοσυσχετισμού σε μονάδες κατασκευής Wolff cluster θα συμβολίζεται με
,
ενώ ο χρόνος αυτοσυσχετισμού
που θα χρησιμοποιήσουμε για τον
έλεγχο της απόδοσης του αλγόριθμου θα είναι σε μονάδες sweeps και θα
ισχύει
![]() | (14.31) |
Αρχικά πραγματοποιούμε προσομοιώσεις για και
στη θερμοκρασία
. Κατασκευάζουμε
clusters. Τα
αποτελέσματα αποθηκεύονται σε αρχεία με όνομα outL${L}b0.4407. Στη συνέχεια,
πραγματοποιούμε προσομοιώσεις με τον αλγόριθμο Metropolis και πραγματοποιούμε
sweeps. Τα αποτελέσματα αποθηκεύονται σε αρχεία με το όνομα
outL${L}b0.4407met. Το παρακάτω σενάριο φλοιού κάνει τα πράγματα πιο ...
ξεκούραστα.
Μεταγλωττίζουμε το αρχείο autoc.f90 από τον κατάλογο Tools και αντιγράφουμε
το εκτελέσιμο αρχείο autoc στον κατάλογο που δουλεύουμε και με το παρακάτω
σενάριο φλοιού μετράμε τις συναρτήσεις αυτοσυσχετισμού της μαγνήτισης
Ο μέγιστος χρόνος στη μέτρηση της είναι φυσικά πολύ μεγαλύτερος
για τον αλγόριθμο Metropolis (μεταβλητή $tmax). Επίσης, πετάμε τις
πρώτες
μετρήσεις. Τα αποτελέσματα τα βρίσκουμε σε αρχεία των
οποίων οι καταλήξεις είναι .rhom. Στη συνέχεια, προσαρμόζουμε την
στη συνάρτηση (13.56) με τρεις χρόνους αυτοσυσχετισμού όπως
περιγράφεται στο Παράρτημα 13.7. Τα αποτελέσματά μας δίνονται στον πίνακα
14.118
![]() | ![]() | ![]() | ![]() | ![]() |
10 | 2.18(2) | 0.6124(2) | 1.33(1) | 16.1(1) |
20 | 3.48(5) | 0.5159(1) | 1.80(3) | 70.7(4) |
40 | 5.10(6) | 0.4342(2) | 2.21(3) | 330(6) |
60 | 6.12(6) | 0.3927(2) | 2.40(2) | 795(5) |
80 | 7.33(7) | 0.3653(3) | 2.68(3) | 1740(150) |
100 | 8.36(6) | 0.3457(1) | 2.89(2) | 2660(170) |
Από τη σχέση (14.10) αναμένεται να έχουμε όπου
ο
δυναμικός κρίσιμος εκθέτης. Ο
υπολογίζεται εύκολα σε μία συνεδρία του
gnuplot
όπου υπολογίζουμε το για τον αλγόριθμο Wolff σε Wolff steps, Wolff sweeps
και για τον αλγόριθμο Metropolis σε Metropolis sweeps. Τα αποτελέσματα
είναι
![]() | (14.32) |
![]() | (14.33) |
![]() | (14.34) |
Οι αντίστοιχες γραφικές παραστάσεις δίνονται στα σχήματα 14.11-14.13. Οι τιμές
που αναμένονται από τη βιβλιογραφία είναι ,
και
[4, 59, 66]. Καλύτερα αποτελέσματα μπορούμε να πάρουμε αυξάνοντας τη
στατιστική και το μέγεθος του πλέγματος, κάτι που το αφήνουμε ως άσκηση στον
αναγνώστη.
Αξίζει τον κόπο να σημειώσουμε τη σχέση μεταξύ των δυναμικών εκθετών των
εξισώσεων (14.32) και (14.33) . Από την εξίσωση (14.29) και από
την εξίσωση (13.10)
, (13.6)
και στην ψευδοκρίσιμη περιοχή
παίρνουμε
![]() | (14.35) |
όπου υποθέσαμε ,
και
. Οπότε παίρνουμε
![]() | (14.36) |
Χρησιμοποιώντας τις τιμές (13.12) ,
παίρνουμε
![]() | (14.37) |
που ισχύει για τις τιμές που υπολογίσαμε, μέσα στα όρια του σφάλματος, καθώς και για τις τιμές της βιβλιογραφίας.
![]() | ![]() | ![]() |
40 | 1.7598(44) | 1.730(17) |
60 | 1.7455(24) | 1.691(14) |
80 | 1.7409(21) | 1.737(12) |
100 | 1.7420(24) | 1.7226(75) |
120 | 1.7390(15) | 1.7725(69) |
140 | 1.7390(23) | 1.7354(72) |
160 | 1.7387(10) | 1.746(17) |
200 | 1.7380(11) | 1.759(15) |
500 | 1.7335(8) | 1.7485(83) |
![]() | ![]() | ![]() |
40 | 0.1101(7) | 0.1122(29) |
60 | 0.1129(5) | 0.1102(19) |
80 | 0.1147(5) | 0.1118(21) |
100 | 0.1175(3) | 0.1170(11) |
120 | 0.1167(4) | 0.1172(16) |
140 | 0.1190(2) | 0.1187(19) |
160 | 0.1191(4) | 0.1134(20) |
200 | 0.1205(10) | 0.1138(24) |
500 | 0.1221(2) | 0.1294(50) |
![]() | ![]() | ![]() |
40–100 | 1.754(1) | 0.1253(1) |
140–1000 | 1.740(2) | 0.1239(3) |
40–1000 | 1.749(1) | 0.1246(1) |
Στην παράγραφο αυτή θα ελέγξουμε τον βαθμό με τον οποίο οι σχέσεις (14.3) – (14.5)
μπορούν να χρησιμοποιηθούν για τον υπολογισμό των κρίσιμων εκθετών ,
και
. Το συμπέρασμα που θα βγάλουμε είναι πως οι σχέσεις αυτές δεν είναι η καλύτερη
επιλογή για τον εν λόγω υπολογισμό και ότι θα πρέπει να αποφεύγονται, αν είναι
δυνατόν19 .
Για να δούμε καθαρή βάθμιση, θα πρέπει να προσομοιώσουμε για πολύ
μικρά
και για αρκετά μεγάλο
λόγω των μεγάλων φαινομένων
επίδρασης πεπερασμένου μεγέθους (finite size effects). Επίσης, υπάρχουν
παραδείγματα που οι τιμές που παίρνει κανείς εξαρτώνται ισχυρά από το
διάστημα προσαρμογής των δεδομένων με αποτέλεσμα να έχουμε μεγάλα
συστηματικά σφάλματα από τη διαδικασία προσαρμογής (fitting) ή ακόμα και λάθος
αποτελέσματα20 .
Για τον λόγο αυτό προσομοιώσαμε το πρότυπο Ising για ,
,
,
,
,
,
,
και
. Διαλέξαμε θερμοκρασίες που αντιστοιχούν
σε αρκετά μικρά
γύρω από την κρίσιμη θερμοκρασία. Στο συνοδευτικό
λογισμικό θα βρείτε τα shell scripts που χρησιμοποιήθηκαν για τον λόγο
αυτό.
Αρχικά υπολογίζουμε τον εκθέτη από τη σχέση (14.3) . Προσαρμόζουμε
στην κατάλληλη περιοχή του
την τιμή της
για κάθε τιμή του
στη συνάρτηση
που έχει δύο ανεξάρτητες παραμέτρους
. Η επιλογή του διαστήματος γίνεται με τον εντοπισμό γραμμικής
συμπεριφοράς της
σε διάγραμμα με λογαριθμική κλίμακα και στους δύο
άξονες21 .
Παρατηρούμε ότι για μεγάλο
έχουμε απόκλιση από τη γραμμική συμπεριφορά,
ενώ για πολύ μικρό
παρουσιάζονται σφάλματα από τα φαινόμενα επίδρασης
πεπερασμένου μεγέθους, όταν
. Καθώς το
μεγαλώνει, τα φαινόμενα
επίδρασης πεπερασμένου μεγέθους μειώνονται και τα δεδομένα πλησιάζουν
κοντύτερα προς την ασυμπτωτική συμπεριφορά
για ολοένα και μικρότερο
. Τα αποτελέσματα είναι καθαρότερα για
, γιατί για
οι διακυμάνσεις είναι ισχυρότερες κοντά στην ψευδοκρίσιμη θερμοκρασία
και έχουμε μεγαλύτερα φαινόμενα επίδρασης πεπερασμένου
μεγέθους.
Στον πίνακα 14.2 σημειώνουμε τα αποτελέσματα για τον εκθέτη για όλες τις
τιμές του
που μετρήσαμε. Τα σφάλματα που σημειώνονται στον πίνακα είναι τα
απλά στατιστικά σφάλματα της προσαρμογής που έδωσε το αναφερόμενο αποτέλεσμα
και είναι πολύ μικρότερο από το συστηματικό σφάλμα της προσαρμογής. Το
τελευταίο προέρχεται κυρίως από την εκτίμηση του διαστήματος θερμοκρασιών
που θα συμπεριλάβουμε στην προσαρμογή. Μία συστηματική αντιμετώπιση της
εκτίμησης των σφαλμάτων αυτών είναι να αλλάζουμε το διάστημα αυτό και να
συμπεριλάβουμε στις δυνατές τιμές αυτές που προκύπτουν από όλες τις
αποδεκτές προσαρμογές στη συνάρτηση που επιλέξαμε. Καμιά φορά αυτό
δίνει υπερεκτιμημένο σφάλμα και έγκειται στην “τέχνη” και εμπειρία μας να
αποφασίσουμε τις τιμές που θα κρατήσουμε. Για παράδειγμα, από τα σχήματα
14.14 και 14.15 παρατηρούμε ότι το διάστημα της προσαρμογής γίνεται πιο
ευδιάκριτο μελετώντας την
για ολοένα και μεγαλύτερα
. Καθώς το
μεγαλώνει, τα σημεία πλησιάζουν προς την ασυμπτωτική καμπύλη ολοένα και
περισσότερο. Επίσης, οι λογικές τιμές για τις παραμέτρους που υπεισέρχονται στην
προσαρμογή μπορούν να αποτελέσουν και αυτές ένα κριτήριο αποδοχής ή όχι
του αποτελέσματος μιας προσαρμογής (λ.χ. να έχει η σταθερά
τιμές
). Λαμβάνοντας υπόψη τα παραπάνω, μπορούμε να αναφέρουμε τα
αποτελέσματα
![]() | (14.38) |
![]() | (14.39) |
Στη συνέχεια, υπολογίζουμε τον κρίσιμο εκθέτη από την εξίσωση (14.5) . Η
σχέση αυτή ισχύει, καθώς προσεγγίζουμε το κρίσιμο σημείο από την ψυχρή περιοχή
ή
. Στο θερμοδυναμικό όριο η μαγνήτιση είναι παντού μηδέν για κάθε
. Παρόλα αυτά, στο πεπερασμένο πλέγμα
και είναι λογικό να
περιμένουμε μία σχέση βάθμισης της μορφής
![]() | (14.40) |
όπου ο ορισμός του γίνεται έτσι, γιατί όπως θα δούμε
![]() | (14.41) |
Ακολουθούμε τη διαδικασία προσαρμογής των δεδομένων που περιγράψαμε
παραπάνω. Τα αποτελέσματα για τους εκθέτες και
καταγράφονται στον
πίνακα 14.3. Λαμβάνοντας υπόψη τα συστηματικά σφάλματα που περιγράψαμε
παραπάνω βρίσκουμε ότι
![]() | (14.42) |
![]() | (14.43) |
που πρέπει να συγκριθεί με την αναμενόμενη τιμή .
Η περίπτωση του εκθέτη χρειάζεται ιδιαίτερη προσοχή. Η τιμή
που αναμένεται είναι
. Αυτό δε σημαίνει ότι
σταθ αλλά
ότι22
![]() | (14.44) |
Στην περίπτωση αυτή βρίσκουμε ότι τα δεδομένα προσαρμόζονται καλύτερα στην
παραπάνω σχέση παρά σε μια σχέση δύναμης, όπως στην περίπτωση της
μαγνήτισης και της μαγνητικής επιδεκτικότητας. Αυτό μπορεί να φανεί εποπτικά
κάνοντας τη γραφική παράσταση σε λογαριθμική κλίμακα μόνο κατά τον άξονα
και να συγκρίνουμε με την ανάλογη γραφική παράσταση όπου και οι
δύο άξονες είναι σε λογαριθμική κλίμακα. Βρίσκουμε ότι τα δεδομένα μας
ακολουθούν μια ευθεία στην πρώτη περίπτωση ενώ στη δεύτερη όχι. Μια
προσεκτική μελέτη θα συγκρίνει την ποιότητα των προσαρμογών στις δύο
συναρτήσεις και θα επιλέξει το καλύτερο μοντέλο. Το αφήνουμε ως άσκηση στον
αναγνώστη.
Στην παράγραφο αυτή θα υπολογίσουμε τους κρίσιμους εκθέτες με τη βοήθεια των
σχέσεων (14.7) - (14.9) , δηλ. με τη βάθμιση που παρουσιάζουν ασυμπτωτικά οι
,
και
, καθώς το μέγεθος του
συστήματος αυξάνει. Η διεθνής ορολογία για τη μέθοδο αυτή του υπολογισμού είναι
“finite size scaling”.
Η σχέση (14.7) δίνει τον εκθέτη . Για τον υπολογισμό του, χρησιμοποιούμε
τις τιμές της μαγνητικής επιδεκτικότητας στη γνωστή θερμοκρασία
για
διαφορετικές τιμές του
. Με προσαρμογή των τιμών
στη συνάρτηση
υπολογίζουμε τις σταθερές
και
και συγκρίνουμε την τελευταία με την
αναμενόμενη τιμή
. Στη διαδικασία των προσαρμογών πρέπει να
αποφασίσουμε ποιες τιμές του
θα χρησιμοποιήσουμε. Φυσικά, το πρώτο κριτήριο
είναι οι προσαρμογές να δίνουν αποδεκτό
και το σφάλμα στις σταθερές
και
να είναι μικρό, αλλά παρατηρούμε ότι και ο περιορισμός αυτός δεν είναι
αρκετός: Στον πίνακα 14.4 βλέπουμε μικρές μεταβολές στις τιμές του εκθέτη
που παίρνουμε για διαφορετικά διαστήματα προσαρμογής. Οι μεταβολές αυτές μας
δίνουν ένα μέτρο του συστηματικού σφάλματος στον προσδιορισμό τους. Στο
πρόβλημα 9 σας ζητείται να δοκιμάσετε τον υπολογισμό μόνοι σας. Στον πίνακα
14.4 δίνονται τα αποτελέσματα και στο σχήμα 14.20 η αντίστοιχη γραφική
παράσταση. Το τελικό αποτέλεσμα, λαμβάνοντας υπόψη το συστηματικό σφάλμα,
είναι:
![]() | (14.45) |
Η σχέση (14.9) δίνει τον εκθέτη . Για τον υπολογισμό του, ακολουθούμε
ανάλογη διαδικασία για τις τιμές της μαγνήτισης
στην κρίσιμη
θερμοκρασία. Το αποτέλεσμα είναι
![]() | (14.46) |
Η σχέση (14.9) δίνει τον εκθέτη . Αλλά η αναμενόμενη τιμή
οδηγεί, σε αναλογία με τη σχέση (14.44) , στη σχέση
![]() | (14.47) |
Η σχέση αυτή δείχνεται στο σχήμα 14.22. Ο κάθετος άξονας δεν είναι σε
λογαριθμική κλίμακα, ενώ ο οριζόντιος είναι. Η γραμμική σχέση των δεδομένων στο
σχήμα δείχνει ότι είναι συμβατά με την εξίσωση (14.47) . Στο πρόβλημα 9 θα πρέπει
να δείξετε αν η προσαρμογή των δεδομένων στο λογάριθμο είναι καλύτερη από την
προσαρμογή σε μια συνάρτηση δύναμης της μορφής και να μελετήσετε τις
δυσκολίες που προκύπτουν στη μελέτη αυτή. Βελτιώνοντας τα δεδομένα του
πίνακα 14.8 με μεγαλύτερη στατιστική (ελάττωση στατιστικού σφάλματος) και
μετρήσεις σε μεγαλύτερα
, τα αποτελέσματα μπορούν να γίνουν ακόμα
καθαρότερα.
Παρατηρούμε ότι με τη μέθοδο βάθμισης πεπερασμένου μεγέθους (finite size scaling) οι τιμές που προκύπτουν για τους κρίσιμους εκθέτες προκύπτουν ευκολότερα από τη μελέτη της βάθμισης ως προς τη θερμοκρασία που μελετήσαμε στην παράγραφο 14.8. Οι τιμές που μετράμε ακολουθούν την ασυμπτωτική σχέση βάθμισης που δίνουν οι σχέσεις (14.7) – (14.9) με πολύ μικρότερη επίδραση των φαινομένων επίδρασης πεπερασμένου μεγέθους23 . Μπορούμε με τη μελέτη πολύ μικρότερου συστήματος να πάρουμε τιμές που έχουν μεγαλύτερη ακρίβεια και προκύπτουν καθαρότερα από αυτές που δώσαμε στις εξισώσεις (14.38) , (14.39) , (14.42) , (14.43) .
![]() | ![]() | ![]() | ![]() | ![]() |
40 | 0.4308(4) | 30.68(4) | 0.437(1) | 0.5000(20) |
60 | 0.4342(2) | 62.5(1) | 0.4382(7) | 0.5515(15) |
80 | 0.4357(2) | 103.5(1) | 0.4388(5) | 0.5865(12) |
100 | 0.4368(1) | 153.3(2) | 0.4396(2) | 0.6154(18) |
120 | 0.4375(1) | 210.9(2) | 0.4396(4) | 0.6373(20) |
140 | 0.43793(13) | 276.2(4) | 0.4397(5) | 0.6554(18) |
160 | 0.4382(1) | 349.0(5) | 0.4398(4) | 0.6718(25) |
200 | 0.43870(7) | 516.3(7) | 0.4399(2) | 0.6974(17) |
500 | 0.43988(4) | 2558(5) | 0.44038(8) | 0.7953(25) |
1000 | 0.44028(4) | 8544(10) | 0.44054(8) | 0.8542(36) |
Στην παράγραφο 14.3 συζητήσαμε τη βάθμιση των φυσικών ποσοτήτων ως
συνάρτηση της ανηγμένης θερμοκρασίας και του μεγέθους του συστήματος
.
Τη συζήτηση βοήθησε σημαντικά η γνώση της ακριβούς κρίσιμης θερμοκρασίας
η οποία είναι γνωστή από τους αναλυτικούς υπολογισμούς και
ειδικότερα από τη λύση του Onsager [55]. Δυστυχώς, στις περισσότερες
ενδιαφέρουσες περιπτώσεις η κρίσιμη παράμετρος δεν είναι γνωστή. Στην περίπτωση
αυτή η ανάλυση γίνεται δυσκολότερη, αφενός μεν γιατί η κρίσιμη θερμοκρασία πρέπει
να υπολογιστεί και αφετέρου, διότι η πεπερασμένη ακρίβεια υπολογισμού της (άρα και
στον υπολογισμό της
) εισάγει σημαντικά συστηματικά σφάλματα στον
υπολογισμό των κρίσιμων εκθετών. Επίσης, η μη εκ των προτέρων γνώση της
κάνει την επιλογή των τιμών που θα επιλέξουμε στις σχέσεις βάθμισης (14.7)
– (14.9) να πρέπει να προσδιοριστεί ακριβώς, ώστε να έχουμε γρήγορη
σύγκλιση στην ασυμπτωτική συμπεριφορά και ελαχιστοποίηση των συστηματικών
σφαλμάτων. Εδώ η κατανόηση της αιτίας της βάθμισης των φυσικών ποσοτήτων
μπορεί να βοηθήσει. Ο λόγος που οδηγεί την ψευδοκρίσιμη συμπεριφορά
ενός πεπερασμένου συστήματος που παρουσιάζει συνεχή μετάβαση φάσης
στο θερμοδυναμικό όριο είναι η αύξηση του μήκους συσχετισμού
σε
μέγεθος που συγκρίνεται με το μέγεθος του συστήματος
. Περαιτέρω
αύξηση του
“πνίγεται” από το πεπερασμένο μέγεθος του πλέγματος και
παρουσιάζονται τα φαινόμενα επίδρασης πεπερασμένου μεγέθους (finite size effects).
Αυτά τα μεγάλα finite size effects προσδιορίζουν την ψευδοκρίσιμη περιοχή.
Στην περιοχή αυτή, ποσότητες που απειρίζονται στο θερμοδυναμικό όριο (ή
παρουσιάζουν μη αναλυτική συμπεριφορά, λ.χ. απότομη αλλαγή της τιμής
της παραγώγου), έχουν πεπερασμένη, μέγιστη τιμή (ή πλησιάζουν προς
τη μη αναλυτική συμπεριφορά). Αυτή, καθώς το μέγεθος του συστήματος
μεγαλώνει, εκτείνεται σε μια όλο και πιο στενή περιοχή γύρω από την κρίσιμη
θερμοκρασία. Οποιαδήποτε τιμή και αν πάρουμε στην περιοχή αυτή με συστηματικό
τρόπο24
για αρκετά μεγάλο
θα πάρουμε τις ασυμπτωτικές συμπεριφορές που δίνονται από
τις σχέσεις (14.7) - (14.9) . Μία επιλογή που δίνει καλά αποτελέσματα είναι να
υπολογίσουμε τις ποσότητες στην ψευδοκρίσιμη θερμοκρασία
. Αυτή ορίζεται
από την τιμή που παρουσιάζεται το μέγιστο των διακυμάνσεων της παραμέτρου τάξης
που εδώ είναι η μαγνήτιση
![]() | (14.48) |
Στην περίπτωση αυτή, στο αριστερό μέλος των εξισώσεων (14.7) – (14.9) είναι οι
τιμές κάθε φυσικής ποσότητας για .
Ο ορισμός της μπορεί να μην είναι μοναδικός. Θα μπορούσε λ.χ. κανείς
να χρησιμοποιήσει το μέγιστο της ειδικής θερμότητας
![]() | (14.49) |
που ορίζει μια διαφορετική . Προφανώς
οπότε και οι δύο επιλογές θα δώσουν τα ίδια αποτελέσματα για αρκετά
μεγάλα
. Δεν συμβαίνει όμως το ίδιο γρήγορα και για τις δύο επιλογές, οπότε
είναι συνήθως ευνοϊκή μία από αυτές (εδώ η
).
Το πρώτο βήμα είναι ο υπολογισμός του . ΄Οταν είμαστε στην ψευδοκρίσιμη
περιοχή, έχουμε
, οπότε η βασική σχέση (14.2) δίνει
![]() | (14.50) |
Η διαδικασία είναι απλή, ως προς την αρχή της: Μετράμε αρχικά τη μαγνητική
επιδεκτικότητα. Για κάθε προσδιορίζουμε την ψευδοκρίσιμη περιοχή και
υπολογίζουμε τη θέση
και την τιμή του μέγιστου
. Για να γίνει αυτό
μπορεί να χρειαστεί να πάρουμε αρκετές μετρήσεις γύρω από τη
.
Ιδιαίτερη προσοχή δίνουμε στο να έχουμε αρκετές ανεξάρτητες μετρήσεις
μετρώντας τον χρόνο αυτοσυσχετισμού (αυτός αυξάνει με το μέγεθος
σαν
) και φυσικά να έχουμε φτάσει στην κατάσταση θερμικής ισορροπίας.
Χρησιμοποιούμε τη σχέση (14.50) και προσαρμόζουμε τα δεδομένα μας σε
μια συνάρτηση της μορφής
και από τις τιμές που προκύπτουν
για τις σταθερές
και
υπολογίζουμε τις
,
. Σε
περίπτωση που γνωρίζουμε μια από τις σταθερές
,
κρατάμε στην
προσαρμογή τις αντίστοιχες παραμέτρους
,
σταθερές και υπολογίζουμε την
άλλη.
Τα αποτελέσματα παρουσιάζονται στο σχήμα 14.23 όπου γίνεται η γραφική παράσταση των δεδομένων του πίνακα 14.5. Το αποτέλεσμα είναι:
Αυτό μπορεί να συγκριθεί με τις γνωστές τιμές Η διαδικασία επαναλαμβάνεται για τις ψευδοκρίσιμες θερμοκρασίες όπου
προκύπτουν από τα μέγιστα της ειδικής θερμότητας
.Τα αποτελέσματα
παρουσιάζονται στο σχήμα 14.24. Το αποτέλεσμα είναι:
Από τα μέγιστα της μαγνητικής επιδεκτικότητας υπολογίζουμε τον
εκθέτη
. Οι τιμές τους δίνονται στον πίνακα 14.5. Σύμφωνα με την
ασυμπτωτική σχέση (14.9) προσαρμόζουμε τα δεδομένα σε μια συνάρτηση της
μορφής
, με
και
προσδιοριστέες παραμέτρους. Βρίσκουμε πολύ καλή
βάθμιση, άρα τα δεδομένα μας είναι μέσα στην ασυμπτωτική περιοχή. Το αποτέλεσμα
είναι
![]() | (14.51) |
που είναι σε άριστη συμφωνία με την αναμενόμενη τιμή .
Από τα μέγιστα της ειδικής θερμότητας υπολογίζουμε τον εκθέτη . Λόγω του
ότι
, η μορφή της ασυμπτωτικής σχέσης αναμένεται να δίνεται από την (14.47) .
Βρίσκουμε ότι τα δεδομένα μας δεν προσαρμόζονται καλά σε μια απλή συνάρτηση της
μορφής
και είναι πιθανό να παίρνουμε συνεισφορές από όρους που
μηδενίζονται στο θερμοδυναμικό όριο, αλλά που δίνουν πεπερασμένη και μη αμελητέα
συνεισφορά για πεπερασμένο
. Πράγματι, προσαρμόζοντας τα δεδομένα σε μια
συνάρτηση της μορφής
, παίρνουμε πολύ καλή προσαρμογή των
δεδομένων.25
Η απόπειρα προσαρμογής σε συνάρτηση δύναμης της μορφής
δεν είναι
επιτυχής26
και δίνει έτσι και αλλιώς εκθέτη συμβατό με τιμή μηδέν. Τα αποτελέσματα
παρουσιάζονται στο σχήμα 14.26.
Οι σχέσεις βάθμισης (14.3) – (14.9) προέρχονται από τη δυναμική εμφάνιση μιας
μοναδικής κλίμακας μήκους που απειρίζεται στην κρίσιμη περιοχή, του μήκους συσχετισμού
.27
Η εμφάνιση αυτής της κλίμακας που απειρίζεται, καθώς πλησιάζουμε το κρίσιμο
σημείο σαν
, οδηγεί στην παγκοσμιότητα της κρίσιμης συμπεριφοράς όλων
των συστημάτων που ανήκουν στην ίδια κλάση παγκοσμιότητας. Αν πάρουμε για
παράδειγμα τη μαγνητική επιδεκτικότητα
, οι τιμές της εξαρτώνται
ξεχωριστά από τη θερμοκρασία
, το μέγεθος του συστήματος
και φυσικά από
τις λεπτομέρειες του συστήματος. Η εμφάνιση παγκόσμιας συμπεριφοράς για
ολόκληρη την κλάση ισοδυναμίας που ανήκει το μοντέλο που μελετάμε μας οδηγεί
στην υπόθεση ότι η μαγνητική επιδεκτικότητα στην περιοχή αυτή εξαρτάται μόνο από
το μήκος συσχετισμού
. Καθώς στο πεπερασμένο σύστημα πλησιάζουμε την
κρίσιμη θερμοκρασία, τα φαινόμενα κυριαρχούνται από την “κατάπνιξη” των
διακυμάνσεων που προκύπτουν όταν
. ΄Αρα, οι κλίμακες μήκους που
καθορίζουν την κύρια συμπεριφορά των συναρτήσεων που περιγράφουν τη βάθμιση
είναι οι
και
, άρα η αδιάστατη μεταβλητή
είναι η μοναδική
μεταβλητή που υπεισέρχεται στις συναρτήσεις βάθμισης. Για να πάρουμε την
σχέση βάθμισης
αρκεί να υποθέσουμε ότι κοντά στην κρίσιμη
περιοχή28
![]() | (14.52) |
όπου είναι μια συνάρτηση μιας μεταβλητής με τις ιδιότητες
![]() | (14.53) |
και
![]() | (14.54) |
Πράγματι όταν (
), η μαγνητική επιδεκτικότητα παίρνει τιμές
πολύ κοντά στις τιμές του άπειρου συστήματος (θερμοδυναμικό όριο) και
από την (14.53) παίρνουμε
. Καθώς
, εμφανίζονται τα
φαινόμενα επίδρασης πεπερασμένου μεγέθους και από την (14.54) παίρνουμε
. Η τελευταία δεν είναι άλλη από τη σχέση (14.7) για τα
μέγιστα της μαγνητικής επιδεκτικότητας στο πεπερασμένο σύστημα που μελετήσαμε
στο σχήμα 14.25. ΄Αρα, η συνάρτηση
περιγράφει τον τρόπο που
“αποκόπτεται” η μαγνητική επιδεκτικότητα από τα φαινόμενα επίδρασης
πεπερασμένου μεγέθους.
Η συνάρτηση μπορεί να υπολογιστεί από τις μετρήσεις που κάνουμε
στην προσομοίωση Μόντε Κάρλο. Επειδή το μήκος συσχετισμού δεν υπολογίζεται
άμεσα, αλλά υπεισέρχεται έμμεσα στις μετρήσεις μας, είναι πιο βολικό να ορίσουμε
την αδιάστατη μεταβλητή βάθμισης να είναι η
![]() | (14.55) |
όπου αφού29
. Ορίζοντας τότε
, έτσι ώστε η σχέση (14.52) να
γίνει
![]() | (14.56) |
Οι ασυμπτωτικές ιδιότητες της συνάρτησης βάθμισης προκύπτουν από τις
σχέσεις (14.53) και (14.54) . Για
για την
ισχύει η (14.53) και παίρνουμε
. Από τον ορισμό
παίρνουμε
και επιβεβαιώνουμε
την ιδιότητα βάθμισης της μαγνητικής επιδεκτικότητας στο θερμοδυναμικό όριο
. ΄Αρα,
![]() | (14.57) |
΄Οταν , ισχύει η (14.54) και
. Τότε
έχουμε
. Επιβεβαιώνουμε ότι όταν
επικρατούν τα φαινόμενα επίδρασης πεπερασμένου μεγέθους (
), παίρνουμε
όπως και παραπάνω. ΄Αρα,
![]() | (14.58) |
Αντιστρέφοντας τη σχέση (14.56) μπορούμε να δούμε πώς είναι δυνατόν να υπολογιστεί η συνάρτηση βάθμισης από τις μετρήσεις της μαγνητικής επιδεκτικότητας
![]() | (14.59) |
όπου η μετριέται σε θερμοκρασίες κοντά στην κρίσιμη περιοχή για
διαφορετικές τιμές του
. ΄Οταν η σχέση (14.59) ισχύει, τότε όλες οι μετρήσεις
μας θα πέφτουν πάνω στην ίδια καμπύλη που δίνει τη συνάρτηση
ανεξάρτητα από το μέγεθος του συστήματος
! Φυσικά, μικρές αποκλίσεις
αναμένονται λόγω φαινομένων επίδρασης πεπερασμένου μεγέθους, ιδιαίτερα για
μικρά
. Αλλά όπως θα δούμε, η σύγκλιση γίνεται στην πράξη αρκετά
γρήγορα.
Το μεγάλο κέρδος από την προσέγγιση αυτή στις μετρήσεις μας είναι ότι
μπορούμε να χρησιμοποιήσουμε την παραπάνω σχέση για να προσδιορίσουμε την
κρίσιμη θερμοκρασία , τον εκθέτη
, καθώς και τον λόγο
ταυτόχρονα!
Παρατηρήστε ότι για να ισχύει η (14.59) πρέπει να προσδιορίσουμε την μεταβλητή
για την οποία είναι αναγκαίο να γνωρίζουμε την
(
)
και τον εκθέτη
. Για τον υπολογισμό της
χρειάζεται να γνωρίζουμε τον
εκθέτη
που παρουσιάζεται στο δεξί μέλος της (14.59) . Η σχέση (14.59)
βρίσκεται να είναι πολύ ευαίσθητα εξαρτημένη από τις παραμέτρους
,
και
και έτσι έχουμε μια εξαίρετη και ακριβή μέθοδο για τον υπολογισμό
τους.
Ο υπολογισμός γίνεται εύκολα. Θέτουμε δοκιμαστικές τιμές για τις παραμέτρους
. Από τα δεδομένα μας χρησιμοποιούμε τις τιμές
,
,
και
για να υπολογίσουμε τη μεταβλητή βάθμισης
. Αυτή
την αντιστοιχούμε στην τιμή της μαγνητικής επιδεκτικότητας
από την
οποία, μαζί με την τιμή του
, υπολογίζουμε την
. Κάνουμε
τη γραφική παράσταση των σημείων
και επικεντρωνόμαστε στο
διάστημα κοντά στην κρίσιμη περιοχή (
). Αλλάζουμε τις τιμές των παραμέτρων
μέχρι να πετύχουμε βέλτιστη σύμπτωση των καμπύλων που
προκύπτουν για τα διαφορετικά
που μελετάμε. Μόλις το πετύχουμε, οι τιμές
των
που αντιστοιχούν στη βέλτιστη σύμπτωση είναι και οι
ζητούμενες.
Η “κατάρρευση” (collapse) των καμπύλων που προκύπτουν από τα σημεία
για διαφορετικά
είναι η αποδοτικότερη
μέθοδος εκμετάλλευσης των ιδιοτήτων βάθμισης στην κρίσιμη περιοχή. Στο σχήμα
14.27 δείχνουμε τη συνάρτηση
για τις γνωστές τιμές των παραμέτρων
. Μικρές μεταβολές από τις τιμές αυτές
κάνουν εμφανή την διαφορά αυτή. Μεταβάλλοντας μια από τις παραμέτρους και
παρατηρώντας την αποστασιοποίηση των καμπύλων μεταξύ διαφορετικών
,
μπορούμε να πάρουμε μια πρόχειρη εκτίμηση της ελάχιστης ακρίβειας της μεθόδου
Ανάλογη διαδικασία μπορεί να ακολουθηθεί και για άλλες υπολογιζόμενες ποσότητες που παρουσιάζουν βάθμιση, όπως είναι η ειδική θερμότητα και η μαγνήτιση. Οι σχέσεις (14.8) και (14.9) γενικεύονται σύμφωνα με τα παραπάνω για τη μαγνήτιση30
![]() | (14.60) |
και για την ειδική θερμότητα σε
![]() | (14.61) |
αφού . Τα αποτελέσματα παρουσιάζονται στα σχήματα 14.28 και 14.29
αντίστοιχα.
Για διευκόλυνση του αναγνώστη παραθέτουμε ένα πρόγραμμα gnuplot για την εύκολη κατασκευή σχημάτων, όπως αυτά που παρουσιάζονται στα σχήματα 14.27–14.29. Αν υποθέσουμε ότι τα δεδομένα μας είναι σε ένα αρχείο all τοποθετημένα ως εξής31 :
όπου γραμμές που αρχίζουν με m έχουν τις μετρήσεις , ενώ
αυτές που αρχίζουν από e τις μετρήσεις
. Οι εντολές που
πρέπει να προγραμματίσουμε γράφονται σε ένα αρχείο scale_gamma.gpl:
Για τη χρήση του προγράμματος, ξεκινάμε το gnuplot και δίνουμε τις εντολές
Οι δύο πρώτες εντολές καθορίζουν τις παραμέτρους του διαγράμματος. Η μεταβλητή
Ls περιέχει τα μεγέθη του πλέγματος, την ... κατάρρευση των οποίων θέλουμε να
μελετήσουμε, κάθε χωρισμένο από το άλλο από ένα ή περισσότερα κενά.
Η μεταβλητές bc, nu, gnu είναι οι παράμετροι
,
,
που θα
χρησιμοποιηθούν στη βάθμιση (14.59) . Η τρίτη εντολή καλεί το πρόγραμμά μας και
φτιάχνει το διάγραμμα. Αν δεν έχουμε διαλέξει τις επιθυμητές παραμέτρους, τις
επαναορίζουμε και... επαναλαμβάνουμε.
Για να καταλάβετε πώς λειτουργεί το πρόγραμμα, δείτε την τεκμηρίωση του
gnuplot32 .
Θα σταθούμε μόνο στην κατασκευή του φίλτρου που μας δίνει τα σημεία
του γραφήματος σωστά κανονικοποιημένα. Το gnuplot το βλέπει σαν μια
ακολουθία χαρακτήρων (string) cplot(i) που είναι διαφορετική για κάθε
(ο δείκτης i αντιστοιχεί στην i–λέξη στη μεταβλητή Ls). To string
αυτό τοποθετείται στην εντολή plot για κάθε i και έχει τη μορφή "< grep
... L
-gnu)*$7}’". Οι εκάστοτε τιμές περνούν στο string αυτό μέσω
της συνάρτησης sprintf() η οποία κάθε φορά καλείται με διαφορετικό i.
Την κύρια δουλειά την κάνει η awk που πολλαπλασιάζει την κάθε μέτρηση
(στήλες 6 και 7: $6, $7 είναι η
και το σφάλμα της
) με τον σωστό
παράγοντα. Η συνιστώσα του φίλτρου με το grep επιλέγει τις γραμμές από
το αρχείο all που έχουν τη μαγνητική επιδεκτικότητα για το δεδομένο
μέγεθος πλέγματος
. Η συνιστώσα του φίλτρου με την εντολή sort
ταξινομεί τα δεδομένα που παίρνει με σειρά αύξουσας θερμοκρασίας (στήλη 3:
-k3,3g).
Το καίριο ερώτημα είναι πώς θα συστηματοποιηθεί η παραπάνω μέθοδος; Πώς
κρίνουμε ότι μια κατάρρευση είναι καλή και πότε παύει να είναι; Πώς θα εκτιμήσουμε
τα σφάλματα στις παραμέτρους που προσπαθούμε να προσδιορίσουμε; Για το
τελευταίο ερώτημα προσπαθήσαμε να δώσουμε παραπάνω μια πρόχειρη μέθοδο για
την εκτίμηση των σφαλμάτων. Μια άλλη μέθοδος είναι να εφαρμόσουμε μια μέθοδο
τύπου binning ή bootstrap. Στην πρώτη περίπτωση χωρίζουμε τα δεδομένα μας σε
bins και εργαζόμαστε ανεξάρτητα σε κάθε ένα από αυτά. Κάθε bin θα μας δώσει
μια βέλτιστη ομάδα παραμέτρων
την οποία θα χρησιμοποιήσουμε σαν
μια ανεξάρτητη μέτρηση. Το σφάλμα τότε θα υπολογιστεί από τον γνωστό τύπο
(13.42) (για
).
Για να μελετήσουμε ποσοτικά την ποιότητα της κατάρρευσης ορίζουμε μία
ποσότητα που θυμίζει το που ορίζεται σε μια κοινή προσαρμογή δεδομένων
όπως παρουσιάστηκε στο Παράρτημα 13.7. Αυτή θα πρέπει να είναι μεγαλύτερη, όταν
αυξάνεται η απόσταση μεταξύ των καμπύλων που προκύπτουν από την κατάρρευση
των δεδομένων για κάθε
. ΄Εστω ότι οι μετρήσεις μας αποτελούνται από
σετ
μετρήσεων για
. Αφού επιλέξουμε ένα σετ παραμέτρων
και ένα διάστημα
υπολογίζουμε τα σετ των
δεδομένων
που προκύπτουν από τις μετρήσεις μας.
Αυτά αποτελούνται από τα
σημεία στο σετ δεδομένων με
των οποίων
τα
βρίσκονται μέσα στο διάστημα
. Για κάθε σημείο
υπολογίζουμε την
προκύπτουσα συνάρτηση βάθμισης
η οποία
εξαρτάται από τις επιλεχθείσες παραμέτρους
και το επιλεγμένο μέγεθος
.
Στη συνέχεια, επιλέγουμε έναν τρόπο παρεμβολής (interpolation) μεταξύ
των παραπάνω σημείων η οποία ορίζει συνεχείς συναρτήσεις παρεμβολής
,33
ώστε να έχουμε μια καλή εκτίμηση της συνάρτησης βάθμισης μεταξύ των
διακριτών σημείων που αποτελούν τα δεδομένα μας. Τότε κάθε σημείο
στο σετ δεδομένων
έχει δεδομένη απόσταση
από κάθε άλλο σετ δεδομένων
(
και
) ίση
με34
. Ορίζεται τότε η ποσότητα
Το εξαρτάται από τις παραμέτρους
και το διάστημα
. Γίνεται
καταρχήν μια ελαχιστοποίηση του ως προς τις παραμέτρους
κρατώντας το
σταθερό. Το ελάχιστο δίνεται από τις τιμές των παραμέτρων
που είναι και η
εκτίμηση των τιμών που θέλουμε να υπολογίσουμε. Για τον υπολογισμό των
σφαλμάτων
η πιο συστηματική διαδικασία είναι η μέθοδος binning όπως
αναφέραμε και παραπάνω στη σελίδα 1691. Εναλλακτικά, αν υποθέσουμε μια
κατανομή των μετρήσεων τύπου
και το αποτέλεσμα μας δίνει
, τότε τα
διαστήματα των παραμέτρων μέσα στα όρια του σφάλματος είναι αυτά για τα οποία
.
Τα αποτελέσματα εξαρτώνται από το διάστημα . Συνήθως [68] αυτό
επιλέγεται να έχει το κέντρο του στο μέγιστο της
, έτσι ώστε
. Αν το
είναι μεγαλύτερο από όσο πρέπει, τότε το
είναι μεγάλο, γιατί δεν έχουμε καλή βάθμιση. Αν είναι πολύ
μικρό, τότε τα σφάλματα
θα είναι μεγάλα. Παίρνοντας το όριο
,
μελετάμε τη σύγκλιση των τιμών
(βλ. σχήμα 8.7, σελ. 238 στο [4] καθώς
και το [68]) από όπου καταλήγουμε στις τελικές τιμές του υπολογισμού
μας.
Μέχρι τώρα μελετήσαμε τις διακυμάνσεις των φυσικών ποσοτήτων από τον υπολογισμό cumulant35 δεύτερης τάξης (μαγνητική επιδεκτικότητα και ειδική θερμότητα). Σημαντική πληροφορία για τους κρίσιμους εκθέτες και την κρίσιμη θερμοκρασία μπορεί να ληφθεί από τη μελέτη των cumulant ανωτέρας τάξης. Ο πιο γνωστός, ο Binder cumulant, είναι τέταρτης τάξης36 και παίρνει το όνομα του Kurt Binder που τον μελέτησε πρώτος [71, 72]
![]() | (14.63) |
Στο παράρτημα 14.13 παρουσιάζονται με λεπτομέρεια οι ιδιότητές του. Αυτές που μας αφορούν άμεσα είναι πως σε μια συνεχή μετάβαση φάσης
![]() | (14.64) |
όπου για το πρότυπο Ising στο τετραγωνικό πλέγμα [72]. Η τιμή
ταυτίζεται με αυτή της γκαουσιανής κατανομής, ενώ
αντιστοιχεί περίπου με την γκαουσιανή κατανομή μικρής διασποράς γύρω από
δύο συμμετρικές τιμές
(βλ. ασκήσεις 14 και 15 στο Παράρτημα
14.13).
Στην πράξη, βρίσκεται πως οι διορθώσεις στην τιμή από φαινόμενα
επίδρασης πεπερασμένου μεγέθους είναι πολύ μικρές, οπότε ο υπολογισμός του
δίνει με πολύ καλή ακρίβεια την κρίσιμη θερμοκρασία
. Το σημείο
τομής των
στο σημείο (
,
) για διαφορετικά
θα δίνει μια πολύ
καλή εκτίμηση της
.
![]() | ![]() | ![]() |
||
40 | 60 | 80 | 0.44069(4) | 0.6109(5) |
60 | 80 | 100 | 0.44069(4) | 0.6108(7) |
80 | 100 | 120 | 0.44068(4) | 0.6108(7) |
100 | 120 | 140 | 0.44069(4) | 0.6108(11) |
120 | 140 | 160 | 0.44069(4) | 0.6109(20) |
140 | 160 | 200 | 0.44067(3) | 0.6102(12) |
160 | 200 | 500 | 0.44067(2) | 0.6105(10) |
200 | 500 | 1000 | 0.44068(1) | 0.6106(9) |
Στο σχήμα 14.30 δείχνουμε τις μετρήσεις μας για το . Φαίνεται η
εντυπωσιακή τομή των καμπύλων στο κρίσιμο σημείο (
,
). Στον πίνακα 14.6
κάνουμε μια απόπειρα για συστηματικό υπολογισμό της
υπολογίζοντας την
κρίσιμη θερμοκρασία από την τομή των
για τρεις τιμές του
.
Λαμβάνοντας υπόψη όλες τις μετρήσεις για
–
, το αποτέλεσμα που
παίρνουμε είναι
![]() | (14.65) |
που είναι σε πολύ καλή συμφωνία με τις αναμενόμενες τιμές ,
. Παρατηρούμε ότι στον υπολογισμό του
, ενώ το
συστηματικό σφάλμα λόγω πεπερασμένου μεγέθους μειώνεται, καθώς αυξάνουμε το
, αυξάνεται το στατιστικό λόγω της αύξησης της κλίσης της καμπύλης
κοντά στο σημείο
. Ο προσδιορισμός όμως της
γίνεται με αυξανόμενη
ακρίβεια.
Οι σχέσεις βάθμισης πεπερασμένου μεγέθους μπορούν να χρησιμοποιηθούν και
για τον Binder cumulant προκειμένου να προσδιοριστεί και έτσι η κρίσιμη
θερμοκρασία και ο κρίσιμος εκθέτης . Από τις σχέσεις (14.90) (14.119) του
Παραρτήματος 14.13 περιμένουμε ότι η βάθμιση του
δίνεται από
![]() | (14.66) |
Αυτό επιβεβαιώνεται εντυπωσιακά στο σχήμα 14.31. Από την τιμή
παίρνουμε
σε συμφωνία με την (14.65) .
Ο απευθείας υπολογισμός των κρίσιμων εκθετών, ιδιαίτερα του , είναι
αρκετά δύσκολος σε ένα γενικό υπό μελέτη σύστημα. Οπότε είναι θεμιτό να πάρει
κανείς επιπλέον εκτιμήσεις από ποσότητες που είναι εύκολο να μετρηθούν και έχουν
γνωστές και καλές ιδιότητες βάθμισης. Παρακάτω παραθέτουμε μερικές από
αυτές37 .
Χαρακτηριστικό τους είναι ότι δίνονται από το συσχετισμό της τιμής της ενέργειας
με την τιμή (κάποιας δύναμης της) μαγνήτισης.
Η παράγωγος του Binder Cumulant είναι
![]() | (14.67) |
Η βάθμισή του δίνεται από τη σχέση (14.120)
![]() | (14.68) |
η οποία αναπαρίσταται στο σχήμα 14.32. Παρατηρούμε ότι η ορίζει και αυτή μια
ψευδοκρίσιμη περιοχή από το μέγιστο των αντίστοιχων διακυμάνσεων. Η βάθμιση και
θέση του μεγίστου θα μπορούσε να μας δώσει τον κρίσιμο εκθέτη
σύμφωνα με
την ανάλυση που κάναμε στα σχήματα 14.23 και 14.25 για τη μαγνητική
επιδεκτικότητα.
Επίσης, μπορεί να φανεί χρήσιμη η μελέτη συναρτήσεων συσχετισμού της μορφής
![]() | (14.69) |
των οποίων η βάθμιση δίνεται από την εξίσωση (14.126) του Παραρτήματος 14.13
![]() | (14.70) |
Ειδικότερα, μας ενδιαφέρει η περίπτωση
![]() | (14.71) |
και
![]() | (14.72) |
Τέλος, αναφέρουμε το Energy Cumulant
![]() | (14.73) |
Στην εργασία [75] δείχνεται ότι σε μια μετάβαση φάσης δεύτερης τάξης στο
κρίσιμο σημείο , ενώ σε μια μετάβαση φάσης πρώτης τάξης παίρνουμε μη
τετριμμένη τιμή. ΄Ετσι, αυτή η ποσότητα μπορεί να χρησιμοποιηθεί ως παράμετρος
διαφοροποίησης μιας μετάβασης φάσης 1ης τάξης. Αυτό επιβεβαιώνεται στο σχήμα
14.35. Τα ελάχιστα των καμπύλων
τείνουν προς την κρίσιμη θερμοκρασία
σύμφωνα με την σχέση (14.50) .
Στο κεφάλαιο 14.12 μελετήσαμε αριθμητικά τις ιδιότητες βάθμισης της ποσότητας
![]() | (14.74) |
γνωστής στη βιβλιογραφία ως Binder Cumulant. Εδώ χρησιμοποιώντας βασικές ιδιότητες βάθμισης ενός συστήματος κοντά στην κρίσιμη θερμοκρασία θα υπολογίσουμε τις ιδιότητες βάθμισης της ποσότητας αυτής και των παραγώγων της. Για περισσότερες λεπτομέρειες παραπέμπουμε τον αναγνώστη στα [72], [6]
Οι τιμές του είναι απλές και τετριμμένες σε δύο περιπτώσεις: ΄Οταν έχουμε
γκαουσιανή κατανομή της μαγνήτισης, κάτι το οποίο συμβαίνει όταν είμαστε στη
φάση αταξίας (ψηλή θερμοκρασία)
και όταν είμαστε στη φάση τάξης (χαμηλή
θερμοκρασία)
. Η απόδειξη είναι πολύ εύκολη και τη σκιαγραφούμε στις
ασκήσεις 14 και 15.
΄Οταν πλησιάζουμε την κρίσιμη θερμοκρασία μιας συνεχούς μετάβασης φάσης, το
σύστημα παρουσιάζει ιδιότητες βάθμισης λόγω του απειριζόμενου μήκους
συσχετισμού , όπως περιγράψαμε στο κεφάλαιο 14. Ας υποθέσουμε ότι
πλησιάζουμε από τις ψηλές θερμοκρασίες και η συνάρτηση κατανομής της
μαγνήτισης ανά πλεγματική θέση
(όχι τις απόλυτης τιμής) είναι προσεγγιστικά
της μορφής
![]() | (14.75) |
πού είναι μια γκαουσιανή με τυπική απόκλιση
και
προσωρινά έχουμε υποθέσει ότι το σύστημα είναι πάνω σε
–διάστατο υπερκυβικό
πλέγμα με ακμή υπερκύβου
.
΄Οταν πλησιάζουμε την κρίσιμη θερμοκρασία, η βάθμιση παρουσιάζεται στη
συνάρτηση κατανομής σύμφωνα με τη σχέση
![]() | (14.76) |
όπου ,
, είναι το μήκος συσχετισμού
στο θερμοδυναμικό όριο. Καθώς πλησιάζουμε την κρίσιμη θερμοκρασία
, έτσι ώστε
. Η εξίσωση (14.76) είναι μια υπόθεση
κλιμάκωσης (scaling hypothesis) η οποία παίζει θεμελιώδη ρόλο στη μελέτη των
κρίσιμων φαινομένων.
Για να υπολογίσουμε τους εκθέτες στην παραπάνω σχέση, εφαρμόζουμε καταρχήν τη συνθήκη κανονικοποίησης της πιθανότητας
όπου θέσαμε
![]() | (14.78) |
και .
,
και
είναι μία σταθερά
ανεξάρτητη από τα
και
. Τελικά παίρνουμε
![]() | (14.79) |
Οι ροπές της κατανομής των σπιν θα είναι τότε
![]() | (14.81) |
παίρνουμε
![]() | (14.82) |
Στις παραπάνω σχέσεις εισάγαμε τα “παγκόσμια” πλάτη (universal amplitudes)
και
τα οποία είναι παγκόσμιες σταθερές (ίδιες στην ίδια κλάση παγκοσμιότητας)
και ορίζονται από τη σχέση (14.81) . Στο όριο αυτό, για έχει συνεπή βάθμιση η
σχέση (14.80) για
στο δεξί και αριστερό μέλος, παίρνουμε (πρβλ. εξ.
(14.57) )
![]() | (14.83) |
Για να βρούμε τη βάθμιση ως προς αντικαθιστούμε τις παραπάνω σχέσεις στην
(14.80) για
και παίρνουμε
![]() | (14.84) |
από την οποία παίρνουμε
![]() | (14.85) |
όπου χρησιμοποιήσαμε τη γνωστή38 σχέση υπερβάθμισης (hyperscaling relation)
![]() | (14.86) |
Καταλήγουμε στις σχέσεις που ισχύουν στην περιοχή αταξίας
![]() | (14.87) |
![]() | (14.88) |
![]() | (14.89) |
Από τη σχέση (14.74) βρίσκουμε ότι η κρίσιμη συμπεριφορά του Binder cumulant είναι
![]() | (14.90) |
Στην ψευδοκρίσιμη περιοχή υπερτερούν τα φαινόμενα πεπερασμένου μεγέθους
τα οποία πνίγουν τις κρίσιμες διακυμάνσεις και θέτουν στις συναρτήσεις
πεπερασμένες τιμές. Η ψευδοκρίσιμη περιοχή στο θερμοδυναμικό
όριο δίνεται από το όριο
κρατώντας πεπερασμένο το λόγο
.
΄Αρα, αντιστοιχεί στις τιμές των συναρτήσεων
για μικρά
. Οπότε
παίρνουμε39
![]() | (14.91) |
΄Ετσι γίνεται τώρα απλή η κατανόηση του γεγονότος ότι το στην κρίσιμη
θερμοκρασία παίρνει τιμές σχεδόν ανεξάρτητες από το μέγεθος του συστήματος
.
Η τιμή
βρίσκεται να εξαρτάται από τις συνοριακές συνθήκες και από την
ανισοτροπικότητα των αλληλεπιδράσεων. Για τετραγωνικό πλέγμα στο πρότυπο Ising
έχουμε [72] (Kamieniarz+Blöte)
![]() | (14.92) |
Η βασική υπόθεση για τη βάθμιση των θερμοδυναμικών ποσοτήτων στην περιοχή μιας συνεχούς μετάβασης φάσης κάτω από μια αλλαγή κλίμακας μήκους στο πλέγμα όπου το αδιάστατο μήκος συσχετισμού (στο θερμοδυναμικό όριο) αλλάζει ως40
![]() | (14.93) |
όπου είναι ο παράγοντας αλλαγής της κλίμακας μήκους,
είναι ότι η ελεύθερη ενέργεια του συστήματος αλλάζει
ως41
![]() | (14.94) |
όπου η ανηγμένη θερμοκρασία και
το εξωτερικό μαγνητικό πεδίο. Η παραπάνω
σχέση συμπυκνώνει την υπόθεση βάθμισης (scaling hypothesis) και είναι μια σχέση
ανάλογη με αυτή της (14.76) . Η σχέση αυτή μπορεί να γίνει κατανοητή μέσω της
προσέγγισης της ομάδας επανακανονικοποίησης και η βασική υπόθεση είναι η
εμφάνιση μιας μοναδικής δυναμικής κλίμακας μήκους που απειρίζεται, καθώς
πλησιάζουμε το κρίσιμο σημείο και από την οποία εξαρτώνται όλες οι φυσικές
ποσότητες. Τα ορίσματα
και
δίνουν την αλλαγή που πρέπει να γίνει στις
“σταθερές σύζευξης”
και
κάτω από την αλλαγή κλίμακας μήκους, ώστε να
ισχύει η ισότητα.
Εφαρμόζοντας την παραπάνω σχέση φορές, παίρνουμε
![]() | (14.95) |
Αν την εφαρμόσουμε ένα μεγάλο αριθμό από φορές έτσι ώστε ,
κρατώντας το γινόμενο
, τότε αντικαθιστώντας τη σχέση που
προκύπτει
παίρνουμε
![]() | (14.97) |
Εφαρμόζοντας την παραπάνω υπόθεση στη σχέση (14.93) για το μήκος συσχετισμού
![]() | (14.98) |
και παίρνοντας το όριο ,
κρατώντας το γινόμενο
, το
αριστερό μέλος θα έχει μια πεπερασμένη τιμή, έστω
, ενώ το δεξί θα μας
δώσει
![]() | (14.99) |
Θεωρώντας την περίπτωση και συγκρίνοντας με τη γνωστή σχέση
(εξίσωση (14.4) ) που όρισε τον κρίσιμο εκθέτη
, παίρνουμε
![]() | (14.100) |
Παραγωγίζοντας τη σχέση (14.96) ως προς τη θερμοκρασία, παίρνουμε
![]() | (14.101) |
Στην παραπάνω σχέση, και σε όλες που ακολουθούν που έχουν το σύμβολο θα
αμελούμε σταθερές που είναι άσχετες με τις ιδιότητες βάθμισης.
Παραγωγίζοντας την παραπάνω σχέση άλλη μια φορά, και θέτοντας
παίρνουμε την ειδική θερμότητα
![]() | (14.102) |
΄Αρα, ο κρίσιμος εκθέτης δεν είναι άλλος από τον κρίσιμο εκθέτη της ειδικής
θερμότητας που ορίσαμε στην σχέση (14.4) .
Την μαγνητική επιδεκτικότητα την παίρνουμε με ανάλογο τρόπο παραγωγίζοντας
την (14.96) ως προς
![]() | (14.103) |
Παραγωγίζοντας την παραπάνω σχέση άλλη μια φορά, και θέτοντας ,
παίρνουμε την μαγνητική επιδεκτικότητα
![]() | (14.104) |
και συγκρίνοντας με τη σχέση (14.3) παίρνουμε
![]() | (14.105) |
όπου στις τελευταίες δύο σχέσεις χρησιμοποιήσαμε τις “σχέσεις υπερβάθμισης” (hyperscaling relations)
![]() | (14.106) |
Ας επαναλάβουμε την ανάλυση της προηγούμενης παραγράφου στην περίπτωση που
το σύστημά μας έχει πεπερασμένο μέγεθος. Για τον λόγο αυτό, θα υποθέσουμε
ότι το σύστημα έχει τους βαθμούς ελευθερίας του πάνω σε ένα πλέγμα με
γραμμική διάσταση (ο όγκος
,
ο αριθμός των διαστάσεων),
όπου το
είναι ο (αδιάστατος) αριθμός των πλεγματικών θέσεων και
είναι το μήκος που δίνει την πλεγματική σταθερά. Θα υποθέσουμε ότι
παίρνουμε το όριο
με
κρατώντας το μήκος
σταθερό.
Αλλάζοντας την κλίμακα του
μειώνοντας τις πλεγματικές θέσεις κατά ένα
παράγοντα
![]() | (14.107) |
έτσι ώστε να μειωθεί
![]() | (14.108) |
η σχέση (14.94) γενικεύεται στην
![]() | (14.109) |
Παίρνοντας πάλι το όριο (προσέγγιση κρίσιμου σημείου)
η παραπάνω σχέση γίνεται
![]() | (14.110) |
Παραγωγίζοντας όπως και στην προηγούμενη παράγραφο και θέτοντας
παίρνουμε
![]() | (14.111) |
όπου θέσαμε τις τιμές ,
.
Το θερμοδυναμικό όριο το παίρνουμε για όπου
,
οπότε παίρνουμε τη γνωστή σχέση
.
Αλλά όταν το συγκρίνεται με το
, επικρατούν τα φαινόμενα επίδρασης
πεπερασμένου μεγέθους. Αυτά “πνίγουν” τις μεγάλες διακυμάνσεις και η
μαγνητική επιδεκτικότητα παρουσιάζει ένα μέγιστο στη θερμοκρασία crossover
όπου
, όπου η τελευταία σχέση ισχύει γιατί
. Παίρνουμε τότε
![]() | (14.112) |
΄Αρα, στην περιοχή του μεγίστου θα πάρουμε μια συναρτησιακή σχέση της μορφής
![]() | (14.113) |
που δεν είναι άλλη από την εξίσωση (14.59) . Η συνάρτηση
είναι αναλυτική ως προς το όρισμά της
, αφού για το
πεπερασμένο σύστημα η
είναι αναλυτική συνάρτηση της
θερμοκρασίας42 .
Στο θερμοδυναμικό όριο (
,
πεπερασμένο άρα
)
![]() | (14.114) |
ώστε
και κοντά στο
ψευδοκρίσιμο σημείο
![]() | (14.115) |
οπότε περιμένουμε να έχουμε για
![]() | (14.116) |
Οι παραπάνω σχέσεις μας οδηγούν στα συμπεράσματα:
Καταλήγουμε ότι η εξαρτάται από τις συνοριακές συνθήκες και τη
γεωμετρία του πλέγματος.
Με ανάλογο τρόπο παίρνουμε
![]() | (14.117) |
και με ανάλογα επιχειρήματα που μας οδήγησαν στην εξίσωση (14.113) παίρνουμε
![]() | (14.118) |
Για το Binder cumulant θα έχουμε από τα παραπάνω
![]() | (14.119) |
όπου στην τελευταία ισότητα αναπτύξαμε τις αναλυτικές συναρτήσεις
για μικρά
. Βλέπουμε τότε ότι
![]() | (14.120) |
Παραγωγίζοντας την (14.110) ως προς τη θερμοκρασία, παίρνουμε
όπου υιοθετήσαμε το συμβολισμό
![]() | (14.122) |
και με διαδοχικές παραγωγίσεις
![]() | (14.123) |
Οι παράγωγοι
![]() | (14.124) |
![]() | (14.125) |
Ειδικότερα
![]() | (14.126) |
![]() | (14.127) |
![]() | (14.128) |
μαζί με τη σχέση βάθμισης που ορίζει τους εκθέτες ,
![]() | (14.129) |
και την σχέση που ορίζει τον εκθέτη από τη συνάρτηση συσχετισμού δύο
σημείων
όπου στο κρίσιμο σημείο
έχουμε
![]() | (14.130) |
Από τους ορισμούς και τις σχέσεις υπερβάθμισης (hyperscaling relations) έχουμε
![]() | (14.132) |
![]() | (14.133) |
![]() | (14.134) |
Στα αρχεία all και allem του συνοδευτικού λογισμικού αυτού του κεφαλαίου, υπάρχουν μετρήσεις που μπορείτε να τις χρησιμοποιήσετε για ανάλυση δεδομένων ή για να τα συγκρίνετε με τις δικές σας μετρήσεις.
![]() | ![]() | ![]() | ![]() | |||
40 | 20.50 | 0.02 | 0.6364 | 0.0001 | 0.4883 | 0.0007 |
60 | 41.78 | 0.08 | 0.6049 | 0.0002 | 0.5390 | 0.0008 |
80 | 69.15 | 0.09 | 0.5835 | 0.0001 | 0.5743 | 0.0012 |
100 | 102.21 | 0.25 | 0.5673 | 0.0002 | 0.6026 | 0.0014 |
120 | 140.18 | 0.11 | 0.5548 | 0.0001 | 0.6235 | 0.0010 |
140 | 183.95 | 0.33 | 0.5442 | 0.0002 | 0.6434 | 0.0006 |
160 | 232.93 | 0.55 | 0.5351 | 0.0001 | 0.6584 | 0.0020 |
200 | 342.13 | 0.72 | 0.5206 | 0.0001 | 0.6858 | 0.0014 |
500 | 1687.2 | 4.4 | 0.4647 | 0.0002 | 0.7794 | 0.0018 |
1000 | 6245 | 664 | 0.4228 | 0.0040 | – | – |
[1] www.physics.ntua.gr/~konstant/ComputationalPhysics/ Ο ιστότοπος του βιβλίου. Εκεί θα βρείτε το συνοδευτικό λογισμικό και συμπληρωματικό υλικό.
[2] H. Gould, J. Tobochnik and H. Christian, “Computer Simulation Methods, Application to Physical Systems”, Third Edition, Addison Wesley (2007). ΄Ενα εξαιρετικό εισαγωγικό βιβλίο στην υπολογιστική φυσική. Ο προγραμματισμός γίνεται σε περιβάλλον Java. Το λογισμικό δίνεται με άδεια ανοιχτού λογισμικού και μπορεί να ανακτηθεί από τη διεύθυνση opensourcephysics.org
[3] R. Landau, M. J. Páez and C. C. Bordeianu, “Computational Physics: Problem Solving with Computers”, Wiley-VCH, 2 ed. (2007).
[4] M. E. J. Newman and G. T. Barkema, “Monte Carlo Methods in Statistical Physics”, Clarendon Press, Oxford (2002). Εξαιρετικό βιβλίο για ένα εισαγωγικό, αλλά και πιο προχωρημένο, μάθημα στις μεθόδους Μόντε Κάρλο στη φυσική.
[5] B. A. Berg, “Markov Chain Monte Carlo Simulations and Their Statistical Analysis. With Web-Based Fortran Code”, World Scientific, 2004. Μόντε Κάρλο για ένα μεταπτυχιακό μάθημα από έναν από τους κορυφαίους του πεδίου. Διδάσκει πολλές από τις πιο προχωρημένες μεθόδους.
[6] D. P. Landau and K. Binder, “A Guide to Monte Carlo Simulations in Statistical Physics”, Cambridge University Press, 3rd Edition, 2009.
[7] K. Binder and D. W. Heermann, “Monte Carlo Simulation in Statistical Physics”, Fifth Edition, Springer (2010).
[8] W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flanney, “Numerical Recipes, The Art of Scientific Computing”, Third Edition, Cambridge University Press (2007), www.nr.com Το απόλυτα απαραίτητο εγχειρίδιο για κάθε επιστήμονα, με συνταγές για τις πιο βασικές αριθμητικές μεθόδους.
[Κεφάλαιο 1]
[9] M. Metcalf, J. Reid , M. Cohen, “Modern Fortran Explained”, 4th Edition, OUP Oxford (2011).
[10] J. C. Adams, W. S. Brainerd, R. A. Hendrickson, R. E. Maine, J. T. Martin and B. T. Smith, “The Fortran 2003 Handbook: The Complete Syntax, Features and Procedures”, Springer (2009).
[11] T. M. R. Ellis, I. R. Philips and T. M. Lahey, “Fortran 90 Programming”, Addison-Wesley (1994).
[12] C. G. Page, “Professional Programmer’s Guide to Fortran77”, http://www.star.le.ac.uk/~cgp/prof77.html
[13] Gnuplot official site http://gnuplot.info/
[14] P. K. Janert, “Gnuplot in Action: Understanding Data with Graphs”, Manning Publications (2009).
[15] tcsh homepage: http://www.tcsh.org/Home
[16] P. DuBois, “Using csh & tcsh”, O’Reilly and Associates (1995), www.kitebird.com/csh-tcsh-book/
[17] M. J. Currie, “C-shell Cookbook”,
http://www.astro.soton.ac.uk/unixtut/sc4.pdf
[18] Wiki book: “C Shell Scripting”,
http://en.wikibooks.org/wiki/C_Shell_Scripting
[19] G. Anderson and P. Anderson, “The Unix C Shell Field Guide”, Prentice Hall (1986).
[Κεφάλαιο 3]
[20] R. M. May, “Simple Mathematical Models with Very Complicated Dynamics”, Nature 261 (1976) 459.
[21] C. Efthimiou, “Introduction to Functional Equations: Theory and Problem-Solving Strategies for Mathematical Competitions and Beyond”, MSRI Mathematical Circles Library (2010). Δείτε την ενότητα 16.7.
[22] P. Cvitanović, R. Artuso, R. Mainieri, G. Tanner and G. Vattay, “Chaos: Classical and Quantum”, ChaosBook.org, Niels Bohr Institute (2012).
[23] L. Smith, “Chaos: A Very Short Introduction”, Oxford University Press (2007).
[24] M. Schroeder, “Fractals, Chaos, Power Laws: Minutes from an Infinite Paradise”, W.H. Freeman (1991).
[25] S. H. Strogatz, “Non Linear Dynamics and Chaos”, Addison-Wesley (1994).
[26] Wikipedia: “Chaos Theory”, “Logistic Map”, “Bifurcation Diagram”, “Liapunov Exponents”, “Fractal Dimension”, “Feigenbaum constants”.
[27] Wikipedia: “List of chaotic maps”.
[28] Wikipedia: “Newton’s method”.
[29] M. Jakobson, “Absolutely continuous invariant measures for one-parameter families of one-dimensional maps”, Commun. Math. Phys. 81 (1981) 39.
[Κεφάλαιο 4]
[30] W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flanney, “Numerical Recipes, The Art of Scientific Computing”, Third Edition, Cambridge University Press (2007), www.nr.com Δείτε τα κεφάλαια πάνω στις μεθόδους Runge–Kutta.
[31] E. W. Weisstein, “Runge-Kutta Method”, from MathWorld–A
Wolfram Web Resource.
http://mathworld.wolfram.com/Runge-KuttaMethod.html
[32] J. H. E. Cartwright and O. Piro, “The dynamics of Runge-Kutta methods”, Int. J. Bifurcation and Chaos 2, (1992) 427-449.
[33] J. H. Mathews and K. Fink, “Numerical Methods Using Matlab”, Prentice Hall (2003), Κεφάλαιο 9.
[34] J. H. Mathews, “Numerical Analysis - Numerical Methods Project”, http://math.fullerton.edu/mathews/numerical.html
[35] I. Percival and D. Richards, “Introduction to Dynamics”, Cambridge University Press (1982). Δείτε επίσης την [37].
[36] J. B. McLaughlin, “Period Doubling bifurcations and chaotic motion for a parametrically forced pendulum”, J. Stat. Phys. 24 (1981) 375–388.
[Κεφάλαιο 5]
[37] J. V. José and E. J. Saletan, “Classical Dynamics, a Contemporary Approach”, Cambridge University Press, 1998.
[Κεφάλαιο 6]
[38] R. W. Brankin, I. Gladwell, and L. F. Shampine, “RKSUITE: a suite of Runge-Kutta codes for the initial value problem for ODEs”, Softreport 92-S1, Department of Mathematics, Southern Methodist University, Dallas, Texas, U.S.A (1992). Διαθέσιμο από τη διεύθυνση www.netlib.org/ode/rksuite και από το συνοδευτικό λογισμικό του βιβλίου.
[Κεφάλαιο 9]
[39] See the Mathematica Notebooks of Peter West http://young.physics.ucsc.edu/115/
[40] U. Wolff, B. Bunk, F. Knechtli, “Computational Physics I”,
http://www.physik.hu-berlin.de/com/
teachingandseminars/previous_CPI_CPII
[41] F. T. Hioe and E. W. Montroll, “Quantum theory of anharmonic oscillators. I. Energy levels of oscillators with positive quartic anharmonicity”, J. Math. Phys. 16 (1975) 1945, http://dx.doi.org/10.1063/1.522747
[Κεφάλαιο 11]
[42] L. Kadanoff, “Statistical Physics – Statics, Dynamics and Renormalization”, World Scientific (2000).
[43] J. Ambjørn, B. Durhuus and T. Jonsson, “Quantum Geometry”, Cambridge Monographs on Mathematical Physics, Cambridge University Press (1997).
[44] C. Itzykson and J. M. Drouffe, “Statistical Field Theory”, Volume 1, Cambridge Monographs on Mathematical Physics, Cambridge University Press (1989).
[45] D. E. Knuth, “Seminumerical Algorithms”, Vol. 2 of “The Art of Computer Programming”, Addison-Wesley (1981).
[46] M. Lüscher, Comput.
Phys. Commun. 79 (1994) 100; F. James, Comput. Phys. Commun. 79
(1994) 111; Erratum 97 (1996) 357. Το πρόγραμμα είναι διαθέσιμο στις
διευθύνσεις http://cpc.cs.qub.ac.uk/summaries/ACPR_v1_0.html
http://wwwasd.web.cern.ch/wwwasd/cernlib/
download/2001_wnt/src/mathlib/gen/v/ranlux.F
[47] L. Schrage, “A More Portable Fortran Random Number Generator”, ACM Transactions on Mathematical Software, 5 (1979) 132-138; P. Bratley, B. L. Fox and L. Schrage, “A Guide to Simulation”, Springer-Verlag, 1983.
[48] G. Marsaglia and A. Zaman, Ann. Appl. Prob. 1 (1991) 462.
[49] B. Li, N. Madras and A. D. Sokal, “Critical Exponents, Hyperscaling and Universal Amplitude Ratios for Two- and Three-Dimensional Self-Avoiding Walks”, J.Statist.Phys. 80 (1995) 661-754 [arXiv:hep-lat/9409003]; G. Slade, “The self-avoiding walk: A brief survey”, Surveys in Stochastic Processes, pp. 181-199, eds. J. Blath, P. Imkeller and S. Roelly, European Mathematical Society, Zurich, (2011), http://www.math.ubc.ca/~slade/spa_proceedings.pdf
[Κεφάλαιο 12]
[50] J. J. Binney, N. J. Dowrick, A. J. Fisher and M. E. J. Newman, “The Theory of Critical Phenomena”, Clarenton Press (1992).
[51] R. K. Pathria and P. D. Beale, “Statistical Mechanics”, Third Edition, Elsevier (2011).
[52] F. Mandl, “Statistical Physics”, Second Edition, Wiley (1988).
[53] R. J. Baxter, “Exactly Solved Models in Statistical Mechanics”, Dover Publications (2008).
[Κεφάλαιο 13]
[54] E. Ising, “Beitrag zur Theorie des Ferromagnetizmus”, Z. Phys. 31 (1925) 253–258.
[55] L. Onsager, “Crystal Statistics. I. A Two–Dimensional Model with an Order–Disorder Transition”, Phys. Rev. 65 (1944) 117–119.
[56] K. Huang, “Statistical Mechanics”, John Wiley & Sons, New York, (1987). Λεπτομερής παρουσίαση της λύσης Onsager.
[57] C. N. Yang, “The Spontaneous Magnetization of a Two-Dimensional Ising Model”, Phys. Rev. 85 (1952) 809.
[58] N. Metropolis, A. W. Rosenbluth, M. N. Rosenbluth, A. H. Teller and E. J. Teller, “Perspective on “Equation of state calculations by fast computing machines””, Chem. Phys. 21 (1953) 1087.
[59] M. P. Nightingale and H. W. J. Blöte, “Dynamic Exponent of the Two-Dimensional Ising Model and Monte Carlo Computation of the Subdominant Eigenvalue of the Stochastic Matrix”, Phys. Rev. Lett. 76 (1996) 4548.
[60] H. Müller-Krumbhaar and K. Binder, “Dynamic properties of the Monte Carlo method in statistical mechanics”, J. Stat. Phys. 8 (1973) 1.
[61] B. Efron, “Computers and the Theory of Statistics: Thinking the Unthinkable”, SIAM Review 21 (1979) 460; “Bootstrap Methods: Another Look at the Jackknife”, Ann. Statist. 7 (1979) 1; B. Efron and R. Tibshirani, “Bootstrap Methods for Standard Errors, Confidence Intervals, and Other Measures of Statistical Accuracy”, Statistical Science 1 (1986) 54. Ελεύθερα διαθέσιμο από το projecteuclid.org
[Κεφάλαιο 14]
[62] R. H. Swendsen and J.-S. Wang, “Nonuniversal critical dynamics in Monte Carlo simulations”, Phys. Rev. Lett. 58 (1987) 86.
[63] U. Wolff, “Collective Monte Carlo Updating for Spin Systems”, Phys. Rev. Lett. 62 (1989) 361.
[64] A. Pelisseto and E. Vicari, “Critical Phenomena and Renormalization–Group Theory”, Phys. Reports 368 (2002) 549.
[65] F. Y. Wu, “The Potts Model”, Rev. Mod. Phys. 54 (1982) 235.
[66] P. D. Coddington and C. F. Baillie, “Empirical relations between static and dynamic exponents for Ising model cluster algorithms”, Phys. Rev. Lett. 68 (1992) 962.
[67] H. Rieger, “Critical behavior of the three-dimensional random-field Ising model: Two-exponent scaling and discontinuous transition”, Phys. Rev. B 52 (1995) 6659.
[68] M. E. J. Newman and G. T. Barkema, “Monte Carlo study of the random-field Ising model”, Phys. Rev. E 53 (1996) 393.
[69] A. E. Ferdinand and M. E. Fisher, “Bounded and Inhomogeneous
Ising Models. I. Specific-Heat Anomaly of a Finite Lattice”, Phys. Rev.
185 (1969) 832; N. Sh. Izmailian and C. -K. Hu, “Exact amplitude ratio
and finite-size corrections for the square lattice Ising model”,
Phys. Rev. E 65 (2002) 036103; J. Salas, “Exact finite-size-scaling
corrections to the critical two-dimensional Ising model on a torus: II.
Triangular and hexagonal lattices”, J. Phys. A 34 (2001) 1311; W.
Janke and R. Kenna, “Exact finite-size scaling with corrections in the
two-dimensional Ising model with special boundary conditions”, Nucl.
Phys. (Proc. Suppl.) 106 (2002) 929.
[70] J. Ambjørn and K. N. Anagnostopoulos, “Quantum geometry of 2D gravity coupled to unitary matter”, Nucl. Phys. B 497 (1997) 445.
[71] K. Binder, “Critical Properties from Monte Carlo Coarse Graining and Renormalization”, Phys. Rev. Lett. 47 (1981) 693.
[72] K. Binder, “Finite size scaling analysis of ising model block distribution functions”, Z. Phys. B 43 (1981) 119; G. Kamieniarz and H. W. J. Blöte, “Universal ratio of magnetization moments in two-dimensional Ising models”, J. Phys. A 26 (1993) 201.
[73] J. Cardy, “Scaling and Renormalization in Statistical Physics”, 1st Edition, Cambridge University Press (1996).
[74] A. M. Ferrenberg and D. P. Landau, “Critical behavior of the three-dimensional Ising model: A high-resolution Monte Carlo study, Phys. Rev. B44 (1991) 5081.
[75] M. S. S. Challa, D. P. Landau and K. Binder, “Finite-size effects at temperature-driven first-order transitions”, Phys. Rev. B34 (1986) 1841.
[76] H. E. Stanley, “Introduction to Phase Transitions and Critical Phenomena”, Oxford (1971).
[77] R. Creswick and S.-Y. Kim, “Critical exponents of the four-state Potts model, J. Phys. A: Math.Gen. 30 (1997) 8785.
[78] C. Holm and W. Janke, “Critical exponents of the classical three-dimensional Heisenberg model: A single-cluster Monte Carlo study”, Phys. Rev. B 48 (1993) 936 [arXiv:hep-lat/9301002].
[79] M. Hasenbusch and S. Meyer, “Critical exponents of the 3D XY model from cluster update Monte Carlo”, Phys. Lett. B 241 (1990) 238.
[80] M. Kolesik and M. Suzuki, “Accurate estimates of 3D Ising critical exponents using the coherent-anomaly method”, Physica A 215 (1995) 138.
[81] M. Kolesik and M. Suzuki, “Critical exponents of the 3D antiferromagnetic three-state Potts model using the coherent-anomaly method”, Physica A 216 (1995) 469.