Authors Konstantinos N. Anagnostopoulos
License CC-BY-NC-SA-3.0
Υπολογιστική Φυσική Μία Πρακτική Εισαγωγή στην Υπολογιστική Φυσική και τον Επιστημονικό Προγραμματισμό Κωνσταντίνος Ν. Αναγνωστόπουλος ΚΩΝΣΤΑΝΤΙΝΟΣ Ν. ΑΝΑΓΝΩΣΤΟΠΟΥΛΟΣ Αναπληρωτής Καθηγητής Εθνικό Μετσόβιο Πολυτεχνείο Υπολογιστική Φυσική Μία Πρακτική Εισαγωγή στην Υπολογιστική Φυσική και τον Επιστημονικό Προγραμματισμό Υπολογιστική Φυσική Συγγραφή Κωνσταντίνος Ν. Αναγνωστόπουλος Κριτικός Αναγνώστης Ιωάννης Ρίζος Συντελεστές έκδοσης Γλωσσική Επιμέλεια: Αναστασία Τσιαδήμου Γραφιστική Επιμέλεια: Κωνσταντίνος Ν. Αναγνωστόπουλος Τεχνική Επεξεργασία: Κωνσταντίνος Ν. Αναγνωστόπουλος 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 ΠΕΡΙΕΧΟΜΕΝΑ Ακρωνύμια – Αρκτικόλεξα xi Αντιστοίχιση Ελληνόγλωσσων-Ξενόγλωσσων Όρων xiii Πρόλογος xvii 1 Ο Υπολογιστής 1 1.1 Το Λειτουργικό Σύστημα . . . . . . . . . . . . . . . . . . . 3 1.1.1 Filesystem . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.2 Εντολές . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.1.3 Αναζητώντας Βοήθεια . . . . . . . . . . . . . . . . . 14 1.2 Εργαλεία Επεξεργασίας Κειμένου – Φίλτρα . . . . . . . . 16 1.3 Προγραμματίζοντας με τον Emacs . . . . . . . . . . . . . . 21 1.3.1 Καλώντας τον Emacs . . . . . . . . . . . . . . . . . 22 1.3.2 Αλληλεπιδρώντας με τον Emacs . . . . . . . . . . . 24 1.3.3 Βασική Επεξεργασία Κειμένου . . . . . . . . . . . . 26 1.3.4 Κόβοντας και ράβοντας . . . . . . . . . . . . . . . . 29 1.3.5 Παράθυρα . . . . . . . . . . . . . . . . . . . . . . . . 30 1.3.6 Αρχεία και Buffers . . . . . . . . . . . . . . . . . . . 31 1.3.7 Modes . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.3.8 Βοήθεια στον Emacs . . . . . . . . . . . . . . . . . . 34 1.3.9 Παραμετροποίηση του Emacs . . . . . . . . . . . . . 36 1.3.10 Ελληνικά στον Emacs . . . . . . . . . . . . . . . . . 37 1.4 Η Γλώσσα Προγραμματισμού: Fortran . . . . . . . . . . . 38 1.4.1 Τα Στοιχειώδη . . . . . . . . . . . . . . . . . . . . . 38 1.4.2 Μερικές λεπτομέρειες . . . . . . . . . . . . . . . . . 49 1.4.3 Χειρισμός των arrays . . . . . . . . . . . . . . . . . 55 1.4.4 Ιστορικές Παρατηρήσεις . . . . . . . . . . . . . . . . 62 1.5 Κοιτάζοντας τα Αποτελέσματα . . . . . . . . . . . . . . . . 63 1.6 Shell Scripting: Σενάρια Φλοιού . . . . . . . . . . . . . . . 68 iii iv ΠΕΡΙΕΧΟΜΕΝΑ 2 Περιγραφή της Κίνησης 83 2.1 Κίνηση στο Επίπεδο . . . . . . . . . . . . . . . . . . . . . . 83 2.1.1 Απεικόνιση των Δεδομένων . . . . . . . . . . . . . . 92 2.1.2 Άλλα Παραδείγματα . . . . . . . . . . . . . . . . . . 96 2.2 Κίνηση στο Χώρο . . . . . . . . . . . . . . . . . . . . . . . 106 2.3 Κίνηση μετ’ Εμποδίων . . . . . . . . . . . . . . . . . . . . . 116 2.3.1 Το Μονοδιάστατο Κουτί . . . . . . . . . . . . . . . 117 2.3.2 Σφάλματα . . . . . . . . . . . . . . . . . . . . . . . 123 2.3.3 Το Δισδιάστατο Κουτί . . . . . . . . . . . . . . . . . 127 2.4 Εφαρμογές . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 2.5 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 3 Η Λογιστική Απεικόνιση 157 3.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 3.2 Σταθερά Σημεία και 2n Κύκλοι . . . . . . . . . . . . . . . . 160 3.3 Διάγραμμα διακλάδωσης . . . . . . . . . . . . . . . . . . . 166 3.4 Μέθοδος Newton-Raphson . . . . . . . . . . . . . . . . . . 170 3.5 Υπολογισμός Σημείων Διακλάδωσης . . . . . . . . . . . . . 176 3.6 Εκθέτες Liapunov . . . . . . . . . . . . . . . . . . . . . . . 181 3.7 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 4 Κίνηση Σωματιδίου 207 4.1 Αριθμητική Ολοκλήρωση Εξισώσεων Νεύτωνα . . . . . . . 207 4.2 Πρελούδιο: Μέθοδοι Euler . . . . . . . . . . . . . . . . . . 208 4.3 Μέθοδοι Runge–Kutta . . . . . . . . . . . . . . . . . . . . . 220 4.3.1 Προγραμματισμός της Runge–Kutta 4ης τάξης . . 225 4.4 Σύγκριση των Μεθόδων . . . . . . . . . . . . . . . . . . . . 229 4.5 Ταλαντώσεις με Απόσβεση και Διέγερση . . . . . . . . . . 232 4.6 Εκκρεμές με Απόσβεση και Διέγερση . . . . . . . . . . . . 240 4.7 Παράρτημα: Στη Μέθοδο Euler–Verlet . . . . . . . . . . . . 247 4.8 Παράρτημα: Runge–Kutta 2ης τάξης . . . . . . . . . . . . 251 4.9 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 5 Κίνηση στο Επίπεδο 259 5.1 Runge–Kutta για την Κίνηση στο Επίπεδο . . . . . . . . . 259 5.2 Βολές στο Βαρυτικό Πεδίο της Γης . . . . . . . . . . . . . 264 5.3 Κίνηση Πλανητών . . . . . . . . . . . . . . . . . . . . . . . 271 5.4 Σκέδαση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 5.4.1 Σκέδαση Rutherford . . . . . . . . . . . . . . . . . . 279 5.4.2 Σκέδαση σε Άλλα Πεδία Δυνάμεων . . . . . . . . . 286 5.5 Περισσότερα Σωματίδια . . . . . . . . . . . . . . . . . . . . 289 ΠΕΡΙΕΧΟΜΕΝΑ v 5.6 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 6 Κίνηση στο Χώρο 305 6.1 Runge–Kutta στις τρεις διαστάσεις. . . . . . . . . . . . . . 306 6.2 Κίνηση Σωματίου σε ΗΜ πεδίο. . . . . . . . . . . . . . . . 315 6.3 Σχετικιστική Κίνηση. . . . . . . . . . . . . . . . . . . . . . . 317 6.4 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 7 Ηλεκτροστατική 331 7.1 Σημειακή Κατανομή Φορτίων . . . . . . . . . . . . . . . . . 331 7.2 Το Πρόγραμμα – Ορεκτικά και ... επιδόρπιο . . . . . . . . 334 7.3 Το Πρόγραμμα - Το Κυρίως Πιάτο . . . . . . . . . . . . . . 344 7.4 Το Πρόγραμμα - Σύνοψη . . . . . . . . . . . . . . . . . . . 351 7.5 Ηλεκτροστατικό Πεδίο στο Κενό . . . . . . . . . . . . . . . 355 7.6 Αποτελέσματα . . . . . . . . . . . . . . . . . . . . . . . . . 364 7.7 Εξίσωση Poisson . . . . . . . . . . . . . . . . . . . . . . . . 364 7.8 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 8 Εξίσωση Διάχυσης 375 8.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 8.2 Απαγωγή Θερμότητας . . . . . . . . . . . . . . . . . . . . . 377 8.3 Διακριτοποίηση . . . . . . . . . . . . . . . . . . . . . . . . . 379 8.4 Το Πρόγραμμα . . . . . . . . . . . . . . . . . . . . . . . . . 380 8.5 Αποτελέσματα . . . . . . . . . . . . . . . . . . . . . . . . . 382 8.6 Διάχυση Πάνω στον Κύκλο. . . . . . . . . . . . . . . . . . . 385 8.7 Ανάλυση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 8.8 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 9 Ο Αναρμονικός Ταλαντωτής 395 9.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 9.2 Υπολογισμός Ιδιοτιμών του Hnm (λ) . . . . . . . . . . . . . 397 9.3 Αποτελέσματα . . . . . . . . . . . . . . . . . . . . . . . . . 406 9.4 Το Διπλό Πηγάδι Δυναμικού . . . . . . . . . . . . . . . . . 412 9.5 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 10 Η Εξίσωση Schrödinger 423 10.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 10.2 Το απειρόβαθο πηγάδι δυναμικού . . . . . . . . . . . . . . 426 10.3 Δέσμιες Καταστάσεις . . . . . . . . . . . . . . . . . . . . . 438 10.4 Μετρήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 10.5 Ο Αναρμονικός Ταλαντωτής - Ξανά... . . . . . . . . . . . . 453 vi ΠΕΡΙΕΧΟΜΕΝΑ 10.6 Το Δυναμικό Lennard–Jones . . . . . . . . . . . . . . . . . 458 10.7 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 11 Ο Τυχαίος Περιπατητής 467 11.1 (Ψευδο)Τυχαίοι Αριθμοί . . . . . . . . . . . . . . . . . . . . 468 11.2 Χρήση Γεννητριών Ψευδοτυχαίων Αριθμών . . . . . . . . . 480 11.3 Τυχαίες Διαδρομές . . . . . . . . . . . . . . . . . . . . . . . 488 11.4 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 12 Προσομοιώσεις Μόντε Κάρλο 501 12.1 Στατιστική Φυσική . . . . . . . . . . . . . . . . . . . . . . . 502 12.2 Εντροπία . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 12.3 Διακυμάνσεις . . . . . . . . . . . . . . . . . . . . . . . . . . 510 12.4 Συναρτήσεις Συσχετισμού . . . . . . . . . . . . . . . . . . . 512 12.5 Δειγματοληψία . . . . . . . . . . . . . . . . . . . . . . . . . 514 12.5.1 Απλή Δειγματοληψία . . . . . . . . . . . . . . . . . 514 12.5.2 Importance Sampling . . . . . . . . . . . . . . . . . 516 12.6 Διαδικασίες Markov . . . . . . . . . . . . . . . . . . . . . . 516 12.7 Συνθήκη Λεπτομερούς Ισορροπίας . . . . . . . . . . . . . . 518 12.8 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 13 Το Πρότυπο Ising 521 13.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 13.2 Ο Αλγόριθμος Metropolis . . . . . . . . . . . . . . . . . . . 527 13.3 Σχεδιασμός Κώδικα . . . . . . . . . . . . . . . . . . . . . . 530 13.3.1 Ο Κώδικας . . . . . . . . . . . . . . . . . . . . . . . 536 13.3.2 Βελτίωση του Interface . . . . . . . . . . . . . . . . 542 13.4 Θερμική Ισορροπία . . . . . . . . . . . . . . . . . . . . . . . 554 13.5 Αυτοσυσχετισμοί . . . . . . . . . . . . . . . . . . . . . . . . 556 13.6 Στατιστικά Σφάλματα . . . . . . . . . . . . . . . . . . . . . 564 13.6.1 Σφάλματα Ανεξάρτητων Μετρήσεων . . . . . . . . 566 13.6.2 Jackknife . . . . . . . . . . . . . . . . . . . . . . . . 569 13.6.3 Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . 571 13.7 Παράρτημα: Συνάρτηση Αυτοσυσχετισμού . . . . . . . . . 572 13.8 Παράρτημα: Υπολογισμός Σφαλμάτων . . . . . . . . . . . 580 13.8.1 Η Μέθοδος Jackknife . . . . . . . . . . . . . . . . . . 580 13.8.2 Η Μέθοδος Bootstrap . . . . . . . . . . . . . . . . . 584 13.8.3 Σύγκριση των Μεθόδων . . . . . . . . . . . . . . . . 587 13.9 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 ΠΕΡΙΕΧΟΜΕΝΑ vii 14 Κρίσιμοι Εκθέτες 603 14.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603 14.2 Κρίσιμη Επιβράδυνση . . . . . . . . . . . . . . . . . . . . . 605 14.3 Ο Αλγόριθμος του Wolff . . . . . . . . . . . . . . . . . . . . 607 14.4 Σχεδιασμός Κώδικα . . . . . . . . . . . . . . . . . . . . . . 614 14.4.1 Ο Κώδικας . . . . . . . . . . . . . . . . . . . . . . . 616 14.5 Συλλογή Δεδομένων . . . . . . . . . . . . . . . . . . . . . . 622 14.6 Ανάλυση Δεδομένων . . . . . . . . . . . . . . . . . . . . . . 625 14.7 Χρόνοι Αυτοσυσχετισμού . . . . . . . . . . . . . . . . . . . 632 14.8 Βάθμιση Θερμοκρασίας . . . . . . . . . . . . . . . . . . . . 638 14.9 Βάθμιση Πεπερασμένου Μεγέθους . . . . . . . . . . . . . . 643 14.10Προσδιορισμός της βc . . . . . . . . . . . . . . . . . . . . . 647 14.11Μελέτη Βάθμισης με ... Κατάρρευση . . . . . . . . . . . . 653 14.12Binder Cumulant . . . . . . . . . . . . . . . . . . . . . . . . 662 14.13Παράρτημα: Βάθμιση . . . . . . . . . . . . . . . . . . . . . 667 14.13.1Binder Cumulant . . . . . . . . . . . . . . . . . . . . 667 14.13.2Βάθμιση . . . . . . . . . . . . . . . . . . . . . . . . . 672 14.13.3Βάθμιση Πεπερασμένου Μεγέθους . . . . . . . . . . 674 14.14Παράρτημα: Κρίσιμοι Εκθέτες . . . . . . . . . . . . . . . . 678 14.14.1Ορισμοί . . . . . . . . . . . . . . . . . . . . . . . . . 678 14.14.2Σχέσεις . . . . . . . . . . . . . . . . . . . . . . . . . 678 14.15Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 Bibliography 683 viii ΠΕΡΙΕΧΟΜΕΝΑ Ο τόμος αυτός έχει γραφτεί με την υπόθεση ότι ο αναγνώστης εκτελεί τις εντολές και τις διαδικασίες που περιγράφονται ταυτόχρονα με την ανάγνωση του κειμένου. Αν αυτό δεν γίνεται, η βοήθεια από το κείμενο θα είναι εξαιρετικά ελλιπής. Η ιστοσελίδα του βιβλίου είναι στη θέση http://www.physics.ntua.gr/˜konstant/ComputationalPhysics/ Εκεί θα βρείτε συμπληρωματικό υλικό, το συνοδευτικό λογισμικό με τα προγράμματα που παρουσιάζονται στο βιβλίο, καθώς και τη μετάφραση του βιβλίου στα Αγγλικά (ελεύθερα διαθέσιμη). Μερικές συμβάσεις: Κείμενο με γραμματοσειρά όπως η παρακάτω, αφορά εντολές που δίνονται στον υπολογιστή, είσοδο και έξοδο προ- γραμμάτων, κώδικα γραμμένο σε Fortran ή άλλη γλώσσα και ονόματα αρχείων: > echo Hello world Hello world Όταν μια γραμμή αρχίζει με τον χαρακτήρα “προτροπής” (prompt), > όπως παραπάνω, αυτή είναι μία εντολή που δίνουμε από τη γραμμή εντολών του φλοιού. Η δεύτερη γραμμή δείχνει αυτά που τυπώνει η εντολή στην κονσόλα. Παρακάτω, δίνονται τα περιεχόμενα ενός αρχείου Fortran: program add z = 1.0 y = 2.0 x = z + y print * , x end program add ΠΕΡΙΕΧΟΜΕΝΑ ix Τι χρειάζεστε για να δουλέψετε στον υπολογιστή σας: • Ένα λειτουργικό σύστημα τύπου GNU/Linux και τα βασικά εργα- λεία του. • Έναν μεταγλωττιστή (compiler) για τη γλώσσα Fortran. Ο μετα- γλωττιστής gfortran διατίθεται ελεύθερα υπό άδεια ελεύθερου λο- γισμικού¹. • Ένα προηγμένο πρόγραμμα επεξεργασίας κειμένου κατάλληλο για προγραμματιστές, όπως ο Emacs². • Ένα καλό πρόγραμμα, κατάλληλο για ανάλυση δεδομένων, για να κάνετε γραφικές παραστάσεις, όπως το gnuplot³. • Τον φλοιό tcsh⁴. • Τα προγράμματα gawk⁵, grep, sort, cat, head, tail, less. Βεβαιω- θείτε ότι είναι στη διάθεσή σας. Αν έχετε μια διανομή GNU/Linux εγκατεστημένη στον υπολογιστή σας, η εγκατάσταση του παραπάνω λογισμικού γίνεται πολύ εύκολα από τον διαχειριστή πακέτων (software center) της διανομής. Λ.χ., σε μια διανομή τύπου Debian (Ubuntu, ...), αφού εκτελέσετε τις απλές εντολές > sudo apt−get install tcsh emacs gnuplot−x11 gnuplot−doc > sudo apt−get install gfortran gawk gawk−doc binutils > sudo apt−get install manpages−dev coreutils liblapack3 θα βρείτε όλο το λογισμικό εγκατεστημένο στον υπολογιστή σας. Αν δεν θέλετε να εγκαταστήσετε μια διανομή GNU/Linux στον υπο- λογιστή σας, έχετε τις εξής εναλλακτικές δυνατότητες: • Εκκινήστε τον υπολογιστή σας από το DVD ή usb stick με μια live διανομή, όπως αυτή του Ubuntu⁶. Αυτή η επιλογή δεν θα αλλοιώσει τίποτα στον υπολογιστή σας, αν και θα τρέχει αργά. ¹http://www.gfortran.org ²http://www.gnu.org/software/emacs/ ³http://www.gnuplot.info ⁴http://www.tcsh.org ⁵http://www.gnu.org/software/gawk ⁶http://www.ubuntu.com x ΠΕΡΙΕΧΟΜΕΝΑ • Εγκαταστήστε τη διανομή Cygwin⁷ στα Microsoft Windows. Εί- ναι μια πολύ καλή επιλογή για όσους προτιμούν τα προϊόντα της Microsoft. • Το λειτουργικό σύστημα Mac OS X βασίζεται στο Unix, το οποίο, σε επίπεδο φλοιού, λειτουργεί παρόμοια με το Linux. Τα πακέτα λογισμικού που αναφέρονται παραπάνω είναι διαθέσιμα και για τα Mac. Αναζητήστε πληροφορίες μέσω του Google: “gfortran for Mac”, “emacs for Mac”, “tcsh for Mac” κλπ. Στην ιστοθέση https://goo.gl/2pLXT2 θα βρείτε βίντεο που θα σας βοηθήσουν με τα παραπάνω. ⁷http://www.cygwin.com Ακρωνύμια – Αρκτικόλεξα 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. pdf - Portable Document Format. RK45 - Runge–Kutta τάξης 4 προσαρμοζόμενου βήματος. RW - Random Walk (απλό). SAW - Self Avoiding Walk. SOR - Successive OverRelaxation. tcsh - Trusted C SHell. xi xii ΑΚΡΩΝΥΜΙΑ – ΑΡΚΤΙΚΟΛΕΞΑ Αντιστοίχιση Ελληνόγλωσσων-Ξενόγλωσσων Όρων allocation - Εκχώρηση (memory allocation = εκχώ- ρηση μνήμης υπολογιστή σε ένα πρό- γραμμα, array κλπ). anharmonic - Αναρμονικός (ταλαντωτής). (oscillator) animation - Κινούμενα σχέδια. Αναφέρεται σε γρα- φική παράσταση δεδομένων που αλλά- ζουν στον χρόνο. ansatz - Δοκιμαστική λύση σε ένα πρόβλημα ή μία εξίσωση. argument - Όρισμα εντολής: λέξεις που το πρό- γραμμα διαβάζει από τη γραμμή εντολών. array - Δομές δεδομένων στη Fortran στα οποία αναφερόμαστε με χρήση ακέραιων δει- κτών (λ.χ. διανύσματα, πίνακες κλπ). attractor - Ελκυστής: υποσύνολο του φασικού χώρου ενός δυναμικού συστήματος στο οποίο κι- νείται οριακά το σύστημα για μεγάλους χρόνους. attribute - Χαρακτηρισμός που δίνεται στη δήλωση μίας μεταβλητής Fortran (λ.χ. parameter, allocatable κλπ). autocorrelation - Αυτοσυσχετισμός: στατιστικός συσχετι- σμός τυχαίας μεταβλητής με τον εαυτό της στον χρόνο. bifurcation - Διακλάδωση (εδώ των σταθερών σημείων της λογιστικής απεικόνισης). xiii xiv ΑΝΤΙΣΤΟΙΧΙΣΗ ΕΛΛΗΝΟΓΛΩΣΣΩΝ-ΞΕΝΟΓΛΩΣΣΩΝ ΟΡΩΝ 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 - Διεπαφή (εδώ ενός προγράμματος με τον χρήστη). xv 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 - Εντολές-σενάριο οι οποίες ερμηνεύονται, χωρίς να μεταγλωττίζονται, από κάποιο πρόγραμμα (λ.χ. τον φλοιό). xvi ΑΝΤΙΣΤΟΙΧΙΣΗ ΕΛΛΗΝΟΓΛΩΣΣΩΝ-ΞΕΝΟΓΛΩΣΣΩΝ ΟΡΩΝ seed - Αρχική τιμή σε μια γεννήτρια ψευδοτυ- χαίων αριθμών. Αρχική πλεγματική θέση σε ένα Wolff cluster. semicolon - Ο χαρακτήρας “;” (ελληνικό ερωτημα- τικό). shell - Φλοιός, ειδικό πρόγραμμα αλληλεπίδρα- σης ενός χρήστη με το λειτουργικό σύ- στημα. shell script - Σενάριο φλοιού: πρόγραμμα που εκτελεί μία ακολουθία εντολών ενός φλοιού. stdin (standard - ειδικό αρχείο εισόδου δεδομένων. input) stdout (standard - ειδικό αρχείο εξόδου δεδομένων. output) stderr (standard - ειδικό αρχείο εξόδου δεδομένων για error) σφάλματα εκτέλεσης προγραμμάτων. subroutine - Υπορουτίνα: αυτόνομη διαδικασία στη Fortran, μία συνάρτηση που δεν επιστρέ- φει αποτέλεσμα (δηλ. τύπου void). sweep - Ενημέρωση ή απόπειρα ενημέρωσης όλων των βαθμών ελευθερίας ενός πλέγματος σε μια διαδικασία Μόντε Κάρλο. thermalization - Διαδικασία εύρεσης κατάστασης θερμι- κής ισορροπίας σε έναν αλγόριθμο Μόντε Κάρλο. transient state - Μεταβατική συμπεριφορά ενός δυναμι- κού συστήματος, προτού φτάσει στη στα- θερή κατάσταση. Πρόλογος Το βιβλίο είναι αποτέλεσμα της εντεκάχρονης εμπειρίας μου στη διδα- σκαλία τριών εισαγωγικών μαθημάτων με θέμα την υπολογιστική φυ- σική και τον επιστημονικό προγραμματισμό στο Εθνικό Μετσόβιο Πολυ- τεχνείο. Απευθύνεται, κυρίως, σε τριτοετείς και τεταρτοετείς φοιτητές των φυσικών επιστημών και των επιστημών του μηχανικού. Τα πρώτα του κεφάλαια μπορούν να διδαχθούν χωρίς πρόβλημα και σε δευτεροε- τείς φοιτητές που έχουν παρακολουθήσει τα βασικά μαθήματα φυσικής και μαθηματικής ανάλυσης, τα οποία διδάσκονται στο πρώτο έτος σε ένα οποιοδήποτε τμήμα θετικών επιστημών. Το υλικό που παρουσιάζε- ται στο βιβλίο μπορεί να διδαχθεί άνετα σε δύο εξαμηνιαία μαθήματα, συμπεριλαμβανομένων και των εργαστηριακών ασκήσεων. Το βασικό κίνητρο που με οδήγησε στη συγγραφή του βιβλίου είναι, καταρχήν, η απουσία ελληνικής βιβλιογραφίας η οποία να θεραπεύει τα θέματα που παρουσιάζονται στα περιεχόμενά του σε προπτυχιακό επίπεδο, αλλά και η ανάγκη μου να δείξω στους δικούς μου φοιτητές όλες τις τεχνικές λεπτομέρειες ενός αριθμητικού υπολογισμού σε ένα επιστημονικό μοντέλο, από τον σχεδιασμό μέχρι την υλοποίηση και την ανάλυση των αποτελεσμάτων. Οι φοιτητές μου αντιμετωπίζουν περισ- σότερες δυσκολίες στον προγραμματισμό και στον χειρισμό των δεδο- μένων, παρά στην κατανόηση των φυσικών εννοιών. Το βιβλίο δεν αποσκοπεί στο να γίνει ένα βιβλίο αναφοράς για τα θέματα που διαπραγματεύεται, αλλά να διδάξει βήμα-βήμα πώς να λυθεί ένα επιστημονικό πρόβλημα με υπολογιστικές μεθόδους. Τονίζεται πως, για να επιτευχθούν οι εκπαιδευτικοί στόχοι, είναι απαραίτητο ο αναγνώστης να εργάζεται, ταυτόχρονα με τη μελέτη του βιβλίου, πάνω στον προσωπικό του υπολογιστή και να υλοποιεί τα γραφόμενα. Το μάθημα το διδάσκω, ακολουθώντας την παραπάνω φιλοσοφία, μέσα σε ένα εργαστήριο υπολογιστών, όπου οι φοιτητές ασκούνται ταυτόχρονα με τη διδασκαλία της ύλης. Οι απαραίτητες υπολογιστικές δεξιότητες διδάσκονται με τη μέθοδο του παραδείγματος και, για τον λόγο αυτό, καλό είναι η ύλη να διδα- xvii xviii ΠΡΟΛΟΓΟΣ χθεί με τη σειρά που παρουσιάζεται στο βιβλίο. Στο πρώτο κεφάλαιο, παρουσιάζονται οι απολύτως απαραίτητες έννοιες και η εμβάθυνση επι- τυγχάνεται στην πράξη, λύνοντας προβλήματα (όπως και στον πραγμα- τικό κόσμο...). Η λύση των προβλημάτων παρουσιάζεται σε διαφορετικά επίπεδα υπολογιστικής δεξιοτεχνίας και, ανάλογα με το επίπεδο του αναγνώστη, μπορούν να λυθούν χρησιμοποιώντας απλά ή σύνθετα ερ- γαλεία. Σε κάθε κεφάλαιο παρατίθεται βιβλιογραφία που έχει στόχο να βοηθήσει τον αναγνώστη να εμβαθύνει τη γνώση του πάνω σε ζητήματα που δεν υπάρχει αρκετός χώρος να αναπτυχθούν στο βιβλίο. Ένας άλλος βασικός στόχος του βιβλίου είναι να βοηθήσει τον ανα- γνώστη να αποκτήσει εμπειρία και στερεό υπόβαθρο, προκειμένου, αν θέλει, να προχωρήσει σε αριθμητικούς υπολογισμούς υψηλής απόδοσης. Για τον λόγο αυτό, ως γλώσσα προγραμματισμού των βασικών προ- γραμμάτων που υλοποιούν έναν αλγόριθμο υψηλών αριθμητικών απαι- τήσεων έχει επιλεγεί η Fortran. Η γλώσσα αυτή είναι δημοφιλής σε ομάδες που προγραμματίζουν επιστημονικά προγράμματα στους σημε- ρινούς υπερυπολογιστές. Είναι δομημένη με σκοπό να κάνει εύκολο τον προγραμματισμό αριθμητικών αλγόριθμων υψηλών απαιτήσεων, έχει τους πιο αποδοτικούς μεταγλωττιστές στη βελτιστοποίηση εκτέλεσης προγραμμάτων και ένα μεγάλο μέρος αριθμητικών βιβλιοθηκών έχουν προγραμματιστεί στη γλώσσα αυτή. Από παιδαγωγικής άποψης είναι μια πολύ απλή γλώσσα, που επιτρέπει στον μη έμπειρο προγραμματι- στή να αρχίσει να προγραμματίζει άμεσα ένα αριθμητικό πρόβλημα, χω- ρίς να χρειάζεται να καθορίσει δευτερεύουσας σημασίας παραμέτρους του υπολογιστικού περιβάλλοντος. Η εκτέλεση των προγραμμάτων και η ανάλυση των αποτελεσμάτων γίνεται σε ένα λειτουργικό σύστημα της οικογένειας του Unix (όπως είναι λ.χ. το Linux), εμπλουτισμένο από την πλούσια και πανίσχυρη εργαλειοθήκη GNU. Η τελευταία παρέχε- ται ελεύθερα από την FSF⁸ και είναι απαραίτητη για τον πολύπλοκο χειρισμό δεδομένων που απαιτούνται σε ένα ερευνητικό πρόγραμμα. Η Fortran δεν είναι η καλύτερη επιλογή για τον προγραμματισμό λειτουρ- γιών στις οποίες είναι απαραίτητος ο χειρισμός πολύπλοκων αντικειμέ- νων ή η σε βάθος αλληλεπίδραση με το λειτουργικό σύστημα. Η φιλοσο- φία είναι να αφήσει κάποιος τη Fortran να κάνει αυτό για το οποίο έχει φτιαχτεί να κάνει καλύτερα (αριθμητικούς υπολογισμούς) και να ανα- θέσει τον χειρισμό των δεδομένων και τη διαχείριση του συστήματος σε άλλα, εξωτερικά, εργαλεία. Εργαλεία όπως η awk, ο προγραμματισμός του φλοιού, το gnuplot, η Perl και άλλα, είναι πολύ ισχυρά και ευέλι- κτα, και συμπληρώνουν τις αδυναμίες της Fortran. Το πρόγραμμα που ⁸Free Software Foundation, www.fsf.org xix χρησιμοποιείται στην απεικόνιση των δεδομένων είναι το gnuplot, το οποίο παρέχει πανίσχυρα εργαλεία χειρισμού των δεδομένων και δη- μιουργίας μεγάλου αριθμού από πολύπλοκες γραφικές παραστάσεις. Όλα τα εργαλεία που χρησιμοποιούνται στο βιβλίο δίνονται με άδεια ανοιχτού λογισμικού και είναι προσβάσιμα χωρίς χρέωση. Μπορούν να χρησιμοποιηθούν σε περιβάλλον Linux, Windows και Mac OS. Η πιο δύσκολη έννοια που πρέπει να εμπεδωθεί σε ένα μάθημα επι- στημονικού προγραμματισμού, είναι ότι ο τρόπος λύσης ενός προβλή- ματος με αριθμητική μέθοδο είναι τελείως διαφορετικός από τον τρόπο που λύνεται αναλυτικά. Συνήθως, οι φοιτητές προσέρχονται έχοντας ένα ισχυρό υπόβαθρο στην ανάλυση και τη θεμελιώδη πανεπιστημιακή φυ- σική και είναι δύσκολο να τους εξηγήσεις πώς μπορείς να λύσεις ένα πρόβλημα ανάλυσης, χρησιμοποιώντας μόνο απλές αριθμητικές πρά- ξεις. Ακόμα πιο δύσκολο είναι να γίνει κατανοητό πως το πρόβλημα λύνεται, συνήθως, με τη διακριτοποίηση ενός μοντέλου ορισμένου στο συνεχές, κάτι το οποίο μπορεί να γίνει με πολλούς τρόπους, ανάλογα με τις ανάγκες ακρίβειας και χρήσης υπολογιστικών πόρων. Η προσεγ- γιστική αριθμητική λύση πρέπει να προεκταθεί στο απειροστικό όριο, έτσι ώστε ληφθεί η αναλυτική λύση με ικανοποιητική ακρίβεια. Το βιβλίο προσπαθεί να εκθέσει τον αναγνώστη σε αυτή την ιδέα προοδευτικά, αρχίζοντας από προβλήματα απλής κίνησης σωματιδίων και φτάνοντας στην παρουσίαση της μεθόδου βάθμισης πεπερασμένου μεγέθους στη στατιστική φυσική ενός μοντέλου που βρίσκεται στην περιοχή μιας συ- νεχούς μετάβασης φάσης. Το βιβλίο δίνεται μαζί με συνοδευτικό υλικό που μπορεί να βρεθεί και στην ιστοθέση του ⁹. Το συνοδευτικό λογισμικό περιέχει όλα τα προ- γράμματα που παρουσιάζονται στο βιβλίο, μαζί με χρήσιμα εργαλεία και λύσεις μερικών από τα προβλήματα. Κάθε κεφάλαιο συμπληρώνε- ται από ασκήσεις που ο αναγνώστης πρέπει να λύσει για να αποκτήσει “hands on” εμπειρία στον επιστημονικό προγραμματισμό. Ελπίζω πως έχω ήδη τονίσει αρκετά, πως είναι απαραίτητο ο αναγνώστης να εκτε- λεί τις εντολές που παρουσιάζονται στο βιβλίο κατά τη διάρκεια της μελέτης του. Σας εύχομαι μια δημιουργική εμπειρία επιστημονικού προγραμμα- τισμού! Αθήνα 2015. ⁹www.physics.ntua.gr/˜konstant/ComputationalPhysics/ xx ΠΡΟΛΟΓΟΣ ΚΕΦΑΛΑΙΟ 1 Ο Υπολογιστής Σκοπός του κεφαλαίου αυτού είναι να θέσει τα θεμέλια για την ανά- πτυξη δεξιοτήτων χρήσης των υπολογιστικών εργαλείων που θα χρησι- μοποιήσουμε στη μελέτη των υπολογιστικών προβλημάτων που παρου- σιάζονται στα επόμενα κεφάλαια. Δεν έχει σκοπό να κάνει πλήρη και εις βάθος παρουσίαση, είναι μάλλον πρακτική εκμάθηση μέσω παραδειγ- μάτων. Άλλωστε υπάρχουν πολλές πλήρεις και παιδαγωγικές παρου- σιάσεις του υλικού που θα παρουσιάσουμε σε πολλά βιβλία ελεύθερα διαθέσιμα στο διαδίκτυο ή/και σε βιβλία τα οποία ... έχουν κάποιο τί- μημα. Στη βιβλιογραφία θα σας δοθούν αρκετές προτάσεις για μελέτη σε διαφορετικά επίπεδα εμβάθυνσης. Σε κάθε περιβάλλον εργασίας ενός υπολογιστικού προγράμματος, είναι ανάγκη να γίνουν επιλογές. Αυτές εξαρτώνται από τις συγκεκρι- μένες ανάγκες του προγράμματος: Απαιτήσεις αριθμητικής αποτελε- σματικότητας, μικρή/μεγάλη ομάδα εργασίας, πολυπλοκότητα κώδικα, ανάγκες για αναβαθμίσεις ... αναμνήσεις από το μέλλον. Εμείς εδώ θα διαλέξουμε να πάρουμε ένα άρωμα από τις ανάγκες ενός προγράμματος με κατεύθυνση επιστημονική/υπολογιστική. Ενός προγράμματος με μεγάλες ανάγκες σε εκμετάλλευση των υπολογιστι- κών πόρων για γρήγορους αριθμητικούς υπολογισμούς και για ευέλικτη ανάλυση (...πολλών) δεδομένων. Ένα τέτοιο περιβάλλον που προσφέρει ευελιξία, αξιοπιστία, απλότητα, δυνατά εργαλεία για ανάλυση δεδομέ- νων και μεταγλώττιση προγραμμάτων και που προσφέρει στο χρήστη τη δυνατότητα να κάνει αποδοτικότερη χρήση των υπολογιστικών πόρων του συστήματός του είναι η ομάδα λειτουργικών συστημάτων Unix. Η σύγχρονη, δημοφιλής και ελεύθερα διαθέσιμη έκδοση τέτοιου συστήμα- τος είναι το GNU/Linux¹, μια προσπάθεια η οποία πραγματοποιήθηκε ¹www.gnu.org 1 2 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ χάρη στην εθελοντική δουλειά εκατομμυρίων προγραμματιστών παγκο- σμίως και που βασίστηκε στην ιδέα του Ελεύθερου Λογισμικού (όχι με την έννοια “τσάμπα”, αλλά με την έννοια της ελεύθερης διακίνησης ιδεών στο λογισμικό) που θεμελίωσε ο Richard Stallman². Η γλώσσα προγραμματισμού που θα διαλέξουμε είναι η 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, ...), αλλά γίνονται απαγορευτικά αργές για απαιτητικά ²www.stallman.org 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 3 προβλήματα. Ο χρόνος προγραμματισμού τους όμως είναι πολύ μικρό- τερος και ο προγραμματιστής θα πρέπει να εξετάσει αν μπορεί να λύσει το πρόβλημά του με τη βοήθειά τους, προτού αρχίσει να σχεδιάζει ένα πρόγραμμα σε μία γλώσσα όπως η Fortran. Τέλος, αρκετές από τις εντολές του λειτουργικού συστήματος που θα συζητήσουμε παρακάτω, ερμηνεύονται έτσι μόνο από το φλοιό tcsh. Αυτή είναι μία ακόμα από τις επιλογές μας και δε θα αναλύσουμε τις διαφορές με άλλους φλοιούς έτσι ώστε η παρουσίαση να μη γίνει πολυπλοκότερη από όσο χρειάζεται. 1.1 Το Λειτουργικό Σύστημα Έχετε βρεθεί στην κατάσταση να θέλετε να λύσετε ένα πρόβλημα και το πολυδιαφημισμένο και ακριβοπληρωμένο λογισμικό σας που “ψήνει και καφέ” να μην μπορεί να κάνει αυτό που αρχικά δεν προβλέψατε ότι θα ήταν αναγκαίο να γίνει; Η λύση σε αυτό το πρόβλημα είναι ένα περιβάλλον στο οποίο οι πολύπλοκες διεργασίες να καταμερίζονται σε διαφορετικά εργαλεία τα οποία επιλέγονται και συνδυάζονται με ευελιξία ανάλογα με τις ανάγκες του υπολογισμού. Αυτή είναι η βασική φιλοσοφία των λειτουργικών συστημάτων τύπου Unix. Θεμελιώδης αρχή στο σύστημα αυτό είναι ότι όλα τα δομικά του χαρακτηριστικά είναι αρχεία, είτε πρόκειται για δεδομένα σε μορφή κειμένου, είτε εκτελέσιμα προγράμματα σε γλώσσα μηχανής, είτε σκλη- ροί δίσκοι, εξωτερικές συσκευές, οθόνες, κάρτες ήχου ... Άρα, το πρώτο που πρέπει να κατανοήσουμε είναι η δομή του συστήματος αρχείων (filesystem). 1.1.1 Filesystem Καταρχήν, σε κάθε αρχείο μας οδηγεί ένα ... μονοπάτι (path). Υπάρχουν δύο τρόποι να γράψουμε ένα path. Το σχετικό (relative) και το απόλυτο (absolute). Δύο παραδείγματα είναι: bin / RungeKutta / rk . exe / home / george / bin / RungeKutta / rk . exe Στα παραπάνω και τα δύο μπορεί να αναφέρονται στο ίδιο αρχείο, μπο- ρεί όμως και σε διαφορετικό. Εξαρτάται “που είμαστε”. Αν “είμαστε” στον κατάλογο /home/george/, τότε αναφερόμαστε στο ίδιο αρχείο. Αν είμαστε στον κατάλογο /home/john/ ή /home/george/CompPhys/, τότε 4 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ όχι. Στις τελευταίες περιπτώσεις από το 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, ....), όλα αναρ- τώνται στο ίδιο λογικά σύστημα αρχείων. Ο χρήστης/διαχειριστής έχει απόλυτη ελευθερία να τα βάλει εκεί που αυτή/ός θέλει³. Το 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: ³Αυτό δίνει μια δυνατή αίσθηση ελευθερίας, από την άλλη είναι η αρχή του ... χάους. Ιστορικά αυτό δημιούργησε έναν πύργο της Βαβέλ για συστήματα Unix και αποτέλεσε και έναν από τους κύριους λόγους που άλλα, σαφώς κατώτερης ποιότητας, λειτουργικά συστήματα επικράτησαν στην αγορά των PC. 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 5 Σχήμα 1.1: To filesystem στο Unix. Στην κορυφή έχουμε τη ρίζα (root directory) του συστήματος αρχείων, τον κατάλογο /. Κάθε κατάλογος περιέχει αρχεία, μεταξύ των οποίων και υποκαταλόγους. Κάθε κατάλογος έχει έναν και μοναδικό γονεϊκό κατάλογο (parent directory) που συμβολίζεται με .. (δύο τελείες). Ο / έχει για γονεϊκό κατάλογο τον εαυτό του. . . / . . / Doc / lyrics . doc ~/ Doc / lyrics . doc ~george / Doc / lyrics . doc . / . . / . . / Doc / lyrics . doc Εισάγουμε τώρα παρακάτω τις βασικές εντολές για να πλοηγούμα- στε στο filesystem⁴. Η εντολή cd (change directory) αλλάζει τον τρέχοντα κατάλογο, ενώ η pwd (print working directory) μας αναφέρει τον τρέχο- ντα κατάλογο: > cd / usr / bin ⁴Οι εντολές που αρχίζουν με > είναι εντολές που δίνονται από τη γραμμή εντολών και φυσικά ο αρχικός χαρακτήρας > δεν είναι μέρος της εντολής. Οι γραμμές χωρίς > είναι το κείμενο που τυπώνει η εντολή στο stdout (τερματικό). 6 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ > pwd / usr / bin > cd / usr / local / lib > pwd / usr / local / lib > cd > pwd / home / george > cd − > pwd / usr / local / lib > cd . . / . . / > pwd / usr Το όρισμα της εντολής cd είναι ένα absolute ή relative path στο οποίο (αν είναι σωστό και έχουμε την άδεια πρόσβασης) “μεταβαίνουμε”⁵. Εξαιρέσεις είναι να μη δοθεί όρισμα (πάμε στο home directory) ή ο χαρακτήρας - (πάμε εκεί που βρισκόμασταν πριν). Η εντολή mkdir δη- μιουργεί καινούργιους καταλόγους, ενώ η rmdir τους σβήνει αν είναι άδειοι. Δοκιμάστε: > mkdir new > mkdir new / 0 1 > mkdir new / 0 1 / 0 2 / 0 3 mkdir : cannot create directory ‘ new / 0 1 / 0 2 / 0 3 ’ : No such file or directory > mkdir −p new / 0 1 / 0 2 / 0 3 > rmdir new rmdir : ‘ new ’ : Directory not empty > rmdir new / 0 1 / 0 2 / 0 3 > rmdir new / 0 1 / 0 2 > rmdir new / 0 1 > rmdir new Προσέξτε πως η mkdir δεν μπορεί να δημιουργήσει καταλόγους δύο επίπεδα πιο κάτω, ενώ η mkdir -p μπορεί. Ο “διακόπτης” -p αλλάζει τον τρόπο λειτουργίας της εντολής αυτής. Για να δούμε τα περιεχόμενα ενός καταλόγου χρησιμοποιούμε την εντολή ls: > ls BE . eps Byz . eps Programs srBE_xyz . eps srB_xyz . eps B . eps Bzy . eps srBd_xyz . eps srB_xy . eps ⁵Δηλαδή αλλάζει τον current directory της διεργασίας. 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 7 > l s Programs Backup rk3_Byz . f90 rk3 . f90 plot−commands rk3_Bz . f90 rk3_g . f90 Με την πρώτη εντολή βλέπουμε τα περιεχόμενα του καταλόγου που βρι- σκόμαστε, ενώ στη δεύτερη (προφανώς το αρχείο Programs είναι υπο- κατάλογος) τα περιεχόμενα του καταλόγου που βάζουμε στην εντολή σαν όρισμα. Ένας άλλος τρόπος να δώσουμε την εντολή είναι > l s -l total 252 -rw-r--r-- 1 george users 24284 May 1 12:08 BE . eps -rw-r--r-- 1 george users 22024 May 1 11:53 B . eps -rw-r--r-- 1 george users 29935 May 1 13:02 Byz . eps -rw-r--r-- 1 george users 48708 May 1 12:41 Bzy . eps drwxr -xr-x 4 george users 4096 May 1 23:38 Programs -rw-r--r-- 1 george users 41224 May 1 22:56 srBd_xyz . eps -rw-r--r-- 1 george users 23187 May 1 21:13 srBE_xyz . eps -rw-r--r-- 1 george users 24610 May 1 20:29 srB_xy . eps -rw-r--r-- 1 george users 23763 May 1 20:29 srB_xyz . eps O “διακόπτης ” (switch) -l κάνει την εντολή ls να συμπεριφερθεί διαφο- ρετικά. Μας δίνει τα περιεχόμενα του current directory μαζί με χρήσιμες πληροφορίες για τα αρχεία που περιέχει. Η πρώτη στήλη έχει κωδικο- ποιημένες τις άδειες χρήσης για κάθε αρχείο (βλ. παρακάτω). Η δεύτερη τον αριθμό των συνδέσμων (links) των αρχείων. Η τρίτη το όνομα του χρήστη (user = george) στον οποίο ανήκουν τα αρχεία. Η τέταρτη την ομάδα (group = users) του αρχείου⁶. Η πέμπτη το μέγεθος του αρχείου σε bytes = 8 bits. Οι επόμενες 3 τον χρόνο τελευταίας μετατροπής του αρχείου. Και τέλος, το όνομα του αρχείου. Οι άδειες πρόσβασης r, w, x είναι άδειες πρόσβασης για read, write, execute. Όποιος έχει άδεια r έχει άδεια να διαβάσει και να αντιγράψει ένα αρχείο. Όποιος έχει άδεια w μπορεί να μεταβάλλει τα περιεχόμενα ενός αρχείου. Όποιος έχει άδεια x μπορεί να εκτελέσει ένα αρχείο ως πρόγραμμα⁷. Ειδικά για τους καταλόγους, για να μπορεί ο χρήστης/ομάδα/κόσμος να “μπει” σε έναν κατάλογο με την εντολή cd πρέπει να έχει άδεια x. Για να μπορέσει να σβήσει ένα αρχείο πρέπει να έχει άδεια w στον κατάλογο που ανήκει. ⁶Ένας χρήστης μπορεί να ανήκει σε πολλές ομάδες για να διευκολύνεται η συνερ- γασία με διαφορετικές ομάδες χρηστών. Φυσικά κάθε ομάδα μπορεί να έχει πολλούς χρήστες για μέλη. ⁷Φυσικά το αν θα μπορέσει να εκτελεστεί σωστά είναι ευθύνη του χρήστη 8 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Οι άδειες χωρίζονται σε τρεις ομάδες: Ο ιδιοκτήτης του αρχείου (user- θέσεις 2-4), η ομάδα (group- θέσεις 5-7) και ο υπόλοιπος κό- σμος (others-θέσεις 8-10). Παραδείγματος χάρη -rw-r--r-- -rwxr----- drwx--x--x Στην πρώτη περίπτωση, ο ιδιοκτήτης έχει άδεια read, write, αλλά όχι execute και η ομάδα/κόσμος έχει μόνο άδεια read. Στη δεύτερη, ο χρήστης έχει άδεια read, write, execute, η ομάδα άδεια read και ο κόσμος τίποτα. Στην τρίτη, ο χρήστης έχει άδεια read, write, execute, η ομάδα/κόσμος άδεια execute. Ειδικά στην τρίτη βρίσκουμε το χαρα- κτήρα d στην πρώτη θέση που δηλώνει ότι το αρχείο είναι κατάλογος (directory). Η πρώτη αυτή θέση, όταν είναι “κατειλημμένη”, δηλώνει αρχείο ειδικού τύπου. Οι άδειες πρόσβασης αλλάζουν με την εντολή chmod: > chmod u+x file > chmod og−w file1 file2 > chmod a+r file Με την πρώτη εντολή ο ιδιοκτήτης (u≡ user) παίρνει (+) άδεια x στο αρχείο file. Με τη δεύτερη, ο κόσμος (o ≡ others) και η ομάδα (g≡ group) χάνουν (-) άδεια w, ενώ στην τρίτη όλοι (a≡ all) αποκτούν άδεια πρόσβασης r. Τελειώνουμε την παράγραφο αυτή αναφέροντας μερικές ακόμα βα- σικές εντολές που αναφέρονται στη διαχείριση των αρχείων. Η εντολή cp (copy) φτιάχνει αντίγραφα αρχείων: > cp file1 . f90 file2 . f90 > cp file1 . f90 file2 . f90 file3 . f90 Programs Η πρώτη εντολή αντιγράφει τα δεδομένα του αρχείου file1.f90 σε ένα καινούργιο αρχείο file2.f90, αν αυτό δεν υπάρχει ήδη, ή αντι- καθιστά το αρχείο file2.f90 από ένα καινούργιο με τα περιεχόμενα του file1.f90. Η δεύτερη αντιγράφει τα αρχεία file1.f90 file2.f90 file3.f90 στον κατάλογο Programs (αν δεν είναι κατάλογος εισπράτ- τουμε ... παράπονα). Η εντολή mv (move) “μετακινεί” ή μετονομάζει αρχεία: 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 9 > mv file1 . f90 file2 . f90 > mv file1 . f90 file2 . f90 file3 . f90 Programs Η πρώτη εντολή έχει ως αποτέλεσμα να μετονομάσει το αρχείο file1.f90 σε file2.f90. Η δεύτερη εντολή μετακινεί τα αρχεία file1.f90 file2.f90 file3.f90 στον κατάλογο Programs. Τέλος, η εντολή rm (remove) διαγράφει αρχεία⁸. Η εντολή αυτή δε “χαρίζει κάστανα”. Όταν το αρχείο διαγράφεται, το λειτουργικό σύ- στημα δεν μπορεί να το επαναφέρει. Προσοχή λοιπόν > ls file1 . f90 file2 . f90 file3 . f90 file4 . csh > rm file1 . f90 file2 . f90 file3 . f90 > ls file4 . csh τα αρχεία file1.f90 file2.f90 file3.f90 δεν υπάρχουν πια για το λειτουργικό σύστημα⁹. Για να είμαστε πιο προσεκτικοί μπορούμε να χρησιμοποιήσουμε τον διακόπτη -i. Τότε η εντολή ζητάει επιβεβαίωση πριν την καταστροφή: > rm −i * rm : remove regular file ‘ file1 . f90 ’ ? y rm : remove regular file ‘ file2 . f90 ’ ? y rm : remove regular file ‘ file3 . f90 ’ ? y rm : remove regular file ‘ file4 . csh ’ ? n > ls file4 . csh Στην τελευταία γραμμή απαντήσαμε αρνητικά και έτσι το αρχείο file4.csh δεν διαγράφτηκε. Η εντολή rm δε διαγράφει καταλόγους. Χρησιμοποιήστε την εντολή rmdir για τη διαγραφή άδειων καταλόγων. Για να διαγράψετε καταλό- γους με περιεχόμενα χρησιμοποιήστε την εντολή¹⁰ rm -r. Λ.χ. έστω ότι έχουμε στους καταλόγους dir1 και dir1/dir2 τα αρχεία: ⁸Στην πραγματικότητα αφαιρεί “links” (συνδέσεις στο filesystem μίας διαμέρισης- partition) αρχείων. Ένα αρχείο μπορεί να έχει ένα ή περισσότερα links στην ίδια διαμέριση ενός filesystem. Ένα αρχείο θεωρείται διαγραμμένο, όταν αφαιρεθούν όλα τα links του. ⁹Αυτό δε σημαίνει ότι τα δεδομένα τους δεν υπάρχουν πια στο δίσκο... Καταρχήν τα αρχεία μπορεί να έχουν παραπάνω από ένα link οπότε είναι προσβάσιμα από τα άλλα links. Ακόμα και αν αφαιρεθούν όλα τα links είναι δυνατόν κάποιος/α να ανακτήσει (μέρος του) αρχείου με εξειδικευμένα εργαλεία. ¹⁰Ένα rm -r * και τα δεδομένα σας αποτελούν ιστορία... 10 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ . / dir1 . / dir1 / file2 . f90 . / dir1 / file1 . f90 . / dir1 / dir2 . / dir1 / dir2 / file3 . f90 Οι εντολές > rm dir1 rm : cannot remove ‘ dir1 ’ : Is a directory > rm dir1 / dir2 rm : cannot remove ‘ dir1 / dir2 ’ : Is a directory > rmdir dir1 rmdir : dir1 : Directory not empty > rmdir dir1 / dir2 rmdir : dir1 / dir2 : Directory not empty > rm −r dir1 Με την τελευταία εντολή όλα τα παραπάνω αρχεία διαγράφονται. Εναλ- λακτικά, πρώτα αδειάζουμε τους καταλόγους από τα αρχεία και μετά τους διαγράφουμε με rmdir: > cd dir1 / dir2 ; rm file3 . f90 > cd . . ; rmdir dir2 > rm file1 . f90 file2 . f90 > cd . . ; rmdir dir1 Παρατηρήστε ότι το ελληνικό ερωτηματικό (semicolon = “;”) χωρίζει εντολές οι οποίες εκτελούνται η μία μετά την άλλη. 1.1.2 Εντολές Οι εντολές στο Unix είναι, όπως είπαμε, αρχεία με άδεια πρόσβασης x (execute). Όταν στη γραμμή εντολών γράψουμε μία πρόταση λ.χ. > l s −l test . f90 test . dat ο φλοιός (το πρόγραμμα με το οποίο ο χρήστης αλληλεπιδρά με το λειτ. σύστημα) την ερμηνεύει ως εξής: Η πρόταση χωρίζεται σε λέξεις και η πρώτη λέξη (ls) ερμηνεύεται ως εντολή. Οι υπόλοιπες περνάνε στην εντολή ως τα ορίσματά της. Κατά σύμβαση, λέξεις που αρχίζουν από τον χαρακτήρα - (λ.χ. -l, --help, --version, -O3) έχουν συνήθως ειδική ερμηνεία και ονομάζονται “διακόπτες” (options, switches) και 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 11 κάνουνε το πρόγραμμα να εκτελείται με διαφορετικό τρόπο ανάλογα με τις τιμές τους. Είδαμε ήδη τη διαφορά με το πρόγραμμα ls που ανάλογα με το αν το καλούμε ως “ls” ή “ls -l”, τα αποτελέσματα τυπώνονται με διαφορετικό τρόπο. Για να εκτελεστεί η εντολή ls ο φλοιός αναζητεί ένα αρχείο με το όνομα ls που να έχει άδεια πρόσβασης x. Για να καταλάβουμε πώς γίνεται η αναζήτηση αυτή πρέπει να εξηγήσουμε τι είναι οι μεταβλητές φλοιού και οι μεταβλητές περιβάλλοντος. Αυτές έχουν ένα όνομα που δίνεται από μια ακολουθία χαρακτήρων και οι τιμές τους λαμβάνονται προτάσσοντας τον χαρακτήρα $ στο όνομά τους. Έτσι η μεταβλητή με το όνομα PATH έχει τιμή $PATH. Οι τιμές των μεταβλητών περιβάλλοντος τίθενται με την εντολή¹¹ setenv για τις μεταβλητές περιβάλλοντος και με την εντολή set για τις μεταβλητές φλοιού: > s e t e n v MYVAR test−env > s e t myvar = test−s h e l l > echo $MYVAR $myvar test−env test−s h e l l Δύο μεταβλητές των οποίων αναλαμβάνει ο φλοιός να τις ορίσει σωστά στο περιβάλλον του χρήστη είναι οι PATH και path: >echo $path / usr / local / bin / usr / bin / bin / usr / X11 / bin >echo $PATH / usr / local / bin : / usr / bin : / bin : / usr / X11 / bin Βλέπουμε ότι η τιμή τους (που ο χρήστης μπορεί να αλλάξει!) αποτε- λείται από συνιστώσες που είναι διαδρομές στο σύστημα αρχείων. Στην πρώτη περίπτωση οι συνιστώσες χωρίζονται από κενό, ενώ στη δεύτερη από : (άνω-κάτω τελεία). Έτσι, επιστρέφοντας στην ερώτηση πώς βρίσκει ο φλοιός την εντολή ls, θα είναι ήδη φανερό πως ψάχνει κάθε συνιστώσα της τιμής της μεταβλητής path μέχρι να τη βρει. Αν είστε περίεργοι, δώστε τις εντολές > which l s / bin / l s > l s −l / bin / l s −rwxr−xr−x 1 root root 93560 Sep 28 2006 / bin / l s ¹¹Η εντολή setenv είναι ειδική για το φλοιό tcsh. Στο φλοιό bash αρκεί να καθορί- σετε την τιμή με ένα =: π.χ. MYVAR=test-env. 12 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ από όπου είναι προφανές ότι το ζητούμενο αρχείο είναι το /bin/ls. Αν η διαδικασία αποτύχει, ο φλοιός δίνει μήνυμα σφάλματος. Αν πετύχει, το πρόγραμμα φορτώνεται από το λειτουργικό σύστημα στη μνήμη για εκτέλεση. Τα ορίσματα περνάνε στην εντολή, ώστε αυτή να τα ερμηνεύ- σει όπως έχει προγραμματιστεί. Στην εντολή > l s −l test . f90 test . dat το όρισμα -l είναι διακόπτης που ερμηνεύεται από την εντολή να δώσει long listing των αρχείων. Τα ορίσματα test.f90 και test.dat ερμηνεύ- ονται από την εντολή ως τα αρχεία που θα αναζητήσει για να μας δώσει πληροφορίες. Μία σημαντική πληροφορία στην ερμηνεία των ορισμάτων είναι η χρήση “μπαλαντέρ” (wildcard): > l s −l * . f90 * . dat θα κάνει τον φλοιό να αναπτύξει τα αστεράκια πριν να περάσει τα ορίσματα στο πρόγραμμα σε οποιαδήποτε ακολουθία χαρακτήρων δίνει ένα υπάρχον αρχείο. Έτσι, αν ο κατάλογος που βρισκόμαστε περιέχει τα αρχεία test.f90, test1.f90, myprog.f90, test.dat, hello.dat, η εντολή που θα “δει” το λειτουργικό είναι > l s −l myprog . f90 test1 . f90 test . f90 hello . dat test . dat Αυτό συμβαίνει για οποιαδήποτε άλλη εντολή. Σε κάθε εντολή συναρτάται η καθιερωμένη είσοδος stdin (standard input), η καθιερωμένη έξοδος stdout ( standard output) και η καθιερω- μένη έξοδος σφαλμάτων stderr (standard error). Αυτές είναι συμβάσεις για αρχεία στα οποία το πρόγραμμα μπορεί να διαβάζει ή να τυπώνει δεδομένα. Όταν ο χρήστης δουλεύει σε ένα τερματικό, όλες οι παρα- πάνω θεωρούνται αρχικά ότι είναι το τερματικό¹². Δηλ. μια εντολή που διαβάζει δεδομένα από το stdin, αυτά ο χρήστης θα τα εισάγει μέσω του τερματικού τυπώνοντάς τα με το πληκτρολόγιο. Αν μια εντολή τυ- πώνει στο stdout ή στο stderr, αυτά τυπώνονται στο τερματικό. Η δυνατότητα που δίνει μεγάλη ευελιξία στον χρήστη να χειριστεί τις εντολές είναι η δυνατότητα επαναορισμού των παραπάνω αρχείων. Ο χρήστης μπορεί να τα ορίσει να είναι οποιοδήποτε αρχείο. Ο επανα- ορισμός του stdout γίνεται με το σύμβολο >. ¹²Σας θυμίζουμε ότι για το Unix τα πάντα είναι αρχεία. 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 13 > ls file1 . f90 file2 . f90 file3 . f90 file4 . csh > l s > results > ls file1 . f90 file2 . f90 file3 . f90 file4 . csh results Στην πρώτη εντολή βλέπουμε τα περιεχόμενα του καταλόγου. Στη δεύ- τερη επαναορίζουμε το stdout να είναι το αρχείο results. Μετά την εκτέλεση της εντολής παρατηρούμε τη δημιουργία του αρχείου results το οποίο περιέχει σαν δεδομένα τα ονόματα των αρχείων file1.f90 file2.f90 file3.f90 file4.csh. Αν το αρχείο results δεν υπάρχει, δη- μιουργείται, αν υπάρχει, τα περιεχόμενα του καταστρέφονται και αντι- καθίστανται από το stdout της εντολής. Για να επισυνάψουμε (append) τα δεδομένα του stdout στο τέλος ενός ήδη υπάρχοντος αρχείου, χρη- σιμοποιούμε το σύμβολο ≫. Έτσι, αν μετά από τις παραπάνω εντολές εκτελέσουμε > l s >> results τότε τα περιεχόμενα του αρχείου results θα είναι file1 . f90 file2 . f90 file3 . f90 file4 . csh file1 . f90 file2 . f90 file3 . f90 file4 . csh results Ο επαναορισμός του stdin γίνεται με το σύμβολο <, ενώ του stderr με το σύμβολο >&¹³. Σχετικά παραδείγματα θα δούμε στην παράγραφο 1.2. Είναι δυνατόν το stdin/stdout μιας εντολής να οριστεί να είναι το stdout/stdin μιας άλλης εντολής. Με τον τρόπο αυτό μπορούν να συν- δυαστούν οι λειτουργίες διαφορετικών εντολών, έτσι ώστε να παράγουν αποτελέσματα για τα οποία θα χρειαζόταν να γράψουμε ένα αρκετά πολύπλοκο πρόγραμμα για να τα πάρουμε. Η διαδικασία αυτή λέγεται “διασωλήνωση” (piping) και χρησιμοποιείται κυρίως για τη δημιουργία ισχυρών φίλτρων. Για τον σκοπό αυτό χρησιμοποιείται το σύμβολο | > cmd1 | cmd2 | cmd3 | ... | cmdN Με την παραπάνω πρόταση το stdout της εντολής cmd1 γίνεται stdin της εντολής cmd2, το stdout της εντολής cmd2 γίνεται stdin της εντολής ¹³Το >& ισχύει μόνο για το φλοιό tcsh. Για άλλους φλοιούς (bash,sh,...) διαβάστε τη σχετική βοήθεια. 14 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ cmd3 κοκ. Σχετικά παραδείγματα θα δούμε στη παράγραφο 1.2. 1.1.3 Αναζητώντας Βοήθεια Το Unix απέκτησε τη φήμη λειτουργικού συστήματος μη φιλικού προς τον χρήστη. Τίποτα δεν απέχει περισσότερο από την πραγματικότητα. Παρόλο που έχει μια αρχική δυσκολία, η οποία λύνεται αν ο χρήστης μεθοδικά διαβάσει και εξασκηθεί στις βασικές εντολές του συστήματος, στη συνέχεια, όλες οι πληροφορίες για να κάνει ο χρήστης οτιδήποτε είναι διαθέσιμες online¹⁴. Το κλειδί για άνετη πλεύση σε αυτό το ταξίδι είναι να μάθει ο χρή- στης να χρησιμοποιεί το σύστημα βοήθειας που παρέχεται εντός και εκτός συστήματος. Οι περισσότερες εντολές παρέχουν βασικές πληρο- φορίες από μόνες τους. Από τη γραμμή εντολών, για τυχαία εντολή cmd δοκιμάστε: > cmd --help > cmd -h > cmd -help > cmd -\? Για παράδειγμα, δώστε την εντολή ls --help. Αν είναι εφαρμογή πα- ραθυρική, αρχίστε από το σχεδόν πάντοτε διαθέσιμο menu “Help”. Μη φοβηθείτε να διαβάσετε... Ας υποθέσουμε πως έχουμε ακούσει κάτι για μια εντολή που λέγεται printf ή κάτι τέτοιο τέλος πάντων. Το πρώτο σύστημα βοήθειας είναι τα man pages. Αυτό είναι ένα σύστημα από help files που τα αναζητούμε με την εντολή man: > man p r i n t f Η εντολή info δίνει περισσότερες πληροφορίες σε μορφή “βιβλίου” με βασικές δυνατότητες ξεφυλλίσματος (browsing). > info printf οι εντολές ¹⁴Σε αντίθεση με άλλα δημοφιλή λειτουργικά συστήματα τα οποία είναι “μαύρα κουτιά”. 1.1. ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ ΣΥΣΤΗΜΑ 15 > man −k p r i n t f > whatis p r i n t f μας πληροφορούν ότι υπάρχουν και άλλες, πιθανώς σχετιζόμενες εντο- λές fprintf, fwprintf, wprintf, sprintf.... Ειδικά το αποτέλεσμα της δεύτερης το παραθέτουμε γιατί είναι διδακτικό: > whatis p r i n t f printf (1) − format and p r i n t data printf (1 p ) − write formatted output printf (3) − formatted output conversion printf (3 p ) − p r i n t formatted output p r i n t f [ builtins ] (1) − bash built−in commands , see bash←- (1) Η δεύτερη στήλη είναι το “τμήμα” (section) των man pages στο οποίο αναφέρεται η εντολή. Η πρόσβαση στα τμήματα γίνεται δίνοντας το σαν όρισμα στην εντολή: > man 1 printf > man 1p p r i n t f > man 3 printf > man 3p p r i n t f > man bash δίνει πρόσβαση στις αντίστοιχες πληροφορίες. Στο τμήμα ένα βρίσκουμε το printf ως “κοινή εντολή”, στο τμήμα 3 ως συνάρτηση της γλώσσας C. Άλλα τμήματα είναι το 2 (εντολές διαχείρισης συστήματος), 4, 5, 8 κλπ. Περιηγηθείτε στον κατάλογο /usr/share/man/ για να δείτε με τα μάτια σας περισσότερα. Δίνοντας την εντολή > p r i n t f --help παίρνουμε πάλι αρκετή πληροφορία. Η εντολή > locate printf μας δείχνει πολλά σχετικά αρχεία στο σύστημα. Οι εντολές > which p r i n t f > where p r i n t f 16 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ μας δίνουν πληροφορία για το πού βρίσκονται τα αρχεία-προγράμματα που εκτελούνται, όταν δίνεται η εντολή printf. Μια άλλη σημαντική ευκολία που μας προσφέρει ο φλοιός είναι η “συμπλήρωση εντολών”. Μπορούμε να γράψουμε μέρος του ονόματος μιας εντολής και να πατήσουμε τον συνδυασμό πλήκτρων [Ctrl-d]¹⁵ (δηλ. ταυτόχρονα το πλήκτρο Ctrl και το πλήκτρο d). Τότε ο φλοιός θα μας συμπληρώσει όλες τις εντολές των οποίων το όνομα αρχίζει με τα γράμματα που έχουμε ήδη γράψει¹⁶: > pri [ Ctrl−d ] printafm printf printenv printnodetest Δοκιμάστε λ.χ. την εντολή x[Ctrl-d] και θα μάθετε (σχεδόν) τα πάντα για τις εντολές διαθέσιμες στο παραθυρικό σύστημα X: xterm, xeyes, xclock, xcalc, .... Τέλος, μεγάλη πηγή πληροφοριών είναι το διαδίκτυο. Google your blues... και θα εκπλαγείτε πόσοι άλλοι έχουν ασχοληθεί με το πρόβλημά σας. 1.2 Εργαλεία Επεξεργασίας Κειμένου – Φίλ- τρα Για την ανάλυση των δεδομένων που θα παράγουμε χρειαζόμαστε ερ- γαλεία τα οποία να επεξεργάζονται ευέλικτα τα αρχεία κειμένου¹⁷. Με- ρικά εργαλεία που μπορούν να φτιάξουν περίπλοκα και ισχυρά φίλτρα είναι τα προγράμματα cat, less, head, tail, grep, sort και awk. Ας αναφέρουμε και τα προγράμματα perl και sed για τον αναγνώστη που ενδιαφέρεται να πλουτίσει το οπλοστάσιό του, παρόλο που δε θα τα περιγράψουμε εδώ λόγω χώρου. Ας υποθέσουμε ότι έχουμε το αρχείο με δεδομένα με όνομα data¹⁸ με τα περιεχόμενα μιας αποθήκης τροφίμων και το κοστολόγιό τους: bananas 100 pieces 1 . 4 5 ¹⁵Στο φλοιό bash πατήστε ένα ή δύο [Tab]. ¹⁶Με τον ίδιο τρόπο γίνεται και συμπλήρωση ονομάτων αρχείων. Γράψτε μερικώς το όνομα ενός αρχείου στο όρισμα μιας εντολής και πατήστε [Tab] ή [Ctrl-d]. ¹⁷Εδώ εννοούμε αρχεία που αποτελούνται από εκτυπώσιμους χαρακτήρες ASCII ή UTF. Δεν εννοούμε τα μορφοποιημένα αρχεία κειμένου - έγγραφα - τύπου .odt, .doc κλπ. ¹⁸Μπορείτε να βρείτε το αρχείο στο συνοδευτικό λογισμικό. 1.2. ΕΡΓΑΛΕΙΑ ΕΠΕΞΕΡΓΑΣΙΑΣ ΚΕΙΜΕΝΟΥ – ΦΙΛΤΡΑ 17 apples 325 boxes 1.18 pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 Η εντολή > c a t data απλά τυπώνει τα περιεχόμενα στο stdout. Η εντολή παίρνει τα αρχεία από το όρισμα της εντολής ή αν δε δοθούν, το stdin και τυπώνει τα περιεχόμενά τους στο stdout. Αφού αυτά μπορεί να επαναοριστούν, η εντολή > cat < data > data1 παίρνει τα περιεχόμενα του αρχείου data από το stdin και τα τυπώνει στο stdout που εδώ έχει επαναοριστεί να είναι το αρχείο data1. Η εντολή έχει ισοδύναμο αποτέλεσμα με την > cp data data1 Η εντολή > c a t data data1 > data2 τυπώνει πρώτα τα περιεχόμενα του data και μετά του data1 μέσα στο αρχείο data2. Η εντολή > l e s s g f o r t r a n . txt τυπώνει στο stdout τα περιεχόμενα του data σελίδα-σελίδα. Πατήστε [space] για να προχωρήσετε μια σελίδα, [b] για να γυρίσετε πίσω μια σελίδα και τα πάνω/κάτω βελάκια για να προχωρήστε μια γραμμή. Με [g] πάτε στην αρχή του αρχείου και με [G] στο τέλος. Με [h] παίρνετε βοήθεια και με [q]... αναχωρείτε (quit). Με τις εντολές > head −n 1 data bananas 100 pieces 1 . 4 5 18 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ > t a i l −n 2 data bread 62 kilos 0.60 ham 85 kilos 3.56 > t a i l −n 2 data | head −n 1 bread 62 kilos 0.60 παίρνουμε την πρώτη γραμμή του αρχείου data, τις δύο τελευταίες και την δεύτερη από το τέλος αντίστοιχα. Προσέξτε πώς με piping των δύο εντολών τις συνδυάσαμε για να φτιάξουμε το φίλτρο “τύπωσε τη δεύτερη γραμμή από το τέλος ”. Η εντολή sort τυπώνει τα περιεχόμενα του αρχείου κατά αύξουσα διάταξη των γραμμών, όπου η σύγκριση γίνεται χαρακτήρα–χαρακτήρα (όχι αριθμητικά): > s o r t data apples 325 boxes 1.18 bananas 100 pieces 1.45 bread 62 kilos 0.60 ham 85 kilos 3.56 pears 34 kilos 2.46 Για αντίστροφη διάταξη δοκιμάστε την εντολή sort -r data. Για να δια- τάξουμε τα περιεχόμενα συγκρίνοντας τους αριθμούς στη δεύτερη στήλη χρησιμοποιούμε τον διακόπτη -k 2 (=δεύτερη στήλη) και -n (=αριθμη- τική – numerical – διάταξη): > s o r t −k 2 −n data pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 bananas 100 pieces 1.45 apples 325 boxes 1.18 Αν αμελήσω τον διακόπτη -n οι γραμμές συγκρίνονται με βάση τους χαρακτήρες της λέξης στη δεύτερη στήλη: > s o r t −k 2 data bananas 100 pieces 1.45 apples 325 boxes 1.18 pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 Η τελευταία στήλη έχει αριθμούς με υποδιαστολή (όχι ακεραίους). Για 1.2. ΕΡΓΑΛΕΙΑ ΕΠΕΞΕΡΓΑΣΙΑΣ ΚΕΙΜΕΝΟΥ – ΦΙΛΤΡΑ 19 να κάνουμε τη διάταξη με βάση την αξία τέτοιων αριθμών βάζουμε το διακόπτη -g: > s o r t −k 4 −g data bread 62 kilos 0.60 apples 325 boxes 1.18 bananas 100 pieces 1.45 pears 34 kilos 2.46 ham 85 kilos 3.56 Η εντολή grep αναλύει ένα αρχείο κειμένου γραμμή–γραμμή ανα- ζητώντας μια ακολουθία χαρακτήρων που έχουμε ζητήσει. Κάθε τέτοια γραμμή που βρίσκει την τυπώνει στο stdout: > grep kilos data pears 34 kilos 2.46 bread 62 kilos 0.60 ham 85 kilos 3.56 τυπώνει κάθε γραμμή που έχει το “kilos”. Αν θέλουμε να τυπώνει κάθε γραμμή που δεν περιέχει το kilos, προσθέτουμε τον διακόπτη -v: > grep −v kilos data bananas 100 pieces 1 . 4 5 apples 325 boxes 1 . 1 8 Η ακολουθία χαρακτήρων που αναζητούμε μπορεί να είναι ένα regular expression. Για να περιγράψουμε πλήρως τα θηρία αυτά, θέλουμε μισό βιβλίο... Μερικά παραδείγματα: > grep ^b data bananas 100 pieces 1.45 bread 62 kilos 0.60 > grep ’0$ ’ data bread 62 kilos 0.60 > grep ’ 3 [ 2 4 ] ’ data apples 325 boxes 1.18 pears 34 kilos 2.46 Η πρώτη τυπώνει τις γραμμές που αρχίζουν από b (αγνοεί την 2η γραμμή), η δεύτερη αυτές που τελειώνουν σε 0 (αγνοεί την πρώτη γραμμή) ενώ η τρίτη γραμμές που περιέχουν τις ακολουθίες χαρακτή- ρων 32 ή 34 (αγνοεί την τελευταία γραμμή). 20 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Το πιο δυνατό όμως εργαλείο για ανάλυση είναι το πρόγραμμα awk. Στην πιο απλή του χρήση, αναλύει το κείμενο του αρχείου γραμμή– γραμμή και ορίζει μεταβλητές $1, $2, ... στις οποίες αποθηκεύει την τιμή της πρώτης, δεύτερης, ... λέξης της γραμμής. Στη μεταβλητή $0 αποθηκεύει όλη τη γραμμή, ενώ η μεταβλητή NF μετράει τον αριθμό των λέξεων στη γραμμή. Η μεταβλητή NR μετράει τις γραμμές που έχει επεξεργαστεί μέχρι στιγμής. Ένα πρόγραμμα awk μπορεί να γραφτεί στη γραμμή εντολών. Είναι εντολές που περικλείονται ανάμεσα σε αγκύλες { ... } και εκτελούνται για κάθε γραμμή του αρχείου. Ειδική περίπτωση αποτελούν οι εντολές που γράφονται μέσα στο κατασκεύασμα BEGIN{ ... } και END{ ... } που είναι εντολές που εκτελούνται μια φορά πριν την επεξεργασία και μετά την επεξεργασία των γραμμών του αρχείου. Για παράδειγμα η εντολή: > awk ’{ p r i n t $1 , ” t o t a l v a l u e= ” , $2 * $4 } ’ data bananas total value= 145 apples total value= 383.5 pears total value= 83.64 bread total value= 3 7 . 2 ham total value= 302.6 τυπώνει το είδος (1η στήλη= $1) και την συνολική αξία του: ποσότητα (2η στήλη= $2) × αξία μονάδας (4η στήλη= $4). Άλλα παραδείγματα είναι > awk ’{ value += $2 * $4 }END{ p r i n t ” T o t a l= ” , value } ’ data Total= 951.94 > awk ’{ av += $4 }END{ p r i n t ” Average P r i c e = ” , av / NR } ’ data Average Price= 1.85 > awk ’{ p r i n t $2^2 * sin ( $4 ) + exp(−$4 ) } ’ data Στην πρώτη εντολή υπολογίζουμε τη συνολική αξία των προϊόντων: Σε κάθε γραμμή προσθέτουμε (+=) στη μεταβλητή value την συνολική αξία του προϊόντος. Στο τέλος (END{ ... }) τυπώνουμε το άθροισμα που συσ- σωρεύσαμε στο τέλος του αρχείου. Η δεύτερη εντολή τυπώνει τη μέση τιμή των τιμών. Με τον ίδιο τρόπο προσθέτουμε στη μεταβλητή av την τιμή κάθε προϊόντος (2η στήλη= $2) και στο τέλος, τυπώνουμε το σύ- νολο δια τον αριθμό των προϊόντων (=αρ. γραμμών = NR). Η τελευταία εντολή κάνει μια αυθαίρετη αριθμητική πράξη: Τυπώνει το τετράγωνο της δεύτερης στήλης επί το ημίτονο της τέταρτης και προσθέτει το εκ- θετικό της -4ης στήλης. 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 21 Οι δυνατότητες των παραπάνω εργαλείων δεν εξαντλούνται σε ένα μικρό κεφάλαιο. Διαβάστε τις man και info pages και θα μάθετε να τις κάνετε να ψήνουν και ... καφέ! 1.3 Προγραμματίζοντας με τον Emacs Στο κεφάλαιο αυτό θα παρουσιάσουμε τα θεμελιώδη για τη χρήση ενός editor¹⁹ για προγραμματισμό. Για έναν προγραμματιστή που προγραμ- ματίζει αρκετές ώρες κάθε μέρα, το περιβάλλον και τα εργαλεία επεξερ- γασίας του κειμένου των εντολών προγραμματισμού καθορίζουν κατά ένα σημαντικό ποσοστό τη συνολική ...ποιότητα της ζωής του/της. Και όπως βλέπετε είμαστε αρκετά προσεκτικοί στη διατύπωση: Δε μιλάμε για προγράμματα επεξεργασίας κειμένου μορφοποιημένων εγγράφων (λ.χ. Open Office) που δίνουν έμφαση στη φόρμα του κειμένου, αλλά για επεξεργαστές απλού κειμένου που αποτελείται από σκέτους (χω- ρίς φόρμα) χαρακτήρες που “διαβάζονται” (“printable characters” σε αντίθεση με τους “non printable characters”). Παραδείγματα απλών τέ- τοιων επεξεργαστών στο Linux είναι οι επεξεργαστές gedit, vi, pico, nano κλπ που θα μπορούσε κανείς να χρησιμοποιήσει εναλλακτικά για την επεξεργασία του κώδικα στα προγράμματα που παρουσιά- ζουμε στο μάθημα. Με αυτούς μπορεί κάποιος εύκολα να επεξεργαστεί απλά προγράμματα έχοντας βασικές λειτουργίες επεξεργασίας κειμέ- νου (editing). Υπάρχουν λειτουργίες σε έναν επεξεργαστή κειμένου που κάνει τον προγραμματισμό ανετότερο και βοηθά στην ... υγιεινή κρα- τώντας μακριά τα ενοχλητικά ... έντομα! Λ.χ. η αναγνώριση από τον επεξεργαστή των εντολών της γλώσσας προγραμματισμού, των μετα- βλητών και των δομικών στοιχείων επιτρέπει την “όμορφη” παρουσί- ασή τους με κατάλληλο χρωματισμό ή/και font, επισημαίνει σφάλματα όταν δεν κλείνουν παρενθέσεις ή οι εντολές δεν μπαίνουν στο σωστό σημείο στο αρχείο του προγράμματος κλπ. Ένας “πολύγλωσσος” και “πολυμορφικός” επεξεργαστής κειμένου με πολλές δυνατότητες και ευ- κολίες για τον προγραμματιστή είναι ο GNU Emacs editor²⁰. Ο Emacs είναι ανοιχτό λογισμικό, διατίθεται ελεύθερα και μπορεί να εγκαταστα- θεί σε λειτουργικό σύστημα Linux, Mac και MS Windows. Ο χρήστης ¹⁹editor= πρόγραμμα επεξεργασίας κειμένου ²⁰http://www.gnu.org/software/emacs/ (main site), http://www.emacswiki.org/ (expert tips), http://en.wikipedia.org/wiki/Emacs (general info) 22 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ μπορεί να τον προγραμματίσει²¹ να εκτελεί απλές, αλλά και σύνθετες λειτουργίες της αρεσκείας του/της, καθώς και να έχει μια σχεδόν ολο- κληρωμένη αλληλεπίδραση με το λειτουργικό σύστημα και πολλές από τις εφαρμογές που βρίσκονται σε αυτό. Ο πιο προχωρημένος χρήστης μπορεί λ.χ. να επεξεργαστεί ένα αρχείο σε γλώσσα Fortran, να το με- ταγλωττίσει και να το διορθώσει με τη βοήθεια του debugger δίνοντας εντολές μέσα από τον Emacs. Για τον προγραμματισμό πολύπλοκων προγραμμάτων με πολλές χι- λιάδες γραμμές κώδικα και πολύπλοκο συσχετισμό διεργασιών είναι συ- νηθισμένο να χρησιμοποιούνται εξειδικευμένα περιβάλλοντα προγραμ- ματισμού. Αυτά προσφέρουν στον προγραμματιστή ολοκληρωμένες λύ- σεις για τον προγραμματισμό σε μια γλώσσα (λ.χ. C++, Java κλπ) εν- σωματώνοντας σε ένα απλό interface και τις λειτουργίες μεταγλωττι- σμού, debugging, βοήθειας κλπ. Το μειονέκτημα σε αυτά είναι η εξειδί- κευση που περιορίζει την ελευθερία του προγραμματιστή ως προς την επιλογή γλώσσας, βιβλιοθηκών, λειτουργικού συστήματος και συνήθως έχουν ακριβές άδειες χρήσης. Είναι, επίσης, δύσχρηστη η μεταφορά των εργασιών ενός προγραμματιστή από έναν υπολογιστή σε έναν άλλο και φυσικά η επεξεργασία του προγράμματος από διαφορετικά περιβάλ- λοντα προγραμματισμού. Η πολύπλοκη και εξειδικευμένη παραμετρο- ποίησή τους συνήθως “δένει” τον προγραμματιστή και το πρόγραμμα με το συγκεκριμένο πακέτο περιβάλλοντος προγραμματισμού. 1.3.1 Καλώντας τον Emacs Στη γραμμή εντολών πληκτρολογήστε: > emacs & Προσέξτε τον χαρακτήρα & στο τέλος της εντολής. Χωρίς αυτόν το prompt του φλοιού δεν επιστρέφει και δεν μπορούμε να δώσουμε άλλη εντολή από τον φλοιό. Με αυτόν η εντολή (όπως και κάθε εντολή την οποία τελειώνουμε με το &) πάει στο “υπόβαθρο” (background) δηλ. ξεκινάει μία διεργασία ανεξάρτητη από τον φλοιό η οποία λειτουργεί ακόμα και αν η διεργασία του φλοιού τερματιστεί. Τα παραπάνω ισχύουν όταν έχουμε παραθυρικό περιβάλλον και τότε ο Emacs ξεκινάει στο δικό του ανεξάρτητο παράθυρο. Μπορούμε όμως ²¹Ο Emacs είναι γραμμένος σε μια διάλεκτο της γλώσσας προγραμματισμού Lisp που λέγεται Elisp. Για προγραμματισμό απλών λειτουργιών δεν απαιτείται λεπτομε- ρής γνώση της γλώσσας αυτής. 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 23 να τρέχουμε τον Emacs και σε ένα απλό τερματικό, είτε για γρήγορη επεξεργασία κειμένου είτε γιατί δε διαθέτουμε παραθυρικό περιβάλ- λον²² αλλά μόνο κονσόλα. Στην τελευταία περίπτωση απλά παραλεί- πουμε το & στο τέλος της εντολής, ενώ αν έχουμε παραθυρικό περιβάλ- λον και θέλουμε ο Emacs να τρέξει στην κονσόλα, δίνουμε την εντολή > emacs −nw και ο Emacs θα ξεκινήσει μέσα στην κονσόλα. Σχήμα 1.2: Το παράθυρο του Emacs σε ένα παραθυρικό περιβάλλον. Φαίνονται και επεξηγούνται τα βασικά κουμπιά λειτουργίας του. ²²Αυτό μπορούμε να το καταλάβουμε δίνοντας την εντολή echo $DISPLAY και αν πάρουμε το μήνυμα σφάλματος DISPLAY: Undefined variable., τότε δεν έχουμε σύνδεση με παραθυρικό περιβάλλον (X server). Αλλιώς, θα πάρουμε την τιμή :0.0 , localhost:10.0 κλπ. 24 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ 1.3.2 Αλληλεπιδρώντας με τον Emacs Με τον Emacs αλληλεπιδρούμε με διάφορους τρόπους. Οι “νεοφώτιστοι αρχάριοι” θα προτιμήσουν τα κουμπιά και τα μενού που προσφέρει που συνήθως έχουν διαισθητική μορφή και ονόματα που συναντά στους περισσότερους επεξεργαστές κειμένου. Αλλά για να χρησιμοποιήσει κα- νείς τις προχωρημένες δυνατότητες του Emacs είναι καλό να συνηθίσει τις άλλες μορφές αλληλεπίδρασης που είναι οι συντομεύσεις πλήκτρων και η εκτέλεση εντολών με το όνομά τους από τη γραμμή εντολών του Emacs, το minibuffer²³. Σχήμα 1.3: Ο Emacs στην κονσόλα. Στην εικόνα έχουμε μεταβεί στο minibuffer πλη- κτρολογώντας M-x και έχουμε γράψει την εντολή save-buffers-kill-emacs η οποία τερματίζει τον Emacs αφού σώσει τα μεταβληθέντα από την επεξεργασία buffers. Η ίδια εντολή δίνεται ισοδύναμα πληκτρολογώντας C-x C-c. Φαίνεται η mode line στην οποία, ανάμεσα σε άλλα, είναι γραμμένο το όνομα του αρχείου/buffer (toy.f), το πο- σοστό του buffer που είναι ορατό στο παράθυρο (6%), η γραμμή και η στήλη που βρίσκεται το σημείο που επεξεργαζόμαστε (33,0) και το editing mode που βρίσκεται ο buffer [Fortran mode (Fortran), Abbreviation mode (Abbrev), Auto Fill mode (Fill)]. Οι εντολές που δίνονται με συντομεύσεις από το πληκτρολόγιο είναι ²³Είναι και ο πιο απλός τρόπος αλληλεπίδρασης, όταν καλούμε τον Emacs στην κονσόλα. 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 25 συνδυασμός πλήκτρων που πατά κάποιος σε συνδυασμό με τα πλήκτρα Ctrl (Control key) και Alt. Θα ακολουθήσουμε την εξής σύμβαση: Όταν γράφουμε έναν συνδυασμό πλήκτρων αρχίζοντας με C-, θα εννοούμε ότι τα πλήκτρα που ακολουθούν πατιούνται ταυτόχρονα με το Control key, ενώ αν γράφουμε M-, θα εννοούμε ότι τα πλήκτρα που ακολουθούν πα- τιούνται ταυτόχρονα με το Alt key²⁴. Μερικές εντολές συντομεύονται από μια ακολουθία από δύο ή περισσότερους χαρακτήρες. Λ.χ. πα- τώντας 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 υποδηλώ- νουμε ένα απλό κλικ με το αριστερό, μεσαίο²⁵ και δεξί κουμπί αντί- στοιχα. Με Drag-Mouse-1 υποδηλώνουμε ότι κρατάμε το αριστερό κου- μπί διαρκώς κρατημένο και ταυτόχρονα σέρνουμε το ποντίκι. Ανακεφαλαιώνουμε συνοψίζοντας τους δυνατούς τρόπους για να δί- νουμε μία εντολή στον Emacs. Θεωρούμε λ.χ. την εντολή που ανοίγει ένα καινούργιο αρχείο σε ένα buffer: • Από το εικονίδιο που μοιάζει με λευκό χαρτί επάνω αριστερά στη γραμμή των κουμπιών του σχήματος 1.2. ²⁴Στη γλώσσα του Emacs, το M- είναι το “Meta” key το οποίο βρίσκεται εκτός από το Alt και στο Esc (Escape key). Στην περίπτωση αυτή, σε αντίθεση με το Alt, το Esc το πατάμε πρώτα και το αφήνουμε και μετά πατάμε τα επόμενα πλήκτρα. Αυτό μπορεί να είναι και η πιο απλή μας επιλογή σε ορισμένα “χαζά” τερματικά. Αν και αυτό δε δουλεύει – μάλλον σπάνιο στην εποχή μας – δοκιμάστε το C-[. ²⁵Αν το ποντίκι δεν έχει μεσαίο κουμπί πατάμε τη ροδέλα. Αν δεν έχει ροδέλα, τότε το αριστερό και το δεξί κουμπί ταυτόχρονα. 26 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Σχήμα 1.4: Τα βασικά μενού που συναντά κανείς στον Emacs σε παραθυρικό περιβάλ- λον. Βλέπουμε τις βασικές εντολές και σε παρένθεση μας υπενθυμίζεται η αντίστοιχη συντόμευση πληκτρολογίου. Λ.χ. η εντολή File → Visit New File μπορεί να δοθεί από το πληκτρολόγιο πληκτρολογώντας C-x C-f. Σημειώστε τις εντολές File → Visit New File (άνοιγμα αρχείου), File→Save (εγγραφή αλλαγών του buffer στο αντίστοιχο αρχείο), File→Exit Emacs (κλείσιμο Emacs), File → Split Window (χωρισμός παρα- θύρου στα δύο), File→New Frame (άνοιγμα νέου παραθύρου) και φυσικά τις γνωστές εντολές Cut, Copy, Paste, Undo από το Edit menu. Από το μενού Buffers μπορούμε να επιλέξουμε διαφορετικά buffers με τα περιεχόμενα των άλλων αρχείων που επε- ξεργαζόμαστε. Στους καινούργιους χρήστες συστήνουμε να δουν το Emacs Tutorial και Read Emacs Manual στο Help menu. • Από την εντολή μενού File→Visit New File. • Από τη συντόμευση πληκτρολογίου C-x C-f. • Από εντολή στο minibuffer: M-x find-file. Ο πρώτος τρόπος είναι διαθέσιμος για τις πολύ βασικές εντολές, ο δεύ- τερος για περισσότερες, ο τρίτος για τις περισσότερες (αλλά όχι όλες) και ο τέταρτος για όλες τις εντολές που είναι διαθέσιμες για διαδρα- στική χρήση. 1.3.3 Βασική Επεξεργασία Κειμένου Για να επεξεργαστούμε ένα αρχείο, ο Emacs τοποθετεί τα περιεχόμενά του σε ένα buffer. Το buffer είναι ένα κομμάτι της μνήμης όπου αντι- 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 27 γράφονται τα περιεχόμενα ενός αρχείου και όχι το ίδιο το αρχείο. Για να καταγραφούν οι αλλαγές στα περιεχόμενα ενός buffer πρέπει να τις “σώσουμε”, δηλ. ο Emacs να γράψει το buffer πίσω στο αρχείο. Μέχρι να γίνει αυτό το αρχικό αρχείο μένει ανέπαφο²⁶. Ο Emacs μπορεί να έχει ανοιχτά πολλά buffers τα οποία, όταν συνδέονται με ένα αρχείο, έχουν από προεπιλογή το ίδιο όνομα του αρχείου²⁷. Το όνομα ενός buffer φαί- νεται στη mode line του Emacs όπως φαίνεται στο σχήμα 1.3. Ο κύκλος επεξεργασίας ενός αρχείου συνοψίζεται στα εξής σημεία: • Διάβασμα των περιεχομένων του αρχείου σε ένα buffer. • Αλλαγή από τον χρήστη των περιεχομένων του buffer. • Εγγραφή των δεδομένων του buffer πίσω στο αρχείο. Φυσικά αν το αρχείο δεν υπάρχει και δημιουργείται εξ’ αρχής, το πρώτο βήμα παραλείπεται. Το σημείο στο οποίο βρισκόμαστε νοητά και εισάγουμε κείμενο λέγε- ται “το σημείο” (point). Αυτό καταδεικνύεται από τον δρομέα (cursor) που τυπικά είναι ένα κόκκινο τετραγωνάκι που αναβοσβήνει²⁸. Κάθε buffer έχει μία θέση που ονομάζεται “το σημάδι” (the mark) το οποίο μαζί με το σημείο ορίζει σε κάθε παράθυρο την “περιοχή” (the region). Αυτή είναι μια νοητή περιοχή κειμένου σε κάθε παράθυρο όπου μπο- ρούν να δράσουν οι συναρτήσεις του Emacs (λ.χ. αποκοπή, αντιγραφή, αλλαγή κεφαλαίων σε μικρά γράμματα, έλεγχος ορθογραφίας κλπ). Την περιοχή τη θέτουμε ορίζοντας το σημάδι (mark) επιλέγοντας ένα σημείο και πληκτρολογώντας C-SPC²⁹ (ή στο minibuffer M-x set-mark-command). Μετακινώντας τον δρομέα στο σημείο που θέλουμε, ορίζουμε την επι- θυμητή περιοχή. Εναλλακτικά με το Drag-Mouse-1 (κρατάμε αριστερό ²⁶Αν χάσουμε μία συνεδρία του Emacs είναι δυνατόν να ανακτήσουμε μέρος των αλλαγών που κάναμε. Μπορούμε να χρησιμοποιήσουμε την εντολή M-x recover-file ή να αναζητήσουμε ένα αρχείο στον δίσκο με όνομα ίδιο με αυτό του αρχείου που επεξεργαζόμαστε ανάμεσα σε δύο #. Λ.χ. το buffer του αρχείου file.f90 σώζεται αυτόματα και περιοδικά στο αρχείο #file.f90# ²⁷Αυτό δεν είναι αναγκαστικό. Μπορεί ο χρήστης να αλλάξει το όνομα ενός buffer χωρίς να αλλάξει το αρχείο με το οποίο συνδέεται. Επίσης, αν ανοίξουμε αρχεία που έχουν το ίδιο όνομα (λ.χ. index.html) που βρίσκονται σε διαφορετικούς καταλόγους, τότε αυτά ονομάζονται από προεπιλογή index.html, index.html<2>, index.html<3>, ... ²⁸Το σημείο είναι πάντα μεταξύ χαρακτήρων όχι πάνω σε αυτούς. Ο δρομέας είναι πάνω στον χαρακτήρα αμέσως δεξιά από το σημείο. Κάθε παράθυρο έχει ένα σημείο οπότε κάθε buffer μπορεί να έχει περισσότερα από ένα σημεία, αν εμφανίζεται σε διαφορετικά παράθυρα. ²⁹Πατάμε ταυτόχρονα το Control key και το Space bar. 28 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ κουμπί ποντικιού πατημένο και σέρνουμε το ποντίκι) μαρκάρουμε μία περιοχή. Το σημάδι μπορεί να τεθεί και με Mouse-3 δηλ. με απλό κλικ του δεξιού πλήκτρου του ποντικιού (άρα, Mouse-1 Mouse-3 ορίζουν μία περιοχή θέτοντας πρώτα το σημείο και μετά το σημάδι). Ανοίγουμε ένα αρχείο με την εντολή C-x C-f και πληκτρολογώντας το όνομά του. Αν το αρχείο υπάρχει, βλέπουμε τα περιεχόμενά του στο buffer που δημιουργείται, αλλιώς παίρνουμε ένα άδειο buffer. Τότε: • Πλοηγούμαστε στο buffer με τα βελάκια του πληκτρολογίου Εναλ- λακτικά με τις εντολές C-n, C-p, C-f και C-b. • Αν έχουμε πολλές “σελίδες ” προχωράμε μία-μία σελίδα με Page Up, Page Dn από το πληκτρολόγιο. Εναλλακτικά, με τις εντολές C-v, M-v • Εισάγουμε κείμενο απλά πληκτρολογώντας το. • Σβήνουμε τους χαρακτήρες που βρίσκονται πίσω από το σημείο με το Backspace και αυτούς που είναι μπροστά με το Delete. Με την εντολή C-d σβήνουμε τον μπροστινό χαρακτήρα. • Σβήνουμε ολόκληρη τη γραμμή που είναι μπροστά από το σημείο με C-k • Ανοίγουμε μια καινούργια γραμμή με Enter ή C-o. • Πάμε στην αρχή της γραμμής με το πλήκτρο Home και στο τέλος της με το πλήκτρο End. Εναλλακτικά, με C-a και C-e αντίστοιχα. • Πάμε στην αρχή του buffer με το πλήκτρο C-Home και στο τέ- λος με C-End. Εναλλακτικά, με τις εντολές στο minibuffer: M-x beginning-of-buffer και M-x end-of-buffer. • Πάμε σε μια γραμμή που θέλουμε με M-x goto-line. Στην προ- τροπή της εντολής δίνουμε τον αριθμό της γραμμής που θέλουμε να πάμε. • Αναζητούμε κείμενο μπροστά από το σημείο με την εντολή C-s. Πληκτρολογούμε το κείμενο μέχρι να το βρούμε. Για να βρούμε το ίδιο κείμενο ξανά (και ξανά) πληκτρολογούμε C-s όσες φορές χρειαστεί. Το ίδιο κάνουμε με το C-r για να αναζητήσουμε κείμενο πίσω από το σημείο. • Αν θέλουμε να γράψουμε Ελληνικά, διαβάζουμε την Παράγραφο 1.3.10, σελ. 37 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 29 Μόλις τελειώσουμε σώζουμε τις αλλαγές που κάναμε με την εντολή C-s ή από το εικονίδιο “δισκέτα” ή από το μενού File→Save. Επίσης, η εντολή στο minibuffer είναι M-x save-buffer. 1.3.4 Κόβοντας και ράβοντας Για πιο προχωρημένη επεξεργασία ακολουθούμε τις παρακάτω οδηγίες: • Undo!. Πολλές από τις παρακάτω αλλαγές μπορεί να είναι κα- ταστροφικές. Ο Emacs έχει επαναλαμβανόμενο undo με μεγάλη μνήμη. Πατώντας C-/ επανειλημμένα προσεγγίζουμε την προη- γούμενη κατάσταση που βρισκόμαστε. Εναλλακτικά, με C-x u και από το μενού Edit→Undo. Θυμίζουμε ότι το C-g σταματάει οποια- δήποτε λειτουργία του Emacs και έτσι μπορεί να μας γλυτώσει από μέρος μίας καταστροφής, αν διακόψουμε το έγκλημα κατά τη διάρκεια που εκτελείται. • Αποκοπή κειμένου με το ποντίκι: Κάνουμε κλικ Mouse-1 στην αρχή του κειμένου που θέλουμε να αποκόψουμε, μετά κλικ Mouse-3 στο τέλος του κειμένου. Αμέσως μετά, ένα δεύτερο κλικ Mouse-3 και ... πάει (στην πραγματικότητα το κείμενο αντιγράφεται στο Kill ring³⁰ και είναι διαθέσιμο για επικόλληση). • Αποκοπή κειμένου από το πληκτρολόγιο: Επιλέγουμε το αρχικό σημείο και θέτουμε το σημάδι (mark) με C-SPC. Μετακινούμε τον δρομέα αμέσως μετά το σημείο που θέλουμε να θέσουμε ως τέλος της περιοχής. Πληκτρολογούμε C-w. • Αντιγραφή κειμένου με το ποντίκι: Σέρνουμε το ποντίκι Drag-Mouse-1 από την αρχή ως το τέλος. Η περιοχή “φωτίζεται”. Εναλλακτικά όπως στην αποκοπή χωρίς το δεύτερο κλικ στο τέλος: Mouse-1 στην αρχή και Mouse-3 στο τέλος. • Αντιγραφή κειμένου με το πληκτρολόγιο: C-SPC στην αρχή, μετα- κινούμαστε το τέλος της περιοχής και μετά M-w. • Επικόλληση κειμένου με το ποντίκι: Στο σημείο που θέλουμε να κάνουμε την εισαγωγή, πατάμε το μεσαίο κουμπί³¹. • Επικόλληση κειμένου με το πληκτρολόγιο: Στο σημείο που θέλουμε να κάνουμε εισαγωγή πληκτρολογούμε C-y ³⁰Ας πούμε το clipboard του Emacs. ³¹Αν δεν έχει, τη ροδέλα ή αριστερό και δεξί ταυτόχρονα. 30 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ • Επικόλληση κειμένου που είχαμε αντιγράψει παλιότερα: Μία εύ- κολη επιλογή είναι από το μενού Edit→Paste from kill menu και επιλέγουμε το κείμενο που θέλουμε να επικολλήσουμε. Από το πληκτρολόγιο όπως πριν C-y και αμέσως μετά M-y επανειλημμένα μέχρι να εμφανιστεί το κείμενο που θέλουμε. • Εισαγωγή ολόκληρου αρχείου: Αν θέλουμε να εισάγουμε τα περιε- χόμενα ενός ολόκληρου αρχείου, πληκτρολογούμε C-x i στο σημείο που θέλουμε να γίνει η εισαγωγή. Εναλλακτικά, με την εντολή M-x insert-file. • Εισαγωγή ολόκληρου buffer: Αν θέλουμε να εισάγουμε τα πε- ριεχόμενα ενός ολόκληρου buffer, το κάνουμε με την εντολή M-x insert-buffer. • Αντικατάσταση κειμένου: Με την εντολή M-x query-replace αντι- καθιστούμε διαδραστικά μία ακολουθία χαρακτήρων με μία άλλη. Στην ερώτηση αν θέλουμε να γίνει η αντικατάσταση, απαντούμε y (ναι), n (όχι), q (στοπ). Με , (κόμμα) γίνεται μία αντικατάσταση και σταματάει. Αν είμαστε σίγουροι ότι θέλουμε να γίνουν όλες οι αντικαταστάσεις, εκτελούμε την εντολή M-x replace-string. • Αντικατάσταση κεφαλαίων-μικρών γραμμάτων: Επιλέγουμε μία περιοχή που θέλουμε να γίνει η αλλαγή και εκτελούμε μία από τις εντολές M-x upcase-region, M-x capitalize-region, M-x downcase-region. Το Edit μενού έχει πολλές από τις παραπάνω λειτουργίες για τους νεοσύλλεκτους. Τίποτα, επίσης, δε μας εμποδίζει οι αποκοπές, αντιγραφές, επικολ- λήσεις να γίνονται από το ένα παράθυρο στο άλλο ακόμα και αν πρό- κειται για buffer συνδεδεμένα με διαφορετικά αρχεία. 1.3.5 Παράθυρα Πολλές φορές είναι βολικό να επεξεργαζόμαστε το ίδιο ή διαφορε- τικά αρχεία σε διαφορετικά παράθυρα. Το “παράθυρο” (window) στον Emacs αναφέρεται σε διαφορετικές περιοχές του ίδιου παράθυρου με την έννοια που δίνουμε σε ένα παραθυρικό περιβάλλον. Ο Emacs μπορεί να χωρίσει ένα παράθυρο σε ένα ή περισσότερα παράθυρα οριζόντια ή κάθετα. Μελετήστε το σχήμα 1.5 στη σελίδα 75 στο οποίο επεξηγούνται 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 31 οι βασικές έννοιες. Επίσης, μπορεί να ανοίξει ένα διαφορετικό παρά- θυρο με την έννοια του παραθυρικού περιβάλλοντος. Τέτοια παράθυρα λέγονται “πλαίσια” (frames)³². Θα κρατήσουμε αυτή την ορολογία όταν αναφερόμαστε στον Emacs. • Τοποθέτηση δρομέα στο κέντρο παραθύρου και καθαρισμός πα- ράθυρου από σκουπίδια: C-l (προσοχή: l όχι 1) • Χωρισμός παράθυρου στα δύο, οριζόντια: C-x 2 • Χωρισμός παράθυρου στα δύο, κάθετα: C-x 3 • Κατάργηση των άλλων παράθυρων: C-x 1 • Κατάργηση του τρέχοντος παράθυρου: C-x 0 • Μετακίνηση δρομέα σε άλλο παράθυρο: Με Mouse-1 ή C-x o • Αλλαγή μεγέθους παράθυρων: Με το ποντίκι Drag-Mouse-1 στις διαχωριστικές γραμμές τους. Με το πληκτρολόγιο, C-^ αλλάζει την οριζόντια διάσταση και C-} την κάθετη. • Καινούργιο πλαίσιο: C-x 5 2 • Κατάργηση πλαισίου: C-x 5 0 • Μετακίνηση δρομέα σε άλλο πλαίσιο: Με το ποντίκι Mouse-1 ή με C-x 5 o. Διαφορετικά παράθυρα μπορείτε να έχετε και όταν ο Emacs τρέ- χει στην κονσόλα, κάτι που μπορεί να είναι η μεγαλύτερη ευλογία για προχωρημένη επεξεργασία κειμένου, όταν δε βρίσκεστε σε παραθυρικό περιβάλλον. Φυσικά, τότε δεν μπορείτε να έχετε διαφορετικά πλαίσια. 1.3.6 Αρχεία και Buffers • Άνοιγμα αρχείου: C-x C-f ή M-x find-file. ³²Να σημειώσουμε πως όταν θέλετε να επεξεργαστείτε ένα ή περισσότερα αρχεία είναι καλό να ανοίγετε καινούργια πλαίσια στην ίδια συνεδρία του Emacs και όχι να ξεκινάτε κάθε φορά τον Emacs από την αρχή. Μια καινούργια διαδικασία Emacs τραβάει πόρους από το σύστημά σας και δεν επικοινωνεί με μία άλλη. 32 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ • Σώσιμο αλλαγών του buffer σε αρχείο: C-x C-s ή M-x save-buffer. Αν θέλουμε ταυτόχρονα να βγούμε από τον Emacs C-x C-c ή M-x save-buffers-kill-emacs (στο μενού File→Save ή εικονίδιο με δισκέτα). • Σώσιμο αλλαγών σε buffer σε άλλο αρχείο: C-x C-w ή M-x write-file (στο μενού File→Save As ή στο εικονίδιο με δισκέτα και μολύβι). • Σώσιμο όλων των buffers στα αρχεία τους: C-x s ή M-x save-some-buffers. • Σύνδεση ενός buffer με ένα (άλλο) αρχείο: M-x set-visited-file-name. • Κατάργηση buffer: C-x k • Αλλαγή buffer στο παράθυρο που βρισκόμαστε: C-x b • Προβολή λίστας buffer: Από το μενού Buffers ή με την εντολή C-x C-b. Στη δεύτερη περίπτωση πατώντας Enter δίπλα σε ένα buffer το εμφανίζουμε στο παράθυρο. Υπάρχουν εντολές διαχείρισης των buffers που μπορείτε να βρείτε από τη βοήθεια του Emacs (αν βάλετε τον δρομέα στο παράθυρο αυτό πληκτρολογήστε C-h m) • Ανάκτηση δεδομένων από επεξεργασμένο buffer: Αν χάσατε τη συνεδρία ενός Emacs, μην απελπίζεστε. Στην καινούργια συνεδρία πληκτρολογήστε M-x recover-file και ακολουθήστε τις οδηγίες. Η εντολή M-x recover-session επαναφέρει όλα τα αρχεία που επεξεργαζόσαστε μαζί. • Αρχεία ασφαλείας: Όταν σώζετε ένα buffer σε ένα αρχείο, το πα- λιό αρχείο γίνεται αντίγραφο ασφάλειας. Αν το αρχείο έχει όνομα myfile, το αντίγραφο ασφαλείας έχει όνομα myfile˜. Είναι δυνατόν να παραμετροποιήσετε τον Emacs να κρατάει πολλές “εκδόσεις” (versions) των αλλαγών που κάνετε. Σας παραπέμπουμε στην τεκ- μηρίωση. • Πλοήγηση και δράσεις σε καταλόγους: C-x d ή M-x dired. Μπο- ρείτε να δράσετε στα αρχεία του καταλόγου (άνοιγμα, διαγραφή, αλλαγή ονομασίας, αντιγραφή κλπ) με τις ανάλογες εντολές (μέσα από το παράθυρο του dired δώστε την εντολή C-h m και διαβάστε τη σχετική τεκμηρίωση). 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 33 1.3.7 Modes Σε κάθε 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). • M-x f90-mode: Μας ενδιαφέρει ιδιαίτερα στο μάθημα αυτό. Αφορά αρχεία με εντολές στη γλώσσα Fortran και τα πιο χρήσιμα χα- ρακτηριστικά τις είναι η τοποθέτηση του δρομέα στο κατάλληλο σημείο πατώντας το πλήκτρο TAB, ο χρωματισμός των εντολών και των μεταβλητών, η αναγνώριση των δομικών στοιχείων του προ- γράμματος (subroutines, if, do loops, comments, statement labels κλπ). Μια άλλη ενδιαφέρουσα λειτουργία είναι να πάρει τις εντο- λές μιας ολόκληρης περιοχής και να τις κάνει σχόλια (comments) δηλ. ανενεργές. • M-x c-mode: Για κώδικα γραμμένο στη γλώσσα C. Ανάλογες modes για γλώσσες προγραμματισμού είναι οι java-mode, perl-mode, awk- mode, python-mode, makefile-mode, octave-mode, mathematica-mode και άλλες. • M-x latex-mode: Για την επεξεργασία αρχείων που έχουν κείμενο σε LATEX. • M-x text-mode: Για την επεξεργασία απλών (.txt) αρχείων κει- μένου. • M-x fundamental-mode: Η βασική mode, όταν δεν υπάρχει καλύ- τερη... Minor modes που παρουσιάζουν ενδιαφέρον είναι οι: • M-x auto-fill-mode: Όταν μία γραμμή γίνεται πολύ μακριά, την κόβει αυτόματα. Σχετική είναι η εντολή M-x fill-paragraph. 34 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ • M-x overwrite-mode: Αντί να εισάγονται οι χαρακτήρες ανάμεσα στους υπάρχοντες, γράφονται από πάνω τους. Δίνοντας την εντολή ξανά, αλλάζουμε στην προηγούμενη κατάσταση. • M-x read-only mode: Όταν θέλουμε να επισκεφτούμε ένα πολύτιμο αρχείο που δε θέλουμε να αλλάξουμε κατά λάθος τα περιεχόμενά του, μπαίνοντας σε αυτή τη mode ο Emacs απαγορεύει τις αλλα- γές. Αυτό μπορεί να γίνει ανοίγοντας ένα αρχείο με την εντολή C-x C-r (M-x find-file-read-only) ή/και να εναλλάσσουμε τη mode με την εντολή C-x C-q (M-x toggle-read-only). Βλέπε σχήμα 1.5, το buffer jack.c που σημειώνεται στο mode line με %%. Κάνοντας κλικ πάνω στα %%, μπορούμε να καταργούμε/επαναφέρουμε την read-only mode. • M-x flyspell-mode: Άμεσος έλεγχος ορθογραφίας. • M-x font-lock-mode: Χρωματισμός δομικών στοιχείων του buffer. Συνήθως είναι η προεπιλογή, αν όχι, την ενεργοποιούμε (ή την απενεργοποιούμε) με αυτήν την εντολή. Σε παραθυρικό περιβάλλον έχουμε τη δυνατότητα να επιλέξουμε modes από την mode line. Με το Mouse-3 πάνω στο όνομα μιας mode μας δίνονται επιλογές για την (απ)ενεργοποίηση minor modes. Με το Mouse-1 μπορούμε να (απ)ενεργοποιήσουμε την read-only mode κάνο- ντας κλικ αριστερά στο :%% ή :-- αντίστοιχα. Βλέπε σχήμα 1.5. 1.3.8 Βοήθεια στον Emacs Ο Emacs έχει πολύ λεπτομερή online τεκμηρίωση. Στους νέους χρήστες συστήνεται να ακολουθήσουν τις οδηγίες στο emacs tutorial το οποίο εκπαιδεύει τον χρήστη στις βασικές εντολές χρήσης και επεξεργασίας κειμένου. Αυτό γίνεται με την εντολή C-h t ή από το μενού Help→Emacs Tutorial. Αφεθείτε στις οδηγίες και είναι ... διασκεδαστικό. Η man page του (εντολή man emacs) έχει συνοπτικές πληροφορίες, κυρίως για τον τρόπο που καλείται ο Emacs από τη γραμμή εντολών. Πολύ εκτενής τεκμηρίωση βρίσκεται στις info pages³³. Η χρήση του info είναι κεφάλαιο βιβλίου από μόνη της, αλλά στο παραθυρικό πε- ριβάλλον του Emacs είναι σχετικά απλή. Με την εντολή C-h r (μενού ³³Αν προτιμάτε έγγραφα–βιβλία σε μορφή PDF επισκεφτείτε την ιστοσελίδα του Emacs www.gnu.org/software/emacs/ και επιλέξτε Documentation. Αυτός ο σύνδε- σμος τώρα είναι ο www.gnu.org/software/emacs/manual/emacs.html από όπου μπο- ρείτε να κατεβάσετε το εγχειρίδιο χρήσης των 600 περίπου σελίδων! 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 35 Help→Read the Emacs Manual) ανοίγουμε απευθείας τη σελίδα του Emacs. Πατώντας τα πλήκτρα SPC και Backspace διαβάζουμε την τεκ- μηρίωση σελίδα–σελίδα. Αλλά στο info έχουμε υπερσυνδέσμους όπως στην πλοήγηση στο διαδίκτυο. Με Mouse-1 επιλέγετε έναν σύνδεσμο και με τα βελάκια στα εικονίδια μπορείτε να πάτε στον προηγούμε- νο/επόμενο σύνδεσμο όπως και στην προηγούμενη θέση που είσαστε. Πατώντας πλήκτρα, δίνετε εντολές στο info, λ.χ. πατώντας d βρίσκε- στε στον κεντρικό κατάλογο του info και μπορείτε να δείτε όλες τις εφαρμογές που έχουν info τεκμηρίωση. Με την εντολή g (info) (πλη- κτρολογήστε τους χαρακτήρες όπως τους βλέπετε με τις παρενθέσεις) βρίσκεστε στην τεκμηρίωση του info και εκεί μπορείτε να μάθετε την προχωρημένη χρήση της για να διαβάζετε αποτελεσματικά την τεκμη- ρίωση των εφαρμογών. Ο Emacs είναι δομημένος διαισθητικά και φιλικά προς τον χρήστη. Τα περισσότερα θα τα μάθετε όχι από προσεκτική μελέτη του εγχειρί- διου χρήσης, αλλά από τα ίδια τα ονόματα των εντολών και τη συνο- πτική τεκμηρίωσή τους. Όλες οι εντολές του Emacs αποτελούνται από ολόκληρες λέξεις που χωρίζονται με ένα - που σχεδόν σχηματίζουν πλή- ρεις προτάσεις. • Auto completion εντολών: Οι εντολές αυτοσυμπληρώνονται στο minibuffer πατώντας το πλήκτρο TAB. Για παράδειγμα, μεταβείτε στο minibuffer πληκτρολογώντας M-x. Πληκτρολογήστε λ.χ. capi[TAB] και η εντολή συμπληρώνεται σε capitalize-. Πατώντας το [TAB] άλλη μια φορά ανοίγει ένα buffer με τις δυνατές επιλογές: capitalize-region και capitalize-word. Πληκτρολογήστε r[TAB] και η εντολή συμπληρώνεται στη μοναδική capitalize-region. Για να δείτε όλες της εντολές που αρχίζουν από s (...πολλές), πλη- κτρολογήστε M-x s[TAB][ΤΑΒ]. Επιλέξτε με το ποντίκι το buffer *Completions* και πλοηγηθείτε στις δυνατότητες. Από τα ονόματα των εντολών θα πάρετε ιδέες. Αν έχετε χρόνο, πληκτρολογήστε M-x [TAB][TAB] και όλες οι διαθέσιμες εντολές θα είναι στο ... buffer σας! • Τεκμηρίωση συντομεύσεων πληκτρολογίου: Δεν ξέρετε τι κάνει η εντολή C-s; Κανένα πρόβλημα... Πληκτρολογήστε C-h k και μετά C-s. Αντίστροφα, ξεχάσατε με ποια πλήκτρα συντομεύεται η εντολή save-buffer; Πληκτρολογήστε C-h w και μετά την εντολή. • Τεκμηρίωση συναρτήσεων: Ψάχνετε μια εντολή λ.χ. save-κάτι- που-ξέχασα; Πληκτρολογήστε C-h f και μετά save-[TAB] να δείτε τις επιλογές. Με Mouse-2 επιλέξτε την εντολή που σας ενδιαφέρει 36 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ ή πληκτρολογήστε/συμπληρώστε με [TAB] το υπόλοιπο όνομα (λ.χ. save-buffers-kill-emacs) και στο buffer *Help* θα διαβάσετε την τεκμηρίωση της εντολής. • Τεκμηρίωση μεταβλητών: Με C-h v μπορείτε να μάθετε την τιμή και τη λειτουργία των μεταβλητών στον Emacs. • Τεκμηρίωση apropos: Δεν θυμάστε ακριβώς το όνομα της εντο- λής; Κανένα πρόβλημα... Πληκτρολογήστε C-h a και μια λέξη (λ.χ. save) και θα δείτε όλες τις εντολές που περιέχουν τη λέξη αυτή. Περισσότερες πληροφορίες θα πάρετε με C-h d • Τεκμηρίωση modes: Πληκτρολογώντας C-h m μέσα από ένα buffer παίρνετε πληροφορίες για τις modes που είναι ενεργοποιημένες για το buffer. Θα δείτε εκεί τις ειδικές εντολές που δένονται με τις συντομεύσεις πληκτρολογίου. • Τεκμηρίωση info: C-h i • Ξεχάσατε τα παραπάνω ή θέλετε να μάθετε και άλλα; Πληκτρο- λογήστε C-h ? και πλοηγηθείτε στις επιλογές που σας δίνονται. 1.3.9 Παραμετροποίηση του Emacs Ο Emacs έχει δυνατότητα παραμετροποίησης σε οποιοδήποτε βάθος: Από την απλή σύνδεση πλήκτρων με εντολές που θέλουμε να συντομεύ- σουμε μέχρι τον προγραμματισμό πολύπλοκων λειτουργιών στη γλώσσα Elisp. Ο πιο διαδεδομένος τρόπος για τον μέσο χρήστη είναι να εισάγει τις κατάλληλες εντολές στο αρχείο ∼/.emacs στην προσωπική του πε- ριοχή. Ο Emacs διαβάζει και εκτελεί τις εντολές αυτές πριν ξεκινήσει. Παράδειγμα ενός τέτοιου αρχείου με ενδεικτικές λειτουργίες είναι το παρακάτω: ; D e f i n e F1 key t o save t h e b u f f e r ( global-set-key [ f1 ] ’ save-buffer ) ; D e f i n e Control−c s t o save t h e b u f f e r ( global-set-key ”\C−cs ” ’ save-buffer ) ; D e f i n e Meta−s ( Alt−s ) t o i n t e r a c t i v e l y s e a r c h forward ( global-set-key ”\M−s” ’ isearch-forward ) ; D e f i n e M−x i s t o i n t e r a c t i v e l y s e a r c h forward ( defalias ’ is ’ isearch-forward ) ; D e f i n e M−x fm t o s e t fortran−mode f o r t h e b u f f e r ( defun fm ( ) ( interactive ) ( f90-mode ) ) ; D e f i n e M−x s i g n t o s i g n my name 1.3. ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΜΕ ΤΟΝ EMACS 37 ( defun sign ( ) ( interactive ) ( insert ”K. N. Anagnostopoulos ” ) ) Στα περιεχόμενα του παραπάνω αρχείου τα ελληνικά ερωτηματικά ; ορίζουν το υπόλοιπο της γραμμής να είναι σχόλια, τα οποία είναι για μας και αγνοούνται (δεν ερμηνεύονται). Οι πρώτες τρεις εντολές δεσμεύουν τα πλήκτρα 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 1.3.10 Ελληνικά στον Emacs Με πολλή συντομία περιγράφουμε πώς γίνεται να επεξεργαστούμε αρ- χεία με ελληνικούς χαρακτήρες. Εδώ ο χρήστης πρέπει να προσδιορίσει αν οι ελληνικοί χαρακτήρες θα αναπαρίστανται από τους 8-bit χαρακτή- ρες του συστήματος iso8859-7³⁴ ή από τους πιο διαδεδομένους 16-bit Unicode χαρακτήρες. Για να μπορέσουμε να διαβάσουμε αρχεία με χαρακτήρες Unicode πρέπει ο Emacs σε ένα παραθυρικό περιβάλλον να ξεκινήσει με μία κατάλληλη γραμματοσειρά Unicode (UTF)³⁵. Αν αυτό δεν είναι η προ- επιλογή, επιλέγουμε εμείς μία γραμματοσειρά³⁶. Μια επιλογή δίνεται από την παρακάτω εντολή (ο χαρακτήρας \ συνεχίζει την εντολή στην επόμενη γραμμή, εσείς μπορείτε να τη γράψετε σε μία γραμμή): > emacs −fn \ −misc−fixed−medium−r−normal−−18−120−100−100−c−90−iso10646 −1 & ³⁴Χρήσιμοι σε προγράμματα όπως το LATEXμε τη χρήση του Babel. ³⁵Αν καλούμε τον Emacs στην κονσόλα, θα πρέπει η κονσόλα να εμφανίζει χαρα- κτήρες Unicode ³⁶Με την εντολή xlsfonts | grep iso10646 |less βλέπουμε τις διαθέσιμες γραμμα- τοσειρές Unicode, ενώ με την εντολή xlsfonts | grep iso8859-7|less τις διαθέσιμες ελληνικές 8-bit γραμματοσειρές ISO8859-7. 38 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Στη συνέχεια, μπορούμε να εισάγουμε ελληνικούς χαρακτήρες χρησι- μοποιώντας την αλλαγή της μεθόδου πληκτρολογίου του παραθυρικού περιβάλλοντος (λ.χ. πληκτρολογώντας Alt-Shift) όπως και σε οποια- δήποτε άλλη εφαρμογή. Εναλλακτικά (αν λ.χ. δεν είμαστε σε UTF περι- βάλλον) με την εντολή C-\ (M-x toggle-input-method) και εισάγοντας –μόνο την πρώτη φορά – “greek” στο minibuffer εναλλάσσουμε από αγγλικά σε ελληνικά. Για τους 8-bit χαρακτήρες τύπου ISO8859-7 καλούμε τον Emacs με την ανάλογη γραμματοσειρά. Μία επιλογή είναι > emacs −fn \ −misc−fixed−medium−r−normal−−18−120−100−100−c−90−iso8859 −7 & Αφού ανοίξουμε το αρχείο που επιθυμούμε σε ένα 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-\ εναλλάσσουμε από αγγλικά σε ελληνικά. 1.4 Η Γλώσσα Προγραμματισμού: Fortran Στην παράγραφο αυτή θα αναφέρουμε τα απολύτως απαραίτητα που χρειάζεται να ξέρετε προκειμένου να αρχίσετε να γράφετε και να τρέ- χετε προγράμματα σε γλώσσα Fortran. Δεν πρόκειται για συστηματική εκμάθηση της γλώσσας, αλλά για μία πρακτική προσέγγιση μέσω πα- ραδειγμάτων. Ο αναγνώστης ενθαρρύνεται να ανατρέξει στη βιβλιογρα- φία [9, 10, 11] για περισσότερες λεπτομέρειες. Για να ωφεληθεί ο/η αναγνώστης/τρια από το κεφάλαιο αυτό πρέ- πει απαραίτητα να γράφει τα προγράμματα και να τα εκτελεί στον υπολογιστή του/της. 1.4.1 Τα Στοιχειώδη Το πρώτο πρόγραμμα που γράφει κανείς σε μια καινούργια γλώσσα ή/και υπολογιστικό περιβάλλον, είναι ένα “Hello World” πρόγραμμα, το οποίο απλά τυπώνει στο stdout αυτή τη φράση. Καταφέρνοντας να δει τη φράση αυτή τυπωμένη, έχει κάνει τη μισή δουλειά που χρειάζεται 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 39 για να προγραμματίσει στο περιβάλλον αυτό. Το εν λόγω πρόγραμμα σε Fortran το γράφουμε σε ένα αρχείο hello.f90 ως εξής: program hello ! p r i n t a message t o t h e world : p r i n t * , ’ H e l l o World ! ’ ! t h i s i s a comment end program hello Οι εντολές στη Fortran είναι ακολουθίες χαρακτήρων που γράφουμε από την 1η μέχρι και την 132η στήλη. Κάθε γραμμή αρχίζει μία και- νούργια εντολή³⁷ και μπορούμε σε μία γραμμή να γράψουμε περισσό- τερες από μία εντολές χωρίζοντάς τις με ένα ελληνικό ερωτηματικό (; - semicolon). Αν μια σειρά αρχίζει με ! (θαυμαστικό), αυτή η σειρά αγνοείται και μπορεί να χρησιμοποιηθεί για σχόλια που επεξηγούν και τεκμηριώνουν το πρόγραμμα. Αν μια σειρά έχει θαυμαστικό σε κάποια στήλη, οτιδήποτε μετά το θαυμαστικό αγνοείται και μπορεί να χρησι- μοποιηθεί για σχολιασμό (εξαιρείται το θαυμαστικό μέσα σε μονά η διπλά εισαγωγικά, όπου εκεί θεωρείται ότι είναι μέρος του κειμένου μιας ακολουθίας χαρακτήρων όπως λ.χ. στο 'Hello World!'). Η σω- στή και επαρκής τεκμηρίωση ενός προγράμματος είναι απαραίτητη για προγράμματα που σχεδιάζετε, ώστε να μπορούν να χρησιμοποιηθούν επανειλημμένα, να συντηρηθούν και να επεκταθούν από ομάδα πολλών προγραμματιστών και να είναι μεγαλύτερα από μερικές γραμμές κώ- δικα. Η ιδέα που είχατε σήμερα θα σας φαντάζει άγνωστη μετά από λίγες εβδομάδες και ο χρόνος που θα καταναλώσετε για να διορθώ- σετε, να βελτιώσετε και να εξηγήσετε στους άλλους αυτό που κάνατε, θα είναι σίγουρα περισσότερος από το χρόνο που θα ξοδέψετε για να συγγράψετε μια καλή και σαφή τεκμηρίωση του προγράμματός σας. Η κύρια είσοδος σε ένα πρόγραμμα καθορίζεται από την εντολή program name όπου name είναι ό,τι θέλουμε, αρκεί να να αρχίζει από γράμμα A-Z ή a-z, να αποτελείται από το πολύ 31 αλφαριθμητικούς χαρακτήρες και το _ (underscore). Το τέλος του προγράμματος, όπως και κάθε αυτοδύναμης ενότητας του προγράμματος (υπορουτίνες, συ- ναρτήσεις), καθορίζεται από την εντολή end στην οποία προσθέτουμε και το όνομα της ενότητας που κλείνει (εδώ end program hello). Στην τέταρτη γραμμή είναι το “ζουμί”: Η εντολή print είναι ο απλού- στερος τρόπος να τυπώσουμε κάτι στο stdout. Προσέξτε το “*,” που ³⁷Μία μεγάλη εντολή μπορεί να συνεχιστεί σε επόμενη γραμμή, όπως θα πούμε παρακάτω, βάζοντας στο τέλος της γραμμής ένα & και συνεχίζοντας στην επόμενη. 40 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ είναι μέρος του συντακτικού και φυσικά δεν τυπώνεται... Για τη Fortran τα κεφαλαία/μικρά γράμματα είναι ισοδύναμα και θα μπορούσαμε να γράψουμε PRINT, Print, .... Η φράση που θέλουμε να τυπώσουμε είναι μια ακολουθία χαρακτήρων που περικλείεται από μονά ή διπλά εισαγωγικά ('Hello World!' ή "Hello World!"). Για να τρέξει το πρόγραμμα, πρέπει να μεταφραστεί σε γλώσσα μη- χανής. Τη δουλειά αυτή την αναλαμβάνει ο μεταγλωττιστής (compiler). Σε κάθε σύστημα το πρόγραμμα αυτό μπορεί να έχει διαφορετικό όνομα ή ακόμα και ο προγραμματιστής να έχει περισσότερες από μία επιλο- γές. Πρέπει να ενημερωθείτε από τον διαχειριστή του συστήματος ή τα σχετικά εγχειρίδια. Τυπικά ονόματα τέτοιων προγραμμάτων είναι f90, ifort, gfortran, .... Η πρώτη μας δουλειά είναι να μελετήσουμε με προ- σοχή τα εγχειρίδια χρήσης. Εκεί μαθαίνουμε πώς να χρησιμοποιήσουμε τις δυνατότητές του με τον καλύτερο τρόπο για το δικό μας πρόγραμμα (λ.χ. βελτιστοποίηση - optimization) Στο δικό μας σύστημα θα χρησιμοποιήσουμε τον gfortran³⁸. Η εντολή που θα δώσουμε για τη μεταγλώττιση είναι³⁹ > g f o r t r a n hello . f90 −o hello Ο διακόπτης -o ορίζει ο μεταγλωττισμένος κώδικας να γραφτεί στο αρχείο hello. Αν η μεταγλώττιση είναι επιτυχής, τότε το πρόγραμμα τρέχει με την εντολή: > . / hello Hello world ! όπου το ./ το βάλαμε για να προσδιορίσουμε ρητά πώς εκτελούμε το πρόγραμμα που περιέχεται στο αρχείο hello και πού βρίσκεται στον τρέχοντα κατάλογο (.). Ας δοκιμάσουμε τώρα να κάνουμε έναν απλό υπολογισμό, την πε- ρίμετρο και το εμβαδόν ενός κύκλου ακτίνας R. Για τον λόγο αυτό θα χρειαστούμε να χρησιμοποιήσουμε μεταβλητές τύπου REAL. Στο αρχείο area_01.f90 πληκτρολογούμε program circle_area ³⁸Ο μεταγλωττιστής αυτός είναι ελεύθερο λογισμικό και είναι διαθέσιμος για όλα τα δημοφιλή λειτουργικά συστήματα. Δείτε στο σύνδεσμο http://gcc.gnu.org/fortran/ ³⁹Θυμίζουμε στον αναγνώστη ότι γραμμές που αρχίζουν με > είναι εντολές που δίνουμε στη γραμμή εντολών. Οτιδήποτε άλλο είναι output του προγράμματος. 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 41 PI = 3.14159265358979 R = 4.0 p r i n t * , ’ P e r i m e t e r= ’ , 2 . 0 * PI * R p r i n t * , ’ Area= ’ , PI * R * * 2 end program circle_area Στο παραπάνω πρόγραμμα ορίσαμε τις τιμές των δύο μεταβλητών R, PI στη 3η και 4η γραμμή. Το ότι οι μεταβλητές είναι τύπου REAL καθο- ρίζεται από το όνομα της μεταβλητής. Η Fortran έχει implicit rules για να το καθορίζει. Σύμφωνα με αυτούς, μεταβλητές που το όνομά τους αρχίζει από i, j, k, l, m, n είναι τύπου INTEGER (ακέραιοι), ενώ κάθε άλλη είναι τύπου REAL. Αλλαγή γίνεται μόνο αν δηλώσουμε ρητά τον τύπο μιας μεταβλητής όπως θα δείξουμε αργότερα⁴⁰. Στην 5η και 6η γραμμή κάνουμε τον υπολογισμό 2πR και πR2 κατευθείαν στο όρισμα της εντολής print. Οι τελεστές πολλαπλασιασμού και δύναμης είναι * και ** αντίστοιχα. Προσέξτε ότι στις σταθερές 2.0 και 4.0 βάλαμε ρητά την υποδιαστολή. Αν τις παραλείψουμε, οι σταθερές είναι τύπου INTEGER και, αν δεν είναι αυτό που πραγματικά θέλουμε, το αποτέλεσμα μπορεί να μας ... καταπλήξει⁴¹. Αν υποθέσουμε ότι το πρόγραμμα είναι αποθηκευμένο στο αρχείο area_01.f90, οι εντολές μεταγλωττισμού και εκτέλεσης του προγράμματος είναι > g f o r t r a n area_01 . f90 −o area > . / area Perimeter= 25.13274 Area= 50.26548 Ας δοκιμάσουμε τώρα μια επαναλαμβανόμενη διεργασία. Ας κά- νουμε τον παραπάνω υπολογισμό για 10 διαφορετικούς κύκλους ακτί- νας Ri = 1.28 + i, i = 1, . . . , 10. Τις ακτίνες θα τις αποθηκεύσουμε σε ένα array R(10) τύπου REAL. Το αρχείο area_02.f90: program circle_area dimension R ( 1 0 ) PI = 3.14159265358979 R ( 1 ) = 2.28 do i =2 ,10 R ( i ) = R ( i−1) + 1 . 0 ⁴⁰Μπορούμε να αλλάξουμε τους κανόνες αυτούς με την εντολή implicit. ⁴¹Δοκιμάστε την εντολή print *, 2.0/4.0, 2/4 στο παραπάνω πρόγραμμα. 42 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ enddo do i = 1 , 1 0 perimeter = 2* PI * R ( i ) area = PI * R ( i ) * * 2 p r i n t * , i , ’ ) R= ’ , R ( i ) , ’ p e r i m e t e r= ’ , perimeter p r i n t * , i , ’ ) R= ’ , R ( i ) , ’ a r e a = ’ , area enddo end program circle_area Η εντολή dimension R(10) ορίζει ένα μονοδιάστατο array με 10 στοιχεία. Με τον τρόπο αυτό στη Fortran, τα στοιχεία των arrays αναφέρονται με έναν δείκτη που παίρνει τιμές από 1 μέχρι το μήκος του array (εδώ 10). Άρα R(4) είναι το τέταρτο στοιχείο του R. Μεταξύ των εντολών do i = 2 , 10 ... enddo περιέχονται εντολές που εκτελούνται επαναληπτικά με την ακέραια με- ταβλητή i να παίρνει τιμή από 2 έως 10 με βήμα 1⁴². Η εντολή R ( i ) = R ( i−1) + 1 . 0 ορίζει την ακτίνα με δείκτη i να είναι κατά 1 μεγαλύτερη από την προηγούμενη. Για να είναι σωστή η επαγωγή θα πρέπει να ορίσουμε την τιμή της R(1), πριν αρχίσει το do loop. Μετά από αυτή την εξήγηση, νομίζω πως μπορεί εύκολα να γίνει κατανοητό τι γίνεται στο δεύτερο do loop του προγράμματος. Ο αναγνώστης θα πρέπει να δοκιμάσει το παραπάνω πρόγραμμα και να πειραματιστεί κάνοντας μικροαλλαγές. Ας μετατρέψουμε τώρα το παραπάνω πρόγραμμα, έτσι ώστε ο χρή- στης να δίνει διαδραστικά τις ακτίνες του κύκλου, το πρόγραμμα να υπολογίζει τις ακτίνες και τα εμβαδά και στη συνέχεια, να γράφει τα αποτελέσματα σε ένα αρχείο. Άρα, το πρόγραμμα πρέπει να πάρει ως input από τον χρήστη τα μέτρα των ακτίνων Ri , i = 1, . . . , 10. Γράφουμε στο αρχείο area_03.f90: program circle_area ⁴²Το βήμα μπορεί να αλλάξει λ.χ. do i=0,12,4 τρέχει για i=0,4,8,12 και η do i=10,6,-2 για i=10,8,6 αντίστοιχα. 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 43 i m p l i c i t none i n t e g e r , parameter :: N=10 real , parameter :: PI =3.141593 real , dimension ( N ) :: R real :: area , perimeter integer :: i do i =1 , N p r i n t * , ’ Enter r a d i u s o f c i r c l e : ’ read * , R ( i ) p r i n t * , ’ i = ’ , i , ’ R( i )= ’ , R ( i ) enddo open (UNIT=13 ,FILE= ’AREA.DAT’ ) do i = 1 , N perimeter = 2* PI * R ( i ) area = PI * R ( i ) * * 2 w r i t e ( 1 3 , * ) i , ’ ) R= ’ , R ( i ) , ’ a r e a= ’ , area ,& ’ p e r i m e t e r= ’ , perimeter enddo close (13) end program circle_area Παρατηρήστε τώρα ότι η πρώτη εντολή που δίνουμε είναι η implicit none. Αυτό δηλώνει ότι δε θέλουμε να χρησιμοποιήσουμε τους implicit κανόνες της Fortran, αλλά θέλουμε να υποχρεώσουμε τον εαυτό μας να δηλώσει ρητά κάθε μεταβλητή του προγράμματος. Αυτό σημαίνει πως θα μας πάρει λίγο παραπάνω χρόνο να πληκτρολογήσουμε τους ορισμούς, αλλά σας υπόσχομαι ότι αυτός ο κόπος δεν συγκρίνεται με τίποτα με τον πόνο να βρει κάποιος δύσκολα σφάλματα στο πρόγραμμα που οφείλονται σε μικρά ορθογραφικά λάθη στα ονόματα των μεταβλη- τών⁴³. Θα ακολουθήσουμε αυτή την πρακτική σε ολόκληρο το βιβλίο. Μετά από αυτή την εντολή ακολουθούν οι δηλώσεις (declarations) των μεταβλητών. Οι μεταβλητές N, i δηλώνονται ως integer, ενώ οι PI, area, perimeter, R(N) ως real. Οι N, PI δηλώνονται να είναι παράμετροι (parameter) των οποίων η τιμή δεν μπορεί να αλλάξει στη ροή του προγράμματος. Μετά τις δηλώσεις των μεταβλητών ακολουθούν οι εκτελέσιμες εντο- λές. Το πρώτο do loop δεν έχει τίποτα καινούργιο εκτός από την εντολή ⁴³Ποια η διαφορά στο όνομα της μεταβλητής pl1 από την p11; 44 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ read * , R ( i ) Με την εντολή αυτή διαβάζουμε από το stdin την τιμή της μεταβλητής R(i). Ο χρήστης πρέπει να την πληκτρολογήσει στο τερματικό και να πατήσει το πλήκτρο [Enter]. Μπορούμε με την ίδια εντολή read να διαβάσουμε περισσότερες από μία μεταβλητές. Για να τυπώσουμε δεδομένα σε ένα αρχείο, πρέπει να συνδέσουμε το όνομα του αρχείου με ένα UNIT που αντιστοιχεί σε έναν ακέραιο με τιμή μέσα σε κάποια όρια που καθορίζονται από το σύστημα⁴⁴. Η σύνδεση αυτή γίνεται με την εντολή open και μετά μπορούμε να γράφουμε με την εντολή write(unit_number,*)...⁴⁵. Όταν τελειώσουμε, κλείνουμε το αρχείο με την εντολή close και μπορούμε να συνδέσουμε UNIT με ίδιο αριθμό σε άλλο αρχείο. Η λογική ροή είναι δηλαδή open (UNIT=13 ,FILE= ’AREA.DAT’ ) ... write (13 ,*) . . . . ... close (13) Το όνομα του αρχείου καθορίζεται από το όρισμα FILE='AREA.DAT' της εντολής open και εδώ η διαφοροποίηση στα κεφαλαία ή τα μικρά γράμ- ματα δίνει διαφορετικά αρχεία. Το όρισμα FILE='path' μπορεί να πάρει οποιοδήποτε path από το σύστημα των αρχείων. Το τελευταίο που παρατηρούμε είναι η γραμμή w r i t e ( 1 3 , * ) i , ’ ) R= ’ , R ( i ) , ’ a r e a= ’ , area ,& ’ p e r i m e t e r= ’ , perimeter που μας δείχνει πώς να συνεχίζουμε μια μακριά εντολή στην επόμενη γραμμή. Αρκεί να βάλουμε το χαρακτήρα & στο τέλος της γραμμής και η επόμενη γραμμή θεωρείται συνέχεια της προηγούμενης. Αυτό μπορεί να γίνει μέχρι 39 φορές. Το επόμενο βήμα είναι να μάθουμε πώς να χωρίζουμε το πρόγραμμά μας σε λογικά διαφορετικές διαδικασίες οι οποίες μπορεί να επαναλαμ- βάνονται πολλές φορές στο πρόγραμμά μας. Θα δείξουμε τη διαδικα- σία της υπορουτίνας (subroutine) ορίζοντας τον υπολογισμό του εμβα- δού και της περιφέρειας του κύκλου να γίνεται από την subroutine ⁴⁴Μπορείτε με ασφάλεια να χρησιμοποιήσετε από 10-99. Ειδικά, το 5 είναι το stdin, το 6 το stdout και το 0 το stderr. ⁴⁵Δοκιμάστε τι γίνεται, αν γράψετε σε ένα UNIT χωρίς να έχετε ανοίξει ένα αρχείο... 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 45 area_of_circle. Ορίστε τι γράφουμε μέσα στο αρχείο area_04.f90: program circle_area i m p l i c i t none i n t e g e r , parameter :: N=10 real , parameter :: P =3.141593 real , dimension ( N ) :: R real :: area , perimeter integer :: i do i =1 , N p r i n t * , ’ Enter r a d i u s o f c i r c l e : ’ read * , R ( i ) p r i n t * , ’ i = ’ , i , ’ R( i )= ’ , R ( i ) enddo open (UNIT=13 ,FILE= ’AREA.DAT’ ) do i = 1 , N c a l l area_of_circle ( R ( i ) , perimeter , area ) w r i t e ( 1 3 , * ) i , ’ ) R= ’ , R ( i ) , ’ a r e a= ’ , area ,& ’ p e r i m e t e r= ’ , perimeter enddo close (13) end program circle_area s u b r o u t i n e area_of_circle ( R , L , A ) i m p l i c i t none real :: R,L,A r e a l , parameter : : PI = 3.141593 , PI2 = 2 . 0 * PI L= PI2 * R A= PI * R * R return end s u b r o u t i n e area_of_circle Οι αλλαγές που κάναμε αφορούν καταρχήν το κυρίως πρόγραμμα. Οι υπολογισμοί της περιμέτρου και του εμβαδού αντικαταστάθηκαν από τη γραμμή c a l l area_of_circle ( R ( i ) , perimeter , area ) 46 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Η εντολή call κάνει αυτό που λέει: καλεί τη διαδικασία που ορίζε- ται στην υπορουτίνα area_of_circle. Τα (R(i),perimeter,area) εί- ναι τα ορίσματα της υπορουτίνας. Το R(i) είναι μεταβλητή εισόδου η οποία παρέχει δεδομένα για να κάνει τον υπολογισμό η υπορουτίνα. Οι perimeter,area είναι οι μεταβλητές εξόδου στις οποίες κατά την έξοδό της η υπορουτίνα αποθηκεύει τα αποτελέσματα. Ο προγραμμα- τιστής της υπορουτίνας πρέπει να μας δώσει σαφείς οδηγίες για τις μεταβλητές εισόδου/εξόδου έτσι ώστε να χρησιμοποιήσουμε σωστά την υπορουτίνα. Η υπορουτίνα προγραμματίζεται ανάμεσα στις δηλώσεις s u b r o u t i n e area_of_circle ( R , L , A ) ... end s u b r o u t i n e area_of_circle Τα ορίσματα 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 που υπολογίζει τις ρίζες ενός τριωνύμου: ! ============================================================= ! Program t o compute r o o t s o f a 2nd order polynomial ! Tasks : Input from user , l o g i c a l s t a t e m e n t s , ! use o f f u n c t i o n s , s t o p ! Accuracy i n f l o a t i n g p o i n t a r i t h m e t i c ! e . g . IF ( x . eq . 0 . 0 ) ! ! T e s t s : a , b , c= 1 2 3 D= −8 ! a , b , c= 1 −8 16 D= 0 x1= 4 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 47 ! a , b , c= 1 −1 −2 D= 9 . x1= 2 . x2= −1. ! a , b , c= 2.3 −2.99 −16.422 x1= 3. 4 x2= −2.1 ! But : 6 . 8 ( x −4.3) * * 2 = 6.8 x * * 2 −58.48*x +125.732 ! a , b , c= 6.8 −58.48 125.73199 ! D= 0.000204147349 x1= 4.30105066 x2= 4.29894924 ! a , b , c= 6.8 −58.48 1 2 5 . 7 3 2 , D= −0.000210891725 < 0 ! ! ! ============================================================= program trionymo i m p l i c i t none real : : a , b , c , D r e a l : : x1 , x2 r e a l : : Discriminant p r i n t * , ’ Enter a , b , c : ’ read * , a , b , c ! T e s t i f we have a w e l l d e f i n e d polynomial o f 2nd degree : i f ( a . eq . 0 . 0 ) s t o p ’ trionymo : a=0 ’ ! Compute t h e d i s c r i m i n a n t (= d i a k r i n o u s a ) D = Discriminant ( a , b , c ) p r i n t * , ’ D i s c r i m i n a n t : D= ’ , D ! Compute t h e r o o t s i n each c a s e : D>0 , D=0 , D<0 ( no r o o t s ) i f ( D . gt . 0.0 ) then c a l l roots ( a , b , c , x1 , x2 ) p r i n t * , ’ Roots : x1= ’ , x1 , ’ x2= ’ , x2 e l s e i f ( D . eq . 0 . 0 ) then c a l l roots ( a , b , c , x1 , x2 ) p r i n t * , ’ Double Root : x1= ’ , x1 else p r i n t * , ’No r e a l r o o t s ’ endif end program trionymo ! ============================================================= ! This i s t h e f u n c t i o n t h a t computes t h e d i s c r i m i n a n t ! A f u n c t i o n r e t u r n s a v a l u e . This v a l u e i s a s s i g n e d with t h e ! statement : ! D i s c r i m i n a n t = <value > ! i . e . we simply a s s i g n anywhere i n t h e program a v a r i a b l e with ! t h e name o f t h e f u n c t i o n . ! ============================================================= r e a l f u n c t i o n Discriminant ( a , b , c ) i m p l i c i t none real : : a , b , c Discriminant = b * * 2 − 4.0 * a * c 48 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ end f u n c t i o n Discriminant ! ============================================================= ! The s u b r o u t i n e t h a t computes t h e r o o t s . ! ============================================================= s u b r o u t i n e roots ( a , b , c , x1 , x2 ) i m p l i c i t none real : : a , b , c r e a l : : x1 , x2 r e a l : : D , Discriminant i f ( a . eq . 0 . 0 ) s t o p ’ r o o t s : a=0 ’ D = Discriminant ( a , b , c ) i f ( D . ge . 0 . 0 ) then D = sqrt ( D ) else p r i n t * , ’ r o o t s : Sorry , cannot compute r o o t s , D<0= ’ , D stop endif x1 = (−b + D ) / ( 2 . 0 * a ) x2 = (−b − D ) / ( 2 . 0 * a ) end s u b r o u t i n e roots Το πρόγραμμα ζητάει τους συντελεστές του τριωνύμου ax2 +bx+c. Ελέγ- χει αν είναι καλά ορισμένο a ̸= 0 και αν όχι, σταματάει το πρόγραμμα με την εντολή stop. Στη συνέχεια, υπολογίζει τη διακρίνουσα (discriminant) D = b2 − 4ac καλώντας τη συνάρτηση Discriminant(a,b,c). Η συνάρ- τηση (function) διαφέρει από τη subroutine στο ότι καλείται απευ- θείας (χωρίς την εντολή call) και επιστρέφει μια τιμή της οποίας ο τύπος πρέπει να δηλωθεί όπως οποιαδήποτε άλλη μεταβλητή (real :: Discriminant). Στη συνέχεια, ξεχωρίζουμε τις γνωστές περιπτώσεις με τη δομή i f ( D . gt . 0.0 ) then ... e l s e i f ( D . eq . 0 . 0 ) then ... else ... endif 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 49 όπου παρατηρούμε και τους τελεστές σύγκρισης .gt. (greater than- αυστηρά μεγαλύτερο) και .eq. (equal-ίσο)⁴⁶. Για τη συνάρτηση Discriminant πρέπει να δηλωθεί τι τύπου τιμή επιστρέφει (εδώ real), καθώς και ο τύπος των ορισμάτων της όπως και για τη subroutine. Η τιμή που επιστρέφει καθορίζεται τοποθετώντας τη σε μια μεταβλητή με όνομα ίδιο με αυτό της συνάρτησης: r e a l f u n c t i o n Discriminant ( a , b , c ) ... Discriminant = b * * 2 − 4.0 * a * c ... end f u n c t i o n Discriminant 1.4.2 Μερικές λεπτομέρειες Την παράγραφο αυτή μπορείτε να την αγνοήσετε την πρώτη φορά που διαβάζετε αυτό το κεφάλαιο. Σκοπός είναι περισσότερο να χρησιμεύσει σαν αναφορά, όταν θα έχετε απορίες στα επόμενα κεφάλαιο. Ξεκινάμε αναφέροντας και άλλους ενδιαφέροντες τύπους μεταβλη- τών. Στο παρακάτω πρόγραμμα δείχνουμε πώς να χρησιμοποιήσετε με- ταβλητές τύπου CHARACTER, πραγματικούς διπλής ακρίβειας REAL(8) και μιγαδικούς αριθμούς μονής COMPLEX και διπλής ακρίβειας COMPLEX(8): program f90_vars i m p l i c i t none c h a r a c t e r ( 1 0 0 ) : : string real (4) :: x ! s i n g l e p r e c i s i o n , same as r e a l : : x real (8) : : x8 ! e q u i v a l e n t t o : double p r e c i s i o n x8 ! re al (16) : : x16 ! may not be supported by a l l c o m p i l e r s ! Complex Numbers : complex ( 4 ) : : z ! s i n g l e p r e c i s i o n , same as complex : : z complex ( 8 ) : : z8 ! double p r e c i s i o n !A s t r i n g : a c h a r a c t e r a r r a y : string = ’ H e l l o World ! ’ ! s t r i n g s m a l l e r s i z e , l e a v e s blanks ! TRIM : t r i m blanks p r i n t * , ’A s t r i n g : : ’ , string , ’ : : ’ ,TRIM( string ) , ’ : : ’ p r i n t * , ’ j o i n them : : ’ , string // string , ’ : : ’ ⁴⁶Παρόμοιοι τελεστές είναι .lt., .ge., .le. (μικρότερο, μεγαλύτερο ή ίσο, μικρό- τερο ή ίσο) και .ne., .and., .or. (μη ίσο, λογικό και, λογικό ή) 50 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ print * , ’ j o i n them : : ’ , TRIM( string ) / / TRIM( string ) , ’ : : ’ ! Reals with i n c r e a s i n g a c c u r a c y : Determine PI = 3 . 1 4 1 5 9 . . . x = 4.0 * atan ( 1 . 0 ) ! Use D f o r double p r e c i s i o n exponent x8 = 4.0 D0 * atan ( 1 . 0 D0 ) ! Use Q f o r q u a d r i p l e p r e c i s i o n exponent ! x16 = 4.0Q0* atan ( 1 . 0 Q0) print * , ’ x4= ’ , x , ’ x8= ’ , x8 ! , ’ x16= ’ , x16 print * , ’ x4 : ’ , range ( x ) , p r e c i s i o n ( x ) , EPSILON( x ) ,& TINY( x ) ,HUGE( x ) p r i n t * , ’ x8 : ’ , range ( x8 ) , p r e c i s i o n ( x8 ) , EPSILON( x8 ) ,& TINY( x8 ) ,HUGE( x8 ) ! Complex numbers : s i n g l e p r e c i s i o n z = ( 2 . 0 , 1 . 0 ) * cexp ( ( 3 . 0 , − 1 . 0 ) ) p r i n t * , ’ z= ’ , z , ’ Re ( z )= ’ ,REAL( z ) , ’ Im( z )= ’ ,IMAG( z ) ,& ’ | z | = ’ ,ABS( z ) , ’ z *= ’ , CONJG( z ) ! Complex numbers : double p r e c i s i o n z8 = ( 2 . 0 D0 , 1 . 0 D0 ) * cdexp ( ( 3 . 0 D0 , −1.0 D0 ) ) p r i n t * , ’ z= ’ , z8 , ’ Re ( z )= ’ ,DBLE( z8 ) , ’ Im( z )= ’ ,DIMAG( z8 ) ,& ’ | z | = ’ ,CDABS( z8 ) , ’ z *= ’ ,DCONJG( z8 ) p r i n t * , ’ z4 : ’ , range ( z ) , p r e c i s i o n ( z ) p r i n t * , ’ z8 : ’ , range ( z8 ) , p r e c i s i o n ( z8 ) end program f90_vars Τα σημεία που πρέπει να προσέξουμε στο παραπάνω πρόγραμμα είναι: • Ο αριθμός K στη δήλωση REAL(K) :: x υποδηλώνει τον αριθμό των bytes που χρησιμοποιούνται για την αποθήκευση της μεταβλητής x. Για K=4 έχουμε μεταβλητές μονής ακρίβειας, για K=8 διπλής και για K=16 τετραπλής ακρίβειας. Η τελευταία δυνατότητα δεν προ- σφέρεται σε όλες τις πλατφόρμες. Για τις δηλώσεις COMPLEX(K) :: z, το K αναφέρεται στην ακρίβεια του πραγματικού και φανταστι- κού μέρους του z⁴⁷. • Όταν χρησιμοποιούμε σταθερές στις μεταβλητές διπλής ακρίβειας, βάζουμε πάντα τον εκθέτη, έστω και αν είναι 0. Ο εκθέτης υπο- δηλώνεται με το γράμμα D αντί του E που χρησιμοποιείται για τις μεταβλητές REAL. Αλλιώς, η σταθερά χάνει την επιθυμητή ακρίβεια. ⁴⁷Μονή ακρίβεια σημαίνει χοντρικά 7 σημαντικά ψηφία και τάξεις μεγέθους από 10−38 − 1038 . Διπλή ακρίβεια σημαίνει χοντρικά 16-17 σημαντικά ψηφία και τάξεις μεγέθους από 10−308 − 10308 . Παρατηρήστε πώς παίρνουμε αυτές τις πληροφορίες από τις συναρτήσεις range, precision, tiny, huge. 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 51 • Οι συναρτήσεις για μεταβλητές διπλής ακρίβειας, συνήθως, παίρ- νουν ένα έξτρα D στο όνομά τους (exp→dexp, ABS→DABS), ενώ οι αντίστοιχες για μιγαδικούς ένα έξτρα C (DABS→CABS, exp→cexp κλπ). Τρέξτε το πρόγραμμα και παρατηρήστε την αυξημένη ακρί- βεια υπολογισμού του π και του z = (2 + i)e3−i χρησιμοποιώντας μεταβλητές διπλής ακρίβειας. • Οι μεταβλητές τύπου CHARACTER δηλώνονται με το μέγεθός τους, εδώ 100 χαρακτήρες βάζοντας CHARACTER(100). Αν περάσουμε το όριο αυτό, οι παραπάνω χαρακτήρες ... κόβονται. • Όταν θέτουμε μεταβλητές τύπου CHARACTER με το =, αυτές γεμίζουν από τα αριστερά προς τα δεξιά. Οι υπόλοιποι χαρακτήρες μέχρι το τέλος της μεταβλητής θέτονται να είναι ο κενός χαρακτήρας (blank). • Όταν τυπώνεται μία μεταβλητή τύπου CHARACTER, τυπώνονται όλοι οι χαρακτήρες της, συμπεριλαμβανομένων και των καταληκτικών κενών (blanks). Με τη συνάρτηση TRIM, τα καταληκτικά κενά κό- βονται. Παρατηρήστε πώς τυπώνεται το 'Hello World!' στο πα- ραπάνω πρόγραμμα... • Ο τελεστής // ενώνει δύο μεταβλητές ή/και σταθερές τύπου CHARACTER. Παρατηρήστε πώς επιδρά η συνάρτηση TRIM στα αποτελέσματα του παραπάνω προγράμματος. Ένα άλλο σημαντικό στοιχείο της γλώσσας που παραλείψαμε στην προηγούμενη παράγραφο είναι η κοινή χρήση μεταβλητών από διαφορε- τικά μέρη του προγράμματος. Μία μεταβλητή που ορίζεται σε ένα υπο- πρόγραμμα (main program, subroutine, function) είναι τοπική και δια- φορετικά υποπρογράμματα δεν μπορούν να έχουν πρόσβαση σε αυτή. Για να αποκτήσουμε πρόσβαση σε κοινό σημείο της μνήμης όπου αποθη- κεύουμε τις τιμές των μεταβλητών, χρησιμοποιούμε την εντολή COMMON. Δείτε το παρακάτω παράδειγμα: ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program f90_common i m p l i c i t none r e a l : : k1 = 1 . 0 , k2 = 1 . 0 , k3 =1.0 common / CONSTANTS / k1 , k2 p r i n t * , ’ main : k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 c a l l s1 ! p r i n t s k1 and k2 but not k3 52 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ c a l l s2 ! changes t h e v a l u e o f k2 but not k3 p r i n t * , ’ main : k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 end program f90_common ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e s1 ( ) i m p l i c i t none r e a l k1 , k2 , k3 common / CONSTANTS / k1 , k2 p r i n t * , ’ s 1 : k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 end s u b r o u t i n e s1 ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e s2 ( ) i m p l i c i t none r e a l k1 , k2 , k3 common / CONSTANTS / k1 , k2 k2 = 2.0 k3 = 2.0 end s u b r o u t i n e s2 Το COMMON block εδώ έχει το όνομα CONSTANTS και μπορούμε να αναφε- ρόμαστε σε αυτό από οποιαδήποτε υπορουτίνα ή συνάρτηση του προ- γράμματος. Στην πραγματικότητα, δείχνει σε ένα συγκεκριμένο σημείο της μνήμης και εδώ δεσμεύουμε τον χώρο για δύο μεταβλητές τύπου REAL τις k1, k2. Οι μεταβλητές αυτές διαβάζονται και αλλάζουν τιμές από τις υπορουτίνες s1 και s2, ενώ η k3 παρόλο που έχει κοινό όνομα και στο κύριο πρόγραμμα και στις υπορουτίνες, αναφέρεται σε διαφο- ρετικές μεταβλητές κάθε φορά. Το πρόγραμμα τυπώνει: main : k1= 1.000000 k2= 1.000000 k3= 1.000000 s1 : k1= 1.000000 k2= 1.000000 k3= −2.8117745E−05 main : k1= 1.000000 k2= 2.000000 k3= 1.000000 Ένα από τα αδύναμα σημεία της Fortran είναι η περιορισμένη δυ- νατότητα να χειριστούμε ευέλικτα το Input/Output (I/O). Για τον λόγο αυτό θα χρησιμοποιήσουμε άλλα προγράμματα όπως awk, perl ή προ- γράμματα στη γλώσσα C. Ακόμα όμως και η Fortran έχει χειρισμό του I/O, αλλά όντας επιστημονικά προσανατολισμένη αυτός αφορά κυρίως την ακρίβεια παρουσίασης των αριθμών. Αν έχετε να χειρισθείτε κεί- μενο με πολύπλοκο τρόπο, καλύτερα να διαλέξτε μια άλλη γλώσσα προγραμματισμού... Μέχρι στιγμής οι μόνες εντολές φορμά που χρη- σιμοποιήσαμε για I/O είναι οι προκαθορισμένες χρησιμοποιώντας το *, λ.χ. print *, read *, write( ,*). Αλλά το * μπορεί να αντικατασταθεί 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 53 με εντολές φορμά σύμφωνα με το παρακάτω παράδειγμα: program f90_format1 i m p l i c i t none integer :: i real :: x r e a l , dimension ( 1 0 ) :: a real (8) :: x8 i = 123456 x = 2.0 * atan2 ( 1 . 0 , 0 . 0 ) p r i n t ’ (A5 , I6 , F12 . 7 ) ’ , ’ x , i = ’ , i , x x8 = 2.0 D0 * atan2 ( 1 . 0 D0 , 0 . 0 D0 ) w r i t e ( 6 , ’ ( F18 . 1 6 , E24 . 1 7 , G24 . 1 7 , G24 . 1 7 ) ’ ) x8 , x8 ,& 1 . 0 D15 * x8 , 1 . 0 D18 * x8 w r i t e ( 6 , ’ (3F20 . 1 6 ) ’ ) x8 , x8 / 2 . 0 , c o s ( x8 ) w r i t e ( 6 , ’ (200F12 . 6 ) ’ ) ( a ( i ) , i = 1 , 1 0 ) end program f90_format1 Προσέξτε τις παρενθέσεις μέσα στα εισαγωγικά: (A5,I6,F12.7) είναι εντολή φορμά για την εντολή print και δίνει οδηγίες για την εκτύ- πωση τριών μεταβλητών: A είναι για CHARACTER, I για INTEGER και F για REAL. Οι αριθμοί αμέσως μετά το γράμμα υποδηλώνουν τον αριθμό των χαρακτήρων που θα χρησιμοποιηθούν για την εκτύπωση. Προσοχή! Αν δεν είναι αρκετές οι θέσεις εκτύπωσης, η Fortran θα αρνηθεί να κά- νει την εκτύπωση και θα τυπώσει μια σειρά από *, τα αστεράκια του τρόμου⁴⁸. Και στις θέσεις αυτές πρέπει να συνυπολογίσετε τον αριθμό των δεκαδικών ψηφίων, την υποδιαστολή, το πρόσημο, τα ψηφία και το πρόσημο του εκθέτη... Μην είστε τσιγκούνηδες λοιπόν, δώστε άπλετο χώρο και μπορεί να σας χρειαστεί... Εδώ A5 υποδηλώνει CHARACTER που θα τυπωθεί σε 5 θέσεις χαρακτήρων, I6 INTEGER 6 θέσεων και F12 REAL 12 χαρακτήρων. Μετά την υποδιαστολή στο F12.7 υποδηλώνουμε πόσα δεκαδικά ψηφία θέλουμε να τυπωθούν. Στην εντολή φορμά (F18.16,E24.17,G24.17,G24.17) δίνουμε οδη- γίες για την εκτύπωση μιας μεταβλητής διπλής ακρίβειας. Στην καλύ- τερη περίπτωση έχουμε περίπου 16 δεκαδικά ψηφία ακρίβειας οπότε δεν έχει νόημα να κρατάμε παραπάνω (σε έναν υπολογισμό, συνήθως χάνουμε ακρίβεια). Με την εντολή F θέλει προσοχή: Αν χρειαστεί εκ- θέτης για την αναπαράσταση, ο αριθμός δε θα τυπωθεί και συνήθως το αποφεύγουμε, εκτός αν είμαστε σίγουροι ότι δε χρειάζεται εκθέτης. Η επιλογή E γράφει τον αριθμό πάντα σε επιστημονική μορφή με εκ- ⁴⁸Σκεφτείτε μετά από έναν επίπονο υπολογισμό να πάτε να δείτε τα πολυπόθητα αποτελέσματα μόνο για να ανακαλύψετε ότι κάνατε λάθος στην εντολή του φορμά... 54 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ θέτη. Η επιλογή G γράφει τον αριθμό χωρίς εκθέτη, αν δε χρειάζεται, και με εκθέτη αν χρειάζεται. Οι αριθμοί έχουν την ίδια έννοια όπως και πριν. Στην εντολή φορμά (3F20.16) δείχνουμε πώς δίνουμε ένα πολλαπλασιαστικό παράγοντα 3 στην εκτύπωση των REAL*8. Και στην τελευταία, δείχνουμε πώς να τυπώνουμε ένα μεγάλο διάνυσμα σε μία γραμμή: write(6,'(200F12.6)')(a(i), i=1,10). Ο πολλαπλασιαστικός παράγοντας μπορεί να είναι μεγαλύτερος από αυτόν που θα χρησιμο- ποιήσουμε. Το πρόγραμμα τυπώνει (τη δεύτερη γραμμή τη διπλώσαμε για να φαίνεται): x , i= 123456 3.1415927 3.1415926535897931 0.31415926535897931E+01 3141592653589793.0 0.31415926535897933E+19 3.1415926535897931 1.5707963267948966 −1.0000000000000000 0.000000 0.000000 0.000000 . . . . Οι εντολές φορμά μπορούν να μοιράζονται με ... παραπομπές. Αν μια εντολή αρχίζει με έναν αριθμό 1-99999, ο αριθμός αυτός είναι μία “ετικέτα” στην εντολή που ακολουθεί (labeled statement). Αν η εντολή αυτή είναι εντολή FORMAT, τότε μπορούμε να αναφερθούμε σε αυτή με τον αριθμό της από τις εντολές PRINT, WRITE και READ. Έτσι, πολλές εντολές I/O μπορούν να χρησιμοποιούν την ίδια εντολή FORMAT, αν τυ- πώνουν με τον ίδιο τρόπο. Το παρακάτω πρόγραμμα κάνει ακριβώς ό,τι και το παραπάνω με τη μόνη διαφορά ότι χρησιμοποιούμε labeled statements και εντολές FORMAT: program f90_format2 i m p l i c i t none integer i real x , a (10) r e a l *8 x8 i = 123456 x = 2.0 * atan2 ( 1 . 0 , 0 . 0 ) p r i n t 100 , ’ x , i = ’ , i , x x8 = 2.0 D0 * atan2 ( 1 . 0 D0 , 0 . 0 D0 ) w r i t e ( 6 , 1 2 3 ) x8 , x8 ,& 1 . 0 D15 * x8 , 1 . 0 D18 * x8 w r i t e ( 6 , 4 4 4 4 ) x8 , x8 / 2 . 0 , c o s ( x8 ) w r i t e (6 ,9999) ( a ( i ) , i = 1 , 1 0 ) 100 FORMAT( A5 , I6 , F12 . 7 ) 123 FORMAT( F18 . 1 6 , E24 . 1 7 , G24 . 1 7 , G24 . 1 7 ) 4444 FORMAT(3 F20 . 1 6 ) 9999 FORMAT(200 F12 . 6 ) 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 55 end program f90_format2 Τέλος, ο/η αναγνώστης/τρια θα πρέπει να μελετήσει τις διαθέσιμες συναρτήσεις της Fortran (intrinsic functions) που δίνονται στον Πίνακα 1.2 της σελίδας 77. 1.4.3 Χειρισμός των arrays Την παράγραφο αυτή μπορείτε να την αγνοήσετε την πρώτη φορά που διαβάζετε αυτό το κεφάλαιο. Θα σας φανεί χρήσιμη αργότερα. Τα arrays είναι ένας τρόπος να αναφερόμαστε σε μια συστοιχία τι- μών συγκεκριμένου τύπου που είναι αποθηκευμένες στη μνήμη. Οι τιμές ή στοιχεία των arrays αναφέρονται με τους δείκτες οι οποίοι παίρνουν ακέραιες τιμές μέσα σε κάποια όρια. Για παράδειγμα A (1) , A (2) , . . . , A (10) αναφέρεται στις δέκα επιτρεπόμενες real τιμές ενός array που έχει δη- λωθεί ως real, dimension(10) :: A. Οι δείκτες μπορεί να είναι ακέ- ραιες εκφράσεις, όπως A ( i ) , B ( 2 * i+3) , C ( INT ( x+y ( j ) ) ) όπου στην τελευταία χρησιμοποιούμε την ακέραια τιμή της συνάρτησης INT(x). Παρατηρήστε ότι τα στοιχεία των arrays και οι τιμές συναρτή- σεων χρησιμοποιούν ίδιου τύπου παρενθέσεις και για να καταλάβει ο μεταγλωττιστής τη διαφορά θα πρέπει να κοιτάξει τις δηλώσεις των ονο- μάτων τους. Οι δηλώσεις των arrays γίνονται με τον παρακάτω τρόπο: r e a l , dimension ( 1 0 ) : : a , b r e a l , dimension (20) : : c , d ορίζει τα arrays a, b, c, d με στοιχεία a(1) ... a(10), b(1) ... b(10), c(1) ... c(20) και d(1) ... d(20) που είναι τύπου real. Ισοδύναμα θα μπορούσαν να οριστούν με τη δήλωση r e a l : : a ( 1 0 ) , b ( 1 0 ) , c (20) , d (20 ) ή i n t e g e r , parameter : : n1 = 1 0 , n2 = 20 56 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ real , dimension ( n1 ) : : a , c ( n2 ) real : : b ( n1 ) , d ( n2 ) Στην τελευταία μορφή, χρησιμοποιήσαμε τις σταθερές n1, n2 για τις δηλώσεις και δείχνουμε πώς να κάνουμε δηλώσεις arrays με διαφορετική έκταση. Στην παραπάνω μορφή, το κατώτερο όριο (lower bound) των arrays είναι το 1 και το ανώτερο όριο (upper bound) 10 για τα a, b και 20 για τα c, d. Τα όρια αυτά μπορούμε να τα προσδιορίσουμε ρητά. Έτσι, οι δηλώσεις i n t e g e r , parameter : : n1 = 1 0 , n2 = 20 real , dimension ( 0 : n1 ) :: a real , dimension(−n1 : n2 ) :: c ορίζουν το array a με 11 τιμές a(0) ... a(10) και το array c με 31 τιμές c(-10) c(-9) ... c(-1) c(0) c(1) ... c(20). Τα παραπάνω arrays έχουν μόνο μία διάσταση (“διανύσματα”). Μπο- ρούμε όμως να ορίσουμε και arrays με περισσότερες από μία διαστά- σεις προσθέτοντας περισσότερους δείκτες στο όνομα του array⁴⁹. Έτσι, η δήλωση i n t e g e r , dimension ( 2 , 2 ) :: a δηλώνει ένα array με integer τιμές a(1,1), a(1,2), a(2,1), a(2,2). Παρακάτω δηλώνουμε δύο arrays με τρεις διαστάσεις: i n t e g e r , parameter : : n1 = 1 0 , n2 = 20 , n3 = 2* n1+n2 r e a l , dimension ( n1 , n2 , n3 ) :: a r e a l , dimension(−n1 : n1 , 0 : n2 , 1 3 : n3 ) : : b Μερικοί σημαντικοί ορισμοί που θα συναντήσετε στη βιβλιογραφία (οι αγγλικοί όροι δίνονται με έντονη γραφή): • array: διαδοχικές τιμές στη μνήμη ορισμένου τύπου στις οποίες αναφερόμαστε χρησιμοποιώντας έναν ή περισσότερους δείκτες. Οι μεταβλητές με μόνο μία τιμή λέγονται βαθμωτές (scalar). • Κάθε διάσταση (dimension) έχει ένα άνω και ένα κάτω όριο (upper bound, lower bound) που καθορίζουν τα όρια των επιτρεπτών τιμών των δεικτών (index) του array. Όταν το lower bound παρα- λείπεται σε μία δήλωση, τότε αυτό τίθεται ίσο με 1. ⁴⁹Η Fortran επιτρέπει μέχρι επτά δείκτες σε ένα array. 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 57 • Ο αριθμός των διαστάσεων ή ισοδύναμα ο αριθμός των δεικτών ενός array λέγεται rank του array. • H έκταση (extent) μιας διάστασης είναι ο αριθμός των στοιχείων στη διάσταση αυτή. Ισούται με (upper bound)-(lower bound)+1. • Το μέγεθος (size) ενός array είναι ο συνολικός αριθμός των στοι- χείων του. Για ένα μονοδιάστατο array είναι το ίδιο με το extent του array, ενώ για ένα πολυδιάστατο το γινόμενο των extents κάθε διάστασης. • Το σχήμα (shape) ενός array είναι το rank και το extent της κάθε διάστασής του. Για να καθορίσουμε τις τιμές των στοιχείων των arrays μπορούμε να τις χειριστούμε όπως τα scalars: integer : : i real : : a (4) , b (2 ,2) b ( 1 , 1 ) = 2.0 ; b ( 1 , 2 ) = 4.0 b ( 2 , 1 ) = 3.4 ; b ( 2 , 2 ) = 7 . 8 do i =1 ,4 a(i) = 1.0 enddo Εναλλακτικά, μπορούμε να χρησιμοποιήσουμε το όνομα του array ως αντικείμενο. Για παράδειγμα a = ( / 1 . 0 , 2 . 0 , 3 . 0 , 4.0 / ) b = 0.0 στην πρώτη γραμμή θέτουμε τις τιμές στο array a χρησιμοποιώντας έναν array constructor. Στη δεύτερη γραμμή, όλα στοιχεία του b θέ- τονται ίσα με 0. Αυτό δείχνει μία εξαιρετική ευκολία που παρέχει η Fortran στη χρήση των arrays. Μπορούμε να χρησιμοποιήσουμε όλες τις intrinsic operations της Fortran με ολόκληρα arrays, αρκεί αυτά να είναι conformable. Δύο arrays είναι conformable, αν έχουν το ίδιο shape ή το ένα είναι scalar. Έτσι, το παρακάτω πρόγραμμα integer : : i , j real : : x , y , a (10) , b (10) , c (4 ,4) , d (4 ,4) 58 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ do i =1 ,10 a(i) = b(i) enddo do j =1 ,4 do i =1 ,4 c ( i , j ) = x * d ( i , j )+y enddo enddo είναι ισοδύναμο με integer : : i , j real : : x , y , a (10) , b (10) , c (4 ,4) , d (4 ,4) a = b c = x * d+y Πολλές συναρτήσεις της Fortran έχουν την ιδιότητα να είναι elemental, δηλ. στα ορίσματά τους παίρνουν τα ονόματα των arrays και δρουν σε κάθε στοιχείο αυτού χωριστά. Για παράδειγμα οι εντολές integer : : i , j real : : x , y , a (10) , b (10) , c (4 ,4) , d (4 ,4) c = s i n ( d ) + x * exp ( −2.0* d ) c a l l random_number ( a ) θέτουν 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 integer : : i real : : b ( 0 : 1 9 ) , c ( 1 0 : 2 9 ) , d ( −9:10) b = c*d do i =1 ,20 b ( i−1) = c ( i+9) * d ( i−10) enddo Παρακάτω δίνουμε μερικές χρήσιμες συναρτήσεις που δρουν σε arrays. Υποθέστε ότι 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 59 real : : a ( −10:10) , b ( −10:10) , c ( 1 0 , 1 0 ) , d ( 1 0 , 1 0 ) , e ( 1 0 , 1 0 ) τότε • LBOUND(a) και UBOUND(a) δίνουν τα lower bound και upper bound του array a. Εδώ LBOUND(a) =-10 και UBOUND(a)=10. • c = TRANSPOSE(d) θέτει c(i,j)=d(j,i). • e = MATMUL(c,d) θέτει ∑ το array e ίσο με το γινόμενο των πινάκων c, d. Δηλ. e(i,j)= 10 k=1 c(i,k)*d(k,j). Προσοχή, η εντολή e=c*d θέτει e(i,j)=c(i,j)*d(i,j). • SUM(a) δίνει ∑10 το άθροισμα όλων των στοιχείων του a. Δηλαδή i=−10 a(i) • PRODUCT(a) ∏10 δίνει το γινόμενο όλων των στοιχείων του a. Δηλαδή i=−10 a(i) • DOT_PRODUCT(a,b) ∑10 δίνει το εσωτερικό γινόμενο των a, b. Δηλαδή i=−10 a(i)*b(i) • MAXVAL(a),MINVAL(a) δίνουν τη μέγιστη και ελάχιστη τιμή του array a αντίστοιχα. Για περισσότερες συναρτήσεις και τις πλήρεις οδηγίες για τη χρήση τους δείτε τη βιβλιογραφία [11, 10, 9]. Παρακάτω δίνονται μερικές πληροφορίες σχετικά με την είσοδο / έξοδο (input / output ή I/O) για τα arrays. Η είσοδος (“διάβασμα”) και έξοδος (“εκτύπωση”) των arrays μπορεί να γίνεται απλά διαβά- ζοντας και εκτυπώνοντας τα στοιχεία τους με τη σειρά που θέλουμε. Για παράδειγμα στο παρακάτω πρόγραμμα διαβάζουμε το array a και εκτυπώνουμε το array b με δύο διαφορετικούς τρόπους: integer : : i , j real : : a (4) , b (2 ,2) do i =1 ,4 read * , a ( i ) enddo read * , ( a ( i ) , i = 1 , 4 ) do j =1 ,2 do i =1 ,2 60 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ print * , b(i , j) enddo enddo p r i n t * , ( ( b ( i , j ) , i =1 ,2 ) , j =1 ,2 ) Μέσα στα 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 διαβάζονται/εκτυπώνονται με συγκεκρι- μένη σειρά. Για παράδειγμα real : : a (4) , b (2 ,2) read *, a read *, b print * , a , b θα διαβάσει από το 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. Διαβάστε τα σχόλια στον παρακάτω κώδικα για επεξηγήσεις: program arrays i m p l i c i t none integer : : i , j , n , m real : : a ( 3 ) , b ( 3 , 3 ) , c ( 3 , 3 ) = −99.0 , d ( 3 , 3 ) = −99.0 , s i n t e g e r : : semester (1000) , grade (1000) l o g i c a l : : pass (1000) ! c o n s t r u c t t h e matrix : use t h e RESHAPE f u n c t i o n ! | 1 . 1 −1.2 −1.3| ! | 2 . 1 2.2 −2.3| ! | 3 . 1 3.2 3 . 3 | b = RESHAPE ( ( / 1 . 1 , 2 . 1 , 3 . 1 , & ! ( n o t i c e rows<−>columns ) 1.4. Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ: FORTRAN 61 −1.2 , 2 . 2 , 3 . 2 , & −1.3 , −2.3 , 3.3 / ) , ( / 3 , 3 / ) ) ! same matrix , now exchange rows and columns : ORDER= ( / 2 , 1 / ) b = RESHAPE ( ( / 1 . 2 , −1.2 , −1.3 , & 2 . 1 , 2 . 2 , −2.3 , & 3 . 1 , 3 . 2 , 3.3 / ) , ( / 3 , 3 / ) , ORDER = ( / 2 , 1 / ) ) a = b ( : , 2 ) ! a a s s i g n e d t h e second column o f b : a ( i )=b ( i , 2 ) a = b ( 1 , : ) ! a a s s i g n e d t h e f i r s t row o f b : a ( i )=b ( 1 , i ) a = 2 . 0 * b ( : , 3 ) + s i n ( b ( 2 , : ) ) ! a ( i )= 2* b ( i , 3 ) + s i n ( b ( 2 , i ) ) a = 1 . 0 + 2 . 0 * exp(−a )+b ( : , 3 ) ! a ( i )= 1+2* exp(−a ( i ) )+b ( i , 3 ) s = SUM( b ) ! r e t u r n s sum o f a l l elements of b s = SUM( b , MASK =(b . gt . 0 ) ) ! r e t u r n s sum o f p o s i t i v e e l e m e n t s o f b a = SUM( b , DIM =1) ! each a ( i ) i s t h e sum o f t h e columns o f b a = SUM( b , DIM =2) ! each a ( i ) i s t h e sum o f t h e rows of b ! r e p e a t a l l t h e above using PRODUCT! ! a l l i n s t r u c t i o n s may be e x e c u t e d i n p a r a l l e l a t any order ! FORALL( i = 1 : 3 ) c ( i , i ) = a ( i ) ! s e t t h e d i a g o n a l o f c ! compute upper bounds o f i n d i c e s i n b : n=UBOUND( b , DIM =1) ; m=UBOUND( b , DIM =2) ! l o g needs p o s i t i v e argument , add a r e s t r i c t i o n ( ” mask ” ) FORALL( i =1: n , j =1: m , b ( i , j ) . gt . 0 . 0 ) c ( i , j ) = l o g ( b ( i , j ) ) ! upper t r i a n g u l a r p a r t o f ma tr ix : ! c a r e f u l , j = i + 1 :m NOT p e r m i t t e d FORALL( i =1: n , j =1: m , i . lt . j ) c ( i , j ) = b ( i , j ) ! each s t a t e m e n t e x e c u t e d BEFORE t h e n e x t one ! FORALL( i =2:n −1 , j =2:n−1) ! a l l r i g h t hand s i d e e v a l u a t e d BEFORE t h e assignment ! i . e . , t h e OLD v a l u e s o f b averaged and then a s s i g n e d t o b b ( i , j ) =(b ( i +1 , j )+b ( i −1 , j )+b ( i , j +1)+b ( i , j−1) ) / 4 . 0 c ( i , j ) = 1 . 0 / b ( i +1 , j +1) ! t h e NEW v a l u e s o f b a r e a s s i g n e d END FORALL ! assignment but only f o r el e m e n t s b ( i , j ) which a r e not 0 WHERE ( b . ne . 0 . 0 ) c = 1.0/b !MATMUL( b , c ) i s e v a l u a t e d , then d i s a s s i g n e d t h e r e s u l t only ! a t p o s i t i o n s where b >0. WHERE ( b . gt . 0 . 0 ) d = MATMUL( b , c ) WHERE ( grade . ge . 5 ) semester = semester + 1 ! student ’ s s e m e s t e r i n c r e a s e s by 1 pass = . true . ELSEWHERE pass = . false . END WHERE end program arrays Θα βρείτε τον παραπάνω κώδικα στο αρχείο f90_arrays.f90 του συ- νοδευτικού λογισμικού. 62 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ 1.4.4 Ιστορικές Παρατηρήσεις Η Fortran είναι μία γλώσσα προγραμματισμού που έχει μακρά ιστορία, η οποία ξεκινάει από το 1950.⁵⁰ Δύο σημαντικοί σταθμοί στην ιστορία της, που σηματοδοτούν σημαντικές αλλαγές, είναι τα πρότυπα Fortran 77 και Fortran 90. Η μετάβαση από το ένα πρότυπο στο άλλο, σημα- τοδοτεί και την αλλαγή στον μορφότυπο του προγράμματος, από το λεγόμενο “fixed width format”, όπου οι εντολές πρέπει να γράφονται σε συγκεκριμένες στήλες ενός αρχείου, στο “free format” όπου αυτό δεν είναι πια απαραίτητο.⁵¹ Στο βιβλίο αυτό, τα προγράμματα γράφονται αποκλειστικά στη δεύτερη μορφή, αλλά καλό είναι ο έμπειρος προ- γραμματιστής της 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 είναι κατά το μεγαλύτερο μέρος της ενιαία και ότι ⁵⁰https://en.wikipedia.org/wiki/Fortran. ⁵¹Αρχεία με κατάληξη .f περιέχουν κώδικα σε fixed width format και αρχεία με κατάληξη .f90, .f95, .f03, .f08 κώδικα σε free format σύμφωνα με τα πρότυπα Fortran 90, 95, 2003 και 2008, αντίστοιχα. 1.5. ΚΟΙΤΑΖΟΝΤΑΣ ΤΑ ΑΠΟΤΕΛΕΣΜΑΤΑ 63 μπορεί να χρησιμοποιεί το στυλ που βρίσκει απλούστερο ή αποδοτι- κότερο για το πρόγραμμα που γράφει. Οι μοντέρνοι μεταγλωττιστές, όπως η gfortran, καταλαβαίνουν και μεταγλωττίζουν αποδοτικά όποιο πρότυπο Fortran και αν χρησιμοποιηθεί. Για τον αναγνώστη που θέλει να ειδικευτεί στην προχωρημένη χρήση της Fortran, συστήνουμε την αναφορά [10]. Για μια εμπεριστατωμένη και καλή εισαγωγή, συστήνουμε την αναφορά [9], αλλά και την παλιό- τερη [11]. Για να μάθετε για τη Fortran 77, αλλά και το fixed width format, ανατρέξτε στην (ελεύθερα διαθέσιμη) [12]. 1.5 Κοιτάζοντας τα Αποτελέσματα Η γραφική απεικόνιση των δεδομένων είναι αναπόσπαστο μέρος της ποιοτικής, αλλά και ποσοτικής κατανόησης της πληροφορίας που πε- ριέχουν. Ένα καλό και ελεύθερα διαθέσιμο πρόγραμμα που παράγει γραφήματα υψηλής ποιότητας στις δύο και τρεις διαστάσεις είναι το gnuplot. Τα ειδικότερα πλεονεκτήματά του έναντι άλλων εφαρμογών είναι η ευελιξία στη χρήση του από τη γραμμή εντολών, αλλά και μέσα από άλλα προγράμματα, καθώς και οι μεγάλες δυνατότητες που δίνει στον χειρισμό και στον μετασχηματισμό των δεδομένων. Έχει τη δικιά του στοιχειώδη γλώσσα προγραμματισμού και, όπου αυτή δεν επαρ- κεί, μπορούν να γίνουν πολύπλοκες διαδικασίες χρησιμοποιώντας άλλες εφαρμογές. Ο χρήστης έχει απευθείας πρόσβαση σε πολλές μαθηματικές συναρτήσεις και σε συνάρτηση προσαρμογής των δεδομένων (fitting). Διαθέτει διαδραστικά τερματικά όπου με το ποντίκι ο χρήστης μπορεί να μετασχηματίζει τα γραφήματα. Η παράγραφος αυτή είναι εξαιρετικά συνοπτική και παρουσιάζει τα εργαλεία που είναι απολύτως απαραί- τητα για τα παρακάτω κεφάλαια. Για περισσότερες πληροφορίες παρα- πέμπουμε στην ιστοσελίδα του gnuplot http://gnuplot.info/ και ειδι- κότερα στη σελίδα με την Demo Gallery http://gnuplot.info/screenshots/ όπου θα βρείτε αμέσως πώς γίνεται η εργασία που σας ενδιαφέρει, κα- θώς και στη βιβλιογραφία [14]. Για να ξεκινήσετε το gnuplot δίνετε την εντολή όπως φαίνεται πα- ρακάτω: > gnuplot G N U P L O T Version X . XX .... 64 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ The gnuplot FAQ is available from www . gnuplot . i n f o / faq / .... Terminal type s e t to ’ wxt ’ gnuplot > Παραπάνω δείχνεται το μήνυμα καλωσορίσματος και στην τελευταία γραμμή φαίνεται το prompt του προγράμματος. Εκεί, μπορούμε να πλη- κτρολογήσουμε μία εντολή η οποία εκτελείται πατώντας το Enter. Στη συνέχεια, όταν θα γράφουμε το prompt αυτό, θα υπονοούμε πως το ακολουθούν εντολές που ερμηνεύονται από το gnuplot. Το γράφημα μιας συνάρτησης γίνεται απλά με την εντολή plot. Το σύμβολο x εννοείται πως είναι η ανεξάρτητη μεταβλητή⁵². Έτσι, η εντολή gnuplot > p l o t x κάνει τη γραφική παράσταση της y = f (x) = x (ευθεία κλίσης 1). Για να κάνουμε ταυτόχρονα τις γραφικές παραστάσεις περισσοτέρων συ- ναρτήσεων απλά τις γράφουμε μαζί ως εξής: gnuplot > p l o t [ −5:5][ −2:4] x , x * * 2 , s i n ( x ) , b e s j 0 ( x ) Παραπάνω γίνεται το γράφημα των συναρτήσεων x, x2 , sin x, J0 (x). Στις αγκύλες [:] βάζουμε τα όρια της γραφικής παράστασης στον άξονα x και y αντίστοιχα. Το [-5:5] καθορίζει το x να μεταβάλλεται από −5 έως +5, ενώ το [-2:4] καθορίζει το y να μεταβάλλεται από −2 έως +4. Αν σε κάποιες θέσεις δε βάλουμε αριθμό, τότε το gnuplot βάζει τα όρια αυτόματα: [1:][:5] καθορίζει το κάτω όριο το x να είναι το 1 και το άνω όριο στο y να είναι το 5, ενώ τα απροσδιόριστα άνω και κάτω όρια αφήνονται στα ... χέρια του gnuplot. Συχνά, θα θέλουμε να κάνουμε τη γραφική παράσταση δεδομένων που δίνονται από διακριτά ζεύγη (xi , yi ). Τα δεδομένα αυτά τα τοπο- θετούμε σε αρχεία σε στήλες. Ας υποθέσουμε πως το αρχείο με τα δεδομένα μας ονομάζεται data και τα περιεχόμενά του είναι: # x y1 y2 0.5 1.0 0.779 1.0 2.0 0.607 1.5 3.0 0.472 2.0 4.0 0.368 2.5 5.0 0.287 3.0 6.0 0.223 ⁵²Αλλάζει με την εντολή set dummy t για να γίνει λ.χ. t η ανεξάρτητη μεταβλητή. 1.5. ΚΟΙΤΑΖΟΝΤΑΣ ΤΑ ΑΠΟΤΕΛΕΣΜΑΤΑ 65 Η πρώτη γραμμή αρχίζει με τον χαρακτήρα # και το gnuplot την αγνοεί (σχόλια για μας). Για να κάνουμε τη γραφική παράσταση της 2ης στήλης συναρτήσει της 1ης δίνουμε απλά την εντολή: gnuplot > p l o t ” data ” using 1 : 2 with points Το όνομα του αρχείου data δίνεται ανάμεσα σε εισαγωγικά, ενώ μετά την εντολή using δίνουμε τις στήλες που θα αντιστοιχούν στον άξονα x και y αντίστοιχα (1:2= στήλη 1 τα xi και στήλη 2 τα yi ). Η εντολή with points αναπαριστά τα ζεύγη (xi , yi ) με σημεία. Η εντολή gnuplot > p l o t ” data ” using 1 : 3 with lines κάνει τη γραφική παράσταση της 3ης στήλης συναρτήσει της 1ης και τα ζεύγη (xi , yi ) ενώνονται με ευθύγραμμα τμήματα. Οι γραφικές παραστάσεις μπορούν να συνδυαστούν: gnuplot > p l o t ” data ” using 1 : 3 with points , exp ( −0.5* x ) gnuplot > r e p l o t ” data ” using 1 : 2 gnuplot > r e p l o t 2* x Στην πρώτη γραμμή κάνουμε μαζί τη γραφική παράσταση της 1ης και 3ης στήλης του αρχείου data μαζί με τη συνάρτηση e−x/2 . Στη δεύτερη γραμμή προσθέτουμε με την εντολή replot στην ίδια γραφική παρά- σταση τα σημεία της 1ης και 3ης στήλης. Και στην 3η βάζουμε μαζί και τη γραφική παράσταση της συνάρτησης 2x. Η εντολή using έχει πολλές δυνατότητες. Αν αντί για αριθμούς βά- λουμε μαθηματικές εκφράσεις ανάμεσα σε παρενθέσεις [δηλ. using (...):(...)], τότε το gnuplot τις υπολογίζει για κάθε σημείο και βάζει τα αποτελέσματα στη γραφική παράσταση. Για να μπει η τιμή μιας στήλης στη μαθηματική έκφραση χρησιμοποιούμε το ίδιο συντα- κτικό με την awk, δηλ. $i αναφέρεται στη στήλη i=1,2,3,.... Παρα- δείγματα: gnuplot > p l o t ” data ” using 1 : ( $2 * s i n ( $1 ) * $3 ) with points gnuplot > r e p l o t 2* x * s i n ( x ) * exp(−x / 2 ) Κάνει τη γραφική παράσταση της 1ης στήλης με την αντίστοιχη τιμή της έκφρασης yi sin(xi )zi , όπου xi , yi , zi οι τιμές της 1ης, 2ης και 3ης στήλης αντίστοιχα. Η δεύτερη γραμμή τοποθετεί στο σχήμα και τη γραφική 66 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ παράσταση της συνάρτησης 2x sin(x)e−x/2 . gnuplot > p l o t ” data ” using ( l o g ( $1 ) ) : ( l o g ( $2 * * 2 ) ) gnuplot > r e p l o t 2* x+ l o g ( 4 ) Κάνει τη γραφική παράσταση του φυσικού λογαρίθμου της 1ης στήλης με το φυσικό λογάριθμο του τετραγώνου της 2ης. Με το gnuplot μπορούμε να κάνουμε τη γραφική παράσταση των δεδομένων που τυπώνει στο stdout οποιοδήποτε πρόγραμμα εκτελείται από το φλοιό. Έστω ότι έχουμε ένα πρόγραμμα με όνομα area που τυπώνει στο stdout την ακτίνα και το εμβαδόν ενός κύκλου: > . / area R= 3.280000 area= 33.79851 R= 6.280000 area= 123.8994 R= 5.280000 area= 87.58257 R= 4.280000 area= 57.54895 Τα δεδομένα είναι στην 2η και 4η στήλη του stdout και μπορούμε να τα δούμε γραφικά από το gnuplot με την εντολή: gnuplot > p l o t ”< . / a r e a ” using 2:4 Δηλαδή στη θέση του ονόματος του αρχείου βάζουμε το όνομα της εντο- λής με τον χαρακτήρα < να προηγείται. Μπορούμε να συνδυάσουμε εντολές μέσω piping και να παράγουμε πολύπλοκα αποτελέσματα. Λ.χ. gnuplot > p l o t \ ”< . / a r e a | s o r t −g −k 2 | awk ’{ p r i n t l o g ( $2 ) , l o g ( $4 ) } ’ ” \ using 1 : 2 όπου τα δεδομένα που αναπαρίστανται γραφικά είναι το αποτέλεσμα ενός φίλτρου τριών εντολών: Αυτή που παράγει τα δεδομένα ακτίνα– εμβαδόν όπως παραπάνω, η δεύτερη sort που τα διατάσσει ανάλογα με την αριθμητική τιμή της 2ης στήλης και η τρίτη awk που τυπώνει το λογάριθμο της 2ης στήλης και το λογάριθμο της 4ης. Παρατηρήστε πώς τώρα χρησιμοποιούμε την εντολή using 1:2, αφού η τελευταία εντολή τυπώνει τα δεδομένα σε δύο μόνο στήλες. Για να σώσουμε τις γραφικές μας παραστάσεις σε αρχεία που μπο- ρούμε να φυλάξουμε και πιθανώς να δημοσιεύσουμε, πρέπει να αλλά- ξουμε το “terminal” που χρησιμοποιεί ο gnuplot σε έναν οδηγό που μεταφράζει τη γραφική παράσταση σε μία γλώσσα που καταλαβαίνουν 1.5. ΚΟΙΤΑΖΟΝΤΑΣ ΤΑ ΑΠΟΤΕΛΕΣΜΑΤΑ 67 άλλα προγράμματα που δείχνουν εικόνες (λ.χ. PDF, postscript, jpeg, png, gif κλπ). Κατευθύνοντας την “έξοδο” του terminal σε ένα αρχείο πετυ- χαίνουμε το ζητούμενο. Για παράδειγμα gnuplot > p l o t ” data ” using 1 : 3 gnuplot > s e t t e r m i n a l jpeg gnuplot > s e t output ” data . j p g ” gnuplot > replot gnuplot > s e t output gnuplot > s e t t e r m i n a l wxt Η πρώτη γραμμή κάνει τη γραφική παράσταση στο τερματικό, ώστε να τη δούμε. Η δεύτερη καθορίζει πως το γράφημα θα σωθεί σε μορφή JPEG και η τρίτη το όνομα του αρχείου που θα το αποθηκεύσουμε. Στην τέταρτη επαναλαμβάνουμε το τελευταίο γράφημα (εδώ αυτό της 1ης γραμμής) και στην πέμπτη κλείνουμε το αρχείο data.jpg (μην το ξεχάσετε!). Η τελευταία γραμμή επιβάλλει η επόμενη γραφική παρά- σταση να γίνει πάλι στο τερματικό. Συνήθως γραφικές παραστάσεις υψηλής ποιότητας αποθηκεύονται στη γλώσσα PDF. Επιλέξτε set terminal pdf και set output "data.pdf" στην περίπτωση αυτή. Λίγα λόγια για τις τρισδιάστατες γραφικές παραστάσεις. Οι επό- μενες εντολές δείχνουν πώς με την εντολή splot μπορείτε να δείτε τη γραφική παράσταση της συνάρτησης f (x, y) = e−x −y . Με το ποντίκι 2 2 μπορείτε να την περιστρέψτε και να τη δείτε υπό διαφορετική γωνία. gnuplot > s e t pm3d gnuplot > s e t hidden3d gnuplot > s e t s i z e ratio 1 gnuplot > s e t i s o s a m p l e s 50 gnuplot > s p l o t [ −2:2][ −2:2] exp(−x**2−y * * 2 ) Αν έχετε δεδομένα στη μορφή (xi , yi , zi ) και θέλετε να τα αναπα- ραστήσετε γραφικά στη μορφή zi = f (xi , yi ), τακτοποιήσετε τα σε ένα αρχείο της μορφής −1 −1 2.000 −1 0 1.000 −1 1 2.000 0 −1 1.000 0 0 0.000 0 1 1.000 68 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ 1 −1 2.000 1 0 1.000 1 1 2.000 Προσέξτε πως βάζουμε μία κενή γραμμή κάθε φορά που αλλάζει η τιμή του x. Αν ονομάσετε το αρχείο αυτό data3, δείτε τη γραφική παράσταση με τις εντολές: gnuplot > s e t pm3d gnuplot > s e t hidden3d gnuplot > s e t s i z e ratio 1 gnuplot > s p l o t ” data3 ” with lines Κλείνουμε με δύο λόγια για τη γραφική παράσταση που δίνεται από παραμετρικές εξισώσεις. Στις δύο διαστάσεις θεωρούμε τις κα- μπύλες (x(t), y(t)) και στις τρεις τις επιφάνειες (x(u, v), y(u, v), z(u, v)). Με τις παρακάτω εντολές κάνουμε τη γραφική παράσταση του κύκλου (sin t, cos t) και της σφαίρας (cos u cos v, cos u sin v, sin u): gnuplot > s e t p a r a m e t r i c gnuplot > p l o t s i n ( t ) , c o s ( t ) gnuplot > s p l o t c o s ( u ) * c o s ( v ) , c o s ( u ) * s i n ( v ) , s i n ( u ) 1.6 Shell Scripting: Σενάρια Φλοιού Η γλώσσα Fortran θα φανεί σε κάποιον που έχει συνηθίσει κάποια γλώσσα με περισσότερες δυνατότητες (C, C++, Java, ...) πως είναι δύ- σχρηστη, όταν κάποιος θέλει να κάνει πολύπλοκες διαδικασίες που αφορούν το σύστημα και δε θα είχε άδικο. Όταν όμως χρησιμοποιήσει τα προγράμματα που γράφει σε Fortran σε συνδυασμό με τα πανί- σχυρα εργαλεία που του παρέχει το λειτουργικό σύστημα, τα προβλή- ματα αυτά ξεπερνιόνται και έτσι μπορεί κανείς να χρησιμοποιήσει τα πλεονεκτήματα της γλώσσας σε high performance computing, χωρίς να ανησυχεί για τις διαχειριστικές και συχνά τετριμμένες εργασίες. Για να αποφύγει κανείς την επαναλαμβανόμενη διαδικασία εκτέ- λεσης των ίδιων εντολών (που εμπεριέχει και τον κίνδυνο σφάλματος), μπορεί τις εντολές που θέλει να δώσει να τις κωδικοποιήσει μέσα σε ένα αρχείο. Αυτό ονομάζεται σενάριο φλοιού (shell script) και η πιο απλή μορφή του μπορεί να είναι απλά μια σειρά από εντολές. Γράφουμε στο αρχείο script01.csh: 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 69 # ! / bin / t c s h −f g f o r t r a n area_01 . f90 −o area . / area g f o r t r a n area_02 . f90 −o area . / area g f o r t r a n area_03 . f90 −o area . / area g f o r t r a n area_04 . f90 −o area . / area Η πρώτη γραμμή (ακριβώς!!) αρχίζει με #!/bin/tcsh -f που ερμηνεύ- εται από το λειτουργικό σύστημα, ώστε να εκτελεστούν οι εντολές από τον φλοιό /bin/tcsh⁵³. Στη συνέχεια γράφουμε τις εντολές μεταγλώττι- σης και εκτέλεσης των προγραμμάτων που μελετήσαμε στην προηγού- μενη παράγραφο. Αρχικά, κάνουμε το αρχείο εκτελέσιμο με την εντολή⁵⁴ > chmod u+x script01 . csh και στη συνέχεια με την εντολή > . / script01 . csh τρέχουν όλες οι παραπάνω εντολές η μία μετά την άλλη. Όλα ωραία, εκτός από το γεγονός ότι πρέπει να δίνουμε τις 10 ακτίνες του κύκλου στα προγράμματα ./area κάθε φορά που τις ζητούν. Μια λύση είναι να γράψουμε τα δεδομένα εισόδου (τις ακτίνες) σε ένα αρχείο Input και να δώσουμε την εντολή . / area < Input οπότε δεν χρειάζεται να παρέχουμε τα δεδομένα διαδραστικά. Υπάρχει και πιο συμπαγής λύση, να βάλουμε τα περιεχόμενα των δεδομένων σε ένα “Here Document”, ένα “αρχείο” το οποίο ο χρήστης μπορεί να φανταστεί ότι υπάρχει όταν τρέχει το script, αλλά δεν δε θα το δει ποτέ στο filesystem! Το συντακτικό, λίγο στρυφνό για αρχή, αλλά συνηθίζεται (και γίνεται και εθισμός...) είναι ως εξής (στο αρχείο script02.csh): # ! / bin / t c s h −f g f o r t r a n area_04 . f90 −o area ⁵³Γράψτε #!/bin/bash αν χρησιμοποιείτε τον φλοιό bash. ⁵⁴Αυτό το κάνουμε μόνο μία φορά! 70 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ . / area <<EOF 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 EOF δηλ. το πρόγραμμα ./area παίρνει stdin από τα περιεχόμενα μεταξύ των γραμμών⁵⁵: . / area <<EOF ... EOF Δεν υπάρχει τίποτα το ιδιαίτερο με το string “EOF” και μπορείτε να βάλετε όποιο σας αρέσει (αρκεί να είναι το ίδιο στην αρχή και το τέλος). Η δύναμη του shell scripting είναι οι ικανότητες προγραμματισμού που παρέχει: Ορισμός μεταβλητών, loops, conditionals, ... Οι μεταβλητές ορίζονται όπως οι μεταβλητές φλοιού που αναφέραμε στην παράγραφο 1.1.2. Η τιμή μιας μεταβλητής με όνομα name είναι $name και μπορούμε να τη θέσουμε με την εντολή set name = value. Ένα array μπορεί να οριστεί με την εντολή s e t R = ( 1 . 0 2.0 3.0 4.0 5.0 6.0 7 . 0 8.0 9.0 1 0 . 0 ) και η πρόσβαση στα δεδομένα γίνεται με το συντακτικό $R[1] ... $R[10] Ας δούμε τώρα ένα πιο ... προχωρημένο σενάριο: # ! / bin / t c s h −f s e t files = ( area_01 . f90 area_02 . f90 area_03 . f90 area_04 . f90 ) set R = ( 1 . 0 2.0 3.0 4.0 5.0 6.0 7 . 0 8.0 9.0 1 0 . 0 ) echo ” H e l l o $USER Today i s ” ‘ date ‘ f o r e a c h file ( $files ) echo ” # −−−−−−−−−−− Working on f i l e $ f i l e ” ⁵⁵Το EOF μπορεί να είναι οποιαδήποτε ακολουθία χαρακτήρων. 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 71 g f o r t r a n $file −o area . / area <<EOF $R [ 1 ] $R [ 2 ] $R [ 3 ] $R [ 4 ] $R [ 5 ] $R [ 6 ] $R [ 7 ] $R [ 8 ] $R [ 9 ] $R [ 1 0 ] EOF echo ” # −−−−−−−−−−− Done ” i f ( −f AREA . DAT ) c a t AREA . DAT end Οι πρώτες γραμμές με τις εντολές 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: f o r e a c h file ( $files ) ... end Η μεταβλητή $files αναπτύσσεται στις 4 τιμές της (τα ονόματα των αρ- χείων Fortran area_01.f90, area_02.f90, area_03.f90, area_04.f90) και ο βρόχος εκτελείται μια φορά για κάθε τιμή. Κάθε φορά η τιμή της μεταβλητής file είναι η εκάστοτε τιμή της files. Άρα, η εντολή gfortran $file -o area θα μεταγλωττίσει κάθε φορά ένα από τα παρα- πάνω 4 αρχεία και στη συνέχεια, θα εκτελέσει το εκάστοτε πρόγραμμα ./area. Η τελευταία γραμμή στο βρόχο i f ( −f AREA . DAT ) c a t AREA . DAT είναι ένα if-conditional: Εκτελεί την εντολή cat AREA.DAT, μόνο αν η συνθήκη -f AREA.DAT είναι αληθής, δηλ. το αρχείο AREA.DAT υπάρχει. Τέλος, δίνουμε ένα παραδειγματικό script όπου μπορείτε να δείτε 72 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ με παραδείγματα τις δυνατότητες που μπορεί να προσφέρει το shell scripting. Φυσικά είναι μόνο η αρχή, διαβάστε τη βιβλιογραφία για πε- ρισσότερες λεπτομέρειες [15, 16, 17, 18, 19]. Διαβάστε προσεκτικά τις εντολές μαζί με τα σχόλια τα οποία αρχίζουν με το χαρακτήρα “#”. Στη συνέχεια, αφού γράψετε τις εντολές σε ένα αρχείο script04.csh⁵⁶, μετατρέψτε το σε εκτελέσιμο με την εντολή chmod u+x script04.csh και εκτελέστε την εντολή > . / script04 . csh This is my first serious tcsh script Το script θα τρέξει έχοντας ως arguments τη φράση “This is my first serious tcsh script”. Θα δείτε μέσα στο script πώς να την επεξεργα- στείτε. Στη συνέχεια, το script θα σας ζητήσει δέκα ή παραπάνω ακτίνες κύκλων για να υπολογίσει την περίμετρο και το εμβαδόν τους. Πληκτρο- λογήστε τις και μετά διαβάστε την έξοδο του script για να καταλάβετε το αποτέλεσμα των εντολών που περιέχει. Θα είναι μια διαδικασία για την οποία δε θα μετανιώσετε να αφιερώσετε λίγο χρόνο! # ! / bin / t c s h −f # Run t h i s s c r i p t as : # . / s c r i p t 0 4 . csh H e l l o t h i s i s a t c s h s c r i p t #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # ‘command‘ i s command s u b s t i t u t i o n : i t i s r e p l a c e d by s t d o u t o f command s e t now = ‘ date ‘ ; s e t mypc = ‘ uname −a ‘ # P r i n t i n f o r m a t i o n : v a r i a b l e s a r e expanded w i t h i n double q u o t e s echo ” I am u s e r $user working on t h e computer $HOST” #HOST i s p r e d e f i n e d echo ”Today t h e d a t e i s : $now” #now i s d e f i n e d above echo ”My home d i r e c t o r y i s : $home” #home i s p r e d e f i n e d echo ”My c u r r e n t d i r e c t o r y i s : $cwd” #cwd changes with cd echo ”My computer runs : $mypc” #mypc i s d e f i n e d above echo ”My p r o c e s s i d i s : $$ ” #$$ i s predefined # Manipulate t h e command l i n e : ( $# argv i s number o f e l e m e n t s i n a r r a y argv ) echo ”The command l i n e has $# argv arguments ” echo ”The name o f t h e command I am running i s : $0 ” echo ” Arguments 3rd t o l a s t o f t h e command : $argv [3 −] ” # third to l a s t echo ”The l a s t argument i s : $argv [ $# argv ] ” # l a s t element echo ” A l l arguments : $argv ” # Ask u s e r f o r i n p u t : e n t e r r a d i i o f c i r c l e s echo −n ” Enter r a d i i o f c i r c l e s : ” # v a r i a b l e $< s t o r e s one l i n e o f i n p u t s e t Rs = ( $ <) #Rs i s now an a r r a y with a l l words e n t e r e d by u s e r i f ( $#Rs < 10 ) then #make a t e s t , need a t l e a s t 10 o f them echo ”Need more than 10 r a d i i . E x i t i n g . . . . ” exit (1) endif echo ”You e n t e r e d $#Rs r a d i i , t h e f i r s t i s $Rs [ 1 ] and t h e l a s t $Rs [ $#Rs ] ” echo ” Rs= $Rs ” # Now, compute t h e p e r i m e t e r o f each c i r c l e : f o r e a c h R ( $Rs ) # −v rad=$R s e t t h e awk v a r i a b l e rad equal t o $R . p i=atan2 (0 , −1) = 3 . 1 4 . . . ⁵⁶Θα το βρείτε και στο συνοδευτικό λογισμικό. 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 73 s e t l = ‘awk −v rad=$R ’BEGIN{ p r i n t 2* atan2 (0 , −1) * rad } ’ ‘ echo ” C i r c l e with R= $R has p e r i m e t e r $ l ” end # a l i a s d e f i n e s a command t o do what you want : use awk as a c a l c u l a t o r a l i a s acalc ’awk ”BEGIN{ p r i n t \ ! * } ” ’ # \ ! * s u b s t i t u t e s a r g s o f a c a l c echo ” Using a c a l c t o compute 2+3=” ‘ acalc 2+3‘ echo ” Using a c a l c t o compute c o s ( 2 * p i )=” ‘ acalc cos ( 2 * atan2 (0 , −1) ) ‘ # Now do t h e same loop over r a d i i as above i n a d i f f e r e n t way # while ( e x p r e s s i o n ) i s e x e c u t e d as long as ” e x p r e s s i o n ” i s t r u e while ( $#Rs > 0) # e x e c u t e d as long as $Rs c o n t a i n s r a d i i s e t R = $Rs [ 1 ] # t a k e f i r s t element o f $Rs s h i f t Rs #now $Rs has one l e s s element : old $Rs [ 1 ] has vanished s e t a = ‘ acalc atan2 (0 , −1) * ${R }* ${R } ‘ # =p i *R*R c a l c u l a t e d by a c a l c # c o n s t r u c t a f i l e n a m e t o save t h e r e s u l t from t h e v a l u e o f R : s e t file = area$ {R } . dat echo ” C i r c l e with R= $R has a r e a $a ” > $file # save r e s u l t i n a f i l e end #end while # Now look f o r our f i l e s : save t h e i r names i n an a r r a y f i l e s : s e t files = ( ‘ l s −1 area * . dat ‘ ) i f ( $# f i l e s == 0) echo ” Sorry , no a r e a f i l e s found ” echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” echo ” f i l e s : $ f i l e s ” l s −l $files echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” echo ”And t h e r e s u l t s f o r t h e a r e a a r e : ” f o r e a c h f ( $files ) echo −n ” f i l e ${ f } : ” c a t $f end # now play a l i t t l e b i t with f i l e names : echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” s e t f = $files [ 1 ] # t e s t p e r m i s s i o n s on f i r s t f i l e # −f , −r , −w, −x , −d t e s t e x i s t e n c e o f f i l e , rwxd p e r m i s s i o n s # t h e ! n e g a t e s t h e e x p r e s s i o n ( t r u e −> f a l s e , f a l s e −> t r u e ) echo ” t e s t i n g p e r m i s s i o n s on f i l e s : ” i f ( −f $f ) echo ” $ f i l e e x i s t s ” i f ( −r $f ) echo ” $ f i l e i s r e a d a b l e by me” i f ( −w $f ) echo ” $ f i l e i s w r i t a b l e by be ” i f ( ! −w / bin / l s ) echo ” / bin / l s i s NOT w r i t a b l e by me” i f ( ! −x $f ) echo ” $ f i l e i s NOT an e x e c u t a b l e ” i f ( −x / bin / l s ) echo ” / bin / l s i s e x e c u t a b l e by me” i f ( ! −d $f ) echo ” $ f i l e i s NOT a d i r e c t o r y ” i f ( −d / bin ) echo ” / bin i s a d i r e c t o r y ” echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” # t r a n s f o r m t h e name o f a f i l e s e t f = $cwd / $f # add t h e f u l l path i n $ f s e t filename = $f : r # removes e x t e n s i o n . dat s e t extension = $f : e # g e t s e x t e n s i o n . dat s e t fdir = $f : h # g e t s directory of $f s e t base = ‘ basename $f ‘ # removes d i r e c t o r y name echo ” f i l e i s : $f ” echo ” f i l e n a m e i s : $ f i l e n a m e ” echo ” e x t e n s i o n i s : $ e x t e n s i o n ” echo ” d i r e c t o r y i s : $ f d i r ” echo ” basename i s : $base ” # now t r a n s f o r m t h e name t o one with d i f f e r e n t e x t e n s i o n : s e t newfile = ${ filename } . jpg echo ” j p e g name i s : $ n e w f i l e ” echo ” j p e g base i s : ” ‘ basename $newfile ‘ i f ( $newfile : e == jpg ) echo ‘ basename $newfile ‘ ” i s a p i c t u r e ” echo ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” # Now save a l l data i n a f i l e using a ” here document ” 74 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ # A here document s t a r t s with <<EOF and ands with a l i n e # s t a r t i n g e x a c t l y with EOF (EOF can be any s t r i n g as below ) # In a ” here document ” we can use v a r i a b l e s and command # substitution : c a t <<AREAS >> areas . dat # This f i l e c o n t a i n s t h e a r e a s o f c i r c l e o f gi v e n r a d i i # Computation done by ${ u s e r } on ${HOST} . Today i s ‘ date ‘ ‘ c a t $files ‘ AREAS # now s e e what we g o t : i f ( −f areas . dat ) c a t areas . dat # You can use a ” here document ” as standard i n p u t t o any command : # use gnuplot t o save a p l o t : gnuplot does t h e j o b and e x i t s . . . gnuplot <<GNU s e t terminal jpeg s e t output ” areas . jpg ” plot ” a r e a s . dat ” using 4 : 7 title ” a r e a s . dat ” ,\ pi * x * x title ” p i *R^2 ” s e t output GNU # check our r e s u l t s : d i s p l a y t h e j p e g f i l e using eog i f ( −f areas . jpg ) eog areas . jpg & 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 75 Σχήμα 1.5: Το παράθυρο του Emacs χωρίστηκε εδώ σε τρία παράθυρα. Ο χωρι- σμός έγινε πρώτα οριζόντια (C-x 2) και μετά κάθετα (C-x 3). Σέρνοντας το ποντίκι Drag-Mouse-1 πάνω στις οριζόντιες (mode lines) και κάθετες διαχωριστικές γραμμές μπορούμε να αλλάξουμε τα μεγέθη των παραθύρων. Επισημαίνουμε τις χρήσιμες πλη- ροφορίες που βρίσκει κανείς στο mode line κάθε παράθυρου. Κάθε παράθυρο έχει το σημείο του (point) και ο δρομέας (cursor) βρίσκεται στο ενεργό παράθυρο (εδώ στο ELines.f). Παρατηρήστε πώς σημειώνεται το ανέπαφο buffer (--), το επεξεργασμένο (**) και αυτό που είναι σε read only mode (%%). Με κλικ με Mouse-1 πάνω στα %% τα αλλάζουμε σε -- και το αντίστροφο. Με δεξί κλικ Mouse-3 πάνω στο όνομα της mode μπορούμε να ενεργοποιήσουμε επιλογή από minor modes. Με αριστερό κλικ Mouse-1 έχουμε πρόσβαση σε εντολές σχετικές με την mode. Οι αριθμοί (17,31), (16,6) και (10,15) στα mode lines υποδηλώνουν τη (γραμμή, στήλη) που βρίσκεται το σημείο στα αντίστοιχα παράθυρα. 76 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ 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.1: Σύνοψη βασικών εντολών στο Unix. 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 77 Πίνακας 1.2: Μερικές βασικές συναρτήσεις (intrinsic functions) της Fortran. Συνάρτηση Περιγραφή ABS το μέτρο ενός μιγαδικού αριθμού, από- λυτη τιμή πραγματικού ACOS τόξο συνημιτόνου ADJUSTL μετακινεί τους μη κενούς χαρακτήρες με- ταβλητής character προς τα αριστερά ADJUSTR μετακινεί τους μη κενούς χαρακτήρες με- ταβλητής character προς τα δεξιά AIMAG φανταστικό μέρος μιγαδικού αριθμού AINT περικόπτει το κλασματικό μέρος αριθμού και διατηρεί τον τύπο της μεταβλητής ANINT στρογγυλοποιεί στον πλησιέστερο ακέ- ραιο και διατηρεί τον τύπο της μεταβλη- τής ASIN τόξο ημιτόνου ATAN τόξο εφαπτομένης ATAN2 τόξο εφαπτομένης του arg1 διαιρεμένου με το arg2 και τοποθετημένο στο σωστό τεταρτημόριο CMPLX μετατρέπει σε τύπο COMPLEX το arg1 + i arg2 CONJG μιγαδικό συζυγές COS συνημίτονο γωνίας μετρημένης σε radians COSH υπερβολικό συνημίτονο DATE_AND_TIME τρέχουσα ημερομηνία και ώρα DBLE μετατρέπει μια μεταβλητή σε τύπο DOUBLE PRECISION DIM αν arg1 > arg2, επιστρέφει arg1 - arg2; αλλιώς 0 DPROD γινόμενο σε ακρίβεια double precision δύο αριθμών single precision EXP εκθετική συνάρτηση EPSILON δίνει ένα θετικό αριθμό που είναι αμελη- τέος συγκρινόμενος με 1.0 HUGE δίνει το μεγαλύτερο αριθμό ίδιου τύπου με το όρισμα INT μετατρέπει σε INTEGER κόβοντας το κλασματικό μέρος Συνεχίζεται στην επόμενη σελίδα... 78 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Πίνακας 1.2: Συνέχεια... Συνάρτηση Περιγραφή KIND δίνει την KIND τιμή του ορίσματος LEN επιστρέφει το μήκος μιας μεταβλητής character LEN_TRIM δίνει το μήκος μιας μεταβλητής character χωρίς τους τελικούς κενούς χαρακτήρες LGE,LGT,LLE,LLT συναρτήσεις σύγκρισης μεταβλητών character LOG φυσικός λογάριθμος LOG10 κοινός λογάριθμος MAX μέγιστη τιμή των ορισμάτων MAXEXPONENT ο μέγιστος εκθέτης ίδιου τύπου με το όρι- σμα MIN ελάχιστη τιμή των ορισμάτων MINEXPONENT ο ελάχιστος εκθέτης ίδιου τύπου με το όρισμα MOD arg1 modulo arg2 NINT μετατρέπει το όρισμα σε INTEGER με στρογγυλοποίηση RANDOM_NUMBER δίνει ψευδοτυχαίους αριθμούς 0 ≤ r < 1 RANDOM_SEED ξεκινά τη γεννήτρια ψευδοτυχαίων αριθ- μών ή δίνει τις παραμέτρους κατάστασής της PRECISION επιστρέφει τη δεκαδική ακρίβεια ίδιου τύ- που με το όρισμα REAL το πραγματικό μέρος μιγαδικού αριθμού REAL μετατροπή του ορίσματος σε REAL SIGN αν arg2 < 0, δίνει -arg1; αλλιώς +arg1 SIN ημίτονο γωνίας σε radians SINH υπερβολικό ημίτονο SQRT τετραγωνική ρίζα TAN εφαπτομένη γωνίας σε radians TANH υπερβολική εφαπτομένη TINY δίνει το μικρότερο θετικό αριθμό ίδιου τύ- που με το όρισμα TRIM επιστρέφει την τιμή μεταβλητής character χωρίς τους τελικούς κενούς χαρακτήρες Συνεχίζεται στην επόμενη σελίδα... 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 79 Πίνακας 1.2: Συνέχεια... Συνάρτηση Περιγραφή Συναρτήσεις για επεξεργασία arrays ALL δίνει .TRUE. αν όλες οι τιμές στο όρισμα είναι .TRUE. ALLOCATED array allocation status ANY δίνει .TRUE. αν όλες κάποιες τιμές στο όρισμα είναι .TRUE. COUNT αριθμός στοιχείων ενός array DOT_PRODUCT εσωτερικό γινόμενο δύο rank-one arrays LBOUND το μικρότερο όριο μίας διάστασης ενός array MATMUL πολλαπλασιασμός πινάκων MAXLOC θέση της μεγίστης τιμής σε ένα array MAXVAL μέγιστη τιμή σε ένα array MERGE συγχώνευση δύο arrays με εφαρμογή mask MINLOC θέση ελάχιστης τιμής σε ένα array MINVAL ελάχιστη τιμή σε ένα array PACK επανατοποθέτηση ενός array σε ένα array με rank ίσο με 1 με εφαρμογή mask PRODUCT γινόμενο τιμών ενός array RESHAPE αναδιαμόρφωση ενός array SHAPE shape ενός array ή scalar SIZE μέγεθος ενός array SPREAD αντιγραφή ενός array προσθέτοντας μία διάσταση SUM άθροισμα τιμών ενός array TRANSPOSE ανάστροφος πίνακας ενός array με rank δύο UBOUND το μεγαλύτερο όριο μίας διάστασης ενός array UNPACK επανατοποθέτηση ενός array με rank ένα σε ένα array με εφαρμογή mask 80 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Πίνακας 1.3: Περίληψη βασικών εντολών στο Emacs. Έξοδος από τον Emacs αναστολή Emacs (ή εικονοποίηση σε παράθυρο) C-z τελική έξοδος από Emacs C-x C-c Αρχεία εισαγωγή αρχείου στον Emacs C-x C-f εγγραφή αρχείου πίσω στον δίσκο C-x C-s εγγραφή όλων των αρχείων στον δίσκο C-x s εισαγωγή περιεχομένων αρχείου στο buffer C-x i εναλλαγή read-only status ενός buffer C-x C-q Βοήθεια Το σύστημα βοήθειας είναι απλό. Πληκτρολογήστε C-h (ή F1) και ακολουθή- στε τις οδηγίες. Αν είστε καινούργιος χρήστης, πληκτρολογήστε C-h t για να ακολουθήσετε τις οδηγίες ενός εκπαιδευτικού εγχειρίδιου. κλείσιμο παράθυρου βοήθειας C-x 1 apropos: εμφάνιση εντολών που ταιριάζουν με λέξεις C-h a περιγραφή συνάρτησης εκτελείται από ένα συγκεκριμένο πλήκτρο C-h k περιγραφή συνάρτησης C-h f πληροφορίες ειδικές για την επιλεγμένη mode C-h m Ανάκτηση λόγω σφάλματος διακοπή εντολής που εκτελείται C-g ανάκτηση αρχείων που χάθηκαν λόγω κατάρρευσης του συστήματος M-x recover-session αναίρεση ανεπιθύμητης αλλαγής C-x u, C-_ or C-/ επαναφορά ενός buffer στα αρχικά του περιεχόμενα M-x revert-buffer επανασχεδιασμός οθόνης C-l Αυξητική Αναζήτηση αναζήτηση προς τα εμπρός C-s αναζήτηση προς τα πίσω C-r αναζήτηση χρησιμοποιώντας regular expression C-M-s διακοπή τρέχουσας αναζήτησης C-g Πληκτρολογήστε C-s ή C-r ξανά για να επαναλάβετε την προηγούμενη ανα- ζήτηση. Κίνηση οντότητα forward backwards χαρακτήρας C-b C-f λέξη M-b M-f γραμμή C-p C-n αρχή (τέλος) γραμμής C-a C-e αρχή (τέλος) buffer M-< M-> Συνεχίζεται στην επόμενη σελίδα... 1.6. SHELL SCRIPTING: ΣΕΝΑΡΙΑ ΦΛΟΙΟΥ 81 Πίνακας 1.3: Συνέχεια... μετακίνηση στην επόμενη οθόνη C-v μετακίνηση στην προηγούμενη οθόνη M-v μετακίνηση αριστερά C-x < μετακίνηση δεξιά C-x > μετακίνηση τρέχουσας γραμμής στο κέντρο της οθόνης C-u C-l Διαγραφή οντότητα προς διαγραφή forward backwards χαρακτήρας DEL C-d λέξη M-DEL M-d γραμμή M-0 C-k C-k region C-w αντιγραφή region M-w επικόλληση τελευταίας αντιγραφής C-y αντικατάσταση τελευταίας επικόλλησης με πιο προηγούμενη αντιγραφή M-y Marking θέσε το mark εδώ C-@ or C-SPC αντάλλαξε το point και το mark C-x C-x επιλογή παραγράφου M-h επιλογή ολοκλήρου buffer C-x h Διαδραστική Αντικατάσταση αντικατάσταση κειμένου διαδραστικά M-% or M-x query-replace αντικατάσταση με χρήση regular expressions M-x query-replace-regexp Buffers επιλογή ενός άλλου buffer C-x b λίστα όλων των buffers C-x C-b διαγραφή buffer C-x k Πολλαπλά Παράθυρα Όταν δίνονται δύο εντολές, η δεύτερη αφορά frames και όχι windows. διαγραφή των άλλων παράθυρων C-x 1 C-x 5 1 διαχωρισμός παράθυρου οριζόντια C-x 2 C-x 5 2 διαγραφή τρέχοντος παράθυρου C-x 0 C-x 5 0 διαχωρισμός παράθυρου κάθετα C-x 3 τοποθέτηση cursor στο άλλο παράθυρο C-x o C-x 5 o μεγάλωσε το παράθυρο κατά ύψος C-x ^ μίκρυνε το παράθυρο κατά πλάτος C-x { μεγάλωσε το παράθυρο κατά πλάτος C-x } Συνεχίζεται στην επόμενη σελίδα... 82 ΚΕΦΑΛΑΙΟ 1. Ο ΥΠΟΛΟΓΙΣΤΗΣ Πίνακας 1.3: Συνέχεια... Μορφοποίηση στοίχιση γραμμής TAB εισαγωγή νέας γραμμής μετά το point C-o γέμισμα παραγράφου M-q Αλλαγή Κεφαλαίων/Μικρών γραφή λέξης με όλα κεφαλαία M-u γραφή λέξης με όλα μικρά M-l πρώτο γράμμα κεφαλαίο, τα άλλα μικρά M-c γραφή επιλεγμένης region με κεφαλαία C-x C-u γραφή επιλεγμένης region με μικρά C-x C-l Το Minibuffer Τα επόμενα πλήκτρα λειτουργούν έτσι μόνο στο minibuffer. συμπλήρωση έκφρασης TAB συμπλήρωση έκφρασης μέχρι μία λέξη SPC συμπλήρωση έκφρασης και εκτέλεση εντολής RET διακοπή εντολής που εκτελείται C-g Πληκτρολογήστε C-x ESC ESC για την επανάληψη της προηγούμενης εντολής με πιθανή μεταβολή της. Πληκτρολογήστε F10 για την ενεργοποίηση των μενού. Ορθογραφικός Έλεγχος τρέχουσας λέξης M-$ επιλεγμένης region M-x ispell-region ολοκλήρου buffer M-x ispell-buffer διαρκής ορθογραφικός έλεγχος M-x flyspell-mode Info – Διαδραστική Βοήθεια στον Emacs έναρξη συστήματος τεκμηρίωσης Info C-h i κίνηση εμπρός SPC κίνηση πίσω DEL επόμενος κόμβος n προηγούμενος κόμβος p μετακίνηση προς τα επάνω u επιλογή επιλογής στο μενού με το όνομά της m επιστροφή στον προηγούμενο κόμβο που βρισκόσαστε l επιστροφή στα περιεχόμενα d κίνηση στον αρχικό κόμβο του αρχείου Info t επιλογή κόμβου με το όνομά του g έξοδος από Info q ΚΕΦΑΛΑΙΟ 2 Περιγραφή της Κίνησης Στο κεφάλαιο αυτό θα δείξουμε πώς να προγραμματίσουμε απλές εξισώσεις τροχιάς ενός σωματιδίου και πώς να κάνουμε βασική ανά- λυση των αριθμητικών αποτελεσμάτων. Χρησιμοποιούμε απλές μεθό- δους απεικόνισης των τροχιών. Στην παράγραφο 2.3 μελετάμε την επί- δραση των συστηματικών σφαλμάτων που υπεισέρχονται σε απλά αριθ- μητικά πρότυπα της κίνησης σωματιδίου που σκεδάζεται πάνω σε σκληρά και αμετακίνητα εμπόδια. Αυτό θα αποτελέσει και ένα μικρό πρελούδιο στη μελέτη ολοκλήρωσης διαφορικών εξισώσεων που θα εξετάσουμε σε επόμενα κεφάλαια. 2.1 Κίνηση στο Επίπεδο Σωματίδιο κινείται στο επίπεδο και η θέση του περιγράφεται σε ένα καρτεσιανό σύστημα συντεταγμένων από τις συντεταγμένες (x(t), y(t)) η οποία ως συνάρτηση του χρόνου δίνει την εξίσωση της τροχιάς του σωματιδίου. Το διάνυσμα θέσης του σωματιδίου είναι το ⃗r(t) = x(t) x̂ + y(y) ŷ, όπου x̂ και ŷ είναι τα μοναδιαία διανύσματα στους άξονες x και y αντίστοιχα. Το διάνυσμα της ταχύτητας είναι το ⃗v (t) = vx (t) x̂ + vy (t) ŷ όπου d⃗r(t) ⃗v (t) = dt dx(t) dy(t) vx (t) = vy (t) = . (2.1) dt dt 83 84 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ Η επιτάχυνση ⃗a(t) = ax (t) x̂ + ay (t) ŷ δίνεται από τις σχέσεις d⃗v (t) d2⃗r(t) ⃗a(t) = = dt dt2 dvx (t) d2 x(t) dvy (t) d2 y(t) ax (t) = = ay (t) = = . (2.2) dt dt2 dt dt2 y vy v 11 00 11 00 ax vx ay r a ^y x^ x Σχήμα 2.1: Τροχιά κινητού υλικού σημείου στο επίπεδο. Φαίνονται τα διανύσματα θέσης ⃗r, ταχύτητας ⃗v και επιτάχυνσης ⃗a και οι αντίστοιχες καρτεσιανές συντεταγμένες στο επιλεγμένο σύστημα αναφοράς σε ένα σημείο της τροχιάς. Στην παράγραφο αυτή θα υποθέσουμε ότι μας δίνονται οι συναρ- τήσεις (x(t), y(t)). Από αυτές, παραγωγίζοντας σύμφωνα με τις παρα- πάνω σχέσεις, μπορούμε να πάρουμε την ταχύτητα και την επιτάχυνση. Σκοπός μας είναι να γράφουμε απλά προγράμματα τα οποία θα υπο- λογίζουν τις τιμές των συναρτήσεων αυτών σε ένα χρονικό διάστημα [t0 , tf ] όπου t0 είναι η αρχική χρονική στιγμή και tf η τελική. Οι συνεχείς συναρτήσεις x(t), y(t), vx (t), vy (t) θα προσεγγίζονται από μια διακριτή ακολουθία τιμών των συναρτήσεων τις χρονικές στιγμές t0 , t0 + δt, t0 + 2δt, t0 + 3δt, . . ., έτσι ώστε όλες οι τιμές t0 + nδt ≤ tf ¹. Αρχίζουμε σχεδιάζοντας το πρότυπο (template) ενός προγράμματος που θα κάνει τον παραπάνω υπολογισμό. Κάνοντας αυτό το σχεδιασμό προσεκτικά, το μόνο που θα μας απασχολεί κάθε φορά που θέλουμε ¹Μπορεί η μεγαλύτερη από τις τιμές αυτές να είναι μικρότερη από tf και η tf να μη συμπεριλαμβάνεται στην ακολουθία. 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 85 Declare variables Define fixed parameters (PI,...) User Interface: Get input from user x0,y0, t0, tf, dt, ... Print parameters to stdout Initialize variables and other parameters of the motion Open data file t = t0 END t < tf NO YES Calculate x, y, vx, vy Print results in data file t = t + dt Σχήμα 2.2: Λογικό διάγραμμα ενός τυπικού προγράμματος των εξισώσεων κίνησης. να μελετήσουμε την κίνηση ενός άλλου κινητού θα είναι η ειδική εφαρ- μογή των εξισώσεων κίνησης. Στο σχήμα 2.2 φαίνεται το λογικό διά- γραμμα των βασικών λειτουργιών του προγράμματος. Αυτό μας βοηθάει να έχουμε μία εποπτική εικόνα, όταν προγραμματίζουμε τις λεπτομέ- ρειες και μας βοηθάει να ελέγξουμε τη βασική λογική του αλγόριθμου που θα χρησιμοποιήσουμε. Στα ορθογώνια παραλληλόγραμμα σκιαγρα- φούμε τις σημαντικές εντολές των δομικών στοιχείων του προγράμ- ματος, ενώ στους ρόμβους σημειώνουμε τις διακλαδώσεις (branching points) του προγράμματος που προκύπτουν από τις δυνατές τιμές μιας λογικής πρότασης. Με γραμμές ενώνουμε τη λογική σειρά με την οποία εκτελούνται οι διαδικασίες. Το πρώτο κομμάτι του προγράμματος κάνει τις απαραίτητες δηλώ- σεις των τύπων των μεταβλητών που θα χρησιμοποιήσουμε. Αν υπάρ- χουν παράμετροι που παραμένουν σταθερές κατά τη διάρκεια της εκτέ- λεσης του προγράμματος (λ.χ. π = 3.1459 . . ., g = 9.81, κλπ), τις ορίζουμε εδώ. Στη συνέχεια το πρόγραμμα αλληλεπιδρά με το χρήστη (user inter- face) και ζητάει τις μεταβλητές παραμέτρους που καθορίζει ο χρήστης: x0 , y0 , t0 , tf , δt . . .. Το πρόγραμμα τυπώνει αυτές τις τιμές στο stdout για να μπορεί ο χρήστης να τις ελέγξει ως προς την ορθότητα και να 86 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ τις αποθηκεύσει για αναφορά στα δεδομένα του. Πριν τον κύριο υπο- λογισμό, ο χρήστης πρέπει να δώσει τις κατάλληλες αρχικές τιμές σε ορισμένες μεταβλητές, ειδικά στο χρόνο t = t0 . Ο κύριος υπολογισμός γίνεται σε ένα βρόχο (loop) ο οποίος εκτε- λείται όσο ο χρόνος t ≤ tf . Υπολογίζονται οι τιμές της θέσης και της ταχύτητας x(t), y(t), vx (t), vy (t) και τυπώνονται μαζί με το χρόνο t σε ένα αρχείο. Εδώ θα κάνουμε τη σημαντική για μας σύμβαση στη μορφοποί- ηση της εξόδου. Αυτό είναι σημαντικό ώστε να έχουμε ενιαίο λογισμικό ανάλυσης των αποτελεσμάτων. Ορίζουμε σε κάθε γραμμή του αρχείου αυτού οι πρώτες πέντε στήλες να είναι οι τιμές t, x, y, vx, vy. Μπορούν να υπάρχουν και άλλες στήλες, αν χρειαστεί, στο ειδικό πρόβλημα που θα μελετάμε, αλλά οι πρώτες πέντε θα είναι πάντα αυτές. Αφού γίνει αυτό, ειδικευόμαστε στο πρόβλημα που θα μελετήσουμε. Ας θεωρήσουμε αρχικά την περίπτωση ενός υλικού σημείου το οποίο εκτελεί ομαλή κυκλική κίνηση. Θεωρούμε το κέντρο του κύκλου (x0 , y0 ), την ακτίνα R και τη γωνιακή ταχύτητα ω ότι είναι οι βασικές παράμετροι που προσδιορίζουν την κίνηση. Η θέση πάνω στον κύκλο μπορεί τότε να καθοριστεί από τη γωνία θ όπως φαίνεται στο σχήμα 2.3. Θα ορίσουμε την αρχική χρονική στιγμή t0 να είναι θ = 0. y (R cos θ , R sin θ ) θ (x,y) (x0, y0) ^y x^ x Σχήμα 2.3: Η τροχιά του υλικού σημείου που εκτελεί την ομαλή κυκλική κίνηση που υπολογίζει το πρόγραμμα Circle.f90. Έτσι οι εξισώσεις που δίνουν τη θέση του κινητού κάθε χρονική στιγμή είναι: x(t) = x0 + R cos (ω(t − t0 )) y(t) = y0 + R sin (ω(t − t0 )) . (2.3) 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 87 Παραγωγίζοντας ως προς t παίρνουμε την ταχύτητα vx (t) = −ωR sin (ω(t − t0 )) vy (t) = ωR cos (ω(t − t0 )) , (2.4) και την επιτάχυνση ax (t) = −ω 2 R cos (ω(t − t0 )) = −ω 2 (x(t) − x0 ) ay (t) = −ω 2 R sin (ω(t − t0 )) = −ω 2 (y(t) − y0 ) . (2.5) Από τις παραπάνω εξισώσεις παρατηρούμε τις γνωστές γεωμετρικές σχέσεις R ⃗ · ⃗v = 0 (R ⃗ ≡ ⃗r − ⃗r0 , ⃗v ⊥ R, ⃗ ⃗v εφαπτόμενο στην τροχιά) και ⃗a = −ω R (R και ⃗a αντιπαράλληλα, ⃗a ⊥ ⃗v ). 2⃗ ⃗ Μπορούμε τώρα να σχεδιάσουμε τη δομή των δεδομένων για το πρό- γραμμα που θα γράψουμε, η οποία στην περίπτωσή μας είναι πολύ απλή. Η σταθερή γωνιακή ταχύτητα ω του υλικού σημείου αποθηκεύ- εται στην πραγματική (REAL) μεταβλητή omega. Το κέντρο του κύκλου (x0 , y0 ), η ακτίνα R και η γωνία θ αντιστοιχούν στις REAL μεταβλητές x0, y0, R, theta. Οι χρονικές στιγμές που υπολογίζουμε τη θέση και ταχύτητα του κινητού καθορίζονται από τις παραμέτρους t0 , tf , δt που αντιστοιχούν στο πρόγραμμα στις REAL μεταβλητές t0, tf, dt. Η τρέ- χουσα θέση του κινητού (x(t), y(t)) υπολογίζεται και αποθηκεύεται στις REAL μεταβλητές x, y και η στιγμιαία του ταχύτητα (vx (t), vy (t)) στις REAL μεταβλητές vx, vy. Οι δηλώσεις αυτές γίνονται στην αρχή του προγράμματος με τις εντολές: r e a l : : x0 , y0 , R , x , y , vx , vy , t , t0 , tf , dt r e a l : : theta , omega r e a l , parameter : : PI =3.1415927 όπου ορίσαμε και την τιμή² του π = 3.1415927 με τον προσδιορισμό parameter. Το διαδραστικό με το χρήστη κομμάτι του προγράμματος (user inter- face) ζητάει από το χρήστη τις τιμές των παραμέτρων που του δίνουμε τη δυνατότητα να προσδιορίζει: omega, x0, y0, R, t0, tf, dt. Αρχικά το πρόγραμμα τυπώνει ένα μήνυμα προτροπής (prompt) στο χρήστη, προσδιορίζοντας τη μεταβλητή που ζητά να διαβάσει. Αυτό γίνεται με απλές print εντολές. Η ανάγνωση των τιμών των παραμέτρων γίνεται ²Θυμίζουμε στον αναγνώστη ότι οι μεταβλητές REAL μονής ακρίβειας (4 bytes) έχουν ακρίβεια περίπου 7 δεκαδικών ψηφίων. 88 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ από το stdin με εντολές read. Αφού διαβαστούν οι παράμετροι, το πρόγραμμα τυπώνει τις τιμές που διάβασε στο stdout³: print * , ’ # Enter omega : ’ read * , omega print * , ’ # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : ’ read * , x0 , y0 , R print * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt print * , ’ # omega= ’ , omega print * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ R= ’ , R print * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt Στη συνέχεια, το πρόγραμμα θέτει την αρχική κατάσταση των δεδο- μένων ώστε να γίνει ο υπολογισμός. Αυτό, εκτός από το να θέσει την τιμή του αρχικού χρόνου t = t0, περιλαμβάνει και βασικό έλεγχο για τη νομιμότητα των παραμέτρων που εισήγαγε ο χρήστης. Οι έλεγχοι είναι απαραίτητοι, γιατί, όταν γράφουμε ένα πρόγραμμα, κάνουμε ορισμέ- νες υποθέσεις απαραίτητες για την ορθή λειτουργία του προγράμματος που μπορεί ο χρήστης από σφάλμα ή άγνοια να μην έχει σεβαστεί. Όταν, για παράδειγμα, γράφουμε την έκφραση 2.0*PI/omega, υποθέ- τουμε ότι η τιμή του omega είναι μη μηδενική, ώστε να γίνει η διαίρεση χωρίς να προκύψει μοιραίο σφάλμα κατά την εκτέλεση του προγράμ- ματος. Το πρόγραμμά μας για να λειτουργήσει όπως το σχεδιάσαμε θα απαιτήσουμε να έχουμε R > 0 και ω > 0. Αυτό θα το ελέγξουμε με μία εντολή if και, αν δεν πληρούνται οι υποθέσεις, σταματάμε τελείως το πρόγραμμα με την εντολή stop⁴. Το πρόγραμμα, επίσης, θα ανοίξει το αρχείο Circle.dat στο οποίο θα αποθηκεύσουμε τις υπολογισμένες τιμές της θέσης και ταχύτητας του κινητού. i f (R . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f R ’ i f ( omega . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f omega ’ p r i n t * , ’ # T= ’ , 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ C i r c l e . dat ’ ) Αν R ≤ 0 ή ω ≤ 0, τότε εκτελούνται οι αντίστοιχες εντολές stop οι ³Αυτό γίνεται για να αποφευχθούν τυπογραφικά λάθη και για να ενημερωθεί ο χρήστης για την τιμή που πραγματικά διάβασε το πρόγραμμα στη μνήμη του υπο- λογιστή. Επίσης, οδηγώντας το stdout σε ένα αρχείο στο σκληρό δίσκο, ο χρήστης μπορεί να αποθηκεύσει τα δεδομένα που εισήγαγε για μελλοντική αναφορά και για χρήση στην ανάλυση των αποτελεσμάτων του. ⁴Παρατηρήστε πως δεν ελέγξαμε όλες τις υποθέσεις που κάνουμε στο πρόγραμμα. Προσθέστε εσείς τις αναγκαίες σχετικές εντολές. 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 89 οποίες σταματούν την εκτέλεση του προγράμματος. Μετά την εντολή stop βάζουμε (προαιρετικά) ένα μήνυμα στο χρήστη, ώστε να ξέρει γιατί σταμάτησε το πρόγραμμα, το οποίο τυπώνεται στο stdout όταν εκτελείται η εντολή stop. Επίσης, υπολογίζουμε και τυπώνουμε την πε- ρίοδο της κυκλικής κίνησης T = 2π/ω. Στην εντολή open επιλέξαμε το unit 11 για να γράφουμε στο Circle.dat. Η επιλογή του αριθμού αυ- τού είναι ελεύθερη για τον προγραμματιστή που μπορεί με ασφάλεια να διαλέξει έναν οποιοδήποτε αριθμό από 10 έως 99⁵. Τώρα είμαστε στη φάση που μπορεί να γίνει ο υπολογισμός. Αυτό θα γίνει με ένα βρόχο της μορφής t = t0 do while ( t . le . tf ) ......... t = t + dt enddo Η πρώτη εντολή (που τη δείξαμε και παραπάνω) θέτει την αρχική τιμή του χρόνου. Οι εντολές που περικλείονται ανάμεσα στο do while(συνθήκη) και enddo εκτελούνται όσο η συνθήκη είναι αληθής. Προσέξτε την εντολή t = t + dt, χωρίς την οποία ο βρόχος θα εκτελείται επ’ αόριστον. Στο ειδικό πρόβλημα που μελετάμε, οι εντολές που μπαίνουν στη θέση των ......... υπολογίζουν τη θέση και την ταχύτητα και τις τυπώνουν στο αρχείο Circle.dat: theta = omega * ( t−t0 ) x = x0+R * c o s ( theta ) y = y0+R * s i n ( theta ) vx = −omega * R * s i n ( theta ) vy = omega * R * c o s ( theta ) w r i t e ( 1 1 , * ) t , x , y , vx , vy Στον υπολογισμό χρησιμοποιούμε τις συναρτήσεις sin και cos που είναι κτισμένες μέσα στη Fortran και οι οποίες δέχονται ως όρισμα μία γωνία μετρημένη σε radians. Χρησιμοποιούμε την ενδιάμεση μεταβλητή theta για να υπολογίσουμε τη φάση θ(t) = ω(t−t0 ). Με την εντολή write(11,*) γράφουμε στο αρχείο Circle.dat έχοντας κάνει παραπάνω τη σύνδεση με το unit 11 με την εντολή open. Το πρόγραμμα το πληκτρολογούμε στο αρχείο Circle.f90. Η κα- τάληξη “.f90” υποδηλώνει στο μεταγλωττιστή ότι το αρχείο περιέχει ⁵Μερικοί αριθμοί μπορεί να χρησιμοποιούνται από το σύστημα για ειδικά αρχεία όπως λ.χ. το 5 για το stdin, το 6 για το stdout και το 0 για το stderr. 90 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ κώδικα στη γλώσσα Fortran. Για να το μεταγλωττίσουμε και να το τρέ- ξουμε, δίνουμε τις εντολές: > g f o r t r a n Circle . f90 −o cl > . / cl Με το διακόπτη -o cl δίνουμε την εντολή στο μεταγλωττιστή gfortran να ονομάσει το εκτελέσιμο αρχείο⁶ cl. Η δεύτερη εντολή (./cl) φορτώ- νει τις μεταγλωττισμένες εντολές στη μνήμη του υπολογιστή για εκτέ- λεση. Στη συνέχεια, το πρόγραμμά μας ζητάει τα δεδομένα και εκτελεί τον υπολογισμό. Μια πλήρης τυπική συνεδρία εκτέλεσης του προγράμ- ματος δείχνεται παρακάτω: > g f o r t r a n Circle . f90 −o cl > . / cl # Enter omega : 1.0 # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : 1 . 0 1 . 0 0.5 # Enter t0 , t f , dt : 0.0 20.0 0.01 # omega= 1. # x0= 1 . y0= 1 . R= 0.5 # t 0= 0. t f = 20. dt= 0.00999999978 # T= 6.28318548 Οι γραμμές που αρχίζουν από “#” τυπώνονται από το πρόγραμμα, ενώ οι γραμμές με αριθμούς χωρίς τη “#” είναι οι αριθμητικές τιμές των παραμέτρων που εισάγει ο χρήστης. Αφού πληκτρολογήσει τα δεδομένα, ο χρήστης χρησιμοποιεί το πλήκτρο Enter για να τα εισάγει στη μνήμη του υπολογιστή που τρέχει το πρόγραμμα. Εδώ ω = 1.0, x0 = y0 = 1.0, R = 0.5, t0 = 0.0, tf = 20.0 και δt = 0.01. Το πρόγραμμα μπορείτε να το εκτελέσετε πολλές φορές για διαφο- ρετικές τιμές των παραμέτρων με τη βοήθεια του editor. Σε ένα αρχείο με όνομα λ.χ. Circle.in τυπώστε τα δεδομένα που θέλετε να εισάγετε στο πρόγραμμα: 1.0 omega 1 . 0 1 . 0 0.5 ( x0 , y0 ) , R 0.0 20.0 0.01 t0 tf dt ⁶Θυμίζουμε ότι αν δε βάλουμε το διακόπτη αυτό, το εκτελέσιμο αρχείο θα ονομα- στεί από το μεταγλωττιστή a.out από προεπιλογή. 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 91 Σε κάθε γραμμή του αρχείου βάζουμε τις τιμές των παραμέτρων που διαβάζει κάθε εντολή read με τη σωστή σειρά. Αφού διαβάσει όλες τις παραμέτρους της εντολής read, η Fortran αγνοεί την υπόλοιπη γραμμή. Η επόμενη εντολή read θα διαβάσει τα δεδομένα από μια νέα σειρά του αρχείου. Έτσι, δίπλα στις παραμέτρους βάζουμε σχόλια για το χρήστη που του θυμίζουν τη σειρά που διαβάζονται οι μεταβλητές. Το πρό- γραμμα τώρα μπορούμε να το τρέξουμε με την εντολή: > . / cl < Circle . in > Circle . out Η εντολή ./cl τρέχει τις εντολές που περιέχονται στο εκτελέσιμο αρχείο cl. Το < Circle.in οδηγεί τα περιεχόμενα του αρχείου Circle.in στο standard input (stdin) του προγράμματος, εξαναγκάζοντας το cl να διαβάσει τα δεδομένα από το αρχείο αυτό. Το > Circle.out οδηγεί το stdout του προγράμματος cl στο αρχείο Circle.out του οποίου τα περιεχόμενα μπορούμε να τα δούμε, αφού τρέξουμε το πρόγραμμα, με την εντολή cat: > c a t Circle . out # Enter omega : # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : # Enter t0 , t f , dt : # omega= 1. # x0= 1 . y0= 1 . R= 0.5 # t 0= 0. t f = 20. dt= 0.00999999978 # T= 6.28318548 Κλείνουμε την παράγραφο αυτή, παραθέτοντας για διευκόλυνση του αναγνώστη ολόκληρο το πρόγραμμα που πληκτρολογήσαμε στο αρχείο Circle.f90: ! ============================================================ ! F i l e C i r c l e . f90 ! C o n s t a n t angular v e l o c i t y c i r c u l a r motion ! S e t ( x0 , y0 ) c e n t e r o f c i r c l e , i t s r a d i u s R and omega . ! At t =t0 , t h e p a r t i c l e i s a t t h e t a =0 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Circle i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : x0 , y0 , R , x , y , vx , vy , t , t0 , tf , dt r e a l : : theta , omega r e a l , parameter : : PI =3.1415927 92 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter omega : ’ read * , omega p r i n t * , ’ # Enter c e n t e r o f c i r c l e ( x0 , y0 ) and r a d i u s R : ’ read * , x0 , y0 , R p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # omega= ’ , omega p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ R= ’ , R p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f (R . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f R ’ i f ( omega . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f omega ’ p r i n t * , ’ # T= ’ , 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ C i r c l e . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = t0 do while ( t . le . tf ) theta = omega * ( t−t0 ) x = x0+R * c o s ( theta ) y = y0+R * s i n ( theta ) vx = −omega * R * s i n ( theta ) vy = omega * R * c o s ( theta ) w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program Circle 2.1.1 Απεικόνιση των Δεδομένων Οι γραφικές παραστάσεις των αποτελεσμάτων που πήραμε στην προη- γούμενη παράγραφο μελετώνται με τη βοήθεια του προγράμματος gnuplot. Υπενθυμίζουμε ότι τα δεδομένα, το πρόγραμμά μας τα αποθηκεύει στο αρχείο Circle.dat σε πέντε στήλες: Η 1η είναι ο χρόνος t, η 2η και 3η οι συντεταγμένες x, y και η 4η και 5η οι συντεταγμένες της ταχύτητας vx, vy. Τα διαγράμματα x(t) και y(t) παράγονται από τις εντολές (που δίνονται μέσα από το gnuplot) και μπορείτε να τα δείτε στο (αριστερό) σχήμα 2.4: gnuplot > p l o t ” C i r c l e . dat ” using 1 : 2 with lines t i t l e ” x ( t ) ” gnuplot > r e p l o t ” C i r c l e . dat ” using 1 : 3 with lines t i t l e ” y ( t ) ” 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 93 1.5 4 x(t) theta(t) y(t) pi 1.4 -pi 3 1.3 2 1.2 1 1.1 1 0 0.9 -1 0.8 -2 0.7 -3 0.6 0.5 -4 0 2 4 6 8 10 12 14 16 18 20 0 2 4 6 8 10 12 14 16 18 20 Σχήμα 2.4: Τα διαγράμματα (x(t), y(t)) (αριστερά) και θ(t) (δεξιά) των δεδομένων που παράγονται από το πρόγραμμα Circle.f90 για ω = 1.0, x0 = y0 = 1.0, R = 0.5, t0 = 0.0, tf = 20.0 και δt = 0.01. Η δεύτερη εντολή (replot) βάζει τη δεύτερη γραφική παράσταση μαζί με την πρώτη. Ας δούμε τώρα πώς μπορούμε να φτιάξουμε τη γραφική παρά- σταση της γωνίας θ(t). Αυτό μπορούμε να το κάνουμε μέσα από το gnuplot, χωρίς να γράψουμε κάποιο καινούργιο πρόγραμμα, χρησιμο- ποιώντας τα δεδομένα μέσα από το αρχείο Circle.dat. Παρατηρούμε ότι θ(t) = tan−1 ((y − y0 )/(x − x0 )). Η συνάρτηση atan2 (που υπάρχει και στη Fortran) είναι διαθέσιμη στο gnuplot⁷. Για να βρούμε πώς δουλεύει, χρησιμοποιούμε τη βοήθεια στο gnuplot: gnuplot > help atan2 The ‘ atan2 ( y , x ) ‘ f u n c t i o n returns the arc tangent ( inverse tangent ) of the ratio of the r e a l parts of its arguments . ‘ atan2 ‘ returns its argument in radians or degrees , as selected by ‘ s e t a n g l e s ‘ , in the correct quadrant . Άρα αρκεί να καλέσουμε τη συνάρτηση αυτή με εντολή της μορφής atan2(y-y0,x-x0). Στην περίπτωσή μας x0=y0=1, ενώ τα x,y είναι αντί- στοιχα στη 2η και 3η στήλη κάθε γραμμής του αρχείου Circle.dat. Θα φτιάξουμε μία κατάλληλη έκφραση στην εντολή using στο gnuplot, όπως και στη σελίδα 65, όπου $2 είναι η τιμή της 2ης και $3 είναι η τιμή της 3ης στήλης: gnuplot > x0 = 1 ; y0 = 1 gnuplot > p l o t ” C i r c l e . dat ” using 1 : ( atan2 ( $3−y0 , $2−x0 ) ) \ with lines t i t l e ” t h e t a ( t ) ” , pi ,−pi ⁷Όπως και όλες οι μαθηματικές συναρτήσεις που υπάρχουν στη μαθηματική βιβλιο- θήκη της γλώσσας C. Δώστε την εντολή help functions για να δείτε σχετικά. 94 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ Η δεύτερη εντολή δίνεται σε μία γραμμή την οποία σπάσαμε με το χα- ρακτήρα \ ώστε να χωράει στο κείμενο⁸. Προσέξτε πώς ορίσαμε τις τιμές των μεταβλητών x0,y0 μέσα στο gnuplot και τις χρησιμοποι- ήσαμε στην έκφραση atan2($3-x0,$2-y0) αντί (ισοδύναμα) να γρά- φαμε atan2($3-1,$2-1). Επίσης, μαζί με τη γραφική παράσταση της θ(t) κάνουμε και τις γραφικές παραστάσεις των σταθερών συναρτή- σεων f1 (t) = π, f2 (t) = −π, ώστε να ελέγξουμε τα όρια των τιμών της θ(t). Η μεταβλητή⁹ pi στο gnuplot έχει ορισμένη εσωτερικά την τιμή π. Το αποτέλεσμα μπορείτε να το δείτε στο (δεξί) σχήμα 2.4. Οι συνιστώσες των ταχυτήτων (vx (t), vy (t)) ως συνάρτηση του χρόνου και η τροχιά του υλικού σημείου ⃗r(t) μπορούν να απεικονιστούν με τις εντολές: gnuplot > p l o t ” C i r c l e . dat ” using 1 : 4 t i t l e ” v_x ( t ) ” with ←- lines gnuplot > r e p l o t ” C i r c l e . dat ” using 1 : 5 t i t l e ” v_y ( t ) ” with ←- lines gnuplot > p l o t ” C i r c l e . dat ” using 2:3 t i t l e ”x−y ” with ←- lines Η τελευταία εντολή τοποθετεί τα σημεία x,y στο επίπεδο, αφού αυτά βρίσκονται στις στήλες 2 και 3 αντίστοιχα. Κλείνουμε αυτήν την παράγραφο δείχνοντας πώς μπορούμε να δούμε το υλικό σημείο να κινείται κάνοντας στοιχειώδες animation με το gnuplot. Για το σκοπό αυτό, έχουμε ένα αρχείο animate2D.gnu στο συνοδευτικό λογισμικό το οποίο θα πρέπει να αντιγράψετε μέσα στον κατάλογο που έχετε το αρχείο των δεδομένων σας Circle.dat και από όπου θα δώ- σετε και την εντολή gnuplot. Δεν είναι σκοπός εδώ να σας εξηγήσουμε πώς δουλεύει, αλλά πώς να το χρησιμοποιείτε¹⁰. Στο σχήμα 2.5 φαίνεται το τελικό αποτέλεσμα. Οι εντολές είναι απλές. Αρκεί να ορίσουμε από ποιο αρχείο να διαβάσουμε τα δεδομένα¹¹, τον αρχικό χρόνο απεικόνι- σης t0 της τροχιάς, τον τελικό tf καθώς και το βήμα dt. Οι χρόνοι αυτοί δεν είναι ανάγκη να είναι οι ίδιοι με αυτούς που βάλαμε στα δεδομένα, όταν τρέχαμε το πρόγραμμα που βρίσκεται στο αρχείο Circle.f90. Οι εντολές που δίνουμε είναι οι ⁸Αυτό επιτρέπεται να το κάνετε και μέσα στο πρόγραμμα gnuplot αν το θέλετε. ⁹Δώστε την εντολή show variables για να δείτε τις ορισμένες μεταβλητές στο gnuplot. ¹⁰Φυσικά μπορείτε να δείτε τα περιεχόμενά του και να μαντέψετε πώς δουλεύει, είναι αρκετά απλό. ¹¹Μπορεί να είναι οποιοδήποτε αρχείο του οποίου η 1η, 2η και 3η στήλη έχει το χρόνο t και x και y συνιστώσες της θέσης του υλικού σημείο στο επίπεδο αντίστοιχα. 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 95 t= 20.000000 (x,y)= (1.208431,1.454485) 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 Σχήμα 2.5: Η τροχιά του υλικού σημείο όπως απεικονίζεται κάθε χρονική στιγμή από το πρόγραμμα animate2D.gnu του συνοδευτικού λογισμικού που τρέχει μέσα από το gnuplot. Φαίνεται το διάνυσμα θέσης και στον τίτλο του διαγράμματος η χρονική στιγμή t και αντίστοιχη θέση (x,y). Τα δεδομένα είναι από το πρόγραμμα Circle.f90 που περιγράφεται στο κείμενο. gnuplot > file = ” C i r c l e . dat ” gnuplot > s e t xrange [ 0 : 1 . 6 ] ; s e t yrange [ 0 : 1 . 6 ] gnuplot > t0 = 0 ; tf = 20 ; dt = 0 . 1 gnuplot > load ” animate2D . gnu” Η πρώτη εντολή καθορίζει το αρχείο από όπου το animate2D.gnu θα διαβάσει τα δεδομένα. Η δεύτερη ορίζει τα όρια στους άξονες x και y. Η τρίτη εντολή καθορίζει τις παραμέτρους του χρόνου που θα χρησι- μοποιηθούν στο animation (αρχικός, τελικός και βήμα). Και η τέταρτη είναι η εντολή που “τρέχει” το animation. Αν θέλετε να ξανατρέξει το animation, αρκεί να δώσετε τις δύο τελευταίες εντολές όσες φορές θέ- λετε. Λ.χ. αν θέλετε να τρέξετε το animation στα ίδια δεδομένα με τη “μισή ταχύτητα”, αρκεί να ξαναορίσετε το dt=0.05, να επαναφέρετε το χρόνο t0=0 και να δώσετε μόνο τις εντολές gnuplot > t0 = 0 ; dt = 0.05 gnuplot > load ” animate2D . gnu” 96 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ 2.1.2 Άλλα Παραδείγματα Ας εφαρμόσουμε όσα κάναμε για την απλή κυκλική κίνηση και σε δια- φορετικά παραδείγματα κίνησης στο επίπεδο. Το πρώτο πρόβλημα που θα παρουσιάσουμε είναι αυτό του απλού εκκρεμούς που εκτελεί μικρές ταλαντώσεις γύρω από την κατακόρυφο και που φαίνεται στο σχήμα 2.6. Η κίνηση περιγράφεται από τη χρονική εξάρτηση του μοναδικού y x l θ T 111 000 000 111 000 111 000 111 000 111 mg Σχήμα 2.6: Το απλό εκκρεμές του οποίου η κίνηση για θ ≪ 1 περιγράφεται από το πρόγραμμα SimplePendulum.f90. βαθμού ελευθερίας του συστήματος, της √ γωνίας θ(t). Η κίνηση είναι περιοδική με γωνιακή συχνότητα ω = g/l και περίοδο T = 2π/ω. Η γωνιακή ταχύτητα υπολογίζεται από τη σχέση θ̇ ≡ dθ/dt και παίρνουμε: θ(t) = θ0 cos (ω(t − t0 )) θ̇(t) = −ωθ0 sin (ω(t − t0 )) (2.6) Με τις παραπάνω σχέσεις έχουμε επιλέξει τις αρχικές συνθήκες θ(t0 ) = θ0 , θ̇(t0 ) = 0. Για να γράψουμε τις εξισώσεις της τροχιάς στο καρτεσιανό σύστημα συντεταγμένων του σχήματος 2.6 χρησιμοποιούμε τις σχέσεις x(t) = l sin (θ(t)) y(t) = −l cos (θ(t)) dx(t) vx (t) = = lθ̇(t) cos (θ(t)) dt dy(t) vy (t) = = lθ̇(t) sin (θ(t)) . (2.7) dt Αυτές είναι οι αντίστοιχες εξισώσεις των (2.3) και (2.4) για την πε- ρίπτωση της ομαλής κυκλικής κίνησης. Έτσι, ο σχεδιασμός του προ- γράμματος γίνεται με παρόμοιο τρόπο. Η τελική του μορφή, την οποία 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 97 βρίσκουμε στο αρχείο SimplePendulum.f90 στο συνοδευτικό λογισμικό είναι: ! ============================================================== ! F i l e SimplePendulum . f90 ! S e t pendulum o r i g i n a l p o s i t i o n a t t h e t a 0 with no i n i t i a l speed !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program SimplePendulum i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : l , x , y , vx , vy , t , t0 , tf , dt r e a l : : theta , theta0 , dtheta_dt , omega r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter l : ’ read * , l p r i n t * , ’ # Enter t h e t a 0 : ’ read * , theta0 p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # l = ’ , l , ’ t h e t a 0= ’ , theta0 p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize omega = sqrt ( g / l ) p r i n t * , ’ # omega= ’ , omega , ’ T= ’ , 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ SimplePendulum . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = t0 do while ( t . le . tf ) theta = theta0 * c o s ( omega * ( t−t0 ) ) dtheta_dt = −omega * theta0 * s i n ( omega * ( t−t0 ) ) x = l * s i n ( theta ) y = −l * c o s ( theta ) vx = l * dtheta_dt * c o s ( theta ) vy = l * dtheta_dt * s i n ( theta ) w r i t e ( 1 1 , 1 0 0 ) t , x , y , vx , vy , theta , dtheta_dt t = t + dt enddo close (11) 100 FORMAT( 7 G15 . 7 ) end program SimplePendulum Τα μόνα σημεία που θα επισημάνουμε στον αναγνώστη είναι ότι την επιτάχυνση της βαρύτητας g τη θέτουμε σταθερή παράμετρο στο πρό- 98 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ γραμμα, ο χρήστης μπορεί να καθορίσει το μήκος του εκκρεμούς l και ότι το αρχείο των δεδομένων περιέχει εκτός από τις στήλες 1-5 και άλ- λες 2 στις οποίες μπορούμε να δούμε τη γωνία και στιγμιαία γωνιακή ταχύτητα του εκκρεμούς. Η εντολή write(11,100) γράφει στο unit 11 με τη μορφή (format) που καθορίζει η εντολή FORMAT με label 100. Αυτό γίνεται ώστε τα δεδομένα να τυπώνονται σε μία γραμμή (δείτε τη συ- ζήτηση στη σελίδα 52). Μια απλή συνεδρία μελέτης του προβλήματος συνοψίζεται παρα- κάτω¹²: > g f o r t r a n SimplePendulum . f90 −o sp > . / sp # Enter l : 1.0 # Enter t h e t a 0 : 0.314 # Enter t0 , t f , dt : 0 20 0.01 # l= 1. t h e t a 0= 0.31400001 # t 0= 0. tf= 20. dt= 0.00999999978 # omega= 3.132092 T= 2.0060668 > gnuplot gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 2 w lines t ” x ( t ) ” gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 3 w lines t ” y ( t ) ” gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 4 w lines t ” v_x ( t ) ” gnuplot > r e p l o t ” SimplePendulum . dat ” u 1 : 5 w lines t ” v_y ( t ) ” gnuplot > p l o t ” SimplePendulum . dat ” u 1 : 6 w lines t ” th ( t ) ” gnuplot > r e p l o t ” SimplePendulum . dat ” u 1 : 7 w lines t ” th ’ ( t ) ” gnuplot > p l o t [ − 0 . 6 : 0 . 6 ] [ − 1 . 1 : 0 . 1 ] ” SimplePendulum . dat ” \ u 2:3 w lines t ”x−y ” gnuplot > file = ” SimplePendulum . dat ” gnuplot > t0 =0; tf =20.0; dt =0.1 gnuplot > s e t xrange [ − 0 . 6 : 0 . 6 ] ; s e t yrange [ − 1 . 1 : 0 . 1 ] gnuplot > load ” animate2D . gnu” Το επόμενο πρόβλημα θα είναι η μελέτη της βολής υλικού σημείου κοντά στην επιφάνεια της γης¹³ αγνοώντας όλες τις δυνάμεις τριβής του αέρα. Όπως γνωρίζουμε, η τροχιά του σωματιδίου και η ταχύτητά του ¹²Παρατηρήστε πως συντομεύσαμε την εντολή “using 1:2 with lines title” με την “u 1:2 w lines t”. Αυτό μπορούμε να το κάνουμε με κάθε εντολή στο gnuplot, αρκεί να υπάρχει μοναδική εντολή που να προσδιορίζεται με τη συντόμευση. ¹³Δηλ. ⃗g = σταθ. και η επίδραση της δύναμης Coriolis αμελητέα. 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 99 δίνονται από τις παραμετρικές εξισώσεις, με παράμετρο το χρόνο x(t) = v0x t 1 y(t) = v0y t − gt2 2 vx (t) = v0x vy (t) = v0y − gt , (2.8) όπου έχουμε υποθέσει τις αρχικές συνθήκες x(0) = y(0) = 0, vx (0) = v0x = v0 cos θ και vy (0) = v0y = v0 sin θ σύμφωνα με το σχήμα 2.7. Σχήμα 2.7: Βολή υλικού σημείου κοντά στην επιφάνεια της γης με x(0) = y(0) = 0, vx (0) = v0x = v0 cos θ και vy (0) = v0y = v0 sin θ. Η δομή του προγράμματος είναι παρόμοια με τα προηγούμενα. Ο χρήστης εισάγει το μέτρο της αρχικής ταχύτητας και τη γωνία θ σε μοί- ρες που σχηματίζει με την οριζόντια διεύθυνση. Εδώ παίρνουμε το χρόνο t0 = 0. Το πρόγραμμα υπολογίζει τις v0x και v0y και τις τυπώνει στο χρήστη στο stdout. Τα δεδομένα σώζονται στο αρχείο Projectile.dat. Το πρόγραμμα δίνεται ολόκληρο παρακάτω και βρίσκεται στο αρχείο Projectile.f90 του συνοδευτικού λογισμικού. ! =========================================================== ! F i l e P r o j e c t i l e . f90 ! Shooting a p r o j e c t i l e near t h e e a r t h s u r f a c e . ! No a i r r e s i s t a n c e . ! S t a r t s a t ( 0 , 0 ) , s e t ( v0 , t h e t a ) . !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Projectile i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : x0 , y0 , R , x , y , vx , vy , t , tf , dt 100 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ r e a l : : theta , v0x , v0y , v0 r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter v0 , t h e t a ( i n d e g r e e s ) : ’ read * , v0 , theta p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ o ( d e g r e e s ) ’ p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( v0 . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f v0<=0 ’ i f ( theta . le . 0.0 . or . theta . ge . 9 0 . 0 ) & stop ’ I l l e g a l value of the ta ’ theta = ( PI / 1 8 0 . 0 ) * theta ! c o n v e r t t o r a d i a n s v0x = v0 * c o s ( theta ) v0y = v0 * s i n ( theta ) p r i n t * , ’ # v0x = ’ , v0x , ’ v0y= ’ , v0y open ( u n i t =11 , f i l e = ’ P r o j e c t i l e . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . le . tf ) x = v0x * t y = v0y * t − 0 . 5 * g * t * t vx = v0x vy = v0y − g*t w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program Projectile Για διευκόλυνση του αναγνώστη, δίνουμε πάλι τις εντολές μιας τυπικής συνεδρίας μελέτης του προβλήματος: > g f o r t r a n Projectile . f90 −o pj > . / pj # Enter v0 , t h e t a ( i n d e g r e e s ) : 10 45 # Enter t f , dt : 1.4416 0.001 # v0= 10.0000000 t h e t a = 45.000000 o ( d e g r e e s ) # t 0= 0.0000000 t f = 1.4416000 dt= 1.00000005E−03 # v0x = 7.0710678 v0y= 7.0710678 > gnuplot gnuplot > p l o t ” P r o j e c t i l e . dat ” using 1 : 2 w lines t ” x ( t ) ” 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 101 gnuplot > r e p l o t ” P r o j e c t i l e . dat ” using 1:3 w lines t ”y ( t ) ” gnuplot > plot ” P r o j e c t i l e . dat ” using 1:4 w lines t ” v_x ( t ) ” gnuplot > r e p l o t ” P r o j e c t i l e . dat ” using 1:5 w lines t ” v_y ( t ) ” gnuplot > plot ” P r o j e c t i l e . dat ” using 2:3 w lines t ”x−y ” gnuplot > file = ” P r o j e c t i l e . dat ” gnuplot > s e t xrange [ 0 : 1 0 . 3 ] ; s e t yrange [ 0 : 1 0 . 3 ] gnuplot > t0 =0; tf = 1 . 4 4 1 6 ; dt =0.05 gnuplot > load ” animate2D . gnu” Στη συνέχεια, ας δούμε το σύστημα όταν στο υλικό σημείο δρα ομαλή αντίσταση από ένα ρευστό της μορφής F⃗ = −mk⃗v , δηλ. μια δύναμη που είναι αντίθετη με την ταχύτητα σε κάθε χρονική στιγμή. Οι λύσεις των εξισώσεων κίνησης Σχήμα 2.8: Οι δυνάμεις που ασκούνται στο σωματίδιο του σχήματος 2.7, όταν υπο- θέσουμε και την ύπαρξη αντίστασης του αέρα ανάλογης του μέτρου της ταχύτητας F⃗ = −mk⃗v . dvx ax = = −kvx dt dvy ay = = −kvy − g (2.9) dt με αρχικές συνθήκες x(0) = y(0) = 0, vx (0) = v0x = v0 cos θ και vy (0) = v0y = v0 sin θ έχουν λύση¹⁴ vx (t) = v0x e−kt ( g ) −kt g vy (t) = v0y + e − k k v0x ( −kt ) x(t) = 1−e k 1( g)( ) g y(t) = v0y + 1 − e−kt − t (2.10) k k k ¹⁴Ο αναγνώστης καλείται να αποδείξει τις εξισώσεις (2.10) σαν άσκηση. 102 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ Οι εξισώσεις αυτές προγραμματίζονται με παρόμοιο τρόπο όπως και στην περίπτωση της απουσίας της αντίστασης του αέρα. Η μόνη δια- φορά είναι ότι ο χρήστης εισάγει τη σταθερά k στα δεδομένα και φυ- σικά η μορφή των εξισώσεων. Το πρόγραμμα βρίσκεται στο αρχείο ProjectileAirResistance.f90 στο συνοδευτικό υλικό και παρατίθεται αυτούσιο παρακάτω: ! ============================================================= ! F i l e P r o j e c t i l e A i r R e s i s t a n c e . f90 ! Shooting a p r o j e c t i l e near t h e e a r t h s u r f a c e ! with a i r r e s i s t a n c e . ! S t a r t s a t ( 0 , 0 ) , s e t k , ( v0 , t h e t a ) . !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program ProjectileAirResistance i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : x0 , y0 , R , x , y , vx , vy , t , tf , dt , k r e a l : : theta , v0x , v0y , v0 r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter k , v0 , t h e t a ( i n d e g r e e s ) : ’ read * , k , v0 , theta p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt print * , ’# k = ’ , k p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ o ( d e g r e e s ) ’ p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( v0 . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f v0<=0 ’ if ( k . le . 0 . 0 ) s t o p ’ I l l e g a l v a l u e o f k <=0 ’ i f ( theta . le . 0.0 . or . theta . ge . 9 0 . 0 ) & stop ’ I l l e g a l value of the ta ’ theta = ( PI / 1 8 0 . 0 ) * theta ! c o n v e r t t o r a d i a n s v0x = v0 * c o s ( theta ) v0y = v0 * s i n ( theta ) p r i n t * , ’ # v0x = ’ , v0x , ’ v0y= ’ , v0y open ( u n i t =11 , f i l e = ’ P r o j e c t i l e A i r R e s i s t a n c e . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . le . tf ) x = ( v0x / k ) *(1.0 − exp(−k * t ) ) y = ( 1 . 0 / k ) * ( v0y +( g / k ) ) *(1.0 − exp(−k * t ) ) −(g / k ) * t vx = v0x * exp(−k * t ) 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 103 vy = ( v0y +( g / k ) ) * exp(−k * t ) −(g / k ) w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program ProjectileAirResistance 8 x(t) v_x(t) v0x/k 0 1.4 y(t) v_y(t) 7 -(g/k)*x+(g/k**2)+v0y/k -g/k 6 1.2 5 1 4 0.8 3 2 0.6 1 0.4 0 -1 0.2 -2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Σχήμα 2.9: Τα διαγράμματα x(t),y(t) (αριστερά) και vx (t),vy (t) (δεξιά) των δεδομένων που παράγονται από το πρόγραμμα ProjectileAirResistance.f90 για k = 5.0, v0 = 10.0, θ = π/4, tf = 0.91 και δt = 0.001. Φαίνονται και οι ασύμπτωτες των συναρτήσεων καθώς t → ∞. Δίνουμε πάλι τις εντολές μιας τυπικής συνεδρίας μελέτης του προ- βλήματος: > g f o r t r a n ProjectileAirResistance . f90 −o pja > . / pja # Enter k , v0 , t h e t a ( i n d e g r e e s ) : 5.0 10.0 45 # Enter t f , dt : 0.91 0.001 # k = 5. # v0= 10. theta= 45. o ( d e g r e e s ) # t 0= 0. t f = 0.910000026 dt= 0.00100000005 # v0x = 7.07106781 v0y= 7.07106781 > gnuplot gnuplot > v0x = 10* c o s ( pi / 4 ) ; v0y = 10* s i n ( pi / 4 ) gnuplot > g = 9.81 ; k = 5 gnuplot > p l o t [ : ] [ : v0x / k + 0 . 1 ] ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 2 with lines t i t l e ” x ( t ) ” , v0x / k gnuplot > r e p l o t ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 3 with lines t i t l e ” y ( t ) ” ,\ −(g / k ) * x +( g / k * * 2 ) +v0y / k gnuplot > p l o t [ : ] [ − g / k − 0 . 6 : ] ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ 104 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ 3 With air resistance k=5.0 No air resistance k=0.0 2.5 2 1.5 1 0.5 0 0 2 4 6 8 10 12 Σχήμα 2.10: Οι τροχιές των βλημάτων που βάλλονται με v0 = 10.0, θ = π/4 όταν δεν υπάρχει αντίσταση του αέρα και όταν υπάρχει με k = 5.0. using 1 : 4 with lines t i t l e ” v_x ( t ) ” , 0 gnuplot > r e p l o t ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 1 : 5 with lines t i t l e ” v_y ( t ) ” ,−g / k gnuplot > p l o t ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” \ using 2:3 with lines t i t l e ” With a i r r e s i s t a n c e k=5.0 ” gnuplot > r e p l o t ” P r o j e c t i l e . dat ” \ using 2:3 with lines t i t l e ”No a i r r e s i s t a n c e k=0.0 ” gnuplot > file = ” P r o j e c t i l e A i r R e s i s t a n c e . dat ” gnuplot > s e t xrange [ 0 : 1 . 4 ] ; s e t yrange [ 0 : 1 . 4 ] gnuplot > t0 =0; tf = 0 . 9 1 ; dt =0.01 gnuplot > load ” animate2D . gnu” Όπως και παραπάνω διπλώσαμε τις εντολές που δε χωρούσαν σε δύο γραμμές. Ορίσαμε τις μεταβλητές gnuplot v0x, v0y, g και k να έχουν τις τιμές που χρησιμοποιήσαμε όταν τρέξαμε το πρόγραμμα. Μπορούμε έτσι και κατασκευάζουμε τις ασύμπτωτες των συναρτήσεων¹⁵. Τα απο- τελέσματα φαίνονται στα σχήματα 2.9 και 2.10. Το τελευταίο παράδειγμα που θα μελετήσουμε στην παράγραφο αυτή είναι αυτό του ανισότροπου αρμονικού ταλαντωτή. Αυτό είναι ένα υλικό σημείο υπό την επίδραση της δύναμης Fx = −mω12 x Fy = −mω22 y (2.11) ¹⁵Θυμίζουμε στον αναγνώστη ότι η ανεξάρτητη μεταβλητή στο gnuplot είναι η x από προεπιλογή. 2.1. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 105 όπου οι “σταθερές των ελατηρίων” k1 = mω12 και k2 = mω22 είναι διαφο- ρετικές στις δύο ορθογώνιες κατευθύνσεις που ορίζονται από τους καρ- τεσιανούς άξονες x και y. Οι λύσεις των εξισώσεων αυτών για x(0) = A, y(0) = 0, vx (0) = 0 και vy (0) = ω2 A είναι x(t) = A cos(ω1 t) y(t) = A sin(ω2 t) vx (t) = −ω1 A sin(ω1 t) vy (t) = ω2 A cos(ω2 t) . (2.12) Για ορισμένες σχέσεις μεταξύ των κυκλικών συχνοτήτων ω1 και ω2 οι καμπύλες των τροχιών του υλικού σημείου είναι κλειστές και αυτοτέ- μνονται σε ένα συγκεκριμένο αριθμό από σημεία. Θα αφήσουμε τον αναγνώστη να βρει τις σχέσεις αυτές και να τις επιβεβαιώσει από τα αριθμητικά αποτελέσματα που θα προκύψουν από το παρακάτω πρό- γραμμα, το οποίο βρίσκεται στο αρχείο Lissajoux.f90 στο συνοδευτικό λογισμικό. ! =========================================================== ! F i l e L i s s a j o u s . f90 ! Lissajous curves ( s p e c i a l case ) ! x ( t )= c o s ( o1 t ) , y ( t )= s i n ( o2 t ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Lissajous i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l x0 , y0 , R , x , y , vx , vy , t , t0 , tf , dt r e a l o1 , o2 , T1 , T2 r e a l , parameter : : PI =3.1415927 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter omega1 and omega2 : ’ read * , o1 , o2 p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # o1= ’ , o1 , ’ o2= ’ , o2 p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( o1 . le . 0 . 0 . or . o2 . le . 0 . 0 ) s t o p ’ omega1 or omega2<=0 ’ T1 = 2 . 0 * PI / o1 T2 = 2 . 0 * PI / o2 p r i n t * , ’ # T1= ’ , T1 , ’ T2= ’ , T2 open ( u n i t =11 , f i l e = ’ L i s s a j o u s . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 106 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ do while ( t . le . tf ) x = c o s ( o1 * t ) y = s i n ( o2 * t ) vx = −o1 * s i n ( o1 * t ) vy = o2 * c o s ( o2 * t ) w r i t e ( 1 1 , * ) t , x , y , vx , vy t = t + dt enddo close (11) end program Lissajous Στο παραπάνω πρόγραμμα έχουμε θέσει A = 1. Ο χρήστης εισάγει τις δύο συχνότητες ω1 και ω2 και τους αντίστοιχους χρόνους. Εύκολα μπορούμε να το μελετήσουμε με τις εντολές > g f o r t r a n Lissajous . f90 −o lsj > . / lsj # Enter omega1 and omega2 : 3 5 # Enter t f , dt : 10.0 0.01 # o1= 3 . o2= 5. # t 0= 0. t f = 1 0 . dt= 0.00999999978 # T1= 2.09439516 T2= 1.2566371 >gnuplot gnuplot > p l o t ” L i s s a j o u s . dat ” using 1 : 2 w l t ”x ( t ) ” gnuplot > r e p l o t ” L i s s a j o u s . dat ” using 1 : 3 w l t ”y ( t ) ” gnuplot > p l o t ” L i s s a j o u s . dat ” using 1 : 4 w l t ” v_x ( t ) ” gnuplot > r e p l o t ” L i s s a j o u s . dat ” using 1 : 5 w l t ” v_y ( t ) ” gnuplot > p l o t ” L i s s a j o u s . dat ” using 2:3 w l t ”x−y f o r 3:5 ” gnuplot > file = ” L i s s a j o u s . dat ” gnuplot > s e t xrange [ − 1 . 1 : 1 . 1 ] ; s e t yrange [ −1.1:1.1] gnuplot > t0 =0; tf =10; dt =0.1 gnuplot > load ” animate2D . gnu” Στο σχήμα 2.11 δείχνουμε το αποτέλεσμα για την τροχιά του ασύμμε- τρου αρμονικού ταλαντωτή με ω1 = 3 και ω2 = 5. 2.2 Κίνηση στο Χώρο Στην παράγραφο αυτή θα κάνουμε μια απλή γενίκευση των μεθόδων που περιγράψαμε στις προηγούμενες παραγράφους για να μελετήσουμε την κίνηση ενός υλικού σωματιδίου στο χώρο. Οι μόνες αλλαγές που θα κάνουμε, θα είναι η προσθήκη μιας ακόμα εξίσωσης για τη συντεταγμένη z(t) και τη συνιστώσα της ταχύτητας vz (t) και η μέθοδος απεικόνισης 2.2. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 107 t= 6.400000 (x,y)= (0.949047,0.509265) 1 0.5 0 -0.5 -1 -1 -0.5 0 0.5 1 Σχήμα 2.11: Οι τροχιά του ασύμμετρου αρμονικού ταλαντωτή με ω1 = 3 και ω2 = 5. των τροχιών στο gnuplot. Τα προγράμματα που θα γράψουμε θα έχουν παρόμοια δομή με αυτά που γράψαμε για την κίνηση σωματιδίου στο επίπεδο. Το πρώτο παράδειγμα που θα εξετάσουμε είναι το κωνικό εκκρεμές του σχήματος 2.12. Αυτό κινείται στο επίπεδο xy με σταθερή γωνιακή ταχύτητα ω. Οι εξισώσεις κίνησης δίνονται από τις σχέσεις Tz = T cos θ = mg Txy = T sin θ = mω 2 r , (2.13) όπου φυσικά r = l sin θ. Λύνοντας τις παραπάνω εξισώσεις¹⁶ βρίσκουμε: x(t) = r cos ωt y(t) = r sin ωt z(t) = −l cos θ (2.14) όπου στις παραπάνω αντικαθιστούμε τις τιμές g cos θ = ω2l √ sin θ = 1 − cos2 θ g sin θ r = (2.15) ω 2 cos θ ¹⁶Φυσικά επιλέγοντας τις κατάλληλες αρχικές συνθήκες (γράψτε τις...). 108 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ y x θ l z T r θ v ωt Txy 11 00 00 11 00 11 00 11 mg Σχήμα 2.12: Το κωνικό εκκρεμές του προγράμματος ConicalPendulum.f90. Για τις ταχύτητες έχουμε vx = −rω sin ωt vy = rω cos ωt vz = 0 . (2.16) Από τα παραπάνω προκύπτει ότι √ g ω ≥ ωmin = , (2.17) l και ότι καθώς ω → ∞, θ → π/2. Στο πρόγραμμα που θα γράψουμε ο χρήστης δίνει τις παραμέτρους l και ω, τον τελικό χρόνο tf και το βήμα χρόνου δt (παίρνουμε t0 = 0). Η σύμβαση για την έξοδο των δεδομένων από το πρόγραμμα είναι ότι γράφονται σε ένα αρχείο, μία γραμμή ανά χρονική στιγμή, όπου οι 7 πρώτες στήλες είναι οι τιμές των t, x, y, z, vx , vy και vz . Επειδή η γραμμή είναι μεγάλη και δε θέλουμε να τη σπάσει η Fortran, δίνουμε την κατάλληλη εντολή FORMAT. Δείτε τη συζήτηση στη σελίδα 52. Το πρόγραμμα παρατίθεται παρακάτω: ! ============================================================ 2.2. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 109 ! F i l e ConicalPendulum . f90 ! S e t pendulum angular v e l o c i t y omega and d i s p l a y motion i n 3D !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program ConicalPendulum i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : l , r , x , y , z , vx , vy , vz , t , tf , dt r e a l : : theta , cos_theta , sin_theta , omega r e a l , parameter : : PI =3.1415927 , g =9.81 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter l , omega : ’ read * , l , omega p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt print * , ’# l= ’ , l , ’ omega= ’ , omega p r i n t * , ’ # T= ’ , 2 . 0 * PI / omega , ’ omega_min= ’ , sqrt ( g / l ) p r i n t * , ’ # t 0= ’ , 0 . 0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize cos_theta = g / ( omega * omega * l ) i f ( cos_theta . ge . 1 ) s t o p ’ c o s ( t h e t a )>= 1 ’ sin_theta = sqrt (1.0 − cos_theta * cos_theta ) z = −g / ( omega * omega ) ! they remain c o n s t a n t throught vz= 0.0 ! t h e motion r = g / ( omega * omega ) * sin_theta / cos_theta open ( u n i t =11 , f i l e = ’ ConicalPendulum . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 do while ( t . le . tf ) x = r * c o s ( omega * t ) y = r * s i n ( omega * t ) vx = −r * s i n ( omega * t ) * omega vy = r * c o s ( omega * t ) * omega w r i t e ( 1 1 , 1 0 0 ) t , x , y , z , vx , vy , vz t = t + dt enddo close (11) 100 FORMAT(20 G15 . 7 ) end program ConicalPendulum Για να το μεταγλωττίσουμε και να το τρέξουμε, κάνουμε τα γνωστά: > g f o r t r a n ConicalPendulum . f90 −o cpd > . / cpd # Enter l , omega : 110 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ 1 . 0 6.28 # Enter t f , dt : 10.0 0.01 # l= 1 . omega= 6.28000021 # T= 1.00050724 omega_min= 3.132092 # t 0= 0. t f = 1 0 . dt= 0.00999999978 Τα αποτελέσματα θα τα βρούμε στο αρχείο ConicalPendulum.dat. Για να δούμε τις γραφικές παραστάσεις των συναρτήσεων x(t), y(t), z(t), vx (t), vy (t), vz (t), εκτελούμε τις γνωστές εντολές μέσα από το gnuplot: > gnuplot gnuplot > p l o t ” ConicalPendulum . dat ” u 1:2 w l t ”x ( t ) ” gnuplot > r e p l o t ” ConicalPendulum . dat ” u 1:3 w l t ”y ( t ) ” gnuplot > r e p l o t ” ConicalPendulum . dat ” u 1:4 w l t ”z( t )” gnuplot > p l o t ” ConicalPendulum . dat ” u 1:5 w l t ” v_x ( t ) ” gnuplot > r e p l o t ” ConicalPendulum . dat ” u 1:6 w l t ” v_y ( t ) ” gnuplot > r e p l o t ” ConicalPendulum . dat ” u 1:7 w l t ” v_z ( t ) ” Το αποτελέσματα φαίνονται στο σχήμα 2.13. 1 8 x(t) v_x(t) y(t) v_y(t) 0.8 z(t) v_z(t) 6 0.6 4 0.4 2 0.2 0 0 -0.2 -2 -0.4 -4 -0.6 -6 -0.8 -1 -8 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 Σχήμα 2.13: Οι γραφικές παραστάσεις των συναρτήσεων x(t), y(t), z(t), vx (t), vy (t), vz (t) προγράμματος ConicalPendulum.f90 για ω = 6.28, l = 1.0. Για να δούμε την τρισδιάστατη τροχιά στο χώρο, θα χρησιμοποιή- σουμε την εντολή splot στο gnuplot: gnuplot > s p l o t ” ConicalPendulum . dat ” u 2 : 3 : 4 w l t ” r ( t ) ” Το αποτέλεσμα φαίνεται στο σχήμα 2.14. Μπορούμε να κάνουμε κλικ πάνω στην τροχιά και να περιστρέψουμε την καμπύλη, ώστε να τη δούμε από διαφορετικές οπτικές γωνίες. Μπορούμε να αλλάξουμε τα όρια 2.2. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 111 Σχήμα 2.14: Η γραφική παράσταση της τροχιάς ⃗r(t) του υλικού σημείου του προ- γράμματος ConicalPendulum.f90 για ω = 6.28, l = 1.0. Φαίνεται το παράθυρο του gnuplot όπου μπορούμε να κάνουμε κλικ πάνω στην τροχιά και να περιστρέψουμε την καμπύλη, ώστε να τη δούμε από διαφορετικές οπτικές γωνίες. Κάτω αριστερά βλέπουμε την οπτική διεύθυνση που δίνεται αντίστοιχα από τις γωνίες θ = 55.0 μοί- ρες (γωνία με άξονα z) και ϕ = 62 μοίρες (γωνία με άξονα x), όμοια με τις σφαιρικές συντεταγμένες (θ, ϕ). στους άξονες ορίζοντάς τα ρητά στην εντολή splot: gnuplot > s p l o t [ − 1 . 1 : 1 . 1 ] [ − 1 . 1 : 1 . 1 ] [ − 0 . 3 : 0 . 0 ] \ ” ConicalPendulum . dat ” using 2 : 3 : 4 w l t ” r ( t ) ” Στο συνοδευτικό λογισμικό περικλείεται και το αρχείο animate3D.gnu με το οποίο μπορούμε να κάνουμε απλά animations της τροχιάς της κί- νησης ενός υλικού σημείου στο χώρο. Οι εντολές που πρέπει να δώσουμε είναι ανάλογες με αυτές που δίναμε στην περίπτωση του animate2D.gnu με τη μόνη διαφορά ότι καλό είναι να ορίσουμε τα όρια και στον άξονα των z. Για να δούμε την τροχιά του κωνικού εκκρεμούς από τα δεδομένα που παραγάγαμε παραπάνω, δίνουμε τις εντολές: gnuplot > s e t xrange [ − 1 . 1 : 1 . 1 ] ; s e t yrange [ − 1 . 1 : 1 . 1 ] gnuplot > s e t zrange [ − 0 . 3 : 0 ] gnuplot > t0 =0; tf =10; dt =0.1 gnuplot > load ” animate3D . gnu” Το αποτέλεσμα το βλέπουμε στο σχήμα 2.15. Περιττό να πούμε πως το πρόγραμμα animate3D.gnu μπορεί να χρησιμοποιηθεί πάνω σε οποιο- 112 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ t= 10.100000 (x,y,z)= (0.964311,-0.090732,-0.248742) 0 -0.05 -0.1 z-0.15 -0.2 -0.25 -0.3 -1 0.5 1 -0.5 0 0 x 0.5 -0.5 y 1 -1 Σχήμα 2.15: Η τροχιά ⃗r(t) του υλικού σημείου του προγράμματος ConicalPendulum.f90 για ω = 6.28, l = 1.0 όπως φαίνεται με το πρόγραμμα animate3D.gnu. Στον τίτλο βλέπουμε την τρέχουσα χρονική στιγμή και τις συντεταγ- μένες του υλικού σημείου. δήποτε αρχείο που περιέχει δεδομένα της μορφής t x y z στις πρώτες τέσσερις στήλες του. Απλά αλλάζουμε την τιμή της μεταβλητής file στο όνομα του αρχείου που θα μελετήσουμε. Όπως και με το animate2D.gnu μπορούμε να αλλάξουμε μόνο όποιες από τις μεταβλητές file, t0, tf, dt είναι αναγκαίο πριν επαναλάβουμε το animation με την εντολή load "animate3D.gnu". Στη συνέχεια, θα μελετήσουμε την τροχιά ενός φορτισμένου σωμα- τιδίου που εισέρχεται σε ένα ομογενές μαγνητικό πεδίο B ⃗ = B ẑ τη χρονική στιγμή t0 = 0 από τη θέση ⃗r0 = x0 x̂ με ταχύτητα ⃗v0 = v0y ŷ + v0z ẑ όπως φαίνεται στο σχήμα 2.16. Στο φορτίο εξασκείται από το μαγνη- τικό πεδίο η δύναμη Lorentz F⃗ = q(⃗v × B) ⃗ = qBvy x̂−qBvx ŷ. Οι εξισώσεις κίνησης είναι dvx qB ax = = ωvy ω≡ dt m dvy ay = = −ωvx dt az = 0. (2.18) 2.2. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 113 z B v0z v0 x0 θ v0y y x Σχήμα 2.16: Σωματίδιο τη χρονική στιγμή t0 = 0 στη θέση ⃗r0 = x0 x̂ με ταχύτητα ⃗ = B ẑ. ⃗v0 = v0y ŷ + v0z ẑ μέσα σε ομογενές μαγνητικό πεδίο B Ολοκληρώνοντας τις παραπάνω εξισώσεις και λαμβάνοντας υπόψη τις αρχικές συνθήκες παίρνουμε vx (t) = v0y sin ωt vy (t) = v0y cos ωt vz (t) = v0z . (2.19) Με μία ακόμα ολοκλήρωση παίρνουμε τη θέση του σωματιδίου σε συ- νάρτηση με το χρόνο ( v0y ) v0y x(t) = x0 + − cos ωt = x0 cos ωt ω ω v0y v0y y(t) = sin ωt = −x0 sin ωt με x0 = − ω ω z(t) = v0z t , (2.20) όπου κάναμε την επιλογή x0 = −v0y /ω για να κάνουμε το κέντρο της κυκλικής τροχιάς να συμπίπτει με την αρχή των αξόνων. Το γεωμετρικό σχήμα της τροχιάς είναι μια έλικα με ακτίνα R = −x0 και βήμα v0z T = 2πv0z /ω. Με τα παραπάνω είναι εύκολο τώρα να γράψουμε ένα πρόγραμμα που να υπολογίζει την τροχιά του παραπάνω φορτίου. Οι παράμετροι που θα εισάγει ο χρήστης είναι το μέτρο της ταχύτητας v0 , τη γωνία θ σε μοίρες (βλ. σχήμα 2.16) και τη συχνότητα ω. Προφανώς θα έχουμε v0y = v0 cos θ και v0z = v0 sin θ. Η αρχική θέση υπολογίζεται τότε από την x0 = −v0y /ω. Το πρόγραμμα δίνεται αυτούσιο παρακάτω και μπορείτε να το βρείτε στο αρχείο ChargeInB.f90 στο συνοδευτικό λογισμικό: 114 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ ! =========================================================== ! F i l e ChargeInB . f90 !A charged p a r t i c l e o f mass m and charge q e n t e r s a magnetic ! f i e l d B i n +z d i r e c t i o n . I t e n t e r s with v e l o c i t y ! v0x =0 , v0y=v0 c o s ( t h e t a ) , v0z=v0 s i n ( t h e t a ) , 0<= t h e t a < p i / 2 ! a t t h e p o s i t i o n x0=−v0y / omega , omega=q B/m ! ! Enter v0 and t h e t a and s e e t r a j e c t o r y from ! t 0=0 t o t f a t s t e p dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program ChargeInB i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : x , y , z , vx , vy , vz , t , tf , dt r e a l : : x0 , y0 , z0 , v0x , v0y , v0z , v0 r e a l : : theta , omega r e a l , parameter : : PI =3.1415927 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter omega : ’ read * , omega p r i n t * , ’ # Enter v0 , t h e t a ( d e g r e e s ) : ’ read * , v0 , theta p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # omega= ’ , omega , ’ T= ’ , 2 . 0 * PI / omega p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ o ( d e g r e e s ) ’ p r i n t * , ’ # t 0= ’ ,0.0 , ’ tf= ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i f ( theta . lt . 0 . 0 . or . theta . ge . 9 0 . 0 ) s t o p ’ I l l e g a l 0< t h e t a <90 ’ theta = ( PI / 1 8 0 . 0 ) * theta ! c o n v e r t t o r a d i a n s v0y = v0 * c o s ( theta ) v0z = v0 * s i n ( theta ) p r i n t * , ’ # v0x= ’ , 0 . 0 , ’ v0y= ’ , v0y , ’ v0z= ’ , v0z x0 = − v0y / omega p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , 0 . 0 , ’ z0= ’ , 0 . 0 p r i n t * , ’ # xy plane : C i r c l e with c e n t e r ( 0 , 0 ) and R= ’ ,ABS( x0 ) p r i n t * , ’ # s t e p o f h e l i x : s=v0z *T= ’ , v0z * 2 . 0 * PI / omega open ( u n i t =11 , f i l e = ’ ChargeInB . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : t = 0.0 vz = v0z do while ( t . le . tf ) x = x0 * c o s ( omega * t ) y = −x0 * s i n ( omega * t ) 2.2. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 115 z = v0z * t vx = v0y * s i n ( omega * t ) vy = v0y * c o s ( omega * t ) w r i t e ( 1 1 , 1 0 0 ) t , x , y , z , vx , vy , vz t = t + dt enddo close (11) 100 FORMAT(20 G15 . 7 ) end program ChargeInB Παραθέτουμε εδώ τις εντολές μιας τυπικής συνεδρίας τα αποτελέσματα της οποίας δείχνονται στο σχήμα 2.17 και στο σχήμα 2.18. 3.5 1 x(t) v_x(t) y(t) v_y(t) z(t) 0.8 v_z(t) 3 0.6 2.5 0.4 2 0.2 1.5 0 -0.2 1 -0.4 0.5 -0.6 0 -0.8 -0.5 -1 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 Σχήμα 2.17: Οι γραφικές παραστάσεις των συναρτήσεων x(t), y(t), z(t), vx (t), vy (t), vz (t) του προγράμματος ChargeInB.f90 για ω = 6.28, x0 = 1.0, θ = 20 μοίρες. > g f o r t r a n ChargeInB . f90 −o chg > . / chg # Enter omega : 6.28 # Enter v0 , t h e t a ( d e g r e e s ) : 1 . 0 20 # Enter t f , dt : 10 0.01 # omega= 6.28000021 T= 1.00050724 # v0= 1 . theta= 20. o ( d e g r e e s ) # t 0= 0. t f = 1 0 . dt= 0.00999999978 # v0x= 0 . v0y= 0.939692616 v0z= 0.342020124 # x0= −0.149632573 y0= 0 . z0= 0. # xy plane : C i r c l e with c e n t e r ( 0 , 0 ) and R= 0.149632573 # s t e p o f h e l i x : s=v0z *T= 0.342193604 > gnuplot gnuplot > p l o t ” ChargeInB . dat ” u 1 : 2 w lines t i t l e ” x ( t ) ” 116 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 3 w lines t i t l e ” y ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 4 w lines t i t l e ” z ( t ) ” gnuplot > plot ” ChargeInB . dat ” u 1 : 5 w lines t i t l e ” v_x ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 6 w lines t i t l e ” v_y ( t ) ” gnuplot > r e p l o t ” ChargeInB . dat ” u 1 : 7 w lines t i t l e ” v_z ( t ) ” gnuplot > s p l o t ” ChargeInB . dat ” u 2 : 3 : 4 w lines t i t l e ” r ( t ) ” gnuplot > file = ” ChargeInB . dat ” gnuplot > s e t xrange [ − 0 . 6 5 : 0 . 6 5 ] ; s e t yrange [ − 0 . 6 5 : 0 . 6 5 ] gnuplot > s e t zrange [ 0 : 1 . 3 ] gnuplot > t0 =0; tf = 3 . 5 ; dt =0.1 gnuplot > load ” animate3D . gnu” t= 3.500000 (x,y,z)= (0.149623,0.001671,1.197069) 1.2 1 z 0.8 0.6 0.4 0.2 0 -0.6 0.6 -0.4 0.4 -0.2 0.2 0 0 x 0.2 -0.2 y 0.4 -0.4 0.6 -0.6 Σχήμα 2.18: Η τροχιά ⃗r(t) του υλικού σημείου του προγράμματος ChargeInB.f90 για ω = 6.28, v0 = 1.0, θ = 20 μοίρες όπως φαίνεται με το πρόγραμμα animate3D.gnu. Στον τίτλο βλέπουμε την τρέχουσα χρονική στιγμή και τις συντεταγμένες του υλικού σημείου. 2.3 Κίνηση μετ’ Εμποδίων Στην παράγραφο αυτή θα μελετήσουμε την κίνηση ενός σωματιδίου η οποία είναι ευθύγραμμη και ομαλή σε πεπερασμένα διαστήματα, αλλά σε συγκεκριμένα σημεία του χώρου έχουμε ελαστική κρούση σε ένα τοί- χωμα αμετακίνητο και αδιαπέραστο. Η κρούση αυτή θα δούμε ότι πε- 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 117 ριγράφεται από τους αλγόριθμους που θα προγραμματίσουμε προσεγ- γιστικά. Έτσι, θα μελετήσουμε για πρώτη φορά τα συστηματικά σφάλ- ματα που εισάγονται από τους αλγόριθμους που χρησιμοποιούμε¹⁷, όταν φτιάχνουμε ένα μοντέλο για το σύστημα που μελετάμε. 2.3.1 Το Μονοδιάστατο Κουτί Το πιο απλό παράδειγμα που θα μελετήσουμε είναι η κίνηση ενός σω- ματιδίου σε ένα “μονοδιάστατο κουτί”. Το σωμάτιο κινείται ελεύθερα πάνω στον άξονα των x στο διάστημα 0 < x < L όπως φαίνεται στο σχήμα 2.19. Όταν φτάνει στα άκρα του διαστήματος, ανακλάται στα τοιχώματα και η ταχύτητά του αναστρέφεται. Η δυναμική του ενέργεια είναι { 0 0<x<L V (x) = , (2.21) +∞ αλλού που έχει σχήμα ενός απειρόβαθου πηγαδιού δυναμικού. Η δύναμη F = −dV (x)/dx = 0 μέσα στο κουτί, όπου το σωμάτιο κινείται ελεύθερα, και F = ±∞ στα τοιχώματα, όπου ανακλάται. x 1111 0000 v 0000 1111 111111111111 000000000000 0000 1111 0000 1111 0000 1111 1111111111111111111111111111111 0000000000000000000000000000000 L Σχήμα 2.19: Σωματίδιο σε μονοδιάστατο κουτί με τοιχώματα στο x = 0 και x = L. Το σύστημα είναι πολύ απλό. Αρκεί να δώσουμε την αρχική θέση του σωματιδίου x0 και την αρχική του ταχύτητα v0 (το πρόσημό της δηλώνει και την αρχική κατεύθυνση κίνησης). Όσο δε συγκρούεται με τα τοιχώματα η κίνηση είναι ευθύγραμμη και ομαλή και ισχύουν οι απλές σχέσεις x(t) = x0 + v0 (t − t0 ) v(t) = v0 . (2.22) ¹⁷Και στις προηγούμενες παραγράφους υπήρχε (μικρό) συστηματικό σφάλμα στα συστήματα που μελετήσαμε, το οποίο οφειλόταν όμως στα σφάλματα των αριθμητι- κών πράξεων που εκτελούσε ο υπολογιστής - αναπαράσταση πραγματικών, ακρίβεια πράξεων κινητής υποδιαστολής κλπ. Οι αλγόριθμοι ήταν “ακριβείς ”. 118 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ Επίσης για οποιαδήποτε μεταβολή του χρόνου δt, έτσι ώστε να μην υπάρχει σύγκρουση με τα τοιχώματα μέσα στο χρονικό διάστημα (t, t + δt), ισχύει (ακριβώς, όχι προσεγγιστικά) x(t + δt) = x(t) + v(t)δt v(t + δt) = v(t) . (2.23) Θα μπορούσαμε λοιπόν να χρησιμοποιήσουμε τις παραπάνω σχέσεις για να γράψουμε το πρόγραμμά μας και όταν το σωμάτιο συγκρούεται με κάποιο από τα τοιχώματα να αντιστρέφαμε την ταχύτητα: v(t) → −v(t). Η πηγή των δυσκολιών μας κρύβεται στη λέξη “όταν”. Αφού στον υπο- λογιστή το χρονικό διάστημα δt είναι αναγκαστικά πεπερασμένο δεν μπορούμε να εντοπίσουμε τη χρονική στιγμή της σύγκρουσης με ακρί- βεια μεγαλύτερη από δt: Αν λ.χ. χρησιμοποιώντας τις Σχέσεις (2.23) το σωματίδιο τη χρονική στιγμή t + δt ξεπεράσει το τοίχωμα, η κρούση θα μπορούσε να έχει συμβεί οποιαδήποτε χρονική στιγμή μέσα στο διά- στημα (t, t + δt). O αλγόριθμος όμως, θα αλλάξει τη φορά της ταχύτητας τη χρονική στιγμή t + δt εισάγοντας ένα συστηματικό σφάλμα στον υπο- λογισμό. Πιο συγκεκριμένα, αυτό μπορεί να γίνει με το βρόχο do while ( t . le . tf ) write (11 ,*) t , x , v x = x + v * dt t = t + dt i f ( x . lt . 0.0 . or . x . gt . L ) v = −v enddo όπου η συνθήκη σύγκρουσης δίνεται στην προτελευταία γραμμή με τη λογική πρόταση “Αν x μικρότερο του 0 ή το x μεγαλύτερο του L”. Φαί- νεται η αδυναμία του αλγόριθμου να ελέγξει την ακριβή χρονική στιγμή της κρούσης. Ας δούμε τώρα ολόκληρο το πρόγραμμα, το οποίο βρίσκεται στο αρχείο box1D_1.f90 του συνοδευτικού λογισμικού. Ο χρήστης μπορεί να καθορίσει το μήκος του κουτιού L και τις αρχικές συνθήκες x0, v0. Δίνει τον αρχικό και τελικό χρόνο της κίνησης t0, tf, καθώς και το βήμα υπολογισμού dt και ο υπολογισμός ... ξεκινάει: ! ============================================================ ! F i l e box1D_1 . f90 ! Motion o f a f r e e p a r t i c l e i n a box 0<x<L ! Use i n t e g r a t i o n with time s t e p dt : x = x + v * dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 119 program box1D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l : : L , x0 , v0 , t0 , tf , dt , t , x , v !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter L : ’ read * , L print * , ’# L = ’ , L i f ( L . le . 0 . 0 ) s t o p ’L must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , v0 : ’ read * , x0 , v0 p r i n t * , ’ # x0= ’ , x0 , ’ v0= ’ , v0 i f ( x0 . lt . 0.0 . or . x0 . gt . L ) s t o p ’ i l l e g a l v a l u e o f x0 . ’ i f ( v0 . eq . 0.0 ) s t o p ’ i l l e g a l v a l u e o f v0 = 0 . ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize t = t0 x = x0 v = v0 open ( u n i t =11 , f i l e = ’ box1D_1 . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . le . tf ) write (11 ,*) t , x , v x = x + v * dt t = t + dt i f ( x . lt . 0.0 . or . x . gt . L ) v = −v enddo close (11) end program box1D Τα δεδομένα τα βρίσκουμε σε τρεις στήλες στο αρχείο box1D_1.dat. Η μεταγλώττιση και το τρέξιμο γίνεται κατά τα γνωστά, ενώ η γραφική παράσταση της τροχιάς γίνεται με το gnuplot: > g f o r t r a n box1D_1 . f90 −o box1 > . / box1 # Enter L : 10 # L = 10. # Enter x0 , v0 : 0 1.0 # x0= 0 . v0= 1. 120 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ # Enter t0 , t f , dt : 0 100 0.01 # t 0= 0. t f = 100. dt= 0.00999999978 > gnuplot gnuplot > p l o t ” box1D_1 . dat ” using 1 : 2 w lines t i t l e ” x ( t ) ” ,\ 0 notitle , L notitle gnuplot > p l o t [ : ] [ − 1 . 2 : 1 . 2 ] ” box1D_1 . dat ” \ using 1 : 3 w lines t i t l e ” v ( t ) ” 12 x(t) 10 8 x(t) 10.0002 6 10.0001 10.0001 4 10 10 2 9.99995 0 9.9999 9.99985 -2 0 10 20 30 40 50 60 70 80 90 100 90 90.0005 90.001 90.0015 Σχήμα 2.20: Η τροχιά x(t) σωματιδίου σε μονοδιάστατο κουτί με L = 10, x0 = 0.0, v0 = 1.0, t0 = 0, δt = 0.01. Στο δεξί διάγραμμα μεγεθύνουμε λεπτομέρεια όταν t ≈ 90. Φαίνονται τα συστηματικά σφάλματα στον προσδιορισμό της χρονικής στιγμής της κρούσης tk = 90 και της μέγιστης τιμής της x(t), xm = L = 10.0. Τα αποτελέσματα για την τροχιά x(t) δείχνονται στο σχήμα 2.20. Είναι φανερή η επίδραση του συστηματικού σφάλματος στα αποτελέσματα. Με τις απλές αρχικές συνθήκες που επιλέξαμε, οι κρούσεις συμβαίνουν κάθε T /2 = L/v = 10 μονάδες χρόνου. Άρα στο κομμάτι του διαγράμ- ματος που μεγεθύναμε στο αριστερό του σχήματος 2.20, η αντιστροφή της κίνησης θα έπρεπε να είχε συμβεί όταν t = 90, x = L = 10. Ο αναγνώστης θα έχει ήδη καταλάβει ότι το παραπάνω πρόβλημα βελτιώνεται, αν πάρουμε το δt ολοένα και πιο μικρό. Άρα, αν έχουμε την απαραίτητη υπολογιστική δύναμη, μπορούμε να κάνουμε το σφάλμα όσο μικρό θέλουμε; Ναι, αυτό μέχρι ένα σημείο γίνεται. Όμως η επόμενη θέση καθορίζεται από την πράξη x+v*dt και η επόμενη χρονική στιγμή από το άθροισμα t+dt. Τι θα γίνει αν παίρνοντας το dt αρκετά μικρό, το γινόμενο v*dt γίνει περισσότερο από επτά τάξεις μεγέθους μικρότερο από την τρέχουσα τιμή του x; Ή το dt ∼ 10−7 t¹⁸; Αφού τα x, v, dt εί- ¹⁸Αυτό το πρόβλημα θα το λύσουμε αργότερα, όταν για το βήμα i θα ορίσουμε t=t0+i*dt. Γιατί αυτή η μέθοδος είναι προτιμητέα; 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 121 ναι μεταβλητές τύπου REAL, η ακρίβεια στην αναπαράστασή τους είναι περίπου επτά δεκαδικά ψηφία. Για να κάνει ο υπολογιστής πρόσθεση δύο αριθμών, πρέπει να μετατρέψει τους δύο αριθμούς σε αναπαρά- σταση που θα έχουν τον ίδιο εκθέτη. Άρα ο αριθμός των σημαντικών ψηφίων του μικρότερου αριθμού που θα μπορέσει να αποθηκεύσει στη μνήμη ο υπολογιστής θα μειωθεί¹⁹ και το αποτέλεσμα της πρόσθεσης χάνει μέρος της υπάρχουσας ακρίβειας των δεδομένων. Αυτό όσο και να προσπαθούμε δε διορθώνεται²⁰. Η μόνη μας ελπίδα είναι να επινοήσουμε έναν καλύτερο αλγόριθμο. Αυτό τις περισσότερες φορές φορές δεν είναι δυνατόν, αλλά στο πρόβλημα που μελετάμε η λύση είναι απλή. Λ.χ. θεωρήστε τη σχέση που δίνει τη θέση του κινητού στην ευθύγραμμη ομαλή κίνηση: x(t) = x0 + v0 (t − t0 ) . (2.24) Ας χρησιμοποιήσουμε την παραπάνω σχέση για τα τμήματα της κίνησης μεταξύ των συγκρούσεων. Το μόνο που έχουμε να κάνουμε είναι σε κάθε σύγκρουση με ένα από τα τοιχώματα να αντιστρέφουμε τη v0 , να ορίζουμε το x0 να είναι η τρέχουσα θέση του κινητού και t0 να είναι η τρέχουσα χρονική στιγμή. Αυτό επιτυγχάνεται με το βρόχο: t = t0 do while ( t . le . tf ) x = x0 + v0 * ( t−t0 ) w r i t e ( 1 1 , * ) t , x , v0 i f ( x . lt . 0.0 . or . x . gt . L ) then x0 = x t0 = t v0 = −v0 endif t = t + dt Στον παραπάνω αλγόριθμο δε γλιτώνουμε από το σφάλμα προσδιορι- σμού της στιγμής της κρούσης, αλλά δεν έχουμε το πρόβλημα “αστάθειας” που είχε ο προηγούμενος όταν dt→ 0. Έτσι, έχουμε τη δυνατότητα να απομονώσουμε τη συνεισφορά κάθε τύπου σφαλμάτων. Παρακάτω δί- ¹⁹Έστω x=1.0 και v*dt=3.456789e-5. Τότε x+v*dt=1.000000+0.000035=1.000035 και θα χάσουμε 5 σημαντικά ψηφία από την ακρίβεια αναπαράστασης του v*dt. Τι θα γίνει αν v*dt=3.456789e-9; ²⁰Φυσικά θα μπορούσαμε να διαλέξουμε μεταβλητές REAL(8), REAL(16), .... Αυτό μπορεί να μας λύσει το πρόβλημα για δεδομένο tf, αλλά ανάλογο πρόβλημα ακρί- βειας θα συναντήσουμε, αν υπολογίσουμε την τροχιά για (αρκετά) μεγαλύτερο tf. Δοκιμάστε το... 122 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ νουμε το πρόγραμμα που χρησιμοποιεί τον παραπάνω αλγόριθμο που μπορείτε να βρείτε στο συνοδευτικό λογισμικό στο αρχείο box1D_2.f90: ! ============================================================ ! F i l e box1D_2 . f90 ! Motion o f a f r e e p a r t i c l e i n a box 0<x<L ! Use c o n s t a n t v e l o c i t y e q u a t i o n : x = x0 + v0 * ( t−t 0 ) ! Re ve rse v e l o c i t y and r e d e f i n e x0 , t 0 on boundaries !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program box1D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l : : L , x0 , v0 , t0 , tf , dt , t , x , v !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter L : ’ read * , L print * , ’# L = ’ , L i f ( L . le . 0 . 0 ) s t o p ’L must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , v0 : ’ read * , x0 , v0 p r i n t * , ’ # x0= ’ , x0 , ’ v0= ’ , v0 i f ( x0 . lt . 0.0 . or . x0 . gt . L ) s t o p ’ i l l e g a l v a l u e o f x0 . ’ i f ( v0 . eq . 0.0 ) s t o p ’ i l l e g a l v a l u e o f v0 = 0 . ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize t = t0 open ( u n i t =11 , f i l e = ’ box1D_2 . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . le . tf ) x = x0 + v0 * ( t−t0 ) w r i t e ( 1 1 , * ) t , x , v0 i f ( x . lt . 0.0 . or . x . gt . L ) then x0 = x t0 = t v0 = −v0 endif t = t + dt enddo close (11) end program box1D Το πρόγραμμα το μεταγλωττίζουμε και το τρέχουμε όπως το προηγού- 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 123 μενο. Τα αποτελέσματα θα τα βρούμε στο αρχείο box1D_2.dat. Ο παραπάνω αλγόριθμος μπορεί να βελτιωθεί και να μας δώσει την ακριβή λύση. Σας το αφήνουμε για άσκηση²¹. 2.3.2 Σφάλματα Ας δούμε με λίγο περισσότερη λεπτομέρεια την επίδραση των συστη- ματικών σφαλμάτων στα αποτελέσματα που πήραμε από τη μελέτη του απλού προβλήματος που περιγράψαμε στην προηγούμενη παρά- γραφο. Θεωρήσαμε δύο κατηγορίες σφαλμάτων: Πρώτα, το συστημα- τικό σφάλμα στον προσδιορισμό της χρονικής στιγμής της κρούσης. Αυτό μειώνεται όταν ελαττώνουμε το βήμα χρόνου δt. Μετά, το σφάλμα πρό- σθεσης αριθμών με μεγάλη διαφορά τάξης μεγέθους και την αστάθεια που αυτή προκαλεί. Αυτό αυξάνεται, όταν ελαττώνουμε αρκετά το βήμα χρόνου δt. Άρα, τα δύο σφάλματα ανταγωνίζονται και ο μελετητής του προβλήματος πρέπει να προσδιορίσει τη βέλτιστη επιλογή για το δt. Αυτή η κατάσταση παρουσιάζεται σε πολλά ενδιαφέροντα προβλήματα για τα οποία δε γνωρίζουμε την ακριβή τους λύση, οπότε είναι πολύ διδακτικό να τη μελετήσουμε στο απλό πρόβλημα που επιλέξαμε. Όταν δε γνωρίζουμε τη λύση, ο έλεγχος αυτών των συστηματικών σφαλμάτων γίνεται μελετώντας τη συμπεριφορά της λύσης, καθώς ελατ- τώνεται το δt. Αν παρατηρηθεί σύγκλιση των λύσεων για μια περιοχή αρκετά μικρών δt, τότε καταλήγουμε στο συμπέρασμα ότι η λύση είναι το όριο αυτό με ακρίβεια συγκρινόμενη με τη διαφορά των λύσεων για τα μικρότερα δt. Χρησιμοποιήσαμε δύο αλγόριθμους, ο πρώτος υλοποιήθηκε στο πρό- γραμμα που γράψαμε στο αρχείο box1D_1.f90 και ο δεύτερος στο box1D_2.f90. Θα αναφερόμαστε σε αυτούς στην παράγραφο αυτή ως η “μέθοδος 1” και “μέθοδος 2” αντίστοιχα. Θα δοκιμάσουμε να δούμε πώς μπορούμε να κάνουμε την ανάλυση της σύγκλισης των αποτελεσμάτων καθώς δt → 0. Για κάθε μέθοδο θα καθορίσουμε όλες τις παραμέτρους εκτός από το δt. Στην ανάλυση παρακάτω θα χρησιμοποιήσουμε L = 10, v0 = 1.0, x0 = 0.0, t0 = 0.0, tf = 95.0, άρα το υλικό σημείο θα πρέπει να κάνει μία κρούση ανά 10 μονάδες χρόνου. Θα πάρουμε διαδοχικά μι- κρότερες τιμές του δt και θα υπολογίσουμε την τελική θέση του κινητού x(t ≈ 95)²² ως συνάρτηση του δt. Θα μελετήσουμε αν, πόσο καλά και πόσο γρήγορα συγκλίνει αυτή η τιμή σε ένα όριο, καθώς δt → 0²³. ²¹Δείτε το αρχείο box1D_3.dat στο συνοδευτικό λογισμικό. ²²Προσέξτε το ≈! ²³Φυσικά εδώ γνωρίζουμε ότι θα πρέπει να πάρουμε x(95) = 5. 124 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ Η ανάλυση αποτελείται από πολλές επαναλαμβανόμενες εντολές: Η μεταγλώττιση του κώδικα, ο καθορισμός των παραμέτρων, το τρέξιμο και ο υπολογισμός τις τιμής x(t ≈ 95) για πολλές τιμές του δt. Σε ένα αρχείο box1D_anal.in γράφουμε τις τιμές των παραμέτρων που θα εισάγουμε στο πρόγραμμα: 10 L 0 1.0 x0 v0 0 95 0.05 t0 tf dt Στη συνέχεια, μεταγλωττίζουμε το πρόγραμμα > g f o r t r a n box1D_1 . f90 −o box και το τρέχουμε με την εντολή > c a t box1D_anal . in | . / box που στέλνει τα περιεχόμενα του αρχείου box1D_anal.in στο stdin του προγράμματος ./box. Το αποτέλεσμα που ζητάμε είναι στην τελευταία γραμμή του αρχείου box1D_1.dat: > t a i l −n 1 box1D_1 . dat 94.9511948 5.45000267 −1. Η τρίτη τιμή είναι αυτή της ταχύτητας και δε μας ενδιαφέρει. Σε ένα αρχείο, λ.χ. box1D_anal.dat τοποθετούμε το δt και τις δύο πρώτες τι- μές από την παραπάνω εντολή. Αλλάζουμε την τιμή του δt → δt/2 στο αρχείο box1D_anal.in 12 φορές μέχρι να γίνει ίση με 0.000012 και επα- ναλαμβάνουμε²⁴. Επαναλαμβάνουμε τη διαδικασία²⁵ για τη μέθοδο 2 τοποθετώντας τα αποτελέσματα για το x(t ≈ 95) σε νέες στήλες στο αρχείο box1D_anal.dat. Το αποτέλεσμα είναι # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # dt t1_95 x1 (9 5 ) x2 (9 5 ) # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0.050000 94.95119 5.450003 5.550126 ²⁴Ο σεφ προτείνει: Δοκιμάστε την εντολή sed 's/0.05/0.025/' box1D_anal.in | ./box αλλάζοντας το 0.025 με την τιμή του δt που επιθυμείτε να μελετήσετε. ²⁵Σπεσιαλιτέ: Δείτε το σενάριο φλοιού box1D_anal.csh στο συνοδευτικό λογισμικό για ιδέες αυτοματοποίησης της διαδικασίας. 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 125 0.025000 94.97849 5.275011 5.174837 0.012500 94.99519 5.124993 5.099736 0.006250 94.99850 4.987460 5.063134 0.003125 94.99734 5.021894 5.035365 0.001563 94.99923 5.034538 5.017764 0.000781 94.99939 4.919035 5.011735 0.000391 94.99979 4.695203 5.005493 0.000195 95.00000 5.434725 5.001935 0.000098 94.99991 5.528124 5.000745 0.000049 94.99998 3.358000 5.000330 0.000024 94.99998 2.724212 5.000232 0.000012 94.99999 9.240705 5.000158 Η μελέτη της σύγκλισης μπορεί να φανεί εποπτικά στο αριστερό σχήμα 2.21. Η 1η μέθοδος βελτιώνει την ακρίβειά της μεγιστοποιώντας την όταν δt ≈ 0.01, ενώ για δt < 0.0001, το σφάλμα γίνεται > 10% και η μέθοδος δίνει άχρηστα αποτελέσματα. Η 2η μέθοδος έχει πολύ καλύτερη συμπεριφορά από την 1η. Παρατηρούμε ότι, καθώς μικραίνει το δt, η τελική τιμή του t πλη- σιάζει την αναμενόμενη tf = 95. Γιατί όμως δεν παίρνουμε t = 95, ειδικά όταν t/δt είναι ακέραιος αριθμός; Επίσης παρατηρούμε στην 9η γραμμή των δεδομένων του πίνακα (dt=0.000195): Αφού 95/0.000195 δεν είναι ακέραιος, γιατί t = 95; Ακόμα χειρότερα: Αν θεωρητικά ανα- μένουμε να γίνουν 95/δt βήματα, πόσα γίνονται στην πραγματικότητα; Κάθε φορά που κάνετε μια μέτρηση μετρήστε πόσες γραμμές έχει το αρχείο box1D_1.dat με την εντολή²⁶ > wc −l box1D_1 . dat και συγκρίνετε με τον αναμενόμενο αριθμό. Το αποτέλεσμα είναι εν- διαφέρον: # −−−−−−−−−−−−−−−−−−−−−− # dt N N0 # −−−−−−−−−−−−−−−−−−−−−− 0.050000 1900 1900 0.025000 3800 3800 0.012500 7601 7600 0.006250 15203 15200 0.003125 30394 30400 0.001563 60760 60780 0.000781 121751 121638 0.000391 243753 242966 ²⁶Εναλλακτικά, βάλτε ένα μετρητή μέσα στο βρόχο του προγράμματος. 126 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ 0.000195 485144 487179 0.000098 962662 969387 0.000049 1972589 1938775 0.000024 4067548 3958333 0.000012 7540956 7916666 όπου η 2η στήλη έχει τον αριθμό των βημάτων που έγιναν και η 3η τον αριθμό των βημάτων που έπρεπε να γίνουν. Παρατηρούμε ότι η ακρίβεια ελαττώνεται , όταν μικραίνουμε το δt και στο τέλος η δια- φορά είναι περίπου 5%! Ειδικά στην τελευταία γραμμή, αν οι πράξεις γίνονταν με μεγαλύτερη ακρίβεια, θα έπρεπε ο τελικός χρόνος να ήταν tf = 0.000012 × 7540956 ≈ 90.5 κάτι που αλλάζει δραματικά το αποτέ- λεσμα σε μια περιοδική κίνηση με περίοδο συγκρινόμενη με το σφάλμα στο χρόνο... Επειδή η 1η μέθοδος προχωράει το χρόνο στις εξισώσεις κίνησης ανάλογα με τον αριθμό των βημάτων, καταλαβαίνουμε ότι στην πραγματικότητα η τιμή που παίρνουμε για τη θέση είναι για άλλο χρόνο από αυτόν που νομίζουμε. Άρα μια σημαντική πηγή σφαλμάτων είναι το σφάλμα συσσώρευσης στον υπολογισμό του χρόνου που γίνεται μεγαλύτερο, καθώς μικραί- νει το δt. Πώς θα μπορούσαμε να βελτιώσουμε τη συμπεριφορά αυτή; Μια σημαντική βελτίωση μπορεί να γίνει, αν αντί να υπολογίζουμε το χρόνο προσθετικά, τον υπολογίζουμε πολλαπλασιαστικά. Έστω i ένας μετρητής των βημάτων που έχουμε κάνει. Τότε ! t = t + dt ! Not a c c u r a t e , avoid t = t0 + i * dt ! B e t t e r accuracy , p r e f e r Ο κύριος βρόχος του προγράμματος στο box1D_1.f90 γίνεται: t = t0 x = x0 v = v0 i = 0 do while ( t . le . tf ) write (11 ,*) t , x , v i = i + 1 x = x + v * dt t = t0 + i * dt i f ( x . lt . 0.0 . or . x . gt . L ) v = −v enddo Το πλήρες πρόγραμμα θα το βρείτε στο αρχείο box1D_4.f90 του συ- νοδευτικού λογισμικού. Ας ονομάσουμε τη μέθοδο αυτή “μέθοδο 3”. Παρόμοια αλλαγή κάνουμε και στο αρχείο box1D_2.f90 που θα βρείτε 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 127 στο box1D_5.f90 και καλούμε τη μέθοδο αυτή “μέθοδο 4”. Επαναλαμβά- νουμε την παραπάνω ανάλυση και βρίσκουμε ότι το πρόβλημα ακριβούς προσδιορισμού του χρόνου πρακτικά εξαφανίζεται. Το αποτέλεσμα της ανάλυσης του σφάλματος το δείχνουμε στο δεξί σχήμα 2.21. Η μέθο- δος 2 και 4 δεν παρουσιάζει σημαντική διαφορά. Στη μέθοδο 1 και 3 η διαφορά είναι δραματική με το σφάλμα να μειώνεται μέχρι και περισ- σότερο από 10 φορές. Το πρόβλημα του αυξανόμενου σφάλματος κα- 100 100 10 10 1 1 δx (%) δx (%) 0.1 0.1 0.01 0.01 0.001 0.001 method 1 method 3 method 2 method 4 0.0001 0.0001 1e-05 0.0001 0.001 0.01 0.1 1e-05 0.0001 0.001 0.01 0.1 δt δt Σχήμα 2.21: Το επί % σφάλμα δx = 2|xi (95)−x(95)|/|xi (95)+x(95)|×100 όπου xi (95) η τιμή που υπολογίζει η μέθοδος i = 1, 2, 3, 4 και x(95) η τιμή που υπολογίζει ο ακριβής αλγόριθμος σύμφωνα με το κείμενο. θώς μειώνουμε το δt δεν εξαφανίζεται. Αλλά τώρα καταλαβαίνουμε ότι προέρχεται από τη συσσώρευση σφάλματος στην επαναληπτική σχέση x=x+v*dt. Αυτόν τον τύπο σφάλματος είναι δυσκολότερο να τον βελ- τιώσουμε και παρουσιάζεται συχνά σε μεθόδους επίλυσης διαφορικών εξισώσεων που θα μελετήσουμε στο επόμενο κεφάλαιο. 2.3.3 Το Δισδιάστατο Κουτί Ας γενικεύσουμε τη μελέτη μας όταν το υλικό σημείο κινείται στις δύο διαστάσεις, στο επίπεδο. Το σωμάτιο είναι περιορισμένο μέσα σε ένα κουτί 0 < x < Lx , 0 < y < Ly και σκεδάζεται ελαστικά πάνω στα τοιχώματά του. Βρίσκεται δηλαδή σε ένα ορθογώνιο απειρόβαθο πηγάδι δυναμικού. Ο χρήστης τοποθετεί τη χρονική στιγμή t0 το υλικό σημείο σε μια αρχική θέση (x0 , y0 ) με αρχική ταχύτητα (v0x , v0y ) και το πρόγραμμα υπολογίζει την τροχιά που ακολουθεί το υλικό σημείο μέχρι το χρόνο tf με βήμα δt. Μία τέτοια τροχιά φαίνεται στο σχήμα 2.23. Θα γενικεύσουμε τον αλγόριθμο που χρησιμοποιήσαμε στο πρό- γραμμα box2D_1.f90 για να μελετήσουμε την κίνηση στο μονοδιάστατο 128 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ κουτί. Αν είναι γνωστή η θέση και η ταχύτητα του κινητού σε μια χρο- νική στιγμή t, τότε τη χρονική στιγμή t + δt η θέση και η ταχύτητά του θα δίνεται από τις σχέσεις x(t + δt) = x(t) + vx (t)δt y(t + δt) = y(t) + vy (t)δt vx (t + δt) = vx (t) vy (t + δt) = vy (t) . (2.25) Η σύγκρουση με τα τοιχώματα προτυποποιείται με ανάκλαση της κά- θετης στα τοιχώματα συνιστώσας της ταχύτητας, όταν η αντίστοιχη συ- ντεταγμένη περάσει τα όρια του τοίχου. Φυσικά αυτό εισάγει το συστη- ματικό σφάλμα που συζητήσαμε στην προηγούμενη παράγραφο. Απο- φεύγουμε το συστηματικό σφάλμα συσσώρευσης στον υπολογισμό του χρόνου εισάγοντας έναν μετρητή βημάτων i, και έτσι το κεντρικό κομ- μάτι του προγράμματος είναι: i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt i f ( x . lt . 0.0 . or . x . gt . Lx ) vx = −vx i f ( y . lt . 0.0 . or . y . gt . Ly ) vy = −vy Παραθέτουμε το πλήρες πρόγραμμα παρακάτω το οποίο θα βρείτε στο αρχείο box2D_1.f90. Εκτός από τα εισαγωγικά και τις αρχικοποιήσεις, εισάγαμε και δύο μετρητές κρούσεων με τα τοιχώματα nx και ny: ! ============================================================ ! F i l e box2D_1 . f90 ! Motion o f a f r e e p a r t i c l e i n a box 0<x<Lx 0<y<Ly ! Use i n t e g r a t i o n with time s t e p dt : x = x + vx * dt y=y+vy * dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program box2D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of va r ia b le s r e a l ( 8 ) : : Lx , Ly , x0 , y0 , v0x , v0y , t0 , tf , dt , t , x , y , vx , vy i n t e g e r : : i , nx , ny !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter Lx , Ly : ’ read * , Lx , Ly p r i n t * , ’ # Lx = ’ , Lx , ’ Ly= ’ , Ly 2.3. ΚΙΝΗΣΗ ΜΕΤ’ ΕΜΠΟΔΙΩΝ 129 i f ( Lx . le . 0 . 0 ) s t o p ’Lx must be p o s i t i v e . ’ i f ( Ly . le . 0 . 0 ) s t o p ’Ly must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , y0 , v0x , v0y : ’ read * , x0 , y0 , v0x , v0y p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ v0x= ’ , v0x , ’ v0y= ’ , v0y i f ( x0 . lt . 0.0 . or . x0 . gt . Lx ) s t o p ’ i l l e g a l v a l u e o f x0 . ’ i f ( y0 . lt . 0.0 . or . y0 . gt . Ly ) s t o p ’ i l l e g a l v a l u e o f y0 . ’ i f ( v0x **2+ v0y * * 2 . eq . 0.0 ) s t o p ’ i l l e g a l v a l u e o f v0 =0. ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i = 0 nx = 0 ; ny = 0 t = t0 x = x0 ; y = y0 vx = v0x ; vy = v0y open ( u n i t =11 , f i l e = ’ box2D_1 . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . le . tf ) w r i t e ( 1 1 , * ) t , x , y , vx , vy i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt i f ( x . lt . 0.0 . or . x . gt . Lx ) then vx = −vx nx = nx + 1 endif i f ( y . lt . 0.0 . or . y . gt . Ly ) then vy = −vy ny = ny + 1 endif enddo close (11) p r i n t * , ’ # Number o f c o l l i s i o n s : ’ p r i n t * , ’ # nx= ’ , nx , ’ ny= ’ , ny end program box2D Μια τυπική συνεδρία μελέτης μιας τροχιάς δίνεται παρακάτω: > g f o r t r a n box2D_1 . f90 −o box > . / box # Enter Lx , Ly : 10.0 5.0 # Lx = 1 0 . Ly= 5. 130 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ # Enter x0 , y0 , v0x , v0y : 5.0 0.0 1 . 2 7 1.33 # x0= 5 . y0= 0 . v0x= 1 . 2 7 v0y= 1.33 # Enter t0 , t f , dt : 0 50 0.01 # t 0= 0. t f = 50. dt= 0.01 # Number o f c o l l i s i o n s : # nx= 6 ny= 13 > gnuplot gnuplot > p l o t ” box2D_1 . dat ” using 1 : 2 w lines title ”x ( t ) ” gnuplot > r e p l o t ” box2D_1 . dat ” using 1 : 3 w lines title ”y ( t ) ” gnuplot > p l o t ” box2D_1 . dat ” using 1 : 4 w lines title ” vx ( t ) ” gnuplot > r e p l o t ” box2D_1 . dat ” using 1 : 5 w lines title ” vy ( t ) ” gnuplot > p l o t ” box2D_1 . dat ” using 2:3 w lines title ”x−y ” Παρατηρούμε την τελευταία γραμμή εξόδου από το πρόγραμμα: Το υλικό σημείο ανακλάται από τα κάθετα τοιχώματα του κουτιού 6 φορές (nx= 6) και από τα οριζόντια 13 (ny=13). Με τις εντολές αυτές παίρνουμε τις γραφικές παραστάσεις που φαίνονται στα σχήματα 2.22 και 2.23. 12 1.5 x(t) vx(t) y(t) vy(t) 10 1 8 0.5 6 0 4 -0.5 2 0 -1 -2 -1.5 0 10 20 30 40 50 0 10 20 30 40 50 Σχήμα 2.22: Τα αποτελέσματα για το υλικό σημείο που κινείται μέσα σε δισδιάστατο κουτί που παίρνουμε από το πρόγραμμα box2D_1.f90. Οι παράμετροι είναι Lx = 10, Ly = 5, x0 = 5, y0 = 0, v0x = 1.27, v0y = 1.33, t0 = 0, tf = 50, δt = 0.01. Για να κάνουμε animation της τροχιάς αντιγράφουμε το αρχείο box2D_animate.gnu από το συνοδευτικό λογισμικό στον κατάλογο που έχουμε τα δεδομένα μας και δίνουμε τις εντολές στο gnuplot: gnuplot > file = ” box2D_1 . dat ” gnuplot > Lx = 10 ; Ly = 5 gnuplot > t0 = 0 ; tf = 50; dt = 1 gnuplot > load ” box2D_animate . gnu” gnuplot > t0 = 0 ; dt = 0 . 5 ; load ” box2D_animate . gnu” 2.4. ΕΦΑΡΜΟΓΕΣ 131 t= 48.000000 (x,y)= (5.901700,3.817100) 5 4 3 y 2 1 0 0 2 4 6 8 10 x Σχήμα 2.23: Η τροχιά του υλικού σημείου του σχήματος 2.22 τη χρονική στιγμή t = 48. Η αρχή του βέλους είναι η αρχική θέση του υλικού σημείου και το τέλος η στιγμιαία του θέση. Το κουτί περιγράφεται από τις παχιές γραμμές. Στην τελευταία γραμμή επαναλάβαμε το animation στη ... μισή ταχύ- τητα. Μπορείτε να χρησιμοποιήσετε επίσης το ήδη γνωστό πρόγραμμα animate2D.gnu που παρουσιάσαμε στην παράγραφο 2.1.1. Οι αλλαγές που κάναμε στο box2D_animate.gnu απλά προσθέτουν ένα σχέδιο του κουτιού και υπολογίζουν αυτόματα τα όρια σχεδιασμού της γραφικής παράστασης. Επίσης, το διάνυσμα που παρακολουθεί την κίνηση του σωματιδίου δεν είναι το διάνυσμα θέσης, αλλά αυτό που ενώνει την αρχική με την τελική θέση του. Το επόμενο βήμα είναι να ελέγξουμε την ακρίβεια των αποτελεσμά- των μας. Αυτό γίνεται στο πνεύμα της αντίστοιχης παρουσίασης του μονοδιάστατου προβλήματος και αφήνεται σαν άσκηση για τον ανα- γνώστη. 2.4 Εφαρμογές Στην παράγραφο αυτή θα παρουσιάσουμε απλά προβλήματα ελεύθερης κίνησης μετ’ εμποδίων για εξάσκηση στον προγραμματισμό τους. Θα αρχίσουμε με ... μίνι γκολφ. Ο παίκτης ρίχνει το (σημειακό) μπα- 132 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ λάκι σε ένα ορθογώνιο επίπεδο κουτί μήκους πλευρών Lx , Ly το οποίο είναι ανοιχτό στην πλευρά x = 0. Το κουτί έχει μια τρύπα κέντρου (xc , yc ) και ακτίνας R. Αν η μπάλα πέσει μέσα, ο παίκτης κερδίζει. Αν η μπάλα βγει από την ανοιχτή πλευρά, ο παίκτης χάνει. Για να ελέγξουμε αν το υλικό σημείο μπήκε στην περιοχή της τρύπας όταν είναι στη θέση (x, y) αρκεί να ελέγξουμε αν (x − xc )2 + (y − yc )2 ≤ R2 . t= 45.300000 (x,y)= (7.854117,2.982556) 5 4 3 y 2 1 0 0 2 4 6 8 10 x Σχήμα 2.24: Η τροχιά του υλικού σημείου που παράγεται από το πρόγραμμα MiniGolf.f90 με παραμέτρους αυτές που δίνονται στο κείμενο. Απεικονίζεται η στιγμή της ... επιτυχίας! Τη χρονική στιγμή t = 45.3 το υλικό σημείο μπαίνει στην περιοχή της τρύπας με κέντρο (8, 2.5) και ακτίνα 0.5. Το υλικό σημείο υποτίθεται πως για t0 = 0 βρίσκεται στη θέση (0, Ly /2) και ο παίκτης το εκτοξεύει με ταχύτητα μέτρου v0 με γω- νία θ μοίρες που σχηματίζει με τον άξονα x. Το πρόγραμμα δίνεται παρακάτω: ! ============================================================ ! F i l e MiniGolf . f ! Motion o f a f r e e p a r t i c l e i n a box 0<x<Lx 0<y<Ly ! The box i s open a t x=0 and has a h o l e a t ( xc , yc ) o f r a d i u s R ! B a l l i s s h o t a t ( 0 , Ly / 2 ) with speed v0 , a n g l e t h e t a ( d e g r e e s ) ! Use i n t e g r a t i o n with time s t e p dt : x = x + vx * dt y=y+vy * dt ! B a l l s t o p s i n h o l e ( s u c c e s s ) or a t x=0 ( f a i l u r e ) 2.4. ΕΦΑΡΜΟΓΕΣ 133 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program MiniGolf i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables real (8) : : Lx , Ly , x0 , y0 , v0x , v0y real (8) : : t0 , tf , dt , t , x , y , vx , vy real (8) : : v0 , theta , xc , yc , R , R2 r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 integer : : i , nx , ny character (7) :: result !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter Lx , Ly : ’ read * , Lx , Ly p r i n t * , ’ # Lx = ’ , Lx , ’ Ly= ’ , Ly i f ( Lx . le . 0 . 0 ) s t o p ’Lx must be p o s i t i v e . ’ i f ( Ly . le . 0 . 0 ) s t o p ’Ly must be p o s i t i v e . ’ p r i n t * , ’ # Enter h o l e p o s i t i o n and r a d i u s : ( xc , yc ) , R : ’ read * , xc , yc , R p r i n t * , ’ # ( xc , yc )= ( ’ , xc , ’ , ’ , yc , ’ ) R= ’ , R p r i n t * , ’ # Enter v0 , t h e t a ( d e g r e e s ) : ’ read * , v0 , theta p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ d e g r e e s ’ i f ( v0 . le . 0.0 D0 ) s t o p ’ i l l e g a l v a l u e o f v0 . ’ i f (ABS( theta ) . ge . 90.0 D0 ) s t o p ’ i l l e g a l v a l u e o f t h e t a . ’ p r i n t * , ’ # Enter dt : ’ read * , dt p r i n t * , ’ # dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize t0 = 0.0 D0 x0 = 0.00001 D0 ! s m a l l but non−z e r o y0 = Ly / 2 . 0 R2 = R * R theta = ( PI / 1 8 0 . 0 D0 ) * theta v0x = v0 * c o s ( theta ) v0y = v0 * s i n ( theta ) p r i n t * , ’ # x0= ’ , x0 , ’ y0= ’ , y0 , ’ v0x= ’ , v0x , ’ v0y= ’ , v0y i = 0 nx = 0 ; ny = 0 t = t0 x = x0 ; y = y0 vx = v0x ; vy = v0y open ( u n i t =11 , f i l e = ’ MiniGolf . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( . TRUE . ) ! f o r e v e r ! w r i t e ( 1 1 , * ) t , x , y , vx , vy 134 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt i f ( x . gt . Lx ) then vx = −vx nx = nx + 1 endif i f ( y . lt . 0.0 . or . y . gt . Ly ) then vy = −vy ny = ny + 1 endif i f ( x . le . 0.0 D0 ) then result = ’ Failure ’ e x i t ! e x i t do loop endif i f ( ( ( x−xc ) * ( x−xc ) +(y−yc ) * ( y−yc ) ) . le . R2 ) then r e s u l t = ’ Success ’ e x i t ! e x i t do loop endif enddo close (11) p r i n t * , ’ # Number o f c o l l i s i o n s : ’ p r i n t * , ’ # R e s u l t= ’ , r e s u l t , ’ nx= ’ , nx , ’ ny= ’ , ny end program MiniGolf Για να το τρέξουμε κάνουμε τα συνηθισμένα: > g f o r t r a n MiniGolf . f90 −o mg > . / mg # Enter Lx , Ly : 10 5 # Lx = 1 0 . Ly= 5. # Enter h o l e p o s i t i o n and r a d i u s : ( xc , yc ) , R : 8 2.5 0.5 # ( xc , yc )= ( 8. , 2.5 ) R= 0.5 # Enter v0 , t h e t a ( d e g r e e s ) : 1 80 # v0= 1 . theta= 80. d e g r e e s # Enter dt : 0.01 # dt= 0.01 # x0= 1 . E−05 y0= 2.5 v0x= 0.173648178 v0y= 0.984807753 # Number o f c o l l i s i o n s : # R e s u l t= S u c c e s s nx= 0 ny= 9 Φτιάξτε τα διαγράμματα της θέσης και της ταχύτητας με το χρόνο κα- θώς και της τροχιάς κατά τα γνωστά. Για διασκέδαση του αναγνώστη 2.4. ΕΦΑΡΜΟΓΕΣ 135 παρέχουμε και ειδικό πρόγραμμα animation (μπορείτε να χρησιμοποιή- σετε και το animate2D.gnu). Αντιγράψτε από το συνοδευτικό λογισμικό το αρχείο MiniGolf_animate.gnu, ξεκινήστε το gnuplot και δώστε τις εντολές: gnuplot > file = ” MiniGolf . dat ” gnuplot > Lx = 1 0 ; Ly = 5 gnuplot > xc = 8 ; yc = 2.5 ; R = 0.5 gnuplot > t0 = 0 ; dt = 0 . 1 gnuplot > load ” MiniGolf_animate . gnu” Το σχήμα 2.24 αποτελεί αδιάψευστη μαρτυρία της επιτυχίας μας! Η επόμενη εφαρμογή μας θα είναι τρισδιάστατη. Θα μελετήσουμε την κίνηση ενός υλικού σημείου το οποίο κινείται μέσα σε ένα κύλιν- δρο ακτίνας R και ύψους L. Η κρούσεις στα τοιχώματα και τις βάσεις του κυλίνδρου είναι ελαστικές και ο κύλινδρος είναι αμετακίνητος και απαραμόρφωτος. Στο πρόγραμμα που θα γράψουμε παίρνουμε τον κύ- λινδρο να έχει τον άξονα συμμετρίας τον άξονα των z. Η μία βάση του τοποθετείται στο επίπεδο z = 0 και η άλλη στο z = L. Η διάταξη φαίνεται στο σχήμα 2.26. Το πρόβλημα δεν παρουσιάζει καμία δυσκολία σε σχέση με τα προη- γούμενα όσο αφορά την κίνηση στον άξονα των z, το σωμάτιο ανακλά- ται πάνω στα επίπεδα τοιχώματα των βάσεων του κυλίνδρου. Το μόνο καινούργιο είναι η προβολή της κίνησης στο επίπεδο x − y, όπου το υλικό σημείο φαίνεται να κινείται σε ένα επίπεδο και να συγκρούεται ελαστικά στο εσωτερικό ενός κύκλου ακτίνας R και κέντρο πάνω στον άξονα των z. Η κατάσταση περιγράφεται στο σχήμα 2.25. Κατά την ελαστική ανάκλαση του σωματίου απλά vr → −vr , ενώ η vθ μένει η ίδια. Η ταχύτητα του σωματιδίου πριν την κρούση είναι ⃗v = vx x̂ + vy ŷ = vr r̂ + vθ θ̂ (2.26) ενώ μετά ⃗v ′ = vx′ x̂ + vy′ ŷ = −vr r̂ + vθ θ̂ (2.27) Από τις σχέσεις r̂ = cos θx̂ + sin θŷ θ̂ = − sin θx̂ + cos θŷ , (2.28) 136 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ και τις σχέσεις vr = ⃗v · r̂, vθ = ⃗v · θ̂, παίρνουμε vr = vx cos θ + vy sin θ vθ = −vx sin θ + vy cos θ . (2.29) Αντιστρέφοντάς τις παίρνουμε vx = vr cos θ − vθ sin θ vy = vr sin θ + vθ cos θ . (2.30) Με το μετασχηματισμό vr → −vr η νέα ταχύτητα σε καρτεσιανές συ- ντεταγμένες θα είναι vx′ = −vr cos θ − vθ sin θ vy′ = −vr sin θ + vθ cos θ . (2.31) Ο μετασχηματισμός vx → vx′ , vy → vy′ θα υλοποιηθεί σε μια υπορου- v ^ y^ θ vθ ^r vr v’ ^x (x,y) R − vr θ (xc,yc) Σχήμα 2.25: Ελαστική ανάκλαση υλικού σημείου που πέφτει στο εσωτερικό κύκλου ακτίνας R = |R| ⃗ και κέντρου ⃗rc = xc x̂ + yc ŷ στο σημείο ⃗r = xx̂ + y ŷ. Έχουμε R ⃗ = (x − xc )x̂ + (y − yc )ŷ. Η ταχύτητα αρχικά είναι ⃗v = vr r̂ + vθ θ̂ όπου r̂ ≡ R/R. ⃗ Μετά την ′ ανάκλαση vr → −vr και η νέα ταχύτητα του υλικού σημείου είναι ⃗v = −vr r̂ + vθ θ̂ τίνα reflectVonCircle(vx,vy,x,y,xc,yc,R). Στην είσοδο της δίνουμε την αρχική ταχύτητα (vx,vy), το σημείο κρούσης (x,y), το κέντρο του 2.4. ΕΦΑΡΜΟΓΕΣ 137 κύκλου (xc,yc) και την ακτίνα του κύκλου²⁷ R. Στην έξοδο, τα (vx,vy) έχουν αντικατασταθεί με τις νέες τιμές²⁸ (vx′ , vy′ ). Το πρόγραμμα που προκύπτει θα το βρείτε στο αρχείο Cylinder3D.f90: ! ============================================================ ! F i l e Cylinder3D . f90 ! Motion o f a f r e e p a r t i c l e i n a c y l i n d e r with a x i s t h e z−a x i s , ! r a d i u s R and 0<z<L ! Use i n t e g r a t i o n with time s t e p dt : x = x + vx * dt ! y = y + vy * dt ! z = z + vz * dt ! Use s u b r o u t i n e r e f l e c t V o n C i r c l e f o r c o l i s i o n s a t r=R !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− program Cylinder3D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables real (8) : : x0 , y0 , z0 , v0x , v0y , v0z , t0 , tf , dt , t , x , y , z , vx , vy , vz real (8) : : L , R , R2 , vxy , rxy , r2xy , xc , yc integer : : i , nr , nz !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter R , L : ’ read * , R , L p r i n t * , ’ # R= ’ , R , ’ L= ’ , L i f ( R . le . 0 . 0 ) s t o p ’R must be p o s i t i v e . ’ i f ( L . le . 0 . 0 ) s t o p ’L must be p o s i t i v e . ’ p r i n t * , ’ # Enter x0 , y0 , z0 , v0x , v0y , v0z : ’ read * , x0 , y0 , z0 , v0x , v0y , v0z rxy = DSQRT ( x0 * x0+y0 * y0 ) p r i n t * , ’ # x0 = ’ , x0 , ’ y0 = ’ , y0 , ’ z0= ’ , z0 , ’ rxy= ’ , rxy p r i n t * , ’ # v0x= ’ , v0x , ’ v0y= ’ , v0y , ’ v0z= ’ , v0z i f ( rxy . gt . R ) s t o p ’ i l l e g a l v a l u e o f rxy > R ’ i f ( z0 . lt . 0.0 D0 ) s t o p ’ i l l e g a l v a l u e o f z0 < 0 ’ i f ( z0 . gt . L ) s t o p ’ i l l e g a l v a l u e o f z0 > L ’ i f ( v0x **2+ v0y **2+ v0z * * 2 . eq . 0 . 0 ) s t o p ’ i l l e g a l v a l u e o f v0 = 0 . ’ p r i n t * , ’ # Enter t0 , t f , dt : ’ read * , t0 , tf , dt p r i n t * , ’ # t 0= ’ , t0 , ’ t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize i = 0 nr = 0 ; nz = 0 ²⁷Προφανώς ιδανικά θα ισχύει R2 = (x − xc )2 + (y − yc )2 αλλά επειδή υπάρχει συστηματικό σφάλμα στη θέση της κρούσης, επιλέγουμε το R να δίνεται. ²⁸Επίσης, το υλικό σημείο, όπως θα δούμε, τοποθετείται ακριβώς πάνω στον κύκλο. 138 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ t = t0 x = x0 ; y = y0 ; z = z0 vx = v0x ; vy = v0y ; vz = v0z R2 = R * R xc = 0.0 D0 ! c e n t e r o f c i r c l e which i s t h e p r o j e c t i o n o f t h e yc = 0.0 D0 ! c y l i n d e r on t h e xy plane open ( u n i t =11 , f i l e = ’ Cylinder3D . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . le . tf ) w r i t e ( 1 1 , 1 0 0 ) t , x , y , z , vx , vy , vz i = i + 1 t = t0 + i * dt x = x + vx * dt y = y + vy * dt z = z + vz * dt i f ( z . lt . 0.0 . or . z . gt . L ) then vz = −vz ! r e f l e c t i o n on c y l i n d e r caps nz = nz + 1 endif r2xy = x * x+y * y i f ( r2xy . gt . R2 ) then c a l l reflectVonCircle ( vx , vy , x , y , xc , yc , R ) nr = nr + 1 endif enddo close (11) p r i n t * , ’ # Number o f c o l l i s i o n s : ’ p r i n t * , ’ # nr= ’ , nr , ’ nz= ’ , nz 100 FORMAT(100 G28 . 1 6 ) end program Cylinder3D !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! ============================================================ !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e reflectVonCircle ( vx , vy , x , y , xc , yc , R ) i m p l i c i t none real (8) : : vx , vy , x , y , xc , yc , R real (8) : : theta , cth , sth , vr , vth theta = atan2 ( y−yc , x−xc ) cth = c o s ( theta ) sth = s i n ( theta ) vr = vx * cth + vy * sth vth = −vx * sth + vy * cth vx = −vr * cth − vth * sth ! r e f l e c t vr −> −vr vy = −vr * sth + vth * cth 2.4. ΕΦΑΡΜΟΓΕΣ 139 x = xc + R * cth ! put x , y on t h e c i r c l e y = yc + R * sth end s u b r o u t i n e reflectVonCircle Να επισημάνουμε μόνο τις ακόλουθες λεπτομέρειες: Χρησιμοποιούμε καταρχήν τη συνάρτηση atan2 για τον προσδιορισμό της γωνίας theta. Η συνάρτηση αυτή με ορίσματα atan2(y,x) επιστρέφει τη γωνία θ = tan−1 (y/x) στο σωστό τεταρτημόριο που βρίσκεται το σημείο (x, y). Η γωνία που ζητάμε δίνεται από την εντολή atan2(y-yc,x-xc). Στη συνέ- χεια εφαρμόζουμε τις σχέσεις (2.29) και (2.31), ενώ στις τελευταίες δύο γραμμές επιβάλλουμε μετά την κρούση το υλικό σημείο να είναι πάνω στο σημείο του κύκλου (xc + R cos θ, yc + R sin θ). t= 500.000000 (x,y,z)= (2.227212,0.469828,7.088600) 10 8 z 6 4 2 0 10 5 -10 0 -5 y 0 -5 x 5 -10 10 Σχήμα 2.26: Η τροχιά του σωματιδίου που ανακλάται στο εσωτερικό κυλίνδρου με R = 10, L = 10 σύμφωνα με το πρόγραμμα Cylinder3D.f90. Έχουμε επιλέξει ⃗r0 = 1.0x̂ + 2.2ŷ + 3.1ẑ, ⃗v0 = 0.93x̂ − 0.89ŷ + 0.74ẑ, t0 = 0, tf = 500.0, δt = 0.01. Η μεταγλώττιση και το τρέξιμο γίνονται κατά τα γνωστά: > g f o r t r a n Cylinder3D . f90 −o cl > . / cl # Enter R , L : 10.0 10.0 # R= 1 0 . L= 10. 140 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ # Enter x0 , y0 , z0 , v0x , v0y , v0z : 1 . 0 2.2 3 . 1 0.93 −0.89 0 . 7 4 # x0 = 1 . y0 = 2.2 z0= 3 . 1 rxy= 2.41660919 # v0x= 0.93 v0y= −0.89 v0z= 0.74 # Enter t0 , t f , dt : 0.0 500.0 0.01 # t 0= 0. t f = 500. dt= 0.01 # Number o f c o l l i s i o n s : # nr= 33 nz= 37 Για να φτιάξουμε τις γραφικές παραστάσεις της θέσης/ταχύτητας συ- ναρτήσει του χρόνου δίνουμε τις εντολές gnuplot κατά τα γνωστά: gnuplot > file=” Cylinder3D . dat ” gnuplot > p l o t file using 1 : 2 with lines title ” x ( t ) ” ,\ file using 1 : 3 with lines title ” y ( t ) ” ,\ file using 1 : 4 with lines title ” z( t )” gnuplot > p l o t file using 1 : 5 with lines title ” v_x ( t ) ” ,\ file using 1 : 6 with lines title ” v_y ( t ) ” ,\ file using 1 : 7 with lines title ” v_z ( t ) ” Μπορούμε να δούμε √ και την απόσταση του κινητού από τον άξονα του κυλίνδρου r(t) = x(t)2 + y(t)2 ως συνάρτηση με το χρόνο με την εντολή gnuplot > p l o t file using 1 : ( s q r t ( $2 **2+ $3 * * 2 ) ) w l t ” r ( t ) ” Για να φτιάξουμε το σχήμα της τροχιάς μαζί με τον κύλινδρο δίνουμε τις εντολές gnuplot > L = 10 ; R = 10 gnuplot > s e t urange [ 0 : 2 . 0 * pi ] gnuplot > s e t vrange [ 0 : L ] gnuplot > s e t parametric gnuplot > s p l o t file using 2 : 3 : 4 with lines notitle , \ R * c o s ( u ) , R * s i n ( u ) , v notitle Με την εντολή set parametric μπορούμε να φτιάξουμε τη γραφική πα- ράσταση μιας δισδιάστατης επιφάνειας της μορφής ⃗r(u, v) = x(u, v) x̂ + y(u, v) ŷ + z(u, v) ẑ. Ο κύλινδρος (χωρίς τις βάσεις του) δίνεται από τις παραμετρικές εξισώσεις ⃗r(u, v) = R cos u x̂ + R sin u ŷ + v ẑ με u ∈ [0, 2π), v ∈ [0, L]. Για το animation της τροχιάς αντιγράψτε το αρχείο Cylinder3D_animate.gnu στον κατάλογο που κάνετε την ανάλυση και μέσα από το gnuplot δώστε τις εντολές 2.4. ΕΦΑΡΜΟΓΕΣ 141 gnuplot > R =10; L =10; t0 =0; tf =500; dt=10 gnuplot > load ” Cylinder3D_animate . gnu” βάζοντας φυσικά τις παραμέτρους που χρησιμοποιήσατε εσείς. Το απο- τέλεσμα φαίνεται στο σχήμα 2.26. Τελευταία εφαρμογή θα είναι ένα απλό πρότυπο χωροχρονικής σκου- λικότρυπας (spacetime wormhole). Η χωροχρονική σκουλικότρυπα είναι η απλή χωροχρονική γεωμετρία που συνδέει δύο απομακρυσμένες πε- ριοχές του χώρου οι οποίες είναι ασυμπτωτικά επίπεδες (δηλ. σε αρ- κετά μεγάλη απόσταση από τα στόμια της σκουλικότρυπας, ο χώρος είναι σχεδόν επίπεδος). Μια τέτοια γεωμετρία φαίνεται στο σχήμα 2.27. Η απόσταση που διανύει κάποιος περνώντας από τα στόμια της τρύ- πας, μπορεί να είναι πολύ μικρότερη από την απόσταση των στομίων που διανύει κανείς εκτός της σκουλικότρυπας οπότε, θεωρητικά του- λάχιστον, μπορούν να χρησιμοποιηθούν για διαστρικά / διαγαλαξιακά ταξίδια. Ή, όπως φαίνεται και στο σχήμα, να επικοινωνήσουν περιοχές του χώρου που θα ήταν διαφορετικά ασύνδετες μεταξύ τους. Να ση- μειώσουμε πάντως, ότι παρόλο που τέτοιες γεωμετρίες έχουν εξάψει την φαντασία των φυσικών, αλλά και των συγγραφέων επιστημονικής φαντασίας, η υλοποίηση τους στα πλαίσια της τρέχουσας θεωρίας για τη βαρύτητα, τη Γενική Θεωρία της Σχετικότητας, δεν είναι δυνατή. Για την κατασκευή τους, η εξίσωση του Einstein απαιτεί εξωτικού τύπου ύλη με αρνητική πυκνότητα ενέργειας η οποία δεν έχει παρατηρηθεί στη φύση. Τέτοιες εξωτικές γεωμετρίες είναι δυνατόν να παρουσιάζονται σε μικροσκοπικό επίπεδο ως κβαντικές διακυμάνσεις της γεωμετρίας²⁹. Στην εφαρμογή αυτή θα μελετήσουμε μια πολύ απλή τέτοια γεω- μετρία στο επίπεδο, καθώς και την ελεύθερη κίνηση σωματιδίου μέσα σε αυτή³⁰. Παίρνουμε το επίπεδο και αφαιρούμε δύο δίσκους ακτίνας R που τα κέντρα τους απέχουν απόσταση d όπως φαίνεται στο σχήμα 2.28. Ταυτοποιούμε τα σημεία των κύκλων έτσι ώστε το σημείο 1 στον αριστερό κύκλο να ταυτίζεται με το σημείο 1 στο δεξιό, το σημείο 2 με το σημείο 2 κ.ο.κ. Οι δύο κύκλοι δίνονται από τις παραμετρικές εξισώ- σεις x(θ) = d/2 + R cos θ, y(θ) = R sin θ, −π < θ ≤ π για το δεξί κύκλο και x(θ) = −d/2 − R cos θ, y(θ) = R sin θ, −π < θ ≤ π για τον αριστερό. Τα σημεία με το ίδιο θ στους δύο κύκλους ταυτίζονται. Ένα σωμάτιο ²⁹Διαβάστε το ενδιαφέρον βιβλίο του K.S. Thorne “Black Holes and Time Wraps: Eistein’s Outrageous Legacy”, W.W. Norton, New York και κοιτάξτε τι είναι ο χωρο- χρονικός αφρός (spacetime foam) του A. Wheeler. ³⁰Η ιδέα αυτή είναι άσκηση στο βιβλίο του J. B. Hartle, “Gravity: An Introduction to Einstein’s General Relativity”, Addison Wesley 2003, Κεφ. 7, Ασκ. 25. 142 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ Σχήμα 2.27: Η χωρική γεωμετρία της σκουλικότρυπας. Δύο ασυμπτωτικά επίπεδα μέρη του χώρου συνδέονται με ένα “λαιμό” ό οποίος μπορεί να κανονιστεί να είναι μικρού μήκους. που βυθίζεται στο αριστερό στόμιο της σκουλικότρυπας με ταχύτητα ⃗v αναδύεται άμεσα από το δεξί με ταχύτητα ⃗v ′ όπως φαίνεται στο σχήμα 2.28. Οι στόχοι μας είναι: 1. Να γράψουμε ένα πρόγραμμα που να υπολογίζει την τροχιά σω- ματιδίου που κινείται στη γεωμετρία του σχήματος 2.28. Τα όρια της κίνησης είναι −L/2 ≤ x ≤ L/2 και −L/2 ≤ y ≤ L/2. Όταν το σωμάτιο βγει εκτός των παραπάνω ορίων θα πάρουμε περιοδικές συνοριακές συνθήκες, δηλ. θα ταυτίσουμε τα σημεία του ευθύ- γραμμου τμήματος x = −L/2 με αυτά του x = +L/2 καθώς και αυτά του ευθύγραμμου τμήματος y = −L/2 με αυτά του y = +L/2. Ο χρήστης θα παρέχει τις παραμέτρους R, d και L καθώς και τις αρχικές συνθήκες (x0 , y0 ), (v0 , ϕ) όπου ⃗v0 = v0 (cos ϕx̂ + sin ϕŷ). Θα δίνει επίσης τις χρονικές παραμέτρους tf και dt για κίνηση στο χρόνο στο διάστημα t ∈ [t0 = 0, tf ] με βήμα dt. 2. Στη γεωμετρία με L = 20, d = 5, R = 1, να σχεδιάσουμε την τροχιά του σωματιδίου με (x0 , y0 ) = (0, −1), (v0 , ϕ) = (1, 10o ) με tf = 40, dt = 0.05. 3. Να βρούμε τροχιά που να είναι κλειστή χωρίς να περνάει από 2.4. ΕΦΑΡΜΟΓΕΣ 143 y v’ 4 4 θ θ v 3 1 1 3 x 2 2 Σχήμα 2.28: Απλό πρότυπο της χωρικής γεωμετρίας της σκουλικότρυπας που δείχνε- ται στο σχήμα 2.27. Το σωματίδιο κινείται σε όλο το επίπεδό εκτός από τους δίσκους που έχουμε αφαιρέσει. Ο λαιμός της σκουλικότρυπας προτυποποιείται από τους δύο κύκλους x(θ) = ±d/2 ± R cos θ, y(θ) = R sin θ, −π < θ ≤ π και έχει μηδενικό μήκος έχοντας ταυτίσει τα σημεία του χείλους της σκουλικότρυπας. Η ταυτοποίηση γίνεται με συγκεκριμένη φορά ταυτίζοντας τα σημεία με το ίδιο θ, έτσι ώστε λ.χ. τα σημεία 1, 2, 3, και 4 να ταυτίζονται (μπορείτε να φανταστείτε τι γίνεται αν διπλώσετε το χαρτί κατά μήκος του άξονα των y και κολλήσετε τους δύο κύκλους μαζί). Το βύθισμα ενός σωματιδίου μέσα στη σκουλικότρυπα και η ανάδυση από το άλλο χείλος γίνεται όπως φαίνεται για το διάνυσμα ⃗v → ⃗v ′ . 144 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ τα άκρα |x| = L/2, |y| = L/2 και να εξετάσουμε αν αυτή είναι ευσταθής ως προς μικρές αλλαγές των αρχικών συνθηκών. 4. Να βρούμε άλλες κλειστές τροχιές που να περνάνε μέσα από τα χείλη της σκουλικότρυπας και να εξετάσουμε αν είναι ευσταθείς ως προς μικρές αλλαγές των αρχικών συνθηκών. 5. Να προσθέσουμε στο πρόγραμμα τη δυνατότητα να υπολογίζει την απόσταση που διάνυσε το σωματίδιο. Ένα σωμάτιο ξεκινάει από τη θέση (−x0 , 0) και κινείται προς την +x διεύθυνση μέχρι τη θέση (x0 , 0) με x0 > R + d/2. Εσείς σχεδιάστε στο χαρτί την τροχιά που ακολουθεί και υπολογίστε την απόσταση που διάνυσε. Στη συνέχεια, επιβεβαιώστε τους υπολογισμούς σας με το πρόγραμμα. 6. Σαν άσκηση στο τέλος, να μεταβάλετε το πρόγραμμά έτσι ώστε στα άκρα |x| = L/2, |y| = L/2 το σωμάτιο να ανακλάται ελαστικά. Επανασχεδιάστε τις τροχιές που μελετήσαμε παραπάνω. Ορίζουμε το δεξί κύκλο c1 από την παραμετρική σχέση d x(θ) = + R cos θ , y(θ) = R sin θ , −π < θ ≤ π , (2.32) 2 και τον αριστερό κύκλο c2 από την παραμετρική σχέση d x(θ) = − − R cos θ , y(θ) = R sin θ , −π < θ ≤ π . (2.33) 2 Σε κάθε χρονική στιγμή, προωθούμε το σωματίδιο σύμφωνα με τις σχέσεις ti = idt xi = xi−1 + vx dt yi = yi−1 + vy dt (2.34) για i = 1, 2, . . . με δεδομένα (x0 , y0 ), t0 = 0 και όσο ti ≤ tf . Αν το σημείο (xi , yi ) είναι εκτός των ορίων |x| = L/2, |y| = L/2, το επαναφέρουμε με τις σχέσεις xi → xi ± L, yi → yi ± L ανάλογα με την περίπτωση. Τα σημεία με το ίδιο θ στους δύο κύκλους ταυτίζονται, είναι δηλ. τα ίδια σημεία του χώρου. Αν το σημείο (xi , yi ) περάσει μέσα από τον κύκλο c1 ή c2 , “βγάζουμε” το σωμάτιο έξω από τον άλλο κύκλο. 2.4. ΕΦΑΡΜΟΓΕΣ 145 y v’ ^ ^ e e’θ θ ^ er ^ e’r (x’,y’) v (x,y) θ θ x Σχήμα 2.29: Το σωματίδιο περνάει μέσα στο δεξί κύκλο c1 με ταχύτητα ⃗v και αναδύ- εται από τον c2 με ταχύτητα ⃗v ′ . Τα ακτινικά / γωνιακά μοναδιαία διανύσματα (êr , êθ ), (ê′r , ê′θ ) ταυτίζονται από την παραμετρική ταυτοποίηση των δύο κύκλων c1 και c2 . Το πέρασμα μέσα στον κύκλο c1 το επισημαίνει η σχέση ( )2 d xi − + yi2 ≤ R2 . (2.35) 2 Στην περίπτωση αυτή, υπολογίζουμε τη γωνία θ από τη σχέση ( ) y θ = tan−1 i , (2.36) xi − d2 και το σημείο (xi , yi ) απεικονίζεται στο σημείο (x′i , yi′ ) όπου d x′i = − − R cos θ , yi′ = yi , (2.37) 2 όπως φαίνεται στο σχήμα 2.29. Για την απεικόνιση της ταχύτητας ⃗v → ⃗v ′ υπολογίζουμε πρώτα τα διανύσματα } { ′ êr = cos θ x̂ + sin θ ŷ êr = − cos θ x̂ + sin θ ŷ → , (2.38) êθ = − sin θ x̂ + cos θ ŷ ê′θ = sin θ x̂ + cos θ ŷ έτσι ώστε η ταχύτητα ⃗v = vr êr + vθ êθ → ⃗v ′ = −vr ê′r + vθ ê′θ , (2.39) 146 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ όπου οι ακτινικές συνιστώσες vr = ⃗v · êr και vθ = ⃗v · êθ . Έτσι, οι τελικές σχέσεις που μας δίνουν την ταχύτητα “ανάδυσης” ⃗v ′ είναι οι: vr = vx cos θ + vy sin θ vθ = −vx sin θ + vy cos θ . (2.40) vx′ = vr cos θ + vθ sin θ ′ vy = −vr sin θ + vθ cos θ Ανάλογα εργαζόμαστε και για το πέρασμα μέσα στον κύκλο c2 το οποίο τώρα επισημαίνει η σχέση ( )2 d xi + + yi2 ≤ R2 . (2.41) 2 Στην περίπτωση αυτή υπολογίζουμε τη γωνία θ από τη σχέση ( ) y θ = π − tan−1 i , (2.42) xi + d2 και το σημείο (xi , yi ) απεικονίζεται στο σημείο (x′i , yi′ ) όπου d x′i = + R cos θ , yi′ = yi . (2.43) 2 Για την απεικόνιση της ταχύτητας ⃗v → ⃗v ′ υπολογίζουμε τα διανύσματα } { êr = − cos θ x̂ + sin θ ŷ ê′r = cos θ x̂ + sin θ ŷ → ′ , (2.44) êθ = sin θ x̂ + cos θ ŷ êθ = − sin θ x̂ + cos θ ŷ έτσι ώστε η ταχύτητα ⃗v = vr êr + vθ êθ → ⃗v ′ = −vr ê′r + vθ ê′θ . (2.45) Τώρα οι τελικές σχέσεις που μας δίνουν την ταχύτητα “ανάδυσης” ⃗v ′ είναι οι: vr = −vx cos θ + vy sin θ vθ = vx sin θ + vy cos θ . (2.46) vx′ = −vr cos θ − vθ sin θ vy′ = −vr sin θ + vθ cos θ Τα συστηματικά σφάλματα προέρχονται μόνο από τα περάσματα μέσα στη σκουλικότρυπα. Δεν υπάρχουν συστηματικά σφάλματα στο πέρασμα των ορίων |x| = L/2, |y| = L/2 (γιατί;). Σκεφτείτε τρόπους να τα αντιμετωπίσετε στο πρόγραμμά σας, καθώς και να τα μελετήσετε. 2.4. ΕΦΑΡΜΟΓΕΣ 147 Οι κλειστές τροχιές που ζητούνται προκύπτουν, λ.χ., από τις αρχικές συνθήκες (x0 , y0 , v0 , ϕ) = (0, 0, 1, 0) (2.47) που ενώνει τα σημεία 1 του σχήματος 2.28. Είναι ασταθής, και αυτό μπορείτε να το δείτε παίρνοντας ϕ → ϕ + ϵ. Οι κλειστές τροχιές που περνούν τη σκουλικότρυπα, αλλά “περιτυ- λίγονται” προκύπτουν λ.χ. από τις αρχικές συνθήκες (x0 , y0 , v0 , ϕ) = (−9, 0, 1, 0) (x0 , y0 , v0 , ϕ) = (2.5, −3, 1, 90o ) που περνούν από 3 → 3 και 2 → 2 → 4 → 4 αντίστοιχα. Είναι επίσης ασταθείς όπως εύκολα μπορεί να μελετηθεί με το πρόγραμμα που θα γράψετε. Το πρόγραμμα αυτό παρατίθεται παρακάτω για πληρότητα: ! ============================================================ program WormHole2D i m p l i c i t none !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Declaration of variables r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 r e a l ( 8 ) : : Lx , Ly , L , R , d r e a l ( 8 ) : : x0 , y0 , v0 , theta r e a l ( 8 ) : : t0 , tf , dt r e a l ( 8 ) : : t , x , y , vx , vy r e a l ( 8 ) : : xc1 , yc1 , xc2 , yc2 , r1 , r2 integer : : i !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Ask u s e r f o r i n p u t : p r i n t * , ’ # Enter L , d , R : ’ read * , L , d , R p r i n t * , ’ # L= ’ , L , ’ d= ’ , d , ’ R= ’ , R i f ( L . le . d +2.0 D0 * R ) s t o p ’L <= d+2*R ’ i f ( d . le . 2.0 D0 * R ) s t o p ’d <= 2*R ’ p r i n t * , ’ # Enter ( x0 , y0 ) , v0 , t h e t a ( d e g r e e s ) : ’ read * , x0 , y0 , v0 , theta p r i n t * , ’ # x0= ’ , x0 , ’ y0 = ’ , y0 p r i n t * , ’ # v0= ’ , v0 , ’ t h e t a = ’ , theta , ’ d e g r e e s ’ i f ( v0 . le . 0.0 D0 ) s t o p ’ i l l e g a l v a l u e o f v0 . ’ p r i n t * , ’ # Enter t f , dt : ’ read * , tf , dt p r i n t * , ’ # t f = ’ , tf , ’ dt= ’ , dt !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Initialize theta = ( PI / 1 8 0 . 0 D0 ) * theta 148 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ i = 0 t = 0.0 D0 x = x0 ; y = y0 vx = v0 * c o s ( theta ) ; vy = v0 * s i n ( theta ) p r i n t * , ’ # x0= ’ , x , ’ y0= ’ , y , ’ v0x= ’ , vx , ’ v0y= ’ , vy ! Wormhole ’ s c e n t e r s : xc1 = 0.5 D0 * d ; yc1 = 0.0 D0 xc2 = −0.5D0 * d ; yc2 = 0.0 D0 ! Box l i m i t s c o o r d i n a t e s : Lx = 0.5 D0 * L ; Ly = 0.5 D0 * L ! Test i f already inside cut region : r1 = sqrt ( ( x−xc1 ) * * 2 + ( y−yc1 ) * * 2 ) r2 = sqrt ( ( x−xc2 ) * * 2 + ( y−yc2 ) * * 2 ) i f ( r1 . le . R ) s t o p ’ r 1 <= R ’ i f ( r2 . le . R ) s t o p ’ r2 <= R ’ ! T e s t i f o u t s i d e box l i m i t s : i f (ABS( x ) . ge . Lx ) s t o p ’ | x | >= Lx ’ i f (ABS( y ) . ge . Ly ) s t o p ’ | y | >= Ly ’ open ( u n i t =11 , f i l e = ’Wormhole . dat ’ ) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! Compute : do while ( t . lt . tf ) w r i t e ( 1 1 , * ) t , x , y , vx , vy i = i+1 t = i * dt x = x + vx * dt ; y = y + vy * dt ! T o r o i d a l boundary c o n d i t i o n s : i f ( x . gt . Lx ) x = x − L i f ( x . lt . −Lx ) x = x + L i f ( y . gt . Ly ) y = y − L i f ( y . lt . −Ly ) y = y + L ! Test i f i n s i d e the cut disks r1 = sqrt ( ( x−xc1 ) * * 2 + ( y−yc1 ) * * 2 ) r2 = sqrt ( ( x−xc2 ) * * 2 + ( y−yc2 ) * * 2 ) i f ( r1 . lt . R ) then ! N o t i c e : we pass r 1 as r a d i u s o f c i r c l e , not R c a l l crossC1 ( x , y , vx , vy , dt , r1 , d ) e l s e i f ( r2 . lt . R ) then c a l l crossC2 ( x , y , vx , vy , dt , r2 , d ) endif ! s m a l l chance here t h a t s t i l l i n C1 or C2 , but OK s i n c e ! another dt−advance giv e n a t t h e beginning o f do−loop enddo ! do while ( t . l t . t f ) end program WormHole2D ! ======================================================= s u b r o u t i n e crossC1 ( x , y , vx , vy , dt , R , d ) i m p l i c i t none r e a l ( 8 ) : : x , y , vx , vy , dt , R , d r e a l ( 8 ) : : vr , v0 ! v0 −> v t h e t a 2.4. ΕΦΑΡΜΟΓΕΣ 149 r e a l ( 8 ) : : theta , xc , yc p r i n t * , ’ # I n s i d e C1 : ( x , y , vx , vy , R)= ’ , x , y , vx , vy , R xc = 0.5 D0 * d ! c e n t e r o f C1 yc = 0.0 D0 theta = atan2 ( y−yc , x−xc ) x = −xc − R * c o s ( theta ) ! new x−value , y i n v a r i a n t ! Velocity transformation : vr = vx * c o s ( theta )+vy * s i n ( theta ) v0 = −vx * s i n ( theta )+vy * c o s ( theta ) vx = vr * c o s ( theta )+v0 * s i n ( theta ) vy = −vr * s i n ( theta )+v0 * c o s ( theta ) ! advance x , y , h o p e f u l l y o u t s i d e C2 : x = x + vx * dt y = y + vy * dt print * , ’# Exit C2 : ( x , y , vx , vy )= ’ , x , y , vx , vy end s u b r o u t i n e crossC1 ! ======================================================= s u b r o u t i n e crossC2 ( x , y , vx , vy , dt , R , d ) i m p l i c i t none r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 r e a l ( 8 ) : : x , y , vx , vy , dt , R , d r e a l ( 8 ) : : vr , v0 ! v0 −> v t h e t a r e a l ( 8 ) : : theta , xc , yc p r i n t * , ’ # I n s i d e C2 : ( x , y , vx , vy , R)= ’ , x , y , vx , vy , R xc = −0.5D0 * d ! c e n t e r o f C2 yc = 0.0 D0 theta = PI−atan2 ( y−yc , x−xc ) x = −xc + R * c o s ( theta ) ! new x−value , y i n v a r i a n t ! Velocity transformation : vr = −vx * c o s ( theta )+vy * s i n ( theta ) v0 = vx * s i n ( theta )+vy * c o s ( theta ) vx = −vr * c o s ( theta )−v0 * s i n ( theta ) vy = −vr * s i n ( theta )+v0 * c o s ( theta ) ! advance x , y , h o p e f u l l y o u t s i d e C1 : x = x + vx * dt y = y + vy * dt print * , ’# Exit C1 : ( x , y , vx , vy )= ’ , x , y , vx , vy end s u b r o u t i n e crossC2 To πρόγραμμα μεταγλωττίζεται και τρέχει κατά τα γνωστά. Στο συνοδευτικό λογισμικό θα βρείτε τα αρχεία Wormhole.csh και Wormhole_animate.gnu που μπορούν να σας βοηθήσουν στην απεικόνιση της τροχιάς. Ξεκινήστε το gnuplot, θέστε τις επιθυμητές παραμέτρους στο Wormhole.csh και δώστε τις εντολές gnuplot > file = ”Wormhole . dat ” 150 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ gnuplot > R =1; d =5; L=20; gnuplot > ! . / Wormhole . csh gnuplot > t0 =0; dt = 0 . 2 ; load ” Wormhole_animate . gnu” Μπορείτε τώρα να απαντήσετε και τις υπόλοιπες ερωτήσεις που θέσαμε παραπάνω στους στόχους μας... 2.5. ΑΣΚΗΣΕΙΣ 151 2.5 Ασκήσεις 2.1 Στο πρόγραμμα Circle.f90 δώστε τις εντολές που απαιτούνται, ώστε το πρόγραμμα να τυπώνει τον αριθμό των πλήρων κύκλων που διέγραψε το κινητό. 2.2 Στο πρόγραμμα Circle.f90 προσθέστε όλα τα αναγκαία τεστ στις παραμέτρους που εισάγει ο χρήστης, έτσι ώστε το πρόγραμμα να είναι εγγυημένο ότι θα τρέξει ομαλά. Κάνετε το ίδιο και στα άλλα προγράμματα που δίνονται στο κεφάλαιο αυτό. 2.3 Υλικό σημείο κινείται πάνω σε κύκλο με κέντρο την αρχή των αξό- νων με σταθερή γωνιακή ταχύτητα ω. Τη χρονική στιγμή t0 = 0 το σωμάτιο βρίσκεται στο σημείο (x0 , y0 ). Γράψτε το πρόγραμμα CircularMotion.f90 που να απεικονίζει την τροχιά. O χρήστης θα δίνει στην είσοδο τα ω, x0 , y0 , t0 , tf , δt. Στην έξοδο θα παίρνει τα δεδομένα σύμφωνα με το πρόγραμμα Circle.f90. 2.4 Μετατρέψτε το πρόγραμμα SimplePendulum.f90, έτσι ώστε ο χρή- στης να μπορεί να δίνει και μη μηδενική ταχύτητα ως αρχική συν- θήκη. 2.5 Μελετήστε το όριο k → 0 στο πρόβλημα της βολής που δίνεται από τις Σχέσεις (2.10). Αναπτύξτε το e−kt = 1 − kt + 2!1 (kt)2 + . . . και κρατήστε τους όρους που δε μηδενίζονται στο όριο k → 0. Στη συνέχεια, κρατήστε τους όρους με την αμέσως μικρότερη δύ- ναμη του k. Προγραμματίστε τις εξισώσεις αυτές σε ένα αρχείο ProjectileSmallAirResistance.f90. Θεωρήστε τις αρχικές συν- θήκες ⃗v0 = x̂ + ŷ και υπολογίστε αριθμητικά το βεληνεκές της τρο- χιάς με τα δύο προγράμματα ProjectileSmallAirResistance.f90, ProjectileAirResistance.f90. Προσδιορίστε τις τιμές του k για τις οποίες τα αποτελέσματά σας συμφωνούν με ακρίβεια καλύτερη από 5%. 2.6 Προγραμματίστε την κίνηση της βολής, όταν η δύναμη της αντίστα- σης του αέρα έχει μέτρο ανάλογο του τετραγώνου της ταχύτητας. Συγκρίνετε το βεληνεκές της τροχιάς που προκύπτει με αυτό που υπολογίζεται από το πρόγραμμα ProjectileAirResistance.f90 για τις παραμέτρους του σχήματος 2.10. 2.7 Κάνετε τις απαραίτητες μετατροπές στο πρόγραμμα Lissajous.f90, ώστε ο χρήστης να μπορεί να δίνει διαφορετικό πλάτος και αρχική 152 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ φάση στην κίνηση που γίνεται στη διεύθυνση του άξονα των y. Με- λετήστε τις τροχιές όταν το πλάτος είναι ίσο και η διαφορά φάσης είναι π/4, π/2, π, −π και το ίδιο όταν το πλάτος στη διεύθυνση του άξονα των y είναι διπλάσιο. 2.8 Κάνετε τις απαραίτητες μετατροπές στο πρόγραμμα ProjectileAirResistance.f90, ώστε να μπορεί να συμπεριλάβει και τη μελέτη της περίπτωσης k = 0. 2.9 Κάνετε τις απαραίτητες μετατροπές στο πρόγραμμα ProjectileAirResistance.f90, ώστε να υπολογίστε την κίνηση του υλικού σημείου στο χώρο. Κάνετε τα διαγράμματα της θέσης/τα- χύτητας συναρτήσει του χρόνου και της τρισδιάστατης τροχιάς με την εντολή splot στο gnuplot. Χρησιμοποιήστε το πρόγραμμα animate3D.gnu για να κάνετε animation της τροχιάς. 2.10 Κάνετε τις απαραίτητες μετατροπές στο πρόγραμμα ChargeInB.f90, ώστε να υπολογίζει τον αριθμό των πλήρων στροφών που έχει κά- νει η προβολή της τροχιάς του φορτίου στο επίπεδο x − y. 2.11 Μεταβάλετε το πρόγραμμα box1D_1.f90, έτσι ώστε να τυπώνει στο stdout τον αριθμό των κρούσεων του υλικού σημείου στο αρι- στερό τοίχωμα, στο δεξί και το συνολικό. 2.12 Επαναλάβετε το ίδιο για το πρόγραμμα box1D_2.f90. Συμπληρώ- στε σε δύο στήλες στον πίνακα της Σελ. 124 το συνολικό αριθμό των κρούσεων που προκύπτουν και σχολιάστε. 2.13 Στο πρόγραμμα box1D_1.f90 επιλέξτε L= 10, v0=1. Ελαττώστε το dt μέχρι το υλικό σημείο να σταματήσει να κινείται. Για ποια τιμή του dt συμβαίνει αυτό; Αυξήστε το v0=10,100. Μέχρι ποια τιμή του dt μπορείτε να φτάσετε τώρα; Γιατί; 2.14 Στο πρόγραμμα box1D_1.f90 αλλάξτε τις δηλώσεις REAL→REAL(8) και στις σταθερές προσθέστε τον εκθέτη D0 (λ.χ. 0.0→0.0D0). Με- λετήστε τη διαφορά στα αποτελέσματα που πήρατε στην ανάλυση της παραγράφου 2.3.2. Επαναλάβετε την άσκηση 2.13. Τι παρα- τηρείτε; 2.15 Μεταβάλετε το πρόγραμμα box1D_1.f90, ώστε να μελετήσετε την περίπτωση που το κινητό συγκρούεται μη ελαστικά με τα τοιχώ- ματα του κουτιού, έτσι ώστε v ′ = −ev, 0 < e ≤ 1. 2.5. ΑΣΚΗΣΕΙΣ 153 2.16 Μεταβάλετε το πρόγραμμα box2D_1.f90, ώστε να μελετήσετε την περίπτωση που το κινητό συγκρούεται μη ελαστικά με τα τοιχώ- ματα του κουτιού, έτσι ώστε vx′ = −evx , vy′ = −evy , 0 < e ≤ 1. 2.17 Χρησιμοποιείστε τη μέθοδο υπολογισμού του χρόνου που βρίσκε- ται στα προγράμματα box1D_4.f90 και box1D_5.f90 και αναπα- ράγετε τα αποτελέσματα του σχήματος 2.21. 2.18 Κινητό πέφτει ελεύθερα στην κατακόρυφη διεύθυνση ξεκινώντας από ηρεμία από ύψος h. Στο δάπεδο υφίσταται μη ελαστική κρούση, έτσι ώστε μετά την κρούση vy′ = −evy με 0 < e ≤ 1 παράμε- τρος. Μελετήστε γράφοντας κατάλληλο πρόγραμμα την κίνηση για e = 0.1, 0.5, 0.9, 1.0. 2.19 Γενικεύστε το προηγούμενο πρόγραμμα για ⃗v0 = v0x x̂. Κάνετε το animation της τροχιάς. 2.20 Μελετήστε την κίνηση υλικού σημείου στο κουτί του σχήματος 2.30. Μετρήστε σε κάθε βολή πόσες κρούσεις παίρνετε μέχρι το υλικό σημείο να βγει από το κουτί. Lx a Ly Σχήμα 2.30: Άσκηση 2.20. 2.21 Μελετήστε την κίνηση υλικού σημείου στο “μπιλιάρδο” του σχή- ματος 2.31. Μετρήστε σε κάθε βολή πόσες κρούσεις έχετε μέχρι να πετύχετε μία “τρύπα”. Το πρόγραμμα να σημειώνει σε ποια τρύπα μπήκε η μπίλια. 2.22 Προγραμματίστε την κίνηση ενός υλικού σημείου μέσα στο επίπεδο κουτί του σχήματος 2.32. Στο κέντρο του υπάρχει κύκλος πάνω στον οποίο το υλικό σημείο σκεδάζεται ελαστικά (Υποδ.: Χρησι- μοποιείστε την υπορουτίνα reflectVonCircle του προγράμματος Cylinder3D.f90). 154 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ a a a a Ly a a a a Lx Σχήμα 2.31: Άσκηση 2.21. Ly 2R Lx Σχήμα 2.32: Άσκηση 2.22. 2.23 Τοποθετήστε στο κουτί της προηγούμενης άσκησης 4 κύκλους πάνω στους οποίους θα ανακλάται το υλικό σημείο (σχήμα 2.33). 2.24 Θεωρήστε τη διάταξη του σχήματος 2.34. Κάθε φορά που το υλικό σημείο σκεδάζεται σε ένα κύκλο, ο κύκλος “εξαφανίζεται”. Η κί- νηση σταματάει, όταν όλοι οι κύκλοι εξαφανιστούν. Κάθε φορά που το υλικό σημείο χτυπάει τον αριστερό τοίχο, χάνετε ένα πό- ντο. Προσπαθήστε να διαλέξτε τροχιές που ελαχιστοποιούν τους χαμένους πόντους. 2.5. ΑΣΚΗΣΕΙΣ 155 2R 000 111 111 000 000 111 000 111 000 111 000 111 111 000 000 111 111 000 Ly 000 111 000 111 2R 000 111 000 111 000 111 000 111 2R 2R 000 111 111 000 000 111 000 111 000 111 2a Lx Σχήμα 2.33: Άσκηση 2.23. 111 000 000 111 000 111 000 111 000 111 111 000 000 111 000 111 000 111 000 111 Ly 000 111 000 111 111 000 000 111 111 000 000 111 000 111 000 111 000 111 000 111 111 000 000 111 111 000 000 000 111 111 000 111 000 111 000 111 000 111 000 111 000 111 000 111 111 000 111 000 000 111 Lx Σχήμα 2.34: Άσκηση 2.24. 156 ΚΕΦΑΛΑΙΟ 2. ΠΕΡΙΓΡΑΦΗ ΤΗΣ ΚΙΝΗΣΗΣ ΚΕΦΑΛΑΙΟ 3 Η Λογιστική Απεικόνιση Οι μη γραμμικές διαφορικές εξισώσεις περιγράφουν ενδιαφέροντα δυ- ναμικά συστήματα στη φυσική, τη βιολογία και τις οικονομικές επιστή- μες. Στο κεφάλαιο αυτό μελετάμε αριθμητικά τη διακριτή λογιστική απεικόνιση ως “ένα απλό μαθηματικό πρότυπο με πολύπλοκες δυνα- μικές ιδιότητες” [20] οι οποίες συναντώνται σε πολλά από τα προα- ναφερόμενα συστήματα. Η εξίσωση αυτή παρουσιάζει χαοτική συμπε- ριφορά για κάποιες τιμές της δυναμικής παραμέτρου της και έτσι θα μας δοθεί η ευκαιρία να αγγίξουμε αυτό το πολύ ενδιαφέρον θέμα με σημαντικές επιπτώσεις στα φυσικά φαινόμενα. Το φαινόμενο αυτό πε- ριορίζει σημαντικά τις δυνατότητες μας για χρήσιμες προβλέψεις στη χρονική εξέλιξη ενός, κατά τ’ άλλα, ντετερμινιστικού δυναμικού συστή- ματος: τα αποτελέσματα μετρήσεων με διαφορετικές αρχικές συνθήκες ακολουθούν κατανομή που δεν μπορεί να διαχωριστεί από αυτή μιας δειγματοληπτικής συνάρτησης μιας τυχαίας διεργασίας. Το πεδίο αυτό της μελέτης μη γραμμικών δυναμικών συστημάτων είναι τεράστιο και παραπέμπουμε τον αναγνώστη στη βιβλιογραφία για μια πληρέστερη μελέτη [20, 21, 22, 23, 24, 25, 26, 37]. 3.1 Εισαγωγή Η πιο γνωστή εφαρμογή της διακριτής λογιστικής εξίσωσης προέρχεται από τη μελέτη βιολογικών πληθυσμών οι οποίοι αναπαράγονται ανά τακτά χρονικά διαστήματα. Τα απλά πρότυπα προϋποθέτουν οι γενεές να μην επικαλύπτονται. Το πιο απλό (και αφελές) πρότυπο είναι αυτό που κάνει την εύ- λογη υπόθεση ότι ο ρυθμός αύξησης dP (t)/dt ενός πληθυσμού P (t) είναι 157 158 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ ανάλογος του ήδη υπάρχοντος πληθυσμού: dP (t) = kP (t) . (3.1) dt Η γενική λύση της παραπάνω εξίσωσης είναι P (t) = P (0)ekt και υπο- δηλώνει εκθετική αύξηση του πληθυσμού για k > 0 και μείωση για k < 0. Προφανώς αυτό το μοντέλο μπορεί να ισχύει όσο ο πληθυσμός είναι πολύ μικρός και μπορεί να αγνοηθεί η αλληλεπίδραση με το περι- βάλλον (επάρκεια τροφής, ασθένειες, θηρευτές κλπ), αλλά είναι φανερό ότι δεν μπορεί να ισχύει για αρκετά μεγάλους χρόνους. Ο πιο απλός τρόπος για να λάβουμε υπόψη τους παράγοντες αλληλεπίδρασης του πληθυσμού με το περιβάλλον είναι να εισάγουμε έναν μη γραμμικό όρο στην εξίσωση, έτσι ώστε dP (t) = kP (t)(1 − bP (t)) . (3.2) dt Η παράμετρος k δίνει το μέγιστο ρυθμό ανάπτυξης του πληθυσμού, ενώ το b ελέγχει τη δυνατότητα του είδους να συντηρήσει ένα συγκεκριμένο επίπεδο πληθυσμού. Η εξίσωση (3.1) μπορεί να διακριτοποιηθεί στο χρόνο υποθέτοντας ότι κάθε γενεά αναπαράγεται, κάθε δt και η n- οστή γενιά έχει πληθυσμό Pn = P (tn ) όπου tn = t0 + (n − 1)δt. Τότε P (tn+1 ) ≈ P (tn ) + δtP ′ (tn ) και η εξίσωση (3.1) γίνεται Pn+1 = rPn , (3.3) όπου r = 1 + kδt. Οι λύσεις της παραπάνω εξίσωσης θα πρέπει να προσεγγίζουν τις Pn ∼ P0 ektn ∝ e(r−1)n και έχουμε εκθετική αύξηση πληθυσμού, όταν r > 1 και μείωση, όταν r < 1. Η εξίσωση (3.2) μπορεί τότε να διακριτοποιηθεί ως εξής: Pn+1 = Pn (r − bPn ) . (3.4) Με τον ορισμό xn = (b/r)Pn παίρνουμε τη λογιστική απεικόνιση xn+1 = rxn (1 − xn ) . (3.5) Ορίζουμε τις συναρτήσεις f (x) = rx(1 − x), F (x, r) = rx(1 − x) (3.6) (η μόνη διαφορά τους είναι ότι στην πρώτη το r θεωρείται δεδομένη παράμετρος), έτσι ώστε xn+1 = f (xn ) = f (2) (xn−1 ) = . . . = f (n) (x1 ) = f (n+1) (x0 ) , (3.7) 3.1. ΕΙΣΑΓΩΓΗ 159 όπου χρησιμοποιήσαμε το συμβολισμό f (1) (x) = f (x), f (2) (x) = f (f (x)), f (3) (x) = f (f (f (x))), . . . για τη σύνθεση συναρτήσεων. Η παράγωγος της συνάρτησης f θα μας χρησιμεύσει αρκετά στα παρακάτω: ∂F (x, r) f ′ (x) = = r(1 − 2x) . (3.8) ∂x Επειδή ερμηνεύουμε την ποσότητα xn ως ποσοστό επί του μέγιστου δυνατού πληθυσμού, θα πρέπει 0 ≤ xn ≤ 1 για κάθε¹ n. Η συνάρτηση f (x) παρουσιάζει μέγιστο για x = 1/2 το οποίο είναι ίσο με f (1/2) = r/4. Άρα, αν r > 4, τότε f (1/2) > 1 το οποίο με κατάλληλη επιλογή του x0 θα οδηγήσει σε xn+1 = f (xn ) > 1 για κάποιο n. Οπότε το ενδιαφέρον εύρος των δυνατών τιμών της παραμέτρου r είναι 0 < r ≤ 4. (3.9) Η λογιστική απεικόνιση (3.5) μπορεί να θεωρηθεί σαν εξίσωση πε- περασμένων διαφορών, αλλά η τελική της έκφραση είναι μια επαγωγική σχέση ενός βήματος. Έτσι, δεδομένης μιας αρχικής τιμής x0 , μέσω αυ- τής παράγεται μια ακολουθία τιμών {x0 , x1 , . . . , xn , . . . } στην οποία θα αναφερόμαστε² ως την τροχιά του x0 . Στις επόμενες παραγράφους του κεφαλαίου αυτού, θα επικεντρωθούμε στη μελέτη των ιδιοτήτων των τροχιών αυτών ως συνάρτηση της παραμέτρου r. Οι λύσεις της λογιστικής απεικόνισης δεν είναι γνωστές παρά μόνο για r = 2 και r = 4. Για r = 2 έχουμε 1( ) xn = 1 − (1 − x0 )2n , (3.10) 2 ενώ³ για r = 4 1 √ xn = sin2 (2n πθ) , θ= sin−1 x0 . (3.11) π Για r = 2, limn→∞ xn = 1/2, ενώ για r = 4 έχουμε περιoδικές τροχιές για x0 που δίνουν ρητό θ και μη περιοδικές, όταν δίνουν άρρητο θ. Για τις υπόλοιπες τιμές του r θα εργαστούμε αριθμητικά για να μελετήσουμε τις ιδιότητες των τροχιών της λογιστικής εξίσωσης. ¹Παρατηρήστε ότι αν xn > 1, τότε xn+1 < 0, οπότε αν θέλουμε xn ≥ 0 για κάθε n, τότε θα πρέπει xn ≤ 1 για κάθε n. ²Στη μαθηματική βιβλιογραφία αναφέρεται και ως “splinter of x0 ” (splinter=ομάδα που δημιουργείται από το διαχωρισμό μιας μεγαλύτερης ομάδας). ³E. Schröder, “Über iterierte Funktionen”, Math. Ann. 3 (1870) 296; E. Lorenz, “The problem of deducing the climate from the governing equations”, Tellus 16 (1964) 1 160 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ 3.2 Σταθερά Σημεία και 2n Κύκλοι Είναι φανερό ότι αν το σημείο x∗ είναι μία λύση της εξίσωσης x = f (x), τότε xn = x∗ ⇒ xn+k = x∗ για κάθε k ≥ 0. Για τη συγκεκριμένη συνάρτηση f (x) = rx(1 − x) έχουμε δύο λύσεις x∗1 = 0 και x∗2 = 1 − 1/r . (3.12) Θα δούμε ότι τα σημεία αυτά είναι ελκυστές των τροχιών για κατάλλη- λες τιμές του r. Αυτό σημαίνει ότι για ένα εύρος τιμών της αρχικής τιμής 0 ≤ x0 ≤ 1, η ακολουθία {xn } πλησιάζει ασυμπτωτικά κάποιο από αυτά τα σημεία καθώς n → ∞. Προφανώς τα (μέτρου μηδέν) σύνολα αρχικών τιμών {x0 } = {x∗1 } και {x0 } = {x∗2 } δίνουν τροχιές που ελκύονται από τα x∗1 και x∗2 αντίστοιχα. Για να δούμε ποιες από τις δύο τιμές “προτι- μούν” οι αρχικές συνθήκες στο διάστημα (0, 1), αρκεί να μελετήσουμε την ευστάθεια των δύο σταθερών σημείων x∗1 και x∗2 . Ας υποθέσουμε ότι για κάποιο n η τιμή xn είναι απειροστά κοντά στο σταθερό σημείο x∗ , έτσι ώστε xn = x∗ + ϵn xn+1 = x∗ + ϵn+1 . (3.13) Τότε, επειδή xn+1 = f (xn ) = f (x∗ + ϵn ) ≈ f (x∗ ) + ϵn f ′ (x∗ ) = x∗ + ϵn f ′ (x∗ ) , (3.14) όπου χρησιμοποιήσαμε το ανάπτυγμα κατά Taylor της f (x∗ + ϵn ) γύρω από το x∗ , καθώς και τη σχέση x∗ = f (x∗ ), έχουμε ότι ϵn+1 = ϵn f ′ (x∗ ). Οπότε ισχύει ότι ϵn+1 = |f ′ (x∗ )| . (3.15) ϵn Άρα, αν |f ′ (x∗ )| < 1, τότε limn→∞ ϵn = 0 και το σταθερό σημείο x∗ είναι ευσταθές: η ακολουθία {xn+k } πλησιάζει ασυμπτωτικά κοντά στο x∗ . Αν |f ′ (x∗ )| > 1, τότε η ακολουθία {xn+k } απομακρύνεται από το x∗ και το σταθερό σημείο είναι ασταθές. Η περίπτωση |f ′ (x∗ )| = 1 είναι οριακή και καταδεικνύει αλλαγή συμπεριφοράς. Πρέπει να μελετηθεί κατά περίπτωση και συνδέεται με την εμφάνιση σημείων διακλάδωσης που θα συζητήσουμε παρακάτω. Για την ειδική περίπτωση της f (x) = rx(1 − x) με f ′ (x) = r(1 − 2x) έχουμε ότι f ′ (0) = r και f ′ (1 − 1/r) = 2 − r. Άρα, όταν r < 1, το σημείο x∗1 = 0 είναι ελκυστής, ενώ το x∗2 = 1 − 1/r < 0 και δεν εμφανίζεται. Όταν r > 1, το x∗1 = 0 δίνει |f ′ (x∗1 )| = r > 1, οπότε το x∗1 είναι 3.2. ΣΤΑΘΕΡΑ ΣΗΜΕΙΑ ΚΑΙ 2N ΚΥΚΛΟΙ 161 ασταθές. Οποιαδήποτε αρχική συνθήκη x0 κοντά στο x∗1 απομακρύνεται από αυτό. Επειδή για 1 < r < 3 έχουμε 0 ≤ |f ′ (x∗2 )| = |2 − r| < 1, το x∗2 είναι ελκυστής. Οποιαδήποτε αρχική συνθήκη x0 ∈ (0, 1) πλησιάζει ασυμπτωτικά κοντά στην τιμή x∗2 = 1−1/r. Όταν r = rc = 1, έχουμε την (1) οριακή κατάσταση x∗1 = x∗2 = 0 και λέμε ότι στην κρίσιμη τιμή rc = 1 το (1) κρίσιμο σημείο x∗1 διακλαδώνεται (bifurcates) στα δύο σταθερά σημεία x∗1 και x∗2 . Οι διακλαδώσεις αυτές συνεχίζονται, καθώς το r αυξάνει. Πράγματι, όταν r = rc = 3, έχουμε f ′ (x∗2 ) = 2−r = −1 και για r > rc το x∗2 γίνεται (2) (2) ασταθές σταθερό σημείο. Θεωρήστε τη λύση της εξίσωσης x = f (2) (x). Αν 0 < x∗ < 1 είναι μία λύση της και για κάποιο n έχουμε xn = x∗ , τότε xn+2 = xn+4 = . . . = xn+2k = . . . = x∗ , καθώς και xn+1 = xn+3 = . . . = xn+2k+1 = . . . = f (x∗ ) (άρα και το f (x∗ ) είναι λύση της ίδιας εξίσωσης). Αν 0 < x∗3 < x∗4 < 1 είναι δύο τέτοιες διαφορετικές λύσεις με x∗3 = f (x∗4 ), x∗4 = f (x∗3 ), τότε το σύστημα εκτελεί μια περιοδική τροχιά με περίοδο 2. Τα x∗3 , x∗4 είναι τέτοια, ώστε να είναι πραγματικές λύσεις της εξίσωσης f (2) (x) = r2 x(1 − x)(1 − rx(1 − x)) = x , (3.16) ενώ ταυτόχρονα θα πρέπει να μην είναι οι λύσεις x∗1 x∗2 της εξίσωσης x = f (x). Επειδή τα σημεία x∗1 = 0 x∗2 = 1 − 1/r είναι λύσεις⁴ και της x = f (2) (x), το παραπάνω πολυώνυμο μπορεί να γραφτεί στη μορφή (δείτε [21] για περισσότερες λεπτομέρειες) ( ( )) 1 x x− 1− (Ax2 + Bx + C) = 0 , (3.17) r οπότε αναπτύσσοντας τα πολυώνυμα (3.16), (3.17) και συγκρίνοντας τους συντελεστές τους συμπεραίνουμε ότι A = −r3 , B = r2 (r + 1) και C = −r(r + 1). Οι ρίζες του διωνύμου στην (3.17) καθορίζονται από τη διακρίνουσα ∆ = r2 (r+1)(r−3). Για τις τιμές του r που μας ενδιαφέρουν (2) (1 < r ≤ 4) η διακρίνουσα γίνεται θετική, όταν r > rc = 3 και τότε έχουμε δύο διακριτές λύσεις √ x∗α = ((r + 1) ∓ r2 − 2r − 3)/(2r) α = 3, 4 . (3.18) (2) Όταν r = rc έχουμε μια διπλή ρίζα, άρα ένα μοναδικό σταθερό σημείο όπως είδαμε και παραπάνω. Για τη μελέτη της ευστάθειας των λύσεων της x = f (2) (x) ακο- λουθούμε την ίδια πορεία που μας οδήγησε στην εξίσωση (3.15) και ⁴Επειδή αν x∗ = f (x∗ ) ⇒ f (2) (x∗ ) = f (f (x∗ )) = f (x∗ ) = x∗ κ.ο.κ., το σημείο x∗ είναι και λύση της x∗ = f (n) (x∗ ). 162 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ εξετάζουμε αν η f (2)′ (x) έχει απόλυτη τιμή μικρότερη, μεγαλύτερη ή ίση της μονάδας. Παρατηρώντας ότι⁵ f (2)′ (x3 ) = f (2)′ (x4 ) = f ′ (x3 )f ′ (x4 ) = −r2 + 2r + 4, βλέπουμε ότι για r = rc = 3, f (2)′ (x∗3 ) = f (2)′ (x24 ) = 1 και (2) (3) √ για r = rc = 1 +√ 6 ≈ 3.4495, f (2)′ (x3 ) = f (2)′ (x4 ) = −1. Στις ενδιάμεσες τιμές 3 < r < 1+ 6 οι παράγωγοι |f (2)′ (x∗α )| < 1 για α = 3, 4. Άρα τα ση- μεία αυτά είναι ευσταθείς λύσεις της x = f (2) (x) και έχουμε διακλάδωση των σταθερών σημείων x∗1 , x∗2 στα x∗α , α = 1, 2, 3, 4 για r = rc = 3. Σχε- (2) δόν όλες οι τροχιές με αρχικές συνθήκες στο διάστημα [0, 1] ελκύονται ασυμπτωτικά από την περιοδική τροχιά με περίοδο 2, τον “2-κύκλο” {x∗3 , x∗4 }. (3) Με √ τον ίδιο τρόπο μπορούμε να βρούμε πως στο ∗σημείο r = rc = 1 + 6 έχουμε διακλάδωση των σταθερών σημείων xα , α = 1, 2, 3, 4 σε οκτώ σημεία x∗α , α = 1, . . . , 8. Αυτά είναι πραγματικές λύσεις της εξί- (3) σωσης του 4-κύκλου της λογιστικής εξίσωσης x = f (4) (x). Για rc < r < rc ≈ 3.5441 τα τελευταία σημεία x∗α , α = 5, . . . , 8 αποτελούν ελκυστή (4) που είναι ένας 4-κύκλος μιας γενικής τροχιάς της λογιστικής εξίσωσης⁶. (4) (5) Παρόμοια για rc < r < rc έχουμε διακλάδωση σε 16 σταθερά ση- (5) (6) μεία της x = f (8) (x) που οδηγούν σε 8-κύκλο και για rc < r < rc σε 16-κύκλο κ.ο.κ⁷. Το φαινόμενο αυτό λέγεται διπλασιασμός περιόδου (n) και συνεχίζει επ’ άπειρον. Τα σημεία rc πλησιάζουν διαρκώς μεταξύ (n) τους έτσι, ώστε limn→∞ rc = rc ≈ 3.56994567. Όπως θα δούμε, η τιμή rc σηματοδοτεί την έναρξη μη περιοδικής, χαοτικής συμπεριφοράς των τροχιών της λογιστικής απεικόνισης. Οι αλγεβρικοί υπολογισμοί των σημείων διακλάδωσης είναι πολύ- πλοκοι και έτσι αναγκαζόμαστε να καταφύγουμε σε αριθμητικές με- θόδους υπολογισμού τους. Αρχικά θα γράψουμε ένα πρόγραμμα που να μας δίνει τροχιές της λογιστικής απεικόνισης για επιλεγμένες τιμές του r και x0 . Το πρόγραμμα θα το βρείτε στο αρχείο logistic.f90 και παρατίθεται παρακάτω. ! =========================================================== ! D i s c r e t e L o g i s t i c Map ⁵Από τον κανόνα της αλυσίδας dh(g(x))/dx = h′ (g(x))g ′ (x) έχουμε ότι f (2)′ (x∗3 ) = df (f (x∗3 ))/dx = f ′ (f (x∗3 ))f ′ (x∗3 ) = f ′ (x∗4 )f ′ (x∗3 ) και ανάλογα για την f (2)′ (x∗4 ). Γε- νικεύοντας μπορούμε να αποδείξουμε ότι για τις n λύσεις x∗n+1 , x∗n+2 , . . . , x∗2n που ανήκουν στον n-κύκλο της εξίσωσης x = f (n) (x) έχουμε ότι f (n)′ (xn+i ) = f ′ (xn+1 ) f ′ (xn+2 ) . . . f ′ (x2n ) για κάθε i = 1, . . . , n. ⁶Τα x∗α , α = 1, . . . , 4 είναι ασταθή σταθερά σημεία και 2-κύκλος. (n) (n+1) ⁷Γενικά, για rc < r < rc < rc ≈ 3.56994567 έχουμε 2n σταθερά σημεία της n−1 εξίσωσης x = f (2 ) (x) και εμφάνιση 2n−1 -κύκλων που είναι ελκυστές. 3.2. ΣΤΑΘΕΡΑ ΣΗΜΕΙΑ ΚΑΙ 2N ΚΥΚΛΟΙ 163 0.9 0.14 0.8 0.12 0.7 0.1 0.6 0.08 0.5 0.06 0.4 0.04 r= 0.5 0.3 r= 0.99 0.02 r= 1/0.9 0.2 r= 1/0.88 r= 1/0.86 0 0.1 0 20 40 60 80 100 120 140 160 180 200 0 10 20 30 40 50 Σχήμα 3.1: Στο αριστερό σχήμα φαίνονται τροχιές της λογιστικής εξίσωσης για x0 = 0.1. Διακρίνεται η πρώτη διακλάδωση για rc = 1 από το x∗1 = 0 στο x∗2 = 1 − 1/r. Στο (1) (2) (3) δεξί σχήμα χρησιμοποιούμε r = 3.5, τέτοιο ώστε rc < r < rc . Οι τρεις καμπύλες είναι για τρία διαφορετικά αρχικά σημεία. Το σύστημα, μετά από μια μεταβατική φάση που εξαρτάται από το αρχικό σημείο, ακολουθεί τροχιά που √ είναι 2-κύκλος. Οι οριζόντιες γραμμές είναι οι αναμενόμενες τιμές x∗3,4 = ((r + 1) ∓ r2 − 2r − 3)/(2r) που αναφέρονται στο κείμενο. ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 ! −−−−− Input : p r i n t * , ’ # Enter NSTEPS , r , x0 : ’ read * , NSTEPS , r , x0 p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ l o g . dat ’ ) w r i t e ( 3 3 , * ) 0 , x0 ! −−−−− C a l c u l a t e : do i =1 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) w r i t e ( 3 3 , * ) i , x1 x0 = x1 enddo c l o s e (33) end program logistic_map Το πρόγραμμα μεταγλωττίζεται και τρέχει κατά τα γνωστά: > g f o r t r a n logistic . f90 −o l 164 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ > echo ” 100 0.5 0 . 1 ” | ./l όπου με την εντολή echo εκτυπώνουμε στο stdout τις τιμές των παρα- μέτρων NSTEPS=100, r=0.5 και x0=0.1, και τις διοχετεύουμε μέσω pipe στο stdin του προγράμματος που τρέχει με την εντολή ./l. Τα αποτε- λέσματα θα τα βρούμε σε δύο στήλες στο αρχείο log.dat και μπορούμε να τα δούμε με το gnuplot. Με τον τρόπο αυτό φτιάχνουμε τα σχήματα 3.1. Σε αυτά μπορούμε να δούμε τις δύο πρώτες διακλαδώσεις, καθώς (1) (2) αυξάνεται το r και ξεπερνάει τις τιμές rc και rc . Με τον ίδιο τρόπο μπορούμε να μελετήσουμε τροχιές που βρίσκονται ασυμπτωτικά κοντά (n−1) σε 2n -κύκλους κάθε φορά που το r ξεπερνάει την τιμή rc . 0.7 0.8 0.6 0.7 0.5 0.6 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0 0 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 Σχήμα 3.2: Επίπεδη απεικόνιση των τροχιών της λογιστικής εξίσωσης (cobweb plot) για r = 2.8 και 3.3. Στο αριστερό σχήμα βλέπουμε παράδειγμα σταθερού σημείου x∗ = f (x∗ ). Απεικονίζεται η συνάρτηση f (x) (πράσινη καμπύλη), η συνάρτηση f (2) (x) (μπλε καμπύλη), καθώς και η διαγώνιος. Η τροχιά καταλήγει στη μοναδική μη μηδενική τομή των καμπύλων της διαγωνίου και της f (x), το σταθερό σημείο x∗2 = 1 − 1/r. Η τροχιά τέμνει την f (2) (x) στο ίδιο σημείο. Δεν υπάρχουν άλλα σημεία τομής της f (2) (x) με τη διαγώνιο. Δεξιά έχουμε παράδειγμα 2-κύκλου. Η f (2) (x) τέμνει τη διαγώνιο και σε δύο διαφορετικά σημεία που είναι τα x∗3 και x∗4 . Διακρίνουμε το 2-κύκλο στον οποίο καταλήγει ασυμπτωτικά η τροχιά που είναι το ορθογώνιο (x∗3 , x∗3 ), (x∗4 , x∗3 ), (x∗4 , x∗4 ), (x∗3 , x∗4 ). Ένας άλλος τρόπος να μελετήσουμε και να καταλάβουμε γραφικά τους 2n -κύκλους είναι το διάγραμμα που κατασκευάζεται με τον ακό- λουθο τρόπο (cobweb plot): Στο επίπεδο επιλέγουμε αρχικά το σημείο (x0 , 0). Στη συνέχεια, υπολογίζουμε το σημείο (x0 , x1 ), όπου x1 = f (x0 ) και το οποίο είναι πάνω στην καμπύλη της γραφικής παράστασης της f (x). Το (x0 , x1 ) το “προβάλλουμε” πάνω στη διαγώνιο y = x παίρνο- ντας το σημείο (x1 , x1 ). Επαναλαμβάνουμε αυτή τη διαδικασία παίρνο- ντας τα σημεία (xn , xn+1 ) και (xn+1 , xn+1 ) πάνω στην καμπύλη y = f (x) και y = x αντίστοιχα. Tα σταθερά σημεία x∗ = f (x∗ ) είναι η τομή των 3.2. ΣΤΑΘΕΡΑ ΣΗΜΕΙΑ ΚΑΙ 2N ΚΥΚΛΟΙ 165 0.9 0.8 0.8 0.7 0.7 0.6 0.6 0.5 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0 0 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 Σχήμα 3.3: Αριστερά βλέπουμε τον 4-κύκλο τον οποίο πλησιάζει ασυμπτωτικά η τρο- χιά για r = 3.5. Η μπλε καμπύλη είναι τώρα η συνάρτηση f (4) (x) η οποία τέμνει τη διαγώνιο σε τέσσερα σημεία xα , α = 5, 6, 7, 8 και ο 4-κύκλος περνάει από τα σημεία αυτά. Τέλος, δεξιά παρατηρούμε μια μη περιοδική τροχιά που προκύπτει για r = 3.7, όταν το σύστημα παρουσιάζει χαοτική συμπεριφορά. καμπύλων αυτών και αν η τροχιά ελκύεται από αυτά, τότε η ακολουθία των παραπάνω σημείων θα συγκλίνει σε αυτά. Αν είμαστε σε 2n -κύκλο, τότε θα παρατηρήσουμε την περιοδική τροχιά που περνά από τα σημεία n που είναι λύσεις της x = f (2 ) (x). Για να υλοποιήσουμε την παραπάνω άσκηση, γράφουμε το ακόλουθο πρόγραμμα το οποίο θα βρείτε στο αρχείο logistic1.f90: ! =========================================================== ! D i s c r e t e L o g i s t i c Map ! Map t h e t r a j e c t o r y i n 2d space ( plane ) ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 ! −−−−− Input : p r i n t * , ’ # Enter NSTEPS , r , x0 : ’ read * , NSTEPS , r , x0 p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ t r j . dat ’ ) ! −−−−− C a l c u l a t e : w r i t e ( 3 3 , * ) 0 , x0 , 0 do i =1 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) w r i t e ( 3 3 , * ) 2* i−3,x0 , x1 166 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ w r i t e ( 3 3 , * ) 2* i−2,x1 , x1 x0 = x1 enddo c l o s e (3 3) end program logistic_map Η μεταγλώττιση και το τρέξιμο γίνεται ακριβώς όπως και για το πρό- γραμμα logistic.f90. Τα αποτελέσματα μπορούμε να τα δούμε με το gnuplot. Για παράδειγμα, η πάνω αριστερά γραφική παράσταση στο σχήμα 3.2 μπορεί να γίνει με τις εντολές: gnuplot > s e t s i z e square gnuplot > f ( x ) = r * x *(1.0 − x ) gnuplot > r = 3.3 gnuplot > p l o t ”<echo 50 3.3 0 . 2 | . / l ; c a t t r j . dat ” using 2:3 w l gnuplot > replot f(x) ,f(f(x) ) ,x Με την εντολή plot τρέχουμε το πρόγραμμα όπως από τη γραμμή εντο- λών και στη συνέχεια κάνουμε τη γραφική παράσταση από το αρχείο trj.dat. Στην επόμενη γραμμή προσθέτουμε τις γραφικές παραστά- σεις της f (x), f (2) (x) = f (f (x)) και της διαγωνίου y = x. Στα σχήματα 3.2 και 3.3 βλέπουμε παραδείγματα από ελκυστές σταθερών σημείων, 2-κύκλων και 4-κύκλων. Επίσης, δίνεται και το παράδειγμα μιας μη περιοδικής τροχιάς που παρουσιάζεται, όταν το σύστημα παρουσιάζει χαοτική συμπεριφορά για r > rc ≈ 3.56994567. 3.3 Διάγραμμα διακλάδωσης Οι διακλαδώσεις της λογιστικής εξίσωσης μπορούν να απεικονιστούν γραφικά στο “διάγραμμα διακλάδωσης”. Θυμίζουμε ότι οι πρώτες δια- κλαδώσεις συμβαίνουν για κρίσιμες τιμές του r rc(1) < rc(2) < rc(3) < . . . < rc(n) < . . . < rc , (3.19) (1) (2) (3) √ (n) όπου rc = 1, rc = 3, rc = 1 + 6 και rc = limn→∞ rc ≈ 3.56994567. έχουμε 2n σταθερά σημεία x∗α , α = 1, 2, ..., 2n (n) (n+1) Για rc < r < rc της x = f (2 ) (x). Απεικονίζοντας αυτά τα σημεία x∗α (r) ως συνάρτηση n του r φτιάχνουμε το διάγραμμα διακλάδωσης. Αυτά θα τα υπολογί- σουμε αριθμητικά με το πρόγραμμα bifurcate.f90. Στο πρόγραμμα αυτό επιλέγουμε τις τιμές του r που θέλουμε να μελετήσουμε και για κάθε μία από αυτές καταγράφουμε τα σημεία των 2n−1 -κύκλων⁸ x∗α (r), ⁸Για να είμαστε ακριβείς, με τον τρόπο αυτό δεν φτιάχνουμε το διάγραμμα διακλά- δωσης (bifurcation diagram) το οποίο έχει και τα ασταθή σημεία, αλλά το διάγραμμα 3.3. ΔΙΑΓΡΑΜΜΑ ΔΙΑΚΛΑΔΩΣΗΣ 167 α = 2n−1 + 1, 2n−1 + 2, . . . , 2n . Αυτό μπορεί να γίνει εύκολα αν εφαρ- μόσουμε επαγωγικά τη λογιστική εξίσωση αρκετές φορές, έτσι ώστε οι τροχιές να φτάσουν να εκτελούν πρακτικά μόνο τους 2n−1 -κύκλους. Στο πρόγραμμα, η παράμετρος που καθορίζει τα σημεία της τροχιάς που “πετάμε” είναι η NTRANS. Μετά καταγράφουμε NSTEPS σημεία της τρο- χιάς τα οποία υποθέτουμε ότι το NTRANS είναι αρκετά μεγάλο, έτσι ώστε να καταγράψουμε μόνο τα σημεία των 2n−1 -κύκλων. Το πρόγραμμα δί- νεται παρακάτω: ! =========================================================== ! B i f u r c a t i o n Diagram o f t h e L o g i s t i c Map ! =========================================================== program bifurcation_diagram i m p l i c i t none r e a l ( 8 ) , parameter : : rmin = 2.5 D0 r e a l ( 8 ) , parameter : : rmax = 4.0 D0 i n t e g e r , parameter : : NTRANS = 500 ! Number o f d i s c a r t e d s t e p s i n t e g e r , parameter : : NSTEPS = 100 ! Number o f recorded s t e p s i n t e g e r , parameter : : RSTEPS = 2000 ! Number o f v a l u e s o f r integer :: i real (8) : : r , dr , x0 , x1 ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ b i f . dat ’ ) dr = ( rmax−rmin ) / RSTEPS ! Increment i n r ! −−−−− C a l c u l a t e : r = rmin do while ( r . le . rmax ) x0 = 0.5 D0 ! −−−− T r a n s i e n t s t e p s : s k i p do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo do i =1 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) w r i t e ( 3 3 , * ) r , x1 x0 = x1 enddo r = r + dr enddo ! do while c l o s e (33) end program bifurcation_diagram Το πρόγραμμα μεταγλωττίζεται και τρέχει πολύ απλά με τις εντολές τροχιών (orbit diagram). Για απλότητα χρησιμοποιούμε το ίδιο όνομα. 168 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ 1 0.52 0.9 0.8 0.515 0.7 0.51 0.6 0.505 0.5 0.5 0.4 0.495 0.3 0.49 0.2 0.485 0.1 0 0.48 2.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 3.6295 3.63 3.6305 3.631 3.6315 3.632 3.6325 3.633 3.6335 3.634 Σχήμα 3.4: Αριστερά δείχνεται το διάγραμμα διακλάδωσης όπως προκύπτει από το πρόγραμμα bifurcate.f90 για 2.5 < r < 4. Παρατηρούμε τις πρώτες διακλαδώσεις οι οποίες ακολουθούνται από διαδοχικές περιοχές χαοτικών, μη περιοδικών, τροχιών με “διαλείμματα” περιοδικών τροχιών. Οι χαοτικές τροχιές παίρνουν τιμές σε υποδιαστή- ματα του διαστήματος (0, 1) μέχρι για√r = 4 όπου παίρνουν τιμές μέσα σε ολόκληρο το διάστημα. Παρατηρούμε για r = 1+ 8 ≈ 3.8284 τον 3-κύκλο ο οποίος στη συνέχεια διακλαδώνεται σε 3 · 2n -κύκλους. Δεξιά μεγεθύνουμε το διάγραμμα σε μια περιοχή τιμών του r που καταδεικνύει την αυτομοιότητα (self-similarity) του διαγράμματος σε όλες τις κλίμακες. > g f o r t r a n bifurcate . f90 −o b > ./ b; και μπορούμε να κατασκευάσουμε το αριστερό σχήμα 3.4 με το gnuplot gnuplot > p l o t ” b i f . dat ” with dots Παρατηρούμε τα ευσταθή σταθερά σημεία και τους 2n -κύκλους για r < rc . Μόλις το r ξεπεράσει την τιμή rc , οι τροχιές είναι μη-περιοδικές και το σύστημα παρουσιάζει χαοτική συμπεριφορά. Θα συζητήσουμε την έννοια της χαοτικής συμπεριφοράς με περισσότερη λεπτομέρεια σε επόμενη παράγραφο. Για την ώρα, απλά επισημαίνουμε ότι από το διά- γραμμα μπορούμε να μετρήσουμε την απόσταση μεταξύ των κρίσιμων (n+1) (n) σημείων ∆r(n) = rc − rc η οποία διαρκώς μειώνεται σχεδόν γεωμε- τρικά με το n, έτσι ώστε ∆r(n) = δ ≈ 4.669 201 609 , lim (3.20) n→∞ ∆r (n+1) όπου δ είναι η σταθερά του Feigenbaum. Επίσης, παρατηρείται ότι τα πλάτη των διακλαδώσεων ∆wn επίσης μειώνονται, έτσι ώστε ∆wn lim = α ≈ 2.502 907 875 . (3.21) n→∞ ∆wn+1 3.3. ΔΙΑΓΡΑΜΜΑ ΔΙΑΚΛΑΔΩΣΗΣ 169 Είναι ενδιαφέρον, επίσης √ να επισημάνουμε την εμφάνιση σταθερού 3- κύκλου για r = 1 + 8 ≈ 3.8284 > rc ! Χρησιμοποιώντας το θεώρημα Sharkovskii, οι Li and Yorke⁹ δείξανε πως οποιοδήποτε μονοδιάστατο σύστημα έχει 3-κύκλους, τότε θα έχει και κύκλους οποιουδήποτε μήκους και χαοτικές τροχιές. Ο 3-κύκλος και η ευστάθειά του μπορεί να υπολο- γιστεί μελετώντας τις λύσεις της εξίσωσης x = f (3) (x) όπως κάναμε με τις σχέσεις (3.16) και (3.17) (δείτε [21] για λεπτομέρειες). Μεγεθύνουμε ένα κλάδο αυτού του 3-κύκλου στο σχήμα 3.5. Κύκλους όμοιους με τον 3-κύκλο μπορούμε να δούμε να επαναλαμβάνονται σε διαφορετικές κλί- μακες όπως φαίνεται και στο δεξί σχήμα 3.4. Στο σχήμα 3.4 παρατη- 0.52 0.51 0.5 0.49 0.48 0.47 0.46 3.83 3.835 3.84 3.845 3.85 Σχήμα 3.5: Μεγέθυνση μιας από τις τρεις διακλαδώσεις του 3-κύκλου για r > 1 + √ 8. Αριστερά παρατηρούμε την προσωρινή παύση της χαοτικής συμπεριφοράς των τροχιών η οποία επανέρχεται δεξιά μετά από ένα διάλειμμα περιοδικών τροχιών. ρούμε ότι ανάμεσα στις χαοτικές τροχιές της λογιστικής εξίσωσης πα- ρουσιάζονται “παράθυρα” περιοδικών τροχιών. Αυτά είναι άπειρα στον αριθμό, αλλά αριθμήσιμα. Ακόμα πιο ενδιαφέρον είναι το γεγονός ότι, αν πάρουμε ένα κλάδο μέσα σε αυτά τα παράθυρα και τον μεγεθύνουμε, αυτός είναι όμοιος με ολόκληρο το διάγραμμα! Ένα τέτοιο παράδειγμα μπορούμε να δούμε στο δεξί σχήμα 3.4. Λέμε ότι το διάγραμμα διακλά- δωσης παρουσιάζει ιδιότητες αυτομοιότητας (self-similarity). Υπάρχουν και άλλες ενδιαφέρουσες ιδιότητες του διαγράμματος διακλάδωσης για τις οποίες παραπέμπουμε τον αναγνώστη στη βιβλιογραφία. Κλείνοντας, να σημειώσουμε ότι οι ποιοτικές ιδιότητες του διαγράμ- ματος διακλάδωσης είναι όμοιες για μια ολόκληρη κλάση από συναρ- τήσεις. Ο Feigenbaum ανακάλυψε ότι εκτός από τη λογιστική απει- κόνιση, κάθε συνάρτηση που είναι κοίλη με μοναδικό μέγιστο έχει τις ⁹T.Y. Li, J.A. Yorke, “Period Three Implies Chaos”, American Mathematical Monthly 82 (1975) 985. 170 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ ίδιες ιδιότητες, όπως για παράδειγμα οι συναρτήσεις¹⁰ g(x) = xer(1−x) , u(x) = r sin(πx) και w(x) = b − x2 . Οι σταθερές δ και α των σχέ- σεων (3.20) και (3.21) είναι οι ίδιες για όλες αυτές τις συναρτήσεις. Οι απεικονίσεις που παράγουν χαοτική συμπεριφορά μελετώνται με πολύ ενδιαφέρον και μπορείτε να βρείτε μια λίστα από αυτές στην αναφορά [27]. 3.4 Μέθοδος Newton-Raphson Για τον εντοπισμό των σημείων διακλάδωσης θα χρειαστεί να λύσουμε τις, μη γραμμικές πολυωνυμικές αλγεβρικές εξισώσεις x = f (n) (x) και f (n)′ (x) = −1. Για το λόγο αυτό πρέπει να καταφύγουμε σε προσεγγι- στικό, αριθμητικό υπολογισμό, και η απλή μέθοδος Newton-Raphson θα αποδειχθεί μια καλή επιλογή. Η μέθοδος Newton-Raphson για την εύρεση των ριζών μιας εξίσω- σης g(x) = 0 είναι μια επαγωγική μέθοδος που χρησιμοποιεί ένα αρχικό σημείο x0 και υπολογίζει με τη βοήθεια της παραγώγου g ′ (x) διαδοχικά σημεία x1 , x2 , . . . , xn , xn+1 , . . . τα οποία είναι ολοένα και καλύτερες προ- σεγγίσεις μιας από τις ρίζες της εξίσωσης. Η επαγωγή σταματάει όταν αποφασίσουμε ότι πετύχαμε το επιθυμητό επίπεδο σύγκλισης. Υποθέ- τοντας ότι η συνάρτηση g(x) είναι αναλυτική, από το ανάπτυγμά της κατά Taylor γύρω από το σημείο xn παίρνουμε g(xn+1 ) = g(xn ) + (xn+1 − xn )g ′ (x) + . . . . (3.22) Αν θέλουμε να έχουμε g(xn+1 ) ≈ 0, τότε πρέπει να πάρουμε g(xn ) xn+1 = xn − . (3.23) g ′ (xn ) Η παραπάνω εξίσωση δίνει και τον αλγόριθμο της μεθόδου ο οποίος είναι μια επαγωγική σχέση ενός βήματος. Διαφορετικά σημεία x0 θα οδηγήσουν σε διαφορετικές ρίζες της εξί- σωσης, όταν η σύγκλιση είναι επιτυχής. Η σύγκλιση της μεθόδου είναι τετραγωνική με τον αριθμό των επαναλήψεων, όταν οι παράγωγοι g ′ (x), g ′′ (x) είναι μη μηδενικές στη ρίζα και η τρίτη παράγωγος είναι φραγ- μένη: Υπάρχει μια περιοχή της ρίζας, έστω α, τέτοια ώστε η απόσταση ∆xn+1 = xn+1 − α να είναι ∆xn+1 ∝ (∆xn )2 . Αν η ρίζα α είναι πολλαπλή, ¹⁰Η συνάρτηση x exp(r(1 − x)) έχει χρησιμοποιηθεί ως μοντέλο πληθυσμών που η μεγάλη τους πυκνότητα περιορίζεται από επιδημίες. Οι πληθυσμοί είναι πάντα θετικοί ανεξάρτητα από τις (θετικές) αρχικές συνθήκες και την τιμή του r. 3.4. ΜΕΘΟΔΟΣ NEWTON-RAPHSON 171 τότε η σύγκλιση είναι πιο αργή. Οι αποδείξεις είναι απλές και μπορούν να βρεθούν στην [28]. Η μέθοδος αυτή είναι απλή στον προγραμματισμό και τις περισ- σότερες φορές αρκετή για τη λύση αρκετών προβλημάτων. Αλλά στη γενική περίπτωση δουλεύει καλά μόνο κοντά στην περιοχή των ριζών. Θα πρέπει επίσης να έχουμε στο νου μας ότι η μέθοδος αυτή αποτυγ- χάνει σε απλές περιπτώσεις: Όταν g ′ (xn ) = 0 για κάποιο n, η μέθοδος σταματάει. Σε συναρτήσεις που τείνουν στο 0 όταν x → ±∞ είναι εύ- κολο να κάνουμε κακή επιλογή του x0 που να μη συγκλίνει προς κάποια ρίζα. Για να αποφύγουμε την κακή επιλογή του x0 μπορούμε να συν- δυάσουμε τη μέθοδο Newton-Raphson με τη μέθοδο της διχοτόμησης (bisection method). Όταν η παράγωγος g ′ (x) αποκλίνει στη ρίζα, μπο- ρεί να έχουμε προβλήματα. Για παράδειγμα, η εξίσωση |x|ν = 0 με 0 < ν < 1/2 δεν δίνει συγκλίνουσα ακολουθία. Σε ορισμένες περιπτώ- σεις, η μέθοδος μπορεί να οδηγήσει και σε μη-συγκλίνοντες κύκλους [8]. Σε ποιο ομαλές συναρτήσεις η περιοχή ελκυσμού (basin of attaraction) μιας ρίζας μπορεί να είναι πάρα πολύ μικρή. Αυτές είναι οι περιοχές στον πραγματικό άξονα που αν επιλεγούν ως x0 θα οδηγήσουν στη συ- γκεκριμένη ρίζα. Δείτε την άσκηση 13. Για να προγραμματίσουμε τη μέθοδο Newton-Raphson ας πάρουμε το παράδειγμα της εξίσωσης √ ϵ tan ϵ = ρ2 − ϵ2 (3.24) η οποία προκύπτει από την επίλυση της εξίσωσης Schrödinger για την εύρεση του ενεργειακού φάσματος ενός σωματιδίου μάζας m σε ένα μο- νοδιάστατο √ πηγάδι δυναμικού √ βάθους V0 και πλάτους L. Οι σταθερές 2 2 ϵ = mL E/(2ℏ) και ρ = mL V0 /(2ℏ). Επιλύοντας ως προς ϵ δεδομέ- νου του ρ μπορούμε να υπολογίσουμε τις δυνατές τιμές της ενέργειας E. Η συνάρτηση g(x) της οποίας αναζητούμε τις ρίζες και η παράγωγός της g ′ (x) είναι √ g(x) = x tan x − ρ2 − x2 x x g ′ (x) = √ + + tan x . (3.25) ρ2 − x2 cos2 x Το πρόγραμμα το οποίο υλοποιεί τη μέθοδο για την παραπάνω συνάρ- τηση θα το βρείτε στο αρχείο nr.f90: ! =========================================================== ! Newton Raphson f o r a f u n c t i o n o f one v a r i a b l e ! =========================================================== 172 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ program NewtonRaphson i m p l i c i t none r e a l ( 8 ) , parameter : : rho = 15.0 D0 r e a l ( 8 ) , parameter : : eps = 1D−6 i n t e g e r , parameter : : NMAX = 1000 r e a l ( 8 ) : : x0 , x1 , e r r , g , gp integer : : i p r i n t * , ’ Enter x0 : ’ read * , x0 e r r = 1 . 0 D0 print * , ’ i t e r x error ’ p r i n t * , ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’ p r i n t * , 0 , x0 , e r r do i =1 , NMAX ! value of function g ( x ) : g = x0 * tan ( x0 )−sqrt ( rho * rho−x0 * x0 ) ! value of the d e r i v a t i v e g ’ ( x ) : gp = x0 / sqrt ( rho * rho−x0 * x0 )+x0 / ( c o s ( x0 ) * * 2 ) +tan ( x0 ) x1 = x0 − g / gp e r r = ABS( x1−x0 ) p r i n t * , i , x1 , e r r i f ( e r r . lt . eps ) e x i t x0 = x1 enddo end program NewtonRaphson Στο παραπάνω πρόγραμμα ζητάμε από το χρήστη μόνο το αρχικό ση- μείο x0 =x0, ενώ θέτουμε την παράμετρο ρ = rho = 15. Για να λύσουμε το πρόβλημα, βοηθάει να κάνουμε τη γραφική παράσταση της (3.24). Με το gnuplot παριστάνουμε γραφικά τα δύο μέλη της (3.24) και από τα σημεία τομής τους μπορούμε να εκτιμήσουμε πού βρίσκονται οι ρίζες που αναζητάμε έτσι ώστε να επιλέξουμε κατάλληλα αρχικά σημεία x0 : gnuplot > g1 ( x ) = x * tan ( x ) gnuplot > g2 ( x ) = s q r t ( rho * rho−x * x ) gnuplot > p l o t [ 0 : 2 0 ] [ 0 : 2 0 ] g1 ( x ) , g2 ( x ) Μπορούμε τώρα να μεταγλωττίσουμε και να τρέξουμε το πρόγραμμα: > g f o r t r a n nr . f90 −o n > echo ” 1 . 4 ” | . / n Enter x0 : iter x error −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0 1.3999999999999999 1.0000000000000000 1 1.5254292024457967 0.12542920244579681 3.4. ΜΕΘΟΔΟΣ NEWTON-RAPHSON 173 20 15 10 5 ε tanε (ρ2-ε2)1/2 0 0 5 10 15 20 ε Σχήμα 3.6: Γραφική παράσταση των συναρτήσεων που βρίσκονται στα δύο μέλη της (3.24). Οι τομές των καμπύλων δίνουν προσεγγιστικά τις λύσεις της εξίσωσης και μπορούν να χρησιμοποιηθούν ως αρχικά σημεία στη μέθοδο Newton-Raphson. 2 1.5009739120496131 2.4455290396183660E−002 3 1.4807207017202200 2.0253210329393090E−002 4 1.4731630533073483 7.5576484128716537E−003 5 1.4724779331237687 6.8512018357957949E−004 6 1.4724731072313519 4.8258924167932093E−006 7 1.4724731069952235 2.3612845012621619E−010 Συμπεραίνουμε πως μια ρίζα της εξίσωσης είναι η ϵ ≈ 1.472473107. Με ανάλογο τρόπο υπολογίζουμε και τις υπόλοιπες ρίζες, κάτι το οποίο το αφήνουμε σαν άσκηση στον αναγνώστη. Η παραπάνω μέθοδος μπορεί να γενικευτεί και για ένα σύστημα από δύο αλγεβρικές εξισώσεις. Έστω ότι έχουμε να λύσουμε τις εξισώσεις g1 (x1 , x2 ) = 0 και g2 (x1 , x2 ) = 0. Για να βρούμε το ανάλογο επαγωγικό σχήμα που θα οδηγήσει σε μια συγκλίνουσα προς μια ρίζα ακολου- θία (x10 , x20 ), (x11 , x21 ), . . ., (x1n , x2n ), (x1(n+1) , x2(n+1) ), . . ., αναπτύσσουμε κατά Taylor τις δύο συναρτήσεις γύρω από το σημείο (x1n , x2n ) ∂g1 (x1n , x2n ) g1 (x1(n+1) , x2(n+1) ) = g1 (x1n , x2n ) + (x1(n+1) − x1n ) ∂x1 ∂g1 (x1n , x2n ) + (x2(n+1) − x2n ) + ... ∂x2 ∂g2 (x1n , x2n ) g2 (x1(n+1) , x2(n+1) ) = g2 (x1n , x2n ) + (x1(n+1) − x1n ) ∂x1 ∂g2 (x1n , x2n ) + (x2(n+1) − x2n ) + . . . . (3.26) ∂x2 Ορίζοντας δx1 = (x1(n+1) − x1n ) και δx2 = (x2(n+1) − x2n ) και θέτοντας 174 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ g1 (x1(n+1) , x2(n+1) ) ≈ 0, g2 (x1(n+1) , x2(n+1) ) ≈ 0, παίρνουμε ∂g1 ∂g1 δx1 + δx2 = −g1 ∂x1 ∂x2 ∂g2 ∂g2 δx1 + δx2 = −g2 . (3.27) ∂x1 ∂x2 Αυτό είναι ένα γραμμικό 2 × 2 σύστημα A11 δx1 + A12 δx2 = b1 A21 δx1 + A22 δx2 = b2 , (3.28) όπου Aij = ∂gi /∂xj και bi = −gi με i, j = 1, 2. Λύνοντας ως προς δxi παίρνουμε την επαγωγική σχέση x1(n+1) = x1n + δx1 x2(n+1) = x2n + δx2 . (3.29) Ο αλγόριθμος σταματάει όταν τα δxi γίνουν αρκετά μικρά. Για παράδειγμα θα λύσουμε τις εξισώσεις με g1 (x) = 2x2 −3xy+y−2, g2 (x) = 3x + xy + y − 1. Έχουμε A11 = 4x − 3y, A12 = 1 − 3x, A21 = 3 + y, A22 = 1 + x. Γράφουμε το πρόγραμμα στο αρχείο nr2.f90: ! =========================================================== ! Newton Raphson o f two f u n c t i o n s o f two v a r i a b l e s ! =========================================================== program NewtonRaphson2 i m p l i c i t none r e a l ( 8 ) , parameter : : eps = 1D−6 i n t e g e r , parameter : : NMAX = 1000 r e a l ( 8 ) : : A ( 2 , 2 ) , b ( 2 ) , dx ( 2 ) real (8) : : x , y , err integer : : i p r i n t * , ’ Enter x0 , y0 : ’ read * , x , y e r r = 1 . 0 D0 print * , ’ i t e r x y error ’ p r i n t * , ’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’ print * , 0 ,x , y , err do i =1 , NMAX b(1) = −(2.0 D0 * x * x−3.0D0 * x * y+y−2.0D0 ) ! −g1 ( x , y ) b (2) = −(3.0 D0 * x + x * y + y − 1 . 0 D0 ) ! −g2 ( x , y ) ! dg1 / dx dg1 / dy A ( 1 , 1 ) = 4.0 D0 * x−3.0D0 * y ; A ( 1 , 2 ) = 1 . 0 D0 −3.0D0 * x ! dg2 / dx dg2 / dy 3.4. ΜΕΘΟΔΟΣ NEWTON-RAPHSON 175 A ( 2 , 1 ) = 3.0 D0+y ; A ( 2 , 2 ) = 1 . 0 D0+x c a l l solve2x2 ( A , B , dx ) x = x + dx ( 1 ) y = y + dx ( 2 ) e r r = 0.5 D0 * SQRT ( dx ( 1 ) **2+ dx ( 2 ) * * 2 ) print * ,i , x , y , err i f ( e r r . lt . eps ) e x i t enddo end program NewtonRaphson2 ! =========================================================== s u b r o u t i n e solve2x2 ( A , b , dx ) i m p l i c i t none r e a l ( 8 ) : : A ( 2 , 2 ) , b ( 2 ) , dx ( 2 ) r e a l ( 8 ) : : num1 , num2 , det num1 = A ( 2 , 2 ) * b ( 1 )−A ( 1 , 2 ) * b ( 2 ) num2 = A ( 1 , 1 ) * b ( 2 )−A ( 2 , 1 ) * b ( 1 ) det = A ( 1 , 1 ) * A ( 2 , 2 )−A ( 1 , 2 ) * A ( 2 , 1 ) i f ( det . eq . 0.0 D0 ) s t o p ’ s o l v e 2 x 2 : d e t=0 ’ dx ( 1 ) = num1 / det dx ( 2 )= num2 / det end s u b r o u t i n e solve2x2 Για να πάρουμε μια ιδέα πού περίπου είναι οι πραγματικές ρίζες του συστήματος, κάνουμε ένα τρισδιάστατο γράφημα με το gnuplot: gnuplot > s e t i s o s a m p l e s 20 gnuplot > s e t hidden3d gnuplot > s p l o t 2* x**2 −3*x * y+y −2 ,3* x+y * x+y −1 ,0 Εκτός από τις gi (x, y) κάνουμε και τη γραφική παράσταση του x = 0 επιπέδου και από την τομή των τριών επιφανειών εντοπίζουμε τις ρίζες. Η μεταγλώττιση και το τρέξιμο του προγράμματος δίνει: > g f o r t r a n nr2 . f90 −o n > echo 2.2 1 . 5 | . / n Enter x0 , y0 : iter x y error −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 0 2.20000000 1.50000000 1.0000 1 0.76427104 0.26899383 0.9456 2 0.73939531 −0.68668275 0.4780 3 0.74744506 −0.71105605 1.2834 E−002 4 0.74735933 −0.71083147 1.2019 E−004 5 0.74735932 −0.71083145 1.2029 E−008 > echo 0 1 | . / n ................. 5 −0.10899022 1.48928857 4.3461 E−012 176 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ > echo −5 0 | . / n 6 −6.13836909 −3.77845711 3.2165 E−013 Βρήκαμε έτσι τρεις ρίζες (0.74735932, −0.71083145), (−0.10899022, 1.48928857), (−6.13836909, −3.77845711). Η μέθοδος Newton-Raphson για πολλές μεταβλητές γίνεται ακριβή: έχουμε εκτός από τον υπολογισμό της συνάρτησης και τον υπολογισμό των παραγώγων που μπορεί να γίνει απαγορευτικά ακριβός σε ορι- σμένα προβλήματα. Επίσης, γίνεται προβληματικός ο εντοπισμός των λύσεων αφού η μέθοδος συγκλίνει γρήγορα μόνο κοντά στην περιοχή των ριζών. Παραπέμπουμε τον αναγνώστη στην [8] για περισσότερες πληροφορίες για το πώς αντιμετωπίζονται αυτά τα προβλήματα. 3.5 Υπολογισμός Σημείων Διακλάδωσης Για τον εντοπισμό των σημείων διακλάδωσης για r < rc θα λύσουμε τις αλγεβρικές εξισώσεις x = f (k) (x) και f (k)′ (x) = −1. Στα σημεία αυτά, θα έχουμε τους k-κύκλους να γίνονται ασταθείς και να γίνονται σταθεροί (n) οι 2k-κύκλοι. Αυτό γίνεται όταν r = rc με k = 2n−2 . Θα αναζητήσουμε ως λύσεις τα σημεία (x∗α , rc ) για α = k + 1, k + 2, . . . , 2k (n) Ορίζουμε τις συναρτήσεις F (x, r) = f (x) = rx(1 − x) και F (k) (x, r) = f (k) (x) όπως κάναμε στην (3.6). Για να εντοπίσουμε τα σημεία διακλά- δωσης θα λύσουμε τις αλγεβρικές εξισώσεις: g1 (x, r) = x − F (k) (x, r) = 0 ∂F (k) (x, r) g2 (x, r) = + 1 = 0. (3.30) ∂x Σύμφωνα με την προηγούμενη παράγραφο, για τον υπολογισμό των ρι- ζών των παραπάνω εξισώσεων θα λύσουμε το γραμμικό σύστημα (3.28) 3.5. ΥΠΟΛΟΓΙΣΜΟΣ ΣΗΜΕΙΩΝ ΔΙΑΚΛΑΔΩΣΗΣ 177 με τους συντελεστές b1 = −g1 (x, r) = −x + F (k) (x, r) ∂F (k) (x, r) b2 = −g2 (x, r) = − −1 ∂x ∂g1 (x, r) ∂F (k) (x, r) A11 = =1− ∂x ∂x (k) ∂g1 (x, r) ∂F (x, r) A12 = =− ∂r ∂r ∂g2 (x, r) ∂ 2 F (k) (x, r) A21 = = ∂x ∂x2 ∂g2 (x, r) ∂ 2 F (k) (x, r) A22 = = . (3.31) ∂r ∂x∂r Τις παραγώγους δεν μπορούμε να τις υπολογίσουμε αναλυτικά, οπότε θα καταφύγουμε στην προσέγγιση ∂F (k) (x, r) F (k) (x + ϵ, r) − F (k) (x − ϵ, r) ≈ ∂x 2ϵ (k) ∂F (x, r) F (x, r + ϵ) − F (k) (x, r − ϵ) (k) ≈ , (3.32) ∂r 2ϵ και για τις δεύτερες παραγώγους ∂F (k) (x+ 2ϵ ,r) ∂F (k) (x− 2ϵ ,r) ∂ 2 F (k) (x, r) − ≈ ∂x ∂x ∂x2 2 2ϵ { } 1 F (k) (x + ϵ, r) − F (k) (x, r) F (k) (x, r) − F (k) (x − ϵ, r) = − ϵ ϵ ϵ 1 { } = F (k) (x + ϵ, r) − 2F (k) (x, r) + F (k) (x − ϵ, r) ϵ2 ∂F (k) (x+ϵx ,r) (k) ∂ 2 F (k) (x, r) − ∂F (x−ϵ x ,r) ≈ ∂r ∂r ∂x∂r 2ϵ { (k) x 1 F (x + ϵx , r + ϵr ) − F (k) (x + ϵx , r − ϵr ) = 2ϵx 2ϵr } F (x − ϵx , r + ϵr ) − F (k) (x − ϵx , r − ϵr ) (k) − 2ϵr 1 { (k) = F (x + ϵx , r + ϵr ) − F (k) (x + ϵx , r − ϵr ) 4ϵx ϵr } −F (k) (x − ϵx , r + ϵr ) + F (k) (x − ϵx , r − ϵr ) (3.33) 178 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ Μπορούμε να γράψουμε τώρα το πρόγραμμα για τη Newton-Raphson όπως και στην προηγούμενη παράγραφο. Η μόνη διαφορά θα είναι ο υπολογισμός των παραγώγων από τις παραπάνω προσεγγιστικές σχέ- σεις και ο υπολογισμός της F (k) (x, r) από συνάρτηση που θα συνθέτει την f (x) k-φορές. Το πρόγραμμα θα το βρείτε στο αρχείο bifurcationPoints.f90: ! =========================================================== ! bifurcationPoints . f ! C a l c u l a t e b i f u r c a t i o n p o i n t s o f t h e d i s c r e t e l o g i s t i c map ! a t p e r i o d k by s o l v i n g t h e c o n d i t i o n ! g1 ( x , r ) = x − F( k , x , r ) = 0 ! g2 ( x , r ) = dF( k , x , r ) / dx+1 = 0 ! determining when t h e Floquet m u l t i p l i e r bacomes 1 ! F( k , x , r ) i t e r a t e s F( x , r ) = r * x * ( x−1) k t i m e s ! The e q u a t i o n s a r e s o l v e d by using a Newton−Raphson method ! =========================================================== program bifurcationPoints i m p l i c i t none r e a l ( 8 ) , parameter : : tol =1.0 D−10 i n t e g e r : : k , iter r e a l ( 8 ) : : r0 , x0 r e a l ( 8 ) : : A ( 2 , 2 ) , B ( 2 ) , dX ( 2 ) r e a l ( 8 ) : : error r e a l ( 8 ) : : F , dFdx , dFdr , d2Fdx2 , d2Fdrdx ! −−−− Input : p r i n t * , ’ # Enter k , r0 , x0 : ’ read * , k , r0 , x0 p r i n t * , ’ # Period k= ’ , k p r i n t * , ’ # r0= ’ , r0 , ’ x0= ’ , x0 ! −−−− I n i t i a l i z e error = 1 . 0 D0 ! i n i t i a l l a r g e value of error > t o l iter = 0 do while ( error . gt . tol ) ! −−−− C a l c u l a t e j a c o b i a n mat rix A ( 1 , 1 ) = 1 . 0 D0−dFdx ( k , x0 , r0 ) A ( 1 , 2 ) = −dFdr ( k , x0 , r0 ) A ( 2 , 1 ) = d2Fdx2 ( k , x0 , r0 ) A ( 2 , 2 ) = d2Fdrdx ( k , x0 , r0 ) B(1) = −x0 + F ( k , x0 , r0 ) B (2) = −dFdx ( k , x0 , r0 ) −1.0D0 ! −−−− S o l v e a 2x2 l i n e a r system : c a l l solve2x2 ( A , B , dX ) x0 = x0 + dX ( 1 ) r0 = r0 + dX ( 2 ) error = 0.5 D0 * sqrt ( dX ( 1 ) **2+ dX ( 2 ) * * 2 ) iter = iter+1 3.5. ΥΠΟΛΟΓΙΣΜΟΣ ΣΗΜΕΙΩΝ ΔΙΑΚΛΑΔΩΣΗΣ 179 p r i n t * , iter , ’ x0= ’ , x0 , ’ r0= ’ , r0 , ’ e r r = ’ , error enddo ! do while ( e r r o r . g t . t o l ) end program bifurcationPoints ! =========================================================== ! Function F( k , x , r ) and i t s d e r i v a t i v e s real (8) function F(k , x , r) i m p l i c i t none r e a l ( 8 ) : : x , r , x0 integer k , i x0 = x do i =1 , k x0 = r * x0 * ( 1 . 0 D0−x0 ) enddo F = x0 end f u n c t i o n F ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n dFdx ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , eps real (8) : : F integer k eps = 1 . 0 D−6*x dFdx = ( F ( k , x+eps , r )−F ( k , x−eps , r ) ) / ( 2 . 0 D0 * eps ) end f u n c t i o n dFdx ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n dFdr ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , eps real (8) : : F integer k eps = 1 . 0 D−6*r dFdr = ( F ( k , x , r+eps )−F ( k , x , r−eps ) ) / ( 2 . 0 D0 * eps ) end f u n c t i o n dFdr ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n d2Fdx2 ( k , x , r ) i m p l i c i t none r e a l ( 8 ) : : x , r , eps real (8) : : F integer k eps = 1 . 0 D−6*x d2Fdx2 = ( F ( k , x+eps , r ) −2.0D0 * F ( k , x , r )+F ( k , x−eps , r ) ) / ( eps * eps ) end f u n c t i o n d2Fdx2 ! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n d2Fdrdx ( k , x , r ) 180 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ i m p l i c i t none r e a l ( 8 ) : : x , r , epsx , epsr real (8) : : F integer k epsx = 1 . 0 D−6*x epsr = 1 . 0 D−6*r d2Fdrdx = ( F ( k , x+epsx , r+epsr )−F ( k , x+epsx , r−epsr ) & −F ( k , x−epsx , r+epsr )+F ( k , x−epsx , r−epsr ) ) & / ( 4 . 0 D0 * epsx * epsr ) end f u n c t i o n d2Fdrdx ! =========================================================== s u b r o u t i n e solve2x2 ( A , b , dx ) i m p l i c i t none r e a l ( 8 ) : : A ( 2 , 2 ) , b ( 2 ) , dx ( 2 ) r e a l ( 8 ) : : num1 , num2 , det num1 = A ( 2 , 2 ) * b ( 1 ) − A ( 1 , 2 ) * b ( 2 ) num2 = A ( 1 , 1 ) * b ( 2 ) − A ( 2 , 1 ) * b ( 1 ) det = A ( 1 , 1 ) * A ( 2 , 2 )− A ( 1 , 2 ) * A ( 2 , 1 ) i f ( det . eq . 0.0 D0 ) s t o p ’ s o l v e 2 x 2 : d e t = 0 ’ dx ( 1 ) = num1 / det dx ( 2 ) = num2 / det end s u b r o u t i n e solve2x2 Η μεταγλώττιση του προγράμματος και η εκτέλεσή του γίνεται με τις εντολές: > g f o r t r a n bifurcationPoints . f90 −o b > echo 2 3.5 0.5 | . / b # Enter k , r0 , x0 : # Pe ri od k= 2 # r0= 3.5000000000000 x0= 0.50000000000 1 x0= 0.4455758353187 r0= 3.38523275827 err= 6.35088E−002 2 x0= 0.4396562547624 r0= 3.45290970406 err= 3.39676E−002 3 x0= 0.4399593001407 r0= 3.44949859951 err= 1.71226 E−003 4 x0= 0.4399601690333 r0= 3.44948974267 err= 4.44967 E−006 5 x0= 0.4399601689937 r0= 3.44948974281 err= 7.22160 E−011 > echo 2 3.5 0.85 | . / b ................. 4 x0= 0.8499377795512 r0= 3.44948974275 err= 1.85082E−011 > echo 4 3.5 0.5 | . / b ................. 5 x0= 0.5235947861540 r0= 3.54409035953 err= 1.86318 E−011 > echo 4 3.5 0.35 | . / b ................. 5 x0= 0.3632903374118 r0= 3.54409035955 err= 5.91653E−013 Παραπάνω δείχνουμε τα σημεία του 2-κύκλου και μερικά από τα ση- 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 181 μεία του 4-κύκλου. Επίσης μπορούμε να συγκρίνουμε την τιμή του (3) (3) √ rc = 3.449490132 που υπολογίζουμε με την αναμενόμενη rc = 1 + 6 ≈ 3.449489742. Αφήνουμε ως άσκηση στον αναγνώστη να βελτιώσει την ακρίβεια μειώνοντας τα συστηματικά σφάλματα του υπολογισμού, κα- (4) θώς και να πετύχει μεγαλύτερη ακρίβεια στην τιμή του rc . 3.6 Εκθέτες Liapunov Όπως είδαμε, όταν r > rc ≈ 3.56994567 οι τροχιές της λογιστικής εξί- σωσης παρουσιάζουν χαοτική συμπεριφορά. Αυτό κυρίως σημαίνει ότι οι τροχιές είναι ευαίσθητες στην επιλογή των αρχικών συνθηκών, έτσι ώστε τροχιές που ξεκινάνε από απειροστά κοντά αρχικά σημεία, σε μι- κρό αριθμό βημάτων διαφέρουν σημαντικά. Αυτό συνεπάγεται, επίσης, πως υπάρχει σύνολο από αρχικές συνθήκες που καλύπτουν πυκνά κά- ποια υποδιαστήματα του (0, 1) των οποίων οι τροχιές δεν πλησιάζουν οριακά κανένα κύκλο οποιουδήποτε μήκους. Πιο συγκεκριμένα, έστω δύο τροχιές οι οποίες έχουν ως αρχικά ση- μεία τα x0 , x̃0 αντίστοιχα και ∆x0 = x0 − x̃0 . Όταν για αρκετά μικρά n τα επόμενα σημεία xn , x̃n απέχουν απόσταση ∆xn = x̃n − xn που αυξάνει εκθετικά με το n (“χρόνο”), δηλαδή ∆xn ∼ ∆x0 eλn , λ > 0, (3.34) αυτό αποτελεί ένδειξη χαοτικού συστήματος¹¹. Ο εκθέτης λ λέγεται εκ- θέτης Liapunov. Για τον υπολογισμό του εκθέτη είναι χρήσιμο να χρη- σιμοποιήσουμε την ακόλουθη σχέση: 1∑ n−1 λ = lim ln |f ′ (xk )| . (3.35) n→∞ n k=0 Η ισχύς αυτής της σχέσης αποδεικνύεται θεωρώντας απειροστό ϵ ≡ ¹¹Από μόνη της η ευαισθησία στις αρχικές συνθήκες δε συνεπάγεται αναγκαστικά χάος. Χρειάζεται να υπάρχει και τοπολογική ανάμιξη (topological mixing) και πυ- κνές περιοδικές τροχιές (density of periodic orbits). Τοπολογική ανάμιξη σημαίνει ότι οποιοδήποτε ανοικτό σύνολο του χώρου των φάσεων, αν εξελιχθεί αρκετά με το χρόνο, θα έχει επικάλυψη με οποιοδήποτε άλλο ανοικτό σύνολο. Πυκνότητα περιοδικών τρο- χιών σημαίνει πως οποιοδήποτε σημείο του χώρου των φάσεων πλησιάζεται αυθαίρετα κοντά από κάποια περιοδική τροχιά. 182 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ |∆x0 | έτσι ώστε λ = lim lim n1 ln |∆xn |/ϵ. Έτσι, έχουμε n→∞ ϵ→0 x̃1 = f (x̃0 ) = f (x0 + ϵ) ≈ f (x0 ) + ϵf ′ (x0 ) = x1 + ϵf ′ (x0 ) ⇒ ∆x1 x̃1 − x1 = ≈ f ′ (x0 ) ϵ ϵ x̃2 = f (x̃1 ) = f (x1 + ϵf ′ (x0 )) ≈ f (x1 ) + (ϵf ′ (x0 ))f ′ (x1 ) = x2 + ϵf ′ (x0 )f ′ (x1 ) ⇒ ∆x2 x̃2 − x2 = ≈ f ′ (x0 )f ′ (x1 ) ϵ ϵ x̃3 = f (x̃2 ) = f (x2 + ϵf ′ (x0 )f ′ (x1 )) ≈ f (x2 ) + (ϵf ′ (x0 )f ′ (x1 ))f ′ (x2 ) = x3 + ϵf ′ (x0 )f ′ (x1 )f ′ (x2 ) ⇒ ∆x3 x̃3 − x3 = ≈ f ′ (x0 )f ′ (x1 )f ′ (x2 ) . (3.36) ϵ ϵ Οπότε επαγωγικά δείχνουμε ότι |∆xn |/ϵ ≈ f ′ (x0 )f ′ (x1 )f ′ (x2 ) . . . f ′ (xn−1 ) και, παίρνοντας το λογάριθμο και τα όρια, αποδεικνύεται η (3.35). Αρχικά, μπορούμε να υπολογίσουμε τους εκθέτες Liapunov χρησιμο- ποιώντας τον ορισμό (3.34). Μεταβάλλουμε κατάλληλα το πρόγραμμα logistic.f90, έτσι ώστε να υπολογίζει δύο τροχιές που αρχικά απέχουν απόσταση ϵ = epsilon: ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Two t r a j e c t o r i e s with c l o s e i n i t i a l c o n d i t i o n s . ! =========================================================== program logistic_map i m p l i c i t none i n t e g e r : : NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 , x0t , x1t , e p s i l o n ! −−−−− Input : p r i n t * , ’ # Enter NSTEPS , r , x0 , e p s i l o n : ’ read * , NSTEPS , r , x0 , e p s i l o n p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 print * , ’# epsilon = ’ , epsilon x0t = x0+ e p s i l o n ! −−−−− I n i t i a l i z e : 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 183 1e+16 1e+14 1e+12 1e+10 |∆xn|/ε 1e+08 1e+06 10000 ε = 10-15 ε = 10-12 100 ε = 10-10 ε = 10-8 -6 1 ε = 10-4 ε = 10 0.01 0 20 40 60 80 100 120 140 160 180 200 n Σχήμα 3.7: Γραφική παράσταση της |∆xn |/ϵ για τη λογιστική εξίσωση με r = 3.6, x0 = 0.2. Παρατηρούμε τη σύγκλιση των καμπύλων στο όριο ϵ → 0 και την προσεγγιστική εκθετική συμπεριφορά της γραφικής παράστασης στο όριο αυτό. Τα δύο ευθύγραμμα τμήματα είναι προσαρμογή στην εξίσωση (3.34) και δίνουν λ = 0.213(4) και λ = 0.217(6) αντίστοιχα. open ( u n i t =33 , f i l e = ’ l i a . dat ’ ) w r i t e ( 3 3 , * ) 1 , x0 , x0t , ABS( x0t−x0 ) / e p s i l o n ! −−−−− C a l c u l a t e : do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) x1t = r * x0t * ( 1 . 0 D0−x0t ) w r i t e ( 3 3 , * ) i , x1 , x1t , ABS( x1t−x1 ) / e p s i l o n x0 = x1 ; x0t = x1t enddo c l o s e (33) end program logistic_map Αφού το τρέξουμε βρίσκουμε στην τέταρτη στήλη του αρχείου lia.dat την τιμή |∆xn |/ϵ. Μπορούμε έτσι να φτιάξουμε καμπύλες όπως στο σχήμα 3.7 με τις εντολές: > gfortran liapunov1 . f90 −o l > gnuplot gnuplot > s e t l o g s c a l e y 184 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ gnuplot > p l o t \ ”<echo 200 3.6 0.2 1 e−15 | . / l ; c a t l i a . dat ” u 1 : 4 w l Στην τελευταία γραμμή κάνουμε γραφική παράσταση από το stdout της εντολής μέσα στα εισαγωγικά. Η πρώτη εντολή τρέχει το πρόγραμμα ./l διαβάζοντας από το stdin τις παραμέτρους NSTEPS = 200, r = 3.6, x0 = 0.2 και epsilon = 10−15 . Η δεύτερη τυπώνει στο stdout τα πε- ριεχόμενα του αρχείου lia.dat το οποίο διαβάζεται από το gnuplot που κάνει τη γραφική παράσταση. Με την εντολή set logscale y στο gnuplot, κάνουμε λογαριθμική την κλίμακα μόνο στον y-άξονα. Έτσι μια εκθετική συνάρτηση παριστάνεται γραφικά από μία ευθεία. Στο σχήμα 3.7 παρατηρούμε τέτοια ευθεία διάταξη των σημείων |∆xn |/ϵ η οποία γίνεται ολοένα και καλύτερη όσο το ϵ μικραίνει. Η κλίση των ευθυγράμμων αυτών τμημάτων μας δίνει τον εκθέτη λ. Επίσης, παρα- τηρούμε παράλληλα ευθύγραμμα τμήματα με την ίδια περίπου κλίση που αντιστοιχούν στο ίδιο λ. Η διάταξη των σημείων δεν είναι ακριβώς ευθεία οπότε ο υπολογισμός του λ ενέχει σφάλματα, όπως σημειώνουμε και στο σχήμα 3.7. Αλλάζοντας την αρχική συνθήκη παίρνουμε ελαφρά διαφορετική τιμή για το λ και έτσι μπορούμε να πάρουμε για την τιμή του λ τη μέση τιμή των μετρήσεων μας και να εκτιμήσουμε το σφάλμα ως το σφάλμα της μέσης τιμής. Αυτό αφήνεται για άσκηση στον ανα- γνώστη. Ας πούμε περιληπτικά πώς μπορεί κανείς να υπολογίσει το λ με προ- σαρμογή της εκθετικής συνάρτησης στα σημεία |∆xn |/ϵ. Επειδή |∆xn |/ϵ ∼ C exp(λn) ⇒ ln(|∆xn |/ϵ) = λn + c, οπότε μπορούμε να κάνουμε προσαρ- μογή σε ευθεία γραμμή. Αυτό γίνεται εύκολα με τη χρήση του gnuplot: gnuplot > f i t [ 5 : 5 3 ] a * x+b \ ”<echo 500 3.6 0.2 1 e−15 | . / l ; c a t l i a . dat ”\ using 1 : ( l o g ( $4 ) ) via a , b gnuplot > r e p l o t exp ( a * x+b ) Με την παραπάνω εντολή προσαρμόζουμε στη συνάρτηση a*x+b τα δε- δομένα της 1ης και του λογαρίθμου της 4ης στήλης (using 1:(log($4))) του stdout της εντολής που παράγει τα δεδομένα όπως και στη γραφική παράσταση που κάναμε παραπάνω. Τα δεδομένα που επιλέγουμε είναι για 5 ≤ n ≤ 53 ([5:53]) και οι παράμετροι που προσαρμόζονται οι a,b (via a,b). Στη δεύτερη γραμμή προσθέτουμε τη γραφική παράσταση του εκθετικού της ευθείας που υπολογίζεται. Θα χρησιμοποιήσουμε τώρα τη σχέση (3.35) για τον υπολογισμό του λ. Η σχέση αυτή είναι προσεγγιστικά σωστή, όταν (α) έχουμε ήδη μπει στη μόνιμη κατάσταση, και (β) στο όριο μεγάλου n. Για το λόγο αυτό 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 185 0.48 0.46 (1/n)Σk=NN+n-1 ln|f’(xk)| 0.44 0.42 0.4 0.38 r=3.8 x0=0.20 r=3.8 x0=0.35 0.36 r=3.8 x0=0.50 r=3.8 x0=0.75 r=3.8 x0=0.90 0.34 0 10000 20000 30000 40000 50000 60000 70000 n ∑N +n−1 Σχήμα 3.8: Γραφική παράσταση του αθροίσματος (1/n) k=N ln |f ′ (xk )| ως συνάρ- τηση του n για τη λογιστική εξίσωση με r = 3.8, N = 2000 για διαφορετικές αρχικές συνθήκες x0 = 0.20, 0.35, 0.50, 0.75, 0.90. Παρατηρούμε τη σύγκλιση των καμπύλων στο όριο n → ∞ η οποίες μας δίνουν λ = 0.4325(10). θα πρέπει να μελετήσουμε αν η σχέση συγκλίνει ικανοποιητικά, καθώς (α) “πετάξουμε” ένα αριθμό από NTRANS βήματα, (β) υπολογίσουμε το άθροισμα (3.35) με ολοένα αυξανόμενο NSTEPS= n και (γ) υπολογίσουμε το άθροισμα (3.35) ξεκινώντας τη λογιστική εξίσωση από διαφορετικό αρχικό σημείο x0 . Θα πρέπει να κάνουμε τη μελέτη αυτή προσεκτικά για κάθε τιμή του r που θα θεωρήσουμε, καθώς σε κάθε περίπτωση η συνεισφορά κάθε παράγοντα στη σύγκλιση του λ θα είναι διαφορετική: Σε περιοχές έντονης χαοτικής συμπεριφοράς (μεγάλο λ) η σύγκλιση γίνεται με πιο αργό ρυθμό. Το πρόγραμμα θα το βρείτε στο αρχείο liapunov2.f90: ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Liapunov exponent from sum_i l n | f ’ ( x _ i ) | ! NTRANS: number o f d i s c a r t e d i t e r a t i o n i n order t o d i s c a r t ! t r a n s i e n t behaviour ! NSTEPS : number o f terms i n t h e sum ! =========================================================== 186 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ program logistic_map i m p l i c i t none i n t e g e r : : NTRANS , NSTEPS , i r e a l ( 8 ) : : r , x0 , x1 , sum ! −−−−− Input : p r i n t * , ’ # Enter NTRANS, NSTEPS , r , x0 : ’ read * , NTRANS , NSTEPS , r , x0 p r i n t * , ’ # NTRANS = ’ , NTRANS p r i n t * , ’ # NSTEPS = ’ , NSTEPS print * , ’# r = ’ ,r p r i n t * , ’ # x0 = ’ , x0 do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo sum = l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x0 ) ) ) ! −−−−− I n i t i a l i z e : open ( u n i t =33 , f i l e = ’ l i a . dat ’ ) w r i t e ( 3 3 , * ) 1 , x0 , sum ! −−−−− C a l c u l a t e : do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) sum = sum + l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x1 ) ) ) w r i t e ( 3 3 , * ) i , x1 , sum / i x0 = x1 enddo c l o s e (3 3) end program logistic_map Το πρόγραμμα, αφού εκτελέσει NTRANS βήματα xn+1 = f (xn ), υπολογίζει NSTEPS φορές το άθροισμα των όρων ln |f ′ (xk )| = ln |r(1 − 2xk )| το οποίο και αποθηκεύει στη μεταβλητή sum. Σε κάθε βήμα τυπώνεται στο αρ- χείο lia.dat το άθροισμα sum διαιρεμένο με τον αριθμό των βημάτων i. Στο σχήμα 3.6 δείχνουμε τα αποτελέσματα των μετρήσεών μας για r = 3.8. Είναι σημείο όπου το σύστημα έχει ισχυρή χαοτική συμπερι- φορά και για να βεβαιωθούμε για τη σύγκλιση του αθροίσματος πρέπει να υπολογίσουμε ένα μεγάλο αριθμό από όρους στο άθροισμα. Χρησι- μοποιώντας NTRANS = 2 000 και NSTEPS ≈ 70 000 πετυχαίνουμε ακρίβεια περίπου 0.2% με λ = 0.4325 ± 0.0010 ≡ 0.4325(10). Η κύρια συνεισφορά στο σφάλμα προέρχεται από τις διαφορετικές “διαδρομές” σύγκλισης για κάθε αρχικό σημείο που επιλέξαμε. Το σχήμα (3.6) μπορεί να γίνει με τις εντολές: > gfortran liapunov2 . f90 −o l 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 187 > gnuplot gnuplot > p l o t \ ”<echo 2000 70000 3.8 0.20 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.35 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.50 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.75 |./ l ; cat lia . dat ” u 1:3 w l ,\ ”<echo 2000 70000 3.8 0.90 |./ l ; cat lia . dat ” u 1:3 w l Μέσα στην εντολή plot τρέχουμε το πρόγραμμα ./l με παραμέτρους NTRANS = 2 000, NSTEPS = 70 000, r = 3.8 και x0 = 0.20, 0.35, 0.50, 0.75, 0.90. Στη συνέχεια, το gnuplot διαβάζει από το stdout της εντολής cat lia.dat τα περιεχόμενα των δεδομένων που έχουν καταχωρηθεί από το πρό- γραμμα ./l. Για να εντοπίσουμε τις περιοχές χαοτικής συμπεριφοράς θα εξετά- σουμε την εξάρτηση του εκθέτη Liapunov από την παράμετρο r. Επωφε- λούμενοι από την εμπειρία μας από τον προσεκτικό προσδιορισμό του λ, θα τρέξουμε το προηγούμενο πρόγραμμα για διαφορετικές τιμές του r έχοντας επιλέξει σταθερές παραμέτρους NTRANS = 2 000, NSTEPS = 60 000 και από δεδομένο αρχικό σημείο x0 = 0.2. Ο υπολογισμός θα μας δώσει αποτελέσματα με ακρίβεια της τάξης του 1%. Για προσεκτικά υπολο- γισμένες τιμές του λ με προσδιορισμό του σφάλματος στη μέτρηση, θα πρέπει να ακολουθήσουμε τη μέθοδο που περιγράψαμε στα σχήματα 3.7 και 3.8. Το πρόγραμμα θα το βρείτε στο αρχείο liapunov3.f90 και είναι απλή παραλλαγή του προηγούμενου προγράμματος, έτσι ώστε να εκτελείται για πολλές τιμές της παραμέτρου r. ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Liapunov exponent from sum_i l n | f ’ ( x _ i ) | ! C a l c u l a t i o n f o r r i n [ rmin , rmax ] with RSTEPS s t e p s ! RSTEPS : v a l u e s or r s t u d i e d : r=rmin +(rmax−rmin ) / RSTEPS ! NTRANS: number o f d i s c a r t e d i t e r a t i o n i n order t o d i s c a r t ! t r a n s i e n t behaviour ! NSTEPS : number o f terms i n t h e sum ! x s t a r t : v a l u e o f i n i t i a l x0 f o r ev er y r ! =========================================================== program logistic_map i m p l i c i t none r e a l ( 8 ) , parameter : : rmin = 2.5 D0 r e a l ( 8 ) , parameter : : rmax = 4.0 D0 r e a l ( 8 ) , parameter : : xstart = 0.2 D0 i n t e g e r , parameter : : RSTEPS = 1000 i n t e g e r , parameter : : NSTEPS = 60000 i n t e g e r , parameter : : NTRANS = 2000 i n t e g e r : : i , ir 188 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ r e a l ( 8 ) : : r , x0 , x1 , sum , dr open ( u n i t =33 , f i l e = ’ l i a . dat ’ ) dr = ( rmax−rmin ) / ( RSTEPS −1) do ir =0 , RSTEPS−1 r = rmin+ir * dr x0= xstart do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo sum = l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x0 ) ) ) ! −−−−− C a l c u l a t e : do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) sum = sum + l o g (ABS( r * ( 1 . 0 D0 −2.0D0 * x1 ) ) ) x0 = x1 enddo w r i t e ( 3 3 , * ) r , sum / NSTEPS enddo ! do i r =0 ,RSTEPS−1 c l o s e (3 3) end program logistic_map Το πρόγραμμα μεταγλωττίζεται και εκτελείται με τις εντολές > g f o r t r a n liapunov3 . f90 −o l > ./l & όπου η χρήση του & γίνεται, έτσι ώστε το πρόγραμμα ./l να εκτελεστεί στο υπόβαθρο (background). Τα δεδομένα αποθηκεύονται στο αρχείο lia.dat και μπορούμε να φτιάξουμε και να μελετήσουμε το σχήμα 3.7 με το gnuplot: gnuplot > p l o t ” l i a . dat ” with lines notitle , 0 notitle Το σχήμα 3.9 μπορούμε τώρα να το συγκρίνουμε με το διάγραμμα διακλάδωσης του σχήματος 3.4. Οι περιοχές λ < 0 αντιστοιχούν στις πε- ριοχές με σταθερούς k-κύκλους, δηλαδή σταθερές περιοδικές τροχιές. Οι περιοχές λ > 0 αντιστοιχούν στις χαοτικές περιοχές, τις περιοχές όπου εμφανίζεται ισχυρό χάος (strong chaos). Οι περιοχές αυτές χωρίζονται από κρίσιμα σημεία με λ = 0. Στα σημεία αυτά έχουμε ασθενές χάος (weak chaos) όπου οι γειτονικές τροχιές αποκλίνουν μεταξύ τους όχι εκθετικά, αλλά σαν μια δύναμη του n. Έχουμε δηλαδή |∆xn | ∼ |∆x0 |nω , όπου ω = 1/(1 − q) είναι ένας θετικός εκθέτης που πρέπει να υπολο- γιστεί. Στη βιβλιογραφία χρησιμοποιείται συνήθως ο εκθέτης q και η 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 189 0.6 0.4 0.2 λ 0 -0.2 -0.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 r Σχήμα 3.9: Ο εκθέτης Liapunov λ της λογιστικής εξίσωσης ο οποίος υπολογίζεται από τη σχέση (3.35). Παρατηρήστε την εμφάνιση χαοτικής συμπεριφοράς στις περιοχές όπου λ > 0 καθώς και την εμφάνιση των “παραθύρων’ λ < 0 με σταθερούς k-κύκλους όπως είχαμε δει και στο διάγραμμα διακλάδωσης, σχήμα 3.4. Στα κρίσιμα σημεία με λ = 0 έχουμε την εκδήλωση χάους (onset of chaos, edge of chaos) με ασθενή χαοτική συμπεριφορά (weak chaos, |∆xn | ∼ |∆x0 |nω ) όπου συμβαίνει μετάβαση από περιοχή με σταθερούς k-κύκλους σε περιοχή με ισχυρή χαοτική συμπεριφορά (strong chaos). Παρατηρούμε την εκδήλωση χάους όταν r = rc ≈ 3.5699 όπου λ = 0 για πρώτη φορά (για μικρότερα r η γραφική παράσταση φαίνεται να αγγίζει τη γραμμή λ = 0, αλλά στην πραγματικότητα το λ παίρνει πολύ μικρές κατά απόλυτη τιμή αρνητικές τιμές). εκθετική συμπεριφορά (ισχυρό χάος) παίρνεται στο όριο q → 1. Παρα- τηρούμε τα “διαλείμματα χάους” που είχαμε συζητήσει, όταν μελετού- σαμε το διάγραμμα διακλάδωσης. Οι κρίσιμες τιμές του r στις οποίες συμβαίνουν αυτές οι μεταβάσεις μπορούν να υπολογιστούν με ακρίβεια εντοπίζοντας τον υπολογισμό στο κατάλληλο διάστημα τιμών του r σε αρκετά μικρή γειτονιά του κρίσιμου σημείου. Με το παραπάνω πρό- γραμμα, αυτό γίνεται εύκολα αλλάζοντας τις τιμές των παραμέτρων rmin και rmax. Ένας άλλος τρόπος να μελετήσουμε τις χαοτικές ιδιότητες των τρο- χιών της λογιστικής εξίσωσης είναι να υπολογίσουμε την κατανομή των τιμών του x στο διάστημα (0, 1). Στις περιοδικές τροχιές, αφού πε- ράσουμε τη μεταβατική περίοδο, η κατανομή θα συγκεντρώνεται στα σημεία των k-κύκλων, ενώ στις χαοτικές, μη περιοδικές, τροχιές θα κα- 190 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ 5 5 4 4 3 3 p(x) p(x) 2 2 1 1 0 0 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 x x Σχήμα 3.10: Κατανομές των τιμών p(x) του x στη λογιστική εξίσωση για r = 3.59 (αριστερά) και 3.8 (δεξιά). Αριστερά η χαοτική συμπεριφορά φαίνεται να είναι πιο ασθενής από δεξιά, κάτι το οποίο θα αντικατοπτριστεί στη χαμηλότερη τιμή της εντρο- πίας. Υπάρχουν ολόκληρες περιοχές του x με p(x) = 0. Η κατανομή αυτή είναι πολύ δύσκολο να διακριθεί από μια πραγματικά τυχαία κατανομή πιθανότητας. τανέμεται πάνω σε υποδιαστήματα του (0, 1). Η πυκνότητα πιθανότητας p(x) να βρούμε μια τιμή x για δεδομένο r είναι ανεξάρτητη του αρχι- κού σημείου της τροχιάς. Αντίστροφα, αν μας δοθεί ένας μεγάλος αριθ- μός από σημεία που παράγει η λογιστική εξίσωση, θα ήταν πρακτικά αδύνατο να καταλάβουμε πως προέρχονται από ένα ντετερμινιστικό κανόνα. Για το λόγο αυτό, χαοτικά συστήματα μπορούν να χρησιμοποι- ηθούν για την παραγωγή ψευδοτυχαίων αριθμών, όπως θα δούμε στο κεφάλαιο 11. Για να μετρήσουμε την “τυχαιότητα” της κατανομής, μπο- ρούμε να χρησιμοποιήσουμε την εντροπία η οποία είναι ένα μέτρο της αταξίας ενός συστήματος. Όπως θα εξηγήσουμε λεπτομερέστερα στο κεφάλαιο 12, αυτή δίνεται από τη σχέση ∑ S=− pk ln pk , (3.37) k όπου pk είναι η πιθανότητα εμφάνισης της κατάστασης k. Στην περί- πτωσή μας, θα υπολογίσουμε την κατανομή pk χωρίζοντας το διάστημα (0, 1) σε υποδιαστήματα πλάτους ∆x. Για δεδομένο r, θα πάρουμε ένα μεγάλο αριθμό M από μετρήσεις των τιμών xn της λογιστικής εξίσω- σης και θα υπολογίσουμε το ιστόγραμμα hk της κατανομής τους στα διαστήματα (xk , xk + ∆x) που επιλέξαμε. Η πυκνότητα κατανομής αντι- στοιχεί στο όριο της ποσότητας pk∑ = hk /(M ∆x) για μεγάλα M και μικρό ∆x (μεγάλο N ). Πράγματι, τότε N ∆x = 1 το οποίο συγκλίνει στο k=1 pk∑ ∫1 0 p(x) dx = 1. Θα ορίσουμε τότε S = − N k=1 pk ln pk ∆x. Το πρόγραμμα που θα γράψουμε θα υπολογίζει για τις επιλεγμένες τιμές του r την κατανομή pk και από αυτή την εντροπία S σύμφωνα 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 191 5 4 3 p(x) 2 1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 x Σχήμα 3.11: Κατανομές των τιμών p(x) του x στη λογιστική εξίσωση για r = 4. Έχουμε ισχυρή χαοτική συμπεριφορά και η p(x) είναι μη-μηδενική σε ολόκληρο το διάστημα (0, 1). Ευνοούνται οι τιμές του x που βρίσκονται στα άκρα του διαστήματος και η εντροπία είναι μεγάλη. Η καμπύλη είναι η γραφική παράσταση της γνωστής [29] για r = 4 κατανομής p(x) = π −1 x−1/2 (1 − x)−1/2 (κατανομή beta για a = 1/2, b = 1/2). με την (3.37). Αυτό θα προκύψει μεταβάλλοντας το πρόγραμμα του αρχείου liapunov3.f90 προσθέτοντας την παράμετρο NHIST που είναι ο αριθμός των διαστημάτων N για τα ιστογράμματα και αποθηκεύοντας τις πυκνότητες πιθανότητας στο array p(NHIST). Το πρόγραμμα θα το βρείτε στο αρχείο entropy.f90: ! =========================================================== ! D i s c r e t e L o g i s t i c Map : ! Entropy c a l c u l a t i o n from S=−sum_i p _ i l n p _ i ! C a l c u l a t i o n f o r r i n [ rmin , rmax ] with RSTEPS s t e p s ! RSTEPS : v a l u e s or r s t u d i e d : r=rmin +(rmax−rmin ) / RSTEPS ! NHIST : number o f histogram b i n s f o r c a l c u l a t i o n o f p _ i ! NSTEPS : number o f v a l u e s o f x i n t h e h i s t o g r a m s ! NTRANS: number o f d i s c a r t e d i t e r a t i o n i n order t o d i s c a r t ! t r a n s i e n t behaviour ! x s t a r t : v a l u e o f i n i t i a l x0 f o r ev er y r ! =========================================================== program logistic_map i m p l i c i t none r e a l ( 8 ) , parameter : : rmin = 2.5 D0 r e a l ( 8 ) , parameter : : rmax = 4.0 D0 r e a l ( 8 ) , parameter : : xstart = 0.2 D0 192 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ integer , parameter : : RSTEPS = 1000 integer , parameter : : NHIST = 10000 integer , parameter : : NTRANS = 2000 integer , parameter : : NSTEPS = 5000000 real (8) , parameter : : xmin =0.0 D0 , xmax =1.0 D0 integer : : i , ir , isum , n real (8) : : r , x0 , x1 , sum , dr , dx real (8) : : p ( NHIST ) , S open ( u n i t =33 , f i l e = ’ entropy . dat ’ ) p = 0.0 D0 dr = ( rmax−rmin ) / ( RSTEPS −1) dx = ( xmax−xmin ) / ( NHIST −1) do ir =0 , RSTEPS−1 r = rmin+ir * dr x0= xstart do i =1 , NTRANS x1 = r * x0 * ( 1 . 0 D0−x0 ) x0 = x1 enddo ! make histogram : n=INT ( x0 / dx ) +1; p ( n )=p ( n ) +1.0 D0 do i =2 , NSTEPS x1 = r * x0 * ( 1 . 0 D0−x0 ) n = INT ( x1 / dx ) +1 p ( n )=p ( n ) +1.0 D0 x0 = x1 enddo ! p ( k ) i s now histogram o f x−v a l u e s . ! Normalize so t h a t sum_k p ( k ) * dx=1 ! to get probability d i s t r i b u t i o n : p = p / NSTEPS / dx ! sum a l l non z e r o terms : p ( n ) * l o g ( p ( n ) ) * dx S = −SUM( p * l o g ( p ) , MASK=p . gt . 0 . 0 D0 ) * dx write (33 ,*) r , S enddo ! do i r =0 ,RSTEPS−1 c l o s e (3 3) ! p r i n t the l a s t p r o b a b i l i t y d i s t r i b u t i o n : open ( u n i t =34 , f i l e = ’ e n t r o p y _ h i s t . dat ’ ) do n =1 , NHIST x0 = xmin +(n−1) * dx + 0.5 D0 * dx w r i t e ( 3 4 , * ) r , x0 , p ( n ) enddo c l o s e (34) end program logistic_map Για τον υπολογισμό των κατανομών και της εντροπίας θα πρέπει να επιλέξουμε τις παραμέτρους με τις οποίες θα ελέγξουμε τα συστη- ματικά σφάλματα στους υπολογισμούς μας. Η παράμετρος NTRANS θα 3.6. ΕΚΘΕΤΕΣ LIAPUNOV 193 0 -1 -2 -3 -4 S -5 -6 -7 -8 -9 3.5 3.55 3.6 3.65 3.7 3.75 3.8 3.85 3.9 3.95 4 r ∑ Σχήμα 3.12: Η εντροπία S = − k pk ln pk ∆x για τη λογιστική εξίσωση ως συνάρτηση του r. Η κάθετη γραμμή είναι η rc ≈ 3.56994567 που σηματοδοτεί την αρχή του χάους και η οριζόντια η αντίστοιχη εντροπία. Παρατηρούμε αριστερά τη χαμηλή εντροπία των αρχικών 2n ευσταθών κύκλων η οποία αυξάνεται σε κάθε διακλάδωση. Η εντροπία είναι μεγάλη στις περιοχές του χάους με απότομη ελάττωση √ στα “διαλείμματα” χάους. Φαίνεται καθαρά το διάλειμμα του 3-κύκλου για r = 1+ 8 ≈ 3.8284 και οι ακόλουθες διακλαδώσεις του που είδαμε και στα διαγράμματα διακλάδωσης (σχήμα 3.4) και εκθέτη Liapunov (σχήμα 3.9). πρέπει να είναι αρκετά μεγάλη, έτσι ώστε η μεταβατική περίοδος να μη “μολύνει” τα αποτελέσματα. Οι μετρήσεις μας θα πρέπει να ελεγχθούν ως προς τη σταθερότητά τους μεταβάλλοντας την τιμή της. Το ίδιο και η τιμή της xstart που δίνει το αρχικό σημείο για τη λογιστική εξίσωση για κάθε r. Η NHIST ελέγχει τη διαμέριση του διαστήματος (0, 1) και το μέγεθος του ∆x και θα πρέπει να είναι αρκετά μεγάλη. Η NSTEPS είναι ο αριθμός των “μετρήσεων” για κάθε τιμή του r και θα πρέπει να είναι αρκετός για να μειώνεται ο “θόρυβος” στην τιμή του pk . Εννοείται ότι όσο μικρότερο είναι το ∆x τόσο μεγαλύτερο πρέπει να είναι το NSTEPS. Με κατάλληλες επιλογές παίρνουμε τις κατανομές pk όπως φαίνεται στα σχήματα 3.10 και 3.11 για r = 3.59, 3.58 και 4. Παρατηρούμε ότι ισχυρότερο χάος συνδέεται με πλατύτερη κατανομή των τιμών του x. Ο υπολογισμός της εντροπίας φαίνεται στο σχήμα 3.12. Οι περιοδι- κές τροχιές έχουν σχετικά χαμηλή εντροπία ενώ οι χαοτικές υψηλότερη. 194 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ Η εντροπία αυξάνει ξαφνικά με την έναρξη του χάους για r = rc και αυξάνει καθώς το χάος γίνεται ισχυρότερο. Στα “διαλείμματα” χάους η εντροπία πέφτει απότομα και δραστικά. Μπορούμε να διακρίνουμε πως τα διαστήματα αυτά είναι τα ίδια με αυτά που είδαμε στο διά- γραμμα διακλάδωσης (σχήμα 3.4) και στον εκθέτη Liapunov (σχήμα 3.9). Η εντροπία αυξάνεται μέχρι την τιμή r = 4, αλλά αυτό δε γίνε- ται ομαλά. Μεγεθύνοντας περιοχές του διαγράμματος βλέπουμε άπειρο αριθμό από απότομες πτώσεις της εντροπίας σε διαστήματα του r που είναι διαρκώς μικρότερα. 3.7. ΑΣΚΗΣΕΙΣ 195 3.7 Ασκήσεις Πολλά από τα προγράμματα που ζητούνται στις ασκήσεις, θα τα βρείτε μέσα στον υποκατάλογο Problems του συνοδευτικού λογισμικού του κεφαλαίου. 3.1 Να δείξετε ότι οι τροχιές της λογιστικής απεικόνισης για r < 1 μειώνονται εκθετικά με το n για αρκετά μεγάλο n. Να το επιβε- βαιώσετε: (αʹ) Επιλέξτε r = 0.5 και κάνετε τις γραφικές παραστάσεις των τροχιών για x0 = 0.1 − 0.9 με βήμα 0.1 για n = 1, . . . , 1000. Στις γραφικές παραστάσεις να πάρετε τον άξονα y σε λογα- ριθμική κλίμακα. Τι σχήμα έχουν οι καμπύλες που παίρνετε για αρκετά μεγάλο n; (βʹ) Προσαρμόστε τα σημεία xn για n > 20 στη συνάρτηση c e−ax και υπολογίστε τις σταθερές a και c. Πώς εξαρτώνται αυτές από το αρχικό σημείο x0 ; Με το gnuplot αυτό μπορεί να γίνει λ.χ. με τις εντολές: gnuplot > ! gfortran logistic . f90 −o l gnuplot > a = 0 . 7 ; c = 0 . 4 ; gnuplot > f i t [ 1 0 : ] c * exp(−a * x ) \ ”<echo 1000 0.5 0 . 5 | . / l ; c a t l o g . dat ” via a , c gnuplot > p l o t c * exp(−a * x ) ,\ ”<echo 1000 0.5 0 . 5 | . / l ; c a t l o g . dat ” w l Παραπάνω θέσαμε NSTEPS = 1000, r = 0.5, x0 = 0.5. Θέ- τοντας τα όρια [10:] στην εντολή fit, προσαρμόζουμε μόνο στα σημεία xn ≥ 10, αποφεύγοντας έτσι τη μεταβατική πε- ρίοδο και την απόκλιση από την εκθετική συμπεριφορά για μικρά n. (γʹ) Επαναλάβατε για r = 0.3 − 0.9 με βήμα 0.1, καθώς και για r = 0.99, 0.999. Προσοχή, καθώς το r πλησιάζει τη μονάδα θα χρειαστεί να πετάξετε περισσότερα αρχικά σημεία για μια καλή προσαρμογή και πιθανώς να αυξήσετε το NSTEPS. Ελέγ- χετε πάντα γραφικά αν η εκθετική συνάρτηση που υπολογί- ζετε ταιριάζει με τα σημεία xn για μεγάλα n. Φτιάξτε ένα πίνακα με τον εκθέτη a ως συνάρτηση του r. Οι λύσεις της εξίσωσης (3.3) είναι e(r−1)x . Τι συμπεραίνετε από τις τιμές που υπολογίσατε στον πίνακα που φτιάξατε; 196 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ 3.2 Μελετήστε τη λογιστική απεικόνιση για r = 2. Για NSTEPS=100, υπολογίστε τις τροχιές που παίρνετε για x0=0.2, 0.3, 0.5, 0.7, 0.9 και κάντε τις γραφικές τους παραστάσεις στο ίδιο γράφημα. Υπολογίστε το σταθερό σημείο x∗2 και συγκρίνετε με την αναμενό- μενη τιμή 1 − 1/r. Επαναλάβατε για x0= 10−α για α = −1, −2, −5, −10, −20, −25. Τι συμπεραίνετε για το σημείο x∗1 = 0; 3.3 Μελετήστε τη λογιστική απεικόνιση για r = 2.9, 2.99, 2.999. Υπο- λογίστε το σταθερό σημείο x∗2 και συγκρίνετε με την αναμενόμενη τιμή 1 − 1/r. Πόσο μεγάλο NSTEPS πρέπει να πάρετε κάθε φορά. Μπορείτε να επιλέξετε x0=0.3. 3.4 Μελετήστε τη λογιστική απεικόνιση για r = 3.2. Πάρτε x0=0.3, 0.5, 0.9 και NSTEPS=300 και κάντε τις γραφικές παραστάσεις των τροχιών που προκύπτουν. Υπολογίστε τα σταθερά σημεία x∗3 και x∗4 με την εντολή tail log.dat. Αυξήστε το NSTEPS και επαναλάβετε για να βεβαιωθείτε πως η τροχιά έχει συγκλίνει στον 2-κύκλο. Συγκρίνετε τις τιμές τους με τη σχέση (3.18). Για x0=0.3 κάντε τη γραφική παράσταση και με τους εξής τρόπους: gnuplot > p l o t \ ”<echo 300 3.2 0 . 3 | . / l ; awk ’NR%2==0’ l o g . dat ” w l gnuplot > r e p l o t \ ”<echo 300 3.2 0 . 3 | . / l ; awk ’NR%2==1’ l o g . dat ” w l Τι προκύπτει; 3.5 Επαναλάβατε την προηγούμενη άσκηση για r = 3.4494. Πόσο με- γάλο NSTEPS πρέπει να πάρετε, ώστε να υπολογίσετε τα x∗3 και x∗4 με ακρίβεια 6 δεκαδικών ψηφίων; 3.6 Επαναλάβατε την προηγούμενη άσκηση για r = 3.5 και 3.55. Επι- λέξτε NSTEPS=1000, x0=0.5. Δείξτε ότι οι τροχιές ακολουθούν 4- κύκλο και 8-κύκλο αντίστοιχα. Υπολογίστε τα σημεία x∗5 -x∗8 και x∗9 -x∗16 . 3.7 Κάνετε τη γραφική παράσταση των συναρτήσεων f (x), f (2) (x), f (4) (x), x για τη λογιστική απεικόνιση για δεδομένο r στο ίδιο σχήμα. Χρησιμοποιείστε τις εντολές: gnuplot > s e t samples 1000 gnuplot > f ( x ) = r * x*(1 −x ) gnuplot > r =1; p l o t [ 0 : 1 ] x , f ( x ) , f ( f ( x ) ) , f ( f ( f ( f ( x ) ) ) ) 3.7. ΑΣΚΗΣΕΙΣ 197 Η εντολή r=1 √ καθορίζει την τιμή του r. Πάρτε διαδοχικά r = 2.5, 3, 3.2, 1 + 6, 3.5. Από τις τομές των καμπύλων με τη διαγώνιο, προσδιορίστε τα σταθερά σημεία και τα σημεία των k-κύκλων. 3.8 Να φτιάξετε τα cobweb plots των σχημάτων 3.2 και 3.4 για r = 2.8, 3.3 και 3.5. Να επαναλάβετε απορρίπτοντας διαδοχικά από το σχήμα όλο και περισσότερα από τα πρώτα σημεία των τροχιών μέχρι να προκύψουν μόνο τα σημεία των k-κύκλων. Κάνετε το ίδιο για r = 3.55. 3.9 Να φτιάξετε και τα δύο διαγράμματα διακλάδωσης του σχήματος 3.4. 3.10 Να φτιάξετε το διάγραμμα διακλάδωσης για 3.840 < r < 3.851 και για 0.458 < x < 0.523. Με μεγέθυνσή της κατάλληλης περιοχής του διαγράμματος, προσδιορίστε τα τέσσερα πρώτα σημεία διακλάδω- σης με ακρίβεια 5 σημαντικών ψηφίων. Να πάρετε NTRANS=15000. 3.11 Να φτιάξετε το διάγραμμα διακλάδωσης για 2.9 < r < 3.57. Υπο- (n) λογίστε γραφικά τα σημεία διακλάδωσης rc για n = 2, 3, 4, 5, 6, 7, 8. Βεβαιωθείτε ότι τα αποτελέσματά σας είναι σταθερά ως προς τη μεταβολή των παραμέτρων NTRANS, NSTEPS καθώς και από την επιλογή του κλάδου που επιλέγετε να μεγεθύνετε Από τις τιμές (n) των rc που γνωρίζετε για n = 2, 3, και από την ευαισθησία των τιμών από τις παραπάνω επιλογές, εκτιμήστε την ακρίβεια που πετυχαίνετε με τη γραφική αυτή μέθοδο. Υπολογίστε τους λόγους (n) (n−1) (n+1) (n) (rc − rc )/(rc − rc ) και συγκρίνετε τα αποτελέσματά σας με τη σχέση (3.20). 3.12 Επιλέξτε τιμές του ρ στην (3.24), έτσι ώστε να έχετε μόνο ένα ενεργειακό επίπεδο, για το οποίο και να προσδιορίσετε την τιμή του ϵ. Πότε έχουμε τρία ενεργειακά επίπεδα; 3.13 Δίνεται το πολυώνυμο g(x) = x3 − 2x2 − 11x + 12. Να βρείτε τις ρί- ζες του πολυωνύμου που παίρνετε με τη μέθοδο Newton-Raphson αν επιλέξετε x0 = 2.35287527, 2.35284172, 2.35283735, 2.352836327, 2.352836323. Τι συμπεραίνετε σχετικά με τις περιοχές ελκυσμού των ριζών του πολυωνύμου; Αφού κάνετε τη γραφική παράσταση του πολυωνύμου, δοκιμάστε και άλλα αρχικά σημεία που θα σας δώσουν κάθε μία από τις ρίζες. 3.14 Υπολογίστε με τη μέθοδο Newton-Raphson τα σημεία του 4-κύκλου x∗5 , . . . , x∗8 της λογιστικής απεικόνισης. Χρησιμοποιήστε το διάγραμμα 198 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ (n) (n) n rc n rc 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 rc = 3.56994567 . . . (n) Πίνακας 3.1: Οι τιμές rc για τη λογιστική απεικόνιση όπως υπολογίζονται στην (∞) άσκηση 17. Την τιμή rc ≡ rc την παίρνουμε από τη βιβλιογραφία. διακλάδωσης μεγεθύνοντας τις κατάλληλες περιοχές έτσι ώστε να επιλέξετε κατάλληλα αρχικά σημεία για τις επαναλήψεις της με- (4) θόδου. Να ελέγξετε αν οι τιμές του rc που θα υπολογιστούν είναι ίδιες για κάθε x∗α . Ρυθμίστε τις παραμέτρους στο πρόγραμμα, έτσι ώστε να βελτιώσετε την ακρίβεια στις μετρήσεις σας. 3.15 Να επαναλάβετε την προηγούμενη άσκηση για τα σημεία του 8- κύκλου x∗9 , . . . , x∗16 και την τιμή rc της λογιστικής απεικόνισης. (5) 3.16 Να επαναλάβετε την προηγούμενη άσκηση για τα σημεία του 16- κύκλου x∗17 , . . . , x∗32 και την τιμή rc της λογιστικής απεικόνισης. (6) (n) 3.17 Να υπολογίσετε τα κρίσιμα σημεία rc για n = 3, . . . , 17 της λογι- στικής απεικόνισης με τη μέθοδο Newton-Raphson. Για να το κά- νετε αυτό θα πρέπει να εντοπίσετε προσεκτικά από το διάγραμμα διακλάδωσης τα σημεία διακλάδωσης και να επιλέξετε τα αρχικά σημεία στη μέθοδο Newton-Raphson από τα σημεία που θα υπολο- γίσετε γραφικά. Θα πρέπει το πρόγραμμα bifurcationPoints.f90 να διαβάζει τις παραμέτρους eps, epsx, epsr από το stdin, ώστε να μπορέσετε να τις ρυθμίζετε, καθώς αυξάνεται το n. Αν αυτές οι παράμετροι είναι πολύ μικρές, θα έχετε αστάθεια, ενώ αν είναι μεγάλες, θα έχετε συστηματικά σφάλματα. Με αυτόν τον τρόπο προσπαθήστε να αναπαράγετε τον πίνακα 3.1 3.18 Από τα αποτελέσματα που δίνονται στον πίνακα 3.1 υπολογί- (n) (n+1) στε τους λόγους ∆rc /∆rc που δίνονται στη σχέση 3.20 και 3.7. ΑΣΚΗΣΕΙΣ 199 από αυτούς δείτε με πόση ακρίβεια μπορείτε να υπολογίσετε τον αριθμό του Feigenbaum. 3.19 Εκτιμήστε τον αριθμό του Feigenbaum δ και την κρίσιμη τιμή rc υποθέτοντας από τη σχέση (3.20) ότι για αρκετά μεγάλο n rc ≈ rc − Cδ −n . Προσαρμόστε τα δεδομένα του πίνακα 3.1 στη (n) συνάρτηση αυτή και υπολογίστε έτσι τα δ και rc . Στο σχήμα 3.13 επιβεβαιώνεται η υπόθεση μας και φαίνεται η εκθετική σύγκλιση (n) των rc στην τιμή rc . Να φτιάξετε το ίδιο σχήμα με τις παραμέ- τρους που θα υπολογίσετε. Υπόδειξη: Μπορείτε από το gnuplot να δώσετε τις εντολές: gnuplot > nmin =2; nmax =17 gnuplot > r ( x )= rc−c * d **( − x ) gnuplot > f i t [ nmin : nmax ] r ( x ) ” r c r i t ” u 1 : 2 via rc , c , d gnuplot > plot ” r c r i t ” , r(x) gnuplot > p r i n t rc , d όπου στο αρχείο rcrit έχετε αποθηκεύσει τις τιμές του πίνακα 3.1. Μεταβάλετε τις τιμές των nmin, nmax και επαναλάβετε μέ- χρι να πάρετε σταθερές τιμές και ικανοποιητική προσαρμογή στα δεδομένα. 1 -n Cδ 0.01 0.0001 rc(n) - rc 1e-06 1e-08 1e-10 1e-12 2 4 6 8 10 12 14 16 18 n Σχήμα 3.13: Επιβεβαίωση της σχέσης rc ≈ rc − Cδ −n που εξετάζεται στην άσκηση (n) 17. Οι τιμές των παραμέτρων στο σχήμα είναι περίπου rc = 3.5699457, δ = 4.669196 και C = 12.292. 200 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ 3.20 Να υπολογίσετε τα 3 πρώτα σημεία √ διακλάδωσης μετά την εμφά- νιση του 3-κύκλου για r = 1 + 8 με τη μέθοδο Newton-Raphson. Να επιλέξετε ένα σημείο διακλάδωσης του 3-κύκλου, ένα του 6- κύκλου και ένα του 12-κύκλου και να μεγεθύνετε το διάγραμμα διακλάδωσης στην περιοχή τους. 3.21 Θεωρήστε την απεικόνιση που περιγράφει την εξέλιξη ενός πλη- θυσμού xn+1 = p(xn ) = xn er(1−xn ) . (3.38) (αʹ) Να κάνετε τη γραφική παράσταση των συναρτήσεων x, p(x), p(2) (x), p(4) (x) για r = 1.8, 2, 2.6, 2.67, 2.689 για 0 < x < 8. Για ποιες τιμές του r περιμένετε να πάρετε σταθερούς k-κύκλους; (βʹ) Για τις ίδιες τιμές του r παραστήστε γραφικά τροχιές με αρ- χικά σημεία x0 = 0.2, 0.5, 0.7. Για κάθε r να φτιάξετε μία γρα- φική παράσταση. (γʹ) Με τη μέθοδο Newton-Raphson να εντοπίσετε τα σημεία rc (n) για n = 3, 4, 5 καθώς και τα δύο πρώτα σημεία διακλάδωσης του 3-κύκλου. (δʹ) Να φτιάξετε το διάγραμμα διακλάδωσης για 1.8 < r < 4. Να εντοπίσετε το σημείο έναρξης χάους καθώς και το σημείο έναρξης του 3-κύκλου και να τα μεγεθύνετε γύρω από ένα κλάδο που θα επιλέξετε. (εʹ) Να εκτιμήσετε τον αριθμό δ του Feigenbaum όπως στην άσκηση 17. Είναι συμβατό το αποτέλεσμά σας με την παγκοσμιότητα του αριθμού αυτού; Είναι η τιμή του rc ίδια με αυτή της λο- γιστικής εξίσωσης; 3.22 Θεωρήστε την απεικόνιση (sine map): xn+1 = s(xn ) = r sin(πxn ) . (3.39) (αʹ) Να κάνετε τη γραφική παράσταση των συναρτήσεων x, s(x), s(2) (x), s(4) (x), s(8) (x) για r = 0.65, 0.75, 0.84, 0.86, 0.88. Για ποιες τιμές του r περιμένετε να πάρετε σταθερούς k-κύκλους; (βʹ) Για τις ίδιες τιμές του r να παραστήστε γραφικά τροχιές με αρχικά σημεία x0 = 0.2, 0.5, 0.7. Για κάθε r να φτιάξετε μία γραφική παράσταση. (n) (γʹ) Με τη μέθοδο Newton-Raphson να εντοπίσετε τα σημεία rc για n = 3, 4, 5, καθώς και τα δύο πρώτα σημεία διακλάδωσης του 3-κύκλου. 3.7. ΑΣΚΗΣΕΙΣ 201 (δʹ) Να φτιάξετε το διάγραμμα διακλάδωσης για 0.6 < r < 1. Μέσα σε ποια όρια κινούνται οι τιμές του x; Επαναλάβατε για 0.6 < r < 2. Τι παρατηρείτε; Να εντοπίσετε το σημείο έναρξης χάους, καθώς και το σημείο έναρξης του 3-κύκλου και να τα μεγεθύνετε γύρω από ένα κλάδο που θα επιλέξετε. 3.23 Θεωρήστε την απεικόνιση: xn+1 = 1 − rx2n . (3.40) (αʹ) Να φτιάξετε το διάγραμμα διακλάδωσης για 0 < r < 2. Μέσα σε ποια όρια κινούνται οι τιμές του x; Να εντοπίσετε το σημείο έναρξης χάους, καθώς και το σημείο έναρξης του 3- κύκλου και να τα μεγεθύνετε γύρω από ένα κλάδο που θα επιλέξετε. (n) (βʹ) Με τη μέθοδο Newton-Raphson να εντοπίσετε τα σημεία rc για n = 3, 4, 5, καθώς και τα δύο πρώτα σημεία διακλάδωσης του 3-κύκλου. 3.24 Θεωρήστε την απεικόνιση (tent map): { rxn 0 ≤ xn ≤ 12 xn+1 = r min{xn , 1 − xn } = . (3.41) r(1 − xn ) 12 < xn ≤ 1 Να φτιάξετε το διάγραμμα διακλάδωσης για 0 < r < 2. Μέσα σε ποια όρια κινούνται οι τιμές του x; Στο ίδιο διάγραμμα να παραστήστε γραφικά τις συναρτήσεις r/2, r − r2 /2. Μεγεθύνετε την περιοχή του διαγράμματος για 1.407 < r < 1.416 και 0.580 < x < 0.588. Σε ποιο σημείο τα δύο μη συνεκτικά δια- στήματα μέσα στα οποία παίρνουν τιμές τα xn συγχωνεύονται σε ένα; Στη συνέχεια μεγεθύνετε τα διαστήματα 1.0 < r < 1.1, 0.4998 < x < 0.5004 και 1.00 < r < 1.03, 0.4999998 < x < 0.5000003 και εντοπίστε τα σημεία συγχώνευσης δύο μη συνεκτικών διαστη- μάτων μέσα στα οποία παίρνουν τιμές τα xn . 3.25 Θεωρήστε την απεικόνιση (gauss map ή mouse map): xn+1 = e−rxn + q . 2 (3.42) Να φτιάξετε το διάγραμμα διακλάδωσης για −1 < q < 1 και r = 4.5, 4.9, 7.5. Να κάνετε το πρόγραμμα υπολογισμού του διαγράμ- ματος να παίρνει ως αρχικό σημείο της νέας τροχιάς το τελευταίο 202 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ της προηγούμενης και να επιλέξετε x0 = 0 για q = −1. Επαναλά- βατε με x0 = 0.7, 0.5, −0.7. Τι παρατηρείτε; Παρατηρήστε ότι, κα- θώς αυξάνει το q, έχουμε διακλαδώσεις και “αντι-διακλαδώσεις”. 3.26 Θεωρήστε την απεικόνιση (circle map): xn+1 = [xn + r − q sin(2πxn )] mod 1 . (3.43) (Προσοχή στο πρόγραμμα, οι τιμές του 0 ≤ xn < 1). Να φτιάξετε το διάγραμμα διακλάδωσης για 0 < q < 2 και r = 1/3. 3.27 Χρησιμοποιήστε το πρόγραμμα liapunov.f90 για να υπολογίσετε την απόσταση δύο τροχιών της λογιστικής απεικόνισης με r = 3.6 οι οποίες αρχικά απέχουν ∆x0 = 10−15 . Επιλέξτε x0 = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 0.999 και υπολογίστε τον εκ- θέτη Liapunov με προσαρμογή ευθείας γραμμής στα κατάλληλα διαστήματα. Υπολογίστε τη μέση τιμή τους και το σφάλμα της μέσης τιμής. 3.28 Υπολογίστε τον εκθέτη Liapunov για r = 3.58, 3.60, 3.65, 3.70, 3.80 και με τους δύο τρόπους που αναπτύσσονται στο κείμενο. Χρησιμοποιήστε τουλάχιστον 5 διαφορετικά αρχικά σημεία και υπολογίστε τη μέση τιμή τους και το σφάλμα της μέσης τιμής. Συγκρίνετε τις τιμές που παίρνετε για το λ και σχολιάστε. (n) 3.29 Υπολογίστε αριθμητικά την κρίσιμη τιμή rc που είναι το όριο limn→∞ rc για τη λογιστική εξίσωση με ακρίβεια 9 δεκαδικών ψηφίων. Χρη- σιμοποιήστε τον υπολογισμό του εκθέτη Liapunov λ που δίνεται από τη σχέση (3.35). 3.30 Υπολογίστε αριθμητικά τις κρίσιμες τιμές του r της λογιστικής εξίσωσης στις οποίες (α) εισερχόμαστε στον σταθερό 3-κύκλο, (β) επανέρχεται η χαοτική συμπεριφορά μετά από τις διακλαδώσεις του 3-κύκλου. Κάνετε τον υπολογισμό με τη βοήθεια του εκθέτη Liapunov και επιβεβαιώστε τα αποτελέσματά σας συγκρίνοντάς με το διάγραμμα διακλάδωσης. 3.31 Υπολογίστε τον εκθέτη Liapunov με τη βοήθεια της σχέσης (3.35) 3.7. ΑΣΚΗΣΕΙΣ 203 για τις ακόλουθες απεικονίσεις: xn+1 = xn er(1−xn ) , 1.8 < r < 4 xn+1 = r sin(πxn ) , 0.6 < r < 1 xn+1 = 1 − rx2n , 0<r<2 xn+1 = e−rxn + q , 2 r = 7.5, −1 < q < 1 [ ] 1 xn+1 = xn + − q sin(2πxn ) mod 1 , 0 < q < 2 ,(3.44) 3 και να φτιάξετε τα ανάλογα σχήματα με το 3.9. Να αντιπαραθέ- σετε τα σχήματα που θα φτιάξετε με τα αντίστοιχα διαγράμματα διακλάδωσης (μπορείτε να βάλετε και τα δύο στο ίδιο σχήμα). Στη gauss map (xn+1 = e−rxn + q) να κάνετε τον υπολογισμό για δύο 2 αρχικά σημεία x0 = 0, 0.2 και να παρατηρήσετε τη διαφορά. Στη circle map (xn+1 = [xn + 1/3 − q sin(2πxn )] mod 1) να μελετήσετε ιδιαίτερα την περιοχή 0 < q < 0.15. 3.32 Αφού αναπαράγετε τα σχήματα 3.10, 3.11 και 3.12, να υπολογίσετε τη συνάρτηση p(x) για r = 3.68, 3.80, 3.93 και 3.98. Να συζητήσετε σε ποια σημεία έχετε ισχυρότερη χαοτική συμπεριφορά από τις p(x) και από τις αντίστοιχες τιμές της εντροπίας. Στη συνέχεια, να υπολογίσετε την εντροπία μέσα στο διάστημα r ∈ (3.95, 4.00) παίρνοντας RSTEPS=2000 και να εκτιμήσετε τις τιμές του r μέσα στο διάστημα αυτό που έχουμε είσοδο και έξοδο από το χάος. Συγκρίνετε τα αποτελέσματά σας με τον αντίστοιχο υπολογισμό που θα κάνετε για τον εκθέτη Liapunov. 3.33 Θεωρήστε την απεικόνιση (Hénon map): xn+1 = yn + 1 − ax2n yn+1 = bxn (3.45) (αʹ) Φτιάξτε τα δύο διαγράμματα διακλάδωσης για τις τιμές xn , yn για b = 0.3, 1.0 < a < 1.5. Ελέγξτε αν οι τιμές a = 1.01, 1.4 που θα χρησιμοποιήσουμε παρακάτω αντιστοιχούν σε σταθερές περιοδικές τροχιές ή χαοτική συμπεριφορά. (βʹ) Γράψτε ένα πρόγραμμα attractor.f90 που θα παίρνει NINIT = NL × NL αρχικές συνθήκες (x0 (i), y0 (i)) i = 1, . . . ,NL πάνω σε ένα NL×NL πλέγμα τιμών στο τετράγωνο xm ≤ x0 ≤ xM , ym ≤ y0 ≤ yM . Κάθε ένα από τα σημεία (x0 (i), y0 (i)) θα εξε- λίσσεται σύμφωνα με τη σχέση (3.45) για n = NSTEPS βήματα. 204 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ Το πρόγραμμα τότε θα εκτυπώνει τα σημεία (xn (i), yn (i)) στο stdout. Επιλέξτε xm = ym = 0.6, xM = yM = 0.8, NL= 200. (γʹ) Επιλέξτε a = 1.01, b = 0.3 και φτιάξτε στο ίδιο σχήμα τη γραφική παράσταση των σημείων (xn (i), yn (i)) για n = 0, 1, 2, 3, 10, 20, 30, 40, 60, 1000. (δʹ) Επιλέξτε a = 1.4, b = 0.3 και φτιάξτε στο ίδιο σχήμα τη γρα- φική παράσταση των σημείων (xn (i), yn (i)) για n = 0, . . . , 7. (εʹ) Επιλέξτε a = 1.4, b = 0.3 και φτιάξτε στο ίδιο σχήμα τη γραφική παράσταση των σημείων (xn (i), yn (i)) για n = 999. Παρατηρήστε τον παράξενο ελκυστή Hénon (Hénon strange attractor) και τις fractal ιδιότητές του. Αυτή χαρακτηρίζεται από διάσταση Hausdorff¹² dH = 1.261 ± 0.003. Μεγεθύνετε τις περιοχές {(x, y)| −1.290 < x < −1.270, 0.378 < y < 0.384} , {(x, y)| 1.150 < x < −1.130, 0.366 < y < 0.372} , {(x, y)| 0.108 < x < 0.114, 0.238 < y < 0.241} , {(x, y)| 0.300 < x < 0.320, 0.204 < y < 0.213} , {(x, y)| 1.076 < x < 1.084, 0.090 < y < 0.096} , {(x, y)| 1.216 < x < 1.226, 0.032 < y < 0.034} . 3.34 Θεωρήστε την απεικόνιση (Duffing map): xn+1 = yn yn+1 = −bxn + ayn − yn3 . (3.46) (αʹ) Φτιάξτε τα δύο διαγράμματα διακλάδωσης για τις τιμές xn , yn για b = 0.3, 0 <√a < 2.78. √ Επιλέξτε τέσσερις αρχικές συνθήκες (x0 , y0 ) = (±1/ 2, ±1/ 2). Τι παρατηρείτε; (βʹ) Χρησιμοποιήστε κατάλληλα το πρόγραμμα attractor.f90 της άσκησης 33 για να μελετήσετε τον ελκυστή της απεικόνισης για b = 0.3, a = 2.75. 3.35 Θεωρήστε την απεικόνιση (Tinkerbell map): xn+1 = x2n − yn2 + axn + byn yn+1 = 2xn yn + cxn + dyn . (3.47) ¹²D.A. Russel, J.D. Hanson, and E. Ott, “Dimension of strange attractors”, Phys. Rev. Lett. 45 (1980) 1175. Δείτε και λήμμα “Hausdorff dimension” στη Wikipedia. 3.7. ΑΣΚΗΣΕΙΣ 205 (αʹ) Επιλέξτε a = 0.9, b = −0.6013, c = 2.0, d = 0.50. Απεικο- νίστε μια τροχιά στο επίπεδο κάνοντας τη γραφική παρά- σταση των σημείων (xn , yn ) για n = 0, . . . , 10 000 με (x0 , y0 ) = (−0.72, −0.64). (βʹ) Χρησιμοποιήστε κατάλληλα το πρόγραμμα attractor.f90 της άσκησης 33 για να μελετήσετε τον ελκυστή της απεικόνισης για τις τιμές των παραμέτρων a, b, c, d που δίνονται πα- ραπάνω. Επιλέξτε xm = −0.68, xM = −0.76, ym = −0.60, yM = −0.68, n = 10 000. (γʹ) Επαναλάβατε το προηγούμενο υποερώτημα αλλάζοντας το d = 0.27. 206 ΚΕΦΑΛΑΙΟ 3. Η ΛΟΓΙΣΤΙΚΗ ΑΠΕΙΚΟΝΙΣΗ ΚΕΦΑΛΑΙΟ 4 Κίνηση Σωματιδίου Στο κεφάλαιο αυτό μελετάται αριθμητικά η επίλυση των κλασικών εξι- σώσεων κίνησης μονοδιάστατων μηχανικών συστημάτων, όπως λ.χ. αυτή του σημειακού σωματιδίου σε μια ευθεία, του απλού εκκρεμούς κλπ. Γίνεται εισαγωγή σε μεθόδους αριθμητικής ολοκλήρωσης διαφορικών εξισώσεων με αρχικές συνθήκες και ιδιαίτερα στη μέθοδο Runge–Kutta 4ης τάξης. Τέλος, μελετώνται τα συστήματα του αρμονικού ταλαντωτή και του απλού εκκρεμούς με απόσβεση και οδήγηση από εξωτερική χρονοεξαρτημένη δύναμη. Το τελευταίο σύστημα είναι μη γραμμικό και γίνεται μια εισαγωγή στις χαοτικές ιδιότητές του. 4.1 Αριθμητική Ολοκλήρωση Εξισώσεων Νεύ- τωνα Θεωρούμε το πρόβλημα της λύσης των εξισώσεων κίνησης σωματιδίου υπό την επίδραση δυνάμεων που δίνονται από το νόμο του Νεύτωνα. Οι εξισώσεις αυτές μπορούν να γραφτούν υπό τη μορφή d2⃗x = ⃗a(t, ⃗x, ⃗v ) , (4.1) dt2 όπου F⃗ d⃗x ⃗a(t, ⃗x, ⃗v ) ≡ ⃗v = . (4.2) m dt Η κλάση των προβλημάτων που θα συζητήσουμε σε επίπεδο αριθμητικής ανάλυσης είναι προβλήματα αρχικών τιμών, δηλ. επίλυση διαφορικών εξισώσεων για τις οποίες δίνονται οι αρχικές συνθήκες ⃗x(t0 ) = ⃗x0 ⃗v (t0 ) = ⃗v0 , (4.3) 207 208 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ οι οποίες προσδιορίζουν μία μοναδική λύση ⃗x(t). Οι διαφορικές εξισώ- σεις (4.1) είναι δεύτερης τάξης ως προς τις συναρτήσεις ⃗x(t). Για την αριθμητική λύση τους είναι βολικό να ανάγουμε τις εξισώσεις αυτές σε ένα σύστημα από διπλάσιο αριθμό εξισώσεων πρώτου βαθμού: d⃗x d⃗v = ⃗v = ⃗a(t, ⃗x, ⃗v ) . (4.4) dt dt Ειδικά θα ενδιαφερθούμε για την κίνηση σωματιδίου πάνω στην ευθεία (1 διάσταση), οπότε το σύστημα των εξισώσεων γίνεται dx dv =v = a(t, x, v) 1-διάσταση dt dt x(t0 ) = x0 v(t0 ) = v0 , (4.5) καθώς και στο επίπεδο (2 διαστάσεις), οπότε το σύστημα των εξισώ- σεων γίνεται dx dvx = vx = ax (t, x, vx , y, vy ) 2-διαστάσεις dt dt dy dvy = vy = ay (t, x, vx , y, vy ) dt dt x(t0 ) = x0 vx (t0 ) = v0x y(t0 ) = y0 vy (t0 ) = v0y , (4.6) 4.2 Πρελούδιο: Μέθοδοι Euler Για να πάρουμε μια πρώτη γεύση του προβλήματος θα μελετήσουμε το πρόβλημα του εκκρεμούς μήκους l μέσα σε ομογενές πεδίο βαρύτητας g (σχήμα 4.1). Οι εξισώσεις κίνησης δίνονται από το σύστημα των διαφορικών εξισώσεων d2 θ g = − sin θ dt2 l dθ = ω, (4.7) dt που εύκολα ανάγεται στο σύστημα πρώτης τάξης dθ = ω dt dω g = − sin θ , (4.8) dt l 4.2. ΠΡΕΛΟΥΔΙΟ: ΜΕΘΟΔΟΙ EULER 209 θ l 000 111 111 000 000 111 0 1 000 111 0 1 m 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 g Σχήμα 4.1: Το εκκρεμές μήκους l μέσα σε ομογενές πεδίο βαρύτητας g. Το παραπάνω σύστημα πρέπει να γραφτεί σε διακριτή μορφή, έτσι ώστε να επιτευχθεί η αριθμητική του επίλυση με τη βοήθεια υπολογιστή. Ο πιο απλός τρόπος είναι να θεωρήσουμε την ολοκλήρωση του συστήματος από τον αρχικό χρόνο ti = 0 μέχρι τελικό χρόνο tf χωρίζοντας το χρονικό διάστημα tf − ti σε N − 1 ίσα διαστήματα πλάτους¹ ∆t ≡ h, όπου h = (tf − ti )/(N − 1) και προσεγγίζοντας τις παραγώγους από τις σχέσεις (xn+1 − xn )/∆t ≈ x′n : ωn+1 = ωn + αn ∆t θn+1 = θn + ωn ∆t . (4.9) όπου α = −(g/l) sin θ η γωνιακή επιτάχυνση. Η μέθοδος αυτή ακούει στο όνομα “μέθοδος Euler”. Το σφάλμα που εισάγεται από τη μέθοδο σε κάθε βήμα είναι της τάξης του (∆t)2 . Πράγματι, αυτό προκύπτει από απλή ανάπτυξη κατά Taylor γύρω από το σημείο tn αγνοώντας όλους τους όρους από τη δεύτερη παράγωγο και πάνω². Κατά την ολοκλήρωση από ti σε tf , το συνολικό σφάλμα είναι τάξης ∆t! Ο λόγος είναι ότι τα σφάλματα αυτά προστίθενται σε κάθε βήμα και αφού ο αριθμός των βημάτων N ∝ 1/∆t, το συνολικό σφάλμα είναι ∝ (∆t)2 × (1/∆t) = ∆t. Η μέθοδος Euler λέμε ότι είναι μια μέθοδος πρώτης τάξης και ως εκ τούτου έχει περιορισμένη ακρίβεια, ειδικά σε προβλήματα που παρουσιάζουν περιοδικότητα. Η μέθοδος είναι ασύμμετρη, γιατί χρησιμοποιεί για την προώθηση της λύσης πληροφορία για τη συνάρτηση μόνο στην αρχή του ¹Έχουμε N διακριτούς χρόνους ti ≡ t1 , . . . , tN −2 , tN −1 ≡ tf ²Δείτε το Παράρτημα 4.7 για τις λεπτομέρειες. 210 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 0.5 50 100 1000 0.4 10000 50000 80000 0.3 100000 θs(t) 0.2 0.1 θ 0 -0.1 -0.2 -0.3 -0.4 0 1 2 3 4 5 6 7 t Σχήμα 4.2: Σύγκλιση της μεθόδου Euler για το απλό εκκρεμές με περίοδο T ≈ 1.987(ω 2 = 10.0) για διαφορετικές τιμές του βήματος χρόνου ∆t που καθορίζεται από των αριθμό των βημάτων Nt= 50 − 100, 000. Η λύση είναι για θ0 = 0.2, ω0 = 0.0 και συγκρίνεται με τη γνωστή λύση για μικρές γωνίες με α(t) ≈ −(g/l) θ. διαστήματος (t, t + ∆t). Με μια απλή παραλλαγή παίρνουμε τη μέθοδο Euler–Cromer η οποία παρουσιάζει βελτιωμένη συμπεριφορά, αν και αυτή είναι πρώτης τάξης με συνολικό σφάλμα ∝ ∆t. Για το λόγο αυτό, χρησιμοποιούμε για την προώθηση της γωνίας θ την καινούργια τιμή της γωνιακής ταχύτητας ωn+1 = ωn + αn ∆t θn+1 = θn + ωn+1 ∆t . (4.10) Μια μέθοδος που βελτιώνει τους παραπάνω αλγόριθμους ως προς το σφάλμα διακριτοποίησης είναι ο αλγόριθμος Euler–Verlet ο οποίος δίνει ολικό σφάλμα³ ∼ (∆t)2 . Αυτός δίνεται από τις εξισώσεις θn+1 = 2θn − θn−1 + αn (∆t)2 θn+1 − θn−1 ωn = . (4.11) 2∆t Η μέθοδος Euler–Verlet (4.11) είναι μια μέθοδος δύο βημάτων, αφού για την προώθηση της λύσης είναι αναγκαίο να γνωρίζουμε την τιμή της συνάρτησης σε δύο προηγούμενα βήματα. Άρα, πρέπει να καθορίσουμε ³Δείτε το Παράρτημα 4.7 για τις λεπτομέρειες. 4.2. ΠΡΕΛΟΥΔΙΟ: ΜΕΘΟΔΟΙ EULER 211 0.025 50 100 0.02 1000 10000 50000 0.015 80000 100000 θs(t) 0.01 0.005 0 θ -0.005 -0.01 -0.015 -0.02 -0.025 0 1 2 3 4 5 6 7 t Σχήμα 4.3: Σύγκλιση της μεθόδου Euler-Cromer, παρόμοια με το σχήμα 4.2. Παρα- τηρούμε πως η μέθοδος συγκλίνει πολύ γρηγορότερα από την Euler. προσεκτικά τις αρχικές συνθήκες για τα δύο πρώτα βήματα. Για το λόγο αυτό χρησιμοποιούμε τον αλγόριθμο Euler για να προωθήσουμε τις αρχικές συνθήκες ένα βήμα πίσω. Αν θ1 = θ(ti ), ω1 = ω(ti ) είναι οι αρχικές συνθήκες, τότε ορίζουμε 1 θ0 = θ1 − ω1 ∆t + α1 (∆t)2 . (4.12) 2 Επίσης, στο τελευταίο βήμα θα πρέπει να πάρουμε θN − θN −1 ωN = . (4.13) ∆t Παρόλο που η μέθοδος έχει μικρότερο συνολικό σφάλμα από τη μέ- θοδο Euler, το πρόβλημά της είναι ότι είναι ασταθής, όταν το ∆t γίνει αρκετά μικρό. Στη δεύτερη των εξισώσεων (4.11) η γωνιακή ταχύτητα προκύπτει από το λόγο δύο μικρών αριθμών, εκ των οποίων ο αριθ- μητής είναι η διαφορά δύο μεγάλων, σχεδόν ίσων, αριθμών. Για μικρό χρόνο ∆t, η τιμή της διαφοράς αυτής εξαρτάται μόνο από τα τελευταία δεκαδικά ψηφία της αναπαράστασης των αριθμών θn+1 και θn , επειδή ο υπολογιστής έχει πεπερασμένη ακρίβεια στην αναπαράσταση τους και η ακρίβεια στον υπολογισμό του λόγου (θn+1 − θn )/(2∆t) μειώνε- ται μέχρι ο λόγος αυτός να γίνει ακριβώς μηδέν λόγω μηδενισμού του αριθμητή! Στην πρώτη των εξισώσεων (4.11), ο όρος αn ∆t2 είναι μικρό- τερος από τον αντίστοιχο όρο αn ∆t της μεθόδου Euler κατά μία τάξη 212 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 0.025 50 100 0.02 1000 10000 50000 0.015 80000 100000 θs(t) 0.01 0.005 0 θ -0.005 -0.01 -0.015 -0.02 -0.025 0 1 2 3 4 5 6 7 t Σχήμα 4.4: Σύγκλιση της μεθόδου Euler-Verlet, όπως στο σχήμα 4.2. Παρατηρούμε πως η μέθοδος συγκλίνει πολύ γρηγορότερα από την Euler αλλά τα σφάλματα στρογ- γυλοποίησης κάνουν τη μέθοδο άχρηστη για Nt≳ 50, 000 (προσέξτε τι γίνεται για Nt= 100, 000. Γιατί;). ως προς ∆t. Μειώνοντας το ∆t, γρήγορα έχουμε αn ∆t2 ≪ 2θn − θn−1 και η ακρίβεια της μεθόδου εκμηδενίζεται λόγω της πεπερασμένης ακρί- βειας των πραγματικών αριθμών στη μνήμη του υπολογιστή⁴. Όταν οι αριθμοί αn ∆t2 και 2θn − θn−1 διαφέρουν περισσότερο από περίπου επτά τάξεις μεγέθους, η πρόσθεση του πρώτου όρου στο δεύτερο είναι το ίδιο σαν να προσθέταμε μηδέν και η συνεισφορά του όρου της επιτάχυνσης εξαφανίζεται.⁵ Ο προγραμματισμός των μεθόδων αυτών είναι ιδιαίτερα απλός. Γρά- φουμε ένα πρόγραμμα που θα κάνει σύγκριση και των τριών μεθόδων, Euler, Euler-Cromer και Euler-Verlet. Για το λόγο αυτό, το κυρίως πρό- γραμμα είναι απλά ένα interface με το χρήστη και για τους υπολογι- σμούς καλούνται διαφορετικές υπορουτίνες euler, euler_cromer και euler_verlet. Ο χρήστης απλά πρέπει να προγραμματίσει την κοινή σε όλους τους υπολογισμούς συνάρτηση accel(x) που δίνει τη γωνιακή επιτάχυνση συναρτήσει της γωνίας θ (εδώ η μεταβλητή REAL x). Στην ⁴Δείτε παρατήρηση στην υποσημείωση 19 στη σελ. 121. ⁵Αριθμοί τύπου real έχουν προσεγγιστικά 7 σημαντικά δεκαδικά ψηφία. Η ακρί- βεια των παραπάνω υπολογισμών καθορίζεται από τον αριθμό ϵ, που είναι ο μικρότε- ρος θετικός αριθμός, τέτοιος ώστε 1+ϵ > 1. Για μια μεταβλητή x συγκεκριμένου τύπου, ο αριθμός αυτός δίνεται από την intrinsic συνάρτηση Fortran epsilon(x). Για μετα- βλητές τύπου real, ϵ ≈ 1.2 × 10−7 και για μεταβλητές τύπου real(8) ϵ ≈ 2.2 × 10−16 . 4.2. ΠΡΕΛΟΥΔΙΟ: ΜΕΘΟΔΟΙ EULER 213 8 50 100 6 1000 10000 15000 4 18000 20000 100000 2 0 -2 v -4 -6 -8 -10 -12 0 1 2 3 4 5 6 7 t Σχήμα 4.5: Σύγκλιση της μεθόδου Euler για το απλό εκκρεμές όπως στο σχήμα 4.2 αλλά για θ0 = 3.0, ω0 = 0.0. Εδώ δείχνουμε τη συμπεριφορά της γωνιακής ταχύτητας και παρατηρούμε μεγάλη αστάθεια για Nt≲ 1, 000. παράγραφο αυτή παίρνουμε accel(x)= -10.0 * sin(x). Η δομή των δεδομένων είναι πολύ απλή: Σε τρία arrays REAL T(P), X(P) και V(P) αποθηκεύονται αντίστοιχα οι χρόνοι tn , οι γωνιακές θέ- σεις θn και οι γωνιακές ταχύτητες ωn για n = 1, . . . , Nt. Ο χρήστης προσδιορίζει το χρονικό διάστημα της ολοκλήρωσης από ti = 0 σε tf = Tfi, καθώς και τον αριθμό των χρονικών σημείων Nt τα οποία πρέπει να είναι λιγότερα από το μέγεθος P των arrays. Μετά δίνει τις αρχικές συνθήκες θ0 = Xin και ω0 = Vin. Στη συνέχεια, οι υπορουτίνες των μεθόδων καλούνται και στην είσοδο τους παρέχουμε τις αρχικές συνθήκες, το διάστημα ολοκλήρωσης και τον αριθμό χρονικών σημείων Xin,Vin,Tfi,Nt. Στην έξοδο μας παρέχουν τα αποτελέσματα αποθη- κευμένα στα arrays T,X,V. Στη συνέχεια, τα αποτελέσματα τυπώνονται στα αρχεία euler.dat, euler_cromer.dat και euler_verlet.dat. Οι υπορουτίνες υπολογισμού ακολουθούν τη διαδικασία καθορισμού των αρχικών συνθηκών, υπολογισμού του χρόνου ∆t ≡ h = Tfi/(Nt − 1) και εκτελούν τους βρόχους που θα προωθούν τη λύση με βήμα ∆t. Σε κάθε βήμα τα αποτελέσματα αποθηκεύονται στα arrays T,X,V. Έτσι, το τμήμα του κώδικα T ( 1 ) = 0.0 X ( 1 ) = Xin 214 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 8 50 100 1000 6 10000 15000 18000 20000 4 100000 2 0 v -2 -4 -6 -8 0 1 2 3 4 5 6 7 t Σχήμα 4.6: Σύγκλιση της μεθόδου Euler-Cromer, όπως στο σχήμα 4.5. Παρατηρούμε πως η μέθοδος συγκλίνει πολύ γρηγορότερα από την Euler. V ( 1 ) = Vin h = Tfi / ( Nt −1) do i = 2 , Nt T ( i ) = T ( i−1)+h X ( i ) = X ( i−1)+V ( i−1) * h V ( i ) = V ( i−1)+accel ( X ( i−1) ) * h enddo εκτελεί τις απαραίτητες εντολές για τη μέθοδο Euler. Λίγη προσοχή πρέπει να δοθεί στη μέθοδο Euler-Verlet όπου πρέπει να καθοριστούν τα δύο πρώτα βήματα, καθώς και το τελευταίο για την ταχύτητα: T(1) = 0.0 X(1) = Xin V(1) = Vin X0 = X(1) − V ( 1 ) * h + accel ( X ( 1 ) ) *h*h/2.0 T (2) = h X (2) = 2.0* X (1) − X0 + accel ( X ( 1 ) ) *h*h do i = 3 , Nt .............. enddo V ( Nt )= ( X ( Nt )−X ( Nt −1) ) / h Για διευκόλυνση του αναγνώστη παραθέτουμε ολόκληρο το πρόγραμμα παρακάτω: 4.2. ΠΡΕΛΟΥΔΙΟ: ΜΕΘΟΔΟΙ EULER 215 8 50 100 1000 6 10000 15000 18000 20000 4 100000 2 0 v -2 -4 -6 -8 0 1 2 3 4 5 6 7 t Σχήμα 4.7: Σύγκλιση της μεθόδου Euler-Verlet, όπως στο σχήμα 4.5. Παρατηρούμε πως η μέθοδος συγκλίνει πολύ γρηγορότερα από την Euler, αλλά τα σφάλματα στρογγυ- λοποίησης κάνουν τη μέθοδο πολύ γρήγορα ασταθή για Nt≳ 18, 000. ! ========================================================= ! Program t o i n t e g r a t e e q u a t i o n s o f motion f o r a c c e l e r a t i o n s ! which a r e f u n c t i o n s o f x with t h e method o f Euler , ! Euler−Cromer and Euler−V e r l e t . ! The u s e r s e t s i n i t i a l c o n d i t i o n s and t h e s u b r o u t i n e s r e t u r n !X( t ) and V( t )=dX( t ) / dt i n a r r a y s T ( 1 . . Nt ) ,X ( 1 . . Nt ) ,V ( 1 . . Nt ) ! The u s e r p r o v i d e s number o f t i m e s Nt and t h e f i n a l ! time T f i . I n i t i a l time i s assumed t o be t _ i =0 and t h e ! i n t e g r a t i o n s t e p h = T f i / ( Nt −1) ! The u s e r programs a r e a l f u n c t i o n a c c e l ( x ) which g i v e s t h e ! a c c e l e r a t i o n dV( t ) / dt as f u n c t i o n o f X. !NOTE: T ( 1 ) = 0 T( Nt ) = T f i ! ========================================================= program diff_eq_euler i m p l i c i t none i n t e g e r , parameter : : P=110000 ! The s i z e o f t h e a r r a y s r e a l , dimension ( P ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi ! i n i t i a l conditions integer : : Nt , i ! The u s e r p r o v i d e s i n i t i a l c o n d i t i o n s X_0 , V_0 f i n a l time t _ f ! and Nt : p r i n t * , ’ Enter X_0 , V_0 , t _ f , Nt ( t _ i =0) : ’ read ( 5 , * ) Xin , Vin , Tfi , Nt ! This check i s n e c e s s a r y i n order t o avoid memory ! access violations : 216 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ i f ( Nt . ge . P ) then p r i n t * , ’ Nt must be s t r i c t l y l e s s than P . Nt , P= ’ , Nt , P stop endif ! Xin= X( 1 ) , Vin=V( 1 ) , T ( 1 ) =0 and t h e r o u t i n e g i v e s e v o l u t i o n i n ! T ( 2 . . Nt ) , X ( 2 . . Nt ) , V ( 2 . . Nt ) which we p r i n t i n a f i l e c a l l euler ( Xin , Vin , Tfi , Nt , T , X , V ) open ( u n i t =20 , f i l e =” e u l e r . dat ” ) do i =1 , Nt ! Each l i n e i n data f i l e has time , p o s i t i o n , v e l o c i t y : write (20 ,*) T(i) , X(i) , V(i) enddo c l o s e (2 0) ! we c l o s e t h e u n i t t o be reused below !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− !We r e p e a t e v e r y t h i n g f o r each method c a l l euler_cromer ( Xin , Vin , Tfi , Nt , T , X , V ) open ( u n i t =20 , f i l e =” e u l e r _ c r o m e r . dat ” ) do i =1 , Nt write (20 ,*) T(i) , X(i) , V(i) enddo c l o s e (2 0) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− c a l l euler_verlet ( Xin , Vin , Tfi , Nt , T , X , V ) open ( u n i t =20 , f i l e =” e u l e r _ v e r l e t . dat ” ) do i =1 , Nt write (20 ,*) T(i) , X(i) , V(i) enddo c l o s e (2 0) !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− end program diff_eq_euler ! ========================================================= ! Function which r e t u r n s t h e v a l u e o f a c c e l e r a t i o n a t ! p o s i t i o n x used i n t h e i n t e g r a t i o n s u b r o u t i n e s ! e u l e r , e u l e r _ c r o m e r and e u l e r _ v e r l e t ! ========================================================= r e a l f u n c t i o n accel ( x ) i m p l i c i t none real x accel = −10.0* s i n ( x ) end f u n c t i o n accel ! ========================================================= ! D r i v e r r o u t i n e f o r i n t e g r a t i n g e q u a t i o n s o f motion ! using t h e Euler method ! Input : ! Xin=X( 1 ) , Vin=V( 1 ) −− i n i t i a l c o n d i t i o n a t t =0 , ! T f i t h e f i n a l time and Nt t h e number o f t i m e s ! Output : ! The a r r a y s T ( 1 . . Nt ) , X ( 1 . . Nt ) , V ( 1 . . Nt ) which ! g i v e s x ( t _ k )=X( k ) , dx / dt ( t _ k )=V( k ) , t _ k=T( k ) k = 1 . . Nt 4.2. ΠΡΕΛΟΥΔΙΟ: ΜΕΘΟΔΟΙ EULER 217 ! where f o r k=1 we have t h e i n i t i a l c o n d i t i o n . ! ========================================================= s u b r o u t i n e euler ( Xin , Vin , Tfi , Nt , T , X , V ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi integer : : i real : : h , accel ! ** declare the function a c c e l ** ! I n i t i a l c o n d i t i o n s s e t here : T ( 1 ) = 0.0 X ( 1 ) = Xin V ( 1 ) = Vin ! h i s t h e time s t e p Dt h = Tfi / ( Nt −1) do i = 2 , Nt T ( i ) = T ( i−1)+h ! time advances by Dt=h X ( i ) = X ( i−1)+V ( i−1) * h ! advancement and s t o r a g e o f ←- position V ( i ) = V ( i−1)+accel ( X ( i−1) ) * h ! and v e l o c i t y . enddo end s u b r o u t i n e euler ! ========================================================= ! D r i v e r r o u t i n e f o r i n t e g r a t i n g e q u a t i o n s o f motion ! using t h e Euler−Cromer method ! Input : ! Xin=X( 1 ) , Vin=V( 1 ) −− i n i t i a l c o n d i t i o n a t t =0 , ! T f i t h e f i n a l time and Nt t h e number o f t i m e s ! Output : ! The a r r a y s T ( 1 . . Nt ) , X ( 1 . . Nt ) , V ( 1 . . Nt ) which ! g i v e s x ( t _ i )=X( i ) , dx / dt ( t _ i )=V( i ) , t _ i =T( i ) i = 1 . . Nt ! where f o r i =1 we have t h e i n i t i a l c o n d i t i o n . ! ========================================================= s u b r o u t i n e euler_cromer ( Xin , Vin , Tfi , Nt , T , X , V ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi integer : : i real : : h , accel T ( 1 ) = 0.0 X ( 1 ) = Xin V ( 1 ) = Vin h = Tfi / ( Nt −1) do i = 2 , Nt T ( i ) = T ( i−1)+h V ( i ) = V ( i−1)+accel ( X ( i−1) ) * h 218 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ X ( i ) = X ( i−1)+V ( i ) * h ! here i s t h e d i f f e r e n c e compared t o ←- Euler enddo end s u b r o u t i n e euler_cromer ! ========================================================= ! D r i v e r r o u t i n e f o r i n t e g r a t i n g e q u a t i o n s o f motion ! using t h e Euler − V e r l e t method ! Input : ! Xin=X( 1 ) , Vin=V( 1 ) −− i n i t i a l c o n d i t i o n a t t =0 , ! T f i t h e f i n a l time and Nt t h e number o f t i m e s ! Output : ! The a r r a y s T ( 1 . . Nt ) , X ( 1 . . Nt ) , V ( 1 . . Nt ) which ! g i v e s x ( t _ i )=X( i ) , dx / dt ( t _ i )=V( i ) , t _ i =T( i ) i = 1 . . Nt ! where f o r i =1 we have t h e i n i t i a l c o n d i t i o n . ! ========================================================= s u b r o u t i n e euler_verlet ( Xin , Vin , Tfi , Nt , T , X , V ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X , V ! time t , x ( t ) , v ( t )=dx / dt real : : Xin , Vin , Tfi integer : : i real : : h , h2 , X0 , o2h real : : accel ! I n i t i a l c o n d i t i o n s s e t here : T(1) = 0.0 X(1) = Xin V(1) = Vin h = Tfi / ( Nt −1) ! time s t e p h2 = h*h ! time s t e p squared o2h = 0.5/h ! h/2 !We have t o i n i t i a l i z e one more s t e p : X0 c o r r e s po n d s t o ’X( 0 ) ’ X0 = X(1) − V ( 1 ) * h + accel ( X ( 1 ) ) * h2 / 2 . 0 T (2) = h X (2) = 2.0* X (1) − X0 + accel ( X ( 1 ) ) * h2 !Now i s t a r t s from 3 : do i = 3 , Nt T(i) = T ( i−1)+h X(i) = 2 . 0 * X ( i−1) − X ( i−2) + accel ( X ( i−1) ) * h2 V ( i−1) = o2h * ( X ( i )−X ( i−2) ) enddo ! N o t i c e t h a t we have one more s t e p f o r t h e v e l o c i t y : V ( Nt )= ( X ( Nt )−X ( Nt −1) ) / h end s u b r o u t i n e euler_verlet Η μεταγλώττιση και το τρέξιμο του προγράμματος γίνονται με τις εντο- λές: 4.2. ΠΡΕΛΟΥΔΙΟ: ΜΕΘΟΔΟΙ EULER 219 > g f o r t r a n euler . f90 −o euler > . / euler Enter X_0 , V_0 , t_f , Nt ( t_i =0) : 0.2 0.0 6.0 1000 > l s euler * . dat euler_cromer . dat euler . dat euler_verlet . dat > head −n 5 euler . dat 0.000000 0.2000000 0.000000 6.0060062E−03 0.2000000 −1.1932093E−02 1.2012012 E−02 0.1999283 −2.3864185E−02 1.8018018 E−02 0.1997850 −3.5792060E−02 2.4024025E−02 0.1995700 −4.7711499E−02 Η τελευταία εντολή μας δείχνει τις 5 πρώτες γραμμές του αρχείου euler.dat όπου βλέπουμε τις 3 στήλες με το χρόνο, θέση και ταχύ- τητα που δίνει η μέθοδος. Για να δούμε γραφικά τα αποτελέσματα μπορούμε να χρησιμοποιήσουμε το gnuplot. Οι εντολές gnuplot > p l o t ” e u l e r . dat ” using 1 : 2 with lines gnuplot > p l o t ” e u l e r . dat ” using 1 : 3 with lines κάνουν τις γραφικές παραστάσεις των θέσεων και ταχυτήτων αντίστοιχα συναρτήσει του χρόνου. Στην τελευταία, μπορούμε να προσθέσουμε και τα αποτελέσματα των άλλων μεθόδων δίνοντας στη συνέχεια τις εντο- λές: gnuplot > r e p l o t ” e u l e r _ c r o m e r . dat ” using 1 : 3 with lines gnuplot > r e p l o t ” e u l e r _ v e r l e t . dat ” using 1 : 3 with lines Τα αποτελέσματα φαίνονται στα σχήματα 4.2–4.7. Παρατηρούμε ότι η μέθοδος Euler είναι ασταθής εκτός αν πάρουμε το βήμα χρόνου πάρα πολύ μικρό. Η μέθοδος Euler–Cromer έχει καλύτερη συμπεριφορά. Τα αποτελέσματα συγκλίνουν γρήγορα και παραμένουν σταθερά και για μεγάλο αριθμό χρονικών σημείων Nt∼ 100, 000. Η μέθοδος Euler–Verlet συγκλίνει γρήγορα, αλλά σύντομα παρατηρούμε τα σφάλματα συσσώ- ρευσης. Το φαινόμενο αυτό είναι εντονότερο για αρχικές συνθήκες με μεγάλη αρχική γωνιακή απόκλιση, όπως φαίνεται στο σχήμα 4.7. Στα σχήματα 4.2–4.4, όπου η αρχική γωνιακή απόκλιση είναι μικρή, συγκρί- νουμε τη λύση που παίρνουμε με τη λύση για το αρμονικό εκκρεμές 220 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ (sin(θ) ≈ θ): g α(θ) = − θ ≡ −Ω2 θ l θ(t) = θ0 cos(Ωt) + (ω0 /Ω) sin(Ωt) ω(t) = ω0 cos(Ωt) − (θ0 Ω) sin(Ωt) . (4.14) Παρατηρούμε ταύτιση για τις τιμές του ∆t που οι μέθοδοι συγκλίνουν. Με τον τρόπο αυτό ελέγχουμε τον κώδικα ως προς την ορθότητα των αποτελεσμάτων. Για το γράφημα των παραπάνω συναρτήσεων μπο- ρούμε να δώσουμε τις παρακάτω εντολές στο πρόγραμμα gnuplot⁶: gnuplot > s e t dummy t gnuplot > omega2 = 10 gnuplot > X0 = 0.2 gnuplot > V0 = 0.0 gnuplot > omega = s q r t ( omega2 ) gnuplot > x(t) = X0 * c o s ( omega * t ) +( V0 / omega ) * s i n ( omega * t ) gnuplot > v(t) = V0 * c o s ( omega * t ) −(omega * X0 ) * s i n ( omega * t ) gnuplot > plot x(t) , v(t) Η σύγκριση των αποτελεσμάτων με τα θεωρητικά, ιδιαίτερα όταν οι διαφορές δεν διακρίνονται με γυμνό μάτι ή όταν η ποσοτική ανάλυση είναι επιθυμητή, μπορεί να γίνει αναπαριστώντας γραφικά τις διαφο- ρές των αριθμητικά υπολογισμένων τιμών από τις θεωρητικές τιμές. Οι σχετικές γραφικές παραστάσεις γίνονται με τις εντολές: gnuplot > p l o t ” e u l e r . dat ” using 1 : ( $2−x ( $1 ) ) with lines gnuplot > p l o t ” e u l e r . dat ” using 1 : ( $3−v ( $1 ) ) with lines Η εντολή using 1:($2-x($1)) σε απλά ελληνικά λέει “Κάνε τη γρα- φική παράσταση χρησιμοποιώντας στο άξονα των y την τιμή της 2ης στήλης του euler.dat μείον την τιμή της συνάρτησης x(t) για t ίσο με την αντίστοιχη τιμή της πρώτης στήλης”. Με τον τρόπο αυτό (και με μικρή μετατροπή για να υπολογίζουμε την απόλυτη τιμή της διαφοράς) φτιάχνουμε τα σχήματα 4.11-4.14. 4.3 Μέθοδοι Runge–Kutta Στην προηγούμενη παράγραφο είδαμε μία μέθοδο πεπερασμένων δια- φορών ενός βήματος πρώτης τάξης, τη μέθοδο Euler. Αυτό σημαίνει πως ⁶Η εντολή set dummy t κάνει την ανεξάρτητη μεταβλητή στις συναρτήσεις να είναι η t αντί για την προεπιλεγμένη x. 4.3. ΜΕΘΟΔΟΙ RUNGE–KUTTA 221 όταν προσεγγίζουμε την ολοκλήρωση με N διακριτά βήματα από χρόνο ti σε χρόνο tf με βήμα ∆t ≡ h = (tf − ti )/N , το ολικό σφάλμα διακρι- τοποίησης είναι τάξης ∼ O(h). Γεννάται το ερώτημα αν είναι δυνατόν να βρεθεί αλγόριθμος ολοκλήρωσης ο οποίος να κάνει τα σφάλματα να είναι ανώτερης τάξης. Μια κλάση τέτοιων μεθόδων είναι οι μέθοδοι Runge–Kutta. Οι μέθοδοι αυτοί είναι επαγωγικοί ενός βήματος, δηλ. η επόμενη θέση προκύπτει απλά από τη γνώση της προηγούμενης. Σε με- θόδους δύο ή πολλαπλών βημάτων, όπως είναι η μέθοδος Euler–Verlet, η γνώση της επόμενης θέσης απαιτεί να γνωρίζουμε τη θέση του σωμα- τιδίου για δύο ή περισσότερα προηγούμενα βήματα. Η μέθοδος Runge– Kutta τάξης p έχει ολικό σφάλμα ∼ O(hp ). Αυτό σημαίνει ότι σε κάθε βήμα εισάγεται σφάλμα διακριτοποίησης τάξης ∼ O(hp+1 ), αφού τότε το σφάλμα μετά από N = (tf − ti )/∆t βήματα θα είναι τάξης tf − ti 1 ∼ O(hp+1 ) × N = O(hp+1 ) × ∼ O(hp+1 ) × = O(hp ) . (4.15) ∆t h Ας θεωρήσουμε για απλότητα το πρόβλημα με μια άγνωστη συνάρ- τηση x(t) η οποία εξελίσσεται στο χρόνο σύμφωνα με τη διαφορική εξίσωση: dx = f (t, x) . (4.16) dt Ας δούμε πρώτα μία μέθοδο πρώτης τάξης. Η πιο αφελής προσέγ- γιση θα ήταν να προσεγγίσουμε την παράγωγο από την πεπερασμένη διαφορά dx xn+1 − xn ≈ = f (tn , xn ) ⇒ xn+1 = xn + hf (tn , xn ) (4.17) dt ∆t Αναπτύσσοντας κατά Taylor βλέπουμε ότι το σφάλμα σε κάθε βήμα είναι O(h2 ), άρα το σφάλμα για την εξέλιξη από ti → tf είναι O(h). Πράγματι dx xn+1 = x(tn + h) = xn + h (xn ) + O(h2 ) = xn + hf (tn , xn ) + O(h2 ) . (4.18) dt Η γεωμετρία του βήματος φαίνεται στο σχήμα 4.8. Επιλέγεται το σημείο 1 και από εκεί με γραμμική επέκταση στην κατεύθυνση της παραγώγου k1 ≡ f (tn , xn ) προσδιορίζουμε το σημείο xn+1 . Βελτίωση της μεθόδου προκύπτει αν πάρουμε ένα ενδιάμεσο σημείο 2. Αυτή η διαδικασία φαίνεται στο σχήμα 4.9 και έγκειται στο να πά- ρουμε το ενδιάμεσο σημείο 2 στο μέσο του διαστήματος (tn , tn+1 ) με 222 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ x 2 01 1 1 0 tn t n+1 t n+2 t h Σχήμα 4.8: Η γεωμετρία του βήματος της μεθόδου 1ης τάξης που δίνεται από την εξίσωση (4.17). γραμμική προέκταση από το xn χρησιμοποιώντας την κλίση που δίνε- ται από την παράγωγο στο xn k1 ≡ f (tn , xn ). Στη συνέχεια, χρησιμο- ποιούμε ως εκτιμητή της παραγώγου στο διάστημα αυτό την κλίση στο σημείο 2 δηλ. k2 ≡ f (tn+1/2 , xn+1/2 ) = f (tn + h/2, xn + (h/2)k1 ) και τη χρησιμοποιούμε για να προεκτείνουμε γραμμικά από το xn στο xn+1 . Συνοψίζοντας, έχουμε k1 = f (tn , xn ) h h k2 ≡ f (tn + , xn + k1 ) 2 2 xn+1 = xn + hk2 . (4.19) Αυτό που θα δείξουμε είναι ότι παρόλο που χρειάζεται να υπολογίσουμε τη συνάρτηση f δύο φορές σε κάθε βήμα, διπλασιάζοντας ουσιαστικά τον υπολογιστικό χρόνο, το σφάλμα στο βήμα (4.19) είναι O(h3 ), άρα το συνολικό σφάλμα είναι O(h2 ), οπότε αναγκαστικά η (4.19) θα υπερ- τερήσει της (4.17) σε ακρίβεια, ακόμα και αν συγκριθούν σε δεδομένο υπολογιστικό χρόνο, δηλ. η (4.19) σε βήμα h και η (4.17) σε h/2.⁷ ⁷Όπως φαίνεται στην πράξη, η (4.17) πάσχει και από προβλήματα σταθερότητας περισσότερο από την (4.19) οπότε συνίσταται να αποφεύγεται. 4.3. ΜΕΘΟΔΟΙ RUNGE–KUTTA 223 x 3 2 k2 01 1 01k 1 tn t n+1/2 t n+1 t h/2 h/2 Σχήμα 4.9: Η γεωμετρία του βήματος της μεθόδου 2ης τάξης που δίνεται από την εξίσωση (4.19). Η βελτίωση γίνεται περισσότερο αισθητή με τη μέθοδο Runge–Kutta 4ης τάξης. Στην περίπτωση αυτή έχουμε 4 υπολογισμούς της συνάρ- τησης f , αλλά το συνολικό σφάλμα είναι τώρα O(h4 ), οπότε για τους ίδιους λόγους η μέθοδος θα υπερτερήσει τελικά σε ακρίβεια της (4.19)⁸. Η διαδικασία που θα ακολουθήσουμε εξηγείται γεωμετρικά στο σχήμα 4.10. Χρησιμοποιούμε τώρα 3 ενδιάμεσα σημεία για την προώθηση από το xn στο xn+1 . Αρχικά χρησιμοποιώντας την κλίση που δίνεται από την παράγωγο στο xn k1 ≡ f (tn , xn ), βρίσκουμε το ενδιάμεσο σημείο 2 στο μέσο του διαστήματος (tn , tn+1 = tn + h) δηλ. x2 = xn + (h/2)k1 . Υπολογίζουμε την παράγωγο της συνάρτησης στο σημείο 2 δηλ. k2 ≡ f (tn + h/2, xn + (h/2)k1 ) και τη χρησιμοποιούμε για να προεκτείνουμε γραμμικά από το xn στο ενδιάμεσο σημείο 3, πάλι στο μέσο του διαστή- ματος (tn , tn+1 ), δηλ. x3 = xn + (h/2)k2 . Υπολογίζουμε την παράγωγο της συνάρτησης k3 ≡ f (tn + h/2, xn + (h/2)k2 ) και τη χρησιμοποιούμε για να προεκτείνουμε προς το σημείο 4, το οποίο τώρα το παίρνουμε στο άκρο του διαστήματος δηλ. με t4 = tn + h, οπότε παίρνουμε x4 = xn + hk3 . Κά- νουμε ένα τέταρτο υπολογισμό της παραγώγου k4 ≡ f (tn + h, xn + hk3 ) ⁸Πάντα; Χμμμμμ, όχι πάντα! Μεγαλύτερης τάξης δεν σημαίνει αναγκαστικά και μεγαλύτερης ακρίβειας, αν και τις περισσότερες φορές αυτό είναι σωστό. 224 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ x 2 k2 01 k4 1 4 1k 0 1 3 k3 tn t n+1/2 t n+1 t h/2 h/2 Σχήμα 4.10: Η γεωμετρία του βήματος της μεθόδου 4ης τάξης που δίνεται από την εξίσωση (4.20). και χρησιμοποιούμε και τις 4 παραγώγους k1 , k2 , k3 και k4 ως εκτιμητές της παραγώγου της συνάρτησης. Εκείνο που έδειξαν οι Runge–Kutta είναι ότι το σφάλμα διακριτοποίησης σε κάθε βήμα στην προώθηση της συνάρτησης γίνεται O(h5 ), αν πάρουμε: k1 = f (tn , xn ) h h k2 = f (tn + , xn + k1 ) 2 2 h h k3 = f (tn + , xn + k2 ) 2 2 k4 = f (tn + h, xn + h k3 ) h xn+1 = xn + (k1 + 2k2 + 2k3 + k4 ) . (4.20) 6 Ο δεύτερος όρος στην τελευταία εξίσωση είναι ένας μέσος όρος των 4 παραγώγων με το κατάλληλο βάρος, ώστε να πετύχουμε την εξουδετέ- ρωση των σφαλμάτων μέχρι τάξης h5 . Τέλος θα κλείσουμε συζητώντας μία απορία που πιθανώς θα έχει δη- μιουργηθεί στον αναγνώστη: Συζητήσαμε πώς είναι δυνατόν κανείς να μειώσει τα σφάλματα διακριτοποίησης χρησιμοποιώντας αλγόριθμους 4.3. ΜΕΘΟΔΟΙ RUNGE–KUTTA 225 των οποίων τα σφάλματα αυτά μειώνονται κατά το δυνατόν γρηγορό- τερα με το βήμα στο χρόνο h, συνήθως σαν ∼ hp . Άρα, μπορεί κανείς να υποθέσει ότι CPU χρόνου επιτρέποντος -το οποίο δεν αποτελεί σοβαρό εμπόδιο στις απλές περιπτώσεις- μπορούμε να πλησιάσουμε αυθαίρετα κοντά στην αναλυτική λύση σε επίπεδο ακρίβειας μηχανής. Αυτό όμως δεν είναι σωστό. Μια άλλη κατηγορία σφαλμάτων είναι τα σφάλματα στρογγυλοποίησης τα οποία προστίθενται σε κάθε βήμα εφαρμογής της μεθόδου. Αυτά συσσωρεύονται ανάλογα με τον αριθμό των βημάτων, οπότε για πολύ μικρό h, άρα και πολύ μεγάλο αριθμό βημάτων, αυτά θα γίνουν μεγαλύτερα από την επιθυμητή ακρίβεια. Αυτή η κατηγορία σφαλμάτων εξαρτάται από το hardware, τη γλώσσα προγραμματισμού ή/και το μεταγλωττιστή και τέλος, από τον αλγόριθμο. Για το τελευταίο ας δώσουμε ένα παράδειγμα: Έστω ότι θέλουμε να υπολογίσουμε την παράγωγο μιας συνάρτησης από τη σχέση f (t + h) − f (t) f ′ (t) = , h παίρνοντας το h αυθαίρετα μικρό. Αν υποθέσουμε ότι η παράγωγος και οι τιμές της συνάρτησης είναι πεπερασμένοι αριθμοί ∼ O(1), τότε ο αριθμητής θα πρέπει να είναι ∼ O(h). Όταν το h γίνει της τάξης της ακρίβειας των REAL (ή των REAL(8) κλπ), τότε ο αριθμητής που είναι η διαφορά δύο αριθμών περίπου ίσων και της τάξης της μονάδας θα αρχίσει να χάνει σημαντικά σε ακρίβεια σε σχέση με την πραγματική τιμή μέχρι που θα είναι ένας άχρηστος αριθμός. Αυτό συμβαίνει γενικά όταν αφαιρούμε αριθμούς περίπου ίσους ή όταν προσθέτουμε αριθμούς που η τάξη μεγέθους τους διαφέρει περισσότερο από την ακρίβεια του υπολογιστή. Άρα και όταν χρησιμοποιούμε τη σχέση xn+1 = xn + hO(xn ) για πολύ μικρό βήμα h και O(x) της τάξης μεγέθους του xn , τα σφάλ- ματα στρογγυλοποίησης θα είναι σημαντικά και θα αυξάνουν προσθε- τικά με τον αριθμό των βημάτων. 4.3.1 Προγραμματισμός της Runge–Kutta 4ης τάξης Ας συζητήσουμε τώρα τον προγραμματισμό της μεθόδου Runge–Kutta 4ης τάξης για την περίπτωση της κίνησης ενός σωματιδίου σε μία διά- σταση. Για το λόγο αυτό θα πρέπει να ολοκληρώσουμε το σύστημα διαφορικών εξισώσεων (4.5) που είναι ένα σύστημα εξισώσεων για τις 226 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ δύο συναρτήσεις του χρόνου x1 (t) ≡ x(t) και x2 (t) ≡ v(t) για τις οποίες έχουμε dx1 dx2 = f1 (t, x1 , x2 ) = f2 (t, x1 , x2 ) (4.21) dt dt Στην περίπτωση αυτή, η μέθοδος Runge–Kutta 4ης τάξης που δίνεται στην εξίσωση (4.20) γενικεύεται ως εξής: k11 = f1 (tn , x1,n , x2,n ) k21 = f2 (tn , x1,n , x2,n ) h h h k12 = f1 (tn + , x1,n + k11 , x2,n + k21 ) 2 2 2 h h h k22 = f2 (tn + , x1,n + k11 , x2,n + k21 ) 2 2 2 h h h k13 = f1 (tn + , x1,n + k12 , x2,n + k22 ) 2 2 2 h h h k23 = f2 (tn + , x1,n + k12 , x2,n + k22 ) 2 2 2 k14 = f1 (tn + h, x1,n + h k13 , x2,n + h k23 ) k24 = f2 (tn + h, x1,n + h k13 , x1,n + h k23 ) h x1,n+1 = x1,n + (k11 + 2k12 + 2k13 + k14 ) 6 h x2,n+1 = x1,n + (k21 + 2k22 + 2k23 + k24 ) . (4.22) 6 Ο προγραμματισμός της μεθόδου είναι απλός. Στο κυρίως πρόγραμμα έχουμε απλό interface με το χρήστη και του ζητάμε τα απαραίτητα δε- δομένα: Το χρόνο ολοκλήρωσης από ti = Ti έως tf = Tf και τον αριθμό των χρονικών σημείων Nt. Τις αρχικές συνθήκες x1 (ti ) = X10, x2 (ti ) = X20. Η δομή των δεδομένων είναι απλή: Τρία arrays T(P), X1(P), X2(P) αποθηκεύουν τις τιμές του χρόνου ti ≡ t1 , t2 , . . . , tNt ≡ tf και τις αντί- στοιχες τιμές των συναρτήσεων x1 (tk ) και x2 (tk ), k = 1, . . . , Nt. Το πρό- γραμμα καλεί την υπορουτίνα RK(T,X1,X2,Ti,Tf,X10,X20,Nt) η οποία είναι ο οδηγός της μεθόδου, δηλ. οδηγεί την καρδιά του προγράμματος την υπορουτίνα RKSTEP(t,x1,x2,dt) η οποία εφαρμόζει τους τύπους (4.22) και προωθεί τις τιμές των συναρτήσεων x1, x2 τη χρονική στιγμή t κατά ένα βήμα h = dt. Κάθε βήμα, αφού οριστούν οι αρχικές συνθήκες καταγράφεται στην RK στα arrays T, X1 και X2. Όταν η RK επιστρέψει τον έλεγχο στο κυρίως πρόγραμμα, τα αποτελέσματα είναι καταχωρημένα στα T, X1 και X2, τα οποία τυπώνονται στο αρχείο rk.dat. Παρακάτω παραθέτουμε το πρόγραμμα για να διευκολύνουμε τον αναγνώστη: 4.3. ΜΕΘΟΔΟΙ RUNGE–KUTTA 227 ! ======================================================== ! Program t o s o l v e a 2 ODE system using Runge−Kutta Method ! User must supply d e r i v a t i v e s ! dx1 / dt= f 1 ( t , x1 , x2 ) dx2 / dt=f 2 ( t , x1 , x2 ) ! as r e a l f u n c t i o n s ! Output i s w r i t t e n i n f i l e rk . dat ! ======================================================== program rk_solve i m p l i c i t none i n t e g e r , parameter : : P=110000 r e a l , dimension ( P ) : : T , X1 , X2 real : : Ti , Tf , X10 , X20 i n t e g e r : : Nt integer : : i ! Input : p r i n t * , ’ Runge−Kutta Method f o r 2−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter Nt , Ti , TF , X10 , X20 : ’ read * , Nt , Ti , Tf , X10 , X20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 i f ( Nt . gt . P ) s t o p ’ Nt>P ’ ! The C a l c u l a t i o n : c a l l RK ( T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) ! Output : open ( u n i t =11 , f i l e = ’ rk . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) enddo close (11) end program rk_solve ! ======================================================== ! The f u n c t i o n s f1 , f 2 ( t , x1 , x2 ) provided by t h e u s e r ! ======================================================== r e a l f u n c t i o n f1 ( t , x1 , x2 ) i m p l i c i t none r e a l : : t , x1 , x2 f1=x2 ! dx1 / dt= v = x2 end f u n c t i o n f1 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none r e a l : : t , x1 , x2 f2=−10.0D0 * x1 ! harmonic o s c i l l a t o r end f u n c t i o n f2 ! ======================================================== !RK(T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) i s t h e d r i v e r ! f o r t h e Runge−Kutta i n t e g r a t i o n r o u t i n e RKSTEP 228 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ ! Input : I n i t i a l and f i n a l t i m e s Ti , Tf ! I n i t i a l v a l u e s a t t =Ti X10 , X20 ! Number o f s t e p s o f i n t e g r a t i o n : Nt−1 ! S i z e o f a r r a y s T , X1 , X2 ! Output : r e a l a r r a y s T( Nt ) , X1 ( Nt ) ,X2( Nt ) where ! T ( 1 ) = Ti X1 ( 1 ) = X10 X2 ( 1 ) = X20 ! X1 ( k ) = X1 ( a t t =T( k ) ) X2( k ) = X2( a t t =T( k ) ) ! T( Nt )=TF ! ======================================================== s u b r o u t i n e RK ( T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) i m p l i c i t none i n t e g e r : : Nt r e a l , dimension ( Nt ) : : T , X1 , X2 real : : Ti , Tf , X10 , X20 real : : dt real : : TS , X1S , X2S ! v a l u e s o f time and X1 , X2 a t gi v e n s t e p integer : : i ! I n i t i a l i z e variables : dt = ( Tf−Ti ) / ( Nt −1) T (1) = Ti X1 ( 1 ) = X10 X2 ( 1 ) = X20 TS = Ti X1S = X10 X2S = X20 ! Make RK s t e p s : The arguments o f RKSTEP ! a r e r e p l a c e d with t h e new ones ! do i =2 , Nt c a l l RKSTEP ( TS , X1S , X2S , dt ) T ( i ) = TS X1 ( i ) = X1S X2 ( i ) = X2S enddo end s u b r o u t i n e RK ! ======================================================== ! S u b r o u t i n e RKSTEP( t , x1 , x2 , dt ) ! Runge−Kutta I n t e g r a t i o n r o u t i n e o f ODE ! dx1 / dt= f 1 ( t , x1 , x2 ) dx2 / dt=f 2 ( t , x1 , x2 ) ! User must supply d e r i v a t i v e f u n c t i o n s : ! r e a l f u n c t i o n f 1 ( t , x1 , x2 ) ! r e a l f u n c t i o n f 2 ( t , x1 , x2 ) ! Given i n i t i a l p o i n t ( t , x1 , x2 ) t h e r o u t i n e advances i t ! by time dt . ! Input : I n i t a l time t and f u n c t i o n v a l u e s x1 , x2 ! Output : F i n a l time t +dt and f u n c t i o n v a l u e s x1 , x2 ! C a r e f u l ! : v a l u e s o f t , x1 , x2 a r e o v e r w r i t t e n . . . ! ======================================================== s u b r o u t i n e RKSTEP ( t , x1 , x2 , dt ) i m p l i c i t none 4.4. ΣΥΓΚΡΙΣΗ ΤΩΝ ΜΕΘΟΔΩΝ 229 real :: t , x1 , x2 , dt real :: f1 , f2 real :: k11 , k12 , k13 , k14 , k21 , k22 , k23 , k24 real :: h , h2 , h6 h =dt ! h =dt , i n t e g r a t i o n s t e p h2 =0.5 D0 * h ! h2=h / 2 h6 =h / 6 . 0 ! h6=h / 6 k11=f1 ( t , x1 , x2 ) k21=f2 ( t , x1 , x2 ) k12=f1 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 ) k22=f2 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 ) k13=f1 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 ) k23=f2 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 ) k14=f1 ( t+h , x1+h * k13 , x2+h * k23 ) k24=f2 ( t+h , x1+h * k13 , x2+h * k23 ) t =t+h x1 =x1+h6 * ( k11 +2.0 D0 * ( k12+k13 )+k14 ) x2 =x2+h6 * ( k21 +2.0 D0 * ( k22+k23 )+k24 ) end s u b r o u t i n e RKSTEP 4.4 Σύγκριση των Μεθόδων Στην παράγραφο αυτή θα κάνουμε έλεγχο ορθότητας των προγραμ- μάτων μας και θα μετρήσουμε την ακρίβειά τους ως προς τα ολικά σφάλματα διακριτοποίησης. Το πιο απλό τεστ στο οποίο μπορούμε να τα υποβάλλουμε είναι να συγκρίνουμε τα αριθμητικά αποτελέσματα σε ένα σύστημα για το οποίο έχουμε γνωστή την αναλυτική λύση. Θα διαλέξουμε να το κάνουμε για την περίπτωση του απλού αρμονικού τα- λαντωτή. Οι αλλαγές που θα κάνουμε στα προγράμματα είναι μικρές και θα τις αναφέρουμε περιληπτικά. Κατ’ αρχήν, μετατρέπουμε όλες τις μεταβλητές REAL σε διπλής ακρίβειας REAL(8). Απλά αλλάζουμε τις δηλώσεις στα κατάλληλα σημεία του προγράμματος και προσθέτουμε ένα D0 σε όλες τις σταθερές (λ.χ. 0.5 → 0.5D0 κλπ). Στη συνέχεια, με- τατρέπουμε τις συναρτήσεις της επιτάχυνσης σε αυτή του αρμονικού ταλαντωτή a = −ω 2 x και παίρνουμε ω 2 = 10 (T ≈ 1.987). Έτσι, στο πρόγραμμα euler.f90 έχουμε r e a l ( 8 ) f u n c t i o n accel ( x ) i m p l i c i t none 230 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 100 50 500 5000 50000 1 0.01 1e-04 δx 1e-06 1e-08 1e-10 1e-12 0.1 1 10 t Σχήμα 4.11: Η απόκλιση της αριθμητικής λύσης με τη μέθοδο Euler από την αναλυτική για τον απλό αρμονικό ταλαντωτή. Οι παράμετροι είναι ω 2 = 10, ti = 0, tf = 6, x(0) = 0.2, v(0) = 0 και ο αριθμός των βημάτων είναι N = 50, 500, 5, 000, 50, 000. Παρατηρούμε ότι κάθε φορά το σφάλμα περίπου υποδεκαπλασιάζεται σύμφωνα με την αναμενόμενη ακρίβεια της μεθόδου ∼ O(∆t). real (8) : : x accel = −10.0D0 * x end f u n c t i o n accel ενώ στο πρόγραμμα rk.f90 έχουμε r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 f2=−10.0D0 * x1 end f u n c t i o n f2 Στη συνέχεια, τρέχουμε τα προγράμματα για δεδομένο χρονικό διά- στημα από ti = 0 σε tf = 6 με αρχικές συνθήκες x0 = 0.2, v0 = 0 και μεταβάλλουμε το χρονικό βήμα ∆t αλλάζοντας τον αριθμό των βημάτων Nt-1. Στη συνέχεια, συγκρίνουμε τη λύση που παίρνουμε με αυτή του απλού αρμονικού ταλαντωτή a(x) = −ω 2 x xh (t) = x0 cos(ωt) + (v0 /ω) sin(ωt) vh (t) = v0 cos(ωt) − (x0 ω) sin(ωt) , (4.23) 4.4. ΣΥΓΚΡΙΣΗ ΤΩΝ ΜΕΘΟΔΩΝ 231 0.1 50 500 5000 0.01 50000 0.001 1e-04 1e-05 δx 1e-06 1e-07 1e-08 1e-09 1e-10 0.1 1 10 t Σχήμα 4.12: Όπως στο σχήμα 4.11 για τη μέθοδο Euler-Cromer. Με κάθε δεκαπλα- σιασμό του αριθμού βημάτων, το σφάλμα περίπου υποδεκαπλασιάζεται σύμφωνα με την αναμενόμενη ακρίβεια της μεθόδου ∼ O(∆t). και μελετούμε τη σχέση των αποκλίσεων δx(t) = |x(t)−xh (t)| και δv(t) = |v(t) − vh (t)| με το βήμα ∆t. Τα αποτελέσματά μας φαίνονται στα σχή- ματα 4.11–4.14. Παρατηρούμε πως για τις μεθόδους Euler και Euler- Cromer τα σφάλματα είναι τάξης O(∆t) όπως είχαμε προβλέψει, αλλά για τη δεύτερη τα σφάλματα είναι αριθμητικά μικρότερα από αυτά της πρώτης. Για τη μέθοδο Euler–Verlet το σφάλμα βρίσκεται να είναι τάξης O(∆t2 ), ενώ για την Runge-Kutta είναι τάξης⁹ O(∆t4 ). Μία άλλη μέθοδος για να ελέγξουμε την ορθότητα των αποτελεσμά- των μας είναι να βρούμε μια διατηρούμενη ποσότητα όπως η ενέργεια, ορμή, στροφορμή κλπ και να εξετάζουμε αν αυτή αποκλίνει από την αρ- χική της τιμή. Στην περίπτωσή μας υπολογίζουμε τη μηχανική ενέργεια 1 1 E = mv 2 + mω 2 x2 (4.24) 2 2 σε κάθε βήμα και από αυτή την απόκλιση δE = |E − E0 |. Τα αποτελέ- σματα φαίνονται στα σχήματα 4.15–4.18. ⁹Επιβεβαιώστε τους ισχυρισμούς αυτούς, αρχικά από τα σχήματα 4.11-4.14 και μετά με αριθμητικό υπολογισμό. Διαλέξτε, λ.χ. μια συγκεκριμένη τιμή του χρόνου t και κάνετε τη γραφική παράσταση των σφαλμάτων συναρτήσει του ∆t, ∆t2 και ∆t4 αντίστοιχα. 232 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 1 50 500 5000 50000 0.01 1e-04 1e-06 δx 1e-08 1e-10 1e-12 1e-14 0.1 1 10 t Σχήμα 4.13: Όπως στο σχήμα 4.11 για τη μέθοδο Euler-Verlet. Με κάθε δεκαπλασιασμό του αριθμού βημάτων, το σφάλμα περίπου υποεκατονταπλασιάζεται σύμφωνα με την αναμενόμενη ακρίβεια της μεθόδου ∼ O(∆t2 ). 4.5 Ταλαντώσεις με Απόσβεση και Διέγερση Στην παράγραφο αυτή θα μελετήσουμε τον απλό αρμονικό ταλαντωτή του οποίου η κίνηση υπόκειται σε τριβή ανάλογη της ταχύτητάς του και σε εξωτερική δύναμη, την οποία για απλότητα θα πάρουμε να έχει ημιτονοειδή εξάρτηση από το χρόνο. d2 x dx 2 +γ + ω02 x = a0 sin ωt , (4.25) dt dt με F (t) = ma0 sin ωt και ω η κυκλική συχνότητα της οδηγούσας δύναμης. Ας θεωρήσουμε αρχικά το σύστημα με a0 = 0. Οι πραγματικές λύ- σεις της διαφορικής εξίσωσης¹⁰ που είναι πεπερασμένες για t → +∞ δίνονται, διακρίνοντας τις περιπτώσεις, √ 2 2 √ 2 2 x0 (t) = c1 e−(γ+ γ −4ω0 )t/2 + c2 e−(γ− γ −4ω0 )t/2 , γ 2 − 4ω02 > 0 , (4.26) x0 (t) = c1 e−γt/2 + c2 e−γt/2 t , γ 2 − 4ω02 = 0 , (4.27) ¹⁰Προκύπτουν εύκολα αντικαθιστώντας τη δοκιμαστική λύση x(t) = Ae−Ωt και λύ- νοντας ως προς Ω. 4.5. ΤΑΛΑΝΤΩΣΕΙΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 233 0.01 50 500 5000 1e-04 50000 1e-06 1e-08 δx 1e-10 1e-12 1e-14 1e-16 1e-18 0.1 1 10 t Σχήμα 4.14: Όπως στο σχήμα 4.11 για τη μέθοδο Runge-Kutta 4ης τάξης. Με κάθε δεκαπλασιασμό του αριθμού βημάτων, το σφάλμα περίπου μειώνεται κατά 10−4 σύμ- φωνα με την αναμενόμενη ακρίβεια της μεθόδου ∼ O(∆t4 ). Στα 50, 000 βήματα γίνο- νται φανερά τα σφάλματα στρογγυλοποίησης. (√ ) −γt/2 x0 (t) = c1 e cos −γ + 4ω0 t/2 2 2 (√ ) −γt/2 +c2 e sin −γ + 4ω0 t/2 , 2 2 γ 2 − 4ω02 < 0 ,(4.28) Στην τελευταία περίπτωση η λύση ταλαντώνεται με πλάτος που φθίνει εκθετικά με το χρόνο. Για την περίπτωση που a0 > 0, η γενική λύση προκύπτει από το άθροισμα μιας ειδικής λύσης xs (t) και της λύσης της ομογενούς εξίσωσης x0 (t). Μια ειδική λύση προκύπτει από τη δοκιμαστική λύση xs (t) = A sin ωt + B cos ωt την οποία αντικαθιστούμε στην (4.25) και λύνουμε για τα A και B. Βρίσκουμε ότι a0 [(ω02 − ω 2 ) cos ωt + γω sin ωt] xs (t) = (4.29) (ω02 − ω 2 )2 + ω 2 γ 2 και x(t) = x0 (t) + xs (t) . (4.30) Η λύση x0 (t) είναι εκθετικά φθίνουσα με το χρόνο και τελικά επικρατεί η xs (t). Η μόνη περίπτωση που αυτό δεν ισχύει είναι στην περίπτωση του συντονισμού χωρίς απόσβεση ω = ω0 , γ = 0. Η λύση στην περίπτωση 234 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 1000 50 500 5000 100 50000 10 1 δE 0.1 0.01 0.001 1e-04 1e-05 0.1 1 10 t Σχήμα 4.15: Όπως στο σχήμα 4.11 στην περίπτωση της ενέργειας για τη μέθοδο Euler. αυτή βρίσκεται εύκολα να είναι η a0 x(t) = c1 cos ωt + c2 sin ωt + (cos ωt + 2(ωt) sin ωt) . (4.31) 4ω 2 Οι δύο πρώτοι όροι είναι αυτοί του απλού αρμονικού ταλαντωτή, ενώ ο τελευταίος όρος αυξάνει το πλάτος της μετατόπισης γραμμικά με το χρόνο καταδεικνύοντας τη συνεχή ροή ενέργειας από την εξωτερική δύναμη στον ταλαντωτή. Ο προγραμματισμός του συστήματος γίνεται με απλή μετατροπή του κώδικα rk.f90. Οι βασικές ρουτίνες RK(T,X1,X2,T0,TF,X10,X20,Nt) και RKSTEP(t,x1,x2,dt) μένουν ως έχουν και αλλάζει απλά το interface με το χρήστη. Εισάγουμε τις βασικές παραμέτρους ω0 , ω, γ, a0 διαδραστικά στην καθιερωμένη είσοδο (standard input). Επειδή θέλουμε να τις χρη- σιμοποιήσουμε στη συνάρτηση f2(t,x1,x2) που δίνει την επιτάχυνση χωρίς να αλλάξουμε τη δομή των οδηγών της μεθόδου Runge-Kutta, πρέπει να τις ορίσουμε σε κοινή θέση στη μνήμη για το κυρίως πρό- γραμμα και την εν λόγω συνάρτηση. Αυτό στη Fortran γίνεται με τη χρήση COMMON BLOCKS. Αυτά ορίζονται μετά τη δήλωση των μεταβλητών και ορίζουν για αυτές μια συγκεκριμένη θέση στη μνήμη στις οποίες αποθηκεύονται οι τιμές τους. Το κομμάτι κώδικα real (8) : : omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 4.5. ΤΑΛΑΝΤΩΣΕΙΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 235 0.1 50 500 5000 0.01 50000 0.001 1e-04 1e-05 δE 1e-06 1e-07 1e-08 1e-09 1e-10 0.1 1 10 t Σχήμα 4.16: Όπως στο σχήμα 4.11 στην περίπτωση της ενέργειας για τη μέθοδο Euler-Cromer. σε οποιαδήποτε ρουτίνα δίνει πρόσβαση στη μνήμη στη “θέση” params στην οποία αποθηκεύονται οι τιμές των μεταβλητών. Το μόνο άλλο ση- μείο που χρειάζεται προσοχή στο πρόγραμμα είναι η συνάρτηση της επιτάχυνσης f2(t,x1,x2) η οποία τώρα έχει όρο που εξαρτάται από την ταχύτητα που εδώ συμβολίζουμε με τη μεταβλητή x2: r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none real (8) omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 r e a l ( 8 ) t , x1 , x2 , a a = a_0 * c o s ( omega * t ) f2=−omega_02 * x1−gamma * x2+a end f u n c t i o n f2 Για διευκόλυνση του αναγνώστη παραθέτουμε όλο το interface, παρα- λείποντας φυσικά τις υπορουτίνες RK, RKSTEP που έχουμε παραθέσει πρωτύτερα Το πρόγραμμα αποθηκεύεται στο αρχείο dlo.f90. ! ======================================================== ! Program t o s o l v e Damped Lin ea r O s c i l l a t o r ! using 4 th order Runge−Kutta Method ! Output i s w r i t t e n i n f i l e dlo . dat ! ======================================================== 236 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 1 50 500 5000 0.01 50000 1e-04 1e-06 δE 1e-08 1e-10 1e-12 1e-14 1e-16 0.1 1 10 t Σχήμα 4.17: Όπως στο σχήμα 4.11 στην περίπτωση της ενέργειας για τη μέθοδο Euler- Verlet. program dlo_solve i m p l i c i t none i n t e g e r , parameter : : P=110000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 r e a l ( 8 ) : : Ti , Tf , X10 , X20 r e a l ( 8 ) : : Energy real (8) : : omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 i n t e g e r : : Nt , i ! Input : p r i n t * , ’ Runge−Kutta Method f o r DLO I n t e g r a t i o n ’ p r i n t * , ’ Enter omega_0 , omega , gamma , a_0 : ’ read * , omega_0 , omega , gamma , a_0 omega_02 = omega_0 * omega_0 omega2 = omega * omega p r i n t * , ’ omega_0= ’ , omega_0 , ’ omega= ’ , omega p r i n t * , ’gamma= ’ , gamma , ’ a_0= ’ , a_0 p r i n t * , ’ Enter Nt , Ti , TF , X10 , X20 : ’ read * , Nt , Ti , Tf , X10 , X20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 i f ( Nt . gt . P ) s t o p ’ Nt>P ’ ! The C a l c u l a t i o n : c a l l RK ( T , X1 , X2 , Ti , Tf , X10 , X20 , Nt ) ! Output : open ( u n i t =11 , f i l e = ’ dlo . dat ’ ) 4.5. ΤΑΛΑΝΤΩΣΕΙΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 237 0.01 50 500 5000 50000 1e-04 1e-06 1e-08 δE 1e-10 1e-12 1e-14 1e-16 0.1 1 10 t Σχήμα 4.18: Όπως στο σχήμα 4.11 στην περίπτωση της ενέργειας για τη μέθοδο Runge-Kutta 4ης τάξης. Για μεγάλο αριθμό βημάτων το σφάλμα είναι σφάλμα στρογ- γυλοποίησης. w r i t e ( 1 1 , * ) ’ # Damped Li n ea r O s c i l l a t o r − dlo ’ w r i t e ( 1 1 , * ) ’ # omega_0= ’ , omega_0 , ’ omega= ’ , omega ,& ’ gamma= ’ , gamma , ’ a_0= ’ , a_0 do i =1 , Nt Energy = 0.5 D0 * X2 ( i ) * X2 ( i ) +0.5 D0 * omega_02 * X1 ( i ) * X1 ( i ) w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) , Energy enddo close (11) end program dlo_solve ! ======================================================== ! The f u n c t i o n s f1 , f 2 ( t , x1 , x2 ) provided by t h e u s e r ! ======================================================== r e a l ( 8 ) f u n c t i o n f1 ( t , x1 , x2 ) i m p l i c i t none r e a l ( 8 ) t , x1 , x2 f1=x2 ! dx1 / dt= v = x2 end f u n c t i o n f1 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none real (8) omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 r e a l ( 8 ) t , x1 , x2 , a a = a_0 * c o s ( omega * t ) f2=−omega_02 * x1−gamma * x2+a end f u n c t i o n f2 238 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 5 6.29 3.15 4 1.57 0.32 3 2 1 0 x -1 -2 -3 -4 -5 0 2 4 6 8 10 t Σχήμα 4.19: Η θέση συναρτήσει του χρόνου για τον αρμονικό ταλαντωτή με απόσβεση για διαφορετικές τιμές του συντελεστή απόσβεσης γ με ω0 = 3.145. Τα αποτελέσματα φαίνονται στα σχήματα 4.19–4.22. Στο σχήμα 4.19 παρατηρούμε τη μετάβαση από την φάση που η κίνηση αποσβένεται χωρίς ταλάντωση για γ > 2ω0 στη φάση που το σύστημα ταλαντώνεται με εκθετικά φθίνων με το χρόνο πλάτος για γ < 2ω0 . Η εκθετική μείωση του πλάτους φαίνεται στο σχήμα 4.21, ενώ η εξάρτηση της περιόδου T από το συντελεστή απόσβεσης γ στο σχήμα 4.22. Το εν λόγω σχήμα προκύπτει από τη Σχέση (4.28) την οποία γράφουμε στη μορφή ( ) 2π 4ω0 − 2 = γ2 . (4.32) T Το δεξί μέλος της εξίσωσης τοποθετείται στον οριζόντιο άξονα, ενώ στον κάθετο τοποθετούμε το αριστερό. Η παραπάνω σχέση προβλέπει ότι οι δύο ποσότητες είναι ίσες και οι μετρήσεις πρέπει να βρίσκονται πάνω στη διαγώνιο y = x. Οι μετρήσεις για την “περίοδο” T παίρνονται μετρώντας το χρόνο μεταξύ δύο διαδοχικών ακρότατων (v = 0) στην τροχιά x(t) (βλ. σχήμα 4.19). Τέλος, σημαντικό είναι να μελετήσουμε το σχήμα 4.20 στο οποίο βλέπουμε την τροχιά του συστήματος στο χώρο των φάσεων¹¹ Το σύ- στημα για t → +∞ καταλήγει στο σημείο (0, 0) για οποιαδήποτε τιμή ¹¹Για την ακρίβεια ο χώρος των φάσεων είναι ο χώρος των θέσεων–ορμών, αλλά στην περίπτωσή μας η διαφορά είναι τετριμμένη. 4.5. ΤΑΛΑΝΤΩΣΕΙΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 239 15 6.29 3.15 1.57 0.32 10 5 0 v -5 -10 -15 -5 -4 -3 -2 -1 0 1 2 3 4 5 x Σχήμα 4.20: Η τροχιά στο χώρο των φάσεων για τον αρμονικό ταλαντωτή με απόσβεση για διαφορετικές τιμές του συντελεστή απόσβεσης γ με ω0 = 3.145. Παρατηρούμε την ύπαρξη ελκυστή στο (x, v) = (0, 0) στον οποίο καταλήγει το σύστημα για t → +∞. της σταθεράς γ. Το σημείο αυτό για το σύστημα είναι ένας “ελκυστής” (attractor). Στη συνέχεια, προσθέτουμε την εξωτερική δύναμη και μελετούμε την απόκριση του συστήματος σε αυτή. Το πρώτο που παρατηρούμε στο σχήμα 4.23 είναι ότι το σύστημα μετά από μια μεταβατική κατάσταση (transient state) η οποία εξαρτάται από τις αρχικές συνθήκες, καταλήγει σε μία σταθερή κατάσταση η οποία δεν εξαρτάται από τις αρχικές συνθήκες. Στη συγκεκριμένη περίπτωση αυτό προβλέπεται εύκολα από τις Σχέσεις (4.26)–(4.28) όπου, αφού οι εκθετικοί όροι γίνουν αμελητέοι, επικρατεί ο όρος xs (t) της (4.29). Ο τελευταίος μπορεί να γραφτεί στη μορφή x(t) = x0 (ω) cos(ωt + δ(ω)) a0 ωγ x0 (ω) = √ 2 , tan δ(ω) = . (4.33) (ω0 − ω 2 )2 + γ 2 ω 2 ω2 − ω02 Την παραπάνω σχέση την επιβεβαιώνουμε στο σχήμα 4.24 όπου μελε- τάμε την εξάρτηση του πλάτους x0 (ω) από τη γωνιακή συχνότητα της εξωτερικής δύναμης. Τέλος, μελετάμε την τροχιά του συστήματος στο χώρο των φάσεων. Παρατηρούμε την ύπαρξη ελκυστή για το σύστημα, 240 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 10 1.0 0.8 0.6 0.4 0.2 0.1 1 Amplitude 0.1 0.01 0 5 10 15 20 25 30 35 40 t Σχήμα 4.21: To πλάτος ταλάντωσης για τον αρμονικό ταλαντωτή με απόσβεση για διαφορετικές τιμές του συντελεστή απόσβεσης γ με ω0 = 3.145. Παρατηρούμε την εκθετική μείωση του πλάτους με το χρόνο. δηλ. την ύπαρξη υπόχωρου πάνω στον οποίο κινείται το σύστημα όταν t → +∞ ο οποίος είναι ανεξάρτητος των αρχικών συνθηκών. Στην περί- πτωση αυτή, ο ελκυστής είναι καμπύλη μιας διάστασης σε αντίθεση με την περίπτωση που δεν έχουμε εξωτερική δύναμη και ο ελκυστής είναι μηδενοδιάστατο σημείο (βλ. σχήμα 4.20). 4.6 Εκκρεμές με Απόσβεση και Διέγερση Στην παράγραφο αυτή θα μελετήσουμε ένα μη γραμμικό δυναμικό σύ- στημα με μη-τετριμμένες, χαοτικές, ιδιότητες. Πολλά ενδιαφέροντα δυ- ναμικά συστήματα στη φύση παρουσιάζουν χαοτική συμπεριφορά. Αυτά είναι ντετερμινιστικά συστήματα των οποίων, δεδομένων των αρχικών συνθηκών, η κατάστασή τους μπορεί να υπολογιστεί για οποιαδήποτε χρονική στιγμή. Αλλά, ελάχιστα διαφορετικές αρχικές συνθήκες, δίνουν πολύ διαφορετικές τροχιές, με αποτέλεσμα να είναι πρακτικά αδύνατο να κάνουμε προβλέψεις σε βάθος χρόνου. Το σύστημα αυτό είναι το εκκρεμές στο ομογενές πεδίο βαρύτητας της γης με δύναμη απόσβεσης ανάλογη της ταχύτητας του εκκρεμούς και μια εξωτερική οδηγούσα δύ- 4.6. ΕΚΚΡΕΜΕΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 241 10 4 ω02 - (2 π/T)2 1 1 10 γ2 Σχήμα 4.22: Η περίοδος ταλάντωσης για τον αρμονικό ταλαντωτή με απόσβεση για διαφορετικές τιμές του συντελεστή απόσβεσης γ με ω0 = 3.145. Στους άξονες επι- λέγουμε τις κατάλληλες ποσότητες για τη γραφική επιβεβαίωση της εξίσωσης (4.28), δηλ. (2π/T )2 = 4ω02 − γ 2 . Τα σημεία είναι οι μετρήσεις ενώ η ευθεία γραμμή είναι η θεωρητική πρόβλεψη, δηλ. η διαγώνιος y = x ναμη, κατακόρυφη στη διεύθυνση και μέτρο/φορά που μεταβάλλεται συνημιτονοειδώς με το χρόνο: d2 θ dθ + γ + ω02 sin θ = −2A cos ωt sin θ . (4.34) dt2 dt Στην παραπάνω εξίσωση θ είναι η γωνία με την κατακόρυφο, γ ο συντε- λεστής απόσβεσης, ω02 = g/L η φυσική κυκλική συχνότητα του εκκρεμούς και ω, 2A η κυκλική συχνότητα και το πλάτος της εξωτερικής γωνιακής επιτάχυνσης που προκαλείται από την εξωτερική δύναμη. Όταν δεν υπάρχει εξωτερική δύναμη το σύστημα έχει, εξαιτίας των αποσβέσεων, ελκυστή το σημείο (θ, θ̇) = (0, 0). Αυτό θα συνεχίσει να συμβαίνει, καθώς αυξάνουμε το A από το μηδέν και ο ελκυστής πα- ραμένει σταθερός για αρκετά μικρό A. Για κάποια τιμή Ac ο ελκυστής γίνεται ασταθής και η συμπεριφορά του συστήματος γίνεται πολυπλο- κότερη. Αυτή θα μελετηθεί λεπτομερέστερα σε επόμενο κεφάλαιο, εδώ θα κάνουμε μια εισαγωγική προσέγγιση έχοντας κατά νου ότι το σύ- στημα αυτό παρουσιάζει ενδιαφέρον. 242 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 1 x0=1 v0=0 x0=0 v0=1 0.8 0.6 0.4 0.2 x(t) 0 -0.2 -0.4 -0.6 -0.8 0 10 20 30 40 50 60 t Σχήμα 4.23: Η περίοδος ταλάντωσης για τον αρμονικό ταλαντωτή με απόσβεση και εξωτερική δύναμη για διαφορετικές αρχικές συνθήκες. Έχουμε πάρει ω0 = 3.145, ω = 2.0, γ = 0.5 και a0 = 1.0. Παρατηρούμε ότι το σύστημα παρουσιάζει μια μεταβατική κατάσταση μετά το πέρας της οποίας ταλαντώνεται σύμφωνα με τη σχέση x(t) = x0 (ω) cos(ωt + δ). Ο προγραμματισμός του συστήματος γίνεται με τετριμμένες αλλαγές του προγράμματος dlo.f90. Οι μετατροπές στο πρόγραμμα φαίνονται παρακάτω, έχοντας κατά νου πως X1 ↔ θ, X2 ↔ θ̇, a_0 ↔ A. Το πρό- γραμμα το αποθηκεύουμε στο αρχείο fdp.f90 (fdp= Forced Damped Pendulum). Οι εντολές ανάμεσα στις τελίτσες είναι πανομοιότυπες με τα προγράμματα dlo.f90, rk.f90. ! ======================================================== ! Program t o s o l v e Forced Damped Pendulum ! using 4 th order Runge−Kutta Method ! Output i s w r i t t e n i n f i l e fdp . dat ! ======================================================== program dlo_solve i m p l i c i t none i n t e g e r , parameter : : P=1010000 ................................ Energy = 0.5 D0 * X2 ( i ) * X2 ( i )+omega_02 * ( 1 . 0 D0−c o s ( X1 ( i ) ) ) ................................ 4.6. ΕΚΚΡΕΜΕΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 243 0.7 0.6 0.5 0.4 x0(ω) 0.3 0.2 0.1 0 1 1.5 2 2.5 3 3.5 4 4.5 5 ω Σχήμα 4.24: Το πλάτος ταλάντωσης x0 (ω) για τον αρμονικό ταλαντωτή με απόσβεση και εξωτερική δύναμη. Έχουμε πάρει ω0 = 3.145, γ = 0.5 και a0 = 1.0. Παρατηρούμε συντονισμό για ω ≈ ω0 . Τα σημεία είναι οι μετρήσεις μας και η γραμμή που τα συνδέει είναι η θεωρητική πρόβλεψη (4.33). end program dlo_solve !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 ) i m p l i c i t none real (8) omega_0 , omega , gamma , a_0 , omega_02 , omega2 common / params / omega_0 , omega , gamma , a_0 , omega_02 , omega2 r e a l ( 8 ) t , x1 , x2 f2=−(omega_02 +2.0 D0 * a_0 * c o s ( omega * t ) ) * s i n ( x1 )−gamma * x2 end f u n c t i o n f2 ! ======================================================== s u b r o u t i n e RKSTEP ( t , x1 , x2 , dt ) i m p l i c i t none ................................ r e a l ( 8 ) , parameter : : pi =3.14159265358979324 D0 r e a l ( 8 ) , parameter : : pi2 =6.28318530717958648 D0 ................................ x1 =x1+h6 * ( k11 +2.0 D0 * ( k12+k13 )+k14 ) x2 =x2+h6 * ( k21 +2.0 D0 * ( k22+k23 )+k24 ) i f ( x1 . gt . pi ) x1 = x1 − pi2 i f ( x1 . lt . −pi ) x1 = x1 + pi2 end s u b r o u t i n e RKSTEP 244 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 2 1.5 1 0.5 0 -0.5 v -1 -1.5 -2 -2.5 -3 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 x Σχήμα 4.25: Η τροχιά στο χώρο των φάσεων για τον αρμονικό ταλαντωτή με απόσβεση και εξωτερική δύναμη. Έχουμε πάρει ω0 = 3.145, ω = 2.0, γ = 0.5 και a0 = 1.0. Τις τελευταίες γραμμές στο πρόγραμμα τις προσθέσαμε, ώστε να κρατήσουμε τη γωνία στο διάστημα [−π, π]. Για να μελετήσουμε τις ιδιότητες του συστήματος θα θέσουμε ω0 = 1, ω = 2, και γ = 0.2, εκτός αν αναφέρουμε ρητώς διαφορετικά. Η φυσική περίοδος του εκκρεμούς είναι T0 = 2π/ω0 = 2π ≈ 6.28318530717958648, ενώ αυτή της εξωτερικής δύναμης T = 2π/ω = π ≈ 3.14159265358979324. Το σύστημα για A < Ac με Ac ≈ 0.18 έχει σταθερό ελκυστή το σημείο (θ, θ̇) = (0, 0), ενώ για Ac < A < 0.71 ο ελκυστής είναι κλειστή κα- μπύλη. Η περίοδος της ταλάντωσης βρίσκεται να είναι διπλάσια αυτής της εξωτερικής δύναμης. Για 0.72 < A < 0.79 ο ελκυστής είναι ανοιχτή καμπύλη, επειδή το εκκρεμές εκτελεί ολόκληρους κύκλους στη σταθερή του κατάσταση. Η περίοδος στο διάστημα αυτό γίνεται ίση με αυτή της εξωτερικής δύναμης. Για 0.79 < A ≲ 1.033 η περίοδος διπλασιάζεται διαδοχικά για κρίσιμες τιμές του A, η τροχιά όμως συνεχίζει να είναι περιοδική. Για μεγαλύτερες τιμές του A η τροχιά παύει να είναι περιο- δική και το σύστημα έχει χαοτική συμπεριφορά. Για A ≈ 3.1 βρίσκουμε το σύστημα να έχει πάλι περιοδική κίνηση, ενώ για A ≈ 3.8 – 4.448 να έχουμε το φαινόμενο διπλασιασμού της περιόδου. Για A ≈ 4.4489 έχουμε καθαρή χαοτική συμπεριφορά κ.ο.κ. Τα αποτελέσματα αυτά 4.6. ΕΚΚΡΕΜΕΣ ΜΕ ΑΠΟΣΒΕΣΗ ΚΑΙ ΔΙΕΓΕΡΣΗ 245 0.4 0.3 0.2 0.1 0 v -0.1 -0.2 -0.3 -0.4 -0.2 -0.15 -0.1 -0.05 0 0.05 0.1 0.15 0.2 x Σχήμα 4.26: Η τροχιά στο χώρο των φάσεων για τον αρμονικό ταλαντωτή με απόσβεση και εξωτερική δύναμη για t > 100. Έχουμε πάρει ω0 = 3.145, ω = 2.0, γ = 0.5 και a0 = 1.0. Παρατηρούμε τον ελκυστή που τώρα είναι καμπύλη (έλλειψη) μιας διάστασης. περιγράφονται στα σχήματα 4.27–4.29. Για την ανάλυση της συμπεριφοράς του εκκρεμούς και κυρίως για τη διευκόλυνση της διάκρισης μεταξύ περιοδικής και χαοτικής συμπερι- φοράς μπορεί κανείς να μελετήσει τα λεγόμενα διαγράμματα Poincaré. Στα διαγράμματα αυτά τοποθετούμε ένα σημείο στο χώρο των φάσεων κάθε φορά που ο χρόνος είναι ακέραιο πολλαπλάσιο της περιόδου της εξωτερικής δύναμης. Με τον τρόπο αυτό, αν η κίνηση είναι περιοδική με περίοδο ίση με την περίοδο της εξωτερικής δύναμης, θα έχουμε ένα σημείο στο διάγραμμα και γενικότερα θα έχουμε n σημεία, αν η περί- οδος είναι n–πολλαπλάσιο της T = 2π/ω. Οπότε κανείς περιμένει, όταν παρατηρείται το φαινόμενο διπλασιασμού της περιόδου, το διάγραμμα Poincaré να αποκτά επί πλέον μεμονωμένα σημεία, ενώ όταν η συμπερι- φορά είναι χαοτική, τα σημεία να ανήκουν σε έναν υπόχωρο του χώρου των φάσεων που έχει πολυπλοκότερη δομή. Αυτό μπορούμε εύκολα να το προγραμματίσουμε στον κώδικά μας στο fdp.f90 ή εναλλακτικά να πάρουμε τη σχετική πληροφορία από το αρχείο εξόδου fdp.dat με το πρόγραμμα awk το οποίο τρέχουμε από τη γραμμή εντολών¹²: ¹²Η εντολή μπορεί να γραφτεί σε μία γραμμή χωρίς το τελικό \ της πρώτης γραμμής. 246 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 2 -1.4 1.5 -1.6 1 -1.8 0.5 -2 0 -2.2 -0.5 -2.4 -1 -2.6 -1.5 -2 -2.8 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -4 -3 -2 -1 0 1 2 3 4 3 -0.5 2.8 -1 2.6 2.4 -1.5 2.2 -2 2 1.8 -2.5 1.6 -3 1.4 1.2 -3.5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 4.27: Τροχιά στο χώρο των φάσεων για το εκκρεμές με απόσβεση και εξω- τερική δύναμη. Έχουμε πάρει ω0 = 1.0, ω = 2.0, γ = 0.2 και A = 0.60, 0.72, 0.85, 1.02. Παρατηρούμε το φαινόμενο του διπλασιασμού της περιόδου. awk −v o=$omega −v nt=$Nt −v tf=$TF \ ’BEGIN{T =6.283185307179/ o ; dt=tf / nt ; } $1%T<dt { p r i n t $2 , $3 } ’\ fdp . dat όπου $omega, $Nt, $TF οι τιμές της κυκλικής συχνότητας ω, αριθμού χρονικών σημείων και τελικού χρόνου tf . Στο πρόγραμμα υπολογίζουμε την περίοδο T και το βήμα χρόνου dt. Στη συνέχεια, τυπώνουμε εκείνες τις γραμμές του αρχείου των οποίων ο χρόνος είναι ακέραιο πολλαπλά- σιο της περιόδου με ακρίβεια χρόνου dt¹³. Αυτό γίνεται με την πράξη modulo $1 % T < dt που είναι TRUE, όταν το υπόλοιπο της διαίρεσης της πρώτης στήλης ($1) του αρχείου fdp.dat έχει υπόλοιπο διαίρεσης με την περίοδο T μικρότερο από dt. Τα αποτελέσματα για τη χαοτική φάση φαίνονται στο σχήμα 4.30. Κλείνουμε τη μελέτη μας με την παρουσίαση μιας ακόμα έννοιας που μας βοηθάει στην ανάλυση των ιδιοτήτων του εκκρεμούς. Αυτή εί- ναι η έννοια της “λεκάνης του ελκυστή” (basin of attraction) η οποία ¹³Φυσικά αυτό κάνει τα μεμονωμένα σημεία να φαίνονται λίγο συγκεχυμένα στο διάγραμμα Poincaré. 4.7. ΠΑΡΑΡΤΗΜΑ: ΣΤΗ ΜΕΘΟΔΟ EULER–VERLET 247 -0.5 -0.5 -1 -1 -1.5 -1.5 -2 -2 -2.5 -2.5 -3 -3 -3.5 -3.5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 -0.5 5 4 -1 3 2 -1.5 1 -2 0 -1 -2.5 -2 -3 -3 -4 -3.5 -5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 4.28: Τροχιά στο χώρο των φάσεων για το εκκρεμές με απόσβεση και εξωτε- ρική δύναμη. Έχουμε πάρει ω0 = 1.0, ω = 2.0, γ = 0.2 και A = 1.031, 1.033, 1.04, 1.4. Παρατηρούμε την εμφάνιση χαοτικής συμπεριφοράς. είναι το σύνολο των αρχικών συνθηκών στο χώρο των φάσεων που οδη- γούν το σύστημα στο συγκεκριμένο ελκυστή. Στην περίπτωσή μας, το εκκρεμές για A > 0.79 εκτελεί κυκλική κίνηση είτε με θετική είτε με αρνητική φορά (μετά την παρέλευση της παροδικής φάσης φυσικά) οι οποίες αποτελούν τους δύο ελκυστές του συστήματος. Παίρνοντας ένα μεγάλο δείγμα από αρχικές συνθήκες και σημειώνοντας το πρόσημο της γωνιακής ταχύτητας μετά την παρέλευση της παροδικής φάσης, παίρ- νουμε το σχήμα 4.31. Στην περιοδική φάση διακρίνουμε περιοχές, των οποίων τα περιγράμματα δεν είναι καθαρά, οι οποίες δεν οδηγούν στο συγκεκριμένο ελκυστή. 4.7 Παράρτημα: Στη Μέθοδο Euler–Verlet Οι Σχέσεις (4.11) προκύπτουν από το ανάπτυγμα κατά Taylor (∆t)2 ′′ (∆t)3 ′′′ θ(t + ∆t) = θ(t) + (∆t)θ′ (t) + θ (t) + θ (t) + O((∆t)4 ) 2! 3! 2 3 (∆t) (∆t) θ(t − ∆t) = θ(t) − (∆t)θ′ (t) + θ′′ (t) − θ′′′ (t) + O((∆t)4 ) . 2! 3! 248 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 3.2 5 3 4 3 2.8 2 2.6 1 2.4 0 2.2 -1 2 -2 1.8 -3 1.6 -4 1.4 -5 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 6 8 6 4 4 2 2 0 0 -2 -2 -4 -4 -6 -6 -8 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 4.29: Τροχιά στο χώρο των φάσεων για το εκκρεμές με απόσβεση και εξω- τερική δύναμη. Έχουμε πάρει ω0 = 1.0, ω = 2.0, γ = 0.2 και A = 1.568, 3.8, 4.44, 4.5. Παρατηρούμε την παύση και επανεμφάνιση χαοτικής συμπεριφοράς. Προσθέτοντας και αφαιρώντας κατά μέλη παίρνουμε θ(t + ∆t) + θ(t − ∆t) = 2θ(t) + (∆t)2 θ′′ (t) + O((∆t)4 ) θ(t + ∆t) − θ(t − ∆t) = 2(∆t)θ′ (t) + O((∆t)3 ) (4.35) που δίνουν θ(t + ∆t) = 2θ(t) − θ(t − ∆t) + (∆t)2 α(t) + O((∆t)4 ) θ(t + ∆t) − θ(t − ∆t) ω(t) = + O((∆t)2 ) (4.36) 2(∆t) που είναι οι σχέσεις (4.11). Από την πρώτη σχέση παίρνουμε και τις εξισώσεις της μεθόδου Euler (4.9): θ(t + ∆t) = θ(t) + ω(t)(∆t) + O((∆t)2 ) (4.37) Στις προσομοιώσεις το σημαντικό είναι το συνολικό σφάλμα που συσσωρεύεται μετά από τα N − 1 βήματα της ολοκλήρωσης. Ειδικά για τη συγκεκριμένη μέθοδο πρέπει να δούμε τα σφάλματα που συσσωρεύ- ονται ιδιαίτερα προσεκτικά: 4.7. ΠΑΡΑΡΤΗΜΑ: ΣΤΗ ΜΕΘΟΔΟ EULER–VERLET 249 5 8 4 6 3 4 2 2 1 0 0 -1 -2 -2 -4 -3 -6 -4 -5 -8 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 4.30: Διάγραμμα Poincaré για το εκκρεμές με απόσβεση και εξωτερική δύναμη όταν παρουσιάζει χαοτική συμπεριφορά. Έχουμε πάρει ω0 = 1.0, ω = 2.0, γ = 0.2 και A = 1.4, 4.5. 8 8 6 6 4 4 2 2 0 0 -2 -2 -4 -4 -6 -6 -8 -8 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 4.31: Basin of attraction για το εκκρεμές με απόσβεση και εξωτερική δύναμη. Έχουμε πάρει ω0 = 1.0, ω = 2.0, γ = 0.2 και A = 0.85, 1.4. Διακρίνουμε την περιοδική από τη χαοτική συμπεριφορά. • Το σφάλμα στην ταχύτητα ω(t) δε συσσωρεύεται, γιατί υπολογί- ζεται από τη διαφορά των θέσεων θ(t + ∆t) − θ(t − ∆t). • Στη θέση, το σφάλμα συσσωρεύεται ως εξής: Έστω δθ(t) το συ- νολικό σφάλμα που έχει συσσωρευτεί από την ολοκλήρωση από χρόνο t0 έως t. Τότε σύμφωνα με τα αναπτύγματα (4.36), το σφάλμα στο πρώτο βήμα είναι δθ(t0 + ∆t) = O((∆t)4 ). Τότε¹⁴ θ(t0 + 2∆t) = 2θ(t0 + ∆t) − θ(t0 ) + ∆t2 α(t0 + ∆t) + O((∆t)4 ) ⇒ δθ(t0 + 2∆t) = 2δθ(t0 + ∆t) − δθ(t0 ) + O((∆t)4 ) = 2O((∆t)4 ) − 0 + O((∆t)4 ) = 3O((∆t)4 ) ¹⁴Θυμίζουμε ότι η επιτάχυνση α(t) δίνεται, οπότε δα(t) = 0. 250 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ Στα επόμενα βήματα παίρνουμε θ(t0 + 3∆t) = 2θ(t0 + 2∆t) − θ(t0 + ∆t) + ∆t2 α(t0 + 2∆t) + O((∆t)4 ) ⇒ δθ(t0 + 3∆t) = 2δθ(t0 + 2∆t) − δθ(t0 + ∆t) + O((∆t)4 ) = 6O((∆t)4 ) − O((∆t)4 ) + O((∆t)4 ) = 6O((∆t)4 ) θ(t0 + 4∆t) = 2θ(t0 + 3∆t) − θ(t0 + 2∆t) + ∆t2 α(t0 + 3∆t) + O((∆t)4 ) ⇒ δθ(t0 + 4∆t) = 2δθ(t0 + 3∆t) − δθ(t0 + 2∆t) + O((∆t)4 ) = 12O((∆t)4 ) − 3O((∆t)4 ) + O((∆t)4 ) = 10O((∆t)4 ) Και επαγωγικά, αν δθ(t0 + (n − 1)∆t) = (n−1)n 2 O((∆t)4 ) στο επόμενο βήμα παίρνουμε θ(t0 + n∆t) = 2θ(t0 + (n − 1)∆t) − θ(t0 + (n − 2)∆t) + ∆t2 α(t0 + (n − 1)∆t) +O((∆t)4 ) ⇒ δθ(t0 + n∆t) = 2δθ(t0 + (n − 1)∆t) − δθ(t0 + (n − 2)∆t) + O((∆t)4 ) (n − 1)n (n − 2)(n − 1) = 2 O((∆t)4 ) − O((∆t)4 ) + O((∆t)4 ) 2 2 n(n + 1) = O((∆t)4 ) 2 Άρα, τελικά, n(n + 1) 1 δθ(t0 +n∆t) = O((∆t)4 ) ∼ 2 O((∆t)4 ) ∼ O((∆t)2 ) (4.38) 2 ∆t Άρα το ολικό σφάλμα είναι O((∆t)2 ). Για πληρότητα αναφέρουμε και τον αλγόριθμο Velocity Verlet ή μέ- θοδο Leapfrog. Στην περίπτωση αυτή χρησιμοποιούμε ρητά την ταχύ- τητα: 1 θn+1 = θn + ωn ∆t + αn ∆t2 2 1 ωn+ 1 = ωn + αn ∆t 2 2 1 ωn+1 = ωn+ 1 + αn+1 ∆t . (4.39) 2 2 Στο τελευταίο βήμα χρειαζόμαστε την επιτάχυνση αn+1 , οπότε πρέπει αυτή να εξαρτάται μόνο από τη θέση θn+1 και όχι από την ταχύτητα. 4.8. ΠΑΡΑΡΤΗΜΑ: RUNGE–KUTTA 2ΗΣ ΤΑΞΗΣ 251 Οι μέθοδοι Verlet είναι δημοφιλείς σε προσομοιώσεις molecular dy- namics, κυρίως συστημάτων με πολλά σωμάτια. Έχουν το ιδιαίτερο προ- σόν ότι υλοποιούνται σχετικά εύκολα οι περιορισμοί (constraints) στους οποίους υπόκειται τα σωματίδια που αποτελούν το σύστημα. 4.8 Παράρτημα: Runge–Kutta 2ης τάξης Στην παράγραφο αυτή θα δείξουμε με δύο τρόπους γιατί η επιλογή του ενδιάμεσου σημείου 2 στην εξίσωση (4.17) μειώνει το σφάλμα κατά μία δύναμη του βήματος h. Όπως θα φανεί, η επιλογή του μέσου του διαστήματος για το σημείο 2 δεν είναι τυχαία (οπότε λ.χ. το σημείο με t = tn + 0.4h δεν θα είχε το ίδιο αποτέλεσμα). Πράγματι από τη σχέση ∫ tn+1 dx = f (t, x) ⇒ xn+1 = xn + f (t, x) dx . (4.40) dt tn Αναπτύσσοντας κατά Taylor γύρω από το σημείο (tn+1/2 , xn+1/2 ), παίρ- νουμε df f (t, x) = f (tn+1/2 , xn+1/2 ) + (t − tn+1/2 ) (tn+1/2 ) + O(h2 ) . (4.41) dt Οπότε ∫ tn+1 f (t, x) dx tn tn+1 df (t − tn+1/2 )2 = f (tn+1/2 , xn+1/2 )(tn+1 − tn ) + (tn+1/2 ) dt 2 tn +O(h2 )(tn+1 − tn ) { } df (tn+1 − tn+1/2 )2 (tn − tn+1/2 )2 = f (tn+1/2 , xn+1/2 )h + (tn+1/2 ) − dt 2 2 2 +O(h )h { 2 } df h (−h)2 = f (tn+1/2 , xn+1/2 )h + (tn+1/2 ) − + O(h3 ) dt 2 2 = f (tn+1/2 , xn+1/2 )h + O(h3 ) . (4.42) Παρατηρούμε ότι για την εξαφάνιση του όρου O(h) είναι αναγκαία η τοποθέτηση του βοηθητικού σημείου στο χρόνο tn+1/2 . 252 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ Η επιλογή αυτή δεν είναι μοναδική. Αυτό μπορεί να φανεί και από μια διαφορετική ανάλυση του αναπτύγματος κατά Taylor. Αναπτύσσο- ντας τώρα γύρω από το σημείο (tn , xn ), παίρνουμε dxn 1 d2 xn xn+1 = xn + (tn+1 − tn ) + (tn+1 − tn )2 2 + O(h3 ) dt 2 dt 2 h dfn = xn + hfn + + O(h3 ) 2 (dt ) h2 ∂fn ∂fn dxn = xn + hfn + + + O(h3 ) 2 ∂t ∂x dt ( ) h2 ∂fn ∂fn = xn + hfn + + fn + O(h3 ) , (4.43) 2 ∂t ∂x όπου για συντομία θέσαμε fn ≡ f (tn , xn ), dxn dt ≡ dx dt (xn ) κ.ο.κ. Ορίζουμε k1 = f (tn , xn ) = fn k2 = f (tn + ah, xn + bhk1 ) xn+1 = xn + h(c1 k1 + c2 k2 ) . (4.44) και θα προσδιορίσουμε τις συνθήκες, έτσι ώστε στο σφάλμα οι όροι O(h2 ) της τελευταίας εξίσωσης να ταυτίζονται με αυτούς της (4.43). Αναπτύσσοντας την k2 , παίρνουμε k2 = f (tn + ah, xn + bhk1 ) ∂f = f (tn , xn + bhk1 ) + ha (tn , xn + bhk1 ) + O(h2 ) ∂t ∂f ∂f = f (tn , xn ) + hbk1 (tn , xn ) + ha (tn , xn ) + O(h2 ) { ∂x } ∂t ∂fn ∂fn = fn + h a + bk1 + O(h2 ) ∂t ∂x { } ∂fn ∂fn = fn + h a + bfn + O(h2 ) (4.45) ∂t ∂x Αντικαθιστώντας στην (4.44), παίρνουμε xn+1 = xn + h(c1 k1 + c2 k2 ) { ( ) } ∂fn ∂fn = xn + h c1 fn + c2 fn + c2 h a + bfn + O(h )2 ∂t ∂x ( ) h2 ∂fn ∂fn = xn + h(c1 + c2 )fn + (2c2 a) + (2c2 b)fn 2 ∂t ∂x 3 +O(h ) . (4.46) 4.8. ΠΑΡΑΡΤΗΜΑ: RUNGE–KUTTA 2ΗΣ ΤΑΞΗΣ 253 Αρκεί λοιπόν να επιλέξουμε c1 + c2 = 1 2c2 a = 1 2c2 b = 1 . (4.47) Η επιλογή c1 = 0, c2 = 1, a = b = 1/2 μας δίνει τη μέθοδο (4.19). Άλλες επιλογές στη βιβλιογραφία είναι c2 = 1/2 και c2 = 3/4. 254 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 4.9 Ασκήσεις 4.1 Αποδείξτε ότι το συνολικό σφάλμα στη μέθοδο Euler-Cromer είναι τάξης ∆t 4.2 Αναπαράγετε τα αποτελέσματα των σχημάτων 4.11–4.18 4.3 Βελτιώστε τον υπολογισμό του χρόνου στα προγράμματα των με- θόδων Euler, Euler-Cromer, Euler-Verlet, Runge-Kutta, ώστε να μην έχουμε προσθετική συσσώρευση σφαλμάτων στο χρόνο, όταν η παράμετρος h είναι πολύ μικρή (λ.χ. στις εντολές T(i)=T(i-1)+h). Επαναλάβατε την ανάλυση της προηγούμενης άσκησης. 4.4 Μεταβάλετε τα προγράμματα των μεθόδων Euler, Euler-Cromer, Euler-Verlet, Runge-Kutta ώστε REAL→REAL(8) (προσοχή στις στα- θερές: να τις ορίσετε ρητά να είναι διπλής ακρίβειας προσθέτο- ντας τον εκθέτη D0). Επαναλάβατε την ανάλυση της προηγούμενης άσκησης. 4.5 Να επαναλάβετε τη σύγκριση των μεθόδων Euler, Euler-Cromer, Euler-Verlet, Runge-Kutta για τα παρακάτω συστήματα των οποίων η αναλυτική λύση είναι γνωστή: (αʹ) Σωματίδιο που πέφτει ελεύθερα στο ομογενές πεδίο βαρύτη- τας. Θεωρήστε v(0) = 0, m = 1, g = 10. (βʹ) Σωματίδιο που πέφτει στο ομογενές πεδίο βαρύτητας μέσα σε ρευστό από το οποίο δέχεται δύναμη F = −kv. Θεωρήστε v(0) = 0, m = 1, g = 10 k = 0.1, 1.0, 2.0. Υπολογίστε την ορική ταχύτητα του σωματιδίου αριθμητικά και συγκρίνετέ τη με τη θεωρητική της τιμή. (γʹ) Επαναλάβετε για δύναμη αντίστασης μέτρου |F | = kv 2 . 4.6 Μελετήστε το σύστημα του αρμονικού ταλαντωτή με απόσβεση d2 x dx 2 + γ + ω02 x = 0 . (4.48) dt dt Πάρτε ω0 = 3.145, γ = 0.5 και υπολογίστε την ενέργεια συναρ- τήσει του χρόνου. Είναι η τιμή της μονοτονική; Γιατί; (Δείξτε ότι d(E/m)/dt = −γv 2 ). Επαναλάβατε για γ = 4, 5, 6, 7, 8. Πότε το σύ- στημα ταλαντώνεται και πότε όχι; Υπολογίστε αριθμητικά την κρί- σιμη τιμή του γ για την οποία το σύστημα μετατρέπεται από τα- λαντούμενο σε μη ταλαντούμενο. Συγκρίνετε το αποτέλεσμά σας με την αναλυτική λύση. 4.9. ΑΣΚΗΣΕΙΣ 255 4.7 Αναπαράγετε τα αποτελέσματα που οδηγούν στα σχήματα 4.19– 4.22. 4.8 Αναπαράγετε τα αποτελέσματα που οδηγούν στα σχήματα 4.23– 4.26. Υπολογίστε αριθμητικά τη φάση δ(ω) και επιβεβαιώστε τη Σχέση (4.33). 4.9 Θεωρήστε ότι το μοντέλο για μια κούνια είναι ο αρμονικός ταλα- ντωτής με απόσβεση ο οποίος υπόκειται σε περιοδική δύναμη η οποία είναι στιγμιαία ώθηση συχνότητας ω. Ορίστε το “στιγμιαία” ότι είναι η ώθηση που δίνει επιτάχυνση a0 το κατάλληλο χρονικό διάστημα διάρκειας ∆t και 0 στα υπόλοιπα βήματα. Υπολογίστε το πλάτος x0 (ω) για ω0 = 3.145 και γ = 0.5. 4.10 Θεωρήστε ότι η εξωτερική δύναμη είναι το “μισό συνημίτονο” δί- νοντας επιτάχυνση στον ο αρμονικό ταλαντωτή με απόσβεση { a0 cos ωt cos ωt > 0 a(t) = 0 cos ωt ≤ 0 Μελετήστε τη μετάβαση του συστήματος στη σταθερή κατάσταση και υπολογίστε το πλάτος x0 (ω) για ω0 = 3.145 και γ = 0.5. 4.11 Θεωρήστε ότι η εξωτερική δύναμη δίνει επιτάχυνση στον αρμονικό ταλαντωτή με απόσβεση 1 1 2 2 a(t) = + cos ω + cos 2ωt − cos 4ωt π 2 3π 15π Μελετήστε τη μετάβαση του συστήματος στη σταθερή κατάσταση και υπολογίστε το πλάτος x0 (ω) για ω0 = 3.145 και γ = 0.5. Συγκρί- νετε τα αποτελέσματά σας με αυτά της προηγούμενης άσκησης. Τι συμπεραίνετε; 4.12 Γράψτε ένα πρόγραμμα που να προσομοιώνει ταυτόχρονα N όμοιους αρμονικούς ταλαντωτές. Πάρτε N = 20 και δώστε τυχαίες αρχι- κές συνθήκες σε κάθε έναν από αυτούς και παρακολουθήστε τις τροχιές τους στο χώρο των φάσεων. Παρατηρήστε αν οι τροχιές τέμνονται και εξηγήστε τα αποτελέσματά σας. 4.13 Στην προηγούμενη άσκηση τοποθετήστε τους N = 20 αρμονικούς ταλαντωτές στο χώρο των φάσεων σε ένα μικρό τετράγωνο με κέντρο την αρχή των αξόνων. Παρακολουθήστε την εξέλιξη του συστήματος στο χρόνο. Αλλάζει το σχήμα με το χρόνο; Αλλάζει το εμβαδόν; Εξηγήστε... 256 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ 4.14 Επαναλάβατε την προηγούμενη άσκηση, όταν υπάρχει απόσβεση με γ = 0.5. Πάρτε ω0 = 3.145. 4.15 Στην περίπτωση του εκκρεμούς με απόσβεση και εξωτερική δύ- ναμη, πάρτε ω = 2, ω0 = 1.0, γ = 0.2 μελετήστε την παροδική φάση στα διαγράμματα θ(t), θ̇(t) για A = 0.1, 0.5, 0.79, 0.85, 1.03, 1.4. 4.16 Στην περίπτωση του εκκρεμούς με απόσβεση και εξωτερική δύ- ναμη, πάρτε ω = 2, ω0 = 1.0, γ = 0.2 μελετήστε τις τροχιές στο χώρο της φάσης για A = 0.1, 0.19, 0.21, 0.25, 0.5, 0.71, 0.79, 0.85, 1.02, 1.031, 1.033, 1.05, 1.08, 1.1, 1.4, 1.8, 3.1, 3.5, 3.8, 4.2, 4.42, 4.44, 4.445, 4.447, 4.4488. 4.17 Αναπαράγετε τα σχήματα 4.30. 4.18 Αναπαράγετε τα σχήματα 4.31. 4.19 Στο πρόβλημα του εκκρεμούς με απόσβεση και εξωτερική περιο- δική δύναμη να πάρετε: ω0 = 1 , ω = 2, γ = 0.2 Η κίνηση του συστήματος για A = 0.60, A = 0.75 και A = 0.85 είναι περιοδική μετά από τη μεταβατική συμπεριφορά (transient behavior). Να μετρήσετε την περίοδο της κίνησης με ακρίβεια 3 σημαντικών δεκαδικών ψηφίων σε κάθε περίπτωση και να τη συ- γκρίνετε με την φυσική περίοδο του εκκρεμούς και την περίοδο της εξωτερικής δύναμης. Ως αρχικές συνθήκες να πάρετε (θ0 , θ̇0 ) = (3.1, 0.0), (2.5, 0.0), (2.0, 0.0), (1.0, 0.0), (0.2, 0.0), (0.0, 1.0), (0.0, 3.0), (0.0, 6.0) και να επιβεβαιώσετε πως η περίοδος είναι ανεξάρτητη των αρχικών συνθηκών. 4.20 Στο πρόβλημα του εκκρεμούς με απόσβεση και εξωτερική περιο- δική δύναμη να πάρετε: ω0 = 1 , ω = 2, γ = 0.2 και να μελετήσετε την κίνηση του εκκρεμούς, όταν το πλάτος (ανάλογο της δύναμης) A μεταβάλλεται στο διάστημα [0.2, 5.0]. Να πάρετε διακριτές τιμές του A χωρίζοντας το παραπάνω διά- στημα σε διαστήματα πλάτους δA = 0.002. Για κάθε τιμή του A, να καταχωρήσετε σε ένα αρχείο την τιμή του A, της γωνιακής 4.9. ΑΣΚΗΣΕΙΣ 257 θέσης και γωνιακής ταχύτητας του εκκρεμούς, όταν tk = kπ με k = ktrans , ktrans + 1, ktrans + 2, . . . , kmax : A θ(tk ) θ̇(tk ) Η επιλογή του ktrans γίνεται έτσι, ώστε να παραλειφθεί η μεταβα- τική συμπεριφορά (transient behavior) και να είστε βέβαιοι πως μελετάτε τη μόνιμη κατάσταση του εκκρεμούς. Μπορείτε να πά- ρετε kmax = 500, ktrans = 400, ti = 0, tf = 500π, και να χωρίσετε τα διαστήματα [tk , tk + π] σε 50 υποδιαστήματα. Διαλέξτε θ0 = 3.1, θ̇0 = 0. (αʹ) Φτιάξτε τη γραφική παράσταση του διαγράμματος διακλά- δωσης που προκύπτει τοποθετώντας σε διάγραμμα τα σημεία (A, θ(tk )). (βʹ) Επαναλάβατε τοποθετώντας σε διάγραμμα τα σημεία (A, θ̇(tk )). (γʹ) Εξετάστε αν τα αποτελέσματά σας εξαρτώνται από την επι- λογή των θ0 , θ̇0 επαναλαμβάνοντας για διαφορετικές τιμές, λ.χ. θ0 = 0, θ̇0 = 1. (δʹ) Μελετήστε την περιοχή που ξεκινάει η χαοτική συμπεριφορά: Πάρτε A ∈ [1.0000, 1.0400] με δA = 0.0001 και A ∈ [4.4300, 4.4500] με δA = 0.0001 και βρείτε με τη δεδομένη ακρίβεια την τιμή Ac που ξεκινάει η χαοτική συμπεριφορά. (εʹ) Στη συνέχεια να αναπαραστήστε γραφικά τα σημεία (θ(tk ), θ̇(tk )) για A = 1.034, 1.040, 1.080, 1.400, 4.450, 4.600. Τοποθετήστε 2000 σημεία για κάθε τιμή του A και σχολιάστε πότε η χαοτική συ- μπεριφορά είναι εντονότερη. 258 ΚΕΦΑΛΑΙΟ 4. ΚΙΝΗΣΗ ΣΩΜΑΤΙΔΙΟΥ ΚΕΦΑΛΑΙΟ 5 Κίνηση στο Επίπεδο Στο κεφάλαιο αυτό θα επεκτείνουμε τη μελέτη του προηγούμενου κεφα- λαίου στη μελέτη κίνησης σωματιδίου υπό την επίδραση δύναμης στο επίπεδο. Ιδιαίτερο ενδιαφέρον παρουσιάζει το πρόβλημα της κίνησης σε κεντρικό δυναμικό πεδίο, όπως η πλανητική κίνηση και το πρόβλημα της σκέδασης. Τα προβλήματα αυτά μπορούν να μελετηθούν με απλές μεθόδους Runge–Kutta, οπότε, από άποψη αριθμητικής ανάλυσης, το κεφάλαιο αυτό είναι απλή εφαρμογή των μεθόδων που έχουν ήδη με- λετηθεί. 5.1 Runge–Kutta για την Κίνηση στο Επίπεδο Στις δύο διαστάσεις, το πρόβλημα αρχικών τιμών που έχουμε να λύ- σουμε δίνεται από το σύστημα (4.6) dx dvx = vx = ax (t, x, vx , y, vy ) dt dt dy dvy = vy = ay (t, x, vx , y, vy ) . (5.1) dt dt Ο κώδικας που θα τρέχει τη μέθοδο Runge–Kutta 4ης τάξης προκύ- πτει με μικρές μετατροπές του κώδικα rk.f90. Κατ’ αρχήν, για διευ- κόλυνση της μελέτης διαφορετικών δυνάμεων ξεχωρίζουμε τον κοινό κώδικα με το user interface και τον αλγόριθμο της μεθόδου από τις συναρτήσεις της επιτάχυνσης που αλλάζουν ανάλογα με τη δύναμη σε ξεχωριστά αρχεία. Στο αρχείο rk2.f90 τοποθετούμε τα πρώτα και σε αρχείο rk_XXX.f90 τα δεύτερα. XXX είναι ακολουθία χαρακτήρων που ταυτοποιούν τη δύναμη λ.χ. rk2_hoc.f90 έχει την επιτάχυνση του αρ- μονικού ταλαντωτή, rk2_g.f90 την επιτάχυνση από ομογενές πεδίο βα- ρύτητας ⃗g = −g ŷ κ.ο.κ. 259 260 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ Στον κώδικα στο rk2.f90 κάνουμε μερικές μικροαλλαγές στο user interface. Τοποθετούμε δυο απροσδιόριστες σταθερές σύζευξης k1, k2 που μπορούν να δοθούν διαδραστικά από το χρήστη και να καθορίσουν το μέγεθος της δύναμης που ασκείται κάθε φορά στο σώμα. Τοποθε- τούνται σε common block real (8) : : k1 , k2 common / couplings / k1 , k2 το οποίο θα “φαίνεται” και από τις συναρτήσεις επιτάχυνσης f3, f4 και της ενέργειας energy. Ο χρήστης πρέπει τώρα να παρέχει τις αρ- χικές συνθήκες και για τις δύο συντεταγμένες στο επίπεδο x, y. Αυτές αντιστοιχούν στις μεταβλητές X10 ↔ x0 , X20 ↔ y0 , V10 ↔ vx0 , V20 ↔ vy0 , ενώ οι συναρτήσεις του χρόνου αντιστοιχούν στα arrays X1(P) ↔ x(t), X2(P) ↔ y(t), V1(P) ↔ vx (t), V2(P) ↔ vy (t). Η ολοκλήρωση γίνεται όπως και πριν καλώντας c a l l RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) και στο αρχείο rk2.dat αποθηκεύουμε τα αποτελέσματα μαζί με τη συνολική μηχανική ενέργεια που υπολογίζεται από τη συνάρτηση energy(t,x1,x2,v1,v2) η οποία βρίσκεται στο ίδιο αρχείο με τις επι- ταχύνσεις μια και η μορφή της εξαρτάται από τον τύπο της δύναμης: open ( u n i t =11 , f i l e = ’ rk2 . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ,& energy ( T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ) enddo Τέλος, πρέπει να γίνουν αλλαγές στον κώδικα της βασικής υπορουτίνας RKSTEP(t,x1,x2,x3,x4,dt) λόγω του μεγαλύτερου αριθμού μεταβλη- τών στο πρόβλημα. Παραθέτουμε ολόκληρο τον κώδικα για να διευκο- λύνουμε τον αναγνώστη: ! ======================================================== ! Program t o s o l v e a 4 ODE system using Runge−Kutta Method ! User must supply d e r i v a t i v e s ! dx1 / dt= f 1 ( t , x1 , x2 , x3 , x4 ) dx2 / dt=f 2 ( t , x1 , x2 , x3 , x4 ) ! dx3 / dt=f 3 ( t , x1 , x2 , x3 , x4 ) dx4 / dt=f 4 ( t , x1 , x2 , x3 , x4 ) ! as r e a l ( 8 ) f u n c t i o n s ! Output i s w r i t t e n i n f i l e rk2 . dat 5.1. RUNGE–KUTTA ΓΙΑ ΤΗΝ ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 261 ! ======================================================== program rk2_solve i m p l i c i t none i n t e g e r , parameter : : P=1010000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 , V1 , V2 r e a l ( 8 ) : : Ti , Tf , X10 , X20 , V10 , V20 i n t e g e r : : Nt , i real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : energy , E0 , EF , DE ! Input : p r i n t * , ’ Runge−Kutta Method f o r 4−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s : ’ read * , k1 , k2 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 p r i n t * , ’ Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : ’ read * , Nt , Ti , TF , X10 , X20 , V10 , V20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 print * , ’ V1 ( Ti )= ’ , V10 , ’ V2( Ti )= ’ , V20 ! The C a l c u l a t i o n : c a l l RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) ! Output : open ( u n i t =11 , f i l e = ’ rk2 . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , * ) T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ,& energy ( T ( i ) , X1 ( i ) , X2 ( i ) , V1 ( i ) , V2 ( i ) ) enddo close (11) ! Rutherford s c a t t e r i n g a n g l e s : p r i n t * , ’ v−a n g l e : ’ , atan2 ( V2 ( Nt ) , V1 ( Nt ) ) p r i n t * , ’ b−a n g l e : ’ , 2 . 0 D0 * atan ( k1 / ( V10 * V10 * X20 ) ) E0 = energy ( Ti , X10 , X20 , V10 , V20 ) EF = energy ( T ( Nt ) , X1 ( Nt ) , X2 ( Nt ) , V1 ( Nt ) , V2 ( Nt ) ) DE = ABS( 0 . 5 D0 * ( EF−E0 ) / ( EF+E0 ) ) p r i n t * , ’E0 , EF , DE/ E= ’ , E0 , EF , DE end program rk2_solve ! ======================================================== ! The v e l o c i t y f u n c t i o n s f1 , f 2 ( t , x1 , x2 , v1 , v2 ) ! ======================================================== r e a l ( 8 ) f u n c t i o n f1 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 f1=v1 ! dx1 / dt= v1 end f u n c t i o n f1 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f2 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none 262 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 f2=v2 ! dx2 / dt= v2 end f u n c t i o n f2 ! ======================================================== !RK(T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) i s t h e d r i v e r ! f o r t h e Runge−Kutta i n t e g r a t i o n r o u t i n e RKSTEP ! Input : I n i t i a l and f i n a l t i m e s Ti , Tf ! I n i t i a l v a l u e s a t t =Ti X10 , X20 , V10 , V20 ! Number o f s t e p s o f i n t e g r a t i o n : Nt−1 ! S i z e o f a r r a y s T , X1 , X2 , V1 , V2 ! Output : r e a l a r r a y s T( Nt ) , X1 ( Nt ) ,X2( Nt ) , ! V1 ( Nt ) ,V2( Nt ) where ! T ( 1 ) = Ti X1 ( 1 ) = X10 X2 ( 1 ) = X20 V1 ( 1 ) = V10 V2 ( 1 ) = V20 ! X1 ( k ) = X1 ( a t t =T( k ) ) X2( k ) = X2( a t t =T( k ) ) ! V1 ( k ) = V1 ( a t t =T( k ) ) V2( k ) = V2( a t t =T( k ) ) ! T( Nt )= Tf ! ======================================================== s u b r o u t i n e RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) i m p l i c i t none i n t e g e r : : Nt r e a l ( 8 ) , dimension ( Nt ) : : T , X1 , X2 , V1 , V2 r e a l ( 8 ) : : Ti , Tf r e a l ( 8 ) : : X10 , X20 r e a l ( 8 ) : : V10 , V20 r e a l ( 8 ) : : dt r e a l ( 8 ) : : TS , X1S , X2S ! v a l u e s o f time and X1 , X2 a t gi v e n s t e p real (8) : : V1S , V2S integer : : i ! I n i t i a l i z e variables : dt = ( Tf−Ti ) / ( Nt −1) T ( 1 ) = Ti X1 ( 1 ) = X10 ; X2 ( 1 ) = X20 V1 ( 1 ) = V10 ; V2 ( 1 ) = V20 TS = Ti X1S = X10 ; X2S = X20 V1S = V10 ; V2S = V20 ! Make RK s t e p s : The arguments o f RKSTEP a r e ! r e p l a c e d with t h e new ones do i =2 , Nt c a l l RKSTEP ( TS , X1S , X2S , V1S , V2S , dt ) T ( i ) = TS X1 ( i ) = X1S ; X2 ( i ) = X2S V1 ( i ) = V1S ; V2 ( i ) = V2S enddo end s u b r o u t i n e RK ! ======================================================== ! S u b r o u t i n e RKSTEP( t , x1 , x2 , dt ) ! Runge−Kutta I n t e g r a t i o n r o u t i n e o f ODE ! dx1 / dt= f 1 ( t , x1 , x2 , x3 , x4 ) dx2 / dt=f 2 ( t , x1 , x2 , x3 , x4 ) 5.1. RUNGE–KUTTA ΓΙΑ ΤΗΝ ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 263 ! dx3 / dt=f 3 ( t , x1 , x2 , x3 , x4 ) dx4 / dt=f 4 ( t , x1 , x2 , x3 , x4 ) ! User must supply d e r i v a t i v e f u n c t i o n s : ! r e a l f u n c t i o n f 1 ( t , x1 , x2 , x3 , x4 ) ! r e a l f u n c t i o n f 2 ( t , x1 , x2 , x3 , x4 ) ! r e a l f u n c t i o n f 3 ( t , x1 , x2 , x3 , x4 ) ! r e a l f u n c t i o n f 4 ( t , x1 , x2 , x3 , x4 ) ! Given i n i t i a l p o i n t ( t , x1 , x2 ) t h e r o u t i n e advances i t ! by time dt . ! Input : I n i t i a l time t and f u n c t i o n v a l u e s x1 , x2 , x3 , x4 ! Output : F i n a l time t +dt and f u n c t i o n v a l u e s x1 , x2 , x3 , x4 ! C a r e f u l ! : v a l u e s o f t , x1 , x2 , x3 , x4 a r e o v e r w r i t t e n . . . ! ======================================================== s u b r o u t i n e RKSTEP ( t , x1 , x2 , x3 , x4 , dt ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , x3 , x4 , dt r e a l ( 8 ) : : f1 , f2 , f3 , f4 r e a l ( 8 ) : : k11 , k12 , k13 , k14 , k21 , k22 , k23 , k24 r e a l ( 8 ) : : k31 , k32 , k33 , k34 , k41 , k42 , k43 , k44 r e a l ( 8 ) : : h , h2 , h6 h =dt ! h =dt , i n t e g r a t i o n s t e p h2 =0.5 D0 * h ! h2=h / 2 h6=h / 6 . 0 D0 ! h6=h / 6 k11=f1 ( t , x1 , x2 , x3 , x4 ) k21=f2 ( t , x1 , x2 , x3 , x4 ) k31=f3 ( t , x1 , x2 , x3 , x4 ) k41=f4 ( t , x1 , x2 , x3 , x4 ) k12=f1 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k22=f2 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k32=f3 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k42=f4 ( t+h2 , x1+h2 * k11 , x2+h2 * k21 , x3+h2 * k31 , x4+h2 * k41 ) k13=f1 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k23=f2 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k33=f3 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k43=f4 ( t+h2 , x1+h2 * k12 , x2+h2 * k22 , x3+h2 * k32 , x4+h2 * k42 ) k14=f1 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h2 * k43 ) k24=f2 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h2 * k43 ) k34=f3 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h2 * k43 ) k44=f4 ( t+h , x1+h * k13 , x2+h * k23 , x3+h * k33 , x4+h2 * k43 ) t =t+h x1=x1+h6 * ( k11 +2.0 D0 * ( k12+k13 )+k14 ) x2=x2+h6 * ( k21 +2.0 D0 * ( k22+k23 )+k24 ) x3=x3+h6 * ( k31 +2.0 D0 * ( k32+k33 )+k34 ) x4=x4+h6 * ( k41 +2.0 D0 * ( k42+k43 )+k44 ) 264 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ end s u b r o u t i n e RKSTEP 5.2 Βολές στο Βαρυτικό Πεδίο της Γης Θεωρούμε αρχικά σωματίδιο υπό την επίδραση δύναμης που του προσ- δίδει επιτάχυνση ⃗g = −g ŷ x(t) = x0 + v0x t , y(t) = y0 + v0y t − 12 gt2 vx (t) = v0x , vy (t) = v0y − gt (5.2) ax (t) = 0 , ay (t) = −g Το σωματίδιο, όπως γνωρίζουμε καλά, κινείται πάνω σε μια παραβολή στην οποία εμείς απλά διαλέγουμε το σημείο στο οποίο τοποθετείται αρχικά το σωμάτιο: ( ) v0y 1 g (y − y0 ) = (x − x0 ) − 2 (x − x0 )2 v0x 2 v0x tan2 θ = tan θ (x − x0 ) − (x − x0 )2 , (5.3) 4hmax όπου tan θ = v0y /v0x και hmax η γωνία υπό την οποία βάλλεται το σω- μάτιο και το μέγιστο ύψος που φτάνει το σωμάτιο ως προς το αρχικό σημείο βολής. Κωδικοποιούμε την επιτάχυνση ax (t) = 0 ay (t) = −g (ax ↔ f3 , ay ↔ f4) καθώς και τη συνολική μηχανική ενέργεια στο αρχείο rk2_g.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Free f a l l i n c o n s t a n t g r a v i t a t i o n a l f i e l d with ! g = −k2 r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f3 =0.0 D0 ! dx3 / dt=dv1 / dt=a1 end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none 5.2. ΒΟΛΕΣ ΣΤΟ ΒΑΡΥΤΙΚΟ ΠΕΔΙΟ ΤΗΣ ΓΗΣ 265 0.25 0.06 x(t) y(t) 0.05 0.2 0.04 0.15 0.03 0.1 0.02 0.05 0.01 0 0 0 0.05 0.1 0.15 0.2 0.25 0 0.05 0.1 0.15 0.2 0.25 1.01 1 vx(t) vy(t) 1.005 0.5 1 0 0.995 -0.5 0.99 -1 0.985 -1.5 0 0.05 0.1 0.15 0.2 0.25 0 0.05 0.1 0.15 0.2 0.25 Σχήμα 5.1: Βολή στο βαρυτικό πεδίο με επιτάχυνση ⃗g = −10.0ŷ και αρχική ταχύτητα ⃗v0 = x̂ + ŷ. Δίνονται τα διαγράμματα x(t), y(t), vx (t), vy (t). r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f4=−k1 ! dx4 / dt=dv2 / dt=a2 end f u n c t i o n f4 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 energy = 0.5 D0 * ( v1 * v1+v2 * v2 ) + k1 * x2 end f u n c t i o n energy Στη συνέχεια παραθέτουμε τη σειρά εντολών που δίνει ο χρήστης για να υπολογίσει την τροχιά > g f o r t r a n −O2 rk2 . f90 rk2_g . f90 −o rk2 > . / rk2 Runge−Kutta Method for 4−ODEs Integration Enter coupling constants : 10.0 0.0 266 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 0.06 1.8e-05 E(t)-E(0) 1.6e-05 0.05 1.4e-05 0.04 1.2e-05 0.03 1e-05 y 8e-06 0.02 6e-06 0.01 4e-06 2e-06 0 0 0.05 0.1 0.15 0.2 0.25 0 x 0 0.05 0.1 0.15 0.2 0.25 Σχήμα 5.2: Βολή στο βαρυτικό πεδίο με επιτάχυνση ⃗g = −10.0ŷ και αρχική ταχύτητα ⃗v0 = x̂ + ŷ. Φαίνεται η παραβολική τροχιά που ακολουθεί το σωμάτιο. Στο διπλανό σχήμα παρακολουθούμε την απόκλιση της μηχανικής ενέργειας του σωματιδίου από την αρχική της τιμή. k1= 10.000000 k2= 0.000000 Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : 20000 0.0 0.2 0.0 0.0 1 . 0 1 . 0 Nt= 20000 Time : Initial Ti = 0.000000 Final Tf= 0.200000 X1 ( Ti )= 0.000000 X2 ( Ti )= 0.000000 V1 ( Ti )= 1.000000 V2 ( Ti )= 1.000000 Στη συνέχεια, επεξεργαζόμαστε τα αποτελέσματά μας αναλύοντας τα δεδομένα από το αρχείο rk2.dat με το πρόγραμμα gnuplot: gnuplot > s e t t e r m i n a l x11 1 gnuplot > p l o t ” rk2 . dat ” using 1 : 2 with lines t i t l e ”x ( t ) ” gnuplot > s e t t e r m i n a l x11 2 gnuplot > p l o t ” rk2 . dat ” using 1 : 3 with lines t i t l e ”y ( t ) ” gnuplot > s e t t e r m i n a l x11 3 gnuplot > p l o t ” rk2 . dat ” using 1 : 4 with lines t i t l e ” vx ( t ) ” gnuplot > s e t t e r m i n a l x11 4 gnuplot > p l o t ” rk2 . dat ” using 1 : 5 with lines t i t l e ” vy ( t ) ” gnuplot > s e t t e r m i n a l x11 5 gnuplot > p l o t ” rk2 . dat ” using 1 : ( $6 −1.0) w lines t ”E( t ) Ε−(0) ” gnuplot > s e t t e r m i n a l x11 6 gnuplot > s e t s i z e square gnuplot > set t i t l e ” Trajectory ” gnuplot > p l o t ” rk2 . dat ” using 2:3 with lines notit Τα αποτελέσματα φαίνονται στο σχήματα 5.1 και 5.2. Παρατηρούμε μικρή αύξηση της ενέργειας που μας δίνει και το μέτρο της ακρίβειας της μεθόδου. Με τη βοήθεια του gnuplot μπορούμε να φτιάξουμε κινούμενα σχέ- 5.2. ΒΟΛΕΣ ΣΤΟ ΒΑΡΥΤΙΚΟ ΠΕΔΙΟ ΤΗΣ ΓΗΣ 267 δια της τροχιάς. Για το λόγο αυτό ομαδοποιούμε μερικές εντολές του gnuplot σε αρχείο σεναρίου, έστω στο rk2_animate.gpl icount = icount+skip p l o t ”< c a t −n rk2 . dat ” \ using 3 : ( $1<= icount ? $4 : 1 / 0 ) with lines notitle # pause 1 i f ( icount < nlines ) r e r e a d Το παραπάνω αρχείο υποθέτει ότι, όταν τρέξουμε το 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 διαβάζει δεδομένα στα οποία η πρώτη στήλη είναι ο αριθμός γραμμής, η δεύτερη ο χρόνος, η τρίτη η συντε- ταγμένη x, η τέταρτη η συντεταγμένη y κ.ο.κ. Η γραμμή using 3 : ( $1<= icount ? $4 : 1 / 0 ) λέει να χρησιμοποιηθεί η 3η στήλη στον οριζόντιο άξονα και αν η πρώτη στήλη είναι μικρότερη από την τιμή της μεταβλητής icount να μπει στον κατακόρυφο άξονα η τιμή της 4ης στήλης αλλιώς τίποτα (βάζοντας κάτι που δεν είναι νόμιμο, όπως διαίρεση με το 0 κάνει το gnuplot να αγνο- ήσει το συγκεκριμένο σημείο). Με τον τρόπο αυτό, καθώς η τιμή της μεταβλητής icount αυξάνει, τοποθετούμε στο διάγραμμα περισσότερα σημεία της τροχιάς δημιουργώντας την ψευδαίσθηση της κίνησης. Τη γραμμή με την εντολή pause την έχουμε βάλει ως σχόλιο. Αν τα κινού- μενα σχέδια είναι πολύ γρήγορα για σας, βγάλτε το χαρακτήρα του σχολίου # και αντικαταστήστε τη μονάδα με τον αριθμό δευτερολέπτων που θέλετε να σταματάει κάθε πλαίσιο. Για να χρησιμοποιήσουμε το σενάριο αυτό από το gnuplot δίνουμε τις εντολές gnuplot > icount = 10 268 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ gnuplot > skip = 200 gnuplot > nlines = 20000 gnuplot > load ” rk2_animate . gpl ” Τα παραπάνω σενάρια θα τα βρείτε στο συνοδευτικό λογισμικό του κεφαλαίου. Εκεί θα βρείτε και σενάρια φλοιού τα οποία θα σας βοηθή- σουν να αυτοματοποιήσετε πολλές από τις εντολές που περιγράψαμε παραπάνω. Περιγράφουμε τη χρήση δύο από αυτών. Πρώτα το σενάριο rk2_animate.csh: > rk2_animate . csh −h Usage : rk2_animate . csh −t [ sleep time ] −d [ skip points ] <file > Default file is rk2 . dat Other options : −x : s e t lower value in xrange −X : s e t lower value in xrange −y : s e t lower value in yrange −Y : s e t lower value in yrange −r : automatic determination of x−y range > rk2_animate . csh −r −d 500 rk2 . dat Η τελευταία γραμμή πραγματοποιεί τα κινούμενα σχέδια με πλαίσια που κάθε φορά έχουν 500 παραπάνω σημεία, ενώ τα όρια των πλαισίων υπολογίζονται αυτόματα από το σενάριο με το διακόπτη -r. Ο διακό- πτης -h δίνει σύντομες οδηγίες για τη χρήση του σεναρίου, μια σύμβαση που την ακολουθούμε συχνά στα σενάρια/προγράμματα που γράφουμε. Ένα πιο πλήρες σενάριο που κάνει όλες τις δουλειές είναι το rk2.csh. Οδηγίες χρήσης παίρνουμε με την εντολή > . / rk2 . csh −h Usage : rk2 . csh −f <force > k1 k2 x10 x20 v10 v20 STEPS t0 tf Other Options : −n Do not animate trajectory Available forces ( value of <force >) : 1 : ax=−k1 ay= −k2 y Harmonic oscillator 2 : ax= 0 ay= −k1 Free fall 3 : ax= −k2 vx ay= −k2 vy − k1 Free fall + \ air resistance ~ v 4 : ax= −k2 | v | vx ay= −k2 | v | vy − k1 Free fall + \ air resistance ~ v^2 5 : ax= k1 * x1 / r^3 ay= k1 * x2 / r^3 Coulomb Force .... όπου φαίνεται ότι έχουμε την επιλογή να τρέξουμε το πρόγραμμα με διαφορετικές δυνάμεις που επιλέγονται με το διακόπτη -f. Στην υπό- 5.2. ΒΟΛΕΣ ΣΤΟ ΒΑΡΥΤΙΚΟ ΠΕΔΙΟ ΤΗΣ ΓΗΣ 269 λοιπη γραμμή εντολών δίνουμε τα δεδομένα εισόδου για το πρόγραμμα rk2.f90, τις σταθερές ζεύξης k1, k2, τις αρχικές συνθήκες x10, x20, v10, v20 και τις συνθήκες ολοκλήρωσης STEPS, t0, tf. Έτσι για πα- ράδειγμα οι εντολές > rk2 . csh -f 2 -- 10.0 0.0 0.0 0.0 1 . 0 1 . 0 20000 0.0 0.2 > rk2 . csh -f 1 -- 16.0 1 . 0 0.0 1 . 0 1 . 0 0.0 20000 0.0 6.29 > rk2 . csh -f 5 -- 10.0 0.0 -10 0.2 1 0 . 0.0 20000 0.0 3.00 μας δίνουν την κίνηση του σωματιδίου στο πεδίο βαρύτητας που μελε- τήσαμε ως τώρα, την κίνηση ανομοιογενούς αρμονικού ταλαντωτή (k1 = ax = −ω12 x, k2 = ay = −ω22 y) και τη σκέδαση φορτίου σε πεδίο Coulomb - δοκιμάστε τα! Ελπίζω να σας δημιουργηθεί και η περιέργεια να δείτε “μέσα” στα σενάρια, έτσι ώστε να τα τροποποιείτε και δημιουργείτε από μόνοι/ες σας. Από μένα μερικές οδηγίες για τους τεμπέληδες: Αν θελήσετε να προσθέσετε μια δική σας δύναμη στο ρεπερτόριο του σενα- ρίου ακολουθήστε τη συνταγή: Προγραμματίστε τη δύναμή σας σε ένα αρχείο με όνομα rk2_myforce.f90 σύμφωνα με τις προδιαγραφές του rk2_g.f90. Επεξεργαστείτε το αρχείο rk2.csh και αλλάξτε τη γραμμή s e t forcecode = ( hoc g vg v2g cb ) σε s e t forcecode = ( hoc g vg v2g cb myforce ) (φυσικά μπορεί η μεταβλητή $forcecode να έχει και άλλες εγγραφές στο σενάριο αλλά αυτό δεν θα σας εμποδίσει). Μετρήστε σε ποια σειρά έχετε βάλει το myforce, εδώ την 6η, και τρέξτε την εντολή με το διακόπτη -f 6 όπου το 6 αντικαταστήστε το με τη σειρά στο δικό σας σενάριο (οι τελίτσες είναι οι δικές σας σταθ. ζεύξης και αρχικές συνθήκες): > rk2 . csh −f 6 −− . . . . . . . Ας μελετήσουμε τώρα την επίδραση της αντίστασης του αέρα ή ενός ρευστού στην πτώση/βολή του σωματιδίου. Για μικρές ταχύτητες η αντί- σταση γίνεται ανάλογη της ταχύτητας και έχουμε F⃗r = −mk⃗v οπότε ax = −kvx ay = −kvy − g . (5.4) 270 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ Παίρνοντας v0x ( ) x(t) = x0 + 1 − e−kt k 1( g)( ) g y(t) = y0 + v0y + 1 − e−kt − t k k k −kt vx (t) = v0x e ( g ) −kt g vy (t) = v0y + e − , (5.5) k k προκύπτει η κίνηση του σωματιδίου με ορική ταχύτητα vy (+∞) = −g/k (x(+∞) = σταθ., y(+∞) ∼ t). Ο προγραμματισμός της επιτάχυνσης καταγράφεται στο αρχείο (k1 ↔ g, k2 ↔ k ) rk2_vg.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Free f a l l i n c o n s t a n t g r a v i t a t i o n a l f i e l d with ! ax = −k2 vx ay = −k2 vy − k1 r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f3=−k2 * v1 ! dx3 / dt=dv1 / dt=a1 end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 f4=−k2 * v2−k1 ! dx4 / dt=dv2 / dt=a2 end f u n c t i o n f4 Τα αποτελέσματα καταγράφονται στα σχήματα 5.3 όπου φαίνεται η επίδραση της αυξανόμενης αντίστασης στην τροχιά του σωματιδίου. Στο σχήμα 5.4 δίνεται για σύγκριση η επίδραση δύναμης F⃗r = −mkv 2 v̂. 5.3. ΚΙΝΗΣΗ ΠΛΑΝΗΤΩΝ 271 1.4 0.0 0.0 0.05 0.2 0.2 1.0 1.2 1.0 5.0 5.0 0.04 10.0 1 10.0 20.0 20.0 30.0 0.8 30.0 0.03 y y 0.6 0.02 0.4 0.01 0.2 0 0 0 0.05 0.1 0.15 0.2 0 0.2 0.4 0.6 0.8 1 x x Σχήμα 5.3: Τροχιά σωματιδίου που βάλλεται στο σταθερό βαρυτικό πεδίο της γης ⃗g = −10ŷ υπό την επίδραση αντίστασης ρευστού ⃗ar = −k⃗v για k = 0, 0.2, 1, 5, 10, 20, 30. Αριστερά έχουμε ⃗v (0) = x̂ + ŷ, ενώ δεξιά ⃗v (0) = 5x̂ + 5ŷ. 1.4 0.0 0.0 0.05 0.2 0.2 1.0 1.2 1.0 5.0 5.0 0.04 10.0 1 10.0 20.0 20.0 30.0 0.8 30.0 0.03 y y 0.6 0.02 0.4 0.01 0.2 0 0 0 0.05 0.1 0.15 0.2 0 0.2 0.4 0.6 0.8 1 x x Σχήμα 5.4: Τροχιά σωματιδίου που βάλλεται στο σταθερό βαρυτικό πεδίο της γης ⃗g = −10 ŷ υπό την επίδραση αντίστασης ρευστού ⃗ar = −kv 2 v̂ για k = 0, 0.2, 1, 5, 10, 20, 30. Αριστερά έχουμε ⃗v (0) = x̂ + ŷ, ενώ δεξιά ⃗v (0) = 5x̂ + 5ŷ. 5.3 Κίνηση Πλανητών Θα θεωρήσουμε το απλό πλανητικό μοντέλο του “ήλιου” με μάζα M και ενός πλανήτη “γη” με μάζα m έτσι ώστε m ≪ M . Ο νόμος του Νεύτωνα μας δίνει ότι η επιτάχυνση της “γης” δίνεται από τη σχέση GM GM ⃗a = ⃗g = − 2 r̂ = − 3 ⃗r . (5.6) r r Θυμίζουμε στον αναγνώστη ότι G = 6.67 × 10−11 kgrm·sec2 , M = 1.99 × 3 1030 kgr, m = 5.99 × 1024 kgr. Επίσης, όταν η υπόθεση m ≪ M δεν είναι ικανοποιητική, τότε το πρόβλημα των δύο σωμάτων ανάγεται σε αυτό του ενός χρησιμοποιώντας την ανηγμένη μάζα 1 1 1 = + . µ m M 272 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ Η δύναμη της βαρύτητας είναι κεντρική με αποτέλεσμα να διατηρεί- ⃗ = ⃗r × p⃗. Αυτό σημαίνει ότι η κίνηση γίνεται πάνω σε ται η στροφορμή L ένα επίπεδο και μπορούμε να πάρουμε τον άξονα των z, έτσι ώστε ⃗ = Lz k̂ = m(xvy − yvx )k̂ . L (5.7) Η δύναμη είναι διατηρητική και η ενέργεια 1 GmM E = mv 2 − (5.8) 2 r διατηρείται. Αν πάρουμε την αρχή των αξόνων να είναι το κέντρο της δύναμης, τότε οι εξισώσεις κίνησης (5.6) γίνονται GM ax = − x r3 GM ay = − 3 y (5.9) r με r2 = x2 + y 2 . Οι εξισώσεις αυτές είναι ένα σύστημα δύο συζευγμέ- νων διαφορικών εξισώσεων ως προς τις συναρτήσεις x(t), y(t). Οι λύσεις είναι κωνικές τομές που είναι είτε έλλειψη (δεσμευμένη τροχιά - “πλα- νήτης ”), είτε παραβολή (για τη λεγόμενη “ταχύτητα διαφυγής ”), είτε υπερβολή (σκέδαση). Για την περίοδο περιστροφής των πλανητών ισχύει ο τρίτος νόμος του Κέπλερ 2 4π 2 3 T = a (5.10) GM όπου εδώ a είναι ο μεγάλος ημιάξονας της ελλειπτικής τροχιάς και b ο μικρός ημιάξονας. Το πόσο “πλατιά” είναι η έλλειψη χαρακτηρίζεται από την εκκεντρότητα της τροχιάς √ b2 e= 1− 2 , (5.11) a η οποία είναι 0 για τον κύκλο και τείνει προς τη 1 όταν την “πατάμε” να γίνει ευθεία. Σε απόσταση ea από το κέντρο της έλλειψης βρίσκονται οι εστίες της F1 και F2 . Αυτές έχουν την ιδιότητα ότι κάθε σημείο P της τροχιάς έχει P F1 + P F2 = 2a . (5.12) Για να προγραμματίσουμε τη δύναμη του Νεύτωνα γράφουμε στο αρχείο rk2_cb.f90: 5.3. ΚΙΝΗΣΗ ΠΛΑΝΗΤΩΝ 273 ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Motion i n Coulombic p o t e n t i a l : ! ax= k1 * x1 / r ^3 ay= k1 * x2 / r ^3 r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r3 r2=x1 * x1+x2 * x2 r3=r2 * sqrt ( r2 ) i f ( r3 . gt . 0 . 0 D0 ) then f3=k1 * x1 / r3 ! dx3 / dt=dv1 / dt=a1 else f3 =0.0 D0 endif end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r3 r2=x1 * x1+x2 * x2 r3=r2 * sqrt ( r2 ) i f ( r3 . gt . 0 . 0 D0 ) then f4=k1 * x2 / r3 ! dx4 / dt=dv2 / dt=a2 else f4 =0.0 D0 endif end f u n c t i o n f4 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 real (8) : : r r=sqrt ( x1 * x1+x2 * x2 ) i f ( r . gt . 0.0 D0 ) then energy = 0.5 D0 * ( v1 * v1+v2 * v2 ) + k1 / r else energy = 0.0 D0 endif 274 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ end f u n c t i o n energy Στο παραπάνω πρόγραμμα k1= −GM και έχουμε προσέξει την περί- πτωση το σωμάτιο να προσκρούσει στο ιδιάζον σημείο (0, 0), το κέντρο της δύναμης. Προφανώς ο ίδιος κώδικας μπορεί να χρησιμοποιηθεί και για το ηλεκτροστατικό πεδίο Coulomb με k1= qQ/4πϵ0 m. Κατ’ αρχήν μελετάμε τροχιές οι οποίες είναι δέσμιες. Διαλέγουμε GM = 10, x(0) = 1.0, y(0) = 0, v0x = 0 και v0y μεταβλητό. Μετράμε την περίοδο και το μήκος των ημιαξόνων της έλλειψης. Προκύπτει ο πίνακας 5.1. Μερικές από τις τροχιές φαίνονται στο σχήμα 5.5 όπου φαίνεται η v0x T /2 2a 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.1: Τα αποτελέσματα για την περίοδο και τον μεγάλο ημιάξονα της ελλει- πτικής τροχιάς πλανητικής κίνησης για GM = 10, x(0) = 1.0, y(0) = 0, v0y = 0. εξάρτηση του μεγέθους της έλλειψης από την περίοδο. Στο σχήμα 5.6, επιβεβαιώνουμε τον 3ο νόμο του Κέπλερ, Σχέση (5.10). Πώς θα μπορούσαμε να προβλέψουμε το νόμο του Κέπλερ χωρίς να γνωρίζαμε το αποτέλεσμα εκ των προτέρων; Αν πάρουμε το λογάριθμο και στα δύο μέλη της εξίσωσης (5.10) προκύπτει: ( 2) 3 1 4π ln T = ln a + ln (5.13) 2 2 GM Άρα σε ένα διάγραμμα των σημείων (ln a, ln T ) τα σημεία πρέπει να βρίσκονται πάνω σε μια ευθεία. Με τη μέθοδο των ελαχίστων τετρα- γώνων μπορούμε να υπολογίσουμε το συντελεστή κατεύθυνσης και το σημείο τομής των αξόνων που θα πρέπει να είναι 32 και 1/2 ln (4π 2 /GM ) αντίστοιχα. Το αφήνουμε σαν άσκηση για τον αναγνώστη. 5.4. ΣΚΕΔΑΣΗ 275 8 1.68 6 2.40 3.93 4 5.52 16.95 2 0 y -2 -4 -6 -8 -14 -12 -10 -8 -6 -4 -2 0 2 x Σχήμα 5.5: Τροχιές πλανήτη για GM = 10, x(0) = 1.0, y(0) = 0, v0y = 0 και v0x = 3.6, 3.8, 4.0, 4.1, 4.3. Αναγράφονται οι αντίστοιχες ημιπερίοδοι. Σε περίπτωση που η αρχική ταχύτητα του σωματιδίου υπερβεί την ταχύτητα διαφυγής ve , το σωμάτιο ξεφεύγει από την επίδραση του πε- δίου βαρύτητας. Αυτό γίνεται όταν η μηχανική του ενέργεια (5.8) είναι 0 ή όταν 2GM ve2 = , (5.14) r που στην περίπτωση που εξετάζουμε με GM = 10, x(0) = 1.0, y(0) = 0, παίρνουμε ve ≈ 4.4721 . . .. Αφήνουμε για άσκηση στον αναγνώστη τον αριθμητικό προσδιορισμό της ve . 5.4 Σκέδαση Στην παράγραφο αυτή θεωρούμε σκέδαση σωματιδίων από ένα κε- ντρικό δυναμικό ¹. Υποθέτουμε ότι στο δυναμικό αυτό υπάρχουν τροχιές που ξεκινούν από το άπειρο και καταλήγουν στο άπειρο, στο οποίο τα σωματίδια κινούνται σχεδόν ελεύθερα από την επίδραση της δύναμης. Έτσι αρχικά τα σωματίδια κινούνται ελεύθερα προς την περιοχή της ¹Διαβάστε το κεφάλαιο 4 του [37] 276 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 100000 10000 1000 2 T 100 10 1 1 10 100 1000 10000 3 a Σχήμα 5.6: Ο τρίτος νόμος του Κέπλερ για GM = 10. Τα σημεία είναι οι μετρήσεις από τον πίνακα 5.1 και η γραμμή που τα συνδέει είναι η αναλυτική λύση (5.10). αλληλεπίδρασης μέσα στην οποία αλλάζουν κατεύθυνση και κινούνται πάλι έξω από αυτή σε διαφορετική διεύθυνση. Λέμε τότε ότι το σωμάτιο σκεδάστηκε και ότι η γωνία μεταξύ της αρχικής και τελικής διεύθυνσης της ταχύτητας είναι η γωνία σκέδασης θ. Το ενδιαφέρον στην περίπτωση αυτή έγκειται στο γεγονός ότι από την κατανομή της γωνίας σκέδασης μιας δέσμης σωματιδίων μπορούμε να πάρουμε χρήσιμη πληροφορία για το δυναμικό σκέδασης. Αυτή η τεχνική χρησιμοποιείται κατά κόρον στους σημερινούς επιταχυντές για την μελέτη των θεμελιωδών αλληλε- πιδράσεων των στοιχειωδών σωματιδίων. Για να κατανοήσουμε τους ορισμούς είναι χρήσιμο να θεωρήσουμε τη σκέδαση μικρών σκληρών σφαιρών ακτίνας r1 από άλλες σκληρές σφαίρες ακτίνας R2 . Το δυναμικό αλληλεπίδρασης² είναι δηλαδή: { 0 r > R2 + r1 V (r) = , (5.15) ∞ r < R2 + r1 όπου r είναι η απόσταση του κέντρου της r1 από το κέντρο της R2 . Υποθέτουμε ότι τα σωματίδια της δέσμης δεν αλληλεπιδρούν μεταξύ τους και ότι κατά τη σκέδαση κάθε σωμάτιο αλληλεπιδρά μόνο με ένα ²Λέγεται δυναμικό σκληρού πυρήνα (hard core potential). 5.4. ΣΚΕΔΑΣΗ 277 1 0.8 0.6 0.4 0.2 y 0 -0.2 -0.4 -0.6 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 x Σχήμα 5.7: Σπειροειδής τροχιά σωματιδίου που κινείται υπό την επίδραση κεντρική δύναμης F⃗ = −k/r3 r̂. κέντρο σκέδασης του στόχου. Έστω J η πυκνότητα ροής ή ένταση της δέσμης³ και A η διατομή της δέσμης. Έστω ότι ο στόχος έχει n σωματίδια ανά μονάδα επιφάνειας. Η ενεργός διατομή της αλληλεπίδρασης είναι σ = π(r1 + R2 )2 όπου r1 και R2 οι ακτίνες των σκεδαζομένων σφαιρών και των στόχων αντίστοιχα [βλ. σχήμα (5.8)]: όλες οι σφαίρες έξω από την επιφάνεια αυτή στη δέσμη δεν σκεδάζονται από το συγκεκριμένο στόχο. Η συνολική ενεργός διατομή που παρουσιάζουν όλα τα κέντρα αλληλεπίδρασης του στόχου είναι Σ = nAσ, (5.16) όπου nA είναι ο συνολικός αριθμός των κέντρων του στόχου που βρί- σκονται μέσα στην δέσμη. Κατά μέσο όρο, ο ρυθμός σκέδασης, δηλ. ο αριθμός των σκεδάσεων ανά μονάδα χρόνου θα είναι N = JΣ = JnAσ . (5.17) Η παραπάνω εξίσωση αποτελεί και τον ορισμό της συνολικής ενεργούς διατομής σ της αλληλεπίδρασης για οποιαδήποτε άλλη περίπτωση σκέ- δασης που πληρεί τις βασικές υποθέσεις που κάναμε. Η ποσότητα αυτή ³Ο αριθμός των σωματιδίων που περνούν από μια επιφάνεια κάθετη στη δέσμη ανά μονάδα χρόνου και μονάδα επιφανείας. 278 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 11 00 00 11 00 11 00 11 θ 11 00 111 000 11111111 00000000 111 000 11 00 000 111 11111111 00000000 000 111 00 11 000 111 00000000 11111111 000 111 00 11 000 111 00000000 11111111 000 111 00 11 11 00000000 11111111 00 11 00 11111111 00000000 11111111 00000000 00000000 11111111 R2 00 11 00 11 00 11 11111111 00000000 00 11 00000000 11111111 11 00 00000000 11111111 11111111 00 11 00000000 11 00 r1111 000 000 111 000 111 00000000 11111111 000 111 11111111 00000000 000 111 000 111 11 00 00 11 00 11 R+r 2 1 11 00 00 11 00 11 11 00 σ 000 111 000 111 00 11 11 00 111 000 000 111 111 000 000 111 11 00 00 11 000 111 000 111 00 11 000 111 000 111 00 11 Σχήμα 5.8: Σκέδαση σκληρών σφαιρών. θ είναι η γωνία σκέδασης. Δεξιά φαίνεται η συνολική ενεργός διατομή σ. εξαρτάται από το είδος της αλληλεπίδρασης. Η διαφορική ενεργός δια- τομή σ(θ) ορίζεται από τη σχέση dN = JnAσ(θ) dΩ , (5.18) όπου dN ο αριθμός των σωματιδίων ανά μονάδα χρόνου που σκεδά- ζονται μέσα στη στερεά γωνία dΩ. Η συνολική ενεργός διατομή είναι vf vi b 111 000 000 111 θ 000 111 000 111 000 111 db Σχήμα 5.9: Σωματίδια της δέσμης που περνούν μέσα από το δακτύλιο 2πbdb σκεδά- ζονται μέσα στη στερεά γωνία dΩ = 2πsinθ dθ. 5.4. ΣΚΕΔΑΣΗ 279 ∫ ∫ ∫ σtot = σ(θ) dΩ = σ(θ) sin θ dθdϕ = 2π σ(θ) sin θ dθ . (5.19) Ω Στην τελευταία σχέση χρησιμοποιήσαμε την κυλινδρική συμμετρία της αλληλεπίδρασης ως προς τον άξονα της κρούσης. Καταλήγουμε στη σχέση 1 dN σ(θ) = . (5.20) nAJ 2π sin θ dθ Αυτή η σχέση μπορεί να χρησιμοποιηθεί πειραματικά για τη μέτρηση της διαφορικής ενεργούς διατομής μετρώντας το ρυθμό ανίχνευσης σω- ματιδίων μέσα σε δύο κώνους που ορίζονται από τις γωνίες θ και θ + dθ. Τη σχέση αυτή θα χρησιμοποιήσουμε και στον αριθμητικό υπολογισμό της σ(θ). Για να προσδιορίσουμε τη διαφορική ενεργό διατομή από μια θε- ωρία, μπορούμε να ακολουθήσουμε την εξής γενική διαδικασία. Έστω ότι σωμάτιο βάλλεται προς τον στόχο όπως φαίνεται στο σχήμα 5.9. b ονομάζεται η παράμετρος κρούσης και η τελική γωνία θ εξαρτάται από αυτή. Άρα το μέρος της δέσμης που σκεδάζεται σε γωνίες μεταξύ θ και θ + dθ βρίσκεται σε ένα κυκλικό δαχτυλίδι ακτίνας b(θ), πάχους db και εμβαδού 2πb db. Αφού έχουμε ένα σωμάτιο στο στόχο nA = 1. Ο αριθμός των σωματιδίων ανά μονάδα χρόνου που περνούν μέσα από το δαχτυλίδι είναι J2πb db, άρα 2πb(θ) db = −2πσ(θ) sin θ dθ (5.21) (το − οφείλεται στο γεγονός ότι, όταν το b αυξάνει, το θ μικραίνει). Από το δυναμικό μπορούμε να υπολογίσουμε το b(θ) οπότε προκύπτει η σ(θ). Αντίστροφα, αν μετρήσουμε τη σ(θ), μπορούμε να προσδιορίσουμε την b(θ). 5.4.1 Σκέδαση Rutherford Η σκέδαση φορτισμένου σωματιδίου φορτίου q (“ηλεκτρονίου’) μέσα σε δυναμικό Coulomb πολύ βαρύτερου σημειακού ηλεκτρικού φορτίου Q (“πυρήνας ”) ονομάζεται σκέδαση Rutherford. Στην περίπτωση αυτή το δυναμικό αλληλεπίδρασης είναι 1 Q V (r) = , (5.22) 4πϵ0 r το οποίο προσδίδει επιτάχυνση ⃗a στο σωματίδιο ίση με qQ r̂ ⃗r ⃗a = 2 ≡α 3. (5.23) 4πϵ0 m r r 280 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ Η ενέργεια του σωματιδίου είναι E = 21 mv 2 και το μέτρο της στροφορ- μής του είναι l = mvb, όπου εδώ v ≡ |⃗v |. Η σχέση μεταξύ της παραμέ- τρου κρούσης και της γωνίας σκέδασης βρίσκεται να είναι [37] α θ b(θ) = 2 cot , (5.24) v 2 όπου σε συνδυασμό με την (5.21) προκύπτει ότι α2 1 −4 θ σ(θ) = sin . (5.25) 4 v4 2 Αρχικά εξετάζουμε τις τροχιές σκέδασης. Τα αποτελέσματα φαίνονται 40 35 30 25 20 15 10 5 0 -20 -15 -10 -5 0 5 10 15 20 Σχήμα 5.10: Τροχιές σκέδασης Rutherford. Θέσαμε k1 ≡ 4πϵ qQ 0m = 1 στο αρχείο rk2_cb.f90 και μελετήσαμε τις τροχιές για b = 0.08, 0.015, 0.020, 0.035, 0.080, 0.120, 0.200, 0.240, 0.320, 0.450, 0.600, 1.500. Το σωμάτιο τοποθετήθηκε αρχικά στη θέση x(0) = −50 και του δόθηκε αρχική ταχύτητα v = 3. Ο αριθμός των βημάτων στην ολοκλήρωση είναι 1000 για χρόνο από 0 έως 30. ποιοτικά στο σχήμα 5.10 στην περίπτωση που τα φορτισμένα σωμάτια έχουν ομώνυμα φορτία. Ανάλογο σχήμα προκύπτει και για ετερώνυμα φορτία. Στην περίπτωση αυτή πρέπει να δοθεί ιδιαίτερη προσοχή στην ακρίβεια της μεθόδου για μικρές παραμέτρους κρούσης b < 0.2 (και τις υπόλοιπες παραμέτρους όπως στο σχήμα 5.10) όπου η γωνία σκέδα- σης γίνεται ≈ 1. Πολύ μεγαλύτερος αριθμός βημάτων απαιτείται για 5.4. ΣΚΕΔΑΣΗ 281 την επίτευξη ικανοποιητικής ακρίβειας. Βρίσκουμε ότι η ποσότητα που μπορεί να χρησιμοποιηθεί σαν δείκτης που δείχνει την σύγκλιση των αριθμητικών αποτελεσμάτων με αυτά της Σχέσης (5.24) είναι η ενέρ- γεια, η οποία πρέπει να διατηρείται κατά την κρούση. Αυτό θα μας χρησιμεύσει όταν θα μελετήσουμε δυναμικά για τα οποία δεν έχουμε αναλυτική λύση. Για να μελετήσουμε ποσοτικά τα αποτελέσματά μας αυξάνουμε την ακρίβεια, έτσι ώστε να πετύχουμε ικανοποιητική σύγκλιση των ανα- λυτικών και αριθμητικών αποτελεσμάτων. Καταρτίζουμε έτσι τον πί- νακα 5.2. Θα περιγράψουμε τώρα ένα τρόπο για τον υπολογισμό b θn θa ∆E/E Nt 0.008 2.9982 2.9978 1.06 10−5 5000 0.020 2.7861 2.7854 6.25 10−5 5000 0.030 2.6152 2.6142 1.29 10−4 5000 0.043 2.4043 2.4031 2.31 10−4 5000 0.056 2.2092 2.2079 3.27 10−4 5000 0.070 2.0184 2.0172 4.07 10−4 5000 0.089 1.7918 1.7909 4.70 10−4 5000 0.110 1.5814 1.5808 4.82 10−4 5000 0.130 1.4147 1.4144 4.59 10−4 5000 0.160 1.2138 1.2140 3.97 10−4 5000 0.200 1.0137 1.0142 3.08 10−4 5000 0.260 0.8070 0.8077 2.04 10−4 5000 0.360 0.5979 0.5987 1.07 10−4 5000 0.560 0.3910 0.3917 3.83 10−5 5000 1.160 0.1905 0.1910 5.58 10−6 5000 Πίνακας 5.2: Γωνίες σκέδασης στη σκέδαση Rutherford. Θέσαμε k1 ≡ 4πϵ qQ 0m = 1 στο αρχείο rk2_cb.f90 και μελετήσαμε τις τροχιές για τις τιμές του b που φαίνονται στη στήλη 1. θn είναι η γωνία σκέδασης που υπολογίζεται αριθμητικά και θa το αποτέ- λεσμα της Σχέσης (5.24). ∆E/E είναι η ποσοστιαία μεταβολή της ενέργειας λόγω συστηματικών σφαλμάτων της μεθόδου και στην τελευταία στήλη ο αριθμός των βη- μάτων ολοκλήρωσης για χρόνο από 0 έως 30. Το σωμάτιο τοποθετήθηκε αρχικά στη θέση x(0) = −50 και του δόθηκε αρχική ταχύτητα v = 3. της ενεργούς διατομής χρησιμοποιώντας τη Σχέση (5.20). Εναλλακτικά θα μπορούσε να χρησιμοποιηθεί η (5.21) υπολογίζοντας την κατάλληλη παράγωγο αριθμητικά. Αυτό όμως το αφήνουμε για άσκηση στον ανή- συχο και επιμελή αναγνώστη. Ο υπολογισμός που θα κάνουμε μοιάζει να είναι “πειραματικός”. Τοποθετούμε “ανιχνευτή” που “ανιχνεύει” τα 282 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ b θn θa ∆E/E STEPS 0.020 0.577 2.785 0.47 150000 0.030 2.466 2.614 0.22 150000 0.043 2.333 2.403 8.62 10−2 150000 0.056 2.180 2.208 2.88 10−2 150000 0.070 2.006 2.017 1.07 10−2 150000 0.089 1.779 1.791 8.94 10−3 60000 0.110 1.570 1.581 7.07 10−3 30000 0.130 1.406 1.414 5.25 10−3 20000 0.160 1.198 1.214 8.63 10−3 5000 0.200 1.007 1.014 3.71 10−3 5000 0.260 0.8057 0.8077 1.40 10−3 5000 0.360 0.5988 0.5987 4.32 10−4 5000 0.560 0.3923 0.3917 9.40 10−5 5000 1.160 0.1913 0.1910 8.61 10−6 5000 Πίνακας 5.3: Αποτελέσματα όμοια με αυτά του πίνακα 5.2. Η μόνη διαφορά είναι qQ ότι η σκέδαση είναι μεταξύ ετερώνυμων φορτίων με 4πϵ0m = −1. Φαίνεται η δυσκολία που αντιμετωπίζει η μέθοδος για μικρές παραμέτρους κρούσης. σωμάτια που σκεδάζονται από θ μέχρι θ + δθ. Για το λόγο αυτό χωρί- ζουμε το διάστημα [0, π] σε Nb διαστήματα (bins), έτσι ώστε δθ = π/Nb . Κάνουμε “πειράματα” σκέδασης μεταβάλλοντας την παράμετρο σκέ- δασης b ∈ [bm , bM ] με βήμα δb. Λόγω της συμμετρίας το προβλήματος, κρατάμε το ϕ σταθερό, οπότε δεδομένο θ αντιστοιχεί σε κώνο ανοίγ- ματος θ και κορυφή το κέντρο σκέδασης. Παρατηρούμε σε ποια γωνία θ σκεδάζεται το σωμάτιο με το συγκεκριμένο b και καταχωρούμε τον αριθμό των σωματιδίων ανά μονάδα χρόνου δN ∝ bδb, επειδή αυτός είναι ανάλογος του εμβαδού του δακτυλιδιού ακτίνας b. Απομένει να υπολογίσουμε τη ροή J η οποία είναι ο συνολικός αριθμός∑ των σωματι- δίων ανά μονάδα χρόνου που δεν είναι άλλος από J ∝ i bδb (στο λόγο δN /J η σταθερά αναλογίας και το δb απλοποιούνται) και τη στερεά γω- νία 2π sin(θ) δθ. Τέλος, εύκολα χρησιμοποιείται η σχέση (5.19) για τον υπολογισμό της συνολικής ενεργούς διατομής σtot . Ο προγραμματισμός της διαδικασίας γίνεται μεταβάλλοντας απλά το κυρίως πρόγραμμα του rk2.f90 το οποίο καταγράφουμε στο αρχείο scatter.f90. ! ======================================================== ! Program t h a t computes s c a t t e r i n g c r o s s −s e c t i o n o f a c e n t r a l ! f o r c e on t h e plane . The u s e r should f i r s t check t h a t t h e 5.4. ΣΚΕΔΑΣΗ 283 100 10 1 σ(θ) 0.1 0.01 0.001 0 0.5 1 1.5 2 2.5 3 θ Σχήμα 5.11: Διαφορική ενεργός διατομή για τη σκέδαση Rutherford. Η συνεχής γραμμή qQ είναι η συνάρτηση (5.25) για α = 1, v = 3. Θέσαμε 4πϵ0m = 1. Το σωμάτιο τοποθετή- θηκε αρχικά στη θέση x(0) = −50 και του δόθηκε αρχική ταχύτητα v = 3. Γίνανε 5000 βήματα ολοκλήρωσης για χρόνο από 0 έως 30. Η παράμετρος κρούσης b μεταβλήθηκε από 0.02 έως 1 με βήμα 0.0002. ! parameters used , l e a d t o a f r e e s t a t e i n t h e end . ! * * X20 i s t h e impact parameter b * * !A 4 ODE system i s s o l v e d using Runge−Kutta Method ! User must supply d e r i v a t i v e s ! dx1 / dt= f 1 ( t , x1 , x2 , x3 , x4 ) dx2 / dt=f 2 ( t , x1 , x2 , x3 , x4 ) ! dx3 / dt=f 3 ( t , x1 , x2 , x3 , x4 ) dx4 / dt=f 4 ( t , x1 , x2 , x3 , x4 ) ! as r e a l ( 8 ) f u n c t i o n s ! Output i s w r i t t e n i n f i l e s c a t t e r . dat ! ======================================================== program scatter_cross_section i m p l i c i t none i n t e g e r , parameter : : P=1010000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 , V1 , V2 r e a l ( 8 ) : : Ti , Tf , X10 , X20 , V10 , V20 r e a l ( 8 ) : : X20F , dX20 ! max impact parameter and s t e p i n t e g e r : : Nt integer : : i real (8) : : k1 , k2 common / couplings / k1 , k2 i n t e g e r , parameter : : Nbins=20 284 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 10 1 σ(θ) 0.1 0.01 0.001 1 10 100 1000 -4 sin (θ/2) Σχήμα 5.12: Διαφορική ενεργός διατομή για τη σκέδαση Rutherford όπως στο σχήμα 5.11. Η συνεχής ευθεία γραμμή είναι η 1/(4 × 34 )x από όπου είναι εμφανής η συναρ- τησιακή μορφή της σ(θ). i n t e g e r : : index r e a l ( 8 ) : : angle , bins ( Nbins ) , Npart r e a l ( 8 ) , parameter : : PI =3.14159265358979324 D0 r e a l ( 8 ) , parameter : : rad2deg =180.0 D0 / PI r e a l ( 8 ) , parameter : : dangle =PI / Nbins r e a l ( 8 ) R , density , dOmega , sigma , sigmatot ! Input : p r i n t * , ’ Runge−Kutta Method f o r 4−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s : ’ read * , k1 , k2 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 p r i n t * , ’ Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : ’ read * , Nt , Ti , TF , X10 , X20 , V10 , V20 p r i n t * , ’ Enter f i n a l impact parameter X20F and s t e p dX20 : ’ read * , X20F , dX20 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf print * , ’ X1( Ti )= ’ , X10 , ’ X2( Ti )= ’ , X20 print * , ’ V1 ( Ti )= ’ , V10 , ’ V2( Ti )= ’ , V20 p r i n t * , ’ Impact par X20F = ’ , X20F , ’ dX20 = ’ , dX20 open ( u n i t =11 , f i l e = ’ s c a t t e r . dat ’ ) 5.4. ΣΚΕΔΑΣΗ 285 bins = 0.0 d0 ! The C a l c u l a t i o n : Npart = 0.0 D0 X20 = X20 + dX20 / 2 . 0 D0 ! s t a r t s i n middle o f f i r s t i n t e r v a l do while ( X20 . lt . X20F ) c a l l RK ( T , X1 , X2 , V1 , V2 , Ti , Tf , X10 , X20 , V10 , V20 , Nt ) ! Take a b s o l u t e v a l u e due t o symmetry : angle = DABS ( atan2 ( V2 ( Nt ) , V1 ( Nt ) ) ) ! Output : The f i n a l a n g l e . Check i f almost c o n s t a n t w r i t e ( 1 1 , * ) ’@ ’ , X20 , angle ,& DABS ( atan2 ( V2 ( Nt−50) , V1 ( Nt−50) ) ) ,& k1 / V10 * * 2 / tan ( angle / 2 . 0 D0 ) ! Update histogram : index = int ( angle / dangle ) +1 ! Number o f incoming p a r t i c l e s per u n i t time ! i s proportional to radius of ring ! o f r a d i u s X20 , t h e impact parameter : ! db i s c a n c e l l e d from d e n s i t y bins ( index ) = bins ( index ) + X20 Npart = Npart + X20 !<−− i . e . from here X20 = X20 + dX20 enddo ! Print scattering cross section : R = X20 ! beam r a d i u s density = Npart / ( PI * R * R ) ! beam f l u x d e n s i t y J sigmatot = 0.0 D0 ! t o t a l cross section do i =1 , Nbins angle = ( i−0.5D0 ) * dangle dOmega = 2.0 D0 * PI * s i n ( angle ) * dangle ! d ( S o l i d Angle ) sigma = bins ( i ) / ( density * dOmega ) i f ( sigma . gt . 0 . 0 D0 ) & w r i t e ( 1 1 , * ) ’ ds= ’ , angle , angle * rad2deg , sigma sigmatot = sigmatot + sigma * dOmega enddo w r i t e ( 1 1 , * ) ’ s i g m a t o t= ’ , sigmatot close (11) end program scatter_cross_section Η μεταγλώττιση γίνεται όπως και με την περίπτωση το rk2.f90, ενώ τα αποτελέσματα βρίσκονται στο αρχείο scatter.dat. Έτσι, για να παράγουμε τα αποτελέσματα των Σχημάτων 5.11 και 5.12 εκτελούμε τις εντολές: > g f o r t r a n scatter . f90 rk2_cb . f90 −o scatter > . / scatter Runge−Kutta Method for 4−ODEs Integration Enter coupling constants : 286 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 1 . 0 0.0 k1= 1.00000 k2= 0.00000 Enter Nt , Ti , Tf , X10 , X20 , V10 , V20 : 5000 0 30 −50 0.02 3 0 Enter final impact parameter X20F and step dX20 : 1 0.0002 Nt= 5000 Time : Initial T0 = 0.00000 Final TF= 30.00000 X1 ( T0 )= −50.00000 X2 ( T0 )= 2.00000E−002 V1 ( T0 )= 3.00000 V2 ( T0 )= 0.00000 Impact par X20F = 1.00000 dX20 = 2.00000E−004 και ακολούθως βλέπουμε τα αποτελέσματα με το gnuplot: gnuplot > s e t l o g gnuplot > p l o t [ : 1 0 0 0 ] ”<grep ds= s c a t t e r . dat ” \ u ( ( s i n ( $2 / 2 ) ) **( −4) ) : ( $4 ) notit , \ ( 1 . / ( 4 . * 3 . * * 4 ) ) * x notit gnuplot > unset l o g gnuplot > s e t l o g y gnuplot > p l o t [ : ] ”<grep ds= s c a t t e r . dat ” u 2:4 notit , \ ( 1 . / ( 4 . * 3 . * * 4 ) ) * ( s i n ( x / 2 ) ) **( −4) notit Τα αποτελέσματα που παίρνουμε είναι σε πολύ καλή συμφωνία με τα αναμενόμενα από την αναλυτική έκφραση (5.25). Το επόμενο βήμα θα είναι να μελετήσουμε διαφορετικά δυναμικά για τα οποία δεν έχουμε αναλυτική λύση με την οποία θα μπορούσαμε να συγκρίνουμε τα απο- τελέσματά μας. 5.4.2 Σκέδαση σε Άλλα Πεδία Δυνάμεων Ας εξετάσουμε πρώτα τη σκέδαση από μία δύναμη της μορφής { 1 − ar3 r ≤ a F⃗ = f (r) r̂ , f (r) = r2 , (5.26) 0 r>a η οποία είναι ένα απλό μοντέλο της σκέδασης ποζιτρονίου e+ (θετικό φορτίο +e) με άτομο υδρογόνου που αποτελείται από θετικά φορτι- σμένο πυρήνα (θετικό φορτίο +e) που περιβάλλεται από νέφος ηλεκτρο- νίου αντίθετου φορτίου. Φυσικά έχουμε θέσει τις κλίμακες, έτσι ώστε me+ = 1 και e2 /4πϵ0 = 1. Στην περίπτωση αυτή δεν έχουμε αναλυτική λύση, οπότε θα χρησιμοποιήσουμε αριθμητικές μεθόδους για τον υπο- λογισμό των συναρτήσεων b(θ), σ(θ), καθώς και της συνολικής ενεργού διατομής σtot . 5.4. ΣΚΕΔΑΣΗ 287 Η δυναμική ενέργεια δίνεται από τη σχέση: dV (r) 1 r2 3 f (r) = − ⇒ V (r) = + 2 − . (5.27) dr r 2a 2a όπου επιλέξαμε V (r) = 0 για r ≥ a. Ο προγραμματισμός της δύναμης γίνεται εύκολα στο αρχείο rk_hy.f90: ! ======================================================== ! The a c c e l e r a t i o n f u n c t i o n s f3 , f 4 ( t , x1 , x2 , v1 , v2 ) provided ! by t h e u s e r ! ======================================================== ! Motion i n hydrogen atom + p o s i t r o n : ! f ( r ) = 1 / r^2−r / k1^3 ! ax= f ( r ) * x1 / r ay= f ( r ) * x2 / r r e a l ( 8 ) f u n c t i o n f3 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r , fr r2=x1 * x1+x2 * x2 r =sqrt ( r2 ) i f ( r . le . k1 . and . r2 . gt . 0 . 0 D0 ) then fr = 1 / r2−r / k1 * * 3 else fr = 0.0 D0 endif i f ( fr . gt . 0 . 0 D0 . and . r . gt . 0 . 0 D0 ) then f3=fr * x1 / r ! dx3 / dt=dv1 / dt=a1 else f3 =0.0 D0 endif end f u n c t i o n f3 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n f4 ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r2 , r , fr r2=x1 * x1+x2 * x2 r =sqrt ( r2 ) i f ( r . le . k1 . and . r2 . gt . 0 . 0 D0 ) then fr = 1 / r2−r / k1 * * 3 else fr = 0.0 D0 288 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ endif i f ( fr . gt . 0 . 0 D0 . and . r . gt . 0 . 0 D0 ) then f4=fr * x2 / r ! dx3 / dt=dv1 / dt=a1 else f4 =0.0 D0 endif end f u n c t i o n f4 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t , x1 , x2 , v1 , v2 ) i m p l i c i t none r e a l ( 8 ) : : t , x1 , x2 , v1 , v2 real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : r , Vr r=sqrt ( x1 * x1+x2 * x2 ) i f ( r . le . k1 . and . r . gt . 0 . 0 D0 ) then Vr = 1 / r + 0.5 D0 * r * r / k1 * * 3 − 1 . 5 D0 / k1 else Vr = 0.0 D0 endif energy = 0.5 D0 * ( v1 * v1+v2 * v2 ) + Vr end f u n c t i o n energy Τα αποτελέσματα δίνονται στα σχήματα 5.13–5.14. Βρίσκουμε ότι σtot = πa2 (Άσκηση 5.10). Ένα άλλο δυναμικό που παρουσιάζει ενδιαφέρον είναι το δυναμικό Yukawa ως φαινομενολογικό μοντέλο πυρηνικών αλληλεπιδράσεων: e−r/a V (r) = k . (5.28) r Το πεδίο αυτό μπορεί να χρησιμοποιηθεί και ως μοντέλο ενεργούς αλ- ληλεπίδρασης των ηλεκτρονίων στα μέταλλα (Thomas–Fermi) ή ως το δυναμικό Debye στο κλασικό πλάσμα. Η δύναμη που ασκείται σε ένα σώμα υπό την επίδραση του δυναμικού αυτού είναι: e−r/a ( r) F⃗ (r) = f (r) r̂ , f (r) = k 2 1+ (5.29) r a Ο προγραμματισμός της δύναμης γίνεται στο αρχείο rk2_yu.f90 κατά απόλυτη αναλογία με την προηγούμενη περίπτωση. Τα αποτελέσματα φαίνονται στα σχήματα 5.15–5.16. 5.5. ΠΕΡΙΣΣΟΤΕΡΑ ΣΩΜΑΤΙΔΙΑ 289 3.5 2.0 1.5 3 1.0 0.5 2.5 0.25 0.125 2 θ 1.5 1 0.5 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 b Σχήμα 5.13: Η συνάρτηση b(θ) για το δυναμικό της Σχέσης (5.27) για διαφορετικές τιμές της αρχικής ταχύτητας v. Έχουμε επιλέξει a = 1 και η ολοκλήρωση γίνεται σε 4000 βήματα από ti = 0 έως tf = 40 με x(0) = −5. 5.5 Περισσότερα Σωματίδια Στην παράγραφο αυτή γενικεύουμε τη μελέτη των προηγούμενων παρα- γράφων προσθέτοντας στο δυναμικό σύστημα που μελετάμε περισσό- τερους βαθμούς ελευθερίας. Ο αριθμός των δυναμικών εξισώσεων που έχουμε να λύσουμε αυξάνει, οπότε θα γενικεύσουμε το πρόγραμμα ολο- κλήρωσης με τη μέθοδο Runge–Kutta 4ης τάξης για αυθαίρετο αριθμό εξισώσεων NEQ. Θα εξηγήσουμε στον αναγνώστη πώς να κάνει δυναμική εκχώρηση μνήμης (dynamic memory allocation), έτσι ώστε να καθορί- ζεται δυναμικά όταν τρέχει το πρόγραμμα, ο χώρος στη μνήμη για τα arrays που είναι απαραίτητα για τις NEQ συναρτήσεις που ολοκληρώ- νουμε. Μέχρι τώρα χρησιμοποιούσαμε στατική εκχώρηση μνήμης (static memory allocation). Αυτό σημαίνει ότι ο μεταγλωττιστής γνωρίζει τη στιγμή της μεταγλώττισης το μέγεθος των χρησιμοποιούμενων arrays. Για παράδειγμα, στο πρόγραμμα rk2.f90 ορίζαμε την παράμετρο P να έχει μια δεδομένη τιμή, και τα arrays δηλώνονταν με τις εντολές: 290 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 100 2.0 1.5 1.0 10 0.5 0.25 0.125 σ(θ) 1 0.1 0.01 0 0.5 1 1.5 2 2.5 3 3.5 θ Σχήμα 5.14: Η συνάρτηση σ(θ) για το δυναμικό της Σχέσης (5.27) για διαφορετικές τιμές της αρχικής ταχύτητας v. Έχουμε επιλέξει a = 1 και η ολοκλήρωση γίνεται σε 4000 βήματα από ti = 0 έως tf = 40 με x(0) = −5. i n t e g e r , parameter : : P=1010000 r e a l ( 8 ) , dimension ( P ) : : T , X1 , X2 , V1 , V2 Αυτό σημαίνει πως αν θελήσουμε να αλλάξουμε το P, πρέπει να μετα- βάλλουμε την τιμή του στον πηγαίο κώδικα και μετά να ξαναμεταγλωτ- τίσουμε. Με τη δυναμική εκχώρηση της μνήμης, μπορούμε να πάρουμε την τιμή του αριθμού των χρονικών σημείων Nt, καθώς και τον αριθμό των εξισώσεων NEQ, όταν τρέχει το πρόγραμμα και να ζητήσουμε από το λειτουργικό σύστημα την απαραίτητη μνήμη, αφού οι τιμές τους γί- νουν γνωστές. Για να γίνει αυτό, πρέπει να προσδιορίσουμε το shape των arrays (πόσους δείκτες έχουν) και να τους δώσουμε τον προσδιορισμό allocatable. Τότε μπορούμε σε οποιαδήποτε στιγμή να ζητήσουμε τη μνήμη που απαιτείται καλώντας τη συνάρτηση ALLOCATE. Ένα παρά- δειγμα φαίνεται παρακάτω: integer Nt , NEQ real (8) , allocatable :: T (:) ! Rank−1 a r r a y real (8) , a l l o c a t a b l e : : X ( : , : ) ! Rank−2 a r r a y real (8) , a l l o c a t a b l e : : X0 ( : ) ! Rank−1 a r r a y 5.5. ΠΕΡΙΣΣΟΤΕΡΑ ΣΩΜΑΤΙΔΙΑ 291 10 yu v= 4.0 cb v= 4.0 yu v=15.0 1 cb v=15.0 0.1 θ 0.01 0.001 1e-04 0 0.5 1 1.5 2 2.5 3 b Σχήμα 5.15: Η συνάρτηση b(θ) για το δυναμικό Yukawa για διαφορετικές τιμές της αρχικής ταχύτητας v. Έχουμε επιλέξει a = 1, k = 1 και η ολοκλήρωση γίνεται σε 5000 βήματα από ti = 0 έως tf = 30 με x(0) = −50. Δίνεται συγκριτικά η σχέση (5.24) της σκέδασης Rutherford από τις καμπύλες μαρκαρισμένες ως cb. read * , Nt c a l l finit ( NEQ ) a l l o c a t e ( X0 ( NEQ ) ) a l l o c a t e ( T ( Nt ) ) a l l o c a t e ( X ( Nt , NEQ ) ) ... ( compute with X0 , T , X ) ... d e a l l o c a t e ( X0 ) deallocate (X ) deallocate (T ) ( X0 , T , X are not usable anymore ) ... .................... s u b r o u t i n e finit ( NEQ ) NEQ = 4 end s u b r o u t i n e finit Στον παραπάνω κώδικα, δηλώνουμε τα arrays να έχουν την ιδιότητα allocatable και για κάθε “:” έχουμε ένα δείκτη. Έτσι τα arrays T,X0 έχουν ένα δείκτη (rank-1 arrays) και το X έχει δύο δείκτες (rank-2 292 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 10 0.25 0.5 1 1.0 1.5 0.1 2.0 0.01 θ 0.001 1e-04 1e-05 1e-06 0 0.5 1 1.5 2 2.5 3 b Σχήμα 5.16: Η συνάρτηση b(θ) για το δυναμικό Yukawa για διαφορετικές τιμές της “έκτασης ” a της δύναμης. Έχουμε επιλέξει v = 4.0, k = 1 και η ολοκλήρωση γίνεται σε 5000 βήματα από ti = 0 έως tf = 30 με x(0) = −50. array). Στη συνέχεια, ζητάμε τις τιμές για τις μεταβλητές Nt, NEQ από το χρήστη και από την υπορουτίνα finit και καλούμε τη συνάρτηση ALLOCATE για να ζητήσει από το λειτουργικό σύστημα την εκχώρηση της ζητούμενης μνήμης για τα στοιχεία των arrays⁴. Αν η εκχώρηση μνήμης γίνει με επιτυχία, μπορούμε να χρησιμοποιήσουμε τα arrays όπως κά- ναμε μέχρι τώρα. Όταν δε χρειαζόμαστε πια τα arrays, επιστρέφουμε τη μνήμη που ζητήσαμε στο σύστημα με την συνάρτηση DEALLOCATE. Αν το αμελήσουμε και ζητάμε μνήμη ανεξέλεγκτα χωρίς να την επιστρέφουμε, όταν αυτή δεν είναι πια αναγκαία (λ.χ. σε μια επαναλαμβανόμενη δια- δικασία), το πρόγραμμά μας μπορεί να παρουσιάσει αυτό που λέγεται “διαρροές μνήμης” (memory leaks). Η δυναμική εκχώρηση μνήμης εί- ναι πολύ βολική, αλλά θα πρέπει να σημειώσουμε ότι σε υπολογισμούς υψηλών επιδόσεων (high performance computing) η στατική εκχώρηση μνήμης μπορεί να οδηγήσει σε προγράμματα που τρέχουν πιο γρήγορα. Μετά από αυτό, οι αλλαγές που πρέπει να κάνουμε στο πρόγραμμα ⁴Υποθέτουμε πως τα Nt, NEQ έχουν θετικές τιμές και η μνήμη που ζητάμε είναι διαθέσιμη. Πιο σωστά θα έπρεπε να δώσουμε την εντολή allocate(T(Nt),STAT=IERR) και μετά να ελέγξουμε την εκχώρηση με την εντολή IF(IERR .eq. 0) STOP 'Memory allocation for T failed'. 5.5. ΠΕΡΙΣΣΟΤΕΡΑ ΣΩΜΑΤΙΔΙΑ 293 δεν είναι σημαντικές. Θα γράψουμε το κυρίως πρόγραμμα στο αρχείο rkA.f90, ενώ θα κωδικοποιήσουμε τις δυναμικές εξισώσεις σε συνοδευ- τικό αρχείο με όνομα της μορφής rkA_XXX.f90. Στο τελευταίο, ο χρήστης θα πρέπει να προγραμματίσει μια υπορουτίνα f(t,X,dXdt) η οποία θα παίρνει στην είσοδο τη χρονική στιγμή t και τις τιμές των υπό ολο- κλήρωση συναρτήσεων X(NEQ) και θα δίνει στην έξοδο τις τιμές των παραγώγων τους dXdt(NEQ) τη χρονική στιγμή t. Επίσης, η συνάρτηση finit(NEQ) θα θέτει τον αριθμό των εξισώσεων της f και η οποία θα καλείται μία φορά στην αρχή του κυρίως προγράμματος. Το κυρίως πρόγραμμα, που βρίσκεται στο αρχείο rkA.f90⁵ είναι: ! ======================================================== ! Program t o s o l v e an ODE system using t h e ! 4 th order Runge−Kutta Method !NEQ: Number o f e q u a t i o n s ! User s u p p l i e s two s u b r o u t i n e s : ! f ( t , x , xdot ) : with r e a l ( 8 ) : : t , x (NEQ) , xdot (NEQ) which ! giv en t h e time t and c u r r e n t v a l u e s o f f u n c t i o n s x (NEQ) ! i t r e t u r n s t h e v a l u e s o f d e r i v a t i v e s : xdot = dx / dt ! The v a l u e s o f two c o u p l i n g c o n s t a n t s k1 , k2 may be used ! i n f which a r e read i n t h e main program and s t o r e d i n ! common / c o u p l i n g s / k1 , k2 ! f i n i t (NEQ) : s e t s t h e v a l u e o f NEQ ! ! User I n t e r f a c e : ! k1 , k2 : r e a l ( 8 ) c o u p l i n g c o n s t a n t s ! Nt , Ti , Tf : Nt−1 i n t e g r a t i o n s t e p s , i n i t i a l / f i n a l time ! X0 : r e a l ( 8 ) , dimension (NEQ) : i n i t i a l c o n d i t i o n s ! Output : ! rkA . dat with Nt l i n e s c o n s i s t i n g o f : T( Nt ) ,X( Nt , NEQ) ! ======================================================== program rk2_solve i m p l i c i t none real (8) , a l l o c a t a b l e : : T ( : ) real (8) , a l l o c a t a b l e : : X ( : , : ) r e a l ( 8 ) , a l l o c a t a b l e : : X0 ( : ) r e a l ( 8 ) : : Ti , Tf i n t e g e r : : Nt , NEQ , i real (8) : : k1 , k2 common / couplings / k1 , k2 !We need e x p l i c i t i n t e r f a c e , s i n c e energy has ! assumed−shape a r r a y s as arguments . INTERFACE ⁵Στο συνοδευτικό λογισμικό θα βρείτε και τα αρχεία rkN.f90 και rkN_XXX.f90 που δείχνουν πώς μπορεί να γίνει ο προγραμματισμός με στατική εκχώρηση μνήμης. 294 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ r e a l ( 8 ) f u n c t i o n energy ( t_intrf , x_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf , x_intrf ( : ) end f u n c t i o n energy END INTERFACE ! Input : p r i n t * , ’ Runge−Kutta Method f o r ODE I n t e g r a t i o n . ’ ! Get t h e number o f e q u a t i o n s : c a l l finit ( NEQ ) ; a l l o c a t e ( X0 ( NEQ ) ) p r i n t * , ’NEQ= ’ , NEQ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s : ’ read * , k1 , k2 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 p r i n t * , ’ Enter Nt , Ti , Tf , X0 : ’ read * , Nt , Ti , TF , X0 p r i n t * , ’ Nt = ’ , Nt p r i n t * , ’ Time : I n i t i a l Ti = ’ , Ti , ’ F i n a l Tf= ’ , Tf p r i n t ’ (A,2000G28 . 1 6 ) ’ , ’ X0 = ’ , X0 a l l o c a t e ( T ( Nt ) ) ; a l l o c a t e ( X ( Nt , NEQ ) ) ! The C a l c u l a t i o n : c a l l RK ( T , X , Ti , Tf , X0 , Nt , NEQ ) ! Output : open ( u n i t =11 , f i l e = ’ rkA . dat ’ ) do i =1 , Nt w r i t e ( 1 1 , ’ (2000G28 . 1 6 ) ’ ) T ( i ) , X ( i , : ) ,& energy ( T ( i ) , X ( i , : ) ) enddo close (11) end program rk2_solve ! ======================================================== ! D r i v e r o f t h e RKSTEP r o u t i n e ! ======================================================== s u b r o u t i n e RK ( T , X , Ti , Tf , X0 , Nt , NEQ ) i m p l i c i t none i n t e g e r : : Nt , NEQ r e a l ( 8 ) , dimension ( Nt ) :: T r e a l ( 8 ) , dimension ( Nt , NEQ ) : : X r e a l ( 8 ) , dimension ( NEQ ) : : X0 r e a l ( 8 ) : : Ti , Tf r e a l ( 8 ) : : dt r e a l ( 8 ) : : TS , XS ( NEQ ) ! v a l u e s o f time and X a t gi v e n s t e p integer : : i ! I n i t i a l i z e variables : dt = ( Tf−Ti ) / ( Nt −1) T ( 1 ) = Ti X ( 1 , : ) = X0 TS = Ti XS = X0 ! Make RK s t e p s : The arguments o f RKSTEP a r e 5.5. ΠΕΡΙΣΣΟΤΕΡΑ ΣΩΜΑΤΙΔΙΑ 295 ! r e p l a c e d with t h e new ones do i =2 , Nt c a l l RKSTEP ( TS , XS , dt , NEQ ) T ( i ) = TS X ( i , : ) = XS enddo end s u b r o u t i n e RK ! ======================================================== ! S u b r o u t i n e RKSTEP( t , X, dt ) ! Runge−Kutta I n t e g r a t i o n r o u t i n e o f ODE ! ======================================================== s u b r o u t i n e RKSTEP ( t , x , dt , NEQ ) i m p l i c i t none i n t e g e r : : NEQ r e a l ( 8 ) , dimension ( NEQ ) : : x r e a l ( 8 ) : : t , dt , tt r e a l ( 8 ) , dimension ( NEQ ) : : k1 , k2 , k3 , k4 , xx r e a l ( 8 ) : : h , h2 , h6 !We need e x p l i c i t i n t e r f a c e , s i n c e f has assumed−shape ! a r r a y s as arguments . INTERFACE s u b r o u t i n e f ( t_intrf , x_intrf , xdot_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf r e a l ( 8 ) , dimension ( : ) : : x_intrf , xdot_intrf end s u b r o u t i n e f END INTERFACE h =dt ! h =dt , i n t e g r a t i o n s t e p h2 =0.5 D0 * h ! h2=h / 2 h6=h / 6 . 0 D0 ! h6=h / 6 call f ( t , x , k1 ) ; xx = x + h2 * k1 ; tt =t+h2 call f ( tt , xx , k2 ) ; xx = x + h2 * k2 ; tt =t+h2 call f ( tt , xx , k3 ) ; xx = x + h * k3 ; tt =t+h call f ( tt , xx , k4 ) t =t+h x =x +h6 * ( k1 +2.0 D0 * ( k2+k3 )+k4 ) end s u b r o u t i n e RKSTEP Να επεξηγήσουμε μερικές λεπτομέρειες. Παρατηρήστε τη χρήση sections των arrays: w r i t e ( 1 1 , ’ (2000G28 . 1 6 ) ’ ) T ( i ) , X ( i , : ) X ( 1 , : ) = X0 X ( i , : ) = XS 296 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ Παραπάνω 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). Επίσης παρατηρήστε τις διανυσματικές πράξεις xx = x + h2 * k1 x = x + h6 * ( k1 +2.0 D0 * ( k2+k3 )+k4 ) που είναι ισοδύναμες με τα do loops do i =1 , NEQ xx ( i ) = x ( i ) + h2 * k1 ( i ) enddo do i =1 , NEQ x ( i ) = x ( i ) + h6 * ( k1 ( i ) +2.0 D0 * ( k2 ( i )+k3 ( i ) )+k4 ( i ) ) enddo Τέλος, θα εξηγήσουμε την έννοια του INTERFACE block. Τις συναρ- τήσεις μέχρι τώρα τις δηλώναμε στο καλούν πρόγραμμα, δηλώνοντας απλά τον τύπο της τιμής που επέστρεφαν. Σε μερικές περιπτώσεις, όπως εδώ όπου έχουν ως ορίσματα (dummy arguments) arrays που δεν είναι γνωστό παρά μόνο το shape τους (assumed-shape arrays), ο με- ταγλωττιστής χρειάζεται περισσότερη πληροφορία. Πρέπει να δώσουμε τα ορίσματα, τους τύπους τους καθώς και το shape τους αν είναι arrays. Έτσι, σε κάθε πρόγραμμα που καλεί τις συναρτήσεις αυτές, πρέπει να βάλουμε ένα INTERFACE block που να δίνει τις παραπάνω πληροφορίες. Εδώ, για τις συναρτήσεις f και energy το INTERFACE block είναι INTERFACE !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e f ( t_intrf , x_intrf , xdot_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf r e a l ( 8 ) , dimension ( : ) : : x_intrf , xdot_intrf end s u b r o u t i n e f !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( t_intrf , x_intrf ) i m p l i c i t none r e a l ( 8 ) : : t_intrf , x_intrf ( : ) end f u n c t i o n energy 5.5. ΠΕΡΙΣΣΟΤΕΡΑ ΣΩΜΑΤΙΔΙΑ 297 !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− END INTERFACE Μπορείτε να δημιουργήσετε αρχεία με ονόματα όπως λ.χ. interfaces.inc που να έχει ομάδες από INTERFACE blocks και να το εισάγετε σε κάθε ρουτίνα που τις χρησιμοποιεί με την εντολή include "interfaces.inc". Σχήμα 5.17: Τρία σωματίδια ίδιας μάζας κινούνται υπό την επίδραση της βαρυτικής δύναμης που ασκεί το ένα στο άλλο (ή ίδιου φορτίου με την επίδραση απωστικής ηλεκτροστατικής δύναμης). Το πρόβλημα λύνεται αριθμητικά στο πρόγραμμα που βρίσκεται στα αρχεία rkA.f90, rkA_3pcb.f90. Προχωράμε τώρα να λύσουμε ένα συγκεκριμένο πρόβλημα. Θεωρή- στε ότι τρία σωματίδια ίδιας μάζας κινούνται υπό την επίδραση της βαρυτικής δύναμης που ασκεί το ένα στο άλλο (ή ίδιου φορτίου με την επίδραση απωστικής ηλεκτροστατικής δύναμης) όπως φαίνεται στο σχήμα 5.17. Η δυνάμεις που ασκούν το ένα στο άλλο είναι mk1 F⃗ij = 3 ⃗rij , i, j = 1, 2, 3 (5.30) rij όπου k1 = −Gm και οι εξισώσεις κίνησης γίνονται (i = 1, 2, 3) dxi dvix ∑ 3 xi − xj = vix = k1 3 dt dt j=1,j̸=i rij dyi dviy ∑ 3 yi − yj = viy = k1 , (5.31) dt dt j=1,j̸=i rij3 298 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ με rij2 = (xi − xj )2 + (yi − yj )2 . Η συνολική ενέργεια του συστήματος είναι 1 2 ∑3 k1 2 E/m = (v1 + v2 ) + . (5.32) 2 r i,j=1,j<i ij Προγραμματίζουμε τις παραπάνω σχέσεις στο αρχείο rkA_3pcb.f90, τα περιεχόμενα του οποίου δίνονται παρακάτω: ! =============================== ! S e t s number o f e q u a t i o n s ! =============================== s u b r o u t i n e finit ( NEQ ) NEQ = 12 end s u b r o u t i n e finit ! =============================== ! Three p a r t i c l e s o f t h e same ! mass on t h e plane i n t e r a c t i n g ! v i a Coulombic f o r c e ! =============================== s u b r o u t i n e f ( t , X , dXdt ) i m p l i c i t none real (8) : : k1 , k2 common / couplings / k1 , k2 r e a l ( 8 ) : : t , X ( : ) , dXdt ( : ) !−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) : : x11 , x12 , x21 , x22 , x31 , x32 r e a l ( 8 ) : : v11 , v12 , v21 , v22 , v31 , v32 r e a l ( 8 ) : : r12 , r13 , r23 !−−−−−−−−−−−−−−−−−−−−−−− x11 = X ( 1 ) ; x21 = X ( 5 ) ; x31 = X ( 9 ) x12 = X ( 2 ) ; x22 = X ( 6 ) ; x32 = X ( 1 0 ) v11 = X ( 3 ) ; v21 = X ( 7 ) ; v31 = X ( 1 1 ) v12 = X ( 4 ) ; v22 = X ( 8 ) ; v32 = X ( 1 2 ) !−−−−−−−−−−−−−−−−−−−−−−− r12 = ( ( x11−x21 ) * ( x11−x21 ) +( x12−x22 ) * ( x12−x22 ) ) **( −3. D0 / 2 . D0 ) r13 = ( ( x11−x31 ) * ( x11−x31 ) +( x12−x32 ) * ( x12−x32 ) ) **( −3. D0 / 2 . D0 ) r23 = ( ( x21−x31 ) * ( x21−x31 ) +( x22−x32 ) * ( x22−x32 ) ) **( −3. D0 / 2 . D0 ) !−−−−−−−−−−−−−− dXdt ( 1 ) = v11 dXdt ( 2 ) = v12 dXdt ( 3 ) = k1 * ( x11−x21 ) * r12+k1 * ( x11−x31 ) * r13 ! a11=dv11 / dt dXdt ( 4 ) = k1 * ( x12−x22 ) * r12+k1 * ( x12−x32 ) * r13 ! a12=dv12 / dt !−−−−−−−−−−−−−− dXdt ( 5 ) = v21 dXdt ( 6 ) = v22 dXdt ( 7 ) = k1 * ( x21−x11 ) * r12+k1 * ( x21−x31 ) * r23 ! a21=dv21 / dt dXdt ( 8 ) = k1 * ( x22−x12 ) * r12+k1 * ( x22−x32 ) * r23 ! a22=dv22 / dt 5.5. ΠΕΡΙΣΣΟΤΕΡΑ ΣΩΜΑΤΙΔΙΑ 299 !−−−−−−−−−−−−−− dXdt ( 9 ) = v31 dXdt ( 1 0 ) = v32 dXdt ( 1 1 ) = k1 * ( x31−x11 ) * r13+k1 * ( x31−x21 ) * r23 ! a31=dv31 / dt dXdt ( 1 2 ) = k1 * ( x32−x12 ) * r13+k1 * ( x32−x22 ) * r23 ! a32=dv32 / dt end s u b r o u t i n e f ! =============================== r e a l ( 8 ) f u n c t i o n energy ( t , X ) i m p l i c i t none real (8) : : k1 , k2 common / couplings / k1 , k2 real (8) : : t , X ( : ) !−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) : : x11 , x12 , x21 , x22 , x31 , x32 r e a l ( 8 ) : : v11 , v12 , v21 , v22 , v31 , v32 r e a l ( 8 ) : : r12 , r13 , r23 !−−−−−−−−−−−−−−−−−−−−−−− x11 = X ( 1 ) ; x21 = X ( 5 ) ; x31 = X ( 9 ) x12 = X ( 2 ) ; x22 = X ( 6 ) ; x32 = X ( 1 0 ) v11 = X ( 3 ) ; v21 = X ( 7 ) ; v31 = X ( 1 1 ) v12 = X ( 4 ) ; v22 = X ( 8 ) ; v32 = X ( 1 2 ) !−−−−−−−−−−−−−−−−−−−−−−− r12 = ( ( x11−x21 ) * ( x11−x21 ) +( x12−x22 ) * ( x12−x22 ) ) **( −0.5 D0 ) r13 = ( ( x11−x31 ) * ( x11−x31 ) +( x12−x32 ) * ( x12−x32 ) ) **( −0.5 D0 ) r23 = ( ( x21−x31 ) * ( x21−x31 ) +( x22−x32 ) * ( x22−x32 ) ) **( −0.5 D0 ) !−−−−−−−−−−−−−−−−−−−−−−− energy = & 0.5 D0 * ( v11 * v11+v12 * v12+v21 * v21+v22 * v22+v31 * v31+v32 * v32 ) energy = energy + k1 * ( r12+r13+r23 ) end f u n c t i o n energy Για να το τρέξετε και για να δείτε τα αποτελέσματα μελετήστε τις εντολές στο σενάριο φλοιού rkA_3pcb.csh. Ενδεικτικά εκτελέστε την εντολή > rkA_3pcb . csh −0.5 4000 1 . 5 −1 0 . 1 1 0 1 −0.1 −1 0 0.05 1 0 −1 που θα τρέξει το πρόγραμμα για k1 = −0.5, ⃗r1 (0) = −x̂ + 0.1ŷ, ⃗v1 (0) = x̂, ⃗r2 (0) = x̂ − 0.1ŷ, ⃗v2 (0) = −x̂, ⃗r3 (0) = 0.05x̂ + ŷ, ⃗v3 (0) = −ŷ, Nt= 4000 και tf = 1.5. 300 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ 5.6 Ασκήσεις 5.1 Αναπαράγετε τα αποτελέσματα των Σχημάτων 5.3 και 5.4. Συ- γκρίνετε τα αποτελέσματά σας με την γνωστή αναλυτική λύση. 5.2 Προγραμματίστε τη δύναμη που αισθάνεται φορτισμένο σωματί- διο σε ομογενές μαγνητικό πεδίο B ⃗ = B k̂ και μελετήστε την τροχιά του για ⃗v (0) = v0x x̂+v0y ŷ. Για x(0) = 1, y(0) = 0, v0y = 0 υπολογίστε την ακτίνα της τροχιάς και φτιάξτε γράφημα της σχέσης ακτίνας τροχιάς και v0x . Συγκρίνετε με αυτό που αναμένετε από τον ανα- λυτικό υπολογισμό. (Μη σχετικιστικός υπολογισμός) 5.3 Μελετήστε τον ανομοιογενή αρμονικό ταλαντωτή ax = −ω12 x, ay = −ω22 y. Αναπαράγετε τις καμπύλες Lissajous παίρνοντας x(0) = 0, y(0) = 1, vx (0) = 1, vy (0) = 0, tf = 2π, ω22 = 1, ω12 = 1, 2, 4, 9, 16, . . .. Τι γίνεται όταν ω12 ̸= nω22 ; 5.4 Αναπαράγετε τα αποτελέσματα του πίνακα 5.1 και των Σχημάτων 5.5 και 5.6. Φτιάξτε διάγραμμα (ln a, ln T ) και υπολογίστε την κλίση της ευθείας που θα προκύψει με τη μέθοδο των ελαχίστων τετραγώνων. Είναι αυτή που περιμένετε; Υπολογίστε το σημείο τομής με τον κατακόρυφο άξονα και συγκρίνετε το αποτέλεσμά σας με το αναμενόμενο. 5.5 Υπολογίστε τη στροφορμή ως προς το κέντρο της δύναμης σε κάθε βήμα ολοκλήρωσης στην πλανητική κίνηση και μελετήστε αν πράγ- ματι διατηρείται. Δείξτε αναλυτικά, ότι η διατήρηση της στροφορ- μής συνεπάγεται ότι το διάνυσμα θέσης του πλανήτη σαρώνει επι- φάνεια με σταθερό ρυθμό. 5.6 Υπολογίστε αριθμητικά την ταχύτητα διαφυγής ve για GM = 10.0, y(0) = 0.0, x0 = x(0) = 1 με τον ακόλουθο τρόπο. Δείξτε ότι v02 = −GM (1/a) + ve2 . Πάρτε vx (0) = 0, vy (0) = v0 . Μεταβάλετε την vy (0) = v0 και μετρήστε τον αντίστοιχο a. Από το σημείο που τέμνει τον άξονα των y υπολογίστε την ve . 5.7 Επαναλάβατε την προηγούμενη άσκηση για x0 = 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0. Από τη γραφική παράσταση ve = f (1/x0 ) επιβε- βαιώστε τη Σχέση (5.14). 5.8 Εξετάστε αν για την κλειστή τροχιά του πλανήτη με GM = 10.0, x(0) = 1, y(0) = 0.0, vx (0) = 0 , vy (0) = 4 ισχύει η ορίζουσα ιδιότητα της έλλειψης F1 P +F2 P = 2a. Ως σημείο F1 θα πάρετε το κέντρο της 5.6. ΑΣΚΗΣΕΙΣ 301 δύναμης και αφού προσδιορίσετε αριθμητικά το a θα πάρετε ως F2 το σημείο που είναι συμμετρικό ως προς το κέντρο της έλλειψης. 5.9 Θεωρήστε την κίνηση πλανητών σύμφωνα με την προηγούμενη άσκηση. Εφαρμόστε στιγμιαία ώθηση στην εφαπτόμενη διεύθυνση της τροχιάς, αφού ο πλανήτης εκτελέσει περίπου 1/4 της τροχιάς του. Πόσο ευσταθής είναι η τροχιά στην ώθηση (δηλ. ποια είναι η εξάρτηση της τροχιάς από το μέγεθος/διάρκεια της ώθησης); Επα- ναλάβατε την ανάλυση όταν η ώθηση είναι στην κάθετη διεύθυνση. 5.10 Θεωρήστε το δυναμικό σκέδασης ποζιτρονίου–υδρογόνου της σχέ- σης (5.26). Φτιάξτε τη γραφική παράσταση της συνάρτησης f (r) καθώς και της V (r) για διαφορετικές τιμές του a. Υπολογίστε αριθ- μητικά τη συνολική ενεργό διατομή σtot και δείξτε ότι είναι ίση με πa2 . 5.11 Θεωρήστε το δυναμικό Morse που χρησιμοποιείται σε μοντέλα δια- τομικών μορίων: V (r) = D (exp(−2αr) − 2 exp(−αr)) (5.33) με D, α > 0. Λύστε αριθμητικά το πρόβλημα αρχικά στη μία διά- σταση και συγκρίνετε με τις γνωστές αναλυτικές λύσεις για ενέρ- γεια E < 0: { √ √ } 1 D − D(D − |E|) sin(αt 2|E|/m + C) x(t) = ln (5.34) α |E| με τη σταθερά ολοκλήρωσης να δίνεται ως συνάρτηση της αρχικής θέσης και της ενέργειας από [ ] D − |E|e αx0 C = sin−1 √ . (5.35) D(D − |E|) Η κίνηση είναι√περιοδική με περίοδο που εξαρτάται από την ενέρ- γεια = (π/α) 2m/|E|. Για E > 0 έχουμε {√ √ } 1 D(D + E) cosh(αt 2E/m + C) − D x(t) = ln (5.36) α |E| ενώ για E = 0 { } 1 1 Dα2 x(t) = ln + (t + C)2 . (5.37) α 2 m 302 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ Στις τελευταίες σχέσεις η σταθερά ολοκλήρωσης C δίνεται από άλλη σχέση και όχι από την (5.35). Μελετήστε την κίνηση στο χώρο των φάσεων (x, ẋ) και μελετήστε τη μετάβαση από ανοιχτές σε κλειστές τροχιές του συστήματος. 5.12 Στην προηγούμενη άσκηση θεωρήστε τον όρο του ενεργού δυνα- μικού Vef f (r) = l2 /2mr2 (l ≡ |L|). ⃗ Κάνετε τη γραφική παράσταση της συνάρτησης Vtot (r) = V (r) + Vef f (r) για D = 20, α = 1, m = 1, l = 1, φυσικά για r > 0. Προσδιορίστε τη θέση ισορροπίας και την ενέργεια ιονισμού. Mελετήστε αριθμητικά τις λύσεις x(t), y(t), y(x), r(t) στο επίπεδο για E > 0, E = 0, και E < 0. Στην τελευταία περίπτωση μελε- τήστε και το πρόβλημα σκέδασης, υπολογίζοντας αριθμητικά τη συνάρτηση b(θ), σ(θ) και τη συνολική ενεργό διατομή σtot . 5.13 Θεωρήστε τη δύναμη F⃗ (r) = f (r) r̂ όπου f (r) = 24(2/r13 − 1/r7 ) η οποία είναι μοντέλο μοριακού δυναμικού. Υπολογίστε το δυναμικό V (r) και κάνετε τη γραφική παράσταση της συνάρτησης Vtot (r) = V (r) + Vef f (r). Προσδιορίστε τη θέση ισορροπίας και την ενέργεια ιονισμού. Μελετήστε το πρόβλημα σκέδασης, υπολογίζοντας αριθμητικά τη συνάρτηση b(θ), σ(θ) και τη συνολική ενεργό διατομή σtot . Πόσο εξαρτάται ο υπολογισμός σας από την ελάχιστη γωνία σκέδασης; 5.14 Μελετήστε την κίνηση σωματιδίου υπό την επίδραση ελκτικής κε- ντρικής δύναμης F⃗ = −k/r3 r̂. Εξετάστε με ποιες αρχικές συνθήκες παίρνετε σπειροειδή τροχιά. 5.15 Υπολογίστε τη συνολική διαφορική διατομή σtot αναλυτικά και υπολογιστικά για την σκέδαση Rutherford. Τι παρατηρείτε στην αριθμητικά υπολογισμένη τιμή, καθώς μεταβάλετε τα όρια της ολοκλήρωσης; 5.16 Γράψτε πρόγραμμα που θα υπολογίζει την τροχιά φορτισμένου σωματιδίου, όταν αυτό κινείται σε ηλεκτρικό πεδίο Coulomb που δημιουργείται από N ακίνητα σημειακά ηλεκτρικά φορτία. 5.17 Λύστε το πρόβλημα των τριών σωμάτων που λύνεται στο κείμενο στο αρχείο rkA_3cb.f90 στην περίπτωση που έχουμε τρία φορτία διαφορετικού μεγέθους και πρόσημου 5.18 Δύο σωματίδια ίσης μάζας και φορτίου ίσου μέτρου κινούνται ⃗ = B ẑ. πάνω στο επίπεδο xy μέσα σε σταθερό μαγνητικό πεδίο B 5.6. ΑΣΚΗΣΕΙΣ 303 Επιλύστε τις εξισώσεις κίνησης του συστήματος με τη μέθοδο Runge–Kutta 4ης τάξης. Αναπαραστήστε γραφικά τις τροχιές των σωματιδίων για αρχικές συνθήκες που θα επιλέξετε. 5.19 Τρία σωματίδια ίσης μάζας m συνδέονται με πανομοιότυπα ελα- τήρια σταθεράς k και φυσικού μήκους l και κινούνται χωρίς τρι- βές πάνω σε οριζόντιο επίπεδο. Επιλύστε τις εξισώσεις κίνησης του συστήματος με τη μέθοδο Runge–Kutta 4ης τάξης. Αναπαρα- στήστε γραφικά τις τροχιές των σωματιδίων για αρχικές συνθή- κες που θα επιλέξετε. (Υπόδειξη: Δείτε τα αρχεία rkA_3hoc.f90, rkA_3hoc.csh) Σχήμα 5.18: Δύο σωμάτια ίδιας μάζας στηριγμένα στα άκρα λεπτών και αβαρών ράβδων μήκους l συνδέονται με αβαρές ιδανικό ελατήριο σταθεράς k και φυσικού μήκους l. Τα σημεία ανάρτησης των ράβδων είναι σταθερά και απέχουν απόσταση l (Άσκηση 5.20). 5.20 Δύο σωμάτια ίδιας μάζας είναι στηριγμένα στα άκρα λεπτών και αβαρών ράβδων μήκους l και συνδέονται με αβαρές ιδανικό ελα- τήριο σταθεράς k και φυσικού μήκους l όπως στο σχήμα 5.18. Τα σημεία ανάρτησης των ράβδων είναι σταθερά και απέχουν από- σταση l. Υπολογίστε τη Lagrangian του συστήματος και από αυτή τις εξισώσεις κίνησης για τις γωνίες θ1 και θ2 . Λύστε αριθμητικά τις εξισώσεις αυτές με τη μέθοδο Runge–Kutta 4ης τάξης και στη συνέχεια αναπαραστήστε τις θέσεις των δύο εκκρεμών σε καρτε- σιανές συντεταγμένες και κάνετε τη γραφική παράσταση της τρο- χιάς. Να τα κάνετε αυτά για τους κανονικούς τρόπους ταλάντωσης του συστήματος για μικρές ταλαντώσεις θ1 ≲ 0.1 και στη συνέχεια 304 ΚΕΦΑΛΑΙΟ 5. ΚΙΝΗΣΗ ΣΤΟ ΕΠΙΠΕΔΟ παρατηρήστε τι γίνεται καθώς η γωνία αυξάνει. (Υπόδειξη: Δείτε τα αρχεία rk_cpend.f90, rk_cpend.csh) 5.21 Επαναλάβετε την προηγούμενη άσκηση όταν τα σημεία ανάρτησης των δύο εκκρεμών μπορούν να ολισθαίνουν χωρίς τριβές πάνω στον άξονα των x. 5.22 Επαναλάβετε την άσκηση 5.20 προσθέτοντας ένα τρίτο εκκρεμές δεξιά του δεύτερου σε ίδια απόσταση l. ΚΕΦΑΛΑΙΟ 6 Κίνηση στο Χώρο Στο κεφάλαιο αυτό θα μελετήσουμε την κίνηση σωματιδίου όταν αυτό κινείται στο χώρο (τρεις διαστάσεις). Θα εξετάσουμε την περίπτωση της μη σχετικιστικής αλλά και της σχετικιστικής κίνησης όταν η ταχύτητα του σωματιδίου πλησιάζει την ταχύτητα του φωτός στο κενό. Θα χρησι- μοποιήσουμε τη μέθοδο Runge-Kutta μέθοδο με προσαρμοζόμενο βήμα 4ης–5ης τάξης (εν συντομία RK45) χρησιμοποιώντας λογισμικό που δια- τίθεται σε αποθετήρια λογισμικού. Στη συγκεκριμένη περίπτωση θα χρησιμοποιήσουμε λογισμικό ελεύθερα διαθέσιμο από το αποθετήριο (repository) www.netlib.org, και πιο συγκεκριμένα τη σουίτα rksuite των R.W. Brankin, I. Gladwell, and L.F. Shampine [38]. Στόχος του κεφαλαίου είναι να μάθετε να αναζητάτε λύσεις στα προβλήματά σας από λογισμικό που διατίθεται από άλλους προγραμ- ματιστές και να αποκτήσετε εμπειρία στο πώς να βρίσκετε την πληρο- φορία, πώς να το χρησιμοποιήσετε και πώς να το συνδέσετε με το δικό σας πρόγραμμα. Στο τέλος, θα έχετε και ένα εργαλείο καλής ποιότη- τας για να λύνετε προβλήματα με τη μέθοδο αριθμητικής ολοκλήρωσης Runge-Kutta με προσαρμοζόμενο βήμα, μέθοδος που χρησιμοποιείται από πολλούς ερευνητές. 305 306 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 6.1 Runge–Kutta στις τρεις διαστάσεις. Στις τρεις διαστάσεις, το πρόβλημα αρχικών τιμών που έχουμε να λύ- σουμε δίνεται από το σύστημα (4.6) dx dvx = vx = ax (t, x, vx , y, vy , z, vz ) dt dt dy dvz = vy = ay (t, x, vx , y, vy , z, vz ) dt dt dz dvz = vz = az (t, x, vx , y, vy , z, vz ) . (6.1) dt dt Στην περίπτωση αυτή θα χρησιμοποιήσουμε για αυξημένη ακρίβεια και υψηλότερη απόδοση έναν αλγόριθμο της οικογένειας Runge–Kutta με προσαρμοζόμενο έλεγχο βήματος (adaptive stepsize control). Για λε- πτομέρειες παραπέμπουμε τον αναγνώστη στο βιβλίο [30]. Σκοπός μας εδώ δεν είναι να αναλύσουμε το συγκεκριμένο αλγόριθμο, αλλά να εξα- σκηθούμε στη χρήση προγραμμάτων που έχουν γράψει άλλοι για το συγκεκριμένο πρόβλημα που έχουμε να λύσουμε. Φυσικά, το πρώτο που έχουμε να κάνουμε είναι να προσδιορίσουμε το κατάλληλο λογισμικό για το προς λύση πρόβλημα. Για το λόγο αυτό, ανάλογα με τη δυσκολία του προβλήματος αναζητούμε πληροφορίες στο δίκτυο, βιβλία σχετικά με το πρόβλημα και φυσικά, αν το πρό- βλημά μας είναι ερευνητικού επιπέδου, αναζητούμε πληροφορίες στις ερευνητικές εργασίες και τους ειδικούς. Στη συγκεκριμένη περίπτωση, το πρόβλημά μας είναι σχετικά απλό και έχει πολλές και καλές λύ- σεις. Αναζητώντας λύση στο χώρο του ποιοτικού ελεύθερου λογισμι- κού αριθμητικών εφαρμογών, η πρώτη στάση που κάνουμε είναι στο www.netlib.org repository. Από τη λίστα του διαθέσιμου λογισμικού¹ επιλέγουμε τη βιβλιοθήκη ode και από αυτή τη σουίτα rksuite. Στο σύνδεσμο http://www.netlib.org/ode/ διαβάζουμε lib rksuite alg Runge−Kutta for initial value problem for first order ordinary ←- differential equations . A suite of codes for solving IVPs in ODEs . A choice of RK methods , is available . Includes an error assessment facility and a sophisticated stiffness checker . Template programs and example results provided . ¹Δυστυχώς το πακέτο diffpack ...αλλαξοπίστησε και πέρασε στο χώρο του εμπο- ρικού λογισμικού. 6.1. RUNGE–KUTTA ΣΤΙΣ ΤΡΕΙΣ ΔΙΑΣΤΑΣΕΙΣ. 307 Supersedes RKF 45 , DDERKF , D02PAF . ref RKSUITE , Softreport 92−S 1 , Dept of Math , SMU , Dallas , ←- Texas by R . W . Brankin ( NAG ) , I . Gladwell and L . F . Shampine ( SMU ) lang Fortran prec double από όπου μαθαίνουμε ότι το πακέτο έχει αλγόριθμους τύπου Runge- Kutta γραμμένους σε γλώσσα Fortran και αφορά πραγματικές μετα- βλητές διπλής ακρίβειας (double precision). Κατεβάζουμε τα αρχεία rksuite.f, rksuite.doc, details.doc, templates, readme. Για να χρησιμοποιήσουμε υπορουτίνες στο πρόγραμμά μας το πρώτο βήμα είναι να διαβάσουμε προσεκτικά τα εγχειρίδια χρήσης του πακέ- του. Αυτό μπορεί να βρίσκεται (ανάλογα με την περίπτωση φυσικά) σε τυπωμένα έγγραφα, σε ηλεκτρονικά έγγραφα [html, pdf, ..., σε συ- νοδευτικά αρχεία με ονόματα τύπου README, INSTALL, ... ή αρχεία που βρίσκονται σε υποκαταλόγους με ονόματα όπως doc/..., σε online αρχεία βοήθειας (man pages) κ.ο.κ.]. Το καλό λογισμικό έχει όλη τη χρή- σιμη πληροφορία στα αρχεία που περιέχουν τον πηγαίο κώδικα, κάτι που ισχύει και στην περίπτωσή μας. Για να συνδέσουμε υποπρογράμματα στο δικό μας πρόγραμμα χρεια- ζόμαστε τις εξής βασικές πληροφορίες: • INPUT DATA: Δηλ. πώς παρέχουμε στο πρόγραμμά μας τις απα- ραίτητες πληροφορίες για να εκτελεστεί ο υπολογισμός. Είναι σα- φές πως στην περίπτωσή μας χρειάζεται τουλάχιστον να δώσουμε τις αρχικές συνθήκες, το χρόνο ολοκλήρωσης και τον αριθμό βημά- των. Επίσης, ο χρήστης πρέπει να παρέχει τις συναρτήσεις στο δεξί μέλος της (6.1). Άλλες πληροφορίες που είναι δυνατόν να ζητού- νται είναι λ.χ. επιθυμητή ακρίβεια, πληροφορίες για το hardware όπως διαθέσιμη αριθμητική ακρίβεια κλπ. • OUTPUT DATA: Δηλ. πώς και πού το πρόγραμμα μας δίνει τα αποτελέσματα του υπολογισμού, αν αυτός έγινε ομαλά κλπ. • WORKSPACE: Ειδικά σε ρουτίνες FORTRAN 77 που η μνήμη δεν ζητείται δυναμικά (αλλά όχι αναγκαστικά μόνο τότε) μπορεί να χρειαστεί να παρέχουμε στην υπορουτίνα χώρο στη μνήμη για τους ενδιάμεσους υπολογισμούς. Η εγκατάσταση του λογισμικού είναι απλή. Όλος ο κώδικας εί- ναι μέσα στο αρχείο rksuite.f και όπως μαθαίνουμε από το αρχείο 308 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ rksuite.doc² αρκεί να δώσουμε στο πρόγραμμα την τιμή τριών μετα- βλητών που καθορίζουν την ακρίβεια υπολογισμού με υποδιαστολή στον υπολογιστή μας. Διαβάζουμε: ... RKSUITE requires three environmental constants OUTCH , MCHEPS , DWARF . When you use RKSUITE , you may need to know their values . You can obtain them by calling the subroutine ENVIRN in the suite : CALL ENVIRN ( OUTCH , MCHPES , DWARF ) returns values OUTCH − INTEGER Standard output channel on the machine being used . MCHEPS − DOUBLE PRECISION The unit of roundoff , that is , the largest positive number such that 1 . 0 D0 + MCHEPS = 1 . 0 D 0 . DWARF − DOUBLE PRECISION The smallest positive number on the machine being used . ... * * * * * * * * * * * * * * * * * * * * * * * * * * Installation Details * * * * * * * * * * * * All machine−dependent aspects of the suite have been isolated in the subroutine ENVIRN in the rksuite . for file . Certain environmental parameters must be specified in this subroutine . The values in the distribution version are those appropriate to the IEEE arithmetic standard . They must be altered , if necessary , to values appropriate to the computing system you are using before calling the codes of the suite . If the IEEE arithmetic standard values are not appropriate for your system , appropriate values can often be obtained by calling routines named in the Comments of ENVIRN . ... Δηλ. οι μεταβλητές OUTCH, MCHEPS, DWARF ορίζονται στην υπορουτίνα ENVIRN την οποία μπορεί να χρησιμοποιήσει για να τις χρησιμοποιή- σει οπουδήποτε θέλει στο πρόγραμμα. Παρακάτω διαβάζουμε ότι το πρόγραμμα τις προ–ορίζει σε μάλλον ασφαλείς τιμές, αλλά αν ο προ- γραμματιστής πρέπει να τις αλλάξει³, τότε πρέπει να επέμβει στην υπο- ²Είναι ένα απλό text αρχείο που μπορείτε να διαβάσετε με την εντολή less rksuite.doc ή με τον emacs. ³Εδώ φαίνεται και η επαγγελματικότητα του συγγραφέα του κώδικα που προ- 6.1. RUNGE–KUTTA ΣΤΙΣ ΤΡΕΙΣ ΔΙΑΣΤΑΣΕΙΣ. 309 ρουτίνα ENVIRN και να τις αλλάξει. Άρα, πρέπει να κοιτάξουμε μέσα στο αρχείο rksuite.f για να διαβάσουμε τα σχόλια της εν λόγω ρουτίνας: ... SUBROUTINE ENVIRN ( OUTCH , MCHEPS , DWARF ) ... C The f o l l o w i n g s i x s t a t e m e n t s a r e t o be Commented out C a f t e r v e r i f i c a t i o n t h a t t h e machine and i n s t a l l a t i o n C dependent q u a n t i t i e s a r e s p e c i f i e d c o r r e c t l y . ... WRITE ( * , * ) ’ Before using RKSUITE , you must v e r i f y t h a t t h e ’ WRITE ( * , * ) ’ machine− and i n s t a l l a t i o n −dependent q u a n t i t i e s ’ WRITE ( * , * ) ’ s p e c i f i e d i n t h e s u b r o u t i n e ENVIRN a r e c o r r e c t , ’ WRITE ( * , * ) ’ and then Comment t h e s e WRITE s t a t e m e n t s and t h e ’ WRITE ( * , * ) ’ STOP s t a t e m e n t out o f ENVIRN . ’ STOP ... C The f o l l o w i n g v a l u e s a r e a p p r o p r i a t e t o IEEE C a r i t h m e t i c with t h e t y p i c a l standard output channel . C OUTCH = 6 MCHEPS = 1 . 1 1 D−16 DWARF = 2.23 D−308 Άρα, αρκεί να αφαιρέσουμε τις έξι εντολές WRITE και STOP κάνοντας τις σχόλια της Fortran⁴, αφού βεβαιωθούμε ότι οι επιλογές για τις τιμές των μεταβλητών OUTCH, MCHEPS, DWARF είναι ικανοποιητικές: ... C WRITE ( * ,*) ’ Before using RKSUITE , you must v e r i f y t h a t t h e ’ C WRITE ( * ,*) ’ machine− and i n s t a l l a t i o n −dependent q u a n t i t i e s ’ C WRITE ( * ,*) ’ s p e c i f i e d i n t h e s u b r o u t i n e ENVIRN a r e c o r r e c t , ’ C WRITE ( * ,*) ’ and then Comment t h e s e WRITE s t a t e m e n t s and t h e ’ C WRITE ( * ,*) ’ STOP s t a t e m e n t out o f ENVIRN . ’ C STOP ... Ένας τρόπος να το ελέγξουμε με τη βοήθεια ελεύθερα διαθέσιμου λο- γισμικού είναι να αναζητήσουμε και να κατεβάσουμε τα αρχεία d1mach.f, i1mach.f από τη netlib.org, να τις τοποθετήσουμε στον υποκατάλογο blas/⁵ και να γράψουμε το μικρό πρόγραμμα test_envirn_blas.f90 program testme βλέπει ότι το πρόγραμμά του μπορεί να χρησιμοποιηθεί πολύ αργότερα κάτω από άγνωστες εξελίξεις στο hardware. ⁴Παρατηρήστε ότι στη μορφή κώδικα “fixed width” της παλιότερης Fortran, οι γραμμές που έχουν ως πρώτο χαρακτήρα το “C” θεωρούνται σχόλια και αγνοούνται από το μεταγλωττιστή. ⁵Σε επόμενο κεφάλαιο θα μάθουμε περισσότερα για τη βασική βιβλιοθήκη γραμ- μικής άλγεβρας blas. 310 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ i m p l i c i t none i n t e g e r : : OUTCH r e a l ( 8 ) : : DWARF , MCHEPS real (8) : : x i n t e g e r : : I1MACH ! b l a s r o u t i n e s r e a l ( 8 ) : : D1MACH OUTCH = I1MACH ( 2 ) MCHEPS = D1MACH ( 3 ) DWARF = D1MACH ( 1 ) w r i t e ( 6 , 1 0 1 ) OUTCH , MCHEPS , DWARF MCHEPS = e p s i l o n ( x ) / 2 . 0 D0 DWARF = tiny (x) w r i t e ( 6 , 1 0 1 ) OUTCH , MCHEPS , DWARF 101 format ( I4 , 2 E30 . 1 8 ) end program testme Όπως βλέπετε και από το παραπάνω πρόγραμμα, οι μεταβλητές MCHEPS και DWARF μπορούν να υπολογιστούν και από τις intrinsic συναρτήσεις της Fortran EPSILON() και TINY() χωρίς να χρειαστούμε τις συναρτήσεις της blas. Μεταγλωττίζουμε και τρέχουμε > g f o r t r a n test_envirn_blas . f90 blas / * 1 mach . f −o ←- test_envirn_blas > . / test_envirn_blas 6 0.111022302462515654E−15 ←- 0.222507385850720138−307 και προκύπτει ότι οι επιλογές μας είναι ικανοποιητικές. Το επόμενο βήμα είναι να μάθουμε να χρησιμοποιούμε τη ρουτίνα. Για το λόγο αυτό διαβάζουμε προσεκτικά το αρχείο 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: 6.1. RUNGE–KUTTA ΣΤΙΣ ΤΡΕΙΣ ΔΙΑΣΤΑΣΕΙΣ. 311 > sh templates tmpl1 . out tmpl1a . f ... Το πρόγραμμα tmpl1a.f έχει τη λύση για τον αρμονικό ταλαντωτή και φαίνεται με πολλά επεξηγηματικά σχόλια η απλή χρήση του προγράμ- ματος, την οποία επιλέγουμε τελικά στη δικιά μας περίπτωση. Έτσι καταλήγουμε στο παρακάτω πρόγραμμα για την οδήγηση της ολοκλή- ρωσης, το οποίο αποθηκεύουμε στο αρχείο rk3.f90 ! ======================================================== ! Program t o s o l v e a 6 ODE system using Runge−Kutta Method ! Output i s w r i t t e n i n f i l e rk3 . dat ! ======================================================== program rk3_solve i n c l u d e ’ rk3 . i n c ’ r e a l ( 8 ) : : T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 r e a l ( 8 ) : : t , dt , tstep i n t e g e r : : STEPS integer : : i r e a l ( 8 ) : : energy ! Arrays / v a r i a b l e s needed by r k s u i t e : r e a l ( 8 ) TOL , THRES ( NEQ ) , WORK ( LENWRK ) , Y ( NEQ ) , YMAX ( NEQ ) ,& YP ( NEQ ) , YSTART ( NEQ ) , HSTART l o g i c a l ERRASS , MESSAGE i n t e g e r UFLAG ! . . External Subroutines . . EXTERNAL F , SETUP , STAT , UT ! Input : p r i n t * , ’ Runge−Kutta Method f o r 6−ODEs I n t e g r a t i o n ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s k1 , k2 , k3 , k4 : ’ read * , k1 , k2 , k3 , k4 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 , ’ k4= ’ , k4 p r i n t * , ’ Enter STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 : ’ read * , STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 p r i n t * , ’No . S t e p s= ’ , STEPS p r i n t * , ’ Time : I n i t i a l T0 = ’ , T0 , ’ F i n a l TF= ’ , TF print * , ’ X1(T0)= ’ , X10 , ’ X2(T0)= ’ , X20 , ’ X3(T0)= ’ , X30 print * , ’ V1 (T0)= ’ , V10 , ’ V2(T0)= ’ , V20 , ’ V3(T0)= ’ , V30 ! I n i t i a l Conditions dt = ( TF−T0 ) / STEPS YSTART ( 1 ) = X10 YSTART ( 2 ) = X20 YSTART ( 3 ) = X30 YSTART ( 4 ) = V10 YSTART ( 5 ) = V20 312 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ YSTART ( 6 ) = V30 ! ! S e t e r r o r c o n t r o l parameters . ! TOL = 5.0 D−6 do i = 1 , NEQ THRES ( i ) = 1 . 0 D−10 enddo MESSAGE = . TRUE . ERRASS = . FALSE . HSTART = 0.0 D0 ! Initialization : c a l l SETUP ( NEQ , T0 , YSTART , TF , TOL , THRES , METHOD , ’ Usual Task ’ ,& ERRASS , HSTART , WORK , LENWRK , MESSAGE ) open ( u n i t =11 , f i l e = ’ rk3 . dat ’ ) w r i t e ( 1 1 , 1 0 0 ) T0 , YSTART ( 1 ) , YSTART ( 2 ) , YSTART ( 3 ) , YSTART ( 4 ) ,& YSTART ( 5 ) , YSTART ( 6 ) , energy ( T0 , YSTART ) ! Calculation : do i =1 , STEPS t = T0 + i * dt c a l l UT ( F , t , tstep , Y , YP , YMAX , WORK , UFLAG ) i f ( UFLAG . GT . 2 ) e x i t ! e x i t t h e loop : go a f t e r enddo w r i t e ( 1 1 , 1 0 0 ) tstep , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Y ( 5 ) , Y ( 6 ) ,& energy ( tstep , Y ) enddo close (11) 100 format (8 E25 . 1 5 ) end program rk3_solve Παρατηρούμε ότι τους κοινούς ορισμούς τους τοποθετήσαμε στο ξε- χωριστό αρχείο rk3.inc για να χρησιμοποιηθούν και από τη συνάρτηση των παραγώγων. Τα περιεχόμενα του αρχείου αυτού τοποθετούνται στη σειρά include 'rk3.inc': ! Basic d e f i n i t i o n s of v a r i a b l e s fo r the s u i t e r k s u i t e i m p l i c i t none !NEQ i s t h e number o f e q u a t i o n s , 6 i n 3 dimensions !METHOD=2 i s f o r RK45 . INTEGER NEQ , LENWRK , METHOD PARAMETER ( NEQ =6 , LENWRK =32*NEQ , METHOD =2) REAL *8 k1 , k2 , k3 , k4 ! f o r c e c o u p l i n g s COMMON / COUPLINGS / k1 , k2 , k3 , k4 Παρατηρούμε ότι εδώ θέτουμε τον αριθμό των διαφορικών εξισώσεων NEQ=6, καθώς και τη μέθοδο ολοκλήρωσης METHOD=2. Η μεταβλητή LENWRK καθορίζει το μέγεθος της μνήμης που χρειάζεται το πρόγραμμα για τους ενδιάμεσους υπολογισμούς. Το πρόγραμμα αρχίζει ακριβώς όπως και 6.1. RUNGE–KUTTA ΣΤΙΣ ΤΡΕΙΣ ΔΙΑΣΤΑΣΕΙΣ. 313 τα προηγούμενα, αφήνοντας έτσι το interface με το χρήστη αναλλοίωτο. Οι αρχικές θέσεις και ταχύτητες αποθηκεύονται στο array YSTART στις θέσεις 1 . . . 6. Στις 3 πρώτες θέσεις έχουμε τις συντεταγμένες χώρου, ενώ στις 3 τελευταίες τις συντεταγμένες της ταχύτητας. Αφού καθορί- σουμε μερικές μεταβλητές που καθορίζουν τη συμπεριφορά του προ- γράμματος (δες αρχείο rksuite.doc για λεπτομέρειες), καλούμε την υπορουτίνα SETUP. Στη συνέχεια, τυπώνουμε τις αρχικές συνθήκες στο αρχείο εξόδου rk3.dat και φτάνουμε στην καρδιά του προγράμματος, την ολοκλήρωση: do i =1 , STEPS t = T0 + i * dt c a l l UT ( F , t , tstep , Y , YP , YMAX , WORK , UFLAG ) i f ( UFLAG . GT . 2 ) e x i t ! e x i t t h e loop : go a f t e r enddo w r i t e ( 1 1 , 1 0 0 ) tstep , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) , Y ( 4 ) , Y ( 5 ) , Y ( 6 ) ,& energy ( tstep , Y ) enddo F είναι η συνάρτηση που υπολογίζει τις παραγώγους, γραμμένη από εμάς παρακάτω. t είναι ο χρόνος στον οποίο επιθυμούμε να έχουμε το αποτέλεσμα της ολοκλήρωσης. Λόγω προσαρμοζόμενου βήματος, αυτός μπορεί να μην είναι ακριβώς ο ίδιος με αυτόν που τελικά μας επι- στρέφει η υπορουτίνα, δηλ. τον tstep. Y είναι οι τιμές των συναρτή- σεων, δηλ. x= Y(1), y= Y(2), z= Y(3) και vx = Y(4), vy = Y(5), vz = Y(6). energy(t,Y) είναι η συνάρτηση που υπολογίζει τη μηχανική ενέργεια του συστήματος την οποία θα γράψουμε στο ίδιο αρχείο με τη συνάρ- τηση F. Τέλος, η μεταβλητή UFLAG είναι “σημαία” που δείχνει ότι η UT επιστρέφει με σφάλμα, οπότε το πρόγραμμα τερματίζει. Παρακάτω, παραθέτουμε τον κώδικα δοκιμής, την κίνηση βλήματος στο πεδίο βα- ρύτητας με δύναμη αντίστασης από ρευστό ανάλογη της ταχύτητας του βλήματος F⃗r = −mk⃗v . Ο κώδικας αποθηκεύεται στο αρχείο rk3_g.f90. Παίρνουμε ⃗g = -k1 k̂ και k = k2. !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− s u b r o u t i n e F ( T , Y , YP ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! Velocities : d x _ i / dt = v _ i 314 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! A c c e l e r a t i o n : dv_i / dt = a _ i YP ( 4 ) = −k2 * v1 YP ( 5 ) = −k2 * v2 YP ( 6 ) = −k2 * v3−k1 end s u b r o u t i n e F !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( T , Y ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! K i n e t i c Energy e = 0 . 5 * ( v1 * v1+v2 * v2+v3 * v3 ) ! P o t e n t i a l Energy e = e + k1 * x3 energy = e end f u n c t i o n energy Για ευκολία, “μεταφράσαμε” τις τιμές του array Y(NEQ) σε μεταβλητές θέσης και ταχύτητας και μετά χρησιμοποιήσαμε τους γνωστούς τύπους⁶. Η μεταγλώττιση, υποθέτοντας ότι τη σουίτα rksuite.f την τοποθετή- σαμε στον υποκατάλογο rksuite/, το τρέξιμο και η επισκόπηση των αποτελεσμάτων με το gnuplot γίνεται με τις εντολές: > gfortran rk3 . f90 rk3_g . f90 rksuite / rksuite . f −o rk3 > . / rk3 Runge−Kutta Method for 6−ODEs Integration Enter coupling constants k1 , k2 , k3 , k4 : 10 0 0 0 k1= 10.0000 k2= 0.0000 E+000 k3= 0.0000 E+000 k4= 0.0000 E+000 Enter STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 : 10000 0 3 0 0 0 1 1 1 No . Steps= 10000 ⁶Παρατηρήστε πώς δηλώσαμε τα arrays Y, YP: real(8) :: Y(*),YP(*). Τα arrays αυτά για τις F, energy είναι “assumed-size” arrays, δηλ. arrays των οποίων το μέγεθος είναι άγνωστο στη διαδικασία. Αν έχουμε arrays με περισσότερους δείκτες, μόνο η τελευταία διάσταση επιτρέπεται να είναι *. Γενικά είναι καλύτερο να αποφεύγεται σε καινούργια προγράμματα η χρήση assumed-size arrays και να προτιμώνται τα assumed-shape όπως κάναμε στο πρόγραμμα rkA.f90 στη σελ. 293. Η δήλωση στην περίπτωση αυτή θα ήταν real(8) :: Y(:),YP(:) 6.2. ΚΙΝΗΣΗ ΣΩΜΑΤΙΟΥ ΣΕ ΗΜ ΠΕΔΙΟ. 315 Time : Initial T0 = 0.0000 E+000 Final TF= 3.0000 X1 ( T0 )= 0.0000 E+000 X2 ( T0 )= 0.0000 E+000 X3 ( T0 )= 0.0000 E+000 V1 ( T0 )= 1.0000 V2 ( T0 )= 1.0000 V3 ( T0 )= 1.0000 > gnuplot gnuplot > p l o t ” rk3 . dat ” using 1 : 2 with lines t i t l e ” x1 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 3 with lines t i t l e ” x2 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 4 with lines t i t l e ” x3 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 5 with lines t i t l e ” v1 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 6 with lines t i t l e ” v2 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 7 with lines t i t l e ” v3 ( t ) ” gnuplot > p l o t ” rk3 . dat ” using 1 : 8 with lines t i t l e ”E( t ) ” gnuplot > s e t t i t l e ” t r a j e c t o r y ” gnuplot > s p l o t ” rk3 . dat ” using 2 : 3 : 4 with lines notitle Την παραπάνω εργασία την έχουμε κωδικοποιήσει σε σενάριο φλοιού (shell script) με όνομα rk3.csh. Από το αρχείο αυτό χρησιμοποιείται το ανάλογο αρχείο για animation με το όνομα rk3_animate.csh. Έτσι, η παραπάνω δουλειά συνοψίζεται στην παρακάτω εντολή: . / rk3 . csh −f 1 −− 10 0 . 0 0 0 0 0 1 1 1 10000 0 3 6.2 Κίνηση Σωματίου σε ΗΜ πεδίο. Μετά την ανάλυση της προηγούμενης παραγράφου, έχουμε τα απαραί- τητα εργαλεία να μελετήσουμε τη μη–σχετικιστική κίνηση φορτισμένου σωματίου μέσα σε ηλεκτρομαγνητικό (ΗΜ) πεδίο. Αυτό υπόκειται στην επίδραση της δύναμης Lorentz: ⃗ + ⃗v × B) F⃗ = q(E ⃗ . (6.2) Ας θεωρήσουμε πρώτα την απλή περίπτωση σταθερού ΗΜ πεδίου της ⃗ = Ex x̂ + Ey ŷ + Ez ẑ, B μορφής E ⃗ = B ẑ. Οι συνιστώσες της επιτάχυνσης του σωματίου θα είναι: ax = (qEx /m) + (qB/m)vy ay = (qEy /m) − (qB/m)vx az = (qEz /m) . (6.3) Προγραμματίζουμε το παραπάνω δυναμικό πεδίο στο αρχείο rk3_B.f90, θέτοντας k1 = qB/m, k2 = qEx /m, k3 = qEy /m, k4 = qEz /m: 316 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ! P a r t i c l e i n c o n s t a n t Magnetic and e l e c t r i c f i e l d ! q B/m = k1 z q E /m = k2 x + k3 y + k4 z s u b r o u t i n e F ( T , Y , YP ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! Velocities : d x _ i / dt = v _ i YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! A c c e l e r a t i o n : dv_i / dt = a _ i YP ( 4 ) = k2 + k1 * v2 YP ( 5 ) = k3 − k1 * v1 YP ( 6 ) = k4 end s u b r o u t i n e F !−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− r e a l ( 8 ) f u n c t i o n energy ( T , Y ) i n c l u d e ’ rk3 . i n c ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 x1 = Y ( 1 ) ; v1 = Y ( 4 ) x2 = Y ( 2 ) ; v2 = Y ( 5 ) x3 = Y ( 3 ) ; v3 = Y ( 6 ) ! K i n e t i c Energy e = 0 . 5 * ( v1 * v1+v2 * v2+v3 * v3 ) ! P o t e n t i a l Energy e = e − k2 * x1 − k3 * x2 − k4 * x3 energy = e end f u n c t i o n energy Με παρόμοιο τρόπο μπορούμε να μελετήσουμε πεδία τα οποία είναι χωροεξαρτημένα. Οι επιλογές μας πρέπει να ικανοποιούν τις εξισώ- σεις του Maxwell! Για να δούμε τον περιορισμό στο χώρο φορτισμένου σωματιδίου με την επίδραση μαγνητικού πεδίου, παίρνουμε τις απλές περιπτώσεις B ⃗ = By ŷ + Bz ẑ με qBy /m = −k2 y, qBz /m = k1 + k2 z και qBy /m = k3 z, qBz /m = k1 + k2 y. Παρατηρούμε ότι ισχύει ∇⃗ ·B ⃗ = 0. Εσείς υπολογίστε την πυκνότητα ρεύματος από την εξίσωση ∇ ⃗ ×B ⃗ = µ0⃗j. Τα αποτελέσματά μας φαίνονται στα σχήματα 6.1–6.4. 6.3. ΣΧΕΤΙΚΙΣΤΙΚΗ ΚΙΝΗΣΗ. 317 3 2 1 0 1 1 2 0 x y 3 -1 Σχήμα 6.1: Τροχιά φορτισμένου σωματιδίου σε σταθερό μαγνητικό πεδίο B ⃗ = B ẑ με qB/m = 1.0, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. Η ολοκλήρωση των εξισώσεων κίνησης γίνεται με τη μέθοδο RK45 με 1000 βήματα από t0 = 0 μέχρι tf = 40. 6.3 Σχετικιστική Κίνηση. Στην παράγραφο αυτή θα συζητήσουμε τον υπολογισμό τροχιάς σωμα- τιδίου μη μηδενικής μάζας ηρεμίας, όταν η ταχύτητά του γίνεται συ- γκρίσιμη με αυτή του φωτός. Παρακάτω, θα θέσουμε την ταχύτητα του φωτός στο κενό c = 1. Οι εξισώσεις √ κίνησης σωματιδίου μάζας ηρε- μίας m0 √> 0, μάζας m = m0 / 1 − v , ορμής p⃗ = m⃗v και ενέργειας 2 E = m = p2 + m20 μέσα σε δυναμικό πεδίο F⃗ δίνονται από τις σχέσεις: d⃗p = F⃗ . (6.4) dt Για να τις γράψουμε σε σύστημα διαφορικών εξισώσεων πρώτης τάξης χρησιμοποιούμε τις σχέσεις: p⃗ p⃗ p⃗ ⃗v = = =√ , (6.5) m E p + m20 2 318 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ z 4 3 2 1 0-5 1 -4 2 -3 3 -2 4 -1 5 x y 0 6 1 2 7 Σχήμα 6.2: Τροχιά φορτισμένου σωματιδίου σε σταθερό μαγνητικό πεδίο B ⃗ = B ẑ με ⃗ qB/m = 1.0, και σταθερό ηλεκτρικό πεδίο E = Ex x̂ + Ey ŷ με qEx /m = qEy /m = 0.1, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. Η ολοκλήρωση των εξισώσεων κίνησης γίνεται με τη μέθοδο RK45 με 1000 βήματα από t0 = 0 μέχρι tf = 40. Η τροχιά δεν είναι υπό κλίμακα, προσέξτε τις διαφορετικές κλίμακες στους τρεις άξονες. οι οποίες μαζί με την ⃗v = d⃗r/dt μας δίνουν: dx (px /m0 ) d(px /m0 ) Fx = √ , = dt 1 + (p/m0 )2 dt m0 dy (py /m0 ) d(py /m0 ) Fy = √ , = dt 1 + (p/m0 )2 dt m0 dz (pz /m0 ) d(pz /m0 ) Fz = √ , = , (6.6) dt 1 + (p/m0 )2 dt m0 που αποτελούν ένα σύστημα διαφορικών εξισώσεων πρώτης τάξης για τις συναρτήσεις (x(t), y(t), z(t), (px /m0 )(t), (py /m0 )(t), (pz /m0 )(t)). Για τη λύση με τη μέθοδο Runge-Kutta προσαρμοσμένου βήματος 4ης – 5ης τά- ξης σύμφωνα με τις προηγούμενες παραγράφους, χρειαζόμαστε τις αρ- χικές συνθήκες (x(0), y(0), z(0), (px /m0 )(0), (py /m0 )(0), (pz /m0 )(0)). Χρη- 6.3. ΣΧΕΤΙΚΙΣΤΙΚΗ ΚΙΝΗΣΗ. 319 z 100 0 -100 3 2 -200 0 1 1 0 y 2 3 -1 x 4 5 6 -2 Σχήμα 6.3: Τροχιά φορτισμένου σωματιδίου σε μαγνητικό πεδίο B ⃗ = By ŷ + Bz ẑ με qBy /m = −0.02y, qBz /m = 1 + 0.02z, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. Η ολοκλήρωση των εξισώσεων κίνησης γίνεται με τη μέθοδο RK45 με 10000 βήματα από t0 = 0 μέχρι tf = 500. Η τροχιά δεν είναι υπό κλίμακα, προσέξτε τις διαφορετικές κλίμακες στους τρεις άξονες. σιμοποιώντας τις σχέσεις vx (px /m0 ) (px /m0 ) = √ vx = √ 1 − v2 1 + (p/m0 )2 vy (py /m0 ) (py /m0 ) = √ vy = √ 1 − v2 1 + (p/m0 )2 vz (pz /m0 ) (pz /m0 ) = √ vz = √ 1 − v2 1 + (p/m0 )2 (6.7) μπορούμε να δώσουμε εναλλακτικά ως αρχικές συνθήκες (x(0), y(0), z(0), vx (0), vy (0), vz (0)), καθώς και από τις λύσεις (x(t), y(t), z(t), (px /m0 )(t), (py /m0 )(t), (pz /m0 )(t)) να πάρουμε τις (x(t), y(t), z(t), vx (t), vy (t), vz (t)). Προσοχή όμως να ελέγχουμε ότι ισχύει πάντα (m0 > 0) v 2 = (vx )2 + (vy )2 + (vz )2 < 1 . (6.8) Για τον προγραμματισμό του παραπάνω προβλήματος χρειάζεται να 320 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ z 2 1 0 -1 -21 y 0 -1 -2 0 1 2 3 -1 x Σχήμα 6.4: Τροχιά φορτισμένου σωματιδίου σε μαγνητικό πεδίο B ⃗ = By ŷ + Bz ẑ με qBy /m = 0.08z, qBz /m = 1.4 + 0.08y, ⃗v (0) = 1.0ŷ + 0.1ẑ, ⃗r(0) = 1.0x̂. Η ολοκλήρωση των εξισώσεων κίνησης γίνεται με τη μέθοδο RK45 με 40000 βήματα από t0 = 0 μέχρι tf = 3000. Η τροχιά δεν είναι υπό κλίμακα, προσέξτε τις διαφορετικές κλίμακες στους τρεις άξονες. μεταβάλλουμε ελαφρά το πρόγραμμα rk3.f90. Οι αλλαγές αφορούν το κυρίως πρόγραμμα μόνο στη σχέση ταχυτήτων ορμών που μπορεί να επιθυμεί να μελετήσει ο χρήστης. Όσο για το αρχείο με το οποίο προ- γραμματίζουμε το δυναμικό πεδίο, χρειάζεται να μεταβάλλουμε μόνο τις σχέσεις για την ταχύτητα, αφού η προς ολοκλήρωση συνάρτηση είναι τώρα η ορμή. Ας αρχίσουμε πρώτα με το κυρίως πρόγραμμα, sr.f90: ! ======================================================== ! Program t o s o l v e a 6 ODE system using Runge−Kutta Method ! Output i s w r i t t e n i n f i l e s r . dat ! I n t e r f a c e t o be used with r e l a t i v i s t i c p a r t i c l e s . ! ======================================================== program sr_solve include ’ sr . inc ’ r e a l ( 8 ) : : T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 r e a l ( 8 ) : : P10 , P20 , P30 r e a l ( 8 ) : : P1 , P2 , P3 , V1 , V2 , V3 r e a l ( 8 ) : : t , dt , tstep 6.3. ΣΧΕΤΙΚΙΣΤΙΚΗ ΚΙΝΗΣΗ. 321 i n t e g e r : : STEPS integer : : i r e a l ( 8 ) : : energy ! Arrays / v a r i a b l e s needed by r k s u i t e : r e a l ( 8 ) : : TOL , THRES ( NEQ ) , WORK ( LENWRK ) , Y ( NEQ ) , YMAX ( NEQ ) ,& YP ( NEQ ) , YSTART ( NEQ ) , HSTART l o g i c a l : : ERRASS , MESSAGE i n t e g e r : : UFLAG ! . . External Subroutines . . EXTERNAL F , SETUP , STAT , UT ! Input : p r i n t * , ’ Runge−Kutta Method f o r 6−ODEs I n t e g r a t i o n ’ print * , ’ Special R e l a t i v i s t i c Particle : ’ p r i n t * , ’ Enter c o u p l i n g c o n s t a n t s k1 , k2 , k3 , k4 : ’ read * , k1 , k2 , k3 , k4 p r i n t * , ’ k1= ’ , k1 , ’ k2= ’ , k2 , ’ k3= ’ , k3 , ’ k4= ’ , k4 p r i n t * , ’ Enter STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 : ’ read * , STEPS , T0 , TF , X10 , X20 , X30 , V10 , V20 , V30 c a l l momentum ( V10 , V20 , V30 , P10 , P20 , P30 ) p r i n t * , ’No . S t e p s= ’ , STEPS p r i n t * , ’ Time : I n i t i a l T0 = ’ , T0 , ’ F i n a l TF= ’ , TF print * , ’ X1(T0)= ’ , X10 , ’ X2(T0)= ’ , X20 , ’ X3(T0)= ’ , X30 print * , ’ V1 (T0)= ’ , V10 , ’ V2(T0)= ’ , V20 , ’ V3(T0)= ’ , V30 print * , ’ P1 (T0)= ’ , P10 , ’ P2 (T0)= ’ , P20 , ’ P3 (T0)= ’ , P30 ! I n i t i a l Conditions dt = ( TF−T0 ) / STEPS YSTART ( 1 ) = X10 YSTART ( 2 ) = X20 YSTART ( 3 ) = X30 YSTART ( 4 ) = P10 YSTART ( 5 ) = P20 YSTART ( 6 ) = P30 ! ! S e t e r r o r c o n t r o l parameters . ! TOL = 5.0 D−6 do i = 1 , NEQ THRES ( i ) = 1 . 0 D−10 enddo MESSAGE = . TRUE . ERRASS = . FALSE . HSTART = 0.0 D0 ! Initialization : c a l l SETUP ( NEQ , T0 , YSTART , TF , TOL , THRES , METHOD , ’ Usual Task ’ ,& ERRASS , HSTART , WORK , LENWRK , MESSAGE ) open ( u n i t =11 , f i l e = ’ s r . dat ’ ) c a l l velocity ( YSTART ( 4 ) , YSTART ( 5 ) , YSTART ( 6 ) , V1 , V2 , V3 ) w r i t e ( 1 1 , 1 0 0 ) T0 , YSTART ( 1 ) , YSTART ( 2 ) , YSTART ( 3 ) ,& 322 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ V1 , V2 , V3 ,& energy ( T0 , YSTART ) ,& YSTART ( 4 ) , YSTART ( 5 ) , YSTART ( 6 ) ! Calculation : do i =1 , STEPS t = T0 + i * dt c a l l UT ( F , t , tstep , Y , YP , YMAX , WORK , UFLAG ) i f ( UFLAG . GT . 2 ) e x i t c a l l velocity ( Y ( 4 ) , Y ( 5 ) , Y ( 6 ) , V1 , V2 , V3 ) w r i t e ( 1 1 , 1 0 0 ) tstep , Y ( 1 ) , Y ( 2 ) , Y ( 3 ) ,& V1 , V2 , V3 ,& energy ( tstep , Y ) ,& Y (4) , Y (5) , Y (6) enddo close (11) 100 format ( 1 1 E25 . 1 5 ) end program sr_solve ! ======================================================== ! momentum −> v e l o c i t y t r a n s f o r m a t i o n ! ======================================================== s u b r o u t i n e velocity ( p1 , p2 , p3 , v1 , v2 , v3 ) i m p l i c i t none r e a l ( 8 ) : : v1 , v2 , v3 , p1 , p2 , p3 , v , p , vsq , psq psq = p1 * p1+p2 * p2+p3 * p3 v1 = p1 / sqrt ( 1 . 0 D0+psq ) v2 = p2 / sqrt ( 1 . 0 D0+psq ) v3 = p3 / sqrt ( 1 . 0 D0+psq ) end s u b r o u t i n e velocity ! ======================================================== ! v e l o c i t y −> momentum t r a n s f o r m a t i o n ! ======================================================== s u b r o u t i n e momentum ( v1 , v2 , v3 , p1 , p2 , p3 ) i m p l i c i t none r e a l ( 8 ) : : v1 , v2 , v3 , p1 , p2 , p3 , v , p , vsq , psq vsq = v1 * v1+v2 * v2+v3 * v3 i f ( vsq . ge . 1 . 0 D0 ) s t o p ’ sub momentum : vsq >= 1 ’ p1 = v1 / sqrt ( 1 . 0 D0−vsq ) p2 = v2 / sqrt ( 1 . 0 D0−vsq ) p3 = v3 / sqrt ( 1 . 0 D0−vsq ) end s u b r o u t i n e momentum Παρατηρούμε το ρόλο που παίζουν οι υπορουτίνες momentum και velocity οι οποίες αναλαμβάνουν τους μετασχηματισμούς (6.7). Εκεί γίνεται και ο έλεγχος της συνθήκης (6.8). Θα τις χρησιμοποιήσουμε και στο αρ- χείο που θα γράψουμε το πρόγραμμα που θα δίνει τις παραγώγους των 6.3. ΣΧΕΤΙΚΙΣΤΙΚΗ ΚΙΝΗΣΗ. 323 συναρτήσεων για κάθε πεδίο δυνάμεων που θα θελήσουμε να μελετή- σουμε. Η πρώτη μας απόπειρα είναι να μελετήσουμε την κίνηση σχετικιστι- κού φορτισμένου σωματιδίου μέσα σε σταθερό ΗΜ πεδίο. Μέσα στο πεδίο αυτό η επιτάχυνση του σωματιδίου δίνεται από τις σχέσεις (6.3). Οι σχέσεις αυτές προγραμματίζονται μέσα στο αρχείο sr_B.f90. Πέρα από τις αλλαγές που αναφέραμε μέχρι τώρα, πρέπει να προσέξουμε και τον ορισμό της κινητικής ενέργειας: ( ) (√ ) 1 T = √ − 1 m0 = 1 + (p/m0 )2 − 1 m0 (6.9) 1 − v2 Το περιεχόμενο του sr_B.f90 είναι: ! ======================================================== ! P a r t i c l e i n c o n s t a n t Magnetic and e l e c t r i c f i e l d ! q B/m = k1 z q E /m = k2 x + k3 y + k4 z ! ======================================================== s u b r o u t i n e F ( T , Y , YP ) include ’ sr . inc ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) c a l l velocity ( p1 , p2 , p3 , v1 , v2 , v3 ) ! now we can use a l l x1 , x2 , x3 , p1 , p2 , p3 , v1 , v2 , v3 YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! Acceleration : YP ( 4 ) = k2 + k1 * v2 YP ( 5 ) = k3 − k1 * v1 YP ( 6 ) = k4 end s u b r o u t i n e F ! ======================================================== ! Energy per u n i t r e s t mass ! ======================================================== r e a l ( 8 ) f u n c t i o n energy ( T , Y ) include ’ sr . inc ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 , psq x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) 324 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ psq= p1 * p1+p2 * p2+p3 * p3 ! K i n e t i c Energy / m_0 e = sqrt ( 1 . 0 D0+psq ) −1.0D0 ! P o t e n t i a l Energy / m_0 e = e − k2 * x1 − k3 * x2 − k4 * x3 energy = e end f u n c t i o n energy Τα αποτελέσματά μας τα δείχνουμε στα σχήματα 6.5–6.6. z 2 1.6 1.2 0.8 0.4 0.4 0 0 y 1.2 x 1.6 -0.4 Σχήμα 6.5: Τροχιά σχετικιστικού φορτισμένου σωματιδίου, όταν κινείται μέσα σε μαγνητικό πεδίο B⃗ = Bz ẑ με qBz /m0 = 10.0, ⃗v (0) = 0.95ŷ + 0.10ẑ, ⃗r(0) = 1.0x̂. Η ολοκλήρωση των εξισώσεων κίνησης γίνεται με τη μέθοδο RK45 με 1000 βήματα από t0 = 0 μέχρι tf = 20. Η τροχιά δεν είναι υπό κλίμακα, προσέξτε τις διαφορετικές κλίμακες στους άξονες. Αφού βεβαιωθήκαμε για την επιτυχία της προσέγγισης του προβλή- ματος για το φορτισμένο σωμάτιο σε σταθερό ΗΜ πεδίο, μπορούμε να προσπαθήσουμε να μελετήσουμε ένα πιο ενδιαφέρον πρόβλημα. Θα φτιάξουμε ένα απλό μοντέλο για την ακτινοβολία Van Allen της γης. Θα υποθέσουμε ότι τα ηλεκτρόνια κινούνται στο μαγνητικό πεδίο της γης το οποίο προσεγγίζεται ως μαγνητικό πεδίο διπόλου της μορφής: ( )3 [ ] RE ⃗ = B0 B 3(dˆ · r̂) r̂ − dˆ , (6.10) r 6.3. ΣΧΕΤΙΚΙΣΤΙΚΗ ΚΙΝΗΣΗ. 325 0.4 0.3 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 0.9 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Σχήμα 6.6: Προβολή της τροχιάς σχετικιστικού φορτισμένου σωματιδίου στο επίπεδο xy όταν κινείται μέσα σε μαγνητικό πεδίο B ⃗ = Bz ẑ με qBz /m0 = 10.0, ⃗v (0) = 0.95ŷ + 0.10ẑ, ⃗r(0) = 1.0x̂. Η ολοκλήρωση των εξισώσεων κίνησης γίνεται με τη μέθοδο RK45 με 1000 βήματα από t0 = 0 μέχρι tf = 20. όπου d⃗ = ddˆ η μαγνητική ροπή διπόλου του μαγνητικού πεδίου της γης και φυσικά ⃗r = rr̂. Ενδεικτικά οι τιμές για τις παραμέτρους που υπεισέρχονται στην παραπάνω εξίσωση είναι B0 = 3.5 × 10−5 T , r ∼ 2RE , και RE η ακτίνα της γης. Στις αποστάσεις αυτές, τυπικές ενέργειες για τα κινούμενα √ ηλεκτρόνια √ είναι ∼ 1 MeV που αντιστοιχούν σε ταχύτητες v/c = E 2 − m20 /E ≈ 1 − 0.5122 /1 = 0.86. Διαλέγοντας το σύστημα αξόνων έτσι ώστε dˆ = ẑ και μετρώντας τις αποστάσεις σε μονάδες⁷ RE , παίρνουμε: 3xz Bx = B0 r5 3yz By = B0 5 (r ) 3zz 1 Bz = B0 − 3 (6.11) r5 r Το πεδίο δύναμης προγραμματίζεται τώρα εύκολα στο αρχείο sr_Bd.f90: ⁷Αφού c = 1, αυτό σημαίνει ότι η μονάδα του χρόνου είναι ο χρόνος που χρειάζεται το φως στο κενό να διασχίσει απόσταση RE . 326 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ z 100 80 60 40 20 0.4 0 0 1.2 y x 1.6 -0.4 ⃗ Σχήμα 6.7: Η επίδραση της προσθήκης ενός ηλεκτρικού πεδίου q E/m 0 = 1.0ẑ στην τροχιά του σχήματος 6.5 ! ======================================================== ! P a r t i c l e i n Magnetic d i p o l e f i e l d : ! q B_1 /m = k1 (3 x1 x3 ) / r ^5 ! q B_2 /m = k1 (3 x2 x3 ) / r ^5 ! q B_3 /m = k1 [ ( 3 x3 x3 ) / r ^5 −1/ r ^3] ! ======================================================== s u b r o u t i n e F ( T , Y , YP ) include ’ sr . inc ’ real (8) : : t r e a l ( 8 ) : : Y ( * ) , YP ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 r e a l ( 8 ) : : B1 , B2 , B3 real (8) : : r x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) c a l l velocity ( p1 , p2 , p3 , v1 , v2 , v3 ) ! now we can use a l l x1 , x2 , x3 , p1 , p2 , p3 , v1 , v2 , v3 YP ( 1 ) = v1 YP ( 2 ) = v2 YP ( 3 ) = v3 ! Acceleration : r = sqrt ( x1 * x1+x2 * x2+x3 * x3 ) 6.4. ΑΣΚΗΣΕΙΣ 327 i f ( r . gt . 0 . 0 D0 ) then B1 = k1 * ( 3.0 D0 * x1 * x3 ) / r * * 5 B2 = k1 * ( 3.0 D0 * x2 * x3 ) / r * * 5 B3 = k1 * ( ( 3 . 0 D0 * x3 * x3 ) / r **5 −1/ r * * 3 ) YP ( 4 ) = v2 * B3−v3 * B2 YP ( 5 ) = v3 * B1−v1 * B3 YP ( 6 ) = v1 * B2−v2 * B1 else YP ( 4 ) = 0.0 D0 YP ( 5 ) = 0.0 D0 YP ( 6 ) = 0.0 D0 endif end s u b r o u t i n e F ! ======================================================== ! Energy per u n i t r e s t mass ! ======================================================== r e a l ( 8 ) f u n c t i o n energy ( T , Y ) include ’ sr . inc ’ real (8) : : t , e real (8) : : Y ( * ) r e a l ( 8 ) : : x1 , x2 , x3 , v1 , v2 , v3 , p1 , p2 , p3 , psq x1 = Y ( 1 ) ; p1 = Y ( 4 ) x2 = Y ( 2 ) ; p2 = Y ( 5 ) x3 = Y ( 3 ) ; p3 = Y ( 6 ) psq= p1 * p1+p2 * p2+p3 * p3 ! K i n e t i c Energy / m_0 e = sqrt ( 1 . 0 D0+psq ) −1.0D0 energy = e end f u n c t i o n energy Τα αποτελέσματα φαίνονται στο σχήμα 6.8 στο οποίο έχουμε υπερ- βάλλει τις παραμέτρους, ώστε να έχουμε ένα κατατοπιστικό οπτικό αποτέλεσμα. Στην πραγματικότητα, τα ηλεκτρόνια διαγράφουν πολύ λεπτές σπείρες και ο αναγνώστης ενθαρρύνεται να μελετήσει αριθμη- τικά το πρόβλημα για φαινομενολογικά ρεαλιστικές τιμές των παραμέ- τρων ⃗v0 , B0 , ⃗r0 και να κατανοήσει γιατί το φαινόμενο συμβαίνει μόνο κοντά στους πόλους. 6.4 Ασκήσεις 6.1 Να μελετήσετε την κίνηση σωματιδίου κοντά στην επιφάνεια της γης, όταν το μέτρο της αντίστασης του αέρα είναι ανάλογο του τετραγώνου του μέτρου της ταχύτητάς του. 6.2 Δύο φορτία κινούνται με μη σχετικιστικές ταχύτητες μέσα σε στα- θερό μαγνητικό πεδίο B⃗ = B ẑ και αλληλεπιδρούν μεταξύ τους 328 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ 2 1.6 1.2 0.8 0.4 0 0.004 0 -0.004 -0.008 0.02 0.012 0.016 -0.012 0 0.004 0.008 Σχήμα 6.8: Κίνηση φορτισμένου σωματίου σε μαγνητικό πεδίο διπόλου που δίνεται από τη σχέση (6.11). Για να έχουμε καλύτερα οπτικά αποτελέσματα πήραμε B0 = 1000, ⃗r = 0.02x̂ + 2.00ẑ, ⃗v = −0.99999ẑ. Η ολοκλήρωση έγινε με 10000 βήματα από χρόνο t0 = 0 έως tf = 5. μόνο με ηλεκτροστατικές δυνάμεις Coulomb (οι υπόλοιπες αλλη- λεπιδράσεις μπορούν να αγνοηθούν). Να γράψετε πρόγραμμα που να υπολογίζει τις τροχιές των σωματιδίων δεδομένων των αρχικών συνθηκών χρησιμοποιώντας τη μέθοδο RK45. 6.3 Γράψτε πρόγραμμα για τον ανισοτροπικό αρμονικό ταλαντωτή F⃗ = −kx xx̂ −ky y ŷ −kz z ẑ και μελετήστε τις τρισδιάστατες καμπύ- λες Lissajous που εμφανίζονται √ για √ κατάλληλες √τιμές των κυκλικών συχνοτήτων ωx = kx /m, ωy = ky /m, ωz = kz /m. 6.4 Δύο σωματίδια μάζας M βρίσκονται στερεωμένα στις θέσεις ⃗r1 = aẑ και ⃗r2 = −aẑ. Τρίτο σωματίδιο μάζας m αλληλεπιδρά μαζί τους με Νευτώνεια βαρυτική δύναμη και κινείται με μη σχετικιστι- κές ταχύτητες. Μελετήστε τις τροχιές που διαγράφει το σωματίδιο αυτό και εξετάστε αν υπάρχουν κατάλληλες αρχικές συνθήκες τέ- τοιες, ώστε η κίνηση του σωματιδίου να περιορίζεται στο επίπεδο. 6.5 Λύστε το πρόβλημα 5.19 της σελίδας 303 χρησιμοποιώντας τη μέ- θοδο RK45. Επιλέξτε αρχικές συνθήκες τέτοιες, ώστε το σύστημα 6.4. ΑΣΚΗΣΕΙΣ 329 να εκτελεί μόνο μεταφορική κίνηση. Στη συνέχεια επιλέξτε αρχικές συνθήκες έτσι ώστε, για μικρές ταλαντώσεις, το κέντρο μάζας να παραμένει ακίνητο. Βρείτε τους κανονικούς τρόπους ταλάντωσης του συστήματος και βάλτε κατάλληλες αρχικές συνθήκες, ώστε το σύστημα να εκτελέσει κάθε έναν από αυτούς. 6.6 Λύστε το προηγούμενο πρόβλημα βάζοντας το σύστημα σε ένα κουτί |x| ≤ L και |y| ≤ L. Υπόδειξη: Δείτε το αρχείο springL.f90. 6.7 Λύστε το πρόβλημα 5.20 της σελίδας 303 χρησιμοποιώντας τη μέθοδο RK45. 6.8 Λύστε το πρόβλημα 5.21 της σελίδας 304 χρησιμοποιώντας τη μέ- θοδο RK45. 6.9 Το ηλεκτρικό πεδίο που δημιουργεί ηλεκτρικό δίπολο διπολικής ροπής p⃗ = pẑ στο χώρο δίνεται από τις σχέσεις: E⃗ = Eρ ρ̂ + Ez ẑ 1 3p sin θ cos θ Eρ = 4πϵ0 r3 1 p(3 cos2 θ − 1) Ez = (6.12) 4πϵ0 r3 √ όπου ρ = x2 + y 2 = r sin θ, Ex = Eρ cos ϕ, Ey = Eρ sin ϕ και (r, θ, ϕ) οι πολικές συντεταγμένες του σημείου στο οποίο υπολογίζεται το ηλεκτρικό πεδίο. Υπολογίστε την τροχιά δοκιμαστικού φορτίου που κινείται μη σχετικιστικά μέσα στο παραπάνω πεδίο. Στη συ- νέχεια, μελετήστε τη σχετικιστική κίνηση του σωματιδίου. Υπολο- γίστε τις αποκλίσεις των τροχιών μεταξύ της σχετικιστικής και μη σχετικιστικής κίνησης για τις ίδιες αρχικές συνθήκες ως συνάρτηση του χρόνου, όταν η αρχική ταχύτητα έχει μέτρο 0.01c, 0.1c, 0.5c, 0.9c αντίστοιχα (αγνοήστε φαινόμενα ακτινοβολίας λόγω επιτάχυνσης του φορτίου). 6.10 Ηλεκτρικό φορτίο κατανέμεται γραμμικά πάνω στον άξονα των z με θετική γραμμική πυκνότητα φορτίου λ. Το ηλεκτρικό πεδίο δίνεται από τη σχέση ⃗ = Eρ ρ̂ = 1 2λ E ρ̂ 4πϵ0 ρ 330 ΚΕΦΑΛΑΙΟ 6. ΚΙΝΗΣΗ ΣΤΟ ΧΩΡΟ Υπολογίστε τις τροχιές δύο ίδιων δοκιμαστικών αρνητικών φορ- τίων που κινούνται μη σχετικιστικά μέσα στο παραπάνω πεδίο. Μπορείτε να θεωρήσετε ότι τα δύο φορτία αλληλεπιδρούν μόνο με ηλεκτροστατικές δυνάμεις Coulomb. 6.11 Ηλεκτρικό φορτίο κατανέμεται γραμμικά πάνω σε τέσσερις ευ- θείες που είναι παράλληλες στον άξονα των z με σταθερή γραμ- μική πυκνότητα φορτίου λ. Οι ευθείες αυτές τέμνουν το επίπεδο xy στα σημεία (0, 0), (0, a), (a, 0), (a, a). Υπολογίστε την τροχιά δοκιμα- στικού φορτίου που κινείται μη σχετικιστικά μέσα στο παραπάνω πεδίο. Στη συνέχεια μελετήστε τη σχετικιστική κίνηση του σωμα- τιδίου (αγνοήστε φαινόμενα ακτινοβολίας λόγω επιτάχυνσης του φορτίου). 6.12 Τρία σωματίδια μάζας m αλληλεπιδρούν μεταξύ τους μόνο με τη δύναμη της Νευτώνειας βαρύτητας. Μελετήστε τη μη σχετικιστική κίνησή τους στο χώρο. ΚΕΦΑΛΑΙΟ 7 Ηλεκτροστατική Στο κεφάλαιο αυτό θα μελετήσουμε αριθμητικά το ηλεκτροστατικό πε- δίο στατικής κατανομής φορτίων. Στην πρώτη παράγραφο μελετάμε τις δυναμικές γραμμές και ισοδυναμικές επιφάνειες κατανομής σημειακών ηλεκτρικών φορτίων στο επίπεδο. Στη δεύτερη παράγραφο εξετάζονται προβλήματα συνεχών κατανομών φορτίου, πάλι στο επίπεδο. Γίνεται αριθμητική λύση προβλημάτων συνοριακών τιμών χρησιμοποιώντας με- θόδους τύπου (over)relaxation. 7.1 Σημειακή Κατανομή Φορτίων Έστω N σημειακά ηλεκτρικά φορτία Qi τα οποία βρίσκονται σε σταθε- ρές θέσεις στο επίπεδο που δίνονται από τα διανύσματα θέσης τους ⃗ri , i = 1, . . . , N . Ο νόμος του Coulomb μας δίνει την τιμή του ηλεκτρικού πεδίου ∑N ⃗ r) = 1 E(⃗ Qi ρ̂i , (7.1) 4πϵ0 i=1 |⃗r − ⃗ri |2 όπου το ρ̂i = (⃗r − ⃗ri )/|⃗r − ⃗ri | είναι το μοναδιαίο διάνυσμα στη διεύθυνση του ⃗r − ⃗ri . Οι συνιστώσες του πεδίου είναι 1 ∑ N Qi (x − xi ) Ex (x, y) = 4πϵ0 i=1 ((x − xi )2 + (y − yi )2 )3/2 1 ∑ N Qi (y − yi ) Ey (x, y) = , , (7.2) 4πϵ0 i=1 ((x − xi )2 + (y − yi )2 )3/2 331 332 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ Το ηλεκτροστατικό δυναμικό στη θέση ⃗r είναι 1 ∑ N Qi V (⃗r) = V (x, y) = , (7.3) 4πϵ0 i=1 ((x − xi )2 + (y − yi )2 )1/2 και ισχύει ⃗ r) = −∇V E(⃗ ⃗ (⃗r) . (7.4) Οι δυναμικές γραμμές είναι οι ολοκληρωτικές καμπύλες του διανυ- σματικού πεδίου E, ⃗ δηλ. οι καμπύλες εκείνες πάνω στις οποίες εφά- πτεται το διάνυσμα του ηλεκτρικού πεδίου σε κάθε σημείο τους. Μια σύμβαση που ακολουθείται στο σχεδιασμό των δυναμικών γραμμών εί- ναι ότι η πυκνότητα τους ανά μονάδα επιφανείας είναι ανάλογη του μέτρου του E.⃗ Δηλ. ο αριθμός των δυναμικών γραμμών που τέμνει μια ∫ επιφάνεια S είναι ανάλογη της ροής ΦE = S E ⃗ · dA ⃗ του ηλεκτρικού πεδίου που τη διαπερνά. Οι ισοδυναμικές επιφάνειες είναι ο γεωμετρικός τόπος των σημείων εκείνων όπου η συνάρτηση του δυναμικού έχει σταθερή τιμή. Η σχέση (7.4) μας λέει πως πυκνές ισοδυναμικές επιφάνειες (που σημαίνουν γρή- γορη χωρική μεταβολή του δυναμικού) συνεπάγονται ισχυρό ηλεκτρικό πεδίο στην περιοχή και αντίστροφα. Επίσης, μας λέει ότι η διεύθυνση του ηλεκτρικού πεδίου είναι κάθετη στις ισοδυναμικές επιφάνειες σε κάθε σημείο¹ (η διεύθυνση ταχύτερης μεταβολής του V ) και με φορά αυτή της μείωσης του δυναμικού. Όταν περιοριζόμαστε στο επίπεδο που βρίσκεται η κατανομή των φορτίων, οι ισοδυναμικές επιφάνειες δί- νουν κλειστές καμπύλες που είναι η τομή τους με το εν λόγω επίπεδο. Στον υπολογιστή δεν μπορούμε να λύσουμε το πρόβλημα στο συνε- χές. Η συνεχής καμπύλη που θέλουμε να υπολογίσουμε θα προσεγγιστεί με ένα μεγάλο αλλά πεπερασμένο αριθμό από μικρά ευθύγραμμα τμή- ματα. Η ιδέα περιγράφεται στο σχήμα 7.1: Το μικρό ευθύγραμμο τμήμα μήκους ∆l είναι στη διεύθυνση του ηλεκτρικού πεδίου, οπότε από τα όμοια τρίγωνα παίρνουμε Ex Ey ∆x = ∆l ∆y = ∆l , (7.5) E E √ όπου E ≡ |E| ⃗ = E 2 + E 2. x y Για τον υπολογισμό των ισοδυναμικών καμπύλων χρησιμοποιούμε την ιδιότητα που έχουν οι δυναμικές γραμμές να είναι παντού κάθετες ¹Επειδή σε κάθε μικρή μετατόπιση d⃗r πάνω σε μια ισοδυναμική επιφάνεια το δυναμικό παραμένει σταθερό (dV = 0), έχουμε ότι 0 = dV = ∇V ⃗ · d⃗r = −E ⃗ · d⃗r, άρα E ⊥ d⃗r. ⃗ 7.1. ΣΗΜΕΙΑΚΗ ΚΑΤΑΝΟΜΗ ΦΟΡΤΙΩΝ 333 y E Ey ∆l ∆y ∆x Ex x Σχήμα 7.1: Σε κάθε σημείο του χώρου οι δυναμικές γραμμές εφάπτονται με το διά- νυσμα της έντασης του ηλ. πεδίου, ενώ οι ισοδυναμικές επιφάνειες (εδώ καμπύλες) το έχουν κάθετο. Προσεγγίζοντας τη συνεχή καμπύλη με το ευθ. τμήμα ∆l έχουμε ∆y/∆x = Ey /Ex . στις ισοδυναμικές επιφάνειες (εδώ στις καμπύλες). Άρα αν (∆x, ∆y) δίνει την εφαπτόμενη στην ισοδυναμική γραμμή, τότε το (−∆y, ∆x) είναι σε κάθετη κατεύθυνση, αφού (∆x, ∆y) · (−∆y, ∆x) = −∆x∆y + ∆y∆x = 0. Οπότε για τις ισοδυναμικές καμπύλες του επιπέδου προκύπτει η εξίσωση Ey Ex ∆x = −∆l , ∆y = ∆l . (7.6) E E Μπορούμε τώρα να σχεδιάσουμε μια αλγοριθμική διαδικασία που θα μας επιτρέψει τον προσεγγιστικό υπολογισμό των δυναμικών και ισοδυ- ναμικών καμπύλων: Επιλέγουμε αρχικό σημείο από το οποίο περνάει η (μοναδική) δυναμική γραμμή ή ισοδυναμική επιφάνεια που επιθυμούμε. Από την κατανομή των φορτίων υπολογίζουμε το ηλεκτρικό πεδίο χρη- σιμοποιώντας τις σχέσεις (7.2). Επιλέγοντας αρκετά μικρό βήμα ∆l, μετακινούμαστε στη διεύθυνση (∆x, ∆y) x → x + ∆x y → y + ∆y , (7.7) χρησιμοποιώντας τις σχέσεις (7.5) ή (7.6) ανάλογα με την περίπτωση. 334 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ Επαναλαμβάνουμε τη διαδικασία μέχρι να τελειώσει ο σχεδιασμός για ένα μεγάλο αριθμό βημάτων. Το κριτήριο για αυτό θα το καθορίσει ο προγραμματιστής ή ο χρήστης ανάλογα με τις ανάγκες του υπολογι- σμού, λ.χ. η δυναμική γραμμή φεύγει έξω από τα όρια σχεδιασμού ή πλησιάζει κοντύτερα σε ένα φορτίο από μια ελάχιστη απόσταση. 7.2 Το Πρόγραμμα – Ορεκτικά και ... επιδόρ- πιο Ο βιαστικός, αλλά και ελαφρά καταρτισμένος αναγνώστης μπορεί να συνεχίσει τη μελέτη του πηγαίνοντας κατευθείαν στην παράγραφο 7.4 και να επιστρέψει εδώ αργότερα για διευκρινίσεις. Εκεί θα βρει την τε- λική και πλήρη μορφή του προγράμματος, καθώς και συνοπτικές οδηγίες χρήσης του. Για τον προγραμματισμό του αλγόριθμου που περιγράψαμε στην προηγούμενη παράγραφο, θα χωρίσουμε τις διαδικασίες σε τέσσερις ξεχωριστές και ανεξάρτητες μεταξύ τους ομάδες οι οποίες έχουν καλά ορισμένους στόχους και μπορούν να χρησιμοποιηθούν σε διαφορετικά τμήματα ενός προγράμματος. • Το κυρίως πρόγραμμα: Ορίζεται η δομή των δεδομένων, που απο- τελείται κυρίως από τις θέσεις των φορτίων που αποθηκεύονται στα arrays X(P), Y(P) και την τιμή των φορτίων Q(P). Διεπαφή (interface) με το χρήστη: Γίνεται από το χρήστη εισαγωγή δεδομέ- νων, όπως ο αριθμός των φορτίων N, η θέση τους και το μέγεθός τους, και γίνεται η επεξεργασία των αποτελεσμάτων. • subroutine eline(xin,yin,X,Y,Q,N): Υπολογίζει τη δυναμική γραμμή που περνάει από το σημείο xin,yin. Στην είσοδο ο χρή- στης δίνει το σημείο xin,yin και τα δεδομένα N, X(N), Y(N), Q(N). Στην έξοδο η υπορουτίνα τυπώνει στην καθιερωμένη έξοδο (standard output - που είναι συνήθως η οθόνη) τις συντεταγμένες της δυναμικής γραμμής που περνάει από το σημείο (xin,yin) και προεκτείνεται μέχρι να φτάσει πολύ κοντά σε κάποιο άλλο φορ- τίο ή μέχρι να βγει εκτός της περιοχής σχεδίασης (εδώ ορίζεται να εκτείνεται μέχρι μια μέγιστη απόσταση από την αρχή των αξόνων). Καλεί την υπορουτίνα efield για τον υπολογισμό του ηλεκτρικού πεδίου και την mdist για τον υπολογισμό της ελάχιστης απόστασης των σημείων της δυναμικής γραμμής από τα ηλεκτρικά φορτία. 7.2. ΤΟ ΠΡΟΓΡΑΜΜΑ – ΟΡΕΚΤΙΚΑ ΚΑΙ ... ΕΠΙΔΟΡΠΙΟ 335 • subroutine epotline(xin,yin,X,Y,Q,N): Υπολογίζει την ισοδυνα- μική καμπύλη που περνάει από το σημείο xin,yin. Στην είσοδο ο χρήστης δίνει το σημείο (xin,yin) και τα δεδομένα N, X(N), Y(N), Q(N). Στην έξοδο η υπορουτίνα τυπώνει στην καθιερωμένη έξοδο τις συντεταγμένες της ισοδυναμικής καμπύλης που περνάει από το σημείο (xin,yin) και προεκτείνεται μέχρι είτε να κλεί- σει αρκετά κοντά στο αρχικό σημείο² ή μέχρι να βγει εκτός της περιοχής σχεδίασης. Καλεί την υπορουτίνα efield για τον υπολο- γισμό του ηλεκτρικού πεδίου και την mdist για τον υπολογισμό της ελάχιστης απόστασης από τα ηλεκτρικά φορτία. • subroutine efield(x0,y0,X,Y,Q,N,Ex,Ey): Καλείται από τις πα- ραπάνω ρουτίνες. Υπολογίζει το ηλεκτρικό πεδίο (Ex, Ey) στη θέση (x0, y0). Στην είσοδο ο χρήστης παρέχει τον αριθμό N, τις θέσεις των φορτίων που αποθηκεύονται στα arrays X(N), Y(N), το μέγεθος των φορτίων που αποθηκεύονται array Q(N) και τη θέση x0, y0 στην οποία θα υπολογιστεί το ηλεκτρικό πεδίο. Στην έξοδο ο χρήστης παίρνει τις συνιστώσες του ηλεκτρικού πεδίου Ex, Ey. • subroutine mdist(x0,y0,X,Y,N,rmin,rmax): Καλείται από τις πα- ραπάνω ρουτίνες. Υπολογίζει την ελάχιστη και μέγιστη απόσταση του σημείου x0, y0 από τα φορτία που βρίσκονται στις θέσεις X(N), Y(N). Στην είσοδο ο χρήστης παρέχει τον αριθμό των φορ- τίων N, τις θέσεις τους X(N), Y(N) και το σημείο x0, y0. Στην έξοδο η ρουτίνα δίνει την ελάχιστη και μέγιστη απόσταση rmin,rmax. Στο κυρίως πρόγραμμα ο χρήστης πρέπει να ορίσει τις μεταβλη- τές N, X(N), Y(N), Q(N). Το πρόγραμμα θα πρέπει να ζητήσει από το χρήστη τις σχετικές πληροφορίες (“διεπαφή με χρήστη”) και, χρη- σιμοποιώντας τις, να καλέσει τις σχετικές ρουτίνες που υλοποιούν τον υπολογισμό. Μια μινιμαλιστική προσέγγιση θα είναι να γράψουμε σε ένα αρχείο ELines.f90 ένα πρόγραμμα όπως το παρακάτω (“πρώτη έκ- δοση” - version 1): ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q ²Θυμάστε φαντάζομαι πως οι ισοδυναμικές επιφάνειες, άρα και οι καμπύλες, είναι κλειστές. 336 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ integer :: N !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− N = 2 X (1) = 1.0 Y ( 1 ) = 0.0 Q (1) = 1.0 X ( 2 ) = −1.0 Y ( 2 ) = 0.0 Q ( 2 ) = −1.0 !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− c a l l eline ( 0 . 0 , 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 2 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 2 . 0 , X , Y , Q , N ) end program Electric_Fields Οι εντολές !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− N = 2 X (1) = 1.0 Y ( 1 ) = 0.0 Q (1) = 1.0 X ( 2 ) = −1.0 Y ( 2 ) = 0.0 Q ( 2 ) = −1.0 τοποθετούν δύο ίσα και αντίθετα φορτία Q(1)= -Q(2)= 1.0 στις θέ- σεις (1, 0) και (−1, 0) αντίστοιχα. Οι επόμενες γραμμές καλούν την υπο- ρουτίνα eline να κάνει τον υπολογισμό για 8 δυναμικές γραμμές που περνούν από τα σημεία (0, ±1/2), (0, ±1), (0, ±3/2), (0, ±2): !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− c a l l eline ( 0 . 0 , 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , 2 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 0 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 0 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 1 . 5 , X , Y , Q , N ) c a l l eline ( 0 . 0 , − 2 . 0 , X , Y , Q , N ) 7.2. ΤΟ ΠΡΟΓΡΑΜΜΑ – ΟΡΕΚΤΙΚΑ ΚΑΙ ... ΕΠΙΔΟΡΠΙΟ 337 Οι εντολές αυτές τυπώνουν τις συντεταγμένες των σημείων των δυνα- μικών γραμμών στο standard output, τις οποίες ο χρήστης θα πρέπει να επεξεργαστεί περαιτέρω. Για τον υπολογισμό των ισοδυναμικών καμπύλων ο κώδικας είναι ακριβώς ο ίδιος αντικαθιστώντας call eline → call epotline. Για να συμπληρωθεί το πρόγραμμα θα πρέπει να προγραμματίσουμε τις υπορουτίνες eline, efield, mdist. Αυτό θα το συζητήσουμε πα- ρακάτω. Για την ώρα, αν θέλετε να χρησιμοποιήσετε το πλήρες πρό- γραμμα, αναζητήστε το αρχείο ELines.f90 από το συνοδευτικό λογι- σμικό. Μεταγλωττίζουμε και τρέχουμε το πρόγραμμα κατά τα γνωστά: > g f o r t r a n ELines . f90 −o el > . / el > el . out όπου με το χαρακτήρα > επαναορισμού του standard output μεταφέ- ρουμε τα αποτελέσματα που τυπώνει το πρόγραμμα στο αρχείο el.out. Για να δούμε τα αποτελέσματα, χρησιμοποιούμε το gnuplot: gnuplot > plot ” e l . out ” with dots Το αποτέλεσμα φαίνεται στο σχήμα 7.2. Ας γράψουμε τώρα το πρόγραμμα δίνοντας στο χρήστη την ευκαι- ρία να μελετήσει ευκολότερα διαφορετικές κατανομές φορτίων και να επιλέξει τις δυναμικές γραμμές που θα υπολογιστούν. Ο χρήστης θα παρέχει διαδραστικά τον αριθμό και τη θέση/μέγεθος των ηλεκτρικών φορτίων καθώς και τον αριθμό και τα αρχικά σημεία των δυναμικών γραμμών που θα υπολογιστούν. Ο πρώτος στόχος επιτυγχάνεται αλ- λάζοντας τον κώδικα στο σημείο που θέτει την κατανομή φορτίων ως εξής: !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo Η πρώτη εντολή ζητάει από το χρήστη τον αριθμό των φορτίων της κατανομής, τον οποίο διαβάζει από το standard input. Στη συνέχεια, 338 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 Σχήμα 7.2: Μερικές δυναμικές γραμμές ηλ. πεδίου δύο αντίθετων φορτίων που σχε- διάζουμε με το πρόγραμμα ELines.f90 στην ... πρώτη του έκδοση. για κάθε τιμή του i διαβάζουμε τις τιμές της θέσης/μέγεθος φορτίου και τις αποθηκεύουμε στις αντίστοιχες θέσεις των arrays X(i), Y(i), Q(i). Τα αποτελέσματα τυπώνονται για να τα βλέπει ο χρήστης και για να ελέγχει ότι πέρασαν σωστά στη μνήμη του υπολογιστή. Ο σχεδιασμός των δυναμικών γραμμών γίνεται αλλάζοντας τον κώ- δικα στο σημείο σχεδίασης των γραμμών ως εξής: !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− p r i n t * , ’ # How many l i n e s t o draw? ’ read * , draw do i =1 , draw p r i n t * , ’ # I n i t i a l p o i n t ( x0 , y0 ) : ’ read * , x0 , y0 c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo Το πρόγραμμα το τρέχουμε, όπως φαίνεται παρακάτω, για ένα φορτίο q = 1.0 στην αρχή των αξόνων ζητώντας να σχεδιάζει μία δυναμική γραμμή που περνάει από το σημείο (0.1, 0.1). 7.2. ΤΟ ΠΡΟΓΡΑΜΜΑ – ΟΡΕΚΤΙΚΑ ΚΑΙ ... ΕΠΙΔΟΡΠΙΟ 339 > gfortran ELines . f90 −o el > . / el # Enter number of charges : 1 # N= 1 # Charge : 1 # Position and charge : ( X , Y , Q ) : 0.0 0.0 1 . 0 # ( X , Y )= 0.000000 0.000000 Q= 1.000000 # How many lines to draw ? 1 # Initial point ( x 0 , y 0) : 0.1 0.1 9.2928931E−02 9.2928931E−02 8.5857861E−02 8.5857861E−02 7.8786790 E−02 7.8786790 E−02 .... Για μεγαλύτερες κατανομές φορτίων χρησιμοποιείστε έναν editor και σε ένα αρχείο με όνομα λ.χ. Input γράψτε τα δεδομένα εισόδου 2 N : Number of Charges 1 . 0 0.0 1 . 0 ( X , Y , Q ) : Position and charge −1.0 0.0 −1.0 ( X , Y , Q ) : Position and charge 8 Number of lines to draw 0.0 0.5 x 0 , y 0 : Initial point of line 0.0 1 . 0 x 0 , y 0 : Initial point of line 0.0 1 . 5 x 0 , y 0 : Initial point of line 0.0 2.0 x 0 , y 0 : Initial point of line 0.0 −0.5 x 0 , y 0 : Initial point of line 0.0 −1.0 x 0 , y 0 : Initial point of line 0.0 −1.5 x 0 , y 0 : Initial point of line 0.0 −2.0 x 0 , y 0 : Initial point of line Αν δώσετε τώρα την εντολή ³ . / el < Input > el . out θα πάρετε τα αποτελέσματα για τις δυναμικές γραμμές που ζητήσατε να υπολογιστούν και τα οποία θα αποθηκευτούν στο αρχείο el.out. Μπορείτε έτσι να φτιάξετε τη δικιά σας “βιβλιοθήκη” από κατανομές φορτίων και δυναμικές γραμμές του ηλεκτρικού πεδίου που δημιουρ- γούν. Ο παραπάνω κώδικας (“δεύτερη έκδοση” - version 2) παρατίθεται παρακάτω: ³Το “< Input” επαναορίζει το standard input να είναι το αρχείο με όνομα Input. 340 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N integer : : i , j , draw real : : x0 , y0 !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− p r i n t * , ’ # How many l i n e s t o draw? ’ read * , draw do i =1 , draw p r i n t * , ’ # I n i t i a l p o i n t ( x0 , y0 ) : ’ read * , x0 , y0 c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo end program Electric_Fields Ήδη ο προσεκτικός αναγνώστης θα έχει ασκηθεί αρκετά, ώστε να καταλάβει πως για να φτιάξει μια ωραία εικόνα από αντιπροσωπευτι- κές δυναμικές γραμμές χρειάζεται αρκετό χρόνο για να το κάνει... Πώς θα μπορούσαμε, τουλάχιστον αρχικά, να πάρουμε γρήγορα μια αντιπρο- σωπευτική εικόνα του ηλεκτρικού πεδίου; Για τις δυναμικές γραμμές η απάντηση είναι εύκολη: Αρκετά κοντά σε ένα σημειακό ηλεκτρικό φορ- τίο, το ηλεκτρικό πεδίο είναι κατά πολύ καλή προσέγγιση ισοτροπικά ακτινικό. Ο αριθμός των δυναμικών γραμμών που ξεκινούν/καταλήγουν από/σε ένα σημειακό θετικό/αρνητικό ηλεκτρικό φορτίο είναι ανάλογος του μεγέθους του φορτίου. Έτσι, αρκεί να επιλέξουμε ως αρχικά σημεία έναν αριθμό ανάλογο του φορτίου από ισότροπα κατανεμημένα σημεία πάνω σε ένα αρκετά μικρό κυκλάκι γύρω από κάθε φορτίο της κατανο- μής. Παρακάτω παραθέτουμε τον κώδικα (“τρίτη έκδοση” - version 3) για φορτία ίσα σε μέγεθος και αφήνουμε ως άσκηση στον αναγνώστη την περίπτωση φορτίων που είναι διαφορετικού μεγέθους: 7.2. ΤΟ ΠΡΟΓΡΑΜΜΑ – ΟΡΕΚΤΙΚΑ ΚΑΙ ... ΕΠΙΔΟΡΠΙΟ 341 ! **************************************************** program Electric_Fields ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N integer : : i , j , nd real : : x0 , y0 , theta r e a l , parameter : : PI= 3.14159265359 !−−−−−−−−−−−−− SET CHARGE DISTRIBUTION −−−− p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− !We draw 2*nd f i e l d l i n e s around each charge nd = 6 do i = 1 , N do j = 1 , ( 2 * nd ) theta = ( PI / nd ) * j x0 = X ( i ) + 0 . 1 * c o s ( theta ) y0 = Y ( i ) + 0 . 1 * s i n ( theta ) c a l l eline ( x0 , y0 , X , Y , Q , N ) enddo enddo end program Electric_Fields Θα παρατηρήσατε ήδη πως η μόνη αλλαγή που κάναμε είναι στο κομ- μάτι σχεδιασμού των γραμμών. Θέτουμε τον αριθμό των αρχικών γραμ- μών γύρω από κάθε φορτίο να είναι 12 με την εντολή nd = 6 και μετά γύρω από κάθε φορτίο καλούμε την eline με αρχικά σημεία (x0,y0) πάνω σε ένα κύκλο κέντρου (X(i),Y(i)) και ακτίνας 0.1. Αυτό γίνεται 2*nd φορές σε σημεία που καθορίζονται από τη γωνία theta=(PI/nd)*j. Για να το τρέξουμε, γράφουμε ένα αρχείο Input με περιεχόμενα την κατανομή των φορτίων. Για παράδειγμα, για μια κατανομή τεσσάρων φορτίων qi = ±1 πάνω στις κορυφές ενός τετραγώνου γράφουμε: 4 N : Number of charges 1 1 −1 ( X , Y , Q ) : Position and charge −1 1 1 ( X , Y , Q ) : Position and charge 342 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ 1 −1 1 ( X , Y , Q ) : Position and charge −1 −1 −1 ( X , Y , Q ) : Position and charge και μετά δίνουμε τις εντολές: > gfortran ELines . f90 −o el > . / el < Input > el . out > gnuplot gnuplot > p l o t ” e l . out ” with dots Στα σχήματα 7.3-7.4 δείχνουμε τα αποτελέσματα για μερικές κατανο- μές φορτίου. Αφήνουμε ως άσκηση στον αναγνώστη να βρει από ποιες κατανομές προκύπτουν και να αναπαράγει τα σχήματα αυτά για εξά- σκηση. 4 3 2 1 0 -1 -2 -3 -4 -4 -3 -2 -1 0 1 2 3 4 4 4 3 3 2 2 1 1 0 0 -1 -1 -2 -2 -3 -3 -4 -4 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 7.3: Δυναμικές γραμμές ηλεκτρικού πεδίου κατανομής σημειακών φορτίων που σχεδιάζουμε με το πρόγραμμα ELines.f90. Με παρόμοιο τρόπο γράφουμε πρόγραμμα και για τις ισοδυναμικές καμπύλες. Η μόνη διαφορά είναι ότι αν θέλουμε τα αρχικά σημεία να επιλέγονται αυτόματα, θα πρέπει να επινοήσουμε ένα νέο αλγόριθμο που να ζωγραφίζει τις δυναμικές γραμμές για δεδομένες πτώσεις δυ- ναμικού. Λόγω της πολυπλοκότητας του αλγόριθμου, αυτό αφήνεται ως άσκηση για τον αναγνώστη (δες σχετική άσκηση με οδηγίες). Εμείς 7.2. ΤΟ ΠΡΟΓΡΑΜΜΑ – ΟΡΕΚΤΙΚΑ ΚΑΙ ... ΕΠΙΔΟΡΠΙΟ 343 4 4 3 3 2 2 1 1 0 0 -1 -1 -2 -2 -3 -3 -4 -4 -4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4 Σχήμα 7.4: Δυναμικές γραμμές ηλεκτρικού πεδίου κατανομής σημειακών φορτίων που σχεδιάζουμε με το πρόγραμμα ELines.f90. στον παρακάτω κώδικα επιλέγουμε για αρχικά σημεία ισαπέχοντα ση- μεία πάνω σε ένα τετραγωνικό πλέγμα. Ο κώδικας αποθηκεύεται στο αρχείο EPotential.f90: ! **************************************************** program Electric_Potential ! **************************************************** i m p l i c i t none i n t e g e r , parameter : : P=20 ! max number o f c h a r g e s r e a l , dimension ( P ) : : X , Y , Q integer :: N r e a l , parameter : : PI= 3.14159265359 integer : : i , j , nd real : : x0 , y0 , rmin , rmax , L p r i n t * , ’ # Enter number o f c h a r g e s : ’ read * , N p r i n t * , ’ # N= ’ , N do i =1 , N p r i n t * , ’ # Charge : ’ , i p r i n t * , ’ # P o s i t i o n and charge : (X, Y , Q) : ’ read * , X ( i ) , Y ( i ) , Q ( i ) p r i n t * , ’ # (X, Y)= ’ , X ( i ) , Y ( i ) , ’ Q= ’ , Q ( i ) enddo !−−−−−−−−−−−−− DRAWING LINES −−−−−−−−−−−−− !We draw l i n e s p a s s i n g through an e q u a l l y ! spaced l a t t i c e o f N=(2*nd+1) x ( 2 * nd+1) p o i n t s ! i n t h e square −L<= x <= L , −L<= y <= L . nd = 4 L = 1.0 do i = −nd , nd do j = −nd , nd 344 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ x0 = i * ( L / nd ) y0 = j * ( L / nd ) p r i n t * , ’ # @ ’ , i , j , L / nd , x0 , y0 c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax ) ! we avoid g e t t i n g t o o c l o s e t o a charge : i f ( rmin . gt . L / ( nd * 1 0 ) )& c a l l epotline ( x0 , y0 , X , Y , Q , N ) enddo enddo end program Electric_Potential Ο κώδικας είναι πανομοιότυπος με τον προηγούμενο στο πρώτο και δεύτερο μέρος του. Στο τρίτο μέρος, όπου ζητείται ο σχεδιασμός των καμπύλων, καλείται τώρα η υπορουτίνα epotline να κάνει το σχεδια- σμό. Όλα τα υπόλοιπα αναφέρονται στον προσδιορισμό των αρχικών σημείων που γίνεται ως εξής: Επιλέγουμε τον αριθμό των σημείων του πλέγματος με την εντολή nd=4, η οποία δίνει (2*nd+1)*(2*nd+1)= 81 ση- μεία. Με την εντολή L=1.0 καθορίζουμε τα όρια του πλέγματος να είναι το τετράγωνο (1, 1), (−1, 1), (−1, −1), (1, −1). Στη συνέχεια, για κάθε σημείο του πλέγματος (x0,y0) υπολογίζουμε την ισοδυναμική καμπύλη που περνάει από αυτό με την προϋπόθεση το σημείο αυτό να μην είναι πολύ κοντά σε ένα από τα φορτία. Αυτό γίνεται καλώντας την υπορου- τίνα mdist από την οποία παίρνουμε την ελάχιστη απόσταση rmin του σημείου και βάζοντας κάτω όριο σε αυτή τον αριθμό L/(nd*10). Για να το τρέξουμε δίνουμε τις εντολές: > g f o r t r a n EPotential . f90 −o ep > . / ep < Input > ep . out > gnuplot gnuplot > p l o t ” ep . out ” with dots Μερικά από τα αποτελέσματα φαίνονται στο σχήμα 7.5. 7.3 Το Πρόγραμμα - Το Κυρίως Πιάτο Στην παράγραφο αυτή περιγράφουμε τη λειτουργία και τ