DOKK Library

Υπολογιστική Φυσική - Μία Πρακτική Εισαγωγή στην Υπολογιστική Φυσική και τον Επιστημονικό Προγραμματισμό

Authors Konstantinos N. Anagnostopoulos

License CC-BY-NC-SA-3.0

Plaintext
Υπολογιστική Φυσική
  Μία Πρακτική Εισαγωγή στην Υπολογιστική Φυσική
             και τον Επιστημονικό Προγραμματισμό




          Κωνσταντίνος Ν. Αναγνωστόπουλος
   ΚΩΝΣΤΑΝΤΙΝΟΣ Ν. ΑΝΑΓΝΩΣΤΟΠΟΥΛΟΣ
           Αναπληρωτής Καθηγητής
         Εθνικό Μετσόβιο Πολυτεχνείο




    Υπολογιστική Φυσική
 Μία Πρακτική Εισαγωγή στην Υπολογιστική
Φυσική και τον Επιστημονικό Προγραμματισμό
                       Υπολογιστική Φυσική


                               Συγγραφή
                     Κωνσταντίνος Ν. Αναγνωστόπουλος

                        Κριτικός Αναγνώστης
                               Ιωάννης Ρίζος

                        Συντελεστές έκδοσης
                 Γλωσσική Επιμέλεια: Αναστασία Τσιαδήμου

          Γραφιστική Επιμέλεια: Κωνσταντίνος Ν. Αναγνωστόπουλος

           Τεχνική Επεξεργασία: Κωνσταντίνος Ν. Αναγνωστόπουλος




                        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 Το Πρόγραμμα - Το Κυρίως Πιάτο
Στην παράγραφο αυτή περιγράφουμε τη λειτουργία και τον προγραμ-
ματισμό των κύριων κομματιών του προγράμματος: Τις υπορουτίνες
υπολογισμού των καμπύλων eline, epotline, του ηλεκτρικού πεδίου
efield και της ελάχιστης απόστασης από τα φορτία mdist.
   Αρχίζουμε από την ρουτίνα eline. Ο χρήστης την καλεί με την εντολή

        call     eline ( x0 , y0 , X , Y , Q , N )
7.3. ΤΟ ΠΡΟΓΡΑΜΜΑ - ΤΟ ΚΥΡΙΩΣ ΠΙΑΤΟ                                                                      345

                                  1.5

                                      1

                                  0.5

                                      0

                                  -0.5

                                      -1

                                  -1.5
                                           -2 -1.5 -1 -0.5   0   0.5    1    1.5   2

                                                                       10
      3

      2
                                                                        5
      1

      0                                                                 0

      -1
                                                                        -5
      -2

      -3
                                                                       -10
           -3   -2   -1   0   1   2         3                             -10          -5   0   5   10


Σχήμα 7.5: Ισοδυναμικές καμπύλες ηλεκτρικού πεδίου κατανομής σημειακών φορτίων
που σχεδιάζουμε με το πρόγραμμα EPotential.f90. Προσοχή όμως: η πυκνότητα των
καμπύλων δεν αντιστοιχεί στο πραγματικό πεδίο, για να πάρετε τις σωστές εικόνες
θα πρέπει να κάνετε την Άσκηση 7.5.




δίνοντας στην είσοδο το αρχικό σημείο της γραμμής (x0,y0), τον αριθμό
των φορτίων N, καθώς και τις θέσεις των φορτίων (X(N),Y(N)) και με-
γέθη των φορτίων Q(N). Για να σχεδιαστεί η δυναμική γραμμή χρειά-
ζονται το βήμα ∆l της σχέσης (7.5), καθώς και τα όρια σχεδίασης των
γραμμών. Τα όρια αυτά είναι δύο: Πρώτα όταν πλησιάζουμε πολύ κοντά
σε ένα φορτίο. Τότε το ηλεκτρικό πεδίο τείνει στο άπειρο και αυτό θα
δημιουργήσει προβλήματα. Το βήμα ∆l είναι μια καλή κλίμακα μικρού
μήκους και θέτουμε το όριο προσέγγισης σε 2∆l. Επίσης, δε θέλουμε
να απομακρυνθούμε πολύ από την κατανομή, οπότε θέτουμε μια αυ-
θαίρετη μέγιστη απόσταση από όλα τα φορτία ίση με max_dist=20.0.
Άλλες προβληματικές καταστάσεις που πρέπει να προβλέψουμε, είναι
να μηδενιστεί το ηλεκτρικό πεδίο, οπότε το αποτέλεσμα του υπολογι-
σμού στη Σχέση (7.5) γίνεται απροσδιόριστο. Τέλος, παίρνοντας ∆l > 0
μετακινούμαστε πάνω στη δυναμική γραμμή μόνο προς την κατεύθυνση
του ηλεκτρικού πεδίου καταλήγοντας πάντα πάνω σε ένα αρνητικό φορ-
τίο ή στη μέγιστη απόσταση (γιατί;). Για να σχεδιάσουμε τη δυναμική
γραμμή ολόκληρη, θα επαναλάβουμε τον υπολογισμό από το ίδιο αρχικό
σημείο με ∆l < 0.
346                                          ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

    Η κωδικοποίηση της διαδικασίας φαίνεται παρακάτω:

! ****************************************************
s u b r o u t i n e eline ( xin , yin , X , Y , Q , N )
! ****************************************************
  i m p l i c i t none
  integer                    :: N
  r e a l , dimension ( N ) : : X , Y , Q
  real                       : : xin , yin , x0 , y0
  r e a l , parameter        : : step =0.01
  r e a l , parameter        : : max_dist =20.0
  integer                    : : i , direction
  real                       : : rmin , rmax , r , dx , dy , dl
  real                       : : Ex , Ey , E
  do direction = −1 ,1 ,2                                   ! d i r e c t i o n = +/− 1
    dl = direction * step
    x0 = xin
    y0 = yin
    dx = 0.0
    dy = 0.0
    c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax )
    do while ( rmin . gt . ( 2 . 0 * step ) . and . rmax . lt . max_dist )
      p r i n t * , x0 , y0
! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s
! systematic errors
      c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey )
      E = sqrt ( Ex * Ex+Ey * Ey )
      i f ( E . le . 1 . 0 e−10 ) e x i t
      dx = dl * Ex / E
      dy = dl * Ey / E
      x0 = x0 + dx
      y0 = y0 + dy
      c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax )
    enddo                                    ! do while ( )
  enddo                                      ! do d i r e c t i o n = −1 ,1 ,2
end s u b r o u t i n e eline

Στο πρώτο κομμάτι του κώδικα δηλώνονται οι μεταβλητές. Το μόνο
καινούργιο που έχουμε να πούμε είναι η δήλωση

 r e a l , dimension ( N ) : : X , Y , Q

αντί για dimension(P). Αυτό δεν πειράζει σε τίποτα, αρκεί φυσικά ο
προγραμματιστής να έχει ήδη ελέγξει ότι N ≤ P. Στο αρχικό πρόγραμμα
που δηλώθηκαν τα arrays X,Y,Q, ζητήθηκε και ο φυσικός χώρος στη
μνήμη του υπολογιστή όπου θα αποθηκευτούν τα δεδομένα. Τα arrays
7.3. ΤΟ ΠΡΟΓΡΑΜΜΑ - ΤΟ ΚΥΡΙΩΣ ΠΙΑΤΟ                                       347

X,Y,Q περνάνε στην υπορουτίνα “by reference”, δηλ. δίνεται η θέση στη
μνήμη στην οποία είναι αποθηκευμένα και όχι “by value”. Το μέγεθος
του βήματος ∆l, καθώς και η μέγιστη απόσταση σχεδιασμού, καθορίζο-
νται με τον προσδιορισμό parameter στις δύο δηλώσεις:

 r e a l , parameter   : : step =0.01
 r e a l , parameter   : : max_dist =20.0

Οι τιμές αυτές θα πρέπει να καθοριστούν προσεκτικά από τον προγραμ-
ματιστή ανάλογα με τη ζητούμενη ακρίβεια επίλυσης του προβλήματος.
   Στο κυρίως πρόγραμμα παρατηρούμε τον εξωτερικό βρόχο

 do direction = −1 ,1 ,2
  dl = direction * step
   ...
 enddo

ο οποίος αλλάζει την κατεύθυνση κίνησης πάνω στη δυναμική γραμμή.
Η εντολή do direction = -1,1,2 εκτελεί το βρόχο για direction από
−1 έως 1 με βήμα 2. Δηλ. θα εκτελεστεί δύο φορές για direction= ±1.
Άρα το βήμα dl έχει κάθε φορά διαφορετικό πρόσημο.
   Στη συνέχεια, οι εντολές x0 = xin, y0 = yin ορίζουν το αρχικό
σημείο της δυναμικής γραμμής. (x0, y0) είναι το εκάστοτε σημείο της
δυναμικής γραμμής το οποίο τυπώνουμε στο standard output με την
εντολή print. (dx, dy) είναι το βήμα μετακίνησης πάνω στη δυναμική
γραμμή, έτσι ώστε (x0, y0) → (x0+dx, y0+dy) μετά από κάθε υπο-
λογισμό. Ο σχεδιασμός της δυναμικής γραμμής γίνεται στον εσωτερικό
βρόχο

 c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax )
 do while ( rmin . gt . ( 2 . 0 * step ) . and . rmax . lt . max_dist )
   ...
   c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax )
 enddo

ο οποίος εκτελείται, όταν η συνθήκη rmin .gt. (2.0*step) .and. rmax
.lt. max_dist έχει την τιμή .TRUE., είναι δηλ. αληθής. Αυτό ισχύει
όσο η ελάχιστη απόσταση από όλα τα φορτία στο εκάστοτε σημείο
που βρισκόμαστε δεν έχει γίνει μικρότερη ή ίση από 2.0*step και η
μέγιστη απόσταση από οποιοδήποτε φορτίο παραμένει μικρότερη από
max_dist⁴. Οι μέγιστες και ελάχιστες αποστάσεις προσδιορίζονται με
  ⁴Εδώ μπορείτε να βάλετε και rmin .lt. max_dist.
348                                      ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

κάλεσμα στην υπορουτίνα mdist την οποία θα μελετήσουμε παρακάτω.
    Το ηλεκτρικό πεδίο που θα χρησιμοποιηθεί στη Σχέση (7.5) υπολογί-
ζεται καλώντας efield(x0+0.5*dx,y0+0.5*dy,X,Y,Q,N,Ex,Ey). Τα δύο
πρώτα ορίσματα της υπορουτίνας είναι το σημείο στο οποίο ζητούμε
το ηλεκτρικό πεδίο, και αυτό επιλέγεται να είναι το (x0+dx/2,y0+dy/2)
αντί για το (x0,y0). Αυτό γίνεται για να μειώσουμε το συστηματικό
σφάλμα από τη διακριτοποίηση του προβλήματος παίρνοντας συνει-
σφορά από το μέσο του διαστήματος (x0,x0+dx) και (y0,y0+dy) και
όχι από το ένα άκρο μόνο.
    Μετά τον υπολογισμό του ηλεκτρικού πεδίου, η εφαρμογή της σχέσης
(7.5) γίνεται απλά με τις εντολές

   E    =   sqrt ( Ex * Ex+Ey * Ey )
   dx   =   dl * Ex / E
   dy   =   dl * Ey / E
   x0   =   x0 + dx
   y0   =   y0 + dy

Ο έλεγχος των παθολογικών καταστάσεων E=0.0 και dx=dy=0.0 γίνεται
με την εντολή

   i f ( E . le . 1 . 0 e−10 ) e x i t

όπου, όταν το μέτρο του πεδίου γίνει πολύ μικρό σταματάει ο υπολο-
γισμός βγαίνοντας από το βρόχο με την εντολή exit. Ομολογουμένως,
χάριν απλότητας, δεν είμαστε πολύ προσεκτικοί και ο αναγνώστης κα-
λείται να θεραπεύσει και άλλες παθολογικές καταστάσεις σε σχετική
άσκηση.
   Με παρόμοιο τρόπο προγραμματίζουμε και την epotline. Ο σχετικός
κώδικας παρατίθεται παρακάτω:

! ****************************************************
s u b r o u t i n e epotline ( xin , yin , X , Y , Q , N )
! ****************************************************
  i m p l i c i t none
  integer                    :: N
  r e a l , dimension ( N ) : : X , Y , Q
  real                       : : xin , yin , x0 , y0
  r e a l , parameter        : : step =0.02
  r e a l , parameter        : : max_dist =20.0
  integer                    :: i
  real                       : : r , dx , dy , dl
  real                       : : Ex , Ey , E
7.3. ΤΟ ΠΡΟΓΡΑΜΜΑ - ΤΟ ΚΥΡΙΩΣ ΠΙΑΤΟ                                              349


 dl = step
 x0 = xin
 y0 = yin
 dx = 0.0
 dy = 0.0
 r = step                                ! i n order t o s t a r t loop
 do while ( r . gt . ( 0 . 9 * dl ) . and . r . lt . max_dist )
  p r i n t * , x0 , y0
! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s
! systematic errors
  c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey )
  E = sqrt ( Ex * Ex+Ey * Ey )
  i f ( E . le . 1 . 0 e−10 ) e x i t
  dx = dl * Ey / E
  dy = −dl * Ex / E
  x0 = x0 + dx
  y0 = y0 + dy
  r = sqrt ( ( x0−xin ) * * 2 + ( y0−yin ) * * 2 )
 enddo                                   ! do while ( )
end s u b r o u t i n e epotline

Οι διαφορές με το προηγούμενο πρόγραμμα είναι λίγες: Οι ισοδυναμικές
καμπύλες είναι κλειστές, άρα τις διασχίζουμε μόνο κατά μία φορά και
το κριτήριο τερματισμού του υπολογισμού είναι το να φτάσουμε αρκετά
κοντά στο αρχικό σημείο:

 do while ( r . gt . ( 0 . 9 * dl ) . and . r . lt . max_dist )
  ...
 enddo

Ο παραπάνω βρόχος εκτελείται μέχρι η απόσταση από το αρχικό ση-
μείο να γίνει μικρότερη από 0.9*dl ή να φύγουμε εκτός της περιοχής
σχεδιασμού. Τα dx, dy υπολογίζονται σύμφωνα με την (7.6):

  dx = dl * Ey / E
  dy = −dl * Ex / E

    Η υπορουτίνα efield προγραμματίζεται εφαρμόζοντας τους τύπους
(7.2)⁵:

! ****************************************************
s u b r o u t i n e efield ( x0 , y0 , X , Y , Q , N , Ex , Ey )

   ⁵Βελτιώστε το πρόγραμμα, ώστε να λαμβάνει υπόψη του την περίπτωση ri = 0.
350                                          ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

! ****************************************************
  i m p l i c i t none
  integer                   :: N
  r e a l , dimension ( N ) : : X , Y , Q
  real                      : : x0 , y0 , dx , dy , Ex , Ey
  integer                   :: i
  real                      : : r3 , xi , yi

 Ex = 0.0
 Ey = 0.0
 do i= 1 , N
  xi = x0−X ( i )
  yi = y0−Y ( i )
  r3 = ( xi * xi+yi * yi ) * * ( − 1 . 5 )
  Ex = Ex + Q ( i ) * xi * r3
  Ey = Ey + Q ( i ) * yi * r3
 enddo
end s u b r o u t i n e efield



   Τέλος, η υπορουτίνα mdist που χρησιμοποιούμε αρκετά στα παρα-
πάνω υπολογίζει την ελάχιστη και μέγιστη απόσταση rmin και rmax από
ένα δεδομένο σημείο (x0,y0):

! ****************************************************
s u b r o u t i n e mdist ( x0 , y0 , X , Y , N , rmin , rmax )
! ****************************************************
  i m p l i c i t none
  integer                      :: N
  r e a l , dimension ( N ) : : X , Y
  real                         : : x0 , y0 , rmin , rmax
  integer                      :: i
  real                         :: r

 rmax = 0.0
 rmin = 1000.0
 do i = 1 , N
  r = sqrt ( ( x0−X ( i ) ) * * 2 + ( y0−Y ( i ) ) * * 2 )
  i f ( r . GT . rmax ) rmax = r
  i f ( r . LT . rmin ) rmin = r
 enddo
end s u b r o u t i n e mdist



Εδώ η αρχική τιμή του rmin πρέπει να οριστεί προσεκτικά ανάλογα με
τα όρια σχεδίασης των δυν. γραμμών.
7.4. ΤΟ ΠΡΟΓΡΑΜΜΑ - ΣΥΝΟΨΗ                                                           351

7.4       Το Πρόγραμμα - Σύνοψη
Στην παράγραφο αυτή παρατίθενται για διευκόλυνση του αναγνώστη
ολόκληρα τα προγράμματα των δύο τελευταίων παραγράφων, καθώς
και συνοπτικές οδηγίες για τη μεταγλώττιση και ανάλυση των απο-
τελεσμάτων. Μπορείτε, αν θέλετε, πρώτα να αντιγράψετε τα προγράμ-
ματα στα αντίστοιχα αρχεία και να εκτελέσετε τις εντολές συλλογής και
ανάλυσης των δεδομένων που δίνονται εδώ χωρίς εξήγηση και μετά να
επιστρέψετε στις προηγούμενες παραγράφους για βαθύτερη κατανόηση
των πεπραγμένων.
   Πρώτα δίνουμε τα περιεχόμενα του αρχείου ELines.f90:

! ****************************************************
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
! ****************************************************
s u b r o u t i n e eline ( xin , yin , X , Y , Q , N )
352                                          ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

! ****************************************************
  i m p l i c i t none
  integer                    :: N
  r e a l , dimension ( N ) : : X , Y , Q
  real                       : : xin , yin , x0 , y0
  r e a l , parameter        : : step =0.01
  r e a l , parameter        : : max_dist =20.0
  integer                    : : i , direction
  real                       : : rmin , rmax , r , dx , dy , dl
  real                       : : Ex , Ey , E
  do direction = −1 ,1 ,2                                    ! d i r e c t i o n = +/− 1
    dl = direction * step
    x0 = xin
    y0 = yin
    dx = 0.0
    dy = 0.0
    c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax )
    do while ( rmin . gt . ( 2 . 0 * step ) . and . rmax . lt . max_dist )
      p r i n t * , x0 , y0
! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s
! systematic errors
      c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey )
      E = sqrt ( Ex * Ex+Ey * Ey )
      i f ( E . le . 1 . 0 e−10 ) e x i t
      dx = dl * Ex / E
      dy = dl * Ey / E
      x0 = x0 + dx
      y0 = y0 + dy
      c a l l mdist ( x0 , y0 , X , Y , N , rmin , rmax )
    enddo                                    ! do while ( )
  enddo                                      ! do d i r e c t i o n = −1 ,1 ,2
end s u b r o u t i n e eline
! ****************************************************
s u b r o u t i n e efield ( x0 , y0 , X , Y , Q , N , Ex , Ey )
! ****************************************************
  i m p l i c i t none
  integer                      :: N
  r e a l , dimension ( N ) : : X , Y , Q
  real                         : : x0 , y0 , dx , dy , Ex , Ey
  integer                      :: i
  real                         : : r3 , xi , yi

 Ex = 0.0
 Ey = 0.0
 do i= 1 , N
  xi = x0−X ( i )
  yi = y0−Y ( i )
! E x e r c i s e : Improve code so t h a t x i * x i + y i * y i =0 i s taken c a r e o f
  r3 = ( xi * xi+yi * yi ) * * ( − 1 . 5 )
7.4. ΤΟ ΠΡΟΓΡΑΜΜΑ - ΣΥΝΟΨΗ                                                    353

    Ex = Ex + Q ( i ) * xi * r3
    Ey = Ey + Q ( i ) * yi * r3
  enddo
end s u b r o u t i n e efield
! ****************************************************
s u b r o u t i n e mdist ( x0 , y0 , X , Y , N , rmin , rmax )
! ****************************************************
  i m p l i c i t none
  integer                      :: N
  r e a l , dimension ( N ) : : X , Y
  real                         : : x0 , y0 , rmin , rmax
  integer                      :: i
  real                         :: r

 rmax = 0.0
 rmin = 1000.0
 do i = 1 , N
  r = sqrt ( ( x0−X ( i ) ) * * 2 + ( y0−Y ( i ) ) * * 2 )
  i f ( r . GT . rmax ) rmax = r
  i f ( r . LT . rmin ) rmin = r
 enddo
end s u b r o u t i n e mdist

    Στη συνέχεια, δίνουμε τα περιεχόμενα του αρχείου 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
354                                       ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

! 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
      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
! ****************************************************
s u b r o u t i n e epotline ( xin , yin , X , Y , Q , N )
! ****************************************************
  i m p l i c i t none
  integer                       :: N
  r e a l , dimension ( N ) : : X , Y , Q
  real                          : : xin , yin , x0 , y0
  r e a l , parameter           : : step =0.02
  r e a l , parameter           : : max_dist =20.0
  integer                       :: i
  real                          : : r , dx , dy , dl
  real                          : : Ex , Ey , E

 dl = step
 x0 = xin
 y0 = yin
 dx = 0.0
 dy = 0.0
 r = step                                ! i n order t o s t a r t loop
 do while ( r . gt . ( 0 . 9 * dl ) . and . r . lt . max_dist )
  p r i n t * , x0 , y0
! We e v a l u a t e t h e E−f i e l d a t t h e midpoint : This r e d u c e s
! systematic errors
  c a l l efield ( x0 +0.5* dx , y0 +0.5* dy , X , Y , Q , N , Ex , Ey )
  E = sqrt ( Ex * Ex+Ey * Ey )
  i f ( E . le . 1 . 0 e−10 ) e x i t
  dx = dl * Ey / E
  dy = −dl * Ex / E
  x0 = x0 + dx
  y0 = y0 + dy
  r = sqrt ( ( x0−xin ) * * 2 + ( y0−yin ) * * 2 )
 enddo                                   ! do while ( )
end s u b r o u t i n e epotline
...
7.5. ΗΛΕΚΤΡΟΣΤΑΤΙΚΟ ΠΕΔΙΟ ΣΤΟ ΚΕΝΟ                                 355

όπου οι ... είναι οι υπορουτίνες efield και mdist οι οποίες είναι ίδιες
με αυτές του αρχείου ELines.f90.
   Τέλος, υπενθυμίζουμε στον αναγνώστη πώς να τα τρέξει και να δει
τα αποτελέσματα. Μεταγλωττίζουμε το πρόγραμμα με την εντολή

> g f o r t r a n ELines . f90     −o el
> g f o r t r a n EPotential . f90 −o ep

Στη συνέχεια, γράφουμε σε ένα αρχείο Input τα δεδομένα της κατανο-
μής των φορτίων. Για παράδειγμα:

4                 N : Number of charges
 1 1     −1       ( X , Y , Q ) : Position and   charge
−1 1      1       ( X , Y , Q ) : Position and   charge
 1 −1     1       ( X , Y , Q ) : Position and   charge
−1 −1    −1       ( X , Y , Q ) : Position and   charge

Τα αποτελέσματα τα παίρνουμε με τις εντολές:

> . / el < Input > el . dat
> . / ep < Input > ep . dat
> gnuplot
gnuplot > p l o t ” e l . dat ” with dots
gnuplot > p l o t ” ep . dat ” with dots

    Καλή ... διασκέδαση!


7.5      Ηλεκτροστατικό Πεδίο στο Κενό
Θεωρούμε ηλεκτρικό πεδίο το οποίο είναι ανεξάρτητο του χρόνου σε
περιοχή του χώρου που είναι άδεια από ηλεκτρικά φορτία. Οι εξισώσεις
του Maxwell στην περίπτωση αυτή είναι η εξίσωση Gauss

                                    ∂Ex ∂Ey ∂Ez
                   ∇
                   ⃗ · E(x,
                       ⃗    y, z) =     +    +    = 0,            (7.8)
                                     ∂x   ∂y   ∂z

μαζί με την εξίσωση που ορίζει το ηλεκτροστατικό δυναμικό⁶

                         ⃗
                         E(x, y, z) = −∇V
                                       ⃗ (x, y, z) .              (7.9)

    ⁶Ισοδύναμη με την εξίσωση ∇
                              ⃗ ×E
                                 ⃗ = 0.
356                                 ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

Οι εξισώσεις (7.8) και (7.9) μας δίνουν μία εξίσωση Laplace για τη
V (x, y, z):


                                    ∂2V   ∂ 2V   ∂ 2V
                 ∇2 V (x, y, z) =       +      +      = 0.      (7.10)
                                    ∂x2   ∂y 2   ∂z 2



   Η λύση της παραπάνω εξίσωσης είναι ένα πρόβλημα συνοριακών
συνθηκών: Ζητούμε το δυναμικό V (x, y, z) σε μία περιοχή του χώρου S η
οποία περιβάλλεται από το όριό της, μία κλειστή επιφάνεια ∂S. Όταν το
δυναμικό είναι γνωστό πάνω στην ∂S, η λύση της (7.10) είναι μοναδική
και το δυναμικό, και κατ’ επέκταση το ηλεκτρικό πεδίο, προσδιορίζεται
παντού στην S.
   Για απλότητα θεωρούμε το πρόβλημα ανηγμένο στο επίπεδο, οπότε
V = V (x, y). Στην περίπτωση αυτή, ο τελευταίος όρος στην (7.10) απου-
σιάζει, η S είναι συμπαγές τμήμα του επιπέδου και η ∂S είναι μια
κλειστή καμπύλη.
   Για να μελετήσουμε το πρόβλημα αριθμητικά, προσεγγίζουμε το
χώρο με ένα τετραγωνικό και τετράγωνο πλέγμα με το δυναμικό να
ορίζεται μόνο πάνω σε N πλεγματικές θέσεις. Αν το μήκος κάθε πλευ-
ράς είναι l και τα γειτονικά πλεγματικά√σημεία απέχουν μεταξύ τους
απόσταση⁷ a, τότε l = (L − 1)a, όπου L = N είναι ο αριθμός των πλεγ-
ματικών σημείων σε κάθε πλευρά του πλέγματος. Η προσέγγιση της
συνεχούς λύσης επιτυγχάνεται, όταν η διακριτοποίηση αυτή εκλεπτύνε-
ται διαρκώς, παίρνοντας τον αριθμό των πλεγματικών σημείων N → ∞
και a → 0, έτσι ώστε το μήκος l = (L − 1)a να παραμένει σταθερό. Η
καμπύλη ∂S προσεγγίζεται από τις πλεγματικές θέσεις που αποτελούν
το όριο του πλέγματος και πιθανώς από άλλα σημεία στο εσωτερικό
στα οποία η τιμή του δυναμικού είναι δεδομένη. Το φυσικό σύστημα
που αντιστοιχεί στο μοντέλο μας είναι μια διάταξη από αγωγούς στην
επιφάνεια των οποίων το δυναμικό είναι σταθερό και ζητείται το ηλε-
κτρικό πεδίο που δημιουργείται στον περιβάλλοντα χώρο τους. Μία
τέτοια διάταξη φαίνεται στο σχήμα 7.6.
   Για να βρούμε την εξίσωση πεπερασμένων διαφορών που θα προ-



  ⁷Η απόσταση a λέγεται πλεγματική σταθερά.
7.5. ΗΛΕΚΤΡΟΣΤΑΤΙΚΟ ΠΕΔΙΟ ΣΤΟ ΚΕΝΟ                                                            357

                                              11 0011111
                1100 0011 0011 0011 0011 0011 00     000
                                                     000 0011 0011 0011 0011 0011 0011 0011
                                                     111
                0011                                                                   0011
                0011                                                                   0011
                0011                                                                   0011
                0011                                                                   0011
                0011                     0011                 0011                     0011
                0011                     0011                 0011                     0011
                0011                     0011                 0011                     0011
                0011                     0011                 0011                     0011
                0011                     0011                 0011                     0011
                0011                     0011                 0011                     0011
                0011                     0011                 0011                     0011
                0011                                                                   0011
                0011                                                                   0011
                0011                                 000
                                                     111                               0011
                0011 0011 0011 0011 0011 0011 00
                                              11 0011111
                                                     000 0011 0011 0011 0011 0011 0011 0011
Σχήμα 7.6: Πλέγμα που αντιστοιχεί στη διάταξη δύο παράλληλων, επίπεδων αγωγών
μέσα σε γειωμένο μεταλλικό κουτί. Οι μαύρες πλεγματικές θέσεις αντιστοιχούν σε
σημεία σταθερού δυναμικού, ενώ οι άσπρες σε σημεία του κενού χώρου.



σεγγίζει την εξίσωση (7.10), θεωρούμε το ανάπτυγμα κατά Taylor:
                                     ∂V      1 ∂2V
          V (x + δx, y) = V (x, y) +    δx +        (δx)2 + . . .
                                     ∂x      2 ∂x2
                                     ∂V      1 ∂ 2V
          V (x − δx, y) = V (x, y) −    δx +        (δx)2 + . . .
                                     ∂x      2 ∂x2
                                     ∂V      1 ∂ 2V
          V (x, y + δy) = V (x, y) +    δy +        (δy)2 + . . .
                                     ∂y      2 ∂y 2
                                     ∂V      1 ∂ 2V
          V (x, y − δy) = V (x, y) −    δy +        (δy)2 + . . . .
                                     ∂y      2 ∂y 2
Παίρνοντας το άθροισμα και των δύο μελών της παραπάνω εξίσωσης,
δx = δy και αγνοώντας τους όρους . . . παίρνουμε
           V (x + δx, y) + V (x − δx, y) + V (x, y + δy) + V (x, y − δy)
                                     ∂ 2V   ∂ 2V
                = 4V (x, y) + (δx)2 ( 2 +         ) + ...
                                     ∂x      ∂y 2
                ≈ 4V (x, y) ,                                            (7.11)
όπου χρησιμοποιήσαμε την εξίσωση (7.10) για να διώξουμε το δεύτερο
όρο της δεύτερης σειράς.
358                                  ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

     Θεωρώντας τις συντεταγμένες των πλεγματικών σημείων να δίνονται
από ακέραιους (i, j) τέτοιους, ώστε xi = (i − 1)a και yj = (j − 1)a με
i, j = 1, . . . , L, και παίρνοντας δx = δy = a, έτσι ώστε xi ± δx = xi ± a =
(i − 1 ± 1)a = xi±1 και yj ± δy = yj ± a = (j − 1 ± 1)a = yj±1 , η παραπάνω
εξίσωση γίνεται:
            1
  V (i, j) = (V (i − 1, j) + V (i + 1, j) + V (i, j − 1) + V (i, j + 1)) ,   (7.12)
            4
η οποία έχει την ακόλουθη απλή ερμηνεία: Το δυναμικό στη θέση (i, j)
είναι απλά ο μέσος όρος του δυναμικού των πλησιέστερων γειτόνων του.
Ο αλγόριθμος που θα ακολουθήσουμε εντάσσεται στη γενική κατηγορία
μεθόδων “χαλάρωσης ” (relaxation methods) και τα βασικά του βήματα
είναι:
  1. Καθορίζεται το μέγεθος τετραγωνικού πλέγματος με L πλεγματι-
     κές θέσεις σε κάθε πλευρά.

  2. Καθορίζονται οι πλεγματικές θέσεις που έχουν καθορισμένο δυ-
     ναμικό και δίνεται η τιμή του δυναμικού στις θέσεις αυτές.

  3. Καθορίζεται αυθαίρετη αρχική τιμή για το δυναμικό στις υπόλοι-
     πες θέσεις. Μια καλή επιλογή θα δώσει γρηγορότερη σύγκλιση
     προς τη σωστή συνάρτηση V (x, y). Μια κακή επιλογή θα δώσει
     αργή σύγκλιση, σύγκλιση προς λανθασμένη λύση ή καθόλου σύ-
     γκλιση.

  4. Σε διαδοχικά επαναλαμβανόμενα “περάσματα” (sweeps) του πλέγ-
     ματος επισκεπτόμαστε κάθε πλεγματική θέση, υπολογίζουμε το
     δυναμικό V (i, j) από τη σχέση (7.12) και ορίζουμε αυτή να είναι η
     νέα τιμή του δυναμικού στη θέση αυτή.

  5. Η διαδικασία σταματάει όταν σε δύο διαδοχικά περάσματα η με-
     ταβολή του δυναμικού είναι ικανοποιητικά μικρή. Υποθέτουμε δηλ.
     ότι έχουμε πρακτικά επιτύχει τη σύγκλιση στη σωστή λύση.
Η προσεκτική χρήση του παραπάνω αλγόριθμου απαιτεί να τον μελετή-
σουμε με διαφορετικά κριτήρια “ικανοποιητικά μικρής ” διαφοράς και
διαφορετικές αρχικές συνθήκες.
   Παρακάτω, παραθέτουμε πρόγραμμα που χρησιμοποιεί τον παρα-
πάνω αλγόριθμο για τον υπολογισμό του ηλεκτροστατικού δυναμικού
δύο παράλληλων επίπεδων μεταλλικών αγωγών που βρίσκονται μέσα
σε ένα γειωμένο, τετράγωνο, μεταλλικό αγώγιμο κουτί. Το πλέγμα φαί-
νεται στο σχήμα 7.6, όπου οι μαύρες κουκκίδες αναπαριστούν τους
7.5. ΗΛΕΚΤΡΟΣΤΑΤΙΚΟ ΠΕΔΙΟ ΣΤΟ ΚΕΝΟ                                          359

αγωγούς. Το κουτί έχει δυναμικό V = 0, ενώ οι αγωγοί δυναμικό V1
και V2 αντίστοιχα. Ο χρήστης στην είσοδο δίνει τις τιμές V1 και V2 , το
μέγεθος L του πλέγματος και την ακρίβεια σύγκλισης που επιθυμεί. Η
τελευταία καθορίζεται ποσοτικά από ένα μικρό αριθμό ϵ. Η μέγιστη
μεταβολή στο δυναμικό ανάμεσα σε δύο διαφορετικά περάσματα του
πλέγματος θα πρέπει να είναι μικρότερη από ϵ για επίτευξη σύγκλισης
της μεθόδου.
   Η δομή των δεδομένων είναι απλή. Χρειαζόμαστε ένα πραγματικό
array V(L,L) με αποθηκευμένες τις τιμές του δυναμικού και ένα logical
array isConductor(L,L) το οποίο καθορίζει αν μια πλεγματική θέση έχει
καθορισμένο δυναμικό (“αγωγός ” = .TRUE.) ή όχι (“κενός χώρος ” =
.FALSE.).
   Το κυρίως πρόγραμμα, αφού διαβάσει τα δεδομένα από το χρήστη,
καλεί τρεις υπορουτίνες:

  1. initialize_lattice(V,isConductor,L,V1,V2):
     Τα δεδομένα εισόδου της ρουτίνας είναι το δυναμικό V1 του αρι-
     στερού αγωγού και το δυναμικό V2 του δεξιού αγωγού, καθώς
     και το μέγεθος του πλέγματος L. Οι μεταβλητές εξόδου είναι τα
     arrays V(L,L) και isConductor(L,L) τα οποία στην έξοδο έχουν
     τις αρχικές τιμές: V1 στον αριστερό αγωγό, V2 στο δεξί, 0 στο
     κουτί, καθώς και την αυθαίρετη τιμή 0 για τις υπόλοιπες πλεγ-
     ματικές θέσεις. Η γεωμετρία της διάταξης είναι κωδικοποιημένη
     και ο χρήστης που θα θέλει να τη μεταβάλλει (λ.χ. μεταβολή από-
     στασης αγωγών, προσθήκη/αφαίρεση αγωγού κλπ) θα πρέπει να
     επέμβει στον κώδικα για να κάνει τις απαραίτητες μετατροπές.

  2. laplace(V,isConductor,L,epsilon):
     Η καρδιά του προγράμματος. Στην είσοδο, παρέχουμε τα αρχικο-
     ποιημένα arrays V(L,L), isConductor(L,L) και το μέγεθος κάθε
     διάστασής τους L, καθώς και την επιθυμητή ακρίβεια σύγκλισης
     epsilon. Στην έξοδο, παίρνουμε την τελική λύση V(L,L) για περαι-
     τέρω επεξεργασία. Στη ρουτίνα αυτή υπολογίζουμε τη μέση τιμή
     του δυναμικού Vav των πλησιέστερων γειτόνων κάθε πλεγματικής
     θέσης και αμέσως αλλάζουμε την τιμή V(i,j)=Vav⁸. Η μέγιστη τιμή
     error της απόκλισης της νέας τιμής του δυναμικού Vav από την
     παλιά V(i,j) υπολογίζεται για κάθε σάρωση του πλέγματος. Αν

   ⁸Παραλλαγή της μεθόδου θα ήταν η τιμή Vav να αποθηκευτεί σε ένα προσωρινό
array Vnew(i,j) και η αλλαγή των τιμών V(i,j)=Vnew(i,j) να γίνεται μετά από τη
σάρωση του πλέγματος. Ποια μέθοδος περιμένετε να έχει καλύτερες ιδιότητες σύγκλι-
σης; Δοκιμάστε...
360                                              ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

        αυτή γίνει μικρότερη από μια δεδομένη τιμή epsilon η διαδικασία
        …χαλάρωσης σταματάει.

   3. print_results(V,L):
      Η υπορουτίνα αυτή απλά τυπώνει το δυναμικό V(L,L) στο αρ-
      χείο data. Τυπώνονται οι συντεταγμένες i, j και η τιμή V(i,j)
      σε κάθε γραμμή. Το μόνο άξιο λόγου σημείο είναι ότι κάθε φορά
      που αλλάζει ο δείκτης i το πρόγραμμα τυπώνει μια κενή γραμμή.
      Αυτό γίνεται για να επεξεργαστούμε τα αποτελέσματα με το πρό-
      γραμμα γραφικών gnuplot. Για να γίνει η τρισδιάστατη γραφική
      παράσταση συνάρτηση δύο μεταβλητών με την εντολή splot πρέ-
      πει το format των δεδομένων να είναι αυτής της μορφής.

Όλο το πρόγραμμα ακολουθεί παρακάτω:

! *************************************************************
!PROGRAM LAPLACE_EM
! Computes t h e e l e c t r o s t a t i c p o t e n t i a l around c o n d u c t o r s .
! The computation i s performed on a square l a t t i c e o f l i n e a r
! dimension L . A r e l a x a t i o n method i s used t o converge t o t h e
! s o l u t i o n o f Laplace e q u a t i o n f o r t h e p o t e n t i a l .
!DATA STRUCTURE:
! r e a l ( 8 ) V(L , L) : Value o f t h e p o t e n t i a l on t h e l a t t i c e s i t e s
! l o g i c a l i s C o n d u c t o r (L , L) : I f .TRUE.         s i t e has f i x e d p o t e n t i a l
!                                               I f . FALSE . s i t e i s empty sp a c e
! r e a l e p s i l o n : Determines t h e a c c u r a c y o f t h e s o l u t i o n
! The maximum d i f f e r e n c e o f t h e p o t e n t i a l on each s i t e between
! two c o n s e c u t i v e sweeps should be l e s s than e p s i l o n .
!PROGRAM STRUCTURE
! main program :
! . Data Input
! . c a l l s u b r o u t i n e s f o r i n i t i a l i z a t i o n , computation and
!       printing of r e s u l t s
! subroutine i n i t i a l i z e _ l a t t i c e :
! . I n i t i a l i z a t i o n o f V(L , L) and i s C o n d u c t o r (L , L)
! subroutine laplace :
! . S o l v e s l a p l a c e e q u a t i o n using a r e l a x a t i o n method
! subroutine p r i n t _ r e s u l t s :
! . P r i n t s r e s u l t s f o r V(L , L) i n a f i l e . Uses format c o m p a t i b l e
! with s p l o t o f gnuplot .
! *************************************************************
program laplace_em
  i m p l i c i t none
! P d e f i n e s t h e s i z e o f t h e a r r a y s and i s equal t o L
  i n t e g e r , parameter                 : : P=31
  l o g i c a l , dimension ( P , P ) : : isConductor
7.5. ΗΛΕΚΤΡΟΣΤΑΤΙΚΟ ΠΕΔΙΟ ΣΤΟ ΚΕΝΟ                                                                   361

  r e a l ( 8 ) , dimension ( P , P ) : : V
! V1 and V2 a r e t h e v a l u e s o f t h e p o t e n t i a l on t h e i n t e r i o r
! conductors . epsilon i s the accuracy desired f o r the
! convergence o f t h e r e l a x a t i o n method i n s u b r o u t i n e l a p l a c e ( )
  real (8)                            : : V1 , V2 , e p s i l o n
  integer                             :: L

! The u s e r should provide t h e n e c e s s a r y data : V1 , V2 and e p s i l o n
  L = P
  p r i n t * , ’ Enter V1 , V2 : ’
  read * , V1 , V2
  p r i n t * , ’ Enter e p s i l o n : ’
  read * , e p s i l o n
  p r i n t * , ’ S t a r t i n g Laplace : ’
  p r i n t * , ’ Grid S i z e = ’ , L
  p r i n t * , ’ Conductors s e t a t V1= ’ , V1 , ’ V2= ’ , V2
  p r i n t * , ’ R e l a x i n g with a c c u r a c y e p s i l o n = ’ , e p s i l o n
! The a r r a y s V and i s C o n d u c t o r a r e i n i t i a l i z e d
  c a l l initialize_lattice ( V , isConductor , L , V1 , V2 )
!We e n t e r i n i t i a l i z e d V , i s C o n d u c t o r . On e x i t t h e
! routine gives the s o l u t i o n V
  c a l l laplace ( V , isConductor , L , e p s i l o n )
!We p r i n t V i n a f i l e .
  c a l l print_results ( V , L )

end program laplace_em
! *************************************************************
! subroutine i n i t i a l i z e _ l a t t i c e
! I n i t i a l i z e s a r r a y s V(L , L) and i s C o n d u c t o r (L , L) .
!V(L , L)= 0.0 and i s C o n d u c t o r (L , L)= . FALSE . by d e f a u l t
! i s C o n d u c t o r ( i , j )= .TRUE. on boundary o f l a t t i c e where V=0
! i s C o n d u c t o r ( i , j )= .TRUE. on s i t e s with i = L/ 3 + 1 , 5<= j <= L−5
! i s C o n d u c t o r ( i , j )= .TRUE. on s i t e s with i =2*L/ 3 + 1 , 5<= j <= L−5
!V( i , j ) = V1 on a l l s i t e s with i = L/ 3 + 1 , 5<= j <= L−5
!V( i , j ) = V2 on a l l s i t e s with i =2*L/ 3 + 1 , 5<= j <= L−5
!V( i , j ) = 0             on boundary ( i =1 ,L and j =1 ,L)
!V( i , j ) = 0             on i n t e r i o r s i t e s with i s C o n d u c t o r ( i , j )= . FALSE .
! INPUT :
! i n t e g e r L : Linear s i z e of l a t t i c e
! r e a l ( 8 ) V1 , V2 : Values o f p o t e n t i a l on i n t e r i o r c o n d u c t o r s
!OUTPUT:
! r e a l ( 8 ) V(L , L) : Array provided by u s e r . Values o f p o t e n t i a l
! l o g i c a l i s C o n d u c t o r (L , L) : I f .TRUE.       s i t e has f i x e d p o t e n t i a l
!                                                I f . FALSE . s i t e i s empty s p a ce
! *************************************************************
s u b r o u t i n e initialize_lattice ( V , isConductor , L , V1 , V2 )
   i m p l i c i t none
  integer                                    :: L
  l o g i c a l , dimension ( L , L ) : : isConductor
362                                         ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

 r e a l ( 8 ) , dimension ( L , L ) : : V
 real (8)                            : : V1 , V2
 integer                             :: i,j

! I n i t i a l i z e t o 0 and . FALSE ( d e f a u l t v a l u e s f o r boundary and
! interior sites ) .
  V                     = 0.0 D0
  isConductor = . FALSE .
!We s e t t h e boundary t o be a conductor : (V=0 by d e f a u l t )
  do i =1 , L
    isConductor ( 1 , i ) = . TRUE .
    isConductor ( i , 1 ) = . TRUE .
    isConductor ( L , i ) = . TRUE .
    isConductor ( i , L ) = . TRUE .
  enddo
!We s e t two c o n d u c t o r s a t giv e n p o t e n t i a l V1 and V2
  do i =5 ,L−5
    V                   ( L / 3 + 1 , i ) = V1
    isConductor ( L / 3 + 1 , i ) = . TRUE .
    V                   ( 2 * L / 3 + 1 , i ) = V2
    isConductor ( 2 * L / 3 + 1 , i ) = . TRUE .
  enddo

end s u b r o u t i n e initialize_lattice
! *************************************************************
! subroutine laplace
! Uses a r e l a x a t i o n method t o compute t h e s o l u t i o n o f t h e
! Laplace e q u a t i o n f o r t h e e l e c t r o s t a t i c p o t e n t i a l on a
! 2 dimensional square l a t t i c e o f l i n e a r s i z e L .
! At eve ry sweep o f t h e l a t t i c e compute t h e a v e r a g e Vav
! a t each s i t e ( i , j ) and we immediately update V( i , j )
! The computation c o n t i n u e s u n t i l Max | Vav−V( i , j ) | < e p s i l o n
! INPUT :
! i n t e g e r L : Li ne ar s i z e o f l a t t i c e
! r e a l ( 8 ) V(L , L) : Value o f t h e p o t e n t i a l a t each s i t e
! l o g i c a l i s C o n d u c t o r (L , L) : I f .TRUE.     potential is fixed
!                                               I f . FALSE . p o t e n t i a l i s updated
! r e a l ( 8 ) e p s i l o n : i f Max | Vav−V( i , j ) | < e p s i l o n r e t u r n t o
! callingprogram .
!OUTPUT:
! r e a l ( 8 ) V(L , L) : The computed s o l u t i o n f o r t h e p o t e n t i a l
! *************************************************************
s u b r o u t i n e laplace ( V , isConductor , L , e p s i l o n )
   i m p l i c i t none
  integer : : L
  l o g i c a l , dimension ( L , L ) : : isConductor
  r e a l ( 8 ) , dimension ( L , L ) : : V
  real (8)                                  : : epsilon
  integer                                   : : i , j , icount
7.5. ΗΛΕΚΤΡΟΣΤΑΤΙΚΟ ΠΕΔΙΟ ΣΤΟ ΚΕΝΟ                                                         363

 real (8)                           : : Vav , error , dV

 icount = 0                             ! cou n t s number o f sweeps
 do while ( . TRUE . )                  ! an i n f i n i t e loop :
  error = 0.0 D0                        ! E x i t when e r r o r < e p s i l o n
  do j =2 ,L−1
    do i =2 ,L−1
!We change V only f o r non c o n d u c t o r s :
      i f ( . NOT . isConductor ( i , j ) ) then
        Vav = ( V ( i −1 , j )+V ( i +1 , j )+V ( i , j +1)+V ( i , j−1) ) * 0.25 D0
        dV = DABS ( V ( i , j )−Vav )
        i f ( error . LT . dV ) error = dV ! maximum e r r o r
        V ( i , j ) = Vav               ! we immediately update V( i , j )
      endif
    enddo
  enddo
  icount = icount + 1
  p r i n t * , icount , ’ e r r = ’ , error
  i f ( error . LT . e p s i l o n ) r e t u r n ! r e t u r n t o main program
 enddo

end s u b r o u t i n e laplace
! *************************************************************
! subroutine p r i n t _ r e s u l t s
! P r i n t s t h e a r r a y V(L , L) i n f i l e ” data ”
! The format o f t h e output i s a p p r o p r i a t e f o r t h e s p l o t f u n c t i o n
! o f gnuplot : Each time i changes an empty l i n e i s p r i n t e d .
! INPUT :
! i n t e g e r L: s i z e of array V
! r e a l ( 8 ) V(L , L) : a r r a y t o be p r i n t e d
!OUTPUT:
! no output
! *************************************************************
s u b r o u t i n e print_results ( V , L )
   i m p l i c i t none
  integer                              :: L
  r e a l ( 8 ) , dimension ( L , L ) : : V
  integer                              :: i,j

 open ( u n i t =11 , f i l e =” data ” )
 do i =1 , L
  do j =1 , L
   write (11 ,*) i , j , V(i , j)
  enddo
  w r i t e ( 1 1 , * ) ’ ’ ! p r i n t empty l i n e f o r gnuplot ,
                            ! separate i s o l i n e s
 enddo

end s u b r o u t i n e print_results
364                                   ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

7.6 Αποτελέσματα
Το παραπάνω πρόγραμμα το αποθηκεύουμε στο αρχείο LaplaceEq.f90.
Η μεταγλώττιση του προγράμματος γίνεται με τον μεταγλωττιστή gfortran
και για να το τρέξουμε δίνουμε τις εντολές:

> g f o r t r a n LaplaceEq . f90 −o lf
> . / lf
 Enter V1 , V2 :
100 −100
 Enter epsilon :
0.01
 Starting Laplace :
 Grid Size= 31
 Conductors s e t at V1=          100. V2=   −100.
 Relaxing with accuracy epsilon=             0.01
 1 err=          33.3333333
 2 err=          14.8148148
 3 err=          9.87654321
.......................
 110 err=          0.0106860904
 111 err=          0.0101182476
 112 err=          0.00958048937

   Το πρόγραμμα κάνει 112 περάσματα στο πλέγμα μέχρι το μέγιστο
σφάλμα να γίνει 0.00958048937 < 0.01. Τα αποτελέσματα αποθηκεύο-
νται στο αρχείο data. Για να δούμε τα αποτελέσματα χρησιμοποιούμε
το πρόγραμμα gnuplot:

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 ” data ” with lines

Τα αποτελέσματα φαίνονται στο σχήμα 7.7



7.7 Εξίσωση Poisson
Στην παράγραφο αυτή αναφέρουμε περιληπτικά τη λύση του προβλή-
ματος που μελετήσαμε στις προηγούμενες παραγράφους, όταν υπάρχει
κατανομή στατικού ηλεκτρικού φορτίου που δίνεται από την πυκνότητα
φορτίου ρ(⃗r). Στην περίπτωση αυτή, η εξίσωση Laplace για το δυναμικό
7.7. ΕΞΙΣΩΣΗ POISSON                                                                                                   365


                                                                                                     "data"



                                                                                                               100

          100                                                                                                  50

           50                                                                                                  0

            0
                                                                                                               -50
           -50
                                                                                                               -100
          -100

                                                                                                          35
                                                                                                     30
                                                                                                25
                 0                                                                         20
                          5                                                          15
                              10
                                       15                                       10
                                              20
                                                   25                       5
                                                          30
                                                                     35 0




Σχήμα 7.7: Η λύση της εξίσωσης (7.10) από το πρόγραμμα LaplaceEq.f90 για L= 31,
V1=100, V2=-100, epsilon=0.01.



γίνεται η εξίσωση Poisson:

                                   ∂ 2V   ∂ 2V   ∂ 2V
                         ∇2 V =         +      +      = −4πρ(x, y, z)                                                 (7.13)
                                   ∂x2    ∂y 2   ∂z 2

   Η μορφή της εξίσωσης στο επίπεδο πλέγμα που μελετήσαμε γίνεται

           1
 V (i, j) = (V (i−1, j)+V (i+1, j)+V (i, j −1)+V (i, j +1)+ ρ̃(i, j)) , (7.14)
           4
όπου⁹ ρ̃(i, j) = 4πa2 ρ(i, j), και είναι πάρα πολύ απλό να μετατρέψουμε
τον κώδικα της προηγούμενης παραγράφου, έτσι ώστε να μελετήσουμε
κατανομές φορτίου που επιθυμούμε.
   Παρακάτω, παραθέτουμε το πρόγραμμα PoissonEq.f90 που λύνει
την (7.14) για ομοιόμορφη κατανομή του φορτίου (σχήμα 7.10), στο
οποίο έχουμε θέσει a = 1. Ο αναγνώστης καλείται να αναπαράγει το
σχήμα αυτό, καθώς και τα 7.8, 7.9.


                     ∫           ∑                        ∑                      ∑
   ⁹Επειδή Q =           ρdA ≈       i,j   ρa2 = (1/4π)       i,j   ρ̃. Οπότε        i,j   ρ̃ ≈ 4πQ.
366                                           ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ


                                                                                         "data"



                     800                                                           800
                     700                                                           700
                     600                                                           600
                     500                                                           500
                     400                                                           400
                     300                                                           300
                     200                                                           200
                     100                                                           100
                       0                                                           0




                           0   10 20
                                                                         50   60
                                     30 40                     30   40
                                           50 60     10   20
                                                 0




Σχήμα 7.8: Η λύση της εξίσωσης (7.13) από το πρόγραμμα Poisson.f90 για L= 51, V=
0 στο σύνορο και το φορτίο 4πQ = 1000 συγκεντρωμένο σε ένα σημείο.




! *************************************************************
! s e t t h e boundary o f a square t o g i v e n p o t e n t i a l s
! *************************************************************
program poisson_eq
  i m p l i c i t none
  i n t e g e r , parameter           : : P=51
  l o g i c a l , dimension ( P , P ) : : isConductor
  r e a l ( 8 ) , dimension ( P , P ) : : V , rho
  real (8)                            : : V1 , V2 , V3 , V4 , Q , e p s i l o n
  integer                             :: L

 L = P
 print     * , ’ Enter V1 , V2 , V3 , V4 : ’
 read      * , V1 , V2 , V3 , V4
 print     * , ’ Enter 4* PI *Q: ’
 read      *, Q
 print     * , ’ Enter e p s i l o n : ’
 read      * , epsilon
 print     * , ’ S t a r t i n g Laplace : ’
 print     * , ’ Grid S i z e = ’ , L
 print     * , ’ Boundaries s e t a t V1= ’ , V1 , ’ V2= ’ , V2 , ’ V3= ’ , V3 ,&
          ’ V4= ’ , V4 , ’ and Q= ’ , Q
 p r i n t * , ’ R e l a x i n g with a c c u r a c y e p s i l o n = ’ , e p s i l o n
7.7. ΕΞΙΣΩΣΗ POISSON                                                                                        367


                                                                                                   "data"



                                                                                             350
                      350
                                                                                             300
                      300
                                                                                             250
                      250
                      200                                                                    200

                      150                                                                    150
                      100                                                                    100
                       50                                                                    50
                        0                                                                    0




                            0                                                           60
                                10                                                 50
                                     20                                       40
                                          30                             30
                                               40                   20
                                                    50         10
                                                         600




Σχήμα 7.9: Η λύση της εξίσωσης (7.13) από το πρόγραμμα Poisson.f90 για L= 51,
V= 0 στο σύνορο και το φορτίο 4πQ = 1000 κατανεμημένο ομοιόμορφα σε ένα μικρό
τετράγωνο πλάτους 10 πλεγματικών σημείων.




 c a l l initialize_lattice ( V , isConductor , rho , L , V1 , V2 , V3 , V4 , Q )

 c a l l laplace ( V , isConductor , rho , L , e p s i l o n )

 c a l l print_results ( V , L )

end program laplace_sq
! *************************************************************
subroutine &
  initialize_lattice ( V , isConductor , rho , L , V1 , V2 , V3 , V4 , Q )
! *************************************************************
  i m p l i c i t none
  integer                             :: L
  l o g i c a l , dimension ( L , L ) : : isConductor
  r e a l ( 8 ) , dimension ( L , L ) : : V , rho
  real (8)                            : : V1 , V2 , V3 , V4 , Q , Area
  integer                             : : i , j , L1 , L2
! I n i t i a l i z e t o 0 and . FALSE .
  V                     = 0.0 D0
  isConductor = . FALSE .
368                                               ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ


                                                                                                "data"



                                                                                           80
                     80                                                                    70
                     70                                                                    60
                     60                                                                    50
                     50
                                                                                           40
                     40
                     30                                                                    30
                     20                                                                    20
                     10                                                                    10
                      0                                                                    0



                          0                                                           60
                              10                                                 50
                                   20                                       40
                                        30                             30
                                             40                   20
                                                  50         10
                                                       600




Σχήμα 7.10: Η λύση της εξίσωσης (7.13) από το πρόγραμμα Poisson.f90 για L= 51,
V= 0 στο σύνορο και το φορτίο 4πQ = 1000 κατανεμημένο ομοιόμορφα σε όλες τις
εσωτερικές πλεγματικές θέσεις.




 rho                 = 0.0 D0
!We s e t t h e boundary t o be a conductor :
 do i =1 , L
   isConductor ( 1 , i ) = . TRUE .
   isConductor ( i , 1 ) = . TRUE .
   isConductor ( L , i ) = . TRUE .
   isConductor ( i , L ) = . TRUE .
   V                 ( 1 , i ) = V1
   V                 ( i , L ) = V2
   V                 ( L , i ) = V3
   V                 ( i , 1 ) = V4
 enddo
!We s e t t h e p o i n t s with non−z e r o charge
!A uniform d i s t r i b u t i o n a t a c e n t e r square
 L1 = ( L / 2 )−5
 L2 = ( L / 2 ) +5
 i f ( L1 . LT . 1 ) s t o p ’ a r r a y rho out o f bounds . Small L1 ’
 i f ( L2 . GT . L ) s t o p ’ a r r a y rho out o f bounds . Large L2 ’
 Area = ( L2−L1 +1) * ( L2−L1 +1)
 do j=L1 , L2
   do i=L1 , L2
     rho ( i , j ) = Q / Area ! rho i s \ t i l d e \rho i n n o t e s
7.7. ΕΞΙΣΩΣΗ POISSON                                                                         369

  enddo                          ! so Q i s 4* PI *Q
 enddo

end s u b r o u t i n e initialize_lattice
! *************************************************************
s u b r o u t i n e laplace ( V , isConductor , rho , L , e p s i l o n )
! *************************************************************
  i m p l i c i t none
  integer : : L
  l o g i c a l , dimension ( L , L ) : : isConductor
  r e a l ( 8 ) , dimension ( L , L ) : : V , rho
  real (8)                            : : epsilon
  integer                             : : i , j , icount
  real (8)                            : : Vav , error , dV

 icount = 0
 do while ( . TRUE . )
  error = 0.0 D0
  do j =2 ,L−1
     do i =2 ,L−1
!We change t h e v o l t a g e only f o r non c o n d u c t o r s :
       i f ( . NOT . isConductor ( i , j ) ) then
         Vav = ( V ( i −1 , j )+V ( i +1 , j )+V ( i , j +1)+V ( i , j−1)+rho ( i , j ) )&
                    * 0. 25 D0
         dV = DABS ( V ( i , j )−Vav )
         i f ( error . LT . dV ) error = dV ! maximum e r r o r
         V ( i , j ) = Vav
       endif
     enddo
  enddo
  icount = icount + 1
   i f ( error . LT . e p s i l o n ) e x i t
 enddo
 p r i n t * , icount , ’ e r r = ’ , error

end s u b r o u t i n e laplace
! *************************************************************
s u b r o u t i n e print_results ( V , L )
! *************************************************************
  i m p l i c i t none
  integer                             :: L
  r e a l ( 8 ) , dimension ( L , L ) : : V
  integer                             :: i,j

 open ( u n i t =11 , f i l e =” data ” )
 do i =1 , L
  do j =1 , L
   write (11 ,*) i , j , V(i , j)
  enddo
370                                          ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

  w r i t e ( 1 1 , * ) ’ ’ ! empty l i n e f o r gnuplot , s e p a r a t e i s o l i n e s
 enddo

end s u b r o u t i n e print_results

Στη βιβλιογραφία ο παραπάνω αλγόριθμος αναφέρεται ως η μέθοδος
Gauss–Seidel. Χαρακτηρίζεται από το ότι στο δεξί μέλος της εξίσω-
σης (7.14) χρησιμοποιούμε τις ήδη ενημερωμένες τιμές για το δυναμικό
V (i, j) και ενημερώνουμε αμέσως τη νέα τιμή V (i, j). Μια άλλη μέθο-
δος είναι η μέθοδος του Jacobi όπου στο δεξί μέλος χρησιμοποιούμε τις
παλιές τιμές του δυναμικού από το προηγούμενο πέρασμα του πλέγμα-
τος. Η μέθοδος Gauss–Seidel υπερέχει της Jacobi ως προς την ταχύτητα
σύγκλισης. Μπορούμε όμως να γενικεύσουμε τη μέθοδο Jacobi ως εξής.
Ορίζουμε το υπολειπόμενο (residual) της εξίσωσης (7.14) να είναι

Ri,j = V (i + 1, j) + V (i − 1, j) + V (i, j + 1) + V (i, j − 1) − 4V (i, j) + ρ̃(i, j) ,
                                                                                (7.15)
το οποίο μηδενίζεται, όταν V (i, j) είναι η λύση της (7.14). Τότε, χρησι-
μοποιώντας τα Ri,j η μέθοδος Jacobi μπορεί να γραφτεί ως

                                                           1 (n)
                            V (n+1) (i, j) = V (n) (i, j) + Ri,j ,                            (7.16)
                                                           4
όπου οι ποσότητες με άνω δείκτη (n) αναφέρονται στις τιμές που υπο-
λογίζονται από τις τιμές που έχει το δυναμικό V (n) στο n-οστό πέρασμα
του πλέγματος. Η μέθοδος “successive overrelaxation” (SOR) δίνεται από
τη γενίκευση της παραπάνω σχέσης:
                                                              ω (n)
                            V (n+1) (i, j) = V (n) (i, j) +    R .                            (7.17)
                                                              4 i,j
Όταν η παράμετρος ω < 1, έχουμε “underrelaxation” και η μέθοδος
συγκλίνει πιο αργά από τη μέθοδο Jacobi. Όταν 1 < ω < 2, έχουμε
“overrelaxation” και, αν η μέθοδος συγκλίνει, η κατάλληλη επιλογή της
ω μπορεί να οδηγήσει σε αισθητή βελτίωση σε σχέση με τη μέθοδο Jacobi.
Όταν ω > 2, η SOR αποκλίνει. Η μελέτη της μεθόδου SOR αφήνεται ως
άσκηση στον αναγνώστη.
7.8. ΑΣΚΗΣΕΙΣ                                                      371

7.8    Ασκήσεις
 7.1 Φτιάξτε τις εικόνες των δυναμικών και ισοδυναμικών γραμμών
     που βρίσκονται στην παράγραφο 7.2.

7.2 Στις προηγούμενες κατανομές φορτίων να κάνετε όλα τα φορ-
    τία θετικά. Φτιάξτε τις εικόνες των δυναμικών και ισοδυναμικών
    γραμμών. Μετά δώστε στα φορτία αυτά διαφορετική τιμή και
    επαναλάβετε.

7.3 Γιατί το πρόγραμμα ELines.f90 κολλάει σε κατανομή ίσων φορ-
    τίων πάνω σε κορυφές τετραγώνων; Πώς διορθώνεται η παθολογία
    αυτή;

 7.4 Μεταβάλετε το πρόγραμμα ELines.f90, ώστε ο αριθμός των δυνα-
     μικών γραμμών που ξεκινάνε από ένα φορτίο q να είναι ανάλογος
     του q.

7.5 Βελτιώστε το πρόγραμμα EPotential.f90, έτσι ώστε οι ισοδυνα-
    μικές καμπύλες να ζωγραφίζονται με πυκνότητα ανάλογη του ηλε-
    κτρικού πεδίου. Υπόδειξη:

      (αʹ) Γράψτε υπορουτίνα που να υπολογίζει το δυναμικό V (x, y)
           στο σημείο (x, y).
      (βʹ) Από κάθε φορτίο παίρνουμε μια ευθεία στην ακτινική διεύ-
           θυνση και υπολογίζουμε το δυναμικό πάνω σε αυτή σε σημεία
           που απέχουν μικρή απόσταση ∆l.
      (γʹ) Υπολογίζουμε τη μέγιστη/ελάχιστη τιμή του δυναμικού Vmax /Vmin
           και από εκεί τις τιμές του δυναμικού πάνω στις ισοδυναμι-
           κές καμπύλες που θα σχεδιάσουμε. Αν λ.χ. αποφασίσετε να
           σχεδιάζετε 5 ισοδ. καμπύλες, πάρτε δV = (Vmax − Vmin )/4 και
           Vi = Vmin + iδV i = 0, . . . , 4.
      (δʹ) Επαναλάβατε το δεύτερο βήμα. Όταν το δυναμικό παίρνει
           τιμή (σχεδόν) ίση με μια από αυτές που διαλέξατε στο τρίτο
           βήμα, σχεδιάστε την ισοδυναμική καμπύλη.

7.6 Μελετήστε το ηλεκτρικό πεδίο που προκύπτει από το πρόγραμμα
    LaplaceEq.f90 για:

      (αʹ) L= 31, V1=100, V2=100
      (βʹ) L= 31, V1=100, V2=0
372                            ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

      και φτιάξτε τα αντίστοιχα σχήματα.
 7.7 Μελετήστε το ηλεκτρικό πεδίο που προκύπτει από το πρόγραμμα
     LaplaceEq.f90 για:
      (αʹ) V1=100, V2=100
      (βʹ) V1=100, V2=100
      (γʹ) V1=100, V2=0
      για L=31,61,121,241,501 και φτιάξτε τα αντίστοιχα σχήματα. Με-
      ταβάλετε την ακρίβεια προσδιορισμού της λύσης epsilon=0.1,
      0.01, 0.001, 0.0001, 0.00001, 0.000001. Πως εξαρτάται ο αριθ-
      μός περασμάτων N του πλέγματος από το epsilon; Φτιάξτε τη
      γραφική παράσταση N (epsilon) στην οποία θα τοποθετήσετε τις
      καμπύλες N (epsilon) για τα διαφορετικά L που χρησιμοποιήσατε.
 7.8 Μελετήστε το ηλεκτρικό πεδίο τετράγωνου αγωγού του οποίου
     κάθε πλευρά έχει διαφορετικό δυναμικό V1, V2, V3, V4. Επανα-
     λάβετε τη μελέτη που κάνατε στην προηγούμενη άσκηση για τις
     περιπτώσεις:
      (αʹ) V1=10, V2=5, V3=10, V4= 5
      (βʹ) V1=10, V2=0, V3=0, V4= -10
      (γʹ) V1=10, V2=0, V3=0, V4= 0
 7.9 Μελετήστε το ηλεκτρικό πεδίο συστήματος τετράγωνων αγωγών
     που βρίσκεται ο ένας μέσα στον άλλο όπως στο σχήμα 7.11. Ο
     κάθε αγωγός έχει πλευρά L1, L2 και βρίσκεται σε δυναμικό V1,V2
     αντίστοιχα. Πάρτε L2= L1/5 και επαναλάβετε την μελέτη της προη-
     γούμενης άσκησης για V1=10, V2=-10 και L1= 25, 50, 100, 200.


7.10 Υπολογίστε αριθμητικά τη χωρητικότητα C = Q/V του συστήματος
     της προηγούμενης άσκησης, όταν V1 = V , V2 = −V . Για να υπο-
     λογίσετε το φορτίο Q μπορείτε να υπολογίσετε την επιφανειακή
     πυκνότητα φορτίου σ από τη σχέση
                                     En
                                 σ=     ,
                                     4π
      όπου En η κάθετη συνιστώσα του ηλεκτρικού πεδίου στην επιφά-
      νεια την οποία θα προσεγγίσετε από τη σχέση
                                        δV
                               En = −      ,
                                        δr
7.8. ΑΣΚΗΣΕΙΣ                                                                                  373

                                               11 0011111
                 1100 0011 0011 0011 0011 0011 00     000
                                                      000 0011 0011 0011 0011 0011 0011 0011
                                                      111
                 0011                                                                   0011
                 0011                                                                   0011
                 0011                                                                   0011
                 0011                                                                   0011
                 0011                     0011 00
                                               11 0011 00
                                                       11 0011 0011                     0011
                 0011                     0011                 0011                     0011
                 0011                     0011                 0011                     0011
                 0011                     0011                 0011                     0011
                 0011                     0011                 0011                     0011
                 0011                     0011 00
                                               11 0011 00
                                                       11 0011 0011                     0011
                 0011                                                                   0011
                 0011                                                                   0011
                 0011                                                                   0011
                 0011                                 000
                                                      111                               0011
                 0011 0011 0011 0011 0011 0011 00
                                               11 0011111
                                                      000 0011 0011 0011 0011 0011 0011 0011
Σχήμα 7.11: Η διάταξη αγωγών που ζητείται να μελετηθεί το ηλεκτρικό πεδίο στην
Άσκηση 7.9.



     όπου δV είναι η διαφορά δυναμικού μεταξύ ενός σημείου του αγω-
     γού και του σημείου που είναι πλησιέστερος γείτονάς του. Με τον
     τρόπο αυτό υπολογίστε το συνολικό φορτίο σε κάθε αγωγό. Αν
     αυτά είναι αντίθετα και κατ’ απόλυτη τιμή ίσα με Q τότε προσ-
     διορίζεται η χωρητικότητα C. Κάνετε τον παραπάνω υπολογισμό
     για V = 10 και L1=25, 75.

7.11 Στο σύστημα της προηγούμενης άσκησης μελετήστε τη συνάρτηση
     Q(V ). Βεβαιωθείτε ότι η χωρητικότητα είναι ανεξάρτητη της δια-
     φοράς δυναμικού. Πάρτε L1=25,50, V1= -V2 =1, 2, 5, 10, 15,
     20, 25.

7.12 Αναπαράγετε τα σχήματα 7.8, 7.9 και 7.10. Στην πρώτη περίπτωση,
     συγκρίνετε τη λύση που θα πάρετε με αυτή που δίνεται από το
     δυναμικό σημειακού ηλεκτρικού φορτίου.

7.13 Εισάγετε το μήκος της πλεγματικής σταθεράς στις αντίστοιχες εξι-
     σώσεις στο πρόγραμμα PoissonEq.f90. Καθορίστε το μήκος της
     πλευράς να είναι l = 1 και τυπώστε τα αποτελέσματά σας στο
     αρχείο data ως (xi , yi , V (xi , yi )) αντί για (i, j, V (i, j)). Επαναλάβατε
     την προηγούμενη άσκηση για L=51,101,151,201,251 και φτιάξτε
374                              ΚΕΦΑΛΑΙΟ 7. ΗΛΕΚΤΡΟΣΤΑΤΙΚΗ

      τις γραφικές παραστάσεις V (x, y) στο τετράγωνο 0 < x < 1,
      0 < y < 1. Στη συνέχεια μελετήστε τη σύγκλιση των λύσεων που
      παίρνετε κάνοντας τις γραφικές παραστάσεις V (x, 1/2) για τα L
      που επιλέξατε.

7.14 Γράψτε πρόγραμμα που να υλοποιεί τον αλγόριθμό SOR που πε-
     ριγράφεται από τη σχέση (7.16) για το πρόβλημα που λύσαμε στο
     πρόγραμμα LaplaceEq.f90. Συγκρίνετε την ταχύτητα σύγκλισης
     της μεθόδου για L = 51, ω = 1.0, 0.9, 0.8, 0.6, 0.4, 0.2 με αυτή της
     Gauss-Seidel. Τι γίνεται όταν ω > 1;

7.15 Γράψτε πρόγραμμα που να υλοποιεί τον αλγόριθμό SOR που πε-
     ριγράφεται από τη σχέση (7.16) για το πρόβλημα που λύσαμε στο
     πρόγραμμα PoissonEq.f90. Συγκρίνετε την ταχύτητα σύγκλισης
     της μεθόδου για L = 51, ω = 1.0, 0.9, 0.8, 0.6, 0.4, 0.2 με αυτή της
     Gauss-Seidel. Τι γίνεται όταν ω > 1;
ΚΕΦΑΛΑΙΟ 8

Εξίσωση Διάχυσης

8.1     Εισαγωγή
Η εξίσωση διάχυσης είναι στενά συνδεδεμένη με τη διαδρομή ενός τυ-
χαίου περιπατητή (random walker). Ας υποθέσουμε ότι μελετάμε την
κίνηση ενός τέτοιου σωματίου πάνω στην ευθεία (“μία διάσταση”). Η
διαδικασία της κίνησης είναι στοχαστική και η συνάρτηση (“πυρήνας”)
                                  K(x, x0 ; t)                            (8.1)
ερμηνεύεται ως η πυκνότητα πιθανότητας τη χρονική στιγμή t να παρα-
τηρηθεί το σωμάτιο στη θέση x αν τη χρονική στιγμή t = 0 το σωμάτιο
βρίσκεται στη θέση x0 . Η εξίσωση που καθορίζει το K(x, x0 ; t) είναι η
                       ∂K(x, x0 ; t)    ∂ 2 K(x, x0 ; t)
                                     =D                  ,                (8.2)
                          ∂t                 ∂x2
που είναι η εξίσωση διάχυσης. Ο συντελεστής διάχυσης D μπορεί να
καθοριστεί από τις λεπτομέρειες του συστήματος που μελετάμε. Για
την κίνηση Brown ενός σωματιδίου σκόνης μέσα σε ένα υγρό, το οποίο
κινείται με την επίδραση των τυχαίων θερμικών κρούσεων με τα μόρια
του υγρού παίρνουμε D = kT /γ, όπου T είναι η απόλυτη θερμοκρασία
του υγρού, γ ο συντελεστής τριβής¹ του σωματιδίου μέσα στο υγρό και
k είναι η σταθερά του Boltzmann.
   Συνήθως επιλέγουμε για αρχικές συνθήκες (t = 0) το σωμάτιο να
είναι εντοπισμένο σε ένα σημείο x0 , δηλ.²
                           K(x, x0 ; 0) = δ(x − x0 )                      (8.3)
   ¹Για ένα σφαιρικό σωμάτιο ακτίνας R μέσα σε ένα Νευτώνειο υγρό με ιξώδες η
έχουμε ότι γ = 6πηR.
   ²Θυμίζουμε ότι δ(x − x0 ) είναι το περίφημο δέλτα του Dirac. Ορίζεται από την


                                      375
376                                   ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

   Η ερμηνεία της K(x, x0 ; t) ως συνάρτηση πυκνότητας πιθανότητας
συνεπάγεται ότι για κάθε t θα πρέπει να έχουμε³
                      ∫ +∞
                              K(x, x0 ; t) dx = 1 .           (8.4)
                             −∞

Αυτή η σχέση δεν είναι προφανές ότι μπορεί να ισχύει για κάθε χρονική
στιγμή. Ακόμα και αν την επιβάλλουμε για t = 0, η χρονική εξέλιξη
που καθορίζεται από την (8.2) μπορεί να την αλλάξει σε μεγαλύτερους
χρόνους.
   Αυτό είναι εύκολο να αναλυθεί. Αν επιβάλλουμε την (8.4) όταν t = 0,
η συνθήκη θα ισχύει για κάθε χρονική στιγμή αν
                         ∫
                       d +∞
                              K(x, x0 ; t)dx = 0 .                    (8.5)
                       dt −∞
                           ∫ +∞                    ∫ +∞
Λαμβάνοντας υπόψη ότι dtd −∞ K(x, x0 ; t)dx = −∞ ∂K(x,x ∂t
                                                           0 ;t)
                                                                 dx και ότι
∂K(x,x0 ;t)      2

   ∂t
           = D ∂ K(x,x
                  ∂x2
                       0 ;t)
                             παίρνουμε
            ∫                               ∫ +∞   (               )
          d +∞                                   ∂ ∂K(x, x0 ; t)
                      K(x, x0 ; t)dx = D                             dx
          dt −∞                              −∞ ∂x      ∂x
                              ∂K(x, x0 ; t)          ∂K(x, x0 ; t)
                      =D                         −D                     . (8.6)
                                  ∂x        x→+∞        ∂x         x→−∞

Η παραπάνω σχέση μας λέει πως για συναρτήσεις που το δεξί μέλος
μηδενίζεται, η συνθήκη κανονικοποίησης μπορεί να επιβληθεί για όλες
τις χρονικές στιγμές t > 0.
    Η προσεκτική ανάλυση της εξίσωσης (8.2) δίνει ότι, για μικρούς χρό-
νους, η ασυμπτωτική συμπεριφορά του K(x, x0 ; t) είναι
                                           |x−x0 |2
                                      e−     4Dt      ∑
                                                      ∞
                     K(x, x0 ; t) ∼                         ai (x, x0 )ti .   (8.7)
                                           td/2       i=0

Η σχέση αυτή δείχνει πως η διάχυση είναι ισότροπη (ίδια προς όλες
τις κατευθύνσεις) και η πιθανότητα ανίχνευσης ελαττώνεται δραστικά
                                                  ∫ +∞
απαίτηση για κάθε συνάρτηση f (x) να έχουμε −∞ f (x)δ(x − x0 ) dx = f (x0 ). Προφα-
                       ∫ +∞
νώς τότε έχουμε ότι −∞ δ(x − x0 ) dx = 1. Μπορεί κανείς να το φανταστεί σαν μια
συνάρτηση που είναι πρακτικά μηδέν παντού, εκτός από μια απειροστή περιοχή γύρω
από το x0 .
   ³Εναλλακτικά, αν η K(x, x0 ; t) δίνει λ.χ. την πυκνότητα μάζας μιας σταγό-
νας μελανιού μάζας mink που διαχέεται μέσα σε ένα διαφανές υγρό, θα έχουμε
∫ +∞
 −∞
     K(x, x0 ; t) dx = mink και K(x, x0 ; 0) = mink δ(x − x0 ).
8.2. ΑΠΑΓΩΓΗ ΘΕΡΜΟΤΗΤΑΣ                                                       377

με την απόσταση από την αρχική θέση του σωματιδίου. Αυτή η σχέση
δεν μπορεί να ισχύει για πάντα, αφού για αρκετά μεγάλους χρόνους το
σωμάτιο κατανέμεται ομοιόμορφα μέσα στο χώρο⁴.
   Η πιθανότητα επιστροφής του σωματιδίου στην αρχική του θέση ορί-
ζεται να είναι
                                              1 ∑
                                                ∞
                 PR (t) = K(x0 , x0 ; t) ∼                ai (x0 , x0 )ti   (8.8)
                                             td/2   i=0

που ορίζει τη φασματική διάσταση d του χώρου. Στην περίπτωση που
μελετάμε d = 1.
   Η μέση τιμή του τετραγώνου της απόστασης από την αρχή των αξό-
νων που βρίσκεται το σωματίδιο σε χρόνο t είναι εύκολο να υπολογιστεί⁵
                              ∫ +∞
     ⟨r ⟩ = ⟨(x − x0 ) ⟩(t) =
       2              2
                                   (x − x0 )2 K(x, x0 ; t) dx ∼ 2Dt . (8.9)
                                −∞
   Η τελευταία σχέση είναι πολύ σημαντική. Μας λέει πως η κίνηση του
τυχαίου περιπατητή (κίνηση Brown) δεν μπορεί να έχει κλασική περι-
γραφή αλλά μόνο στοχαστική: Για ένα κλασικό σωμάτιο που κινείται
πάνω σε μια ομαλή τροχιά x − x0 ∼ vt άρα r2 ∼ t2 .
   Στα επόμενα κεφάλαια, για απλότητα παίρνουμε⁶ D = 1 και ορί-
ζουμε
                      u(x, t) ≡ K(x − x0 , x0 ; t) .          (8.10)


8.2 Απαγωγή Θερμότητας
Έστω μια λεπτή ευθύγραμμη ράβδος μήκους L και T (x, t) η κατανομή
της θερμοκρασίας της τη χρονική στιγμή t, και έστω ότι τα άκρα της
τα κρατάμε σε σταθερή θερμοκρασία T (0, t) = T (L, t) = T0 . Αν η αρχική
κατανομή της θερμοκρασίας είναι T (x, 0), η θερμοκρασία σε κάθε άλλη
χρονική στιγμή προσδιορίζεται από την εξίσωση διάχυσης
                            ∂T (x, t)    ∂ 2 T (x, t)
                                      =α                                    (8.11)
                               ∂t            ∂x2
όπου α = k/(cp ρ) ο θερμικός συντελεστής διάχυσης (thermal diffusivity),
k η θερμική αγωγιμότητα , ρ η πυκνότητα και cp η ειδική θερμότητα της
ράβδου.
   ⁴Θυμηθείτε την αναλογία με τη σταγόνα μελανιού που διαχέεται μέσα σε ένα πο-
τήρι νερό και μετά από αρκετό χρόνο έχει διαχυθεί ομοιόμορφα μέσα στο νερό.
    ∫∞
   ⁵ 0 dr rn e−r /4Dt = 2n Γ( n+1
                2                      n+1
                                        2 .
                               2 )(Dt)
   ⁶Αυτό σύμφωνα με την (8.2) αντιστοιχεί στο να πάρουμε t → Dt.
378                             ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

   Ορίζουμε
                                           2
                                  T (xL, Lα t) − T0
                        u(x, t) =                   ,            (8.12)
                                         T0
όπου x ∈ [0, 1]. Με τον ορισμό αυτό, η συνάρτηση u(x, t) είναι καθαρός
αριθμός (αδιάστατη) και εκφράζει το κλάσμα της διαφοράς θερμοκρα-
σίας σε σχέση με αυτής των άκρων της ράβδου και
                           u(0, t) = u(1, t) = 0 .                   (8.13)
Αυτές λέγονται συνοριακές συνθήκες τύπου Dirichlet⁷
  Η (8.11) γίνεται
                         ∂u(x, t)   ∂ 2 u(x, t)
                                  =                                  (8.14)
                            ∂t          ∂x2
  Η σχέση (8.6) γίνεται
                     ∫
                   d 1              ∂u          ∂u
                        u(x, t)dx =          −                       (8.15)
                   dt 0             ∂x x=1 ∂x x=0
  Η παραπάνω σχέση δεν μπορεί να δίνει πάντα 0 λόγω των συνορια-
κών συνθηκών (8.13). Αυτό μπορούμε να το δούμε με ένα παράδειγμα.
Έστω
                         u(x, 0) = sin(πx) ,               (8.16)
τότε μπορείτε εύκολα να επιβεβαιώσετε ότι ικανοποιούνται οι απαιτού-
μενες συνοριακές συνθήκες και ότι η συνάρτηση
                          u(x, t) = sin(πx)e−π t ,
                                                2
                                                                     (8.17)
είναι η ζητούμενη λύση της εξίσωσης διάχυσης που ικανοποιεί επίσης
τις συνοριακές συνθήκες. Είναι εύκολο να διαπιστώσετε ότι το
                        ∫ 1
                                       2
                            u(x, t)dx = e−π t
                                           2


                         0             π
τείνει εκθετικά γρήγορα στο μηδέν με το χρόνο και ότι
                        ∫
                      d 1
                           u(x, t)dx = −2πe−π t ,
                                             2

                      dt 0
σε συμφωνία με τις σχέσεις (8.15).
    Η εκθετική πτώση του μέτρου της u(x, t) είναι σε συμφωνία με
την φυσική απαίτηση ότι η ράβδος σε αρκετά μεγάλο χρόνο θα έχει
ομοιόμορφη θερμοκρασία, ίση με αυτή που επιβάλαμε στα άκρα της
(limt→+∞ u(x, t) = 0).
   ⁷Αν προσδιορίζαμε τις παραγώγους ∂u/∂x στα άκρα (λ.χ. ταλάντωση ελεύθερης
ράβδου), θα είχαμε συνοριακές συνθήκες τύπου Neumann.
8.3. ΔΙΑΚΡΙΤΟΠΟΙΗΣΗ                                                         379

8.3 Διακριτοποίηση
Η αριθμητική λύση της εξίσωσης (8.14) θα αναζητηθεί στο διάστημα
x ∈ [0, 1] και t ∈ [0, tf ]. Το πρόβλημα πρέπει να οριστεί πάνω σε ένα
διακριτό πλέγμα και η διαφορική εξίσωση να προσεγγιστεί από αλγε-
βρικές εξισώσεις πεπερασμένων διαφορών.
   Το πλέγμα ορίζεται από Nx χωρικά σημεία xi ∈ [0, 1]
                     xi = 0 + (i − 1)∆x i = 1, . . . , Nx ,               (8.18)
όπου τα Nx − 1 διαστήματα έχουν σταθερό πλάτος
                                          1−0
                                  ∆x =           ,                        (8.19)
                                          Nx − 1
και από Nt χρονικά πλεγματικά σημεία tj ∈ [0, tf ]
                     tj = 0 + (j − 1)∆t       j = 1, . . . , Nt ,         (8.20)
όπου τα Nt − 1 διαστήματα έχουν σταθερό πλάτος
                                          tf − 0
                                   ∆t =          .                        (8.21)
                                          Nt − 1
Σημειώνουμε ότι τα άκρα των διαστημάτων αντιστοιχούν στα
                  x1 = 0 ,    xNx = 1 ,     t1 = 0 ,    tNt = tf .        (8.22)
   Η συνάρτηση u(x, t) προσεγγίζεται από τις τιμές της πάνω στο δια-
κριτό Nx × Nt πλέγμα
                           ui,j ≡ u(xi , tj ) .               (8.23)
   Οι παράγωγοι διακριτοποιούνται σύμφωνα με τις σχέσεις
      ∂u(x, t)   u(xi , tj + ∆t) − u(xi , tj )   1
               ≈                               ≡    (ui,j+1 − ui,j ) ,    (8.24)
        ∂t                   ∆t                  ∆t

         ∂ 2 u(x, t)   u(xi + ∆x, tj ) − 2u(xi , tj ) + u(xi − ∆x, tj )
                2
                     ≈
             ∂x                           (∆x)2
                         1
                     ≡       (ui+1,j − 2ui,j + ui−1,j ) .                 (8.25)
                       (∆x)2
Εξισώνοντας τα δύο μέλη των παραπάνω σχέσεων σύμφωνα με την
(8.14), παίρνουμε τη δυναμική εξέλιξη της ui,j στο χρόνο
                                   ∆t
                ui,j+1 = ui,j +         (ui+1,j − 2ui,j + ui−1,j ) .      (8.26)
                                  (∆x)2
380                                ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

Αυτή είναι μια επαγωγική σχέση ενός βήματος ως προς το χρόνο. Αυτό
είναι πολύ σημαντικό γιατί δε χρειάζεται στο πρόγραμμα να αποθη-
κεύσουμε στη μνήμη τις τιμές ui,j για κάθε j.
   Ο δεύτερος όρος της “δεύτερης παραγώγου” στην (8.26) περιέχει
μόνο τους πλησιέστερους γείτονες ui±1,j κάθε πλεγματικού σημείου ui,j
μιας χρονικής φέτας tj του πλέγματος, άρα μπορεί να χρησιμοποιηθεί
για κάθε i = 2, . . . , Nx − 1. Για τα σημεία i = 1 και i = Nx δε χρειάζεται
να χρησιμοποιηθούν οι σχέσεις (8.26), αφού κρατάμε τις τιμές u1,j =
uNx ,j = 0 αμετάβλητες.
   Τέλος, η παράμετρος
                                       ∆t
                                                                      (8.27)
                                      (∆x)2
είναι αυτή που καθορίζει τη χρονική εξέλιξη στον αλγόριθμο. Ονομάζε-
ται παράμετρος του Courant και για να έχουμε χρονική εξέλιξη χωρίς
να παρουσιάζονται γρήγορα αστάθειες, θα πρέπει
                                    ∆t    1
                                       2
                                         < .                               (8.28)
                                   (∆x)   2
Αυτό είναι κάτι που εμείς θα το ελέγξουμε εμπειρικά με την αριθμητική
ανάλυση που θα κάνουμε.


8.4 Το Πρόγραμμα
Τα μόνα σημεία που τονίζουμε σχετικά με το σχεδιασμό του προγράμ-
ματος είναι ότι η σχέση (8.26) είναι μια επαγωγική σχέση ενός βήματος
ως προς το χρόνο. Άρα, σε κάθε χρονικό βήμα αρκεί να αποθηκεύσουμε
σε ένα array τις τιμές του δεύτερου όρου (τη “δεύτερη παράγωγο”)
και να το χρησιμοποιήσουμε για να ενημερώσουμε τις νέες τιμές της
συνάρτησης ui,j . Άρα, στην επαναλαμβανόμενη διαδικασία (8.26) υπο-
λογισμού της ui,j+1 από την ui,j αρκεί να χρησιμοποιήσουμε μονάχα ένα
array ui , i = 1, . . . , Nx και ένα (∂ 2 u/∂x2 )i , i = 1, . . . , Nx που δίνουν τις
αντίστοιχες τιμές της ui,j και ∆t/(∆x)2 (ui+1,j − 2ui,j + ui−1,j ) τη χρονική
στιγμή tj αντίστοιχα. Στο παρακάτω πρόγραμμα αυτά κωδικοποιούνται
στα arrays u(P) και d2udx2(P).
    Τα χρήσιμα δεδομένα βρίσκονται στις θέσεις u(1) ... u(Nx) d2udx2(1)
... d2udx2(Nx) και η παράμετρος P επιλέγεται αρκετά μεγάλη, ώστε
οι τιμές του Nx που θα μελετηθούν να είναι πάντα μικρότερες.
    Ο χρήστης δίνει στην είσοδο τις τιμές Nx = Nx, Nt =Nt, tf =tf. Οι
τιμές ∆x, ∆t και ∆t/∆x2 = courant υπολογίζονται στα αρχικά στάδια
του προγράμματος.
8.4. ΤΟ ΠΡΟΓΡΑΜΜΑ                                                                    381

   Στην έξοδο παίρνουμε το αρχείο d.dat που περιέχει σε στήλες τις
τιμές (tj , xi , ui,j ). Όταν τελειώνει μια χρονική φέτα tj , το πρόγραμμα
τυπώνει μια κενή γραμμή, έτσι ώστε το gnuplot να κάνει αμέσως την
τρισδιάστατη γραφική παράσταση.
   Το πρόγραμμα μπορεί να βρεθεί στο αρχείο diffusion.f90 στο συ-
νοδευτικό λογισμικό και ο κώδικας που περιέχει δίνεται παρακάτω:

! =======================================================
! 1−dimensional D i f f u s i o n Equation with simple
! D i r i c h l e t boundary c o n d i t i o n s u ( 0 , t )=u ( 1 , t ) =0
! 0<= x <= 1 and 0<= t <= t f
!
! We s e t i n i t i a l c o n d i t i o n u ( x , t =0) t h a t s a t i s f i e s
! t h e g i ven boundary c o n d i t i o n s .
! Nx i s t h e number o f p o i n t s i n s p a t i a l l a t t i c e :
! x = 0 + ( j −1) * dx , j = 1 , . . . , Nx and dx = (1 −0) / ( Nx−1)
! Nt i s t h e number o f p o i n t s i n temporal l a t t i c e :
! t = 0 + ( j −1) * dt , j = 1 , . . . , Nt and dt = ( t f −0) / ( Nt −1)
!
! u(x , 0 ) = sin ( pi * x ) t e s t e d against a n a l y t i c a l solution
! u ( x , t ) = s i n ( p i * x ) * exp(− p i * p i * t )
!
! =======================================================
program diffusion_1d
  i m p l i c i t none
  i n t e g e r , parameter           : : P =100000 ! Max no o f p o i n t s
  r e a l ( 8 ) , parameter           : : PI =3.1415926535897932 D0
  r e a l ( 8 ) , dimension ( P ) : : u , d2udx2
  r e a l ( 8 ) : : t , x , dx , dt , tf , courant
  i n t e g e r Nx , Nt , i , j
! −−− Input :
  p r i n t * , ’ # Enter : Nx , Nt , t f : ( P= ’ , P , ’ Nx must be < P ) ’
  read * , Nx , Nt , tf
  i f ( Nx . ge . P ) s t o p ’Nx >= P ’
  i f ( Nx . le . 3) s t o p ’Nx <= 3 ’
  i f ( Nt . le . 2) s t o p ’ Nt <= 2 ’
! −−− I n i t i a l i z e :
  dx              = 1 . 0 D0 / ( Nx −1)
  dt              = tf       / ( Nt −1)
  courant = dt / dx * * 2
  p r i n t * , ’ # 1d D i f f u s i o n Equation : 0<=x <=1 , 0<=t <= t f ’
  p r i n t * , ’ # dx= ’ , dx , ’ dt= ’ , dt , ’ t f = ’ , tf
  p r i n t * , ’ # Nx= ’ , Nx , ’ Nt= ’ , Nt
  p r i n t * , ’ # Courant Number= ’ , courant
  i f ( courant . gt . 0.5 D0 ) p r i n t * , ’ # WARNING: c o u r a n t > 0.5 ’
  open ( u n i t =11 , f i l e = ’d . dat ’ ) ! data f i l e
! −−− I n i t i a l c o n d i t i o n a t t =0 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
382                                  ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

! u(x , 0 ) = sin ( pi x )
  do i= 1 , Nx
    x        = ( i−1) * dx
    u ( i ) = s i n ( PI * x )
  enddo
  u ( 1 ) = 0.0 d0
  u ( Nx ) = 0.0 d0
  do i= 1 , Nx
    x        = ( i−1) * dx
    w r i t e ( 1 1 , * ) 0.0 D0 , x , u ( i )
  enddo
  write (11 ,*) ’ ’
! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! −−− C a l c u l a t e time e v o l u t i o n :
  do j =2 , Nt
    t = ( j−1) * dt
! −−−−− second d e r i v a t i v e :
   do i =2 , Nx−1
      d2udx2 ( i ) = courant * ( u ( i +1) −2.0D0 * u ( i )+u ( i−1) )
   enddo
! −−−−− update :
   do i =2 , Nx−1
      u ( i ) = u ( i ) + d2udx2 ( i )
   enddo
   do i =1 , Nx
      x = ( i−1) * dx
      write (11 ,*) t , x , u(i)
   enddo
    write (11 ,*) ’ ’

 enddo ! do j =2 , Nt

 close (11)
end program diffusion_1d




8.5 Αποτελέσματα
Αρχικά γίνεται η μεταγλώττιση και το τρέξιμο του προγράμματος

> g f o r t r a n diffusion . f90 −o d
> echo ” 10 100 0.4 ” | . / d
 # Enter : Nx , Nt , t f : ( P= 100000 Nx must be < P )
 # 1d D i f f u s i o n Equation : 0<=x <=1 , 0<=t <= t f
 # dx= 0 . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 dt= 4.04040404040404040E−3 t f = 0.4
 # Nx= 10                                    Nt= 100
 # Courant Number=                 0.32727272727272733
8.5. ΑΠΟΤΕΛΕΣΜΑΤΑ                                                                                        383



Στη δεύτερη σειρά, εισάγουμε στο stdin του προγράμματος τις τιμές
Nx=10, Nt=100, tf= 0.4 από το stdout της εντολής echo. Οι επόμενες
γραμμές είναι το output του προγράμματος.
   Στη συνέχεια, μπορούμε να κάνουμε μια τρισδιάστατη γραφική ανα-
παράσταση της u(x, t) με τη βοήθεια του gnuplot:

gnuplot >    s e t pm3d
gnuplot >    s e t hidden3d
gnuplot >    s p l o t ”d . dat ” with lines
gnuplot >    unset pm3d


                                                                             ✁✂✁✄☎

                                                                                                   ✞
                                                                                                   ✆✂✎
               ✞                                                                                   ✆✂☞
             ✆✂✎                                                                                   ✆✂✍
             ✆✂☞                                                                                   ✆✂☛
             ✆✂✍                                                                                   ✆✂✝
    ✏✑✌✒☎✓   ✆✂☛                                                                                   ✆✂✡
             ✆✂✝                                                                                   ✆✂✠
             ✆✂✡                                                                                   ✆✂✟
             ✆✂✠                                                                                   ✆✂✞
             ✆✂✟                                                                                   ✆
             ✆✂✞
               ✆
                                                                                               ✞
                                                                                         ✆✂☞
                                                                                   ✆✂☛
               ✆ ✆✂✆✝
                        ✆✂✞ ✆✂✞✝                                             ✆✂✡           ✌
                                       ✆✂✟ ✆✂✟✝                        ✆✂✟
                                   ☎              ✆✂✠ ✆✂✠✝         ✆
                                                             ✆✂✡

             Σχήμα 8.1: Η συνάρτηση u(x, t) για Nx=10, Nt=100, tf= 0.4.



Στη συνέχεια, θέλουμε να δούμε τη συνάρτηση u(x, t) ως συνάρτηση του
x για δεδομένες τιμές του χρόνου. Παρατηρούμε ότι ο χρόνος αλλάζει
κάθε φορά που συναντάμε μια κενή γραμμή στο αρχείο d.dat. Το πα-
ρακάτω πρόγραμμα awk μετράει τις κενές γραμμές και τυπώνει μόνο
εκείνη που εμείς επιθυμούμε. Ο μετρητής n=0, 1, ..., Nt-1 μπορεί να
καθορίσει την τιμή του tj = tn−1 . Τα αποτελέσματα τα σώζουμε σε ένα
αρχείο tj το οποίο μπορούμε να το δούμε με το gnuplot. Επαναλαμ-
βάνουμε όσες φορές χρειάζεται:

> awk ’NF<3{n++}n==3 { p r i n t } ’ d . dat > tj
gnuplot > p l o t ” t j ” using 2:3 with lines

Την παραπάνω εργασία μπορούμε να την κάνουμε χωρίς τη δημιουργία
ενδιάμεσων αρχείων tj χρησιμοποιώντας το φίλτρο της awk μέσα από
384                                   ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

το gnuplot. Έτσι, για παράδειγμα, οι εντολές

gnuplot >    ! echo   ”10 800 2” | . / d
gnuplot >    plot     ”<awk ’NF<3{n++}n==3 { p r i n t } ’       d . dat ”   u   2:3   w   l
gnuplot >    replot   ”<awk ’NF<3{n++}n==6 { p r i n t } ’       d . dat ”   u   2:3   w   l
gnuplot >    replot   ”<awk ’NF<3{n++}n==10 { p r i n t } ’      d . dat ”   u   2:3   w   l
gnuplot >    replot   ”<awk ’NF<3{n++}n==20 { p r i n t } ’      d . dat ”   u   2:3   w   l
gnuplot >    replot   ”<awk ’NF<3{n++}n==30 { p r i n t } ’      d . dat ”   u   2:3   w   l
gnuplot >    replot   ”<awk ’NF<3{n++}n==50 { p r i n t } ’      d . dat ”   u   2:3   w   l
gnuplot >    replot   ”<awk ’NF<3{n++}n==100{ p r i n t } ’      d . dat ”   u   2:3   w   l

τρέχουν το πρόγραμμα για Nx=10, Nt=800, tf= 2 και παράγουν το
σχήμα 8.2

            ✂
            ✁✡
            ✁✠
            ✁✟
      ✕✎
      ✔     ✁✞
      ✓✒
      ✑     ✁✝
      ✏✎
      ✍✌
      ☞☛    ✁✆
            ✁☎
            ✁✄
            ✁✂

                            ✁✄            ✁✆               ✁✞         ✁✠               ✂
                                                 ✖
Σχήμα 8.2: Η συνάρτηση u(x, t) για Nx=10, Nt=800, tf= 2 για διαφορετικές σταθερές
τιμές του χρόνου tj . Εδώ j = 4, 7, 11, 21, 31, 51, 101 όπου η u(x, t) φθίνει όταν αυξάνει
το j.



   Στη συνέχεια είναι ενδιαφέρον να συγκρίνει κανείς τα αποτελέσματα
του με την ακριβή λύση u(x, t) = sin(πx)e−π t . Ένας τρόπος να γίνει είναι
                                           2


να ορίσουμε το σχετικό σφάλμα

                                    ui,j − u(xi , tj )
                                                       ,
                                          ui,j

και να το υπολογίσουμε ορίζοντας τη σχετική συνάρτηση μέσα στο
gnuplot:
8.6. ΔΙΑΧΥΣΗ ΠΑΝΩ ΣΤΟΝ ΚΥΚΛΟ.                                                           385


gnuplot >       du ( x , y , z ) = ( z − s i n ( pi * x ) * exp(−pi * pi * y ) ) / z
gnuplot >       p l o t ”<awk ’NF<3{n++}n==2 ’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) )
gnuplot >       p l o t ”<awk ’NF<3{n++}n==6 ’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) )
gnuplot >       p l o t ”<awk ’NF<3{n++}n==20 ’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) )
gnuplot >       p l o t ”<awk ’NF<3{n++}n==200’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) )
gnuplot >       p l o t ”<awk ’NF<3{n++}n==600’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) )
gnuplot >       p l o t ”<awk ’NF<3{n++}n==780’ d . dat ” u 2 : ( du ( $2 , $1 , $3 ) )


                  ✁✂




      ☛✒         ✁ ✂
      ☛☛
      ☞
      ☞✑
      ✏✎
      ✌✍☞
      ☛
                ✁ ✂




            ✁     ✂
                       ✁✂   ✁✄      ✁☎      ✁✆      ✁✝     ✁✞      ✁✟      ✁✠      ✁✡
                                                   ✓
Σχήμα 8.3: H απόλυτη τιμή του σχετικού σφάλματος του αριθμητικού υπολογισμού
για Nx=10, Nt=800, tf= 2 για διαφορετικές σταθερές τιμές του χρόνου tj . Εδώ
j = 3, 7, 21, 201, 601, 781 και το σχετικό σφάλμα αυξάνει με το j.



Τα αποτελέσματα μπορούμε να τα δούμε στο σχήμα 8.3.


8.6         Διάχυση Πάνω στον Κύκλο.
Για να μελετήσουμε τον πυρήνα K(x, x0 ; t) στο πρόβλημα της διάχυσης
ή των τυχαίων διαδρομών, πρέπει να επιβάλλουμε τη συνθήκη κανονι-
κοποίησης (8.4) για κάθε χρονική στιγμή. Στην περίπτωση της u(x, t)
ορισμένης για x ∈ [0, 1] η σχέση γίνεται
                            ∫ 1
                                u(x, t) dx = 1 ,               (8.29)
                                      0

η οποία για να ισχύει για κάθε χρονική στιγμή είναι αναγκαίο το δεξί μέ-
λος της (8.15) να είναι 0. Ένας τρόπος να επιβάλλουμε αυτή τη συνθήκη
386                                      ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

είναι να θεωρήσουμε το πρόβλημα της διάχυσης πάνω στον κύκλο. Αν
παραμετροποιήσουμε τα σημεία του κύκλου με τη μεταβλητή x ∈ [0, 1],
τότε τα σημεία x = 0 και x = 1 ταυτίζονται και έχουμε

                                                ∂u(0, t)   ∂u(1, t)
                      u(0, t) = u(1, t) ,                =          .        (8.30)
                                                  ∂x         ∂x
Η δεύτερη από τις παραπάνω∫ 1σχέσεις μηδενίζει το δεξί μέλος
                                                       ∫1     της (8.15)
με αποτέλεσμα, αν θέσουμε 0 u(x, 0) dx = 1, να έχουμε 0 u(x, t) dx = 1,
∀t > 0.
   Με τις παραπάνω παραδοχές, η διακριτοποίηση της διαφορικής εξί-
σωσης γίνεται ακριβώς όπως και στο πρόβλημα της απαγωγής της θερ-
μότητας. Αντί τώρα να κρατάμε τις τιμές u(0, t) = u(1, t) = 0 σταθερές,
θα εφαρμόσουμε την εξίσωση δυναμικής εξέλιξης (8.26) και για τα ση-
μεία x1 , xNx αφού πάνω στον κύκλο αυτά τα σημεία δεν ξεχωρίζουν
από τα υπόλοιπα. Για να λάβουμε υπόψη την κυκλική τοπολογία αρκεί
να πάρουμε
                                        ∆t
                     u1,j+1 = u1,j +         (u2,j − 2u1,j + uNx ,j ) ,      (8.31)
                                       (∆x)2
και
                                       ∆t
                  uNx ,j+1 = ui,j +         (u1,j − 2uNx ,j + uNx −1,j ) ,   (8.32)
                                      (∆x)2
αφού ο γείτονας εκ “δεξιών” του σημείου xNx είναι το σημείο x1 και
ο γείτονας εξ “αριστερών” του σημείου x1 είναι το σημείο xNx . Για τα
υπόλοιπα σημεία i = 2, . . . , Nx −1 η σχέση (8.26) εφαρμόζεται κανονικά.
   Το πρόγραμμα που κωδικοποιεί το παραπάνω πρόβλημα δίνεται
παρακάτω και βρίσκεται στο αρχείο diffusionS1.f90. H επιβολή των
συνοριακών συνθηκών (8.30) γίνεται στις γραμμές

      nnr = i+1
      i f ( nnr . gt . Nx ) nnr = 1
      nnl = i−1
      i f ( nnl . lt . 1 ) nnl = Nx
      d2udx2 ( i ) = courant * ( u ( nnr ) −2.0D0 * u ( i )+u ( nnl ) )

   Οι αρχικές συνθήκες τη χρονική στιγμή t = 0 επιλέγονται έτσι, ώστε
να είναι το σωμάτιο στη θέση xNx /2 . Σε κάθε χρονική στιγμή γίνονται
μετρήσεις με σκοπό να επαληθευτούν οι εξισώσεις (8.4), (8.9) και το
γεγονός ότι limt→+∞ u(x,∑t) = σταθ.
   Η μεταβλητή prob = N       x
                            i=1 ui,j και ελέγχεται αν διατηρεί την αρχική
της τιμή που είναι ίση με 1.
8.6. ΔΙΑΧΥΣΗ ΠΑΝΩ ΣΤΟΝ ΚΥΚΛΟ.                                                        387
                       ∑Nx
                         i=1 (xi − xNx /2 ) ui,j είναι η διακριτή εκτίμηση
                                           2
   Η μεταβλητή r2 =
της μέσης τιμής του τετραγώνου της απόστασης από την αρχική θέση
η οποία για αρκετά μικρούς χρόνους θα πρέπει να ακολουθεί το νόμο
που δίνει η εξίσωση (8.9).
    Οι παραπάνω μεταβλητές αποθηκεύονται στο αρχείο e.dat μαζί με
τις τιμές uNx /2,j , uNx /4,j και u1,j . Οι τελευταίες ελέγχονται αν μετά από
αρκετά μεγάλο χρόνο αποκτούν την ίδια σταθερή τιμή, σύμφωνα με το
αναμενόμενο αποτέλεσμα limt→+∞ u(x, t) = σταθ.
   Όλος ο πηγαίος κώδικας είναι:

! =======================================================
! 1−dimensional D i f f u s i o n Equation with
! p e r i o d i c boundary c o n d i t i o n s u ( 0 , t )=u ( 1 , t )
! 0<= x <= 1 and 0<= t <= t f
!
! We s e t i n i t i a l c o n d i t i o n u ( x , t =0) t h a t s a t i s f i e s
! t h e g i ven boundary c o n d i t i o n s .
! Nx i s t h e number o f p o i n t s i n s p a t i a l l a t t i c e :
! x = 0 + ( j −1) * dx , j = 1 , . . . , Nx and dx = (1 −0) / ( Nx−1)
! Nt i s t h e number o f p o i n t s i n temporal l a t t i c e :
! t = 0 + ( j −1) * dt , j = 1 , . . . , Nt and dt = ( t f −0) / ( Nt −1)
!
! u ( x , 0 ) = \ d e l t a _ {x , 0 . 5 }
!
! =======================================================
program diffusion_1d
  i m p l i c i t none
  i n t e g e r , parameter           : : P =100000 ! Max no o f p o i n t s
  r e a l ( 8 ) , parameter           : : PI =3.1415926535897932 D0
  r e a l ( 8 ) , dimension ( P ) : : u , d2udx2
  r e a l ( 8 ) : : t , x , dx , dt , tf , courant , prob , r2 , x0
  i n t e g e r Nx , Nt , i , j , nnl , nnr
! −−− Input :
  p r i n t * , ’ # Enter : Nx , Nt , t f : ( P= ’ , P , ’ Nx must be < P ) ’
  read * , Nx , Nt , tf
  i f ( Nx . ge . P ) s t o p ’Nx >= P ’
  i f ( Nx . le . 3) s t o p ’Nx <= 3 ’
  i f ( Nt . le . 2) s t o p ’ Nt <= 2 ’
! −−− I n i t i a l i z e :
  dx              = 1 . 0 D0 / ( Nx −1)
  dt              = tf       / ( Nt −1)
  courant = dt / dx * * 2
  p r i n t * , ’ # 1d D i f f u s i o n Equation on S1 : 0<=x <=1 , 0<=t <= t f ’
  p r i n t * , ’ # dx= ’ , dx , ’ dt= ’ , dt , ’ t f = ’ , tf
  p r i n t * , ’ # Nx= ’ , Nx , ’ Nt= ’ , Nt
  p r i n t * , ’ # Courant Number= ’ , courant
388                                    ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

  i f ( courant . gt . 0.5 D0 ) p r i n t * , ’ # WARNING: c o u r a n t > 0.5 ’
 open ( u n i t =11 , f i l e = ’d . dat ’ ) ! data f i l e
 open ( u n i t =12 , f i l e = ’ e . dat ’ ) ! data f i l e
! −−− I n i t i a l c o n d i t i o n a t t =0 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 do i= 1 , Nx
    x            = ( i−1) * dx
    u(i)         = 0.0 D0
 enddo
 u ( Nx / 2 ) = 1 . 0 D0
 do i= 1 , Nx
    x            = ( i−1) * dx
    w r i t e ( 1 1 , * ) 0.0 D0 , x , u ( i )
 enddo
 write (11 ,*) ’ ’
! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! −−− C a l c u l a t e time e v o l u t i o n :
 do j =2 , Nt
    t = ( j−1) * dt
! −−−−− second d e r i v a t i v e :
    do i =1 , Nx
      nnr = i+1
      i f ( nnr . gt . Nx ) nnr = 1
      nnl = i−1
      i f ( nnl . lt . 1 ) nnl = Nx
      d2udx2 ( i ) = courant * ( u ( nnr ) −2.0D0 * u ( i )+u ( nnl ) )
    enddo
! −−−−− update :
    prob = 0.0 D0
    r2       = 0.0 D0
    x0       = ( ( Nx / 2 ) −1) * dx ! o r i g i n a l p o s i t i o n
    do i =1 , Nx
      x        = ( i−1) * dx
      u ( i ) = u ( i ) + d2udx2 ( i )
      prob = prob + u ( i )
      r2       = r2        + u ( i ) * ( x−x0 ) * ( x−x0 )
    enddo
    do i =1 , Nx
      x = ( i−1) * dx
      write (11 ,*) t , x , u(i)
    enddo
    write (11 ,*) ’ ’
    w r i t e ( 1 2 , * ) ’pu ’ , t , prob , r2 , u ( Nx / 2 ) , u ( Nx / 4 ) , u ( 1 )
 enddo ! do j =2 , Nt

 close (11)
end program diffusion_1d
8.7. ΑΝΑΛΥΣΗ                                                                   389

8.7       Ανάλυση
Το πρόγραμμα αποθηκεύει στο αρχείο e.dat για κάθε χρονική στιγμή
τις ποσότητες
                              ∑
                              Nx
                         Uj =     ui,j                    (8.33)
                                                  i=1

που είναι ο διακριτός εκτιμητής της (8.29) και περιμένουμε να παίρ-
νουμε Uj = 1 για κάθε τιμή του j,

                                          ∑
                                          Nx
                                ⟨r ⟩j =
                                  2
                                                ui,j (xi − xNx /2 )2        (8.34)
                                          i=1

που είναι ο διακριτός εκτιμητής της (8.9) και περιμένουμε για μικρούς
χρόνους να ισχύει
                             ⟨r2 ⟩j ∼ 2tj ,                     (8.35)
καθώς και τις τιμές uNx /2,j , uNx /4,j , u1,j .
   Οι τιμές tj , Uj , ⟨r2 ⟩j , uNx /2,j , uNx /4,j , u1,j βρίσκονται αντίστοιχα στις
στήλες 2, 3, 4, 5, 6 και 7 του αρχείου e.dat. Ξεκινάμε το gnuplot και
μέσα από αυτό δίνουμε τις εντολές

gnuplot > ! gfortran diffusionS1 . f90 −o d
gnuplot > ! echo ” 10 100 0.4 ” | . / d

που ορίζουν τις τιμές Nx = 10, Nt = 100, tf = 0.4, ∆x ≈ 0.111, ∆t ≈
4.0404, ∆t/∆x2 ≈ 0.327. Με τις εντολές

gnuplot > p l o t     ” e . dat ” u 2:5 w l
gnuplot > r e p l o t ” e . dat ” u 2:6 w l
gnuplot > r e p l o t ” e . dat ” u 2 : 7 w l

φτιάχνουμε το σχήμα 8.4 από όπου βλέπουμε την ομοιόμορφη κατανομή
της διάχυσης για αρκετά μεγάλους χρόνους.
   Η σχέση Uj = 1 επιβεβαιώνεται με απλό κοίταγμα στο αρχείο e.dat.
   Η ασυμπτωτική σχέση ⟨r2 ⟩j ∼ 2tj επιβεβαιώνεται με τις εντολές

gnuplot > p l o t [ : ] [ : 0 . 1 1 ] ” e . dat ” u 2 : 4 , 2 * x

που μας δίνει το σχήμα 8.5.
    Τέλος, κάνουμε μια επισκόπηση της συνάρτησης u(x, t) με τις εντο-
λές
390                                        ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

      ✁✝✂                                                                         ✠✡☛☞✌✂
                                                                                  ✠✡☛☞✌✄
                                                                                     ✠✡✝
       ✁✝

      ✁ ✆

      ✁ ☎

      ✁ ✄

      ✁ ✂



                    ✁ ✞         ✁✝        ✁✝✞        ✁✂         ✁✂✞          ✁✟        ✁✟✞   ✁✄
Σχήμα 8.4: Οι συναρτήσεις uNx /2,j , uNx /4,j , u1,j ως συνάρτηση του tj για Nx = 10,
Nt = 100, tf = 0.4. Για μεγάλο χρόνο τείνουν προς μια σταθερή τιμή που αντιστοιχεί
στην ομοιόμορφη διάχυση.




gnuplot >   ! echo ” 10 100 0.16 ” | . / d
gnuplot >   s e t pm3d
gnuplot >   s p l o t [ 0 : 0 . 1 6 ] [ 0 : 1 ] [ 0 : 1 ] ”d . dat ” w l
gnuplot >   s p l o t [ 0 : 0 . 1 6 ] [ 0 : 1 ] [ 0 : . 2 ] ”d . dat ” w l

και το αποτέλεσμα φαίνεται στο σχήμα 8.6.
8.7. ΑΝΑΛΥΣΗ                                                                    391




       ✁✝


      ✁ ✆


      ✁ ☎


      ✁ ✄


      ✁ ✂

                                                           ✠✡☛☞✌✍✎✏
                                                               ✂✍
                 ✁ ✞      ✁✝      ✁✝✞     ✁✂      ✁✂✞      ✁✟     ✁✟✞      ✁✄
Σχήμα 8.5: Η μέση τιμή ⟨r ⟩j ως συνάρτηση του tj για Nx = 10, Nt = 100, tf = 0.4.
                          2

Για μικρές τιμές του tj ισχύει ⟨r2 ⟩j ≈ 2tj το οποίο συγκρίνεται με την ευθεία 2t.
392                                                        ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ




                                                                                                         ✝
        ✝                                                                                                    ✁✆
       ✁✆                                                                                                    ✁☎
       ✁☎
                                                                                                             ✁✄
       ✁✄
       ✁✂                                                                                                    ✁✂


                                                                                                     ✝
                ✁ ✂ ✁ ✄                                                                         ✁✆
                        ✁ ☎ ✁ ✆                                                           ✁☎
                                                                                  ✁✄
                                            ✁✝ ✁✝✂                         ✁✂
                                                   ✁✝✄ ✁✝☎
                                                                                                         ✆✂✝
                                                                                                         ✆✂✡✠
       ✆✂✝                                                                                               ✆✂✡✟
                                                                                                         ✆✂✡✞
      ✆✂✡☛                                                                                               ✆✂✡✝
                                                                                                         ✆✂✡
       ✆✂✡                                                                                               ✆✂✆✠
                                                                                                         ✆✂✆✟
      ✆✂✆☛                                                                                               ✆✂✆✞
                                                                                                         ✆✂✆✝
        ✆                                                                                                ✆


                                                                                                     ✡
            ✆                                                                                  ✆✂✠
                ✆✂✆✝                                                                     ✆✂✟
                       ✆✂✆✞
                              ✆✂✆✟                                               ✆✂✞
                                     ✆✂✆✠
                                            ✆✂✡                            ✆✂✝
                                                  ✆✂✡✝                                 ✁✂✁✄☎
                                                         ✆✂✡✞          ✆
                                                                ✆✂✡✟

Σχήμα 8.6: Η συνάρτηση u(x, t) για Nx = 10, Nt = 100, tf = 0.16. Στο δεύτερο
σχήμα αλλάζουμε μόνο την κλίμακα του άξονα z ώστε να φανούν οι λεπτομέρειες της
διάχυσης μακρυά από το σημείο x0 ≡ xNx /2 = x5 .
8.8. ΑΣΚΗΣΕΙΣ                                                          393

8.8 Ασκήσεις
8.1 Να αναπαράγετε τα αποτελέσματα του σχήματος 8.3.

8.2 Η κατανομή της θερμοκρασίας u(x, t) σε μία λεπτή ράβδο ικανο-
    ποιεί την εξίσωση (8.14) μαζί με τις συνοριακές συνθήκες (8.13)
    στα άκρα της ράβδου x = 0, 1. Η κατανομή της θερμοκρασίας, όταν
    t = 0, δίνεται από τη συνάρτηση
                                 {
                                   0.5 x ∈ [x1 , x2 ]
                       u(x, 0) =                      ,
                                   0.3 x ∈
                                         / [x1 , x2 ]

    όπου x1 = 0.25 και x2 = 0.75.

    (αʹ) Υπολογίστε την κατανομή της θερμοκρασίας u(x, tf ) όταν tf =
         0.0001, 0.001, 0.01, 0.05. Να πάρετε Nx = 100 και Nt = 1000.
         Να κάνετε το ίδιο για tf = 0.1 παίρνοντας κατάλληλο Nx και
         κρατώντας Nt = 1000. Να κάνετε τις γραφικές παραστάσεις
         των u(x, tf ) στο ίδιο διάγραμμα.
    (βʹ) Υπολογίστε γραφικά τη μέγιστη τιμή της θερμοκρασίας για
         tf = 0.0001, 0.001, 0.01, 0.05, 0.1, 0.15, 0.25. Να πάρετε Nx = 100
         και να επιλέξετε κατάλληλη τιμή για τα Nt .
    (γʹ) Υπολογίστε τη χρονική στιγμή κατά την οποία η θερμοκρασία
         στη ράβδο είναι παντού μικρότερη από 0.1.

    Υπόδειξη: Να κάνετε το πρόγραμμά σας να τυπώνει μόνο την τε-
    λική κατανομή της θερμοκρασίας u(x, tf ).

8.3 Η κατανομή της θερμοκρασίας u(x, t) σε μία λεπτή ράβδο ικανο-
    ποιεί την εξίσωση
                                ∂u     ∂ 2u
                                   =α 2.
                                ∂t     ∂x
    Η θερμοκρασία στα άκρα της ράβδου u(0, t) = u(1, t) = 0, ενώ όταν
    t=0                   {    [       ( )]
                            0.5 1 − cos 2πx
                                          b
                                            0≤x<b
                u(x, 0) =                               .
                            0               b≤x≤1

    (αʹ) Να υπολογίσετε την κατανομή θερμοκρασίας u(x, tf ) όταν α =
         0.5, b = 0.09 και για tf = 0.0001, 0.001, 0.01, παίρνοντας
         Nx = 300, Nt = 1000. Να κάνετε το ίδιο για tf = 0.05 επιλέ-
         γοντας κατάλληλο Nx . Να κάνετε τις γραφικές παραστάσεις
         της u(x, tf ) στο ίδιο διάγραμμα.
394                            ΚΕΦΑΛΑΙΟ 8. ΕΞΙΣΩΣΗ ΔΙΑΧΥΣΗΣ

      (βʹ) Για τις ίδιες παραμέτρους, να υπολογίσετε τη χρονική εξέλιξη
           της θερμοκρασίας στα σημεία x1 = 0.05, x2 = 0.50 και x3 =
           0.95 για 0 ≤ t ≤ 0.05. Να κάνετε τις γραφικές παραστάσεις
           της u(x1,2,3 , t) στο ίδιο διάγραμμα.
      (γʹ) Να υπολογίσετε την κατανομή θερμοκρασίας u(x, tf ) για b =
           0.09 για τρεις τιμές του α = 5, 2, 1 για tf = 0.001. Να κάνετε
           τις γραφικές παραστάσεις της u(x, tf ) στο ίδιο διάγραμμα.
           Να σχολιάσετε την επίδραση της παραμέτρου α στα αποτε-
           λέσματά σας.

8.4 Η κατανομή της θερμοκρασίας u(x, t) σε μία λεπτή ράβδο μήκους
    L ικανοποιεί την εξίσωση

                         ∂u       ∂2u 4    ∂u
                            = D(x) 2 − D(x) ,
                         ∂t       ∂x  L    ∂x
      όπου D(x) = ae−4x/L είναι η μεταβλητή παράμετρος θερμοδιάχυ-
      σης (thermal diffusivity) της οποίας η τιμή εξαρτάται από τη θέση
      x. Η θερμοκρασία της ράβδου στα άκρα της είναι τέτοια, ώστε
      u(0, t) = u(L, t) = 0, ενώ τη χρονική στιγμή t = 0, η κατανομή της
      θερμοκρασίας κατά μήκος της ράβδου είναι

                           u(x, 0) = Ce−(x−L/2)
                                              2 /σ 2
                                                       .

      (αʹ) Να γράψετε πρόγραμμα που στην είσοδο θα ζητάει από το
           χρήστη τις παραμέτρους L, a, C, σ, Nx , Nt και tf . Στην έξοδο
           θα υπολογίζει την u(x, tf ) και θα τυπώνει σε ένα αρχείο d.dat
           τα σημεία (xi , u(xi , tf )) σε δύο στήλες.
      (βʹ) Να εκτελέσετε το πρόγραμμα για L = 4, a = 0.2, C = 1,
           σ = 1/2, Nx = 400, Nt = 20000 και να υπολογίσετε την u(x, tf )
           για tf = 0.05, 1.0, 5.0. Να κάνετε τις γραφικές παραστάσεις
           της u(x, tf ) στο ίδιο διάγραμμα.
      (γʹ) Για τις ίδιες παραμέτρους, να υπολογίσετε τη χρονική εξέλιξη
           της θερμοκρασίας στα σημεία x1 = 1 και x2 = 2 για 0 ≤ t ≤ 5.
           Να κάνετε τις γραφικές παραστάσεις της u(x1,2 , t) στο ίδιο
           διάγραμμα.

8.5 Να αναπαράγετε τα αποτελέσματα που δείχνονται στα σχήματα
    8.4 και 8.5.
ΚΕΦΑΛΑΙΟ 9

Ο Αναρμονικός Ταλαντωτής

Στο κεφάλαιο αυτό θα εφαρμόσουμε μεθόδους πινάκων για τη λύση
του κβαντομηχανικού προβλήματος του προσδιορισμού των ενεργεια-
κών επιπέδων του αναρμονικού ταλαντωτή. Το πρόβλημα αυτό δεν
μπορεί να λυθεί αναλυτικά, οπότε πρέπει να προσφύγουμε σε διατα-
ρακτικές ή άλλες προσεγγιστικές μεθόδους. Εμείς θα αντιμετωπίσουμε
το πρόβλημα αριθμητικά. Για το σκοπό αυτό θα επιλέξουμε κατάλληλη
βάση για να αναπαραστήσουμε τη Χαμιλτονιανή H υπό μορφή πίνακα
τον οποίο θα διαγωνιοποιήσουμε με αριθμητικές μεθόδους με σκοπό να
πάρουμε τις ενεργειακές ιδιοτιμές του τελεστή. Φυσικά, ο πίνακας αυ-
τός είναι απείρου μεγέθους και, αρχικά, η βάση αναπαράστασης που θα
επιλέξουμε θα καλύπτει μόνο έναν υπόχωρο HN του χώρου Hilbert H
των καταστάσεων πεπερασμένης διάστασης N , έτσι ώστε να πάρουμε
πίνακα πεπερασμένου μεγέθους N × N . Οι ιδιοτιμές του N × N πίνακα
θα υπολογιστούν αριθμητικά και οι ενεργειακές ιδιοτιμές θα καθορι-
στούν από το όριο που θα τείνουν αυτές, όταν N → ∞.
    Για τον υπολογισμό των ιδιοτιμών θα χρησιμοποιήσουμε τις υπο-
ρουτίνες που βρίσκουμε στην βιβλιοθήκη LAPACK. Το κεφάλαιο αυτό,
εκτός των άλλων, θα είναι και μια άσκηση για το πώς να συνδέουμε το
πρόγραμμά μας με προγράμματα που βρίσκονται σε βιβλιοθήκες λογι-
σμικού. Για να λύσετε το ίδιο πρόβλημα με Mathematica ή Matlab δείτε
τις αναφορές [39] και [40] αντίστοιχα.


9.1    Εισαγωγή
Η Χαμιλτονιανή του αρμονικού ταλαντωτή δίνεται από τη σχέση:

                               p2  1
                        H0 =      + mω 2 x2                    (9.1)
                               2m 2

                                395
396               ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ
                     √                  √
και ορίζοντας x0 =       ℏ/(mω), p0 =    ℏmω παίρνουμε την εξίσωση αδιά-
στατων μεγεθών:
                           H0  1 p    1 x
                              = ( )2 + ( )2 .                         (9.2)
                           ℏω  2 p0   2 x0
Μετρώντας την ενέργεια σε μονάδες ℏω, τις αποστάσεις σε μονάδες x0
και τις ορμές σε μονάδες p0 παίρνουμε

                                   1    1
                               H0 = p2 + x2                           (9.3)
                                   2    2
Ο τελεστής H0 μπορεί να διαγωνιοποιηθεί εύκολα με τη βοήθεια των
τελεστών δημιουργίας/καταστροφής:

                       1                       i
                   x = √ (a† + a)         p = √ (a† − a)              (9.4)
                        2                        2
ή
                       1                       1
                   a = √ (x + ip)         a† = √ (x − ip)             (9.5)
                        2                       2
που ικανοποιούν τη σχέση μετάθεσης

                                  [a, a† ] = 1                        (9.6)

και τότε
                                              1
                               H0 = a† a +      .                      (9.7)
                                              2
Οι ιδιοκαταστάσεις |n⟩, n = 0, 1, 2, . . . της H0 καλύπτουν τον χώρο Hilbert
H και ικανοποιούν τις σχέσεις
              √                             √
      a† |n⟩ = n + 1 |n + 1⟩     a |n⟩ = n |n − 1⟩       a |0⟩ = 0    (9.8)

οπότε
                               a† a |n⟩ = n |n⟩                       (9.9)
και
                                           1
                     H0 |n⟩ = En |n⟩ ,       .
                                             En = n +                (9.10)
                                           2
Η αναπαράσταση θέσης των ιδιοκαταστάσεων |n⟩ είναι:

                                      1     −x2 /2
                  ψn (x) = ⟨x|n⟩ = √    √ e        Hn (x)            (9.11)
                                     n
                                    2 n! π

όπου Hn (x) τα πολυώνυμα Hermite.
9.2. ΥΠΟΛΟΓΙΣΜΟΣ ΙΔΙΟΤΙΜΩΝ ΤΟΥ HN M (λ)                                       397

   Από τις σχέσεις (9.4), (9.8) προκύπτει ότι

                            1 √                    1 √
         xnm = ⟨n| x |m⟩ = √ m + 1 δn,m+1 + √ m δn,m−1                      (9.12)
                              2                     2
                           1√
                         =      n + m + 1 δ|n−m|,1                          (9.13)
                           2
                             i √                   i √
         pnm = ⟨n| p |m⟩ = √ m + 1 δn,m+1 − √ m δn,m−1                      (9.14)
                              2                     2
  Από την παραπάνω σχέση μπορούμε εύκολα να υπολογίσουμε την
Χαμιλτονιανή του αναρμονικού ταλαντωτή

                            H(λ) = H0 + λx4                                 (9.15)

και τα στοιχεία του πίνακα αναπαράστασης στον H:

          Hnm (λ) ≡ ⟨n| H(λ) |m⟩ = ⟨n| H0 |m⟩ + λ⟨n| x4 |m⟩                 (9.16)
                                        1
                                 = (n + )δn,m + λ(x4 )nm                    (9.17)
                                        2
όπου το (x4 )nm μπορούμε να υπολογίσουμε από τη σχέση (9.12):

                                  ∑
                                  ∞
                     4
                   (x )nm =                    xni1 xi1 i2 xi2 i3 xi3 m .   (9.18)
                               i1 ,i2 ,i3 =0


  Το πρόβλημα εύρεσης του ενεργειακού φάσματος ανάγεται στον
υπολογισμό των ιδιοτιμών του πίνακα Hnm .


9.2    Υπολογισμός Ιδιοτιμών του Hnm(λ)
Αρχικά επιλέγουμε τη διάσταση N του υπόχωρου HN του χώρου Hilbert
H των καταστάσεων στον οποίο θα περιοριστούμε. Χρησιμοποιούμε τις
σχέσεις που αναφέραμε στην προηγούμενη παράγραφο για να υπολο-
γίσουμε τους πίνακες αναπαράστασης των τελεστών x, H0 , H(λ) μέσα
σε αυτόν τον υπόχωρο. Για παράδειγμα, όταν N = 4 έχουμε:
                                        √1
                                                                
                                 0         2
                                                   0        0
                            √1           0        1        0 
                            2                             √ 
                         x=
                            0            1        0
                                                                
                                                              3            (9.19)
                                                 √           2 
                                                       3
                              0           0            2
                                                            0
398                ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

                                            1
                                               
                                        0 0 02
                                     0 3 0 0 
                               H0 =    2
                                     0 0 5 0 
                                                                                   (9.20)
                                          2
                                      0 0 0 27
                          1        3λ                   3λ
                                                         √
                                                                                
                               +                 0                    0
                           2         4                     2         √
                                                                               
                              0         3
                                          + 15λ           0      3        3
                                                                            λ   
              H(λ) =                                                           
                                         2    4                           2
                              3λ                    5                             (9.21)
                     
                               √           0             + 27λ        0         
                                2         √          2      4

                               0         3 32 λ           0      7
                                                                 2
                                                                     +    15λ
                                                                           4

    Σκοπός μας είναι να γράψουμε ένα πρόγραμμα που θα υπολογίζει
τις ιδιοτιμές En (N, λ) του N × N πίνακα Hnm (λ). Αντί, όμως, να γρά-
ψουμε το δικό μας κώδικα για τον υπολογισμό των ιδιοτιμών και ιδιο-
διανυσμάτων των πινάκων που μας ενδιαφέρουν θα χρησιμοποιήσουμε
τις έτοιμες ρουτίνες που υπάρχουν στη βιβλιοθήκη LAPACK. Η βιβλιοθήκη
αυτή υπάρχει στον δικτυακό τόπο http://www.netlib.org/lapack/ και
λεπτομέρειες για τη χρήση της μπορούν να βρεθούν στο
http://www.netlib.org/lapack/lug/. Επισκεφτείτε το δικτυακό τόπο
και αναζητήστε ρουτίνες που σας ενδιαφέρουν¹.
    Ως απλοί, άπειροι χρήστες, θα αναζητήσουμε “ρουτίνες οδηγούς”
(driver routines) που κάνουν μια εργασία διαγωνιοποίησης. Έχουμε να
διαγωνιοποιήσουμε έναν πίνακα συμμετρικό και διαλέγουμε τη ρουτίνα
DSYEV (D = double precision, SY = symmetric, EV = eigenvalues with
optional eigenvectors). Οι συναρτήσεις της LAPACK έχουν βοήθεια online
από τα man pages του συστήματος (Unix/Linux). Η εντολή που δίνουμε
είναι η

> man dsyev

   Από εκεί μαθαίνουμε ότι η χρήση της είναι:

SUBROUTINE DSYEV ( JOBZ , UPLO , N , A , LDA , W , WORK , LWORK , INFO )
 CHARACTER     JOBZ , UPLO
 INTEGER       INFO , LDA , LWORK , N
 DOUBLE        PRECISION A ( LDA , * ) , W ( * ) , WORK ( * )

ARGUMENTS

   ¹Η βιβλιοθήκη μπορεί να εγκατασταθεί εύκολα σε διανομές Linux. Λ.χ. στη δια-
νομή Ubuntu εκτελέστε την εντολή apt-get install liblapack3 liblapack-doc
liblapack-dev.
9.2. ΥΠΟΛΟΓΙΣΜΟΣ ΙΔΙΟΤΙΜΩΝ ΤΟΥ HN M (λ)                                399

JOBZ      ( input ) CHARACTER * 1
          = ’ N ’ : Compute eigenvalues only ;
          = ’ V ’ : Compute eigenvalues and eigenvectors .

UPLO      ( input ) CHARACTER * 1
          = ’ U ’ : Upper triangle of A is stored ;
          = ’ L ’ : Lower triangle of A is stored .

N         ( input ) INTEGER
          The order of the matrix A .    N >= 0 .

A         ( input / output ) DOUBLE PRECISION array , dimension ( LDA , N←-
      )
          On entry , the symmetric matrix A . If UPLO = ’ U ’ , the
          leading N−by−N upper triangular part of A contains the
          upper triangular part of the matrix A . If UPLO = ’ L ’ ,
          the leading N−by−N lower triangular part of A contains
          the lower triangular part of the matrix A . On exit , if
          JOBZ = ’ V ’ , then if INFO = 0 , A contains
          the orthonormal eigenvectors of the matrix A . If
          JOBZ = ’ N ’ , then on exit the lower triangle ( if UPLO = ’L←-
               ’)
          or the upper triangle ( if UPLO = ’U ’ ) of A , including the
          diagonal , is destroyed .
LDA       ( input ) INTEGER
          The leading dimension of the array A . LDA >= max ( 1 , N ) .

W         ( output ) DOUBLE PRECISION array , dimension ( N )
          If INFO = 0 , the eigenvalues in ascending order .

WORK      ( workspace / output ) DOUBLE PRECISION array , dimension
          ( LWORK ) .
          On exit , if INFO = 0 , WORK ( 1 ) returns the optimal LWORK .

LWORK ( input ) INTEGER
      The length of the array WORK . LWORK >= max ( 1 , 3 * N←-
          −1) .
      For optimal efficiency , LWORK >= ( NB +2) * N , where NB is
      the blocksize for DSYTRD returned by ILAENV .

          If LWORK = −1 , then a workspace query is assumed ; the
          routine only calculates the optimal size of the WORK
          array , returns this value as the first entry of the
          WORK array , and no error message related to LWORK is
          issued by XERBLA .

INFO      ( output ) INTEGER
          = 0 : successful exit
          < 0 : if INFO = −i , the i−th argument had an illegal ←-
400               ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

            value
        > 0 : if INFO = i , the algorithm failed to converge ;             ←-
            i
        off−diagonal elements of an intermediate tridiagonal
        form did not converge to zero .

Σελίδες όπως τις παραπάνω, τις διαβάζουμε αναζητώντας τα δεδομένα
που πρέπει να δώσουμε στην είσοδο στην υπορουτίνα που μας ενδιαφέ-
ρει και τα δεδομένα που θα πάρουμε στην έξοδο με την πληροφορία που
θέλουμε να χρησιμοποιήσουμε. Μαθαίνουμε πως ο προς διαγωνιοποίηση
πίνακας A έχει αριθμό γραμμών και στηλών που είναι ≤ N . Ο αριθμός
των γραμμών LDA (LDA= “leading dimension of A”) μπορεί να είναι με-
γαλύτερος από N και η DSYEV θα διαγωνιοποιήσει το πάνω αριστερά
N×N κομμάτι του πίνακα². Αυτό θα το χρησιμοποιήσουμε προς όφελός
μας, έτσι ώστε να ορίσουμε ένα πίνακα μεγάλου μεγέθους A(LDA,LDA)
διαγωνιοποιώντας κάθε φορά μεταβλητού μεγέθους τετράγωνο κομμάτι
του A(N,N). Η υπορουτίνα μπορεί να χρησιμοποιηθεί με δύο τρόπους:

   • Αν JOBZ='N', υπολογίζει μόνο τις ιδιοτιμές του πίνακα A(N,N) και
     τις αποθηκεύει στο array W(N) με σειρά αυξανόμενου μεγέθους.
     Μόλις η ρουτίνα επιστρέψει, το άνω ή κάτω τριγωνικό κομμάτι
     του A έχει καταστραφεί ανάλογα με το αν UPLO='U' ή 'L' αντί-
     στοιχα. Αυτό είναι και το κομμάτι του A που είμαστε υποχρεωμέ-
     νοι να παρέχουμε στην DSYEV. Αν θέλουμε να χρησιμοποιήσουμε
     ξανά τον πίνακα A(N,N) μετά την κλήση της DSYEV θα πρέπει να
     ανακατασκευάσουμε τον πίνακα χρησιμοποιώντας αποθηκευμένο
     αντίγραφό του.

   • Αν JOBZ='V', υπολογίζει ιδιοτιμές και ιδιοδιανύσματα του A(N,N).
     Οι ιδιοτιμές αποθηκεύονται όπως και πριν στο array W(N), ενώ
     τα ιδιοδιανύσματα στις στήλες του πίνακα A(N,N). Δηλαδή αν θέ-
     λουμε να πάρουμε τα ιδιοδιανύσματα, ένας τρόπος είναι με τη
     σχέση v = A(1:N,j) όπου το array v(N) θα έχει τις συνιστώσες του
     j-οστού ιδιοδιανύσματος του πίνακα που αντιστοιχεί στην ιδιο-
     τιμή λj . Το διάνυσμα αυτό είναι κανονικοποιημένο στη μονάδα,
          ∑
     δηλ. N  i=1 v(i)*v(i)= 1. Ο πίνακας A(N,N) καταστρέφεται και αν
     τον χρειαζόμαστε πάλι θα πρέπει να τον έχουμε αποθηκεύσει.

Κάτι άλλο που μπορεί να προκαλέσει απορίες είναι η χρήση του array
WORK. Αυτός είναι βοηθητικός χώρος στη μνήμη που δίνεται στην DSYEV
   ²Ο αριθμός LDA είναι αναγκαίος, γιατί το στοιχείο A(i,j) απέχει i+(LDA-1)*j
θέσεις στη μνήμη από το A(1,1).
9.2. ΥΠΟΛΟΓΙΣΜΟΣ ΙΔΙΟΤΙΜΩΝ ΤΟΥ HN M (λ)                                                      401

για να μπορέσει να κάνει τους ενδιάμεσους υπολογισμούς. Αυτό είναι
ένα array μεγέθους LWORK και η επιλογή του LWORK δεν είναι μοναδική.
Εμείς θα επιλέξουμε την απλή περίπτωση LWORK=3*LDA-1. Η μεταβλητή
INFO είναι η “σημαία” για τον αν εξελίχθηκε ο υπολογισμός ομαλά και
στο πρόγραμμα ελέγχουμε αν η τιμή της είναι 0 και αν όχι, σταματάμε
το πρόγραμμα.
   Για την κατανόηση της χρήσης ενός προγράμματος μιας βιβλιοθήκης
είναι πάντα απαραίτητο να γράφουμε ένα δοκιμαστικό πρόγραμμα που
να το χρησιμοποιεί και του οποίου τα αποτελέσματα μπορούμε εύκολα
να ελέγξουμε. Οδηγούμαστε λοιπόν στο να γράψουμε τον εξής κώδικα
για να δοκιμάσουμε τη χρήση της DSYEV σε ένα πίνακα A(N,N):

program test_evs
  i m p l i c i t none
  i n t e g e r , parameter : : P                     = 100 ! P= LDA
  i n t e g e r , parameter : : LWORK = 3* P−1
  r e a l ( 8 ) : : A ( P , P ) , W ( P ) , WORK ( LWORK )
  i n t e g e r : : N ! DSYEV d i a g o n a l i z e s A(N, N)
  integer : : i , j
  i n t e g e r : : LDA , INFO
  c h a r a c t e r ( 1 ) : : JOBZ , UPLO
! D e f i n e t h e * * symmetric * * matrix t o be d i a g o n a l i z e d
! The s u b r o u t i n e us e s t h e upper t r i a n g u l a r p a r t (UPLO= ’U’ )
! t h e r e f o r e t h e lower t r i a n g u l a r p a r t needs not t o be d e f i n e d
  N=4
  A ( 1 , 1 ) = −7.7;
  A ( 1 , 2 )= 2 . 1 ; A (2 ,2)= 8 . 3 ;
  A ( 1 , 3 ) = −3.7; A ( 2 , 3 ) = −16.; A ( 3 , 3 ) =−12.
  A ( 1 , 4 ) = 4 . 4 ; A ( 2 , 4 ) = 4 . 6 ; A ( 3 , 4 ) = −1.04; A ( 4 , 4 ) =−3.7
!We p r i n t t h e matrix A b e f o r e c a l l i n g DSYEV s i n c e i t i s
! destroyed a f t e r the c a l l .
  do i =1 , N
    do j=i , N
      p r i n t * , ’A( ’ , i , ’ , ’ , j , ’ )= ’ , A ( i , j )
    enddo
  enddo
!We ask f o r e i g e n v a l u e s AND e i g e n v e c t o r s ( JOBZ= ’V’ )
  JOBZ= ’V ’ ; UPLO= ’U’
  p r i n t * , ’COMPUTING WITH DSYEV: ’
  LDA=P                                           ! n o t i c e t h a t LDA−> P>N ! !
  c a l l DSYEV ( JOBZ , UPLO , N , A , LDA , W , WORK , LWORK , INFO )
  p r i n t * , ’DSYEV: DONE. CHECKING NOW: ’
! I f INFO i s nonzero , then t h e r e i s an e r r o r :
  i f ( INFO . ne . 0) then
    p r i n t * , ’DSYEV FAILED . INF0= ’ , INFO
    stop
402                   ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

  endif
! P r i n t r e s u l t s : W( I ) has t h e e i g e n v a l u e s :
  p r i n t * , ’DSYEV: DONE . : ’
  p r i n t * , ’EIGENVALUES OF MATRIX: ’
  do i =1 , N
   p r i n t * , ’LAMBDA( ’ , i , ’ )= ’ , W ( i )
  enddo
! E i g e n v e c t o r s a r e i n s t o r e d i n t h e columns o f A:
  p r i n t * , ’EIGENVECTORS OF MATRIX’
  do J =1 , N
   p r i n t * , ’EIGENVECTOR ’ , j , ’ FOR EIGENVALUE ’ , W ( j )
   do i =1 , N
      p r i n t * , ’V_ ’ , j , ’ ( ’ , i , ’ )= ’ , A ( i , j )
   enddo
  enddo
end program test_evs

   Το επόμενο βήμα είναι να μεταγλωττίσουμε τον κώδικα. Το σημείο
που πρέπει να προσέξουμε είναι ότι στο στάδιο της σύνδεσης (linking)
πρέπει να δώσουμε οδηγίες στον linker ld πού βρίσκονται οι βιβλιοθήκες
LAPACK και η BLAS (οι βασικές υπολογιστικές ρουτίνας γραμμικής άλ-
γεβρας είναι στην BLAS). Όλες οι συναρτήσεις είναι μεταγλωττισμένες
και τα object files τους είναι αρχειοθετημένα στα αρχεία liblapack.a
libblas.a που μπορούμε να αναζητήσουμε με τις εντολές:

> l o c a t e libblas
> l o c a t e liblapack

Για να δούμε τα περιεχόμενά τους δίνουμε τις εντολές³:

> ar −t / usr / lib / libblas . a
> ar −t / usr / lib / liblapack . a

(ή αντικαθιστούμε το /usr/lib με τη διαδρομή που αντιστοιχεί στο
σύστημά μας). Αν ο κώδικάς μας είναι στο αρχείο test.f90 για τη
μεταγλώττιση δίνουμε την εντολή:

> g f o r t r a n test . f90 −o test −L / usr / lib −llapack −lblas

Η επιλογή -L/usr/lib λέει στον linker να αναζητήσει τις βιβλιοθήκες
στο /usr/lib⁴, ενώ οι -llapack -lblas του λένε να αναζητήσει όποια
   ³Αν δεν υπάρχουν αρχεία με κατάληξη .a, δοκιμάστε ar -t /usr/lib/libblas.so
κλπ.
   ⁴Άχρηστο στην περίπτωσή μας, γιατί το ψάχνει έτσι και αλλιώς, χρήσιμο, αν έχουμε
9.2. ΥΠΟΛΟΓΙΣΜΟΣ ΙΔΙΟΤΙΜΩΝ ΤΟΥ HN M (λ)                            403

σύμβολα⁵ δεν έχουν ξεκαθαριστεί κατά τη μεταγλώττιση του αρχείου
test.f90 πρώτα στη βιβλιοθήκη liblapack.a και μετά στην libblas.a
   Η παραπάνω εντολή έχει ως αποτέλεσμα το εκτελέσιμο αρχείο test
που, όταν το τρέξουμε, παίρνουμε το αποτέλεσμα:

 EIGENVALUES OF MATRIX :
 LAMBDA ( 1 )= −21.4119907
 LAMBDA ( 2)= −9.93394359
 LAMBDA ( 3)= −2.55765591
 LAMBDA ( 4)= 18.8035905
 EIGENVECTORS OF MATRIX
 EIGENVECTOR 1 FOR EIGENVALUE         −21.4119907
 V_ 1 ( 1 )= −0.197845668
 V_ 1 ( 2)= −0.464798676
 V_ 1 ( 3)= −0.854691009
 V_ 1 ( 4)=    0.119676904
 EIGENVECTOR 2 FOR EIGENVALUE         −9.93394359
 V_ 2( 1 )=    0.824412399
 V_ 2( 2)= −0.132429396
 V_ 2( 3)= −0.191076519
 V_ 2( 4)= −0.516039161
 EIGENVECTOR 3 FOR EIGENVALUE         −2.55765591
 V_ 3( 1 )=    0.502684215
 V_ 3( 2)= −0.247784372
 V_ 3( 3)=     0.132853329
 V_ 3( 4)=     0.817472616
 EIGENVECTOR 4 FOR EIGENVALUE          18.8035905
 V_ 4( 1 )=    0.168848655
 V_ 4( 2)=     0.839659187
 V_ 4( 3)= −0.464050682
 V_ 4( 4)=     0.226096318

Τώρα είμαστε έτοιμοι να λύσουμε το πρόβλημα του αναρμονικού τα-
λαντωτή. Το πρόγραμμα βρίσκεται στο συνοδευτικό λογισμικό στο αρ-
χείο anharmonic.f90. Στην κύρια ρουτίνα του προγράμματος ο χρή-
στης εισάγει τις βασικές παραμέτρους, τη διάσταση DIM ≡ N του HN
και την τιμή του λ για την οποία επιθυμεί να υπολογιστούν οι ιδιο-
τιμές En (N, λ) του πίνακα αναπαράστασης Hnm (λ) του τελεστή H(λ)
στην { |n⟩}n=0,1,...,N −1 αναπαράσταση στον HN . Το πρόγραμμα καλεί την
υπορουτίνα calculate_X4 για να υπολογίσει τον N × N πίνακα αναπα-
ράστασης (x4 )nm του τελεστή x4 . Ο υπολογισμός στην υπορουτίνα αυτή
μπορεί να γίνει γρηγορότερα υπολογίζοντας τα (x4 )nm αναλυτικά. Αυτό
αφήνεται ως άσκηση στον αναγνώστη. Στη συνέχεια, υπολογίζονται οι
βιβλιοθήκες σε μη συμβατικά μέρη.
   ⁵Λ.χ. ονόματα συναρτήσεων και υπορουτινών.
404                   ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

ιδιοτιμές του Hnm (λ) καλώντας την υπορουτίνα calculate_evs και τα
αποτελέσματα τυπώνονται στο stdout (standard output).
    Η υπορουτίνα calculate_evs καλεί την calculate_H να υπολογίσει
τον πίνακα Hnm (λ) η οποία κάνει χρήση των σχέσεων (9.16). Στη συ-
νέχεια, καλείται η DSYEV της LAPACK να κάνει τη διαγωνιοποίηση. Προ-
σέχουμε στο όρισμα LDA της DSYEV να βάλουμε τη σωστή διάσταση του
πίνακα H που είναι P και όχι DIM. Στη συνέχεια, παρατίθεται ο κώδικας:

! ========================================================
program anharmonic_elevels
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter           :: P          = 1000
  i n t e g e r , parameter           : : LWORK = 3* P−1
  integer                             : : DIM
  r e a l ( 8 ) , dimension ( P , P ) : : H , X , X4 ! Hamiltonian+ P o s i t i o n Ops
  r e a l ( 8 ) , dimension ( P )     :: E           ! energy e i g e n v a l u e s
  r e a l ( 8 ) , dimension ( LWORK ) : : WORK
  real (8)                            : : lambda
  integer                             :: i

  print   * , ’ # Enter H i l b e r t Space dimension : ’
  read    * , DIM
  print   * , ’ # Enter lambda : ’
  read    * , lambda
  print   * , ’ # lambda= ’ , lambda
! Print   Message :
  print   * , ’ # ############################################### ’
  print   * , ’ # Energy spectrum o f anharmonic o s c i l l a t o r ’
  print   * , ’ # using matrix methods . ’
  print   * , ’ # H i l b e r t Space Dimension DIM = ’ , DIM
  print   * , ’ # lambda c o u p l i n g = ’ , lambda
  print   * , ’ # ############################################### ’
  print   * , ’ # Outpout : DIM lambda E_0 E_1 . . . . E_{N−1} ’
  print   * , ’ # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’

! C a l c u l a t e X^4 o p e r a t o r :
  c a l l calculate_X4 ( X , X4 , DIM )
! Calculate eigenvalues :
  c a l l calculate_evs ( H , X4 , E , WORK , lambda , DIM )
  w r i t e ( 6 , 1 0 0 ) ’EV ’ , DIM , lambda , ( E ( i ) , i =1 , DIM )
100 FORMAT( A3 , I8 ,20000 G25 . 1 5 )
end program anharmonic_elevels
! ========================================================
s u b r o u t i n e calculate_evs ( H , X4 , E , WORK , lambda , DIM )
! ========================================================
  i m p l i c i t none
9.2. ΥΠΟΛΟΓΙΣΜΟΣ ΙΔΙΟΤΙΜΩΝ ΤΟΥ HN M (λ)                                                                        405

 i n t e g e r , parameter                     ::   P       = 1000
 i n t e g e r , parameter                     ::   LWORK = 3* P−1
 r e a l ( 8 ) , dimension ( P , P )           ::   H , X4
 r e a l ( 8 ) , dimension ( P )               ::   E
 r e a l ( 8 ) , dimension ( LWORK )           ::   WORK
 integer                                       ::   DIM
 real (8)                                      ::   lambda
 character (1)                                 ::   JOBZ , UPLO
 integer                                       ::   LDA , INFO , i , j

  c a l l calculate_H ( H , X4 , lambda , DIM )
  JOBZ= ’V ’ ; UPLO= ’U’
  c a l l DSYEV ( JOBZ , UPLO , DIM , H , P , E , WORK , LWORK , INFO )
  p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’
  do j =1 , DIM
    w r i t e ( 6 , 1 0 1 ) ’ # EVEC ’ , lambda , ( H ( i , j ) , i =1 , DIM )
  enddo
  p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’
101 FORMAT( A7 , F15 .3 ,20000 G14 . 6 )
! I f INFO i s nonzero then we have an e r r o r
  i f ( INFO . ne . 0) then
    p r i n t * , ’ dsyev f a i l e d . INFO= ’ , INFO
    stop
  endif

end s u b r o u t i n e calculate_evs
! ========================================================
s u b r o u t i n e calculate_H ( H , X4 , lambda , DIM )
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter           : : P = 1000
  r e a l ( 8 ) , dimension ( P , P ) : : H , X4
  integer                             : : DIM
  real (8)                            : : lambda
  integer                             :: i,j

 do j =1 , DIM
  do i =1 , DIM
    H ( i , j )=lambda * X4 ( i , j )
  enddo
  H ( j , j ) = H ( j , j ) + DBLE( j ) − 0.5 D0 ! E_n=n + 1 / 2 , n=j −1=>E_n=j −1/2
 enddo

 print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’
 do j =1 , DIM
  w r i t e ( 6 , 1 0 2 ) ’ # HH ’ , ( H ( i , j ) , i =1 , DIM )
 enddo
 print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’
406                 ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

102 FORMAT( A5 ,20000 G20 . 6 )
end s u b r o u t i n e calculate_H
! ========================================================
s u b r o u t i n e calculate_X4 ( X , X4 , DIM )
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter           : : P=1000
  r e a l ( 8 ) , dimension ( P , P ) : : X , X4 , X2
  integer                             : : DIM
  integer                             :: i,j,m,n
  r e a l ( 8 ) , parameter           : : isqrt2 =1.0 D0 / sqrt ( 2 . 0 D0 )
! Compute t h e p o s i t i o n o p e r a t o r :
  X = 0.0 D0
! Compute t h e nonzero e l e m e n t s
  do i =1 , DIM
    n=i−1 ! i n d i c e s 0 , . . . , DIM−1
! The d e l t a _ {n ,m+1} term , i . e . m=n−1
    m=n−1 ! t h e energy l e v e l n −> i =n+1 , m−> j =m+1
    j=m+1
    i f ( j . ge . 1 ) X ( i , j )=isqrt2 * sqrt (DBLE( m +1) )
! The d e l t a _ {n ,m−1} term , i . e . m=n+1
    m=n+1
    j=m+1
    i f ( j . le . DIM ) X ( i , j )=isqrt2 * sqrt (DBLE( m ) )
  enddo
! Compute t h e Hamiltonian o p e r a t o r :
! S t a r t with t h e X^4 o p e r a t o r :
  X2 = MATMUL( X , X ) ! f i r s t X2 , then X4 :
  X4 = MATMUL( X2 , X2 )
end s u b r o u t i n e calculate_X4




9.3 Αποτελέσματα
Για να τρέξουμε το πρόγραμμα, μεταγλωττίζουμε και δίνουμε τα δεδο-
μένα στο πρόγραμμα

> g f o r t r a n −O2 anharmonic . f90 −o an −llapack −lblas
> . / an
  # Enter H i l b e r t Space dimension :
4
  # Enter lambda :
0.0
.....
# ********************** H *******************
# HH                   0.50   0.00 0.00      0.00
9.3. ΑΠΟΤΕΛΕΣΜΑΤΑ                                                                            407

                                                            n=0
                             0.8
                                                                          λ=0.9
                                                                          λ=0.2
                            0.75

                             0.7
                     En




                            0.65

                             0.6

                            0.55

                             0.5
                                   0       0.1        0.2       0.3        0.4       0.5
                                                             1/N

Σχήμα 9.1: Η ενεργειακή στάθμη E0 (λ) για λ = 0.2, 0.9 υπολογίζεται από το όριο των
ιδιοτιμών E0 (N, λ), καθώς N → ∞. Σύγκλιση επιτυγχάνεται για σχετικά μικρές τιμές
του N , ενώ φαίνεται ότι για λ = 0.2 γίνεται ελαφρά γρηγορότερα από ότι για λ = 0.9.


# HH                          0.00          1.50 0.00          0.00
# HH                          0.00          0.00 2.50          0.00
# HH                          0.00          0.00 0.00          3.50
# ********************** H *******************
# * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * *
# EVEC 0.000                  1.00          0.00 0.00          0.00
# EVEC 0.000                  0.00          1.00 0.00          0.00
# EVEC 0.000                  0.00          0.00 1.00          0.00
# EVEC 0.000                  0.00          0.00 0.00          1.00
# * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * *
EV 4          0.000           0.50          1.50 2.50          3.50

όπου παραπάνω τρέξαμε το πρόγραμμα για N = 4 και λ = 0. Αυτό αντι-
στοιχεί στον απλό αρμονικό ταλαντωτή και βλέπουμε πως παίρνουμε
τις αναμενόμενες λύσεις: Hnm = (n + 1/2)δn,m , En = (n + 1/2)
                                                          ∑3 και οι ιδιο-
καταστάσεις (ιδιοδιανύσματα του Hnm ) |n⟩λ=0 = |n⟩ = m=0        δn,m |m⟩.
Ανάλογα αποτελέσματα θα πάρουμε και για μεγαλύτερα N .
    Για μη μηδενικές τιμές του λ, ο υπολογισμός για πεπερασμένο N
ενέχει συστηματικά σφάλματα, επειδή αγνοούνται όλα τα στοιχεία του
πίνακα Hnm (λ) για n ≥ N ή m ≥ N . Το πρόγραμμά μας υπολογίζει τις
ιδιοτιμές En (N, λ) του πεπερασμένου πίνακα Hnm (λ), m, n = 0, . . . , N −1
και αναμένεται ότι
                          En (λ) = lim En (N, λ) ,                   (9.22)
                                                     N →∞

όπου
                                       H(λ) |n⟩λ = En (λ) |n⟩λ ,                           (9.23)
408                 ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

                                              n=9
                    140
                                                            λ=0.9
                    120                                     λ=0.2

                    100

                    80
               En

                    60

                    40

                    20

                     0
                          0   0.02   0.04   0.06     0.08   0.1     0.12   0.14
                                               1/N

Σχήμα 9.2: Η ενεργειακή στάθμη E9 (λ) για λ = 0.2, 0.9 υπολογίζεται από το όριο των
ιδιοτιμών E9 (N, λ), καθώς N → ∞.


είναι η πραγματική ιδιοτιμή της Χαμιλτονιανής H(λ). Στην πράξη, το
όριο 9.22 για δεδομένα λ και n υπολογίζεται από τις αριθμητικές τιμές
En (N, λ) για ολοένα και μεγαλύτερες τιμές του N . Αν επιτευχθεί σύ-
γκλιση σε ένα επιθυμητό επίπεδο για τις τιμές του N που είναι εφικτές,
τότε το όριο είναι μια προσέγγιση στην En (λ). Η διαδικασία αυτή δεί-
χνεται γραφικά στα σχήματα 9.1-9.3 για λ = 0.2, 0.9. Η σύγκλιση είναι
ικανοποιητική για αρκετά μικρά N για n = 0, 9, αλλά για n = 20 είναι
αναγκαίοι υπολογισμοί σε μεγαλύτερες τιμές του N . Η αύξηση του n
για δεδομένο λ κάνει αναγκαία την πρόσβαση με μεγαλύτερες τιμές
του N . Για δεδομένο ενεργειακό επίπεδο n, η αύξηση του λ κάνει επί-
σης αναγκαίο τον υπολογισμό σε μεγαλύτερα N . Μια πλήρης συνεδρία
υπολογισμού της ενέργειας της θεμελιώδους κατάστασης E0 (λ = 0.9)
παρατίθεται παρακάτω⁶:

> tcsh
> g f o r t r a n −O2 anharmonic . f90 −llapack −lblas −o an
> f o r e a c h N (4 8 12 16 24 32)
f o r e a c h ? ( echo $N ; echo 0 . 9 ) | . / an >> data
f o r e a c h ? end
> grep ^ EV data | awk ’{ p r i n t $2 , $4 } ’
4 0.711467845686790
8 0.786328966767866

   ⁶Ο foreach βρόχος είναι ειδικός για το φλοιό tcsh. Για το λόγο αυτό δίνεται ρητά
η εντολή tcsh. Αν χρησιμοποιείτε διαφορετικό φλοιό χρησιμοποιείστε το αντίστοιχο
συντακτικό.
9.3. ΑΠΟΤΕΛΕΣΜΑΤΑ                                                                   409

                                               n = 20
                       500
                                                           λ=0.9
                       450                                 λ=0.2
                       400
                       350
                       300
                  En



                       250
                       200
                       150
                       100
                        50
                        0
                         0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0.05
                                               1/N

Σχήμα 9.3: Η ενεργειακή στάθμη E20 (λ) για λ = 0.2, 0.9 υπολογίζεται από το όριο των
ιδιοτιμών E20 (N, λ), καθώς N → ∞. Η σύγκλιση δεν έχει επιτευχθεί για τις προβαλ-
λόμενες τιμές του N ≤ 80.


12 0.785237674919165
16 0.784964461939594
24 0.785032515135677
32 0.785031492177730
> gnuplot
gnuplot > plot ”<grep ^EV data | awk ’{ p r i n t 1 / $2 , $4 } ’ ”

Περαιτέρω αυτοματοποίηση της διαδικασίας μπορεί να βρεθεί στο σε-
νάριο φλοιού anharmonic.csh στο συνοδευτικό λογισμικό. Παρατηρήστε
τη σύγκλιση για μεγάλο N της ιδιοτιμής E0 (N, 0.9) και ότι τελικά παίρ-
νουμε E0 (0.9) ≈ 0.78503. Αν είναι επιθυμητή η επίτευξη μεγαλύτερης
ακρίβειας, τότε είναι αναγκαίο να γίνουν υπολογισμοί σε μεγαλύτερα
N.
   Είναι, επίσης, δυνατόν να υπολογίσουμε τις αναμενόμενες τιμές ⟨A⟩n (λ)
ενός τελεστή A = A(p, q), όταν ο αναρμονικός ταλαντωτής βρίσκεται
στην κατάσταση |n⟩λ :
                               ⟨A⟩n (λ) = λ ⟨n| A |n⟩λ .                          (9.24)
Στην πράξη, η αναμενόμενη τιμή θα υπολογιστεί από το όριο
              ⟨A⟩n (λ) = lim ⟨A⟩n (N, λ) ≡ lim             N,λ ⟨n| A |n⟩N,λ   ,   (9.25)
                             N →∞                   N →∞

όπου |n⟩N,λ είναι τα ιδιοδιανύσματα του πεπερασμένου N × N πίνακα
Hnm (λ) τα οποία υπολογίζονται αριθμητικά από την DSYEV. Αυτά καθο-
ρίζονται από τις συνιστώσες τους cm (N, λ), όπου
                                        ∑
                                        N −1
                             |n⟩N,λ =          cm (N, λ) |m⟩ ,                    (9.26)
                                        m=0
410                       ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

οι οποίες αποθηκεύονται στο array H, αφού επιστρέψει η DSYEV:

                                   cm (N, λ) = H(m + 1, n + 1) .                                          (9.27)

Αντικαθιστώντας την εξίσωση (9.26) στην (9.24), παίρνουμε
                                            ∑
                                            N −1
                         ⟨A⟩n (λ) =                  c∗m (N, λ)cm′ (N, λ)Amm′ ,                           (9.28)
                                           m,m′ =0

και μπορούμε να χρησιμοποιήσουμε την (9.27) στον υπολογισμό του
αθροίσματος.
    Τα παραπάνω θα τα εφαρμόσουμε στον υπολογισμό των αναμενό-
μενων τιμών των τελεστών x2 , x4 και p2 . Λαμβάνοντας υπόψη
                                                       √    ότι ⟨x⟩n =
⟨p⟩
√ n = 0, παίρνουμε√και για τις αβεβαιότητες ∆xn ≡ ⟨x ⟩n − ⟨x⟩n =
                                                          2        2

  ⟨x2 ⟩n και ∆pn = ⟨p2 ⟩n . Από αυτές μπορούμε να υπολογίσουμε και
το γινόμενο των αβεβαιοτήτων που θα πρέπει να ικανοποιεί τη σχέση
αβεβαιότητας του Heisenberg ∆xn ·∆pn ≳ 1/2. Τα αποτελέσματα παρου-
σιάζονται στον πίνακα 9.1 και στα σχήματα 9.4-9.5 και ο υπολογισμός
αφήνεται ως άσκηση για τον αναγνώστη.
                10
                                                                                         ∆X ∆P
                                                                                          2 1/2
                                                                                        <X2>1/2
                                                                                        <P >


                8




                6




                4




                2




                0
                     0      0.01    0.02     0.03     0.04         0.05   0.06   0.07       0.08   0.09
                                                             1/N


                                                     1/2                  1/2
Σχήμα 9.4: Οι αναμενόμενες τιμές ⟨x2 ⟩n (λ), ⟨p2 ⟩n (λ) και το γινόμενο αβεβαιοτή-
                                                                          1/2
των ∆xn · ∆pn για n = 9 και λ = 0.5 υπολογίζονται από το όριο των ⟨x2 ⟩n (N, λ),
     1/2
⟨p2 ⟩n (N, λ) καθώς N → ∞.

   Τέλος, θα προσπαθήσουμε να καταλάβουμε καλύτερα τη φυσική του
αναρμονικού ταλαντωτή μελετώντας τις ιδιότητες του φάσματός του,
καθώς λ → ∞. Όπως παρατηρούμε στο σχήμα 9.5, καθώς μεγαλώνει
το λ, ο όρος λx4 επικρατεί και η αναμενόμενη τιμή ⟨x2 ⟩n (λ) ελαττώ-
νεται, άρα ευνοούνται καταστάσεις που περιορίζουν τον ταλαντωτή σε
9.3. ΑΠΟΤΕΛΕΣΜΑΤΑ                                                                 411


                14



                12



                10



                 8                                              ∆X ∆P
                                                               <P22>1/2
                                                               <X >1/2

                 6



                 4



                 2



                 0
                     0      20       40         60        80              100
                                            λ


                                      1/2        1/2
Σχήμα 9.5: Οι αναμενόμενες τιμές ⟨x2 ⟩n (λ), ⟨p2 ⟩n (λ) και το γινόμενο αβεβαιοτήτων
∆xn · ∆pn για n = 9.


μικρότερη περιοχή του χώρου. Από την αρχή της αβεβαιότητας συμπε-
ραίνουμε ότι η τυπική ορμή του ταλαντωτή θα αυξάνει κατά μέτρο. Αυτό
επιβεβαιώνεται από το σχήμα 9.5 όπου βλέπουμε την αναμενόμενη τιμή
⟨p2 ⟩n (λ) να αυξάνει με το λ. Για να δούμε ποσοτικά το αποτέλεσμα των
ανταγωνιστικών αυτών τάσεων θα χρησιμοποιήσουμε ένα απλό επιχεί-
ρημα βάθμισης του Symanzik. Στη Χαμιλτονιανή H(λ) = p2 /2+x2 /2+λx4
επαναορίζουμε x → λ−1/6 x (άρα και p → λ1/6 p) και για λ αρκετά μεγάλο
παίρνουμε⁷ την ασυμπτωτική συμπεριφορά
                         H(λ) ∼ λ1/3 h(1) ,          λ → ∞,                     (9.29)
όπου h(λ) = p2 /2 + λx4 είναι η Χαμιλτονιανή του αναρμονικού “ταλα-
ντωτή” με ω = 0. Εφόσον ο τελεστής h(1) είναι ανεξάρτητος του λ, το
ενεργειακό φάσμα θα έχει την ασυμπτωτική συμπεριφορά
                         En (λ) ∼ Cn λ1/3 ,          λ → ∞.                     (9.30)
Στην εργασία [41] δείχνεται ότι για λ > 100 ισχύει ότι
                 (                                                     )
   E0 (λ) = λ1/3 0.667 986 259 18 + 0.143 67λ−2/3 − 0.0088λ−4/3 + . . . ,
                                                                       (9.31)
                                              6
με ακρίβεια καλύτερη από ένα μέρος στα 10 . Για μεγάλες τιμές του n,
στην ίδια εργασία υπολογίζεται η ασυμπτωτική συμπεριφορά
                         (      )4/3
                              1
         En (λ) ∼ Cλ 1/3
                          n+         ,     λ → ∞,n → ∞,                (9.32)
                              2
   ⁷Για x → λ−1/6 x, H → λ1/3 (p2 /2+λ−2/3 x2 /2+x4 ) οπότε στο όριο λ → ∞ ο δεύτερος
όρος εξαφανίζεται και παίρνουμε την (9.29).
412                  ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

                    λ = 0.5                     λ = 2.0
 n    ⟨x ⟩ 2
                      ⟨p ⟩
                        2
                             ∆x · ∆p     ⟨x ⟩
                                           2
                                                  ⟨p2 ⟩                     ∆x · ∆p
 0 0.305814        0.826297 0.502686   0.21223 1.19801                     0.504236
 1 0.801251         2.83212    1.5064 0.540792 4.21023                      1.50893
 2  1.15544         5.38489  2.49438 0.761156 8.15146                       2.49089
 3  1.46752         8.28203  3.48627 0.958233 12.6504                       3.48166
 4  1.75094          11.4547  4.47845  1.13698   17.596                     4.47285
 5  2.01407         14.8603   5.47079  1.30291 22.9179                      5.46443
 6    2.2617        18.4697    6.4632  1.45905 28.5683                      6.45619
 7 2.49696          22.2616  7.45562   1.60735 34.5124                      7.44805
 8  2.72198         26.2196  8.44804    1.74919 40.7234                     8.43998
 9 2.93836          30.3306  9.44045   1.88558 47.1801                      9.43194


Πίνακας 9.1: Οι αναμενόμενες τιμές των ⟨x2 ⟩, ⟨p2 ⟩, ∆x · ∆p για τον αναρμονικό √ ταλα-
ντωτή για τις καταστάσεις
                      √     |n⟩, n = 0, . . . , 9. Παρατηρούμε τη μείωση της ∆x =   ⟨x2 ⟩
και αύξηση της ∆p = ⟨p2 ⟩, καθώς αυξάνεται το λ. Το γινόμενο ∆x · ∆p φαίνεται να
είναι πολύ κοντά στις τιμές (n + 1/2) που παίρνουμε από τον αρμονικό ταλαντωτή
και για τις δύο τιμές του λ.


όπου C = 34/3 π 2 /Γ(1/4)8/3 ≈ 1.376 507 40. Η σχέση αυτή εξετάζεται στο
σχήμα 9.6 όπου βρίσκουμε ικανοποιητική συμφωνία με τους υπολογι-
σμούς μας.


9.4 Το Διπλό Πηγάδι Δυναμικού
Θα χρησιμοποιήσουμε τις μεθόδους πινάκων που αναφέραμε για να
υπολογίσουμε τα ενεργειακά επίπεδα σωματιδίου μέσα στο διπλό πη-
γάδι δυναμικού. Αυτό δίνεται από τη Χαμιλτονιανή:
                                       p2 x 2    x4
                                H=       −    +λ                                 (9.33)
                                       2   2     4
και τα σημεία ισορροπίας στην κλασική κίνηση βρίσκονται στα ελάχι-
στα:
                              1            1
                      x0 = ± √ , Vmin = −                        (9.34)
                               λ          4λ
 Όταν το πηγάδι είναι πολύ βαθύ τότε, για τις χαμηλότερες στάθμες,
μπορούμε να θεωρήσουμε ότι το δυναμικό προσεγγίζεται αρκετά καλά
από αυτό του αρμονικού ταλαντωτή με συχνότητα ω 2 = V ′′ (x0 ), οπότε
                                              1
                                 Emin ≈ Vmin + ω                                 (9.35)
                                              2
Πίνακας 9.2: Αριθμητικός υπολογισμός των ενεργειακών επιπέδων του αναρμονικού ταλαντωτή όπως δίνεται στην εργασία [41].

             λ              E0           E1                   E2           E3                   E4
             0.002    0.501 489 66 1.507 419 39         2.519 202 12 3.536 744 13         4.559 955 56
             0.006    0.504 409 71 1.521 805 65         2.555 972 30 3.606 186 33         4.671 800 37
             0.01     0.507 256 20 1.535 648 28         2.590 845 80 3.671 094 94         4.774 913 12
             0.05     0.532 642 75 1.653 436 01         2.873 979 63 4.176 338 91         5.549 297 81
             0.1      0.559 146 33 1.769 502 64         3.138 624 31 4.628 882 81         6.220 300 90
             0.3      0.637 991 78 2.094 641 99         3.844 782 65 5.796 573 63         7.911 752 73
             0.5      0.696 175 82 2.324 406 35         4.327 524 98 6.578 401 95         9.028 778 72
             0.7      0.743 903 50 2.509 228 10         4.710 328 10 7.193 265 28         9.902 610 70
             1        0.803 770 65 2.737 892 27         5.179 291 69 7.942 403 99         10.963 5831
             2        0.951 568 47 3.292 867 82         6.303 880 57 9.727 323 19          13.481 2759
             50       2.499 708 77 8.915 096 36          17.436 9921 27.192 6458          37.938 5022
             200      3.930 931 34 14.059 2268           27.551 4347 43.005 2709          60.033 9933
             1000     3.694 220 85 23.972 2061           47.017 3387  73.419 1140          102.516 157
             8000     13.366 9076   47.890 7687         93.960 6046 146.745 512            204.922 711
             20000     18.137 2291 64.986 6757          127.508 839   199.145 124         278.100 238
             λ              E5           E6                   E7           E8
                                                                                                                          9.4. ΤΟ ΔΙΠΛΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ




             0.002    5.588 750 05 6.623 044 60         7.662 759 33 8.707 817 30
             0.006    5.752 230 87 6.846 948 47         7.955 470 29 9.077 353 66
             0.01     5.901 026 67 7.048 326 88         8.215 837 81 9.402 692 31
             0.05     6.984 963 10 8.477 397 34          10.021 9318  11.614 7761
             0.1      7.899 767 23 9.657 839 99          11.487 3156 13.378 9698
             0.3      10.166 4889   12.544 2587          15.032 7713 17.622 4482
             0.5       11.648 7207  14.417 6692         17.320 4242  20.345 1931
             0.7      12.803 9297  15.873 6836          19.094 5183 22.452 9996
             1        14.203 1394  17.634 0492          21.236 4362 24.994 9457
             2         17.514 1324 21.790 9564          26.286 1250 30.979 8830
             50        49.516 4187 61.820 3488           74.772 8290 88.314 3280
                                                                                                                          413




             200      78.385 6232   97.891 3315          118.427 830 139.900 400
             1000      133.876 891  167.212 258         202.311 200 239.011 580
             8000     267.628 498 334.284 478           404.468 350   477.855 700
             20000    363.201 843 453.664 875           548.916 140 648.515 330
414                                       ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

                              1.41
                                                                                               n=1
                                                                                               n=2
                                                                                               n=5
                             1.405                                                             n=9
                                                                                              n=20
                                                                                                 C

                               1.4
      En λ-1/3 (n+1/2)-4/3




                             1.395



                              1.39



                             1.385



                              1.38



                             1.375
                                     0            500           1000             1500            2000
                                                                       λ


Σχήμα 9.6: Επαλήθευση της ασυμπτωτικής σχέσης (9.32). Στον κάθετο άξονα έχουμε
υπολογίσει την ποσότητα En λ−1/3 (n + 1/2)−4/3 η οποία για αρκετά μεγάλα n και λ
Θα πρέπει να προσεγγίζει ασυμπτωτικά την τιμή C = 34/3 π 2 /Γ(1/4)8/3 ≈ 1.376 507 40
(οριζόντια γραμμή).


Στην περίπτωση αυτή το φαινόμενο σήραγγας είναι πολύ ασθενές, με
αποτέλεσμα τα ενεργειακά επίπεδα να χωρίζονται ελαφρά μεταξύ τους
ανά ζεύγη. Αυτό γίνεται γιατί οι αντίστοιχες ιδιοκαταστάσεις είναι συμ-
μετρικοί και αντισυμμετρικοί συνδυασμοί καταστάσεων που αντιστοι-
χούν σε καταστάσεις εντοπισμένες στο αριστερό ή δεξιό ελάχιστο της
δυναμικής ενέργειας. Π.χ. για τα δύο χαμηλότερα ενεργειακά επίπεδα
περιμένουμε ότι
                                          ∆
                           E0,1 ≈ Emin ± ,                       (9.36)
                                          2
όπου ∆ ≪ |Emin | και

                                                  |+⟩ + |−⟩                     |+⟩ − |−⟩
                                         |0⟩λ ≈      √      ,          |1⟩λ ≈      √      ,             (9.37)
                                                       2                             2

όπου οι καταστάσεις |+⟩ και |−⟩ είναι εντοπισμένες στο αριστερό και
δεξί πηγάδι του δυναμικού αντίστοιχα (δείτε και τα σχήματα 10.4 του
Κεφαλαίου 10).
   Ως βάση για τον υπολογισμό της Χαμιλτονιανής (9.33) θα χρησιμο-
ποιήσουμε τις σχέσεις (9.12). Οι απαραίτητες μεταβολές στον κώδικα
9.4. ΤΟ ΔΙΠΛΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                      415


                        1.5                               λ=0.2
                                                          λ=0.1
                          1
                        0.5
                          0
                 V(x)




                        -0.5
                         -1
                        -1.5
                         -2
                        -2.5
                               -4     -2        0        2        4
                                                x

                Σχήμα 9.7: Η δυναμική ενέργεια V (x) για λ = 0.1, 0.2.



μας είναι ελάχιστες. Απλά θα προσθέσουμε μία ρουτίνα που να υπολο-
γίζει τους πίνακες pnm . Παίρνουμε έτσι τον κώδικα που αποθηκεύουμε
στο αρχείο doublewell.f90:

! ========================================================
program doublewell_elevels
! ========================================================
! H               : Hamiltonian o p e r a t o r H0+( lambda / 4 ) *X^4
! H0              : Hamiltonian H0=1/2 P^2 −1/2 X^2
! X, X2 , X4 : P o s i t i o n o p e r a t o r and i t s powers
! iP              : i P operator
! P2              : P^2 = −( i P ) ( i P ) o p e r a t o r
! E               : Energy e i g e n v a l u e s
! WORK            : Workspace f o r l a p a c k r o u t i n e DSYEV
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter              : : P=1000
  i n t e g e r , parameter              : : LWORK =3*P−1
  r e a l ( 8 ) , dimension ( P , P )    : : H , H0 , X , X4 , X2 , iP , P2
  r e a l ( 8 ) , dimension ( P )        :: E
  r e a l ( 8 ) , dimension ( LWORK ) : : WORK
  real (8)                               : : lambda , lambda0 , lambdaf , dlambda
  integer                                : : DIM0 , DIMF , dDIM , DIM
  integer                                :: i

! Minimum and maximum v a l u e s o f H i l b e r t sp a ce dimensions :
  p r i n t * , ’ Enter H i l b e r t Space dimensions (DIM0 , DIMF, DDIM) : ’
  read * , DIM0 , DIMF , DDIM
! Minimum and maximum v a l u e s o f lambda ( s t e p dlambda ) :
416                        ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

  print    * , ’ Enter lambda0 , lambdaf , dlambda : ’
  read     * , lambda0 , lambdaf , dlambda
  print    * , ’ lambda0= ’ , lambda0
! Print    Message :
  print    * , ’ # ############################################### ’
  print    * , ’ # Energy l e v e l s o f double w e l l p o t e n t i a l ’
  print    * , ’ # using matrix methods . ’
  print    * , ’ # H i l b e r t Space Dimensions = ’ , DIM0 , ’ − ’ , DIMF ,&
          ’ s t e p= ’ , dDIM
 print     * , ’ # lambda c o u p l i n g = ’ , lambda0 , ’ − ’ , lambdaf ,&
          ’ s t e p= ’ , dlambda
 print     * , ’ # ############################################### ’
 print     * , ’ # Outpout : DIM lambda E_0 E_1 . . . . E_{N−1} ’
 print     * , ’ # −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−’

 do DIM=DIM0 , DIMF , dDIM

   c a l l calculate_operators ( X , X2 , X4 , iP , P2 , H0 , DIM )

    lambda = lambda0
    do while ( lambda . le . lambdaf )
      c a l l calculate_evs ( H , H0 , X4 , E , WORK , lambda , DIM )
      w r i t e ( 6 , 1 0 0 ) ’EV ’ , DIM , lambda , ( E ( i ) , i =1 , DIM )
      lambda = lambda+dlambda
    enddo
  enddo
100 FORMAT( A3 , I5 ,1000 G25 . 1 5 )
end program doublewell_elevels
! ========================================================
s u b r o u t i n e calculate_evs ( H , H0 , X4 , E , WORK , lambda , DIM )
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter                  : : P=1000
  i n t e g e r , parameter                  : : LWORK =3*P−1
  r e a l ( 8 ) , dimension ( P , P )        : : H , H0 , X4
  r e a l ( 8 ) , dimension ( P )            :: E
  r e a l ( 8 ) , dimension ( LWORK ) : : WORK
  integer                                    : : DIM
  real (8)                                   : : lambda
  character (1)                              : : JOBZ , UPLO
  integer                                    : : LDA , INFO , i , j

 c a l l calculate_H ( H , H0 , X4 , lambda , DIM )
 JOBZ= ’V ’ ; UPLO= ’U’
 c a l l DSYEV ( JOBZ , UPLO , DIM , H , P , E , WORK , LWORK , INFO )
 p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’
 do j =1 , DIM
   w r i t e ( 6 , 1 0 1 ) ’ # EVEC ’ , DIM , lambda , ( H ( i , j ) , i =1 , DIM )
 enddo
9.4. ΤΟ ΔΙΠΛΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                                                417

 p r i n t * , ’ # * * * * * * * * * * * * * * * * * * * * * * EVEC * * * * * * * * * * * * * * * * * * * ’
101 FORMAT( A7 , I5 , F8 . 4 , 1 0 0 0 G14 . 6 )

 i f ( INFO . ne . 0) then
   p r i n t * , ’ dsyev f a i l e d . INFO= ’ , INFO
   stop
 endif

end s u b r o u t i n e calculate_evs
! ========================================================
s u b r o u t i n e calculate_H ( H , H0 , X4 , lambda , DIM )
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter           : : P=1000
  r e a l ( 8 ) , dimension ( P , P ) : : H , H0 , X4
  integer                             : : DIM
  real (8)                            : : lambda
  integer                             :: i,j

 do j =1 , DIM
  do i =1 , DIM
   H ( i , j )=H0 ( i , j ) +0.25 D0 * lambda * X4 ( i , j )
  enddo
 enddo

 print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’
 do j =1 , DIM
  w r i t e ( 6 , 1 0 2 ) ’ # HH ’ , ( H ( i , j ) , i =1 , DIM )
 enddo
 print * , ’# * * * * * * * * * * * * * * * * * * * * * * H * * * * * * * * * * * * * * * * * * * ’

102 FORMAT( A5 ,1000 G14 . 6 )
end s u b r o u t i n e calculate_H
! ========================================================
s u b r o u t i n e calculate_operators ( X , X2 , X4 , iP , P2 , H0 , DIM )
! ========================================================
  i m p l i c i t none
  i n t e g e r , parameter           : : P=1000
  r e a l ( 8 ) , dimension ( P , P ) : : X , X4 , X2 , iP , P2 , H0
  integer                             : : DIM
  integer                             :: i,j,m,n
  r e a l ( 8 ) , parameter           : : isqrt2 =1.0 D0 / sqrt ( 2 . 0 D0 )

 X =0.0 D0 ; X2 =0.0 D0 ; X4 =0.0 D0
 iP =0.0 D0 ; P2 =0.0 D0

 do i =1 , DIM
  n=i−1 ! i n d i c e s 0 , . . . , DIM−1
! The d e l t a _ {n ,m+1} term , i . e . m=n−1
418                   ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

  m=n−1 ! energy l e v e l : n −> i =n+1 , m−> j =m+1
  j=m+1
  i f ( j . ge . 1 ) X ( i , j ) = isqrt2 * sqrt (DBLE( m +1) )
  i f ( j . ge . 1 ) iP ( i , j ) = −isqrt2 * sqrt (DBLE( m +1) )
! The d e l t a _ {n ,m−1} term , i . e . m=n+1
  m=n+1
  j=m+1
  i f ( j . le . DIM ) X ( i , j ) = isqrt2 * sqrt (DBLE( m ) )
  i f ( j . le . DIM ) iP ( i , j ) = isqrt2 * sqrt (DBLE( m ) )
 enddo ! do i =1 ,DIM

 X2 = MATMUL( X , X )
 P2 = −MATMUL( iP , iP )
 X4 = MATMUL( X2 , X2 )

! The Hamiltonian :
  H0 = 0.5 D0 * ( P2−X2 )
end s u b r o u t i n e calculate_operators

Πού προτιμάει να βρίσκεται το σωμάτιο, όταν βρίσκεται στις κατα-
στάσεις |+⟩ και |−⟩; Αυτό μπορεί να απαντηθεί αν υπολογίσουμε την
αναμενόμενη τιμή του τελεστή θέσης ⟨x⟩ σε κάθε μια από τις κατα-
στάσεις. Γνωρίζουμε ότι, όταν το σωματίδιο είναι σε κάποια από τις
ενεργειακές ιδιοκαταστάσεις, έχουμε

                              ⟨x⟩n (λ) = λ ⟨n| x |n⟩λ = 0                   (9.38)

εξαιτίας της αρτιότητας του δυναμικού V (x) = V (−x). Άρα,

      ⟨x⟩± (λ) = ⟨±| x |±⟩
                  1
               = √ (λ ⟨0| x |0⟩λ ± λ ⟨1| x |0⟩λ ± λ ⟨0| x |1⟩λ + λ ⟨1| x |0⟩λ )
                   2
                   √
               = ± 2⟨1| x |0⟩λ ,                                             (9.39)

όπου στην τελευταία γραμμή χρησιμοποιήσαμε τη σχέση (9.38) λ ⟨0| x |0⟩λ =
λ ⟨1| x |1⟩λ = 0 και ότι τα πλάτη λ ⟨1| x |0⟩λ = λ ⟨0| x |1⟩λ . Επίσης⁸ ισχύει ότι
                                                      ∑∞ (0)
λ ⟨1| x |0⟩λ > 0. Αν λοιπόν έχουμε ότι |0⟩λ =            m=0 cm |m⟩ και |1⟩λ =
∑∞ (1)
   m=0 cm |m⟩, παίρνουμε

                                    √ ∑∞
                                              (1)
                        ⟨x⟩± (λ) = ± 2   c(0)
                                          m cm′ Xmm′ .                      (9.40)
                                           m,m′ =0

   ⁸Για να πειστείτε, κοιτάξτε τις κυματοσυναρτήσεις στα σχήματα 10.4 του Κεφα-
λαίου 10 και υπολογίστε τα σχετικά ολοκληρώματα.
9.4. ΤΟ ΔΙΠΛΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                419

Δεδομένου ότι για πεπερασμένο N , η DSYEV μας επιστρέφει προσεγγι-
                          (n)
στικά τους συντελεστές cm στις στήλες του πίνακα H(DIM,DIM), έτσι
       (n)
ώστε cm ≈ H(m+1,n+1), μπορείτε√ να συγκρίνετε την τιμή του ⟨x⟩± (λ)
με τις κλασικές τιμές x0 = ±1/ λ, καθώς το λ αυξάνεται.



              1




            0.01




          0.0001
     ∆n




          1e-06




          1e-08




          1e-10                                                  n=0
                                                                 n=6
                                                                n=30
                    0.01         0.1           1           10           100
                                           λ


Σχήμα 9.8: Υπολογισμός της διαφοράς ενεργειακών επιπέδων ∆n = En+1 − En για
n = 0, 6, 30 για το διπλό πηγάδι δυναμικού από το πρόγραμμα doublewell.f90. Η
διαφορά τείνει στο μηδέν, καθώς το πηγάδι δυναμικού√γίνεται βαθύτερο, όταν το λ
ελαττώνεται. Οι καταστάσεις |±⟩ = ( |n + 1⟩λ ± |n⟩λ )/ 2 εντοπίζονται τότε ολοένα
και περισσότερο στο δεξί ή αριστερό πηγάδι αντίστοιχα.
420             ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

9.5 Ασκήσεις
 9.1 Υπολογίστε αναλυτικά τον πίνακα H(λ) για = 2, 3. Υπολογίστε
     τις ιδιοτιμές για N = 2. Συγκρίνετε με τις τιμές που υπολογίζει το
     πρόγραμμά σας ως επιβεβαίωση ότι τρέχει σωστά.

9.2 Μεταβάλετε τον κώδικα test.f90, έτσι ώστε να επιβεβαιώνει ότι
    τα ιδιοδιανύσματα ικανοποιούν τις σχέσεις A vi = λi vi και ότι
    αποτελούν ορθοκανονική βάση vi · vj = δij .

9.3 Να υπολογίσετε τις ενεργειακές τιμές E5 (λ) και E9 (λ) για λ =
    0.8, 1.2 με ακρίβεια καλύτερη από 0.01%.

9.4 Μέχρι ποιο ενεργειακό επίπεδο μπορείτε να υπολογίσετε με ακρί-
    βεια καλύτερη του 2% όταν N = 64; Πάρτε λ = 1.

9.5 Να υπολογίσετε τις ενεργειακές τιμές E3 και E12 για 0 ≤ λ ≤ 4
    με βήμα δλ = 0.2 με ακρίβεια καλύτερη του 0.01%. Πόσο μεγάλο
    N πρέπει να πάρετε για κάθε ενεργειακό επίπεδο, έτσι ώστε να
    πετύχετε το στόχο σας;

9.6 Υπολογίστε τον πίνακα του τελεστή x4 αναλυτικά και προγραμ-
    ματίστε τον στο πρόγραμμά σας. Συγκρίνετε τους χρόνους που
    τρέχει το πρόγραμμά σας σε σχέση με πριν σαν συνάρτηση του N .

 9.7 Μεταβάλετε τον κώδικα του anharmonic.f90, έτσι ώστε τα arrays
     H, X, X4, E, WORK να είναι ALLOCATABLE και να έχουν διάσταση
     που να καθορίζεται από τη μεταβλητή DIM που δίνει ο χρήστης τη
     στιγμή που τρέχει το πρόγραμμα. (Υπόδειξη: Δείτε το πρόγραμμα
     anharmonicSPEED.f90 στο συνοδευτικό λογισμικό.)

9.8 Προσπαθήστε να αναπαράγετε τα αποτελέσματα των Hioe και
    Montroll [41] που δίνονται στον πίνακα 9.2 για τις ενεργειακές
    στάθμες n = 3 και n = 5. Μέχρι ποια τιμή του λ μπορείτε να το
    κάνετε με τους υπολογιστικούς πόρους που διαθέτετε;

9.9 Προσπαθήστε να αναπαράγετε το αποτέλεσμα των Hioe και Mon-
    troll [41] που δίνεται από τη σχέση (9.31). Υπολογίστε την ενέργεια
    της θεμελιώδους κατάστασης για 200 < λ < 20000 και προσαρμό-
    στε τα δεδομένα σας σε συνάρτηση της μορφής λ1/3 (a + bλ−2/3 +
    cλ−4/3 ). Με πόση ακρίβεια μπορείτε να προσδιορίσετε τους συ-
    ντελεστές a, b και c και πόσο καλά συμφωνούν με την εξίσωση
    (9.31);
9.5. ΑΣΚΗΣΕΙΣ                                                            421

9.10 Μεταβάλετε τον κώδικα του anharmonic.f90 έτσι ώστε να υπολο-
     γίζει τις αναμενόμενες τιμές ⟨x2 ⟩n (N, λ), ⟨p2 ⟩n (N, λ) και τα αντί-
     στοιχα γινόμενα ∆x · ∆p. (Υπόδειξη: Δείτε το πρόγραμμα
     anharmonicOBS.f90 στο συνοδευτικό λογισμικό.)

9.11 Να αναπαράγετε τα αποτελέσματα του σχήματος 9.4. Στη συνέ-
     χεια, να επαναλάβετε τον υπολογισμό για λ = 2.0, 10.0, 100.0. Να
     κάνετε τους ίδιους υπολογισμούς για n = 20.

9.12 Να αναπαράγετε τα αποτελέσματα του σχήματος 9.5. Στη συνέ-
     χεια, να επαναλάβετε τον υπολογισμό n = 20.

9.13 Να αναπαράγετε τα αποτελέσματα του σχήματος 9.6. Στη συνέ-
     χεια, να επαναλάβετε τον υπολογισμό n = 3, 7, 12, 18, 24.

9.14 Να γράψετε πρόγραμμα που να υπολογίζει τις ενεργειακές στάθ-
     μες για τον αναρμονικό ταλαντωτή

                                 1    1
                        H(λ, µ) = p2 + x2 + λx4 + µx6                 (9.41)
                                 2    2
     και να υπολογίσετε τις En (λ) για n = 0, 3, 8, 20 για λ = 0.2 και
     µ = 0.2, 0.5, 1.0, 2.0, 10.0.

9.15 Να μεταβάλετε το πρόγραμμα της προηγούμενης άσκησης, έτσι
     ώστε να υπολογίζει τις αναμενόμενες τιμές ⟨x2 ⟩n (N, λ), ⟨p2 ⟩n (N, λ)
     και τα αντίστοιχα γινόμενα ∆x · ∆p. Να υπολογίσετε τις αναμε-
     νόμενες τιμές ⟨x2 ⟩n (λ), ⟨p2 ⟩n (λ) και ∆x · ∆p για n = 0, 3, 8, 20 για
     λ = 0.2 και µ = 0.2, 0.5, 1.0, 2.0, 10.0.

9.16 Να υπολογίσετε τα ζεύγη ενεργειακών τιμών En , En+1 για n =
     0, 4, 20 χρησιμοποιώντας το πρόγραμμα doublewell.f90 όταν λ =
     0.2, 0.1, 0.05, 0.02. Να υπολογίσετε τη διαφορά ∆n = En+1 − En . Τι
     παρατηρείτε;

9.17 Oρίστε τις τιμές ενέργειας
                                      (     )
                                    1     1
                             ϵn = − + n +     .
                                   4λ     2

     Συγκρίνετε τις τιμές των ενεργειών En , En+1 που υπολογίσατε στην
     προηγούμενη άσκηση με τις τιμές ϵn − ∆n /2 και ϵn + ∆n /2 αντί-
     στοιχα. Τι παρατηρείτε και γιατί;
422              ΚΕΦΑΛΑΙΟ 9. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ

9.18 Να κάνετε τις απαραίτητες μετατροπές στο πρόγραμμα
     doublewell.f90, έτσι ώστε να υπολογίζει τις αναμενόμενες τιμές
     ⟨x⟩± (λ) της σχέσης (9.40).
                              √ Να συγκρίνετε τις τιμές ⟨x⟩± (λ) με τις
     κλασικές τιμές x0 = ±1/ λ για λ = 0.2, 0.1, 0.05, 0.02, 0.01.

9.19 Να επαναλάβετε
              √        την προηγούμενη άσκηση, όταν οι καταστάσεις
     |±⟩ = (1/ 2)( |n⟩λ ± |n + 1⟩λ ) για n = 6 και n = 30.

9.20 Στον απλό αρμονικό ταλαντωτή, τα ενεργειακά επίπεδα ισαπέ-
     χουν μεταξύ τους, δηλ. ∆n = En+1 − En = 1, (∆n+2 − ∆n )/∆n = 0.
     Να υπολογίσετε τις παραπάνω ποσότητες για τον αναρμονικό τα-
     λαντωτή και το διπλό πηγάδι δυναμικού για λ = 1, 10, 100, 1000 και
     για n = 0, 8, 20. Τι συμπεραίνετε σε κάθε περίπτωση;
ΚΕΦΑΛΑΙΟ 10

Η Εξίσωση Schrödinger

Στο κεφάλαιο αυτό γίνεται μελέτη της χρονοανεξάρτητης εξίσωσης
Schrödinger για ένα μη σχετικιστικό σωμάτιο μάζας m, χωρίς σπιν, το
οποίο κινείται σε μία διάσταση υπό την επίδραση ενός στατικού δυ-
ναμικού πεδίου που δίνεται από τη συνάρτηση δυναμικής ενέργειας
(“δυναμικού”) V (x). Θα περιοριστούμε σε δέσμιες καταστάσεις. Οι λύ-
σεις της εξίσωσης στην περίπτωση αυτή δίνουν το διακριτό ενεργειακό
φάσμα {En }, καθώς και τις αντίστοιχες ιδιοκαταστάσεις που δίνονται,
σε αναπαράσταση θέσης, από τις κυματοσυναρτήσεις ψn (x).
   Από άποψη αριθμητικής ανάλυσης, το πρόβλημα είναι η λύση απλών
διαφορικών εξισώσεων ιδιοτιμών με συνοριακές συνθήκες. Μέρος της
λύσης είναι και η ιδιοτιμή της ενέργειας η οποία θα πρέπει, επίσης,
να υπολογιστεί. Θα χρησιμοποιήσουμε δύο μεθόδους, μία για τη λύση
του προβλήματος του σωματίου μέσα σε απειρόβαθο πηγάδι δυναμικού
το οποίο είναι άρτιο V (x) = V (−x), και μία που θα εφαρμόσουμε σε
γενικότερα δυναμικά και προτιμάται στις εφαρμογές. Η πρώτη είναι
μια εισαγωγή στο πρόβλημα και έχει μόνο ακαδημαϊκό και εκπαιδευ-
τικό ενδιαφέρον και ο βιαστικός αναγνώστης μπορεί να παραλείψει τη
μελέτη της παραγράφου 10.2 και να προχωρήσει στην παράγραφο 10.3.



10.1 Εισαγωγή
Η εξίσωση Schrödinger που ικανοποιούν οι κυματοσυναρτήσεις ψ(x) που
αναπαριστάνουν τις ιδιοκαταστάσεις ενέργειας είναι η

                     ℏ2 ∂ 2 ψ(x)
                 −               + V (x)ψ(x) = Eψ(x) ,        (10.1)
                     2m ∂x2

                                  423
424                      ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

μαζί με τη συνθήκη κανονικοποίησης
                           ∫ +∞
                   ⟨ψ|ψ⟩ =      ψ ∗ (x)ψ(x) dx = 1 .                       (10.2)
                                  −∞


Θυμίζουμε ότι ο τελεστής Ĥ που σε αναπαράσταση θέσης δίνεται από

                                     ℏ2 ∂ 2
                            Ĥ = −          + V (x̂) ,                     (10.3)
                                     2m ∂x2
είναι ερμιτιανός, δηλ. Ĥ † = Ĥ. Η εξίσωση (10.1) είναι μια εξίσωση
ιδιοτιμών
                            Ĥψ(x) = Eψ(x) ,                   (10.4)
η οποία έχει λύσεις ένα διακριτό σύνολο από πραγματικές συναρ-
τήσεις ψn∗ (x) = ψn (x) τέτοιες, ώστε Ĥψn (x) = En ψn (x). Οι αριθμοί
E0 ≤ E1 ≤ E2 ≤ . . . είναι πραγματικοί και αποτελούν το ενεργειακό
φάσμα του σωματιδίου στο πεδίο¹ V (x). Η ελάχιστη ενέργεια E0 αντι-
στοιχεί στη θεμελιώδη κατάσταση που βρίσκεται το σωματίδιο που δί-
νεται από μία μη τετριμμένη συνάρτηση ψ0 (x). Σε συμφωνία με την
αρχή απροσδιοριστίας του Heisenberg, στην κατάσταση αυτή ∆p > 0
και ∆x > 0, έτσι ώστε ∆p · ∆x ≥ ℏ/2.
   Οι ιδιοκαταστάσεις ψn (x) αποτελούν μια ορθοκανονική βάση
                             ∫ +∞
                 ⟨ψn |ψm ⟩ =      ψn∗ (x)ψm (x) dx = δn,m .     (10.5)
                                 ∞

έτσι ώστε οποιαδήποτε κυματοσυνάρτηση ϕ(x) που αναπαριστά την
κατάσταση |ϕ⟩ να δίνεται από το γραμμικό συνδυασμό
                                       ∑
                                       ∞
                              ϕ(x) =         cn ψn (x) .                   (10.6)
                                       n=0
                           ∫ +∞
Οι αριθμοί cn = ⟨ψn |ϕ⟩ = −∞ ψn∗ (x)ϕ(x) dx δίνουν την πιθανότητα pn =
|cn |2 να μετρηθεί η ενέργεια En στην κατάσταση |ϕ⟩.
     Επίσης, θυμίζουμε ότι για οποιαδήποτε κατάσταση |ϕ⟩ η συνάρτηση

                         pϕ (x) = |ϕ(x)|2 = ϕ∗ (x)ϕ(x)                     (10.7)
   ¹Το γεγονός ότι το ενεργειακό φάσμα του σωματιδίου είναι φραγμένο από κάτω
εξαρτάται από τη μορφή του δυναμικού. Υποθέτουμε ότι το V (x) είναι τέτοιο, ώστε η
ενέργεια E0 να είναι πεπερασμένη. Επίσης, στη μία διάσταση, το ενεργειακό φάσμα
ενός σωματιδίου για γενικά δυναμικά είναι μη εκφυλισμένο (δείτε όμως λ.χ. S. Kar,
R. Parwani, arXiv:0706.1135.)
10.1. ΕΙΣΑΓΩΓΗ                                                           425

είναι η πυκνότητα πιθανότητας εύρεσης του σωματιδίου στη θέση x, δηλ.
η πιθανότητα εύρεσης του σωματιδίου στο διάστημα [x1 , x2 ] δίνεται από
τη σχέση                          ∫            x2
                  Pϕ (x1 < x < x2 ) =               ϕ∗ (x)ϕ(x) dx .   (10.8)
                                              x1

Η σχέση κανονικοποίησης (10.2) σύμφωνα με την παραπάνω ερμηνεία
απηχεί τη διατήρηση της πιθανότητας (ανεξάρτητη του χρόνου, ιδιότητα
της χρονοεξαρτημένης εξίσωσης Schrödinger) και την πληρότητα (εδώ
τη βεβαιότητα παρατήρησης του σωματιδίου κάπου στον άξονα των x).
   Οι μετρήσιμες ποσότητες του παραπάνω κβαντομηχανικού συστήμα-
τος δίνονται από τελεστές Â(x̂, p̂) και οι αναμενόμενες τιμές τους, όταν
το σύστημα είναι σε μια κατάσταση |ϕ⟩, δίνονται από τη σχέση
                                   ∫ +∞
              ⟨Â⟩ϕ = ⟨ϕ| Â |ϕ⟩ =      ϕ∗ (x)Â(x̂, p̂)ϕ(x) dx .  (10.9)
                                         −∞

   Από αριθμητικής άποψης, το πρόβλημα ιδιοτιμών (10.1) ανάγεται
στη λύση μιας διαφορικής εξίσωσης δεύτερης τάξης. Οι διαφορές σε
σχέση με τις περιπτώσεις που μελετήσαμε σε προηγούμενα κεφάλαια
είναι:
   • Αντί να έχουμε πρόβλημα αρχικών τιμών (τιμές της συνάρτησης και
     παραγώγου σε ένα σημείο) έχουμε πρόβλημα συνοριακών τιμών
     (τιμές της συνάρτησης ή της παραγώγου σε δύο σημεία).
   • Η ιδιοτιμή (ενέργεια) είναι άγνωστη και πρέπει να προσδιοριστεί
     σαν μέρος της λύσης.
Θα παρουσιάσουμε μερικές απλές μεθόδους επίλυσης του προβλήματος,
ειδικές στη μία διάσταση, ως μια εισαγωγή στον τρόπο αριθμητικής
λύσης ενός προβλήματος με τα παραπάνω χαρακτηριστικά.
   Για την αριθμητική λύση της παραπάνω εξίσωσης καταφεύγουμε σε
επανακανονικοποίηση των συναρτήσεων και των παραμέτρων τους, έτσι
ώστε να έχουμε να κάνουμε με αδιάστατες ποσότητες. Για το λόγο αυτό,
η (10.1) γράφεται αρχικά στη μορφή:
                    d2        2m
                        ψ(x) + 2 (E − V (x))ψ(x) = 0 .     (10.10)
                   dx 2       ℏ
Επιπλέον, επιλέγουμε μια χαρακτηριστική κλίμακα μήκους L στο πρό-
βλημα και επαναορίζουμε x̃ = x/L. Ορίζουμε ψ̃(x̃) = ψ(x) ψ̃ ′ (x̃) =
dψ(x)/dx̃ = L dψ(x)/dx και παίρνουμε
                                 2mL2
                  ψ̃ ′′ (x̃) +        (E − V (x̃L))ψ̃(x̃) = 0 .       (10.11)
                                  ℏ2
426                        ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

Ορίζουμε v(x̃) = 2mL2 V (x)/ℏ2 = 2mL2 V (x̃L)/ℏ2 , ϵ = 2mL2 E/ℏ2 και αλ-
λάζουμε συμβολισμό x̃ → x, ψ̃ → ψ, οπότε παίρνουμε

                            ψ ′′ (x) = −(ϵ − v(x))ψ(x) .                     (10.12)

Οι λύσεις της (10.1) παίρνονται εύκολα από τις λύσεις της (10.12) χρη-
σιμοποιώντας το “λεξικό”²:

                 x            ℏ2                    ℏ2
           x→      ,   E=         ϵ,     V (x) =        v(x/L) .             (10.13)
                 L           2mL2                  2mL2
Τέλος, να σημειώσουμε ότι, αν πάρουμε p̃ = −i∂/∂ x̃ = −iL∂/∂x για την
ορμή, τότε θα έχουμε
                                   L
                               p̃ = p .                           (10.14)
                                   ℏ
Η σχέση μετάθεσης [x, p] = iℏ γίνεται τώρα [x̃, p̃] = i. Για την κινητική
              p2
ενέργεια T =     έχουμε
             2m
                                 ℏ2 2        ℏ2 ∂ 2
                          T =        p̃ = −            ,                     (10.15)
                                2mL2        2mL2 ∂ x̃2
και για τη Χαμιλτονιανή H = T + V
                                               (           )
              ℏ2 ( 2        )    ℏ2               ∂2
          H=      p̃ + v(x̃)  =                 − 2 + v(x̃) .                (10.16)
             2mL2               2mL2             ∂ x̃

Στις εξισώσεις των επόμενων παραγράφων, η περισπωμένη θα παρα-
λείπεται και θα γράφουμε x αντί για x̃.


10.2 Το απειρόβαθο πηγάδι δυναμικού
Το απλούστερο πρότυπο για τη μελέτη των ποιοτικών χαρακτηριστικών
των δέσμιων καταστάσεων είναι το απειρόβαθο πηγάδι δυναμικού πλά-
τους L όπου το σωμάτιο είναι περιορισμένο να βρίσκεται στο διάστημα
[−L/2, L/2]:                  {
                                0    |x| < 1
                      v(x) =                                  (10.17)
                                +∞ |x| ≥ 1

   ²Φυσικά αν κανονικοποιήσουμε τις λύσεις ψ̃(x̃) της (10.12) √ σύμφωνα με τη σχέση
∫ +∞ ∗
 −∞
     ψ̃ (x̃)ψ̃(x̃)dx̃ = 1, θα πρέπει να πάρουμε και ψ(x) = (1/ L)ψ̃(x/L) για να έχουμε
                            ∫ +∞
σωστή κανονικοποίηση −∞ ψ ∗ (x)ψ(x)dx = 1.
10.2. ΤΟ ΑΠΕΙΡΟΒΑΘΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                   427

               v                v                           v




                                v0                           v0




       −1          +1     −1           +1         −1   −a +a      +1               x
Σχήμα 10.1: Τα τρία δυναμικά που δίνονται από τις εξισώσεις (10.17), (10.26) και
(10.27).




Εδώ, σύμφωνα με τα λεγόμενα στο τέλος της προηγούμενης παραγρά-
φου, έχουμε επιλέξει το L να είναι το πλάτος του πηγαδιού και η με-
ταβλητή x να είναι αδιάστατη και να αντιστοιχεί στο x/(L/2) όταν το x
έχει διαστάσεις μήκους.
   Η λύση της (10.12) υπολογίζεται εύκολα. Τα χαρακτηριστικά που
πρέπει να τονίσουμε είναι ότι λόγω της συμμετρίας

                                     v(−x) = v(x) ,                                (10.18)

του δυναμικού (άρτια συνάρτηση της θέσης), οι λύσεις έχουν συγκεκρι-
μένη ομοτιμία (parity), ιδιότητα που θα μας βοηθήσει σημαντικά στην
αριθμητική αναζήτηση των λύσεων. Αυτό θα κάνει τη μέθοδο που θα
παρουσιάσουμε ειδική για δυναμικά που είναι άρτιες συναρτήσεις της
θέσης. Στην επόμενη παράγραφο θα αναπτύξουμε μία πιο γενική μέ-
θοδο που θα περιλαμβάνει και μη άρτια δυναμικά. Οι λύσεις χωρίζονται
                                                        (+)        (+)
σε δύο κατηγορίες, μία με άρτια ομοτιμία ψn (x) ≡ ψn (−x) = ψn (x)
                                                                 (−)
για n = 1, 3, 5, 7, . . . και μία με περιττή ομοτιμία ψn (x) ≡ −ψn (−x)
   (−)
= ψn (x) για n = 2, 4, 6, 8, . . ..
               {
                    (+)
                   ψn (x) = cos ( nπ
                                   2
                                     x) |x| < 1            n = 1, 3, 5, 7, . . .
    ψn (x) =        (−)                                                            (10.19)
                   ψn (x) = sin ( 2 x) |x| < 1
                                 nπ
                                                           n = 2, 4, 6, 8, . . .

όπου
                                            ( nπ )2
                                     ϵn =              ,                           (10.20)
                                              2
428                      ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER
                                              ∫1
και η κανονικοποίηση έχει επιλεγεί, έτσι ώστε³ −1 (ψn (x))2 dx = 1.
   Οι λύσεις που αναζητάμε είναι δυνατόν να βρεθούνε χρησιμοποιώ-
ντας τις ιδιότητες ομοτιμίας των κυματοσυναρτήσεων. Παρατηρούμε ότι
για τις λύσεις θετικής ομοτιμίας

                        ψn(+) (0) = A     ψn(+) ′ (0) = 0 ,             (10.21)

ενώ για τις λύσεις αρνητικής ομοτιμίας

                        ψn(−) (0) = 0    ψn(−) ′ (0) = A .              (10.22)

Η σταθερά A εξαρτάται από την κανονικοποίηση της κυματοσυνάρτη-
σης. Άρα, μπορούμε να θέσουμε A = 1 και στη συνέχεια, να επανακανο-
νικοποιήσουμε την κυματοσυνάρτηση, έτσι ώστε να ισχύει η (10.2). Οι
σχέσεις (10.21) και (10.22) μπορούν να θεωρηθούν ως οι αρχικές συνθή-
κες στην (10.12), αν η ενέργεια είναι γνωστή, οπότε με έναν αλγόριθμο
της αρεσκείας μας (λ.χ. Runge–Kutta 4ης τάξης) να προωθήσουμε τη
λύση προς τα x = ±1. Φυσικά, το πρόβλημα είναι ότι η ενέργεια ϵ δεν
είναι γνωστή. Αν η ενέργεια δεν είναι η επιτρεπτή από την κβαντική
θεωρία, τότε θα βρούμε ότι παραβιάζονται οι συνοριακές συνθήκες

                                ψn(±) (±1) = 0 .                        (10.23)
                                                    (±)
Όσο πλησιάζουμε τη σωστή ενέργεια, τόσο ψn (±1) → 0.
  Οπότε ακολουθούμε την παρακάτω διαδικασία:
   • Επιλέγουμε ενέργεια ϵ η οποία είναι χαμηλότερη από τη ζητού-
     μενη. Αν το δυναμικό δεν είναι απλό τετραγωνικό, χρησιμοποιούμε
     τις λύσεις ανάλογου τετραγωνικού προβλήματος για την εκτίμηση
     τάξης μεγέθους ή ξεκινάμε από ενέργεια λίγο μεγαλύτερη από την
     ελάχιστη δυναμική ενέργεια.
   • Επιλέγουμε την ομοτιμία της ζητούμενης λύσης και θέτουμε αρχι-
     κές συνθήκες σύμφωνα με τις (10.21) και (10.22).
   • Χρησιμοποιούμε τη μέθοδο Runge-Kutta για να προωθήσουμε τη
     λύση από⁴ x = 0 σε x = +1.
   ³Σύμφωνα με το “λεξικό” που αναφέραμε στο τέλος της προηγούμενης παραγρά-
φου, για πηγάδι δυναμικού όπου x ∈ [−L/2, L/2] έχουμε επιλέξει ως αδιάστατη
                                                 ℏ2        ℏ2 π 2 2      (+)
μεταβλητή την x/(L/2) ∈ [−1, 1]. Τότε En = 2m(L/2)  2 ϵn = 2mL2 n   και ψn (x) =
√                   (−)     √
  2/L cos (nπx/L), ψn (x) = 2/L sin (nπx/L). Επίσης, παρατηρείστε πως ϵn = p2n
όπως προκύπτει από τις σχέσεις (10.13) και (10.14).
   ⁴Από την ομοτιμία της συνάρτησης, συμπεραίνουμε την τιμή της συνάρτησης στο
διάστημα [−1, 0).
10.2. ΤΟ ΑΠΕΙΡΟΒΑΘΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                                                                             429

           1                                                                                 1
                                                          i= 0                                                                            i= 0
                                                          i= 1                                                                            i= 5
                                                          i= 2                                                                          i= 10
                                                          i= 3                                                                          i= 20
         0.8                                              i= 5                             0.01                                         i= 29
                                                        i= 12



         0.6                                                                             0.0001




                                                                       |ψi(x)-ψn=0(x)|
 ψi(x)




         0.4                                                                             1e-06




         0.2                                                                             1e-08




           0                                                                             1e-10




         -0.2                                                                            1e-12
                0   0.2       0.4       0.6       0.8            1                                0         0.2   0.4       0.6   0.8            1
                                    x                                                                                   x




Σχήμα 10.2: Η διαδικασία σύγκλισης της λύσης ψi (x) της (10.12) με το δυναμικό
(10.17) σαν συνάρτηση του αριθμού επαναλήψεων i στο πρόγραμμα well.f90. Αρχικά
επιλέγουμε energy = 2.0 και θετική ομοτιμία parity = 1. Μετά από 29 επαναλήψεις,
η λύση συγκλίνει στην θεμελιώδη κατάσταση ψ1 (x) = cos (πx/2) με ενέργεια ϵ = (π/2)2
με σχετική ακρίβεια ∼ 10−9 . Στο κάτω σχήμα βλέπουμε (σε λογαριθμική κλίμακα) το
σχετικό σφάλμα και τη μείωση του με τον αριθμό των επαναλήψεων. Η ενέργεια σε
κάθε επανάληψη είναι για i ≡iter = 1,2,3,5,10,12,20 energy = 2.4, 2.6, 2.4,
2.4625, 2.46875, 2.4673828125.



         • Αν δεν εκπληρώνεται η (10.23), αυξάνουμε την ενέργεια κατά δϵ
           (επιλεγμένη παράμετρος) και επαναλαμβάνουμε.
                                                                 (±)
         • Επαναλαμβάνουμε μέχρι η ψn (1) να αλλάξει πρόσημο. Τότε, μειώ-
           νουμε την ενέργεια κατά δϵ = −δϵ/2.
                                                                                                      (±)
         • Η διαδικασία τερματίζεται, όταν |ψn (1)| < δ για κατάλληλα επι-
           λεγμένο δ.
   Για την οργάνωση του κώδικα, αναφέρουμε πρώτα την εξέλιξη της
κυματοσυνάρτησης από x = 0 σε x = 1 με χρήση της μεθόδου Runge-
Kutta 4ης τάξης. Για τα βήματα ολοκλήρωσης χρησιμοποιούμε τον κώ-
δικα από το Κεφάλαιο 4 που βρίσκεται στο αρχείο rk.f90. Απομονώ-
νουμε μόνο την subroutine RKSTEP, που θα βρείτε στο πρόγραμμα της
σελίδας 226, και την αποθηκεύουμε σε ένα αρχείο rk.f90. Για την ολο-
κλήρωση της (10.12) χρησιμοποιούμε τη συνάρτηση ϕ(x) ≡ ψ ′ (x) και
παίρνουμε:
                                              ψ ′ (x) = ϕ(x)
                                              ϕ′ (x) = (v(x) − ϵ)ψ(x) ,                                                                 (10.24)
μαζί με τις αρχικές συνθήκες
                          ψ(0) = 1 ,           ϕ(0) ≡ ψ ′ (0) = 0 άρτια ομοτιμία
                          ψ(0) = 0 ,           ϕ(0) ≡ ψ ′ (0) = 1 περιττή ομοτιμία .                                                    (10.25)
430                        ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

Χρησιμοποιούμε το συμβολισμό ψ(x) → psi, ϕ(x) → psip. Οι συναρ-
τήσεις f1 και f2 που αντιστοιχούν στο δεξί μέλος της (10.24), είναι
οι παράγωγοι των ψ(x) και ϕ(x) αντίστοιχα. Άρα απλά f1=psip και
f2=(V-energy)*psi. Ο προγραμματισμός τους γίνεται σε ξεχωριστό αρ-
χείο, έτσι ώστε να είναι εύκολη η μελέτη και άλλων δυναμικών v(x).
Στο αρχείο wellInfSq.f90 προγραμματίζουμε το δυναμικό (10.17):

! ===========================================================
! f i l e : wellInfSq . f
!
! Functions used i n RKSTEP r o u t i n e . Here :
! f1 = psip ( x ) = psi ( x ) ’
! f 2 = p s i p ( x ) ’= p s i ( x ) ’ ’
!
! A l l one has t o s e t i s V , t h e p o t e n t i a l
! ===========================================================
!−−−−−−−− t r i v i a l f u n c t i o n : d e r i v a t i v e o f p s i
r e a l ( 8 ) f u n c t i o n f1 ( x , psi , psip )
  r e a l ( 8 ) : : x , psi , psip
  f1=psip
end f u n c t i o n f1
! ===========================================================
!−−−−−−−− t h e second d e r i v a t i v e o f wavefunction :
! p s i p ( x ) ’ = p s i ( x ) ’ ’ = −(E−V) p s i ( x )
r e a l ( 8 ) f u n c t i o n f2 ( x , psi , psip )
   i m p l i c i t none
  r e a l ( 8 ) : : x , psi , psip , energy , V
  common / params / energy
!−−−−−−− p o t e n t i a l , s e t here :
  V = 0.0 D0
!−−−−−−− S c h r o e d i n g e r eq : RHS
  f2 = ( V−energy ) * psi
end f u n c t i o n f2
! ===========================================================

Τονίζουμε πως η ενέργεια ϵ = energy τοποθετείται σε common block,
ώστε να μπορούμε να τη μεταβάλλουμε από το κυρίως πρόγραμμα.
   Το κυρίως πρόγραμμα βρίσκεται στο αρχείο well.f90. Αφού ζητή-
σουμε τα δεδομένα από το χρήστη (energy, parity, Nx) ξεκινάει η
αναζήτηση της σωστής ενέργειας ξεκινώντας από την αρχικά επιλεγ-
μένη τιμή

 do while ( iter . lt . 10000)
  ............
  i f ( DABS ( psinew ) . le . e p s i l o n ) EXIT
10.2. ΤΟ ΑΠΕΙΡΟΒΑΘΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                      431

  i f ( psinew * psiold . lt . 0.0 D0 ) de = −0.5D0 * de
  energy = energy + de
   ............
 enddo                             ! do while

η οποία σταματάει όταν ψ(1) =psinew έχει απόλυτη τιμή μικρότερη
από epsilon, δηλ. όταν θεωρήσουμε ότι η συνθήκη (10.23) ικανοποιεί-
ται με την επιθυμητή ακρίβεια. Αν το πρόσημο της κυματοσυνάρτησης
στο x = 1 αλλάξει (psinew*psiold< 0), τότε έχουμε ξεπεράσει τη σω-
στή τιμή της ενέργειας, οπότε αλλάζουμε το πρόσημο του βήματος de
και μειώνουμε το μέγεθός του στο μισό. Μέσα στο βρόχο εκτελείται
ο αλγόριθμος που περιγράφεται στη σελίδα 428. Μετά την έξοδο από
τον παραπάνω βρόχο, η ενέργεια έχει προσδιοριστεί με τη ζητούμενη
ακρίβεια και το υπόλοιπο πρόγραμμα απλά καταγράφει τη λύση στο
array psifinal(STEPS). Τα αποτελέσματα καταγράφονται στο αρχείο
psi.dat. Παρατηρήστε τη χρήση της μεταβλητής parity για την ενο-
ποιημένη αντιμετώπιση των περιπτώσεων parity= ±1. Ολόκληρος ο
κώδικας παρατίθεται παρακάτω:

! ===========================================================
! f i l e : well . f
!
! Computation o f energy e i g e n v a l u e s and e i g e n f u n c t i o n s
! o f a p a r t i c l e i n an i n f i n i t e w e l l with V(−x )=V( x )
!
! Input : energy : i n i t i a l guess f o r energy
!                 p a r i t y : d e s i r e d p a r i t y o f s o l u t i o n (+/ − 1 )
!                 Nx−1 : Number o f RK4 s t e p s from x=0 t o x=1
! Output : energy : energy e i g e n v a l u e
!                 p s i . dat : f i n a l p s i ( x )
!                 a l l . dat : a l l p s i ( x ) f o r t r i a l e n e r g i e s
! ===========================================================
program even_potential_well
   i m p l i c i t none
  i n t e g e r , parameter : : P=10000
  r e a l ( 8 ) : : energy , dx , x , e p s i l o n , de
  common / params / energy
  i n t e g e r : : parity , Nx , iter , i
  r e a l ( 8 ) : : psi , psip , psinew , psiold
  r e a l ( 8 ) : : psifinal(−P : P ) , xstep(−P : P )
!−−−−−− Input :
  p r i n t * , ’ Enter energy , p a r i t y , Nx : ’
  read * , energy , parity , Nx
   i f ( Nx . gt . P ) s t o p ’Nx > P ’
   i f ( parity . gt . 0) then
     parity = 1
432                         ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

 else
   parity = −1
 endif
 p r i n t * , ’ # ####################################### ’
 p r i n t * , ’ # E s t a r t = ’ , energy , ’ p a r i t y = ’ , parity
 dx            = 1 . 0 D0 / ( Nx −1)
 e p s i l o n = 1 . 0 D−6
 p r i n t * , ’ # Nx= ’ , Nx , ’ dx = ’ , dx , ’ eps= ’ , e p s i l o n
 p r i n t * , ’ # ####################################### ’

!−−−−− C a l c u l a t e :
 open ( u n i t =11 , f i l e = ’ a l l . dat ’ )
 iter            = 0
 psiold = 0.0 D0 ! c a l c u l a t e d v a l u e s o f p s i a t x=1
 psinew = 1 . 0 D0
 de              = 0 . 1 D0 * DABS ( energy ) ! o r i g i n a l change i n energy
 do while ( iter . lt . 10000)
!−−−−−−−−−− I n i t i a l c o n d i t i o n s a t x=0
    x            = 0.0 D0
    i f ( parity . eq . 1 ) then
      psi        = 1 . 0 D0
      psip = 0.0 D0
    else
      psi        = 0.0 D0
      psip = 1 . 0 D0
    endif
    w r i t e ( 1 1 , * ) iter , energy , x , psi , psip
! −−−−−−−−− Use Runge−Kutta t o forward t o x=1
    do i =2 , Nx
      x          = ( i−2) * dx
      c a l l RKSTEP ( x , psi , psip , dx )
      w r i t e ( 1 1 , * ) iter , energy , x , psi , psip
    enddo                                     ! do i =2 ,Nx
    psinew = psi
    p r i n t * , iter , energy , de , psinew
! −−−−−−−−− Stop i f v a l u e o f p s i c l o s e t o 0
    i f ( DABS ( psinew ) . le . e p s i l o n ) EXIT
! −−−−−−−−− Change d i r e c t i o n o f energy s e a r c h :
    i f ( psinew * psiold . lt . 0.0 D0 ) de = −0.5D0 * de
    energy = energy + de
    psiold = psinew
    iter         = iter + 1
 enddo                                        ! do while
  close (11)
!We found t h e s o l u t i o n : c a l c u l a t e i t once aga in and s t o r e i t
  i f ( parity . eq . 1 ) then
    psi          = 1 . 0 D0
    psip         = 0.0 D0
    node         = 0 ! count number o f nodes o f f u n c t i o n
10.2. ΤΟ ΑΠΕΙΡΟΒΑΘΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                            433

  else
   psi          = 0.0 D0
   psip         = 1 . 0 D0
   node         = 1
 endif
 x                          = 0.0 D0
 xstep           (0)        = x
 psifinal ( 0 )             = psi ! a r r a y t h a t s t o r e s p s i ( x )
 psiold                     = 0.0 D0
!−−−−−−− Use Runge−Kutta t o move t o x=1
 do i =2 , Nx
   x                        = ( i−2) * dx
   c a l l RKSTEP ( x , psi , psip , dx )
   xstep           ( i−1) = x
   psifinal ( i−1) = psi
! −−−−−− Use p a r i t y t o compute p s i (−x )
   xstep           (1−i ) = −x
   psifinal(1−i ) = parity * psi
!−−−−−−− P r i n t f i n a l s o l u t i o n :
 open ( u n i t =11 , f i l e = ’ p s i . dat ’ )
 p r i n t * , ’ F i n a l r e s u l t : E= ’ , energy , ’ n= ’ , node ,&
           ’ p a r i t y = ’ , parity
 w r i t e ( 1 1 , * ) ’ # E= ’                 , energy , ’ n= ’ , node ,&
           ’ p a r i t y = ’ , parity
 do i=−(Nx −1) , ( Nx −1)
   w r i t e ( 1 1 , * ) xstep ( i ) , psifinal ( i )
 enddo
  close (11)
end program even_potential_well

Η μεταγλώττιση και το τρέξιμο γίνεται εύκολα με τις εντολές

> gfortran well . f90 wellInfSq . f90 rk . f90 −o well
> . / well
  Enter energy , parity , Nx :
2.0 1 400
  # #######################################
  # Estart= 2.0000000000000000              parity= 1
  # Nx= 400 dx = 2.50626566416E−003 eps= 9.9999999999E−007
  # #######################################
   0    2.0000000000000         0.200000000000     0.15594369476721
   1    2.2000000000000         0.200000000000     8.74448016806986E−2
 ............................................
  28    2.4674072265624         1.220703125000E−5 −1.95005436858826E−6
  29    2.4674011230468        −6.103515625000E−6 −7.24621589476086E−9
  Final result : E=       2.4674011230468746      parity=        1

Η τιμή της ενέργειας προσδιορίζεται σε ϵ =2.467401123 που μπορεί να
434                       ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

   n        (nπ/2)2       Τετραγωνικό           Τριγωνικό     Διπλό Πηγάδι
    1    2.467401100      2.467401123         5.248626709     15.294378662
    2    9.869604401      9.869604492         14.760107422    15.350024414
    3    22.2066099       22.2066040           27.0690216      59.1908203
    4      39.47841         39.47839             44.51092        59.96887
    5     61.6850275       61.6850242          66.6384315      111.3247375
   6       88.82643         88.82661             93.84588       126.37628
    7    120.902653        120.902664          125.878830      150.745215
    8      157.91367        157.91382           162.92569       194.07578
    9     199.859489       199.859490          204.845026       235.017471
   10      246.74011        246.74060           251.74813       275.67383
   11    298.555533        298.555554          303.545814      331.428306
   12      355.3057         355.3064             360.3107        388.7444


Πίνακας 10.1: Οι ιδιοτιμές της ενέργειας για το τετραγωνικό, τριγωνικό και διπλό
πηγάδι απειρόβαθου δυναμικού (Εξισώσεις (10.17), (10.26) με v0 = 10 και (10.27)
με v0 = 100, a = 0.3). Παρατηρούμε την εξαιρετική ακρίβεια προσδιορισμού των
ενεργειακών σταθμών για το τετραγωνικό δυναμικό. Επίσης, για τα άλλα δυναμικά,
παρατηρούμε ότι καθώς απομακρυνόμαστε από τον πάτο του δυναμικού, οι ενερ-
γειακές στάθμες τείνουν να γίνουν οι ίδιες: Το σωμάτιο παύει να επηρεάζεται από τις
λεπτομέρειες του δυναμικού στον πάτο, καθώς αυξάνεται η ενέργειά του. Στο διπλό
πηγάδι δυναμικού παίρνουμε E1 ≈ E2 και E3 ≈ E4 σύμφωνα με την ανάλυση στη
σελίδα 435.


συγκριθεί με την ακριβή τιμή ϵ = (π/2)2 ≈ 2.467401100. Το ποσοστό
σφάλματος είναι ∼ 10−8 , άρα μάλλον καλά πήγαμε! Η διαδικασία της
σύγκλισης φαίνεται στο σχήμα 10.2.
   Για την εύρεση των διεγερμένων καταστάσεων αλλάζουμε την ομο-
τιμία και διαλέγουμε κάθε φορά ενέργεια ελαφρά μεγαλύτερη από τη
λύση που έχουμε ήδη βρει⁵. Τα αποτελέσματα δίνονται στον πίνακα
10.1. Παρατηρούμε την εξαιρετική συμφωνία του αριθμητικού υπολογι-
σμού συγκρινόμενου με το αναλυτικά γνωστό αποτέλεσμα ϵn = (nπ/2)2 .

  Τελειώνουμε την παράγραφο με δύο ακόμα παραδείγματα δυναμι-
κών. Πρώτα του δυναμικού με τριγωνικό σχήμα στον πάτο
                                     {
                                         v0 |x| |x| < 1
                            v(x) =                                        (10.26)
                                         +∞ |x| > 1

   ⁵Προσοχή: αν τα επίπεδα ενέργειας είναι πολύ κοντά, μπορούμε να κρατάμε την
αρχική ενέργεια σταθερή και να αλλάζουμε μόνο την ομοτιμία.
10.2. ΤΟ ΑΠΕΙΡΟΒΑΘΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                               435

καθώς και ένα διπλό πηγάδι δυναμικού με
                           
                            v0     |x| < a
                    v(x) =    0 a < |x| < 1                     (10.27)
                           
                             +∞     1 < |x|
όπου οι παράμετροι v0 , a είναι θετικοί αριθμοί. Η μορφή των δυναμικών
δείχνεται πρόχειρα στο σχήμα 10.1.
   Για το τριγωνικό δυναμικό επιλέγουμε v0 = 10, ενώ για το διπλό πη-
γάδι v0 = 100 και a = 0.3. Οι μεταβολές στον κώδικά γίνονται στο αρχείο
wellInfSq.f90 και αποθηκεύονται μέσα στα αρχεία wellInfTr.f90 και
wellInfDbl.f90 αντίστοιχα. Αλλάζουμε μόνο τη γραμμή του κώδικα
που αφορά τη συνάρτηση του δυναμικού μέσα στη συνάρτηση f2. Λ.χ.
στο αρχείο wellInfTr.f90

!−−−−−−− p o t e n t i a l , s e t here :
 V = 10.0 D0 * DABS ( x )

ενώ στο αρχείο wellInfDbl.f90

!−−−−−−− p o t e n t i a l , s e t here :
  i f ( DABS ( x ) . le . 0.3 D0 ) then
    V = 100.0 D0
  else
    V = 0.0 D0
 endif

Η ανάλυση γίνεται με τον ίδιο ακριβώς τρόπο και τα αποτελέσματα
για το ενεργειακό φάσμα δίνονται στον πίνακα 10.1. Παρατηρούμε ότι
οι υψηλές ενεργειακές στάθμες των τριών δυναμικών τείνουν να γί-
νουν οι ίδιες, καθώς το n γίνεται πολύ μεγάλο. Ο λόγος είναι ότι όταν
το σωμάτιο έχει πολύ υψηλή ενέργεια σε σχέση με το v0 , επηρεάζεται
πολύ λίγο από τις λεπτομέρειες της μορφής του δυναμικού στον πάτο
και ουσιαστικά βλέπει ένα απειρόβαθο πηγάδι δυναμικού. Στην περί-
πτωση του τριγωνικού δυναμικού, οι πρώτες ενεργειακές στάθμες είναι
υψηλότερες από αυτές του τετραγωνικού δυναμικού, αφού κατά μέσο
όρο η δυναμική ενέργεια είναι μεγαλύτερη και η μορφή του δυναμικού
τείνει να περιορίσει το σωμάτιο σε μικρότερη περιοχή (∆x μειώνεται,
άρα ∆p αυξάνεται). Το τελευταίο φαίνεται και στο σχήμα 10.3, όπου
συγκρίνονται οι κυματοσυναρτήσεις των δύο δυναμικών.
   Το ίδιο παρατηρούμε και για το διπλό πηγάδι δυναμικού. Επιπλέον,
βλέπουμε και τον προσεγγιστικό εκφυλισμό των 4 πρώτων ενεργεια-
κών σταθμών ανά ζεύγη, κάτι που αναμένεται σε δυναμικά της μορφής
436                                     ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

αυτής. Αυτό σας θυμίζω μπορεί να κατανοηθεί√ποιοτικά παρατηρώ-
ντας λ.χ. ότι√οι κυματοσυναρτήσεις ψ+ (x) = (1/ 2)(ψ1 (x) + ψ2 (x)) και
ψ− (x) = (1/ 2)(ψ1 (x) − ψ2 (x)) αντιστοιχούν σε κυματοσυναρτήσεις κα-
ταστάσεων στις οποίες το σωμάτιο σχεδόν περιορίζεται στο αριστερό
και δεξί πηγάδι αντίστοιχα. Αυτό μπορείτε να το δείτε στο σχήμα 10.4.
Καθώς v0 → +∞, τα δύο πηγάδια αποσυζεύγνυνται και οι ψ± (x) τείνουν
προς τις κυματοσυναρτήσεις θεμελιώδους κατάστασης δύο ανεξάρτη-
των απειρόβαθων πηγαδιών πλάτους 1 − a και οι αντίστοιχες ενέργειες
σε ϵ+,1 = ϵ−,1 = (π/(1 − a))2 . Η διαφορά των ϵ1 και ϵ2 από τις τιμές αυτές
οφείλεται στην πεπερασμένη τιμή του δυναμικού v0 (δείτε άσκηση 4).
                     1.2                                                   1.5
                                                    Square                                               Square
                                                   Triangle                                             Triangle

                       1
                                                                             1


                     0.8
                                                                           0.5


                     0.6
             ψ1(x)




                                                                  ψ2(x)
                                                                             0

                     0.4


                                                                           -0.5
                     0.2


                                                                            -1
                       0



                     -0.2                                                  -1.5
                            -1   -0.5    0   0.5              1                   -1   -0.5   0   0.5              1
                                         x                                                    x

                       1                                                   1.5
                                                    Square                                               Square
                                                   Triangle                                             Triangle


                                                                             1
                     0.5



                                                                           0.5

                       0
             ψ3(x)




                                                                  ψ4(x)




                                                                             0


                     -0.5

                                                                           -0.5



                      -1
                                                                            -1




                     -1.5                                                  -1.5
                            -1   -0.5    0   0.5              1                   -1   -0.5   0   0.5              1
                                         x                                                    x

                     1.5                                                   1.5
                                                    Square                                               Square
                                                   Triangle                                             Triangle


                       1                                                     1




                     0.5                                                   0.5
                                                                  ψ12(x)
             ψ8(x)




                       0                                                     0




                     -0.5                                                  -0.5




                      -1                                                    -1




                     -1.5                                                  -1.5
                            -1   -0.5    0   0.5              1                   -1   -0.5   0   0.5              1
                                         x                                                    x




Σχήμα 10.3: Οι κυματοσυναρτήσεις των ενεργειακών ιδιοκαταστάσεων για n =
1, 2, 3, 4, 8, 12 για το απειρόβαθο τετραγωνικό και τριγωνικό δυναμικό των εξισώσεων
(10.17) και (10.26) με v0 = 10. Παρατηρούμε την επίδραση του τριγωνικού δυναμι-
κού στις κυματοσυναρτήσεις μικρού n, ενώ για n ≥ 8 η διάκριση γίνεται ολοένα και
μικρότερη.


   Τέλος, να τονίσουμε τους περιορισμούς της μεθόδου αυτής. Καταρ-
χήν, θυμίζουμε ότι μπορούμε να την χρησιμοποιήσουμε μόνο σε απει-
ρόβαθα πηγάδια δυναμικού που είναι άρτια v(x) = v(−x). Αυτό χρη-
σιμοποιήθηκε στις αρχικές συνθήκες (10.21) και (10.22) που ισχύουν
για καταστάσεις δεδομένης ομοτιμίας. Όταν το δυναμικό είναι άρτιο,
10.2. ΤΟ ΑΠΕΙΡΟΒΑΘΟ ΠΗΓΑΔΙ ΔΥΝΑΜΙΚΟΥ                                                            437
                2                                        2
                                           ψ+(x)                                    ψ-(x)
                                           ψ1(x)                                    ψ1(x)
                                           ψ2(x)                                    ψ2(x)
              1.5                                      1.5



                1                                        1



              0.5                                      0.5



                0                                        0



              -0.5                                     -0.5



               -1                                       -1



              -1.5                                     -1.5
                     -1   -0.5   0   0.5           1          -1   -0.5   0   0.5           1
                                 x                                        x

                2                                        2
                                           ψ+(x)                                    ψ-(x)
                                           ψ3(x)                                    ψ3(x)
                                           ψ4(x)                                    ψ4(x)
              1.5                                      1.5


                1                                        1


              0.5                                      0.5


                0                                        0


              -0.5                                     -0.5


               -1                                       -1


              -1.5                                     -1.5


               -2                                       -2
                     -1   -0.5   0   0.5           1          -1   -0.5   0   0.5           1
                                 x                                        x

              1.5                                      1.5
                                           ψ+(x)                                    ψ-(x)
                                           ψ5(x)                                    ψ5(x)
                                           ψ6(x)                                    ψ6(x)

                1                                        1




              0.5                                      0.5




                0                                        0




              -0.5                                     -0.5




               -1                                       -1




              -1.5                                     -1.5
                     -1   -0.5   0   0.5           1          -1   -0.5   0   0.5           1
                                 x                                        x



                                          √
Σχήμα 10.4: Οι συναρτήσεις ψ± (x) = (1/ 2)(ψn (x) ± ψn+1 (x)) για n = 1, 3, 5 του
διπλού πηγαδιού δυναμικού (Εξ. (10.27) με v0 = 100, a = 0.3) φαίνονται με έντονο
χρώμα. Παρατηρούμε ότι στις καταστάσεις αυτές όσο πιο έντονος είναι ο προσεγγι-
στικός εκφυλισμός, τόσο εντονότερος είναι και ο εντοπισμός του σωματιδίου στο δεξί
ή αριστερό μέρος του διπλού πηγαδιού. Με αχνότερο χρώμα δείχνονται οι κυματοσυ-
ναρτήσεις των ιδιοκαταστάσεων της ενέργειας για n = 1, 2, 3, 4, 5, 6.




οι ιδιοκαταστάσεις της ενέργειας έχουν καλά καθορισμένη ομοτιμία.
Το άλλο πρόβλημα γίνεται αντιληπτό, αν κάνετε την άσκηση 4: Αν η
κυματοσυνάρτηση είναι σχεδόν μηδέν για x = 0, όπως συμβαίνει όταν
v(0) ≫ ϵ, τότε τα αριθμητικά σφάλματα μας εμποδίζουν να ολοκληρώ-
σουμε με μεγάλη ακρίβεια από x = 0 σε x = 1. Το ίδιο θα συμβαίνει
και όταν έχουμε να περάσουμε μέσα από ψηλά φράγματα δυναμικού.
Παρόλα αυτά είναι μια απλή μέθοδος που μπορεί να χρησιμοποιηθεί
και στην περίπτωση που έχουμε δέσμιες καταστάσεις σε ένα άρτιο δυ-
ναμικό που δεν είναι απειρόβαθο: Στην περίπτωση αυτή παίρνουμε το
δυναμικό που μας δίνεται και απλά τοποθετούμε τους αδιαπέραστους
τοίχους σε σημεία όπου η κυματοσυνάρτηση αναμένεται να είναι στην
περιοχή τους πρακτικά παντού μηδέν. Τότε η επίδραση του τείχους θα
είναι πολύ μικρή πάνω στις λύσεις του αρχικού προβλήματος. Δείτε το
πρόβλημα 3.
438                        ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

10.3 Δέσμιες Καταστάσεις




Σχήμα 10.5: Ολοκλήρωση της εξίσωσης Schrödinger σύμφωνα με τον αλγόριθμο της
παραγράφου 10.3. Οι κυματοσυναρτήσεις και οι παράγωγοί τους ορίζονται να έχουν
μικρές τιμές στις κλασικά απαγορευμένες τιμές του x xmin και xmax. Το σημείο xm
υπολογίζεται από τη σχέση v(xm ) = ϵ. Οι κυματοσυναρτήσεις προωθούνται μέχρι
το xm σύμφωνα με τις (10.24) και παίρνουμε τις ψ (+) (x) και ψ (−) (x). Αφού ορίσουμε
ψ (+) (xm ) = ψ (−) (xm ) επανακανονικοποιώντας την ψ (−) (x), μεταβάλλουμε την ενέργεια
μέχρι οι παράγωγοι ψ (+)′ (xm ) ≈ ψ (−)′ (xm ).


Το σπουδαιότερο πρόβλημα με την απλή μέθοδο που παρουσιάσαμε
στην παράγραφο 10.2 είναι ότι παρουσιάζει αριθμητική αστάθεια, όταν
προσπαθούμε να λύσουμε ένα πρόβλημα δέσμιων καταστάσεων. Αυτό
θα το συναντήσατε ήδη αν προσπαθήσατε να λύσετε την άσκηση 3
όπου μετακινώντας τα τείχη μακρύτερα από |x| = 3 η σύγκλιση του
αλγόριθμου γίνεται ιδιαίτερα δυσχερής. Για να το καταλάβουμε αυτό,
όταν ολοκληρώνουμε την εξίσωση Schrödinger από την ελεύθερη πε-
ριοχή προς την κλασικά απαγορευμένη, περνάμε από ταλαντούμενη κυ-
ματοσυνάρτηση μέτρου της τάξης της μονάδας σε κυματοσυνάρτηση η
οποία έχει εκθετική απόσβεση. Δεν πρέπει όμως να ξεχνάμε ότι για
|x| → +∞, μαζί με τη φυσικά αποδεκτή λύση ψ(x) ∼ e−k|x| έχουμε
και τη λύση ψ(x) ∼ e+k|x| η οποία αποκλίνει εκθετικά γρήγορα και την
απορρίπτουμε λόγω της (10.2). Έτσι, χρειάζεται πολύ λεπτή ρύθμιση
της τιμής της ενέργειας για την επίτευξη σύγκλισης, ειδικά αν ολοκλη-
ρώνουμε για μεγάλα |x|. Για το λόγο αυτό, είναι προτιμότερο να ολο-
10.3. ΔΕΣΜΙΕΣ ΚΑΤΑΣΤΑΣΕΙΣ                                                    439

κληρώνουμε από την περιοχή εκθετικής απόσβεσης προς την κλασικά
επιτρεπόμενη περιοχή. Η ιδέα είναι να ξεκινήσουμε από τέτοιες περιο-
χές και να ταιριάξουμε τις τιμές των λύσεων και των παραγώγων τους
σε κατάλληλα επιλεγμένα σημεία. Το ταίριασμα γίνεται προσπαθώντας
να εντοπίσουμε την ενέργεια που η τιμή της κάνει το λόγο

                    ψ (+)′ (xm )/ψ (+) (xm ) − ψ (−)′ (xm )/ψ (−) (xm )
          f (ϵ) =                                                         (10.28)
                    ψ (+)′ (xm )/ψ (+) (xm ) + ψ (−)′ (xm )/ψ (−) (xm )

να είναι μηδέν μέσα στα όρια της αριθμητικής ακρίβειας που θέτουμε σε
κατάλληλα επιλεγμένο σημείο xm . Το σημείο xm είναι καλό να βρίσκε-
ται μέσα στην κλασικά επιτρεπόμενη περιοχή (ϵ > v(x)) και, συνήθως,
το παίρνουμε στο σημείο όπου ϵ = v(x). Με κατάλληλη επανακανονι-
κοποίηση των ψ (±) (x), επιλέγουμε ψ (+) (xm ) = ψ (−) (xm ), οπότε f (ϵ) ≪ 1
σημαίνει ότι ψ (+)′ (xm ) ≈ ψ (−)′ (xm ). Ο παρονομαστής της (10.28) απλά
θέτει την κλίμακα στην ακρίβεια που θέλουμε να πετύχουμε⁶.
   Η ιδέα σκιαγραφείται γραφικά στο σχήμα 10.5. Ο αλγόριθμος έχει
ως εξής:

   • Επιλέγουμε το διάστημα ολοκλήρωσης [xmin,xmax].

   • Επιλέγουμε τις αρχικές συνθήκες ολοκλήρωσης ψ (−) (xmin),
     ψ (−)′ (xmin), ψ (+) (xmax), ψ (+)′ (xmax). Η επιλογή γίνεται ανάλογα με
     το πρόβλημα, δηλ. με το δυναμικό v(x) που θα μελετήσουμε. Συνή-
     θως τα xmin, xmax είναι αρκετά βαθιά μέσα στην κλασικά απαγο-
     ρευμένη περιοχή και παίρνουμε τα ψ (−) (xmin), ψ (+) (xmax) μηδέν ή
     εκθετικά μικρά (∼ e−k|x| , k 2 = v(x) − ϵ). Οι παράγωγοι ψ (−)′ (xmin),
     ψ (+)′ (xmax) παίρνονται ανάλογα μικρές. Η ελευθερία επιλογής της
     σταθεράς κανονικοποίησης της ψ(x) μας επιτρέπει οι επιλογές αυ-
     τές να είναι σχετικά αυθαίρετες. Το σχετικό πρόσημο των πα-
     ραγώγων (που καθορίζεται λ.χ. από την ομοτιμία σε περίπτωση
     συμμετρικού δυναμικού) δεν έχει αρχικά σημασία και λαμβάνεται
     υπόψη στην επανακανονικοποίηση της ψ (−) (x), όταν παρακάτω θα
     κάνουμε την ταύτιση των τιμών στο σημείο xm. Σε ένα απειρόβαθο
     πηγάδι, τα xmin,xmax είναι τα σημεία απειρισμού του δυναμικού
     και φυσικά ψ (−) (xmin) = ψ (+) (xmax) = 0.

   • Επιλέγουμε αρχική ενέργεια ϵ και βήμα μεταβολής της δϵ.

   ⁶Προσοχή: αν έχουμε την ατυχία να επιλέξουμε xm τέτοιο ώστε ψ ′ (xm ) = 0, τότε
το παραπάνω κριτήριο μάλλον θα αποτύχει.
440                     ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

  • Από την τιμή της ενέργειας υπολογίζουμε το σημείο xm, το οποίο
    βρίσκεται κοντά στο πιο αριστερό σημείο που λύνει την εξίσωση⁷
    v(x) = ϵ.

  • Προωθούμε τις εξισώσεις (10.24) από το xmin στο xm και παίρ-
    νουμε τις ψ (−) (x),ψ (−)′ (x).

  • Προωθούμε τις εξισώσεις (10.24) από το xmax στο xm και παίρ-
    νουμε τις ψ (+) (x),ψ (+)′ (x).

  • Επανακανονικοποιούμε την ψ (−) (x) → ψ (−) (x)(ψ (+) (xm)/ψ (−) (xm)),
    έτσι ώστε να έχουμε ψ (+) (xm) = ψ (−) (xm).

  • Υπολογίζουμε το λόγο f (ϵ) της (10.28).

  • Αν η |f (ϵ)| είναι μικρότερη από μια μικρή σταθερά ανοχής, στα-
    ματάμε και θεωρούμε τον υπολογισμό της ιδιοενέργειας και ιδιο-
    κατάστασης ικανοποιητική.

  • Αν η f (ϵ) άλλαξε πρόσημο από την προηγούμενη επανάληψη, ση-
    μαίνει πως μόλις περάσαμε την αναζητούμενη τιμή της ιδιοενέρ-
    γειας. Μεταβάλλουμε τη φορά αναζήτησης δϵ → −δϵ/2.

  • Μεταβάλλουμε την τιμή της ενέργειας ϵ → ϵ + δϵ και επαναλαμ-
    βάνουμε από το τέταρτο βήμα.

Μετά από τον παραπάνω αλγόριθμο, η κυματοσυνάρτηση αποτελεί καλή
προσέγγιση της ιδιοκατάστασης ψn (x) με ιδιοενέργεια ϵn . Περαιτέρω
επεξεργασία αφορά την κανονικοποίηση σύμφωνα με την (10.2) και
ο υπολογισμός των αναμενόμενων τιμών σύμφωνα με την (10.9). Εν-
διαφέρον παρουσιάζει και ο αριθμός n0 των σημείων μηδενισμού της
κυματοσυνάρτησης που δίνει την τάξη του ενεργειακού επιπέδου n της
ενέργειας ϵn (n = n0 + 1).
   Παρατίθεται το πρόγραμμα που κωδικοποιεί τον παραπάνω αλγό-
ριθμο. Κατ’ αρχήν, όπως και στην προηγούμενη παράγραφο, χρησιμο-
ποιούμε τη ρουτίνα RKSTEP (βλ. σελίδα 226) που πραγματοποιεί ένα
βήμα Runge-Kutta 4ης τάξης την οποία προγραμματίζουμε στο αρχείο
rk.f90.
   Το δυναμικό προγραμματίζεται σε μια συνάρτηση V(x). Οι αρχι-
κές συνθήκες στα σημεία xmin και xmax προγραμματίζονται στη ρου-
τίνα boundary(xmin, xmax, psixmin, psipxmin, psixmax, psipxmax) η
οποία επιστρέφει στο κυρίως πρόγραμμα τις τιμές psixmin= ψ (−) (xmin),
  ⁷Προσοχή, το σημείο αυτό αλλάζει όταν αλλάζουμε την ϵ.
10.3. ΔΕΣΜΙΕΣ ΚΑΤΑΣΤΑΣΕΙΣ                                                       441

psipxmin= ψ (−)′ (xmin), psixmax= ψ (+) (xmax), psipxmax= ψ (−)′ (xmax). Αυ-
τές τις τοποθετούμε σε ένα αρχείο του οποίου το όνομα έχει σχέση με
το δυναμικό v(x). Για παράδειγμα, για το απειρόβαθο πηγάδι δυνα-
μικού (10.17) δημιουργούμε το αρχείο schInfSq.f90. Στο ίδιο αρχείο
προγραμματίζουμε και τις συναρτήσεις των παραγώγων f1, f2, όπως
κάναμε και στην προηγούμενη παράγραφο.

! ===========================================================
! f i l e : schInfSq . f
!
! Functions used i n RKSTEP r o u t i n e . Here :
! f1 = psip ( x ) = psi ( x ) ’
! f 2 = p s i p ( x ) ’= p s i ( x ) ’ ’
!
! One has t o s e t :
! 1 . V( x ) , t h e p o t e n t i a l
! 2 . The boundary c o n d i t i o n s f o r p s i , p s i p a t x=xmin and x=xmax
!
! ===========================================================
!−−−−− p o t e n t i a l :
real (8) function V(x)
  i m p l i c i t none
  real (8) : : x
  V = 0.0 D0
end f u n c t i o n V
!−−−−− boundary c o n d i t i o n s :
s u b r o u t i n e boundary ( xmin , xmax ,&
                                   psixmin , psipxmin , psixmax , psipxmax )
  i m p l i c i t none
  r e a l ( 8 ) : : xmin , xmax , psixmin , psipxmin , psixmax , psipxmax , V
! f o r i n f i n i t e square w e l l we s e t p s i =0
! a t boundary and p s i p =+/−1
  psixmin = 0.0 D0
  psipxmin = 1 . 0 D0
  psixmax = 0.0 D0
  psipxmax = −1.0D0
!−−−−− I n i t i a l v a l u e s a t xmin and xmax
end s u b r o u t i n e boundary
! ===========================================================
! ===========================================================
!−−−−− t r i v i a l f u n c t i o n : d e r i v a t i v e o f p s i
r e a l ( 8 ) f u n c t i o n f1 ( x , psi , psip )
  r e a l ( 8 ) : : x , psi , psip
  f1=psip
end f u n c t i o n f1
! ===========================================================
!−−−−− t h e second d e r i v a t i v e o f wavefunction :
442                           ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

! p s i p ( x ) ’ = p s i ( x ) ’ ’ = −(E−V) p s i ( x )
r e a l ( 8 ) f u n c t i o n f2 ( x , psi , psip )
   i m p l i c i t none
  r e a l ( 8 ) : : x , psi , psip , energy , V
  common / params / energy
!−−−−− S c h r o e d i n g e r eq : RHS
  f2 = ( V ( x )−energy ) * psi
end f u n c t i o n f2
! ===========================================================

Παρατηρούμε ότι τα σημεία απειρισμού του δυναμικού καθορίζονται
από τις συνοριακές συνθήκες στα xmin, xmax.
   Το κυρίως πρόγραμμα παρουσιάζεται στο αρχείο sch.f90. Παρα-
κάτω παραθέτουμε τον κώδικα ο οποίος συμπεριλαμβάνει κανονικοποί-
ηση της κυματοσυνάρτησης και υπολογισμό του αριθμού των δεσμών
της κυματοσυνάρτησης. Η κανονικοποίηση γίνεται από τη συνάρτηση
integrate(psi, dx, Nx) η οποία ολοκληρώνει αριθμητικά με τη μέ-
θοδο Simpson το τετράγωνο μιας συνάρτησης που οι τιμές της psi(i)
i=1,...,Nx δίνονται σε ένα περιττό αριθμό από Nx σημεία τα οποία
ισαπέχουν απόσταση dx.

! ===========================================================
!
! F i l e : sch . f90
!
! I n t e g r a t e 1d S c h r o d i n g e r e q u a t i o n from xmin t o xmax .
! Determine energy e i g e n v a l u e and e i g e n f u n c t i o n by matching
! e v o l v i n g s o l u t i o n s from xmin and from xmax a t a p o i n t xm.
! Matching done by e q u a t i n g v a l u e s o f f u n c t i o n s and t h e i r
! d e r i v a t i v e s a t xm. The p o i n t xm chosen a t t h e l e f t most
! t u r n i n g p o i n t o f t h e p o t e n t i a l a t any gi v e n v a l u e o f t h e
! energy . The p o t e n t i a l and boundary c o n d i t i o n s chosen i n
! different file .
! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! Input : energy : T r i a l v a l u e o f energy
!                 de : energy s t e p , i f matching f a i l s de −> e+de , i f
!                       l o g d e r i v a t i v e changes s i g n        de −> −de / 2
!                 xmin , xmax , Nx
! −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! Output : F i n a l v a l u e o f energy , number o f nodes o f
!       wavefunction i n s t d o u t
!       F i n a l e i g e n f u n c t i o n i n f i l e p s i . dat
!       A l l t r i a l f u n c t i o n s and e n e r g i e s i n f i l e a l l . dat
! ===========================================================
program schroedinger_equation_1D
  i m p l i c i t none
10.3. ΔΕΣΜΙΕΣ ΚΑΤΑΣΤΑΣΕΙΣ                                                                       443

 i n t e g e r , parameter : : P=20001
  i n t e g e r : : Nx , NxL , NxR
  r e a l ( 8 ) : : psi ( P ) , psip ( P )
  r e a l ( 8 ) : : dx
  r e a l ( 8 ) : : xmin , xmax , xm                  ! l e f t / r i g h t / matching p o i n t s
  r e a l ( 8 ) : : psixmin , psipxmin , psixmax , psipxmax
  r e a l ( 8 ) : : psileft , psiright , psistep , psinorm
  r e a l ( 8 ) : : psipleft , psipright , psipstep
  r e a l ( 8 ) : : energy , de , e p s i l o n , integrate
 common / params / energy
  r e a l ( 8 ) : : matchlogd , matchold , psiold , norm , x
  i n t e g e r : : iter , i , imatch , nodes
  real (8) : : V
!−−−−−−−−−− Input :
 p r i n t * , ’ # Enter energy , de , xmin , xmax , Nx ’
 read * , energy , de , xmin , xmax , Nx
!−−− need even i n t e r v a l s f o r n o r m a l i z a t i o n i n t e g r a t i o n
  i f ( mod ( Nx , 2 ) . eq . 0 ) Nx=Nx+1
  i f ( Nx . gt . P               ) s t o p ’ F a t a l Error : Nx>P ’
  i f ( xmin . ge . xmax ) s t o p ’ Error : xmin >= xmax ’
 dx              = ( xmax − xmin ) / ( Nx −1)
 e p s i l o n = 1 . 0 D−6
  c a l l boundary ( xmin , xmax , psixmin , psipxmin , psixmax , psipxmax )
 p r i n t * , ’ # ####################################### ’
 p r i n t * , ’ # E s t a r t = ’ , energy , ’ de= ’ , de
 p r i n t * , ’ # Nx= ’ , Nx , ’ eps= ’ , e p s i l o n
 p r i n t * , ’ # xmin= ’ , xmin , ’ xmax= ’ , xmax , ’ dx= ’ , dx
 p r i n t * , ’ # p s i ( xmin )= ’ , psixmin , ’ p s i p ( xmin )= ’ , psipxmin
 p r i n t * , ’ # p s i ( xmax )= ’ , psixmax , ’ p s i p ( xmax )= ’ , psipxmax
 p r i n t * , ’ # ####################################### ’
!−−−−− C a l c u l a t e :
 open ( u n i t =11 , f i l e = ’ a l l . dat ’ )
 matchold            = 0.0 d0
 do iter =1 ,10000
!−−−−− Determine matching p o i n t a t t u r n i n g p o i n t from t h e l e f t :
    imatch = −1
    do i =1 , Nx
      x = xmin + ( i−1) * dx
      i f ( imatch . lt . 0 . and . ( energy−V ( x ) ) . gt . 0.0 D0 ) imatch = i
    enddo
    i f ( imatch . le . 100 . or . imatch . ge . Nx −100) imatch = Nx / 5
    xm           = xmin + ( imatch −1) * dx
    NxL = imatch
    NxR = Nx−imatch+1
!−−−−− Evolve wavefunction from t h e l e f t :
    psi ( 1 ) = psixmin
    psip ( 1 ) = psipxmin
    psistep          = psixmin
    psipstep = psipxmin
444                            ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

   do i =2 , NxL
      x                = xmin + ( i−2) * dx ! t h i s i s x b e f o r e t h e s t e p
      c a l l RKSTEP ( x , psistep , psipstep , dx )
      psi ( i ) = psistep
      psip ( i ) = psipstep
   enddo
! use t h i s t o normalize e i g e n f u n c t i o n t o match a t xm
   psinorm             = psistep
   psipleft = psipstep
!−−−−− Evolve wavefunction from t h e r i g h t :
   psi ( Nx ) = psixmax
   psip ( Nx ) = psipxmax
   psistep             = psixmax
   psipstep = psipxmax
   do i =2 , NxR
      x                = xmax − ( i−2) * dx
      c a l l RKSTEP ( x , psistep , psipstep ,−dx )
      psi ( Nx−i +1) = psistep
      psip ( Nx−i +1) = psipstep
   enddo
   psinorm                    = psistep / psinorm
   psipright                  = psipstep
!−−−−− Renormalize p s i l so t h a t p s i l (xm)= p s i r (xm)
   do i =1 , NxL−1
      psi ( i )               = psinorm * psi ( i )
      psip ( i )              = psinorm * psip ( i )
   enddo
   psipleft                   = psinorm * psipleft
!−−−−− p r i n t c u r r e n t s o l u t i o n :
   do i =1 , Nx
      x = xmin + ( i−1) * dx
      w r i t e ( 1 1 , * ) iter , energy , x , psi ( i ) , psip ( i )
   enddo
!−−−−− matching using d e r i v a t i v e s :
! C a r e f u l : t h i s can f a i l i f p s i ’ (xm) = 0 ! ! ( use a l s o | de | < 1 e−6
! criterion )
   matchlogd = &
              ( psipright−psipleft ) / ( DABS ( psipright )+DABS ( psipleft ) )
   p r i n t * , ’ # i t e r , energy , de , xm, logd : ’ ,&
              iter , energy , de , xm , matchlogd
!−−−−− E x i t c o n d i t i o n :
    i f ( DABS ( matchlogd ) . le . e p s i l o n . or . DABS ( de / energy ) . lt . 1 . 0 D−12)&
              EXIT
    i f ( matchlogd * matchold . lt . 0.0 D0 ) de = −0.5D0 * de
   energy              = energy + de
   matchold = matchlogd
  enddo ! do i t e r =1 ,10000
  close (11)
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
10.3. ΔΕΣΜΙΕΣ ΚΑΤΑΣΤΑΣΕΙΣ                                                                     445

!−−−−− S o l u t i o n has been found and now i t i s s t o r e d :
  norm              = integrate ( psi , dx , Nx )
  norm              = 1 . 0 D0 / sqrt ( norm )
  do i =1 , Nx
    psi ( i ) = norm * psi ( i )
  enddo
!−−−−− Cound number o f z e r o e s , add one and g e t energy l e v e l :
  nodes             = 1
  psiold            = psi ( 1 )
  do i =2 , Nx−1
    ! should be 0 w i t h i n e p s i l o n :
    i f ( DABS ( psi ( i ) ) . gt . e p s i l o n ) then
      i f ( psiold * psi ( i ) . lt . 0 . 0 D0 ) nodes = nodes+1
      psiold = psi ( i )
    endif
  enddo ! i =2 ,Nx−1
!−−−−−−− P r i n t f i n a l s o l u t i o n :
  open ( u n i t =11 , f i l e = ’ p s i . dat ’ )
  p r i n t * , ’ F i n a l r e s u l t : E= ’ , energy , ’ n= ’ , nodes ,&
            ’ norm = ’                     , norm
  i f ( DABS ( matchlogd ) . gt . e p s i l o n ) p r i n t *&
             , ’ F i n a l r e s u l t : SOS : logd > e p s i l o n . logd= ’ , matchlogd
  w r i t e ( 1 1 , * ) ’ # E= ’                    , energy , ’ n= ’ , nodes ,&
            ’ norm = ’                     , norm
  do i =1 , Nx
    x = xmin + ( i−1) * dx
    w r i t e ( 1 1 , * ) x , psi ( i )
  enddo
  close (11)
end program schroedinger_equation_1D
! ===========================================================
! Simpson ’ s r u l e t o i n t e g r a t e p s i ( x ) * p s i ( x ) f o r proper
! n o r m a l i z a t i o n . For n i n t e r v a l s o f width dx ( n even )
! Simpson ’ s r u l e i s :
! i n t ( f ( x ) dx ) =
! ( dx / 3 ) * ( f ( x_0 ) +4 f ( x_1 ) +2 f ( x_2 ) + . . . + 4 f ( x_ {n−1})+ f ( x_n ) )
!
! Input :            D i s c r e t e v a l u e s o f f u n c t i o n p s i (Nx)
!                    I n t e g r a t i o n s t e p dx
! Returns : I n t e g r a l ( p s i ( x ) p s i ( x ) dx )
! ===========================================================
r e a l ( 8 ) f u n c t i o n integrate ( psi , dx , Nx )
  i m p l i c i t none
  i n t e g e r : : Nx
!−−−−−−−−−−−−− Note : we need P due t o geometry o f a r r a y
  r e a l ( 8 ) : : psi ( Nx ) , dx
!−−−−−−−−−−−−−
  r e a l ( 8 ) : : int
  integer : : i
446                     ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

!−−−−− z e r o t h order p o i n t :
  i     = 1
  int = psi ( i ) * psi ( i )
!−−−−− odd order p o i n t s ( i =k+1 i s even ) :
  do i =2 , Nx −1 ,2
    int = int + 4.0 D0 * psi ( i ) * psi ( i )
  enddo
!−−−−− even order p o i n t s :
  do i =3 , Nx −2,2
    int = int + 2.0 D0 * psi ( i ) * psi ( i )
  enddo
!−−−−− l a s t p o i n t :
  i     = Nx
  int = int + psi ( i ) * psi ( i )
!−−−−− measure n o r m a l i z a t i o n :
  int = int * dx / 3 . 0 D0
!−−−−− f i n a l r e s u l t :
  integrate = int
end f u n c t i o n integrate
! ===========================================================

Αφήνουμε ως άσκηση στον αναγνώστη να αναπαράγει τα αποτελέ-
σματα της προηγούμενης παραγράφου για το απειρόβαθο πηγάδι δυ-
ναμικού. Για το τρέξιμο του προγράμματος, μεταγλωττίστε τον κώδικα
και τρέξτε τον με την εντολή:

> g f o r t r a n sch . f90 schInfSq . f90 rk . f90 −o s
> ./s
 # Enter energy , de , xmin , xmax , Nx
1 0.5 −1 1 2000
 # #######################################
 # Estart=            1.000 de=        0.5
 # Nx=               2001      eps=    1 . 0E−006
 # xmin=            −1.000 xmax= 1.000 dx= 1.000E−003
 # p s i ( xmin )= 0.000 p s i p ( xmin )=        1.000
 # p s i ( xmax )= 0.000 p s i p ( xmax )=      −1.000
 # #######################################
 # i t e r , energy , de , xm, logd : 1 1.0000 0.500       −0.60 −0.9748
 # i t e r , energy , de , xm, logd : 2 1.5000 0.500       −0.60 −0.6412
.....
 # i t e r , energy , de , xm, logd : 30 2.4674 −3.82E−6 −0.60 −1.0E−6
 # i t e r , energy , de , xm, logd : 31 2.4674 1 . 9 1E−6 −0.60 2.8E−7
 Final result : E= 2.467401504516602 n= 1 norm = 1.5707965025

Παραπάνω θέσαμε xmin= -1, xmax = 1, Nx= 2000, καθώς και ϵ = 1,
δϵ = 0.5. Τελικά, πήραμε ότι η ενέργεια της πρώτης (θεμελιώδους, n=1)
ενεργειακής κατάστασης είναι ϵ1 = 2.4674015045166016. Η κυματοσυ-
10.4. ΜΕΤΡΗΣΕΙΣ                                                                                   447

νάρτηση βρίσκεται στο αρχείο psi.dat και μπορούμε να τη δούμε γρα-
φικά με το gnuplot με την εντολή

gnuplot > p l o t ” p s i . dat ” using 1 : 2 with lines


                    1
                                                                iter=1
                   0.9                                          iter=2
                                                                iter=3
                   0.8                                          iter=4
                   0.7
                   0.6
            ψ(x)




                   0.5
                   0.4
                   0.3
                   0.2
                   0.1
                    0
                         -1        -0.5              0           0.5               1
                                                     x

Σχήμα 10.6: Η διαδικασία σύγκλισης των λύσεων της εξίσωσης Schrödinger όπως περι-
γράφεται στη σελίδα 447 για τη θεμελιώδη κατάσταση στο άπειρο πηγάδι δυναμικού.



Η διαδικασία σύγκλισης στην κυματοσυνάρτηση είναι αποθηκευμένη
στο αρχείο all.dat. Η πρώτη στήλη έχει τον αριθμό προσπάθειας σύ-
γκλισης (εδώ iter = 0, ... 31) και μπορούμε εύκολα να φιλτράρουμε
κάθε προσπάθεια με τις εντολές

gnuplot >   plot         ”<awk   ’ $1 ==1’   all   . dat ”   using   3:4   w   l   t   ” i t e r =1”
gnuplot >   replot       ”<awk   ’ $1 ==2’   all   . dat ”   using   3:4   w   l   t   ” i t e r =2”
gnuplot >   replot       ”<awk   ’ $1 ==3’   all   . dat ”   using   3:4   w   l   t   ” i t e r =3”
gnuplot >   replot       ”<awk   ’ $1 ==4’   all   . dat ”   using   3:4   w   l   t   ” i t e r =4”
.....

οι οποίες παράγουν το σχήμα 10.6.


10.4 Μετρήσεις
Όταν για μια κατάσταση |ψ⟩ γνωρίζουμε την κυματοσυνάρτηση σε ανα-
παράσταση θέσης ψ(x), είναι εύκολο να υπολογίσουμε τη δράση τελε-
448                     ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

στών που αντιστοιχούν σε παρατηρήσιμες ποσότητες A(x, p) που είναι
συνάρτηση της θέσης και της ορμής. Η δράση των τελεστών
                                                     ∂
                   x̂ψ(x) = xψ(x)      p̂ψ(x) = −i      ψ(x)          (10.29)
                                                     ∂x
δίνουν⁸
                                                   ∂
                      Â(x̂, p̂)ψ(x) = A(x, −i       )ψ(x) .    (10.30)
                                                  ∂x
Χρησιμοποιώντας την (10.9) μπορούμε να υπολογίσουμε την αναμενό-
μενη (ή μέση) τιμή ⟨A⟩ του τελεστή A, όταν το σύστημα βρίσκεται στην
κατάσταση |ψ⟩. Ενδιαφέροντα παραδείγματα αποτελούν οι παρατηρή-
σιμες ποσότητες “θέση” x, “θέση τετράγωνο” x2 , “ορμή” p, “ορμή τετρά-
γωνο” p2 , “κινητική ενέργεια” T , “δυναμική ενέργεια” V , “ενέργεια” ή
“Χαμιλτονιανή” H = T + V των οποίων οι μέσες τιμές δίνονται από τις
σχέσεις
                    ∫ +∞
             ⟨x⟩ =           ψ ∗ (x) x ψ(x) dx
                      −∞
                    ∫ +∞
           ⟨x2 ⟩ =           ψ ∗ (x) x2 ψ(x) dx
                      −∞
                    ∫ +∞             (        )
                               ∗           ∂
             ⟨p⟩ =           ψ (x) −i           ψ(x) dx
                      −∞                   ∂x
                    ∫ +∞             (        )
                               ∗          ∂2
            ⟨p ⟩ =
              2
                             ψ (x) − 2 ψ(x) dx
                      −∞                  ∂x
                             ∫ +∞            (       )
                       ℏ 2
                                       ∗         ∂2
            ⟨T ⟩ =                   ψ (x) − 2 ψ(x) dx
                     2mL2 −∞                    ∂x
                             ∫ +∞
                       ℏ 2
            ⟨V ⟩ =         2
                                     ψ ∗ (x) v(x) ψ(x) dx
                     2mL −∞
                             ∫ +∞            (              )
                       ℏ2              ∗         ∂2
            ⟨H⟩ =                    ψ (x) − 2 + v(x) ψ(x) dx . (10.31)
                     2mL2 −∞                    ∂x
Στις παραπάνω σχέσεις χρησιμοποιήσαμε αδιάστατες x, p και τις σχέ-
σεις (10.15) και (10.16). Ιδιαίτερο ενδιαφέρον παρουσιάζουν οι “αβε-
βαιότητες” ∆x2 = ⟨x2 ⟩ − ⟨x⟩2 , ∆p2 = ⟨p2 ⟩ − ⟨p⟩2 οι οποίες πρέπει να
ικανοποιούν τη σχέση (“αρχή αβεβαιότητας Heisenberg”)
                                           1
                               ∆x · ∆p ≥     .                        (10.32)
                                           2
    ⁸Εδώ δε λαμβάνουμε υπόψη προβλήματα διάταξης τελεστών που δεν μετατίθενται
λ.χ. xp2 .
10.4. ΜΕΤΡΗΣΕΙΣ                                                           449

Στις προηγούμενες παραγράφους εξηγούμε πώς να υπολογίζουμε αριθ-
μητικά τις κυματοσυναρτήσεις των ιδιοκαταστάσεων της ενέργειας. Σε
αυτές, επειδή Ĥψ(x) = Eψ(x), παίρνουμε ⟨H⟩ = (1/2mL2 )ϵ, αλλά οι υπό-
λοιποι τελεστές θέλουν κάποια αριθμητική προσέγγιση για τον υπολογι-
σμό των μέσων τιμών τους. Αν οι τιμές της κυματοσυνάρτησης δίνονται
σε N ισαπέχοντα σημεία x1 , x2 , . . . , xN , θα πάρουμε
                         ∂ψ(xi )   ψ(xi+1 ) − ψ(xi−1 )
                                 ≈                                     (10.33)
                          ∂x               2h
όπου h = xi+1 − xi και

                   ∂ 2 ψ(xi )   ψ(xi+1 ) − 2ψ(xi ) + ψ(xi−1 )
                              ≈                               .        (10.34)
                      ∂x2                    h2
Και οι δύο τύποι έχουν ακρίβεια O(h2 ). Θα πρέπει να προσέξουμε λίγο
την εφαρμογή των τύπων στα άκρα του διαστήματος [x1 , xN ]. Αρχικά,
θα χρησιμοποιήσουμε τις προσεγγίσεις⁹
                       ∂ψ(x1 )   ψ(x2 ) − ψ(x1 )
                               ≈
                         ∂x             h
                       ∂ψ(xN )   ψ(xN ) − ψ(xN −1 )
                               ≈                                       (10.35)
                         ∂x               h
και
                ∂ 2 ψ(x1 )   ψ(x3 ) − 2ψ(x2 ) + ψ(x1 )
                      2
                           ≈
                   ∂x                   h2
                 2
               ∂ ψ(xN )      ψ(xN ) − 2ψ(xN −1 ) + ψ(xN −2 )
                           ≈                                 .         (10.36)
                   ∂x2                     h2
Το σχετικό πρόγραμμα υπολογισμού των ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x, ∆p προ-
γραμματίζεται στο αρχείο observables.f90 και δίνεται παρακάτω:

! ===========================================================
!
! F i l e o b s e r v a b l e s . f90
! Compile : g f o r t r a n o b s e r v a b l e s . f90 −o o
! Usage :         . / o < p s i . dat >
!
! Read i n a f i l e with a wavefunction i n t h e format o f p s i . dat :

   ⁹Στο συνοδευτικό λογισμικό obserbables.f90, Derivatives.nb εξηγείται πώς να
χρησιμοποιήσετε σχέσεις με ακρίβεια O(h2 ). Στα παραδείγματα που θα χρησιμοποι-
ήσουμε η επίδραση της μειωμένης ακρίβειας O(h) στα αποτελέσματα είναι περίπου
στο 4ο δεκαδικό ψηφίο.
450                          ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

! # E= <energy > . . . .
! x1 p s i ( x1 )
! x2 p s i ( x2 )
! ............
!
! Outputs e x p e c t a t i o n v a l u e s :
! n o r m a l i z a t i o n Energy <x> <p> <x^2> <p^2> Dx Dp DxDp
! where Dx = s q r t ( < x^2>−<x >^2) Dp = s q r t ( <p^2>−<p>^2)
! DxDp = Dx * Dp
!
! ===========================================================
program observables_expectation
  i m p l i c i t none
  i n t e g e r , parameter : : P=50000
  i n t e g e r Nx , i
  r e a l ( 8 ) : : xstep ( P ) , psi ( P ) , obs ( P )
  r e a l ( 8 ) : : xav , pav , x2av , p2av , Dx , Dp , DxDp , energy , h , norm
  r e a l ( 8 ) : : integrate
  c h a r a c t e r (20) : : psifile , scratch

! t h e f i r s t argument o f t h e command l i n e must be t h e path
! t o t h e f i l e with t h e wavefunction . (GNU f o r t r a n e x t e n s i o n . . . )
  i f ( iargc ( ) . ne . 1 ) s t o p ’ Usage : o < f i l e n a m e > ’
  c a l l getarg ( 1 , psifile )
! I f t h e f i l e does not e x i s t , we go t o l a b e l 100 ( s t o p ) :
  open ( u n i t =11 , f i l e =psifile , s t a t u s = ’OLD’ , e r r =100)
  p r i n t * , ” # r e a d i n g wavefunction from f i l e : ” , psifile
! we read t h e f i r s t comment l i n e from t h e f i l e :
  read ( 1 1 , * ) scratch , scratch , energy
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! Input data : p s i ( x )
  Nx = 1
  do while ( . TRUE . )
    i f ( Nx . ge . P ) s t o p ’Too many p o i n t s ’
    read ( 1 1 , * , end =101) xstep ( Nx ) , psi ( Nx )
    Nx = Nx+1
  enddo ! do while ( . TRUE . )
101 c o n t i n u e
  Nx = Nx − 1
  i f ( mod ( Nx , 2 ) . eq . 0) Nx = Nx − 1
  h = ( xstep ( Nx )−xstep ( 1 ) ) / ( Nx −1)
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! Calculate :
!−−−−−−−−−− norm :
  do i =1 , Nx
    obs ( i ) = psi ( i ) * psi ( i )
  enddo
  norm = integrate ( obs , h , Nx )
!−−−−−−−−−− <x> :
10.4. ΜΕΤΡΗΣΕΙΣ                                                                               451

  do i =1 , Nx
    obs ( i ) = xstep ( i ) * psi ( i ) * psi ( i )
  enddo
  xav = integrate ( obs , h , Nx ) / norm
!−−−−−−−−−− <p > / i :
  obs ( 1 ) = psi ( 1 ) * ( psi ( 2 )−psi ( 1 ) ) / h
  do i =2 , Nx−1
    obs ( i ) = psi ( i ) * ( psi ( i +1)−psi ( i−1) ) / ( 2 . 0 D0 * h )
  enddo
  obs ( Nx ) = psi ( Nx ) * ( psi ( Nx )−psi ( Nx −1) ) / h
  pav = −integrate ( obs , h , Nx ) / norm
!−−−−−−−−− <x^2>
  do i =1 , Nx
    obs ( i ) = xstep ( i ) * xstep ( i ) * psi ( i ) * psi ( i )
  enddo
  x2av = integrate ( obs , h , Nx ) / norm
!−−−−−−−− <p^2>
  obs ( 1 ) = psi ( 1 ) * ( psi ( 3 ) −2.0D0 * psi ( 2 ) +psi ( 1 ) ) / ( h * h )
  do i =2 , Nx−1
    obs ( i ) = psi ( i ) * ( psi ( i +1) −2.0D0 * psi ( i )+psi ( i−1) ) / ( h * h )
  enddo
  obs ( Nx ) = psi ( Nx ) *&
            ( psi ( Nx ) −2.0D0 * psi ( Nx −1)+psi ( Nx−2) ) / ( h * h )
  p2av = −integrate ( obs , h , Nx ) / norm
!−−−−−−−− Dx
  Dx = sqrt ( x2av − xav * xav )
!−−−−−−−− Dp
  Dp = sqrt ( p2av − pav * pav )
!−−−−−−−− Dx . Dp
  DxDp = Dx * Dp
! print results :
  p r i n t * , ’ # norm E <x> <p > / i <x^2> <p^2> Dx Dp DxDp ’
  p r i n t ’ (10G25 . 1 7 ) ’ , norm , energy , xav , pav , x2av , p2av , Dx , Dp , DxDp
  s t o p ! normal e x e c u t i o n ends here . Error messages f o l l o w
100 s t o p ’ Cannot open f i l e ’
end program observables_expectation
! ===========================================================
!
! Simpson ’ s r u l e t o i n t e g r a t e p s i ( x ) * p s i ( x ) f o r proper
! n o r m a l i z a t i o n . For n i n t e r v a l s o f width dx ( n even )
! Simpson ’ s r u l e i s :
! i n t ( f ( x ) dx ) =
! ( dx / 3 ) * ( f ( x_0 ) +4 f ( x_1 ) +2 f ( x_2 ) + . . . + 4 f ( x_ {n−1})+ f ( x_n ) )
!
! Input :          D i s c r e t e v a l u e s o f f u n c t i o n p s i (Nx)
!                  I n t e g r a t i o n s t e p dx
! Returns : I n t e g r a l ( p s i ( x ) p s i ( x ) dx )
! ===========================================================
r e a l ( 8 ) f u n c t i o n integrate ( psi , dx , Nx )
452                      ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

  i m p l i c i t none
  i n t e g e r : : Nx
  r e a l ( 8 ) : : psi ( Nx ) , dx
  r e a l ( 8 ) : : int
  integer i
!−−−−− z e r o t h order p o i n t :
  i         = 1
  int = psi ( i )
!−−−−− odd order p o i n t s ( i =k+1 i s even ) :
  do i =2 , Nx −1 ,2
    int = int + 4.0 D0 * psi ( i )
  enddo
!−−−−− even order p o i n t s :
  do i =3 , Nx −2,2
    int = int + 2.0 D0 * psi ( i )
  enddo
!−−−−− l a s t p o i n t :
  i         = Nx
  int = int + psi ( i )
!−−−−− measure n o r m a l i z a t i o n :
  int = int * dx / 3 . 0 D0
!−−−−− f i n a l r e s u l t :
  integrate = int
end f u n c t i o n integrate
! ===========================================================

Για τη χρήση του προγράμματος χρειάζεστε την κυματοσυνάρτηση στα
σημεία x1 , . . . , xNx στο φορμά που παράγουν τα προγράμματα που γρά-
ψαμε μέχρι τώρα. Στην πρώτη γραμμή θα πρέπει να είναι καταγεγραμ-
μένη η ενέργεια στην 3η στήλη, ενώ από τη 2η γραμμή και μετά έχουμε
δύο στήλες με τα ζευγάρια (xi , ψ(xi )). Η κυματοσυνάρτηση δεν είναι
αναγκαίο να είναι κανονικοποιημένη, το κάνει το πρόγραμμα. Αν τα
παραπάνω δεδομένα είναι καταγεγραμμένα στο αρχείο psi.dat, τότε η
χρήση του προγράμματος γίνεται με τις εντολές

> g f o r t r a n observables . f90 −o obs
> . / obs psi . dat

Το πρόγραμμα τυπώνει στο stdout τη σταθερά κανονικοποίησης της
ψ(x), την ενέργεια (διαβασμένη από το αρχείο - όχι υπολογισμένη), και
στη συνέχεια οι ⟨x⟩, ⟨x2 ⟩, ⟨p⟩/i, ⟨p2 ⟩, ∆x, ∆p και το γινόμενο ∆x · ∆p.
    Μερικές διευκρινήσεις πάνω στις λεπτομέρειες του προγράμματος.
Για να διαβάσουμε τα δεδομένα από το αρχείο psi.dat χρησιμοποιούμε
τις συναρτήσεις iargc(), getarg(n,string). Η πρώτη επιστρέφει τον
αριθμό των arguments στη γραμμή εντολών και η δεύτερη αποθηκεύει το
10.5. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ - ΞΑΝΑ...                                      453

n-οστό argument στην CHARACTER μεταβλητή string. Οπότε, οι εντολές

 c h a r a c t e r (20) : : psifile , scratch
 i f ( iargc ( ) . ne . 1 ) s t o p ’ Usage : o          < file n a m e > ’
 c a l l getarg ( 1 , psifile )

σταματάνε το πρόγραμμα, αν η εντολή δεν έχει ακριβώς ένα argument,
αλλιώς το πρώτο argument αποθηκεύεται στη μεταβλητή file.
   Η εντολή

 open ( u n i t =11 , f i l e =psifile , s t a t u s = ’OLD’ , e r r =100)
100 s t o p ’ Cannot open f i l e ’

ανοίγει ένα αρχείο που πρέπει να υπάρχει ήδη (status='OLD'), αλ-
λιώς παράγεται σφάλμα. Ο προσδιορισμός err=100 μεταφέρει τότε τον
έλεγχο του προγράμματος στο statement με label '100'. Στο παραπάνω
παράδειγμα, σταματάει το πρόγραμμα με μήνυμα σφάλματος 'Cannot
open filename'.
   Οι εντολές

 Nx = 1
 do while ( . TRUE . )
  read ( 1 1 , * , end =101) xstep ( Nx ) , psi ( Nx )
  Nx = Nx+1
 enddo ! do while ( . TRUE . )
101 c o n t i n u e

διαβάζουν το αρχείο που ανοίγουμε γραμμή-γραμμή. Ο προσδιορισμός
end=101 στο statement read(11,*,end=101) μεταφέρει τον έλεγχο του
προγράμματος στο statement με label 101 (δηλ. εκτός του do loop), όταν
φτάσουμε στο τέλος του αρχείου.
   Οι υπόλοιπες εντολές είναι εφαρμογές των σχέσεων (10.33), (10.34),
(10.35) και (10.36) στους τύπους (10.31) και ο αναγνώστης παρακαλεί-
ται να τις μελετήσει προσεκτικά. Επίσης, χρησιμοποιείται και η ρουτίνα
integrate για τα απαραίτητα ολοκληρώματα.


10.5         Ο Αναρμονικός Ταλαντωτής - Ξανά...
Στο Κεφάλαιο 9 μελετήσαμε τον αρμονικό και αναρμονικό ταλαντωτή
στην αναπαράσταση των ιδιοκαταστάσεων ενέργειας του αρμονικού τα-
λαντωτή |n⟩. Στην παράγραφο αυτή, θα επανεξετάσουμε το πρόβλημα
454                         ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

στην αναπαράσταση θέσης. Θα υπολογίσουμε τις κυματοσυναρτήσεις
ψn,λ (x) που διαγωνιοποιούν τη Χαμιλτονιανή√    (9.15), είναι δηλ. λύσεις
της εξίσωσης Schrödinger. Θέτοντας L = ℏ/mω στην (10.13), η (10.12)
γίνεται:
                       ψ ′′ (x) = −(ϵ − v(x))ψ(x)                 (10.37)

με v(x) = x2 + 2λx4 . Για λ = 0 παίρνουμε τον αρμονικό ταλαντωτή με
                                                          (      )
                        1         −x2 /2                       1
          ψn (x) = √        √ e            Hn (x) , ϵn = 2 n +     ,      (10.38)
                       2n n! π                                 2

όπου Hn (x) είναι τα πολυώνυμα Hermite.
   Για έλεγχο του προγράμματος και της ακρίβειας της διαδικασίας,
ξεκινάμε από τον αρμονικό ταλαντωτή. Το δυναμικό και οι αρχικές συν-
θήκες προγραμματίζονται στο αρχείο schHOC.f90. Οι αλλαγές που γίνο-
νται αφορούν τις συναρτήσεις V(x), boundary(xmin, xmax, psixmin,
psipxmin, psixmax, psipxmax):

! ===========================================================
! f i l e : schHOC . f
! ..............
!−−−−− p o t e n t i a l :
real (8) function V(x)
  i m p l i c i t none
  real (8) : : x
  V = x*x
end f u n c t i o n V
!−−−−− boundary c o n d i t i o n s :
s u b r o u t i n e boundary ( xmin , xmax ,&
                               psixmin , psipxmin , psixmax , psipxmax )
  i m p l i c i t none
  r e a l ( 8 ) : : xmin , xmax , psixmin , psipxmin , psixmax , psipxmax , V

  psixmin           = exp ( −0.5 D0 * xmin * xmin )
  psipxmin          = −xmin * psixmin
  psixmax           = exp ( −0.5 D0 * xmax * xmax )
  psipxmax          = −xmax * psixmax
end s u b r o u t i n e boundary
! ===========================================================
 .................

όπου ο κώδικας στις τελείες παραλείπεται, επειδή είναι ίδιος με αυ-
τόν της προηγούμενης παραγράφου. Οι αρχικές συνθήκες λαμβάνουν
υπόψη τη γνωστή ασυμπτωτική συμπεριφορά των λύσεων της εξίσω-
10.5. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ - ΞΑΝΑ...                                                                                                               455

σης Schrödinger¹⁰ ψ0 (x) ∼ e−x /2 , ψn′ (x) ∼ −xψn (x). Δοκιμάστε να τις
                                                                         2


αλλάξετε για να δείτε αν υπάρχει επίδραση στα αποτελέσματα. Τα

            0.8                                                                             3e-11
                                                              ε0=1
            0.7                                                                           2.5e-11
                                                                                            2e-11
            0.6
                                                                                          1.5e-11
            0.5                                                                             1e-11




                                                                                 ∆ψ0(x)
    ψ0(x)




            0.4                                                                             5e-12

            0.3                                                                                 0
                                                                                           -5e-12
            0.2
                                                                                           -1e-11
            0.1                                                                           -1.5e-11
              0                                                                            -2e-11
                   -6        -4        -2        0       2           4       6                       -6    -4        -2    0       2       4       6
                                                 x                                                                         x

            0.6                                                                           1.2e-07
                                                             ε0=19
                                                                                            1e-07
            0.4
                                                                                            8e-08
                                                                                            6e-08
            0.2
                                                                                            4e-08
                                                                                 ∆ψ9(x)
    ψ9(x)




              0                                                                             2e-08
                                                                                                0
            -0.2
                                                                                           -2e-08
                                                                                           -4e-08
            -0.4
                                                                                           -6e-08
            -0.6                                                                           -8e-08
                   -8   -6        -4        -2   0   2         4         6   8                       -8   -6    -4    -2   0   2       4       6   8
                                                 x                                                                         x


Σχήμα 10.7: Ο υπολογισμός των κυματοσυναρτήσεων ψ0 (x), ψ9 (x) από το πρόγραμμα
sch.f90, schHOC.f90. Στα διαγράμματα δεξιά φαίνεται η διαφορά των τιμών τους
από τις αναμενόμενες τιμές (10.38).



αποτελέσματα δίνονται γραφικά στο σχήμα 10.7 όπου πέρα από την
ποιοτική συμφωνία, διαγράφεται και η απόκλιση από τις αναλυτικά
υπολογισμένες τιμές (10.38) που είναι της τάξης 10−11 –10−7 . Οι τιμές
των ενεργειών ϵn βρίσκονται σε συμφωνία με την (10.38) με σχετική
ακρίβεια καλύτερη από 10−9 για n ≤ 14.
    Στη συνέχεια, υπολογίζουμε τις τιμές των μέσων τιμών ⟨x⟩, ⟨x2 ⟩, ⟨p⟩,
⟨p2 ⟩, ∆x και ∆p. Αυτές υπολογίζονται πολύ εύκολα
                                              √     από τις σχέσεις (9.4)
και√(9.8). Βλέπουμε ότι ⟨x⟩ = ⟨n| (a + a)/ 2 |n⟩ = 0, ⟨p⟩ = ⟨n| i(a† −
                                       †

a)/ 2 |n⟩ = 0, ενώ
                                              (      )
                            1 †       †            1
           ⟨x ⟩ = ⟨p ⟩ = ⟨n| (a a + aa ) |n⟩ = n +
              2     2
                                                       .         (10.39)
                            2                      2
Το πρόγραμμα observables.f90 μας δίνει ⟨x⟩ = 0 με ακρίβεια ∼ 10−6
   ¹⁰Κανονικά ψn (x) ∼ xn e−x /2 το οποίο αγνοούμε και βρίσκουμε ότι δεν παίζει ση-
                                                     2


μαντικό ρόλο στα τελικά αποτελέσματα για τα n που μελετάμε. Δοκιμάστε αν αυτό
είναι αναγκαίο να το λάβουμε υπόψη για πολύ μεγαλύτερα n.
456                       ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

               n      ⟨x2 ⟩       ⟨p2 ⟩    ∆x · ∆p
               0 0.500000000   0.4999977 0.4999989
               1  1.500000284  1.4999883  1.4999943
               2  2.499999747  2.4999711  2.4999854
               3  3.499999676  3.4999441  3.4999719
               4  4.499999607 4.4999082   4.4999539
               5 5.499999520 5.4998633    5.4999314
               6 6.499999060 6.4998098    6.4999044
               7  7.499999642  7.4995484   7.4997740
               8  8.499999715 8.4994203   8.4997100
               9  9.499999837  9.4992762 9.4996380
              10 10.500000012 10.4991160 10.4995580
              11 11.499999542 11.4994042 11.4997019
              12 12.499999610 12.4992961 12.4996479
              13 13.499999705 13.4991791 13.4995894
              14 14.499999835 14.4990529 14.4995264


Πίνακας 10.2: Οι αναμενόμενες τιμές των ⟨x2 ⟩, ⟨p2 ⟩, ∆x · ∆p για τον απλό αρμονικό
ταλαντωτή για τις καταστάσεις |n⟩, n = 0, . . . , 14.


και ⟨p⟩ = 0 με ακρίβεια ∼ 10−11 . Οι τιμές των ⟨x2 ⟩, ⟨p2 ⟩ δίνονται στον
πίνακα 10.2.
   Στη συνέχεια, επαναλαμβάνουμε τον υπολογισμό μας για τον αναρ-
μονικό ταλαντωτή και για λ = 0.5, 2.0. Αυτό γίνεται μετατρέποντας το
αρχείο schHOC.f90 που αποθηκεύεται στο αρχείο schUOC.f90. Απλά αλ-
λάζουμε το δυναμικό σε:

! ===========================================================
! f i l e : schUOC . f
! ...................
!−−−−− p o t e n t i a l :
real (8) function V(x)
  i m p l i c i t none
  r e a l ( 8 ) : : x , lambda
  lambda = 2.0 D0
  V = x * x +2.0 D0 * lambda * x * x * x * x
end f u n c t i o n V
 ....................

Οι κυματοσυναρτήσεις δείχνονται στο σχήμα 10.8 όπου φαίνεται ότι η
αύξηση του λ οδηγεί σε επιπλέον περιορισμό του σωματιδίου στο χώρο
όπως αναμένεται. Στον πίνακα 10.3 καταχωρούνται οι τιμές της ϵn για
10.5. Ο ΑΝΑΡΜΟΝΙΚΟΣ ΤΑΛΑΝΤΩΤΗΣ - ΞΑΝΑ...                                           457



                        n    ϵn    ϵn,λ=0.5 ϵn,λ=2.0
                        0  1.0000   1.3924   1.9031
                        1 3.0000    4.6488   6.5857
                        2 5.0000   8.6550 12.6078
                        3  7.0000 13.1568 19.4546
                        4 9.0000 18.0576 26.9626
                        5 11.0000 23.2974 35.0283
                        6 13.0000 28.8353 43.5819
                        7 15.0000 34.6408 52.5723
                        8 17.0000 40.6904 61.9598
                        9 19.0000 46.9650 71.7129


Πίνακας 10.3: Οι τιμές της ενέργειας ϵn για τον αρμονικό ταλαντωτή καθώς και τον
αναρμονικό ταλαντωτή για λ = 0.5, 2.0. Παρατηρείται η αύξηση των τιμών της ενέρ-
γειας για αυξανόμενο λ.




                       λ = 0.5               λ = 2.0
       n  ⟨x ⟩  2
                        ⟨p ⟩
                          2
                               ∆x · ∆p ⟨x ⟩
                                         2
                                               ⟨p2 ⟩ ∆x · ∆p
       0 0.3058        0.8263 0.5027 0.2122   1.1980 0.5042
       1 0.8013        2.8321 1.5064 0.5408  4.2102 1.5089
       2 1.1554        5.3848 2.4944 0.7612   8.1513 2.4909
       3 1.4675        8.2819 3.4862 0.9582 12.6501 3.4816
       4 1.7509       11.4545 4.4784 1.1370 17.5955 4.4728
       5 2.0141       14.8599 5.4707 1.3029 22.9169 5.4643
       6 2.2617       18.4691 6.4631 1.4590 28.5668 6.4560
       7 2.4970       22.2607 7.4555 1.6074 34.5103   7.4478
       8 2.7220       26.2184 8.4478 1.7492 40.7206 8.4397
       9 2.9384       30.3289 9.4402 1.8856 47.1762 9.4316


Πίνακας 10.4: Οι αναμενόμενες τιμές των ⟨x2 ⟩, ⟨p2 ⟩, ∆x · ∆p για τον αναρμονικό √
                                                                                 ταλα-
ντωτή για τις καταστάσεις
                     √     |n⟩, n = 0, . . . , 9. Παρατηρούμε τη μείωση της ∆x =   ⟨x2 ⟩
και αύξηση της ∆p = ⟨p ⟩ καθώς αυξάνεται το λ. Το γινόμενο ∆x · ∆p φαίνεται να
                         2

είναι πολύ κοντά στις τιμές που παίρνουμε από τον αρμονικό ταλαντωτή και για τις
δύο τιμές του λ. Συγκρίνετε τα αποτελέσματα που καταγράφονται εδώ με αυτά του
πίνακα 9.1.
458                                      ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

                     1                                                     1
                                                 λ=0.0                                                 λ=0.0
                   0.9                           λ=0.5                   0.8                           λ=0.5
                                                 λ=2.0                                                 λ=2.0
                   0.8                                                   0.6
                   0.7                                                   0.4
                   0.6                                                   0.2

           ψ0(x)




                                                                 ψ1(x)
                   0.5                                                     0
                   0.4                                                   -0.2
                   0.3                                                   -0.4
                   0.2                                                   -0.6
                   0.1                                                   -0.8
                     0                                                    -1
                          -6   -4   -2   0   2           4   6                  -6   -4   -2   0   2           4   6
                                         x                                                     x

                     1                                                   0.8
                                                 λ=0.0                                                 λ=0.0
                   0.8                           λ=0.5                   0.6                           λ=0.5
                                                 λ=2.0                                                 λ=2.0
                   0.6                                                   0.4
                   0.4
                                                                         0.2
                   0.2
           ψ2(x)




                                                                 ψ3(x)
                                                                           0
                     0
                                                                         -0.2
                   -0.2
                   -0.4                                                  -0.4

                   -0.6                                                  -0.6

                   -0.8                                                  -0.8
                          -6   -4   -2   0   2           4   6                  -6   -4   -2   0   2           4   6
                                         x                                                     x

                   0.8                                                   0.8
                                                 λ=0.0                                                 λ=0.0
                   0.6                           λ=0.5                   0.6                           λ=0.5
                                                 λ=2.0                                                 λ=2.0
                   0.4                                                   0.4

                   0.2                                                   0.2
           ψ4(x)




                                                                 ψ5(x)




                     0                                                     0

                   -0.2                                                  -0.2

                   -0.4                                                  -0.4

                   -0.6                                                  -0.6

                   -0.8                                                  -0.8
                          -6   -4   -2   0   2           4   6                  -6   -4   -2   0   2           4   6
                                         x                                                     x



Σχήμα 10.8: Οι κυματοσυναρτήσεις του αναρμονικού ταλαντωτή ψn,λ (x) για n =
0, 1, 2, 3, 4, 5 και λ = 0.5, 2.0 συγκρινόμενες με αυτές του αρμονικού ταλαντωτή. Φαί-
νεται ότι η αύξηση του λ οδηγεί σε περιορισμό του σωματιδίου στο χώρο.




n = 0, ..., 9. Παρατηρείται η αύξηση των τιμών της ενέργειας για αυξα-
νόμενο λ. Στον πίνακα 10.4 καταχωρούνται οι αναμενόμενες τιμές των
⟨x2 ⟩, ⟨p2 ⟩, ∆x · ∆p για τον αναρμονικό ταλαντωτή για   √τις καταστάσεις
|n⟩, n =√   0, . . . , 9. Παρατηρούμε τη μείωση της ∆x =  ⟨x2 ⟩ και αύξηση
∆p = ⟨p2 ⟩, καθώς αυξάνεται το λ. Το γινόμενο ∆x · ∆p φαίνεται να
είναι πολύ κοντά στις τιμές που παίρνουμε από τον αρμονικό ταλα-
ντωτή και για τις δύο τιμές του λ. Τα αποτελέσματα μπορείτε να τα
συγκρίνετε με αυτά που πήραμε στο κεφάλαιο 9, στον πίνακα 9.1.



10.6 Το Δυναμικό Lennard–Jones
Το δυναμικό Lennard–Jones είναι ένα απλό φαινομενολογικό μοντέλο
που περιγράφει την αλληλεπίδραση δύο ουδέτερων ατόμων σε ένα δια-
10.6. ΤΟ ΔΥΝΑΜΙΚΟ LENNARD–JONES                                                  459

τομικό μόριο. Αυτό δίνεται από
                                           {( )           ( σ )6 }
                                             σ 12
                            V (x) = 4V0               −              .       (10.40)
                                               x             x
Ο απωστικός όρος περιγράφει την άπωση επικάλυψης των ηλεκτρονι-
κών νεφών κατά Pauli, ενώ ο ελκτικός όρος τη δύναμη Van der Waals.
Επιλέγουμε L = σ στην (10.13) και ορίζουμε v0 = 2mσ 2 V0 /ℏ2 . Η (10.40)
γίνεται                      {( )
                                   12   ( )6 }
                                1        1
                  v(x) = 4v0          −         ,                (10.41)
                                x        x
ενώ οι υπολογιζόμενες ιδιοτιμές ϵn συνδέονται με την ενέργεια μέσω
της σχέσης                         ( )
                                    En
                          ϵn = 4v0      .                   (10.42)
                                    V0
Το δυναμικό αναπαρίσταται γραφικά στο σχήμα 10.5 για v0 = 250. Το
ελάχιστο του δυναμικού βρίσκεται στη θέση xm = 21/6 ≈ 1.12246 και
η τιμή του είναι −v0 . Ο προγραμματισμός του δυναμικού γίνεται στο
αρχείο schLJ.f90. Το κομμάτι του κώδικα που μεταβάλλουμε από τα
προηγούμενα αρχεία δίνεται παρακάτω:

! ===========================================================
! f i l e : schLJ . f90 ( Lennard−J o n e s )
! ..................
!−−−−− p o t e n t i a l :
real (8) function V(x)
  i m p l i c i t none
  r e a l ( 8 ) : : x , V0

 V0 = 250.0 D0
 V = 4.0 D0 * V0 * ( 1 . 0 D0 / x **12 −1.0 D0 / x * * 6 )

end f u n c t i o n V
!−−−−− boundary c o n d i t i o n s :
s u b r o u t i n e boundary ( xmin , xmax , psixmin , psipxmin , psixmax , psipxmax←-
      )
  i m p l i c i t none
  r e a l ( 8 ) : : xmin , xmax , psixmin , psipxmin , psixmax , psipxmax , V
  r e a l ( 8 ) : : energy
 common / params / energy
!−−−−− I n i t i a l v a l u e s a t xmin and xmax
  psixmin            = exp(−xmin * sqrt ( DABS ( energy−V ( xmin ) ) ) )
  psipxmin           = sqrt ( DABS ( energy−V ( xmin ) ) ) * psixmin
  psixmax            = exp(−xmax * sqrt ( DABS ( energy−V ( xmax ) ) ) )
460                         ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

 n        ϵn     ⟨x⟩     ⟨p⟩    ⟨x2 ⟩ ⟨p2 ⟩                     ∆x    ∆p       ∆x · ∆p
 0    -173.637 1.186   1.0e-10 1.415 34.193                    0.091 5.847      0.534
 1     -70.069 1.364   6.0e-11 1.893 56.832                    0.178 7.539      1.338
 2     -18.191 1.699 -4.5e-08 2.971 39.480                     0.291 6.283      1.826
 3       -1.317 2.679 -2.6e-08 7.586  9.985                    0.638 3.160      2.016


Πίνακας 10.5: Τα αποτελέσματα των μετρήσεων για το δυναμικό Lennard-Jones με
v0 = 250. Έχουμε 4 δέσμιες καταστάσεις.


  psipxmax          = −sqrt ( DABS ( energy−V ( xmax ) ) ) * psixmax
end s u b r o u t i n e boundary
 ............................



          2.5
                                                            v(x)/v0
            2                                                 ε1/v0
                                                              ε2/v0
          1.5                                                 ε3/v0
                                                              ε4/v0
                                                             ψ1(x)
            1                                                ψ2(x)
                                                             ψ3(x)
          0.5                                                ψ4(x)
            0

         -0.5

           -1

         -1.5
                  1         2          3           4       5           6   7
                                               x
Σχήμα 10.9: Οι τέσσερις δέσμιες καταστάσεις για το δυναμικό Lennard-Jones με v0 =
250. Φαίνεται το δυναμικό v(x)/v0 με παχιά κόκκινη γραμμή, τα ενεργειακά επίπεδα
ϵn /v0 και οι αντίστοιχες κυματοσυναρτήσεις.



   Για την ολοκλήρωση επιλέγουμε τις παραμέτρους v0 = 250 και xmin
= 0.7, 4 <xmax < 10. Τα αποτελέσματα παρουσιάζονται στο σχήμα 10.9,
όπου φαίνονται τα τέσσερα ενεργειακά επίπεδα των δέσμιων καταστά-
σεων μαζί με τις κυματοσυναρτήσεις τους. Αυτές είναι περιορισμένες
μέσα στο πηγάδι του δυναμικού για τις δύο πρώτες στάθμες, ενώ αρ-
10.6. ΤΟ ΔΥΝΑΜΙΚΟ LENNARD–JONES                                                                                          461

        1                                           0.8
                                ψ1mat(x)                                                         ψ6mat(x)
       0.8                      ψ1sch(x)            0.6                                          ψ6sch(x)
       0.6
                                                    0.4
       0.4
       0.2                                          0.2

        0                                             0
      -0.2                                          -0.2
      -0.4
                                                    -0.4
      -0.6
      -0.8                                          -0.6

        -1                                          -0.8
             -6   -4   -2   0   2           4   6          -6        -4        -2        0       2           4       6
                            x                                                            x

       0.8                                          1.2
                                ψ9mat
                                  sch
                                      (x)                                                        ψ14mat(x)
       0.6                      ψ9 (x)                1

       0.4                                          0.8

       0.2                                          0.6

        0                                           0.4

      -0.2                                          0.2

      -0.4                                            0

      -0.6                                          -0.2

      -0.8                                          -0.4
             -6   -4   -2   0   2           4   6          -8   -6        -4        -2   0   2        4          6   8
                            x                                                            x


Σχήμα 10.10: Σύγκριση των αποτελεσμάτων για τον υπολογισμό των κυματοσυναρτή-
σεων ψn,λ (x) του αναρμονικού ταλαντωτή για λ = 2.0 με τις μεθόδους που περιγρά-
φονται στην άσκηση 12. Οι κυματοσυναρτήσεις ψ sch (x) αναφέρονται στις ψn,λ (x) που
υπολογίζονται χρησιμοποιώντας τις μεθόδους που περιγράφονται στο κεφάλαιο αυτό.
Οι κυματοσυναρτήσεις ψ mat (x) αναφέρονται στις ψn,λ (x) που υπολογίζονται χρησιμο-
ποιώντας τις μεθόδους που περιγράφονται στο Κεφάλαιο 9 με διάσταση χώρου Hilbert
N = 40. Παρατηρούμε ότι οι τελευταίες παρουσιάζουν αποκλίσεις για μεγάλα x. Αυτό
οφείλεται στο ότι στα πλάτη ψn,λ (x) = ⟨x|n⟩λ για μεγάλα x συνεισφέρουν καταστάσεις
|m⟩ μεγάλης ενέργειας (γιατί;).



χίζουν να “ξεχειλίζουν” για τις δύο τελευταίες. Στον πίνακα 10.5 πα-
ραθέτουμε τις μετρήσεις μας. Παρατηρούμε ότι ⟨p⟩ = 0 μέσα στα όρια
της ακρίβειας που έχουμε θέσει, όπως περιμένουμε για πραγματικές,
δέσμιες κυματοσυναρτήσεις¹¹.




                                                                                         ∫ +∞
  ¹¹Για ψ(+∞) = ψ(0) = 0 και ψ ∗ (x) = ψ(x) έχουμε i⟨p⟩/ℏ =                                     ψ(x)(d/dx)ψ(x) dx
    ∫ +∞                                                                                 0
= − 0 (d/dx)ψ(x)ψ(x) dx = 0.
462                           ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

10.7 Ασκήσεις
10.1 Προσθέστε τον κατάλληλο κώδικα στο πρόγραμμα well.f90, έτσι
                                            ∫ 1 στο psi.dat σω-
     ώστε η τελική κυματοσυνάρτηση να τυπώνεται
     στά κανονικοποιημένη. Για το ολοκλήρωμα −1 ψ(x)ψ(x) dx χρησι-
     μοποιήστε τον κανόνα του Simpson:
              ∫     b
                        f (x) dx = (h/3) (f (x0 ) + 4f (x1 ) + 2f (x2 ) + . . .
                a
                                      +2f (xn−2 ) + 4f (xn−1 ) + f (xn ))

      όπου το διάστημα [a, b] έχει χωριστεί σε διαστήματα πλάτους h
      από n σημεία x0 = a, x1 , x2 , . . . , xn = b που το n είναι άρτιος αριθ-
      μός.

10.2 Προσθέστε τον κατάλληλο κώδικα στο πρόγραμμα well.f90, έτσι
     ώστε να υπολογίζετε τον αριθμό των σημείων μηδενισμού της κυ-
     ματοσυνάρτησης. Από αυτά, το πρόγραμμα να τυπώνει το ενερ-
     γειακό επίπεδο n της υπολογιζόμενης κυματοσυνάρτησης ψn (x).

10.3 Υπολογίστε τις κυματοσυναρτήσεις των ενεργειακών ιδιοκαταστά-
     σεων στο δυναμικό (10.27) με v0 < 0. Αυτό είναι το πρόβλημα του
     πεπερασμένου πηγαδιού δυναμικού. Λύστε το για v0 = −100 και
     a = 0.3. Πόσες δέσμιες καταστάσεις έχετε μέσα στο πεπερασμένο
     πηγάδι; Στη συνέχεια, μελετήστε την επίδραση του τοίχους πάνω
     στις λύσεις. Εισάγετε την παράμετρο b, έτσι ώστε v(x ≥ b) = +∞
     και να μελετήσετε την επίδραση του τείχους πάνω στις λύσεις.
     Θέστε b = 0.35, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0 και υπολογίστε
     τη μεταβολή της ενέργειας στις δύο πρώτες ενεργειακές στάθμες.
     Εκτιμήστε την ακρίβεια επιτυχίας της μεθόδου σας. Στη συνέχεια,
     μειώστε την τιμή του |v0 | μέχρι να εξαφανιστεί η δέσμια κατά-
     σταση μέσα στο πεπερασμένο πηγάδι. Ποια είναι η σχέση μεταξύ
     το a και v0 όταν αυτό συμβαίνει; Συγκρίνετε με τη θεωρητικά ανα-
     μενόμενη σχέση που μάθατε στο μάθημα της κβαντομηχανικής.
     Υπόδειξη: Για τις μεγαλύτερες τιμές του b να αυξήσετε αρκετά την
     παράμετρο Nx > 1000 και αν δεν πετύχετε σύγκλιση να μειώσετε
     την epsilon.

10.4 Στο διπλό πηγάδι δυναμικού βάλτε v0 = 1000, 5000. Παρατηρήστε
     τον (σχεδόν) εκφυλισμό των καταστάσεων √ και παραστήστε γρα-
     φικά τις κυματοσυναρτήσεις ψ±,n = (1/ 2)(ψn (x) ± ψn+1 (x)), όπου
     n περιττός. Συγκρίνετε με τις αντίστοιχες ενεργειακές στάθμες και
10.7. ΑΣΚΗΣΕΙΣ                                                       463

     κυματοσυναρτήσεις του απειρόβαθου πηγαδιού. Δοκιμάστε πόσο
     μεγάλο μπορεί να γίνει το v0 , ώστε να μην μπορείτε πια να λύσετε
     το πρόβλημα με ανεκτή ακρίβεια.
     Υπόδειξη: Για μεγάλα v0 έχουμε αύξηση αριθμητικής δυσκολίας.
     Για |x| < a η κυματοσυνάρτηση είναι σχεδόν μηδέν, και από αυτή
     θα πρέπει να προκύψει η μη τετριμμένη κυματοσυνάρτηση για
     a < |x| < 1. Άρα, η ακρίβεια θα μειώνεται και θα πρέπει να αυξή-
     σουμε το epsilon μέσα στον κώδικά, ώστε να πετύχουμε σύγκλιση
     αρκετά γρήγορα.
10.5 Επαναλάβατε τις ασκήσεις 3 και 4 χρησιμοποιώντας το πρόγραμμα
     sch.f90. Συγκρίνετε τα αποτελέσματά σας.
10.6 Μελετήστε τις δέσμιες καταστάσεις στα δυναμικά
                              
                                 0 a < |x|
                       v(x) =   −V0 b < |x| < a
                              
                                −V1 |x| < b
     για a = 1, b = 0.2, V0 = 100, V1 = 0, 50 και
                                   
                                    V1 x < 0
                            v(x) =    −V0 0 < x < a
                                   
                                         0 a<x
     για a = 1, V0 = 100, V1 = +∞, 10, 100 και
                                 
                                 
                                    V1 a < |x|
                                 
                                   −V0 b < |x| < a
                          v(x) =
                                 
                                      0 c < |x| < b
                                 
                                   −V0 |x| < c
     για a = 1, b = 0.7, c = 0.6, 0.3, V0 = 100, V1 = +∞, 10, 0. Για κάθε
     περίπτωση, υπολογίστε τα ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x, ∆p, ∆x · ∆p.
10.7 Γράψτε πρόγραμμα που από την κυματοσυνάρτηση που δίνει το
     πρόγραμμα sch.f90, να υπολογίζει την πιθανότητα το σωμάτιο να
     βρίσκεται μέσα σε ένα πεπερασμένο διάστημα [x1 , x2 ]. Στα αποτε-
     λέσματα που πήρατε από την προηγούμενη άσκηση, προσδιορίστε
     τα διαστήματα [−x1 , x1 ] μέσα στα οποία έχουμε πιθανότητα 1/3
     να βρούμε το σωμάτιο.
10.8 Συμπληρώστε τους Πίνακες 10.3 και 10.4 για λ = 0.2, 0.7, 1.0,
     1.3, 1.6, 2.5, 3.0 και παραστήστε γραφικά κάθε αναμενόμενη τιμή
     συναρτήσει του λ.
464                     ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER

10.9 Θεωρήστε το σωμάτιο που κινείται μέσα στο δυναμικό
                                      {              }
                        ℏ2 2            1     1
                V (x) =    α λ(λ − 1)     −            .
                        2m              2 cosh2 (αx)

      Το ενεργειακό φάσμα δίνεται από τη σχέση
                             {                         }
                        ℏ2 2 λ(λ − 1)
                   En =    α           − (λ − 1 − n) 2
                        2m        2

      για τις τιμές του n = 0, 1, 2, . . . για τις οποίες En > Vmin . Υπολο-
      γίστε αριθμητικά τις ενεργειακές ιδιοτιμές ϵn των δέσμιων κατα-
      στάσεων θέτοντας L = 1/α στην (10.13) και λ = 4. Κάνετε τις
      γραφικές παραστάσεις του δυναμικού v(x) και των αντίστοιχων
      κυματοσυναρτήσεων. Υπολογίστε τις μέσες τιμές της θέσης, ορμής,
      αβεβαιότητες στη θέση, ορμή και το γινόμενό τους. Επαναλάβατε
      για λ = 2, 6, 8, 10.

10.10 Να γράψετε πρόγραμμα που από την κυματοσυνάρτηση να υπο-
      λογίζει τη μέση τιμή της ενέργειας
                        ∫ +∞     (                 )
                                     ℏ2 ∂ 2
                 ⟨Ĥ⟩ =      ψ(x) −         + V (x) ψ(x) dx ,
                         −∞         2m ∂x2

      υποθέτοντας πως η ψ(x) είναι πραγματική. Στη συνέχεια να υπο-
      λογίσετε τις ψn (x) για τον αρμονικό ταλαντωτή για n = 1, . . . , 10
      και να δείξετε (αριθμητικά) ότι ⟨Ĥ⟩n = En .

10.11 Θεωρήστε το σωμάτιο που κινείται μέσα στο δυναμικό Morse
                              {(              )    }
                                     −a(r−re ) 2
                    V (x) = De 1 − e             −1 .

      Υπολογίστε το φάσμα των δέσμιων καταστάσεων. Επιλέξτε L =
      1/a, x = ar, xe = are , λ2 = 2mDe /a2 ℏ2 και πάρτε
                                   (                     )
                        v(x) = λ2 e−2(x−xe ) − 2e−(x−xe ) .

      Συγκρίνετε με τις αναλυτικά υπολογισμένες λύσεις
                                   (          )2
                                            1
                               ϵn = λ − n −
                                            2

                      ψn (z) = Nn z λ−n−1/2 e−z/2 L2λ−2n−1
                                                   n       (z)
10.7. ΑΣΚΗΣΕΙΣ                                                                   465
                                         √
      με z = 2λe−(x−xe ) , Nn = n! (2λ − 2n − 1)/(Γ(n + 1)Γ(2λ − n)), και
      Lαn (z) είναι πολυώνυμο Laguerre που δίνεται από τη σχέση Lαn (z) =
      (z −α ez /n!)(dn /dz n )(z n+α e−z ) = (Γ(α+2)/(Γ(n+2)Γ(α−n+2))1 F1 (−n, α+
      1, z). Ενδεικτικά μπορείτε να πάρετε λ = 4, xe = 1. Για κάθε πε-
      ρίπτωση υπολογίστε τα ⟨x⟩, ⟨x2 ⟩, ⟨p⟩, ⟨p2 ⟩, ∆x, ∆p, ∆x · ∆p.

10.12 Να υπολογίσετε τις κυματοσυναρτήσεις των ιδιοκαταστάσεων της
      Χαμιλτονιανής του αναρμονικού ταλαντωτή για λ = 2.0 και n =
      0, . . . , 15. Στη συνέχεια να υπολογίσετε τις κυματοσυναρτήσεις που
      δίνει το πρόγραμμα anharmonic.f90 από το Κεφάλαιο 9 για N =
      15, 40, 100 και να τις συγκρίνετε με αυτές που υπολογίσατε προη-
      γουμένως.
      Υπόδειξη: Να γράψετε πρόγραμμα που να υπολογίζει τις ιδιοσυ-
      ναρτήσεις ενέργειας του αρμονικού ταλαντωτή
                                            1      −x2 /2
                          ψn (x) = √        √ e             Hn (x)
                                       2n n! π

      όπου τα πολυώνυμα Hermite ικανοποιούν τις σχέσεις

          Hn+1 (x) = 2xHn (x) − 2nHn−1 (x),         H0 (x) = 1,      H1 (x) = 2x .

      Το πρόγραμμα anharmonic.f90 υπολογίζει τις ιδιοκαταστάσεις
      του αναρμονικού ταλαντωτή

                                    ∑
                                    N −1
                           |n⟩λ =          H(m + 1, n + 1) |m⟩
                                    m=0

      βάζοντας τους γραμμικούς συντελεστές στα στοιχεία του array
      H(N,N). Για τις κυματοσυναρτήσεις τους ψn,λ (x), ψn (x) ισχύει η
      ίδια σχέση. Από τις ψn (x) και τα H(i,j) υπολογίστε τις ψn,λ (x) για
      −8 < x < 8 για κάθε N και μελετήστε την ακρίβεια υπολογισμού.
      Για ποιες τιμές του x η ακρίβεια δεν είναι καλή; Θυμηθείτε ότι
      για μεγάλα x οι καταστάσεις μεγάλης ενέργειες παίζουν σημαντι-
      κότερο ρόλο από ότι για x μικρά. Το σχήμα 10.10 μπορεί να σας
      βοηθήσει.
466   ΚΕΦΑΛΑΙΟ 10. Η ΕΞΙΣΩΣΗ SCHRÖDINGER
ΚΕΦΑΛΑΙΟ 11

Ο Τυχαίος Περιπατητής

Στο κεφάλαιο αυτό θα μελετήσουμε τη διαδρομή που ακολουθεί ένας
... μεθυσμένος, όταν αποφασίσει να περπατήσει από το σημείο που βρί-
σκεται. Λόγω της τύφλας του, τα βήματα που εκτελεί είναι ασυσχέτιστα
μεταξύ τους και προς τυχαία διεύθυνση. Αυτά τα δυο χαρακτηριστικά
θα ορίσουν το απλούστερο πρότυπο που θα μελετήσουμε. Τα πρότυπα
αυτά και οι γενικεύσεις τους έχουν άμεση σχέση με τη συμπεριφορά
φυσικών συστημάτων (κίνηση Brown, διάχυση, κίνηση impurities στο
πλέγμα, ιδιότητες μακρών ελαστικών μακρομορίων σε μακροσκοπικές
αποστάσεις, στοχαστικές διαδικασίες). Στη φυσική στοιχειωδών σω-
ματιδίων παρουσιάζονται στη γεωμετρία των τυπικών διαδρομών των
μποζονίων στα ολοκληρώματα διαδρομών του Feynman. Οι έννοιες που
αναπτύσσονται από τη μελέτη του τυχαίου περιπατητή γενικεύονται
στη θεωρία των τυχαίων επιφανειών που σχετίζονται με τη δισδιάστατη
κβαντική βαρύτητα και τη θεωρία χορδών [43].
     Η γεωμετρία μιας τυπικής διαδρομής του απλού τυχαίου περιπα-
τητή παύει να είναι κλασική και αυτό μπορεί να φανεί καθαρά από
δύο μη κλασικές ιδιότητες της. Το μήκος της διαδρομής που διανύει ο
περιπατητής είναι ανάλογος της τετραγωνικής ρίζας του χρόνου, με
αποτέλεσμα να μην ισχύει η κλασική σχέση r = vt. Ο δεύτερος λόγος
είναι ότι η γεωμετρία του χώρου που πατάει ο περιπατητής (με τη
στατιστική έννοια) έχει δομή fractal με διάσταση μεγαλύτερη της μο-
νάδας¹, δηλαδή δεν είναι ένα απλό μονοδιάστατο μονοπάτι. Παρόμοια
φαινόμενα παρουσιάζονται στις τυχαίες επιφάνειες και κβαντικές θεω-
ρίες πεδίου όπου η απόκλιση από την κλασική συμπεριφορά μπορεί να
γίνει κατανοητή με κατάλληλες γενικεύσεις των παραπάνω ιδεών. Για
περαιτέρω μελέτη παραπέμπουμε στα συγγράμματα [7, 42, 43, 44].

  ¹Για την ακρίβεια η διάσταση Hausdorff dH = 2.


                                    467
468                    ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

   Για να προσομοιώσουμε ένα τέτοιο σύστημα στον υπολογιστή είναι
αναγκαία η χρήση γεννητριών τυχαίων αριθμών. Αυτές, τις περισσότερες
φορές, είναι αλγόριθμοι που παράγουν μια ακολουθία από ψευδοτυχαί-
ους αριθμούς οι οποίοι κατανέμονται ομοιόμορφα. Από αυτούς είναι δυ-
νατόν να παράξουμε πιο πολύπλοκες κατανομές πιθανοτήτων και έτσι
να προσομοιώσουμε συστήματα που έχουν στοχαστική συμπεριφορά.
Στο κεφάλαιο αυτό θα μελετήσουμε μερικές απλές τέτοιες γεννήτριες
και τις βασικές τους ιδιότητες, καθώς και θα εξασκηθούμε στη χρήση
ποιοτικών γεννητριών που είναι μεταφερόμενες (portable) σε οποιοδή-
ποτε υπολογιστικό περιβάλλον.


11.1 (Ψευδο)Τυχαίοι Αριθμοί
Η παραγωγή ψευδοτυχαίων αριθμών είναι στην καρδιά της προσομοίω-
σης Μόντε Κάρλο. Η παραγωγή των ψευδοτυχαίων αριθμών είναι κατά
κανόνα ντετερμινιστική: Στη γεννήτρια τυχαίων αριθμών (δηλ. στον αλ-
γόριθμο) δίνονται κάποιες αρχικές συνθήκες από τις οποίες η παραγωγή
των αριθμών αφήνεται να εξελιχθεί στο “χρόνο”. Ο επόμενος αριθμός
προκαθορίζεται από την κατάσταση της γεννήτριας εξ’ ου και η ντε-
τερμινιστική εξέλιξη. Ίδιες αρχικές συνθήκες δίνουν την ίδια ακριβώς
ακολουθία αριθμών. Η εξέλιξη αυτή όμως είναι χαοτική. Ελάχιστα δια-
φορετικές αρχικές συνθήκες φτιάχνουν ακολουθίες που αποκλίνουν εκ-
θετικά στο χρόνο η μία από την άλλη. Για παρόμοιο λόγο, ο αριθμός
που παράγεται σε κάθε βήμα θεωρείται πως είναι ασυσχέτιστος από
τον προηγούμενο. Εδώ βρίσκεται και το αδύνατο σημείο που προκα-
λεί τα δυσκολότερα προβλήματα, γιατί στις προβληματικές γεννήτριες
βρίσκονται λεπτοί συσχετισμοί που είναι δύσκολο να προσδιοριστούν.
Πραγματικά τυχαίοι αριθμοί (χρήσιμοι στην κρυπτογραφία) μπορούν
να παραχθούν από ειδικές συσκευές που βασίζονται στο χρόνο διάσπα-
σης ραδιενεργών υλικών ή τον ατμοσφαιρικό θόρυβο². Σχεδόν τυχαίοι
αριθμοί κρυπτογραφικής ποιότητας παράγονται από τα ειδικά αρχεία
/dev/random και /dev/urandom, τα οποία διαβάζουν bits από μια δε-
ξαμενή εντροπίας που φτιάχνεται από διάφορους εξωτερικούς παρά-
γοντες (θερμοκρασία υπολογιστή, θόρυβο από οδηγούς συσκευών κλπ)
που είναι διαθέσιμα σε αρκετά λειτουργικά συστήματα και θα δούμε
τη χρήση τους σε επόμενη παράγραφο.
   Οι πιο δημοφιλείς γεννήτριες, λόγω της απλότητάς τους, είναι οι
γεννήτριες modulo (D.H. Lehmer, 1951). Αυτές χρειάζονται μόνο έναν
  ²Υπάρχουν υπηρεσίες στο διαδίκτυο που παρέχουν πραγματικά τυχαίους αριθμούς
όπως οι www.random.org, www.fourmilab.ch/hotbits/ και άλλες.
11.1. (ΨΕΥΔΟ)ΤΥΧΑΙΟΙ ΑΡΙΘΜΟΙ                                                469

αριθμό x0 (seed) ως αρχική συνθήκη και από τον αριθμό xi−1 παράγουν
τον xi από τη σχέση

                           xi = a xi−1 + c (mod m)                        (11.1)

για κατάλληλα επιλεγμένες τιμές των a, c και m. Η κατάσταση της γεν-
νήτριας προσδιορίζεται πλήρως από ένα μόνο αριθμό, την τρέχουσα τιμή
του xi . Υπάρχει βιβλιογραφία σχετικά με τη σωστή επιλογή των a, c και
m, εδώ ας σημειώσουμε πως αυτή είναι διαφορετική για γλώσσα C ή
FORTRAN και για συστήματα που είναι 32–bit ή 64-bit. Για λεπτομέ-
ρειες παραπέμπουμε στο ειδικό κεφάλαιο των Numerical Recipes [8].
    Η τιμή του m καθορίζει την μέγιστη περίοδο της γεννήτριας. Είναι
σαφές πως αν σε κάποια στιγμή της ακολουθίας πάρω τον ίδιο αριθμό
που πήρα πριν από k βήματα, η γεννήτρια θα αρχίσει να παράγει ακρι-
βώς την ίδια ακολουθία και αυτό θα συνεχίζεται περιοδικά. Αφού έχω
m δυνατούς διαφορετικούς αριθμούς, η περίοδος είναι το πολύ m. Για
μια κακή επιλογή των παραμέτρων a, c και m η περίοδος θα είναι πολύ
μικρότερη. Η τιμή του m όμως δεν μπορεί να είναι αυθαίρετα μεγάλη,
αφού σε οποιοδήποτε υπολογιστή υπάρχει ένας μέγιστος ακέραιος που
καθορίζεται από τον αριθμό των bits που χρησιμοποιεί να τον αναπα-
ραστήσει. Για ακεραίους 4-bytes (32-bits) χωρίς πρόσημο ο μέγιστος
αριθμός είναι 232 − 1, ενώ αν έχουν πρόσημο 231 − 1. Καλή επιλογή των
a, c και m μπορεί να αποδειχθεί (βλ. Knuth [45]) ότι δίνει ακολου-
θία που είναι αναδιάταξη {π1 , π2 , . . . , πm } των αριθμών 1, 2, . . . , m. Μια
τέτοια επιλογή δίνει αρκετά καλούς τυχαίους αριθμούς για απλές εφαρ-
μογές, αλλά για σοβαρούς υπολογισμούς θα πρέπει να ανατρέξουμε σε
μια προσεκτικά επιλεγμένη γεννήτρια τυχαίων αριθμών. Σε αυτές, η
κατάσταση της γεννήτριας είναι πιο πολύπλοκη και καθορίζεται από
περισσότερους από έναν ακέραιους αριθμούς. Για κώδικα ο αναγνώ-
στης μπορεί να ανατρέξει στις αναφορές [4], [5], [8], [46]. Για portable
προγράμματα προτείνονται οι γεννήτριες RANLUX [46] και η γεννήτρια
των Marsaglia, Zaman and Tsang. Πρόγραμμα Fortran για την πρώτη
θα βρείτε στο συνοδευτικό λογισμικό, ενώ για την τελευταία μπορεί να
βρεθεί στο βιβλίο/site του Berg [5].
    Για να γίνει κατανοητή η χρήση των γεννητριών, αλλά και να ανα-
δειχθεί ένα βασικό πρόβλημα των modulo γεννητριών παραθέτουμε πα-
ρακάτω τις συναρτήσεις naiveran() και drandom(). Η πρώτη είναι προ-
βληματική και θα μελετήσουμε τους συσχετισμούς που κρύβονται στις
ακολουθίες τυχαίων αριθμών που παράγει, καθώς και την επίδρασή τους
στις προσομοιώσεις του τυχαίου περιπατητή. Η δεύτερη μπορεί να χρη-
σιμοποιηθεί και για μη τετριμμένες εφαρμογές, όπως οι προσομοιώσεις
470                           ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

του τυχαίου περιπατητή και του πρότυπου Ising που θα κάνουμε σε
επόμενες παραγράφους.
   Η naiveran() είναι απλή εφαρμογή της σχέσης (11.1) με a = 1266,
c = 0 και m = 217 :

! =============================================
! F i l e : n a i v e r a n . f90
! Program t o demonstrate t h e usage o f a modulo
! g e n e r a t o r with a bad c h o i c e o f c o n s t a n t s
! r e s u l t i n g i n s t r o n g p a i r c o r r e l a t i o n s between
! g e n e r a t e d numbers
! =============================================
r e a l ( 8 ) f u n c t i o n naiveran ( )
   i m p l i c i t none
  integer                         : : iran =13337
  common / naiveranpar / iran
  i n t e g e r , parameter : : m = 131072 ! equal t o 2 * * 1 7
  i n t e g e r , parameter : : a = 1277

 iran = a * iran
 iran = MOD ( iran , m )

 naiveran = iran /DBLE( m )

end f u n c t i o n naiveran

Η drandom() είναι πάλι εφαρμογή της ίδιας σχέσης, αλλά με a = 75 ,
c = 0 και m = 231 − 1. Η επιλογή έγινε από τους Lewis, Goodman
και Miller (1969) και δίνει μια γεννήτρια που έχει περάσει από πολλά
τεστ και, ακόμα πιο σημαντικό, έχει δοκιμαστεί με επιτυχία πολλές
φορές. Το πρόβλημα που παρουσιάζεται είναι ότι πολλαπλασιασμός
του xi−1 με το a θα δώσει πολλές φορές αριθμό που είναι εκτός του
διαστήματος που καλύπτουν οι ακέραιοι τεσσάρων bytes και θα έχουμε
integer overflow. Για να έχουμε κώδικα που να μεταφέρεται παντού,
αλλά και για να είναι γρήγορος, είναι θεμιτό να παραμείνουμε στον
χώρο των 231 − 1, θετικών 32-μπιτων (4 byte) ακέραιων με πρόσημο. Η
πρόταση του Schrage είναι να χρησιμοποιήσουμε τη σχέση
                                                            [     ]
                              a (xi−1       mod q) − r      xi−1
                                                                              αν είναι ≥ 0
   (axi−1 ) mod m =                                         [ q ]
                              a (xi−1       mod q) −      r xi−1      + m αν είναι < 0
                                                               q
                                                           (11.2)
όπου m = aq + r, q = [m/a] και r = m mod a. Μπορεί να δειχθεί ότι
αν r < q και αν 0 < xi−1 < m − 1, τότε 0 ≤ a(xi−1 mod q) ≤ m − 1,
11.1. (ΨΕΥΔΟ)ΤΥΧΑΙΟΙ ΑΡΙΘΜΟΙ                                                            471

0 ≤ r[xi−1 /q] ≤ m − 1 και ότι ισχύει η (11.2). Η περίοδος της γεννήτριας
είναι 231 − 2 ≈ 2 × 109 . Η ισχύς των παραπάνω ισχυρισμών αφήνεται ως
αριθμητική άσκηση για τον αναγνώστη.

! ====================================================
! F i l e : drandom . f90
! Implementation o f t h e Schrage a l g o r i t h m f o r a
! p o r t a b l e modulo g e n e r a t o r f o r 32 b i t s i g n e d i n t e g e r s
! ( from numerical r e c i p e s )
!
! r e t u r n s uniformly d i s t r i b u t e d pseudorandom numbers
! 0.0 < x < 1 . 0 (0 and 1 excluded )
! ====================================================
r e a l ( 8 ) f u n c t i o n drandom ( )
   i m p l i c i t none
  i n t e g e r , parameter : : a = 16807                ! a = 7**5
  i n t e g e r , parameter : : m = 2147483647 ! m = a * q+r = 2**31 −1
  i n t e g e r , parameter : : q = 127773               ! q = [m/ a ]
  i n t e g e r , parameter : : r = 2836                 ! r = MOD(m, a )
  r e a l ( 8 ) , parameter : : f = ( 1 . 0 D0 / m )
  integer                       :: p
  integer                       : : seed
  real (8)                      : : dr
  common / randoms / seed

101 c o n t i n u e
 p            = seed / q                    ! = [ seed / q ]
 seed         = a * ( seed− q * p ) − r * p ! = a *MOD( seed , q )−r * [ seed / q ]
 i f ( seed . lt . 0) seed = seed + m
 dr           = f * seed
 i f ( dr . le . 0.0 D0 . or . dr . ge . 1 . 0 D0 ) goto 101
 drandom = dr
end f u n c t i o n drandom


Η γραμμή ελέγχου των τιμών της γεννήτριας είναι αναγκαία μόνο για
την τιμή 0 που παρουσιάζεται μια φορά στην ακολουθία και βάζει ένα
επιπλέον φορτίο χρόνου της τάξης του 10 − 20% εξαρτώμενο από το
μεταγλωττιστή. Αν δε σας ενδιαφέρει, μπορείτε να το βγάλετε. Επίσης,
προσέξτε πως ο αριθμός seed είναι σε common block και μπορεί να
αλλάξει από το καλών πρόγραμμα.
   Παρακάτω, παραθέτουμε ένα απλό πρόγραμμα χρήσης των παρα-
πάνω γεννητριών το οποίο και θα αναδείξει το πρόβλημα συσχετισμού
ζευγαριών των τιμών της naiveran(). Θα παράξουμε ζεύγη ακέραιων
τιμών (i, j) με 0 ≤ i, j < 10000 τα οποία στη συνέχεια θα απεικονίσουμε
στο επίπεδο. Αυτό γίνεται παίρνοντας το ακέραιο μέρος των αριθμών
472                              ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

L u με L = 10000 και 0 ≤ u < 1 ο τυχαίος αριθμός που δίνει η κάθε
γεννήτρια:

! ==========================================================
! Program t h a t produces N random p o i n t s ( i , j ) with
! 0<= i , j < 10000. Simple q u a l i t a t i v e t e s t o f s e r i a l
! c o r r e l a t i o n s o f random number g e n e r a t o r s on t h e plane .
!
! compile :
! g f o r t r a n c o r r e l a t i o n s 2 r a n . f90 n a i v e r a n . f90 drandom . f90
! ==========================================================
program correlations2
   i m p l i c i t none
  i n t e g e r , parameter : : L = 10000
  integer                            :: i,N
  character (10)                     : : arg
  real (8)                           : : naiveran , drandom
  integer                            : : seed
  common / randoms /                      seed
! Read t h e number o f p o i n t s from f i r s t command argument
   i f ( IARGC ( ) . EQ . 1 ) then
     c a l l GETARG ( 1 , arg ) ; read ( arg , * ) N ! c o n v e r t s t r i n g −> i n t e g e r
  e l s e ! d e f a u l t value , i f no N g iven by u s e r :
     N=1000
  endif
  seed = 348325
  do i =1 , N
     p r i n t * , INT ( L * naiveran ( ) ) , INT ( L * naiveran ( ) )
! p r i n t * , INT (L * drandom ( ) ) , INT (L * drandom ( ) )
  enddo

end program correlations2

Το πρόγραμμα βρίσκεται στο αρχείο correlations2ran.f90. Για να δο-
κιμάσουμε τη naiveran() το μεταγλωττίζουμε

> g f o r t r a n correlations2ran . f90 naiveran . f90 −o naiveran

ενώ για να δοκιμάσουμε την drandom(), μεταβάλλουμε τις γραμμές
print ως εξής

! p r i n t * , INT (L * n a i v e r a n ( ) ) , INT (L * n a i v e r a n ( ) )
  p r i n t * , INT ( L * drandom ( ) ) , INT ( L * drandom ( ) )

και ξαναμεταλωττίζουμε
11.1. (ΨΕΥΔΟ)ΤΥΧΑΙΟΙ ΑΡΙΘΜΟΙ                                                  473


> g f o r t r a n correlations2ran . f90 drandom . f90 −o drandom

παράγοντας έτσι τα δύο εκτελέσιμα αρχεία naiveran και drandom. Για
να δούμε τα αποτελέσματα τρέχουμε με τις εντολές

> . / naiveran 100000 > naiveran . out
> . / drandom 100000 > drandom . out
> gnuplot
gnuplot > p l o t ” n a i v e r a n . out ” using 1 : 2 with dots
gnuplot > p l o t ”drandom . out ” using 1 : 2 with dots

με τις οποίες παράγουμε 105 σημεία τα οποία, στη συνέχεια, βλέπουμε
με το gnuplot.
   Οι παραπάνω εντολές παράγουν τα σχήματα 11.1 και 11.2 στα οποία
βλέπουμε καθαρά το συσχετισμό των ζευγών που παράγονται από την
naiveran(). Τα σχήματα βέβαια δίνουν αρκετά ποιοτική αναπαράσταση.
Προσεκτική μελέτη της drandom() δείχνει πως τα σημεία (ui , ui+1 ) που
παράγει δεν περνάνε το τεστ χ2 , όταν έχουμε περισσότερα από 107
σημεία, που είναι πολύ λιγότερα από την περίοδο της γεννήτριας. Για
να αποφύγουμε τέτοια προβλήματα έχουν προταθεί πολλές λύσεις, οι
πιο απλές “ανακατεύουν” τα αποτελέσματα, ώστε να εξαφανίζουν τους
σειριακούς συσχετισμούς χαμηλής τάξης. Τέτοιες γεννήτριες θα συζη-
τήσουμε στην επόμενη παράγραφο. Η ομοιόμορφη κατανομή των τυ-
χαίων αριθμών μπορεί να δειχθεί γραφικά φτιάχνοντας το ιστόγραμμα
της σχετικής συχνότητας των τυχαίων αριθμών. Για να κάνουμε ιστο-
γράμματα χρησιμοποιούμε το script histogram γραμμένο σε awk³ ως
εξής:

> histogram −v f =0.01 drandom . out > drandom . hst
> gnuplot
gnuplot > p l o t ”drandom . h s t ” using 1 : 3 with histeps
gnuplot > p l o t [ : ] [ 0 : ] ”drandom . h s t ” using 1 : 3 with histeps

Με την εντολή histogram -v f=0.01 φτιάχνεται ιστόγραμμα των δεδο-
μένων στο αρχείο drandom.out, έτσι ώστε το πλάτος των περιοχών τιμών
(bin width) να είναι 1/0.01 = 100. Γενικά, το αντίστροφο του αριθμού
μετά το -f ορίζει το πλάτος των περιοχών τιμών του ιστογράμματος.
   Τα αποτελέσματα φαίνονται στα σχήματα 11.3 και 11.4. Στη συνέ-
χεια, μελετούμε τη διασπορά των μετρήσεων μας, οι οποίες είναι εμφα-
νείς ήδη από το σχήμα 11.3. Η διασπορά αυτή μειώνεται με το μέγεθος
   ³Βλ. συνοδευτικό λογισμικό στον κατάλογο Tools. Δώστε την εντολή histogram --
-h για να τυπωθούν στο τερματικό σας οδηγίες χρήσης.
474                         ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

       10000


        9000


        8000


        7000


        6000


        5000


        4000


        3000


        2000


        1000


          0
               0   1000   2000   3000   4000    5000   6000   7000   8000   9000   10000


Σχήμα 11.1: Τα ζεύγη ψευδοτυχαίων αριθμών από τη συνάρτηση naiveran(). Φαίνεται
καθαρά ο συσχετισμός των ζευγών που παράγονται, αφού τα σημεία κάθονται πάνω
σε εμφανές διακριτό πλέγμα.



του δείγματος των τυχαίων αριθμών που συλλέγουμε. Αυτό φαίνεται
στο ιστόγραμμα του σχήματος 11.5. Για να δούμε ποσοτικά την εξάρ-
τηση των διακυμάνσεων από το μέγεθος του δείγματος n, υπολογίζουμε
την ποσότητα (xi είναι η ακολουθία των τυχαίων αριθμών)
                    v      
                    u
                    u                   ( n      )2 
                    u 1 1     ∑n
                                         1 ∑
               σ=t                x2i −        xi  ,        (11.3)
                      n − 1 n i=1        n i=1

την οποία αποδίδουμε γραφικά στο σχήμα 11.6. Η σχέση
                                               1
                                    ln σ ∼       ln(n) ,                              (11.4)
                                               2
όπως φαίνεται από την ευθεία που προσαρμόζουμε στα σημεία, δείχνει
ότι
                                  1
                             σ∼√ .                          (11.5)
                                   n
  Θα κλείσουμε το κεφάλαιο αυτό αναφέροντας σύντομα την παρα-
γωγή ψευδοτυχαίων αριθμών με κατανομή διαφορετική από την ομοιό-
11.1. (ΨΕΥΔΟ)ΤΥΧΑΙΟΙ ΑΡΙΘΜΟΙ                                                                      475

       10000


        9000


        8000


        7000


        6000


        5000


        4000


        3000


        2000


        1000


          0
               0   1000   2000     3000     4000   5000     6000     7000   8000   9000   10000


Σχήμα 11.2: Τα ζεύγη ψευδοτυχαίων αριθμών από τη συνάρτηση drandom(). Φαίνεται
ότι τα σημεία αυτά κατανέμονται τυχαία σε σχέση με αυτά της naiveran().



μορφη. Για μια τυχαία κατανομή με συνάρτηση πυκνότητας πιθανότη-
τας f (x) μπορούμε να πάρουμε ψευδοτυχαίους αριθμούς που ακολου-
θούν την f (x) από ομοιόμορφα κατανεμημένους αριθμούς στο διάστημα
(0, 1). Έστω η συνάρτηση κατανομής
                                    ∫ x
                    0 ≤ u = F (x) =     f (x′ ) dx′ ≤ 1 ,    (11.6)
                                                   −∞

που δεν είναι άλλο από το εμβαδόν κάτω από την f (x) στο (−∞, x] και
ισούται με την πιθανότητα P (x′ < x). Αν επιλέξουμε το u ομοιόμορφα
κατανεμημένο στο διάστημα (0, 1), τότε θα έχουμε P (u′ < u) = u. Tότε
το x = F −1 (u) είναι τέτοιο, ώστε P (x′ < x) = u = F (x), άρα κατανέμεται
σύμφωνα με την f (x). Οπότε αν ui είναι ομοιόμορφα κατανεμημένοι
ψευδοτυχαίοι αριθμοί, τότε οι

                                          xi = F −1 (ui )                                    (11.7)

είναι μια ακολουθία ψευδοτυχαίων αριθμών που κατανέμεται σύμφωνα
με την f (x). Για παράδειγμα, θεωρούμε την κατανομή κατά Cauchy
                                           1    c
                                 f (x) =                    c > 0.                           (11.8)
                                           π c + x2
                                              2
476                      ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

       0.012




        0.01




       0.008




       0.006




       0.004




       0.002




          0
               0       2000               4000       6000   8000      10000


Σχήμα 11.3: H σχετική συχνότητα κατανομής των ψευδοτυχαίων αριθμών που παράγο-
νται από την συνάρτηση drandom(). Φαίνεται η ομοιόμορφη κατανομή και η διασπορά
γύρω από τη μέση τιμή.



Τότε                      ∫   x                  ( )
                                      ′  1 1   −1 x
                                                 ′
                   F (x) =    f (x ) dx = + tan      .                   (11.9)
                           −∞            2 π      c
Σύμφωνα με τα παραπάνω η γεννήτρια τυχαίων αριθμών θα δίνεται
από τη σχέση
                    xi = c tan (πui − π/2)            (11.10)
ή ισοδύναμα (για πιο γρήγορο πρόγραμμα)

                                  xi = c tan (2πui ) .                 (11.11)

   Περισσότερες εφαρμογές έχει η γεννήτρια Gaussian τυχαίων αριθ-
μών. Η κατανομή αυτή δίνεται από τη συνάρτηση πυκνότητας πιθανό-
τητας
                                 1
                                     e−x /(2σ )
                                        2    2
                      g(x) = √                             (11.12)
                                2π σ
Η συνάρτηση κατανομής είναι η
                     ∫ x                        (    )
                            ′     ′   1 1         x
              G(x) =     g(x ) dx = + erf √                (11.13)
                      −∞              2 2         2σ
11.1. (ΨΕΥΔΟ)ΤΥΧΑΙΟΙ ΑΡΙΘΜΟΙ                                                                      477

        0.0108



        0.0106



        0.0104



        0.0102



          0.01



        0.0098



        0.0096



        0.0094



        0.0092
                 0   1000   2000       3000    4000   5000   6000   7000    8000   9000   10000


Σχήμα 11.4: Το προηγούμενο σχήμα σε μεγαλύτερη κλίμακα για να φανεί καθαρότερα
η διασπορά.



               ∫x
όπου η erf(x) = −∞ exp{−(x′ )2 } dx′ είναι η error function η οποία μπο-
ρεί να υπολογιστεί αριθμητικά, καθώς και η αντίστροφή της. Αυτό θα
οδηγούσε σε πολύ αργό αλγόριθμο για τη γεννήτριά μας, οπότε χρησι-
μοποιούμε την πυκνότητα πιθανότητας ρ(x, y) δύο τυχαίων μεταβλητών
x, y

                  1                1                        1 −r2 /(2σ2 )
                      e−x /(2σ ) √     e−y /(2σ ) dx dy =
                         2    2           2    2
ρ(x, y) dx dy = √                                               e         r dr dϕ
                 2π σ             2π σ                    2πσ 2
                                                                      (11.14)
όπου x = r cos ϕ, y = r sin ϕ. Τότε, έχουμε ότι
                            ∫ r∫       2π
                                            dr dϕ ρ(r, ϕ) = 1 − e−r
                                                                      2 /(2σ 2 )
           u = G(r) =                                                                      (11.15)
                             0     0


η οποία όταν αντιστραφεί θα μας δώσει
                                              √
                                   r=σ            −2 ln(1 − u) .                           (11.16)

Οπότε, αρκεί να παράγουμε ακολουθία {ui } ομοιόμορφα κατανεμημέ-
478                              ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

           0.018
                                                                              100000
                                                                               10000
           0.016                                                                1000


           0.014


           0.012


            0.01


           0.008


           0.006


           0.004


           0.002
                   0    1000    2000    3000   4000    5000    6000    7000    8000      9000 10000

Σχήμα 11.5: H σχετική συχνότητα κατανομής των ψευδοτυχαίων αριθμών που παρά-
γονται από την συνάρτηση drandom() σαν συνάρτηση του μεγέθους του δείγματος των
τυχαίων αριθμών n για n = 1000, 10000, 100000.



νων τυχαίων αριθμών και να πάρουμε:
                                √
                         ri = σ −2 ln(ui )                                                      (11.17)
                        ϕi = 2πui+1                                                             (11.18)
                        xi = ri cos ϕi                                                          (11.19)
                      xi+1 = ri sin ϕi ,                                                        (11.20)

οπότε προκύπτει η ακολουθία {xi } που είναι Gaussian τυχαίοι αριθ-
μοί⁴. Ο προγραμματισμός της σχετικής συνάρτησης για σ = 1 δίνεται
παρακάτω:

! ===================================================
! Function t o produce random numbers d i s t r i b u t e d
! according to the gaussian d i s t r i b u t i o n
! g ( x ) = 1 / ( sigma * s q r t ( 2 * p i ) ) * exp(−x * * 2 / ( 2 * sigma * * 2 ) )
! ===================================================
r e a l ( 8 ) f u n c t i o n gaussran ( )
  i m p l i c i t none

   ⁴Μπορεί να δειχθεί ότι τα xi , xi+1 είναι στατιστικά ανεξάρτητα.
11.1. (ΨΕΥΔΟ)ΤΥΧΑΙΟΙ ΑΡΙΘΜΟΙ                                                 479


                5

               4.5

                4
       ln(σ)




               3.5

                3

               2.5

                2
                     6      7         8         9        10        11   12
                                             ln(n)
Σχήμα 11.6: H εξάρτηση της διασποράς (11.3) από το n για τη συνάρτηση drandom().



 r e a l ( 8 ) , parameter : : sigma = 1 . 0 D0
 real (8)                        : : r , phi
 l o g i c a l , save            : : new     = . TRUE .
 r e a l ( 8 ) , save            :: x
 r e a l ( 8 ) , parameter : : PI2           = 6.28318530717958648 D0
 real (8)                        : : drandom
 i f ( new ) then
   new             = . FALSE .
   r               =         drandom ( )
   phi             = PI2 * drandom ( )
   r               = sigma * sqrt ( −2.0 D0 * l o g ( r ) )
   x               = r * c o s ( phi )
   gaussran = r * s i n ( phi )
 else
   new             = . TRUE .
   gaussran = x
 endif
end f u n c t i o n gaussran

Το αποτέλεσμα φαίνεται στο σχήμα 11.7. Προσέξτε το attribute SAVE
στις μεταβλητές new και x. Αυτό σημαίνει πως η τιμή τους διατηρείται
ανάμεσα στα διαφορετικά καλέσματα της συνάρτησης drandom. Αυτό
γίνεται γιατί σε κάθε εφαρμογή της (11.17) παράγουμε 2 τυχαίους αριθ-
μούς, ενώ η συνάρτηση επιστρέφει τον ένα. Για το λόγο αυτό η συνάρ-
480                     ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ


          0.4
                                                       σ=1
         0.35                                          σ=2

          0.3

         0.25

          0.2

         0.15

          0.1

         0.05

            0
                 -6      -4      -2      0       2       4       6

Σχήμα 11.7: H κατανομή των ψευδοτυχαίων αριθμών που παράγονται από την συ-
νάρτηση gaussran() για σ = 1 και σ = 2. Το ιστόγραμμα υπερτίθεται της γραφικής
παράστασης της (11.12).



τηση διατηρεί μνήμη το αν θα πρέπει να παράγει καινούργιο ζευγάρι
(η “σημαία” (flag) new) και αν όχι, να επιστρέψει την τιμή ενός από
τους τυχαίους αριθμούς (μεταβλητή x). Η ανάλυση των αποτελεσμάτων
αφήνεται για άσκηση.


11.2 Χρήση Γεννητριών Ψευδοτυχαίων Αριθ-
     μών
Η χρήση της drandom() μπορεί να εξυπηρετήσει σχεδόν όλες μας τις
ανάγκες για την παραγωγή (ψευδο)τυχαίων αριθμών στο βιβλίο αυτό.
Πολλές φορές είναι αναγκαίο να χρησιμοποιήσουμε γεννήτριες που δί-
νουν καλύτερης ποιότητας τυχαίους αριθμούς και στην παράγραφο αυτή
θα δώσουμε οδηγίες για το πώς να χρησιμοποιήσετε δύο άλλες, καλής
ποιότητας και διαθέσιμες σχεδόν παντού, γεννήτριες.
   Η πρώτη είναι intrinsic στη γλώσσα Fortran και είναι η υπορου-
τίνα RANDOM_NUMBER. Στο περιβάλλον Fortran που δίνει η gfortran⁵ η
  ⁵Άλλα περιβάλλοντα Fortran μπορεί να χρησιμοποιούν άλλους αλγόριθμους, διαβά-
11.2. ΧΡΗΣΗ ΓΕΝΝΗΤΡΙΩΝ ΨΕΥΔΟΤΥΧΑΙΩΝ ΑΡΙΘΜΩΝ                                 481

RANDOM_NUMBER αυτή χρησιμοποιεί τον αλγόριθμο “multiply-with-carry”
του George Marsaglia σε συνδυασμό με γεννήτρια modulo και “shift-
register” με περίοδο μεγαλύτερη από 2123 ≈ 1037 . Η κατάσταση της γεν-
νήτριας είναι πιο πολύπλοκη από αυτή της drandom(), η οποία καθορί-
ζεται από ένα μόνο αριθμό, οπότε προκειμένου να τη χρησιμοποιήσουμε
πρέπει να μάθουμε

   • πώς να την ξεκινάμε από μια νέα κατάσταση

   • πώς να σώζουμε σε ένα αρχείο την τρέχουσα κατάσταση

   • πώς να διαβάζουμε και να ξεκινάμε τη γεννήτρια από μια παλιά
     κατάσταση

   • και φυσικά, πώς να παίρνουμε τους τυχαίους αριθμούς.

Ειδικά το πώς να σώζουμε την τρέχουσα κατάσταση μιας γεννήτριας
είναι πολύ σημαντικό, όταν έχουμε μια εργασία την οποία εκτελούμε
χωρίζοντάς την σε μέρη, συνήθως γιατί θέλουμε κάθε μέρος της εργασίας
να εκτελείται μέσα σε συγκεκριμένο χρονικό διάστημα. Στην περίπτωση
αυτή, θέλουμε η ακολουθία των τυχαίων αριθμών που θα πάρουμε όταν
ξεκινάει ένα νέο μέρος της εργασίας να είναι ακριβώς από το σημείο
που την είχαμε αφήσει στο προηγούμενο. Η διαδικασία αυτή λέγεται
checkpointing.
   Το ξεκίνημα από μια νέα κατάσταση λέγεται seeding. Το seeding για
τη RANDOM_NUMBER γίνεται από ένα απροσδιόριστο αριθμό από NSEEDS
ακέραιους. Για να μάθουμε ποιος είναι αυτός ο αριθμός, πρέπει να
καλέσουμε τη ρουτίνα RANDOM_SEED(size = NSEEDS) η οποία με το συ-
γκεκριμένο όρισμα size = NSEEDS θα μας δώσει τον αριθμό των seeds,
NSEEDS. Στη συνέχεια, πρέπει να ορίσουμε τις integer τιμές σε ένα array
μεγέθους NSEEDS, έστω το seeds(NSEEDS) και να καλέσουμε ξανά την
RANDOM_SEED(PUT = seeds) με το όρισμα PUT = seeds, η οποία θα απο-
θηκεύσει την κατάλληλη πληροφορία από το array seeds. Αυτό εμείς θα
το κάνουμε χρησιμοποιώντας ένα μόνο integer αριθμό seed. Ο απαραί-
τητος κώδικας για τα παραπάνω είναι:

  integer               : : NSEEDS
  integer , allocatable : : seeds ( : )
  integer               : : seed
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

στε την τεκμηρίωση του εκάστοτε μεταγλωττιστή. Για το λόγο αυτό ο αριθμός NSEEDS
μπορεί να διαφέρει από περιβάλλον σε περιβάλλον.
482                          ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

seed = 47279823
c a l l RANDOM_SEED ( s i z e = NSEEDS )
ALLOCATE( seeds ( NSEEDS ) )
seeds = seed + 37 * ( / ( i − 1 , i = 1 , NSEEDS ) / )
c a l l RANDOM_SEED ( PUT = seeds )

Η τελευταία γραμμή⁶ χρησιμοποιεί τις τιμές στο array seeds(1) ...
seeds(NSEEDS) για να αρχικοποιήσει την κατάσταση της RANDOM_NUMBER.
Το σημαντικό είναι ότι για την ίδια τιμή του seed θα πάρουμε κάθε φορά
την ίδια ακολουθία τυχαίων αριθμών.
   Πολλές φορές θέλουμε να ξεκινήσουμε τη γεννήτρια των τυχαίων
αριθμών από μια όσο το δυνατόν πιο τυχαία κατάσταση, έτσι ώστε
κάθε φορά που τρέχουμε το πρόγραμμα να παίρνουμε μια διαφορε-
τική ακολουθία τυχαίων αριθμών. Στα συστήματα τύπου Unix όπως το
GNU/Linux μπορούμε να χρησιμοποιήσουμε δύο ειδικά αρχεία που δί-
νουν σχεδόν κρυπτογραφικής ποιότητας τυχαίους αριθμούς, τα /dev/random
και /dev/urandom. Αυτά παράγουν τυχαία bits από την τρέχουσα κα-
τάσταση του υπολογιστή και είναι πρακτικά αδύνατον να προβλέψει
κανείς την ακολουθία bits που θα πάρει. Η /dev/urandom είναι προτι-
μότερη, γιατί η /dev/random σταματά να δουλεύει, όταν δεν έχει τελείως
καινούργια τυχαία bits στη δεξαμενή της και μπορεί να χρειαστεί να πε-
ριμένουμε να μας δώσει τα bits που ζητάμε. Ο απαραίτητος κώδικας
για seeding από την /dev/urandom είναι

open ( u n i t =13 , f i l e = ’ / dev / urandom ’ , a c c e s s = ’ stream ’ , &
 form= ’ unformatted ’ )
c a l l RANDOM_SEED ( s i z e = NSEEDS )
ALLOCATE( seeds ( NSEEDS ) )
read ( 1 3 ) seeds
close (13)

Το αρχείο /dev/urandom δίνει binary data και το ανοίγουμε ως unformatted,
για τον ίδιο λόγο η εντολή read δεν έχει οδηγία format, αλλά μόνο τον
αριθμό του unit. Η εντολή read διαβάζει όσα bits χρειάζονται για να γε-
μίσει όλο το array seeds. Μερικές φορές μπορεί να χρειαστεί να δουλέ-
ψουμε σε περιβάλλοντα που δε διαθέτουν το αρχείο /dev/urandom. Για
να ξεκινήσουμε τότε τη γεννήτρια χρησιμοποιούμε το τρέχοντα χρόνο
του λειτουργικού συστήματος και τον αριθμό της διεργασίας (process
ID = pid) του προγράμματος, όταν τρέχει. Στο συνοδευτικό λογισμικό,
στο αρχείο seed.f90, μπορείτε να δείτε πώς⁷.

  ⁶Η προτελευταία θέτει seeds(1)=seed, seeds(2)=seed+37, seeds(3)=seed+37*2, ...
  ⁷Μπορείτε να χρησιμοποιήσετε και το λειτουργικό σύστημα για να περάσετε τυχαία
11.2. ΧΡΗΣΗ ΓΕΝΝΗΤΡΙΩΝ ΨΕΥΔΟΤΥΧΑΙΩΝ ΑΡΙΘΜΩΝ                              483

   Στη συνέχεια, θα δούμε πώς να σώζουμε την τρέχουσα κατάσταση
της γεννήτριας. Χρησιμοποιούμε πάλι την υπορουτίνα RANDOM_SEED(get
= seeds) η οποία θα τοποθετήσει στο array seeds την απαραίτητη πλη-
ροφορία. Στη συνέχεια, γράφουμε τα seeds σε ένα αρχείο για να τα
διαβάσουμε αργότερα. Ο απαραίτητος κώδικας είναι:

  integer                               : : NSEEDS
  integer , allocatable                 : : seeds ( : )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  c a l l RANDOM_SEED ( s i z e = NSEEDS )
 ALLOCATE( seeds ( NSEEDS ) )
  c a l l RANDOM_SEED ( GET = seeds )
 open ( u n i t =11 , f i l e = ’ s t a t e ’ )
 w r i t e ( 1 1 , * ) seeds

Για να ξεκινήσουμε τη γεννήτρια από την κατάσταση που έχει σωθεί
μέσα στο αρχείο state, απλά διαβάζουμε τα seeds από το αρχείο και
ξεκινάμε τη γεννήτρια όπως πριν:

 open ( u n i t =11 , f i l e = ’ s t a t e ’ )
 read ( 1 1 , * ) seeds
 c a l l RANDOM_SEED ( PUT = seeds )

Για να παράγουμε τυχαίους αριθμούς, μπορούμε να χρησιμοποιήσουμε
μεταβλητή scalar για να τους διαβάζουμε έναν-έναν ή ένα array το οποίο
η RANDOM_NUMBER θα γεμίσει με τυχαίους αριθμούς. Η πρώτη μέθοδος
έχει ένα ελαφρό overhead στην απόδοση και αν μπορούμε να χρησι-
μοποιήσουμε arrays το προτιμούμε. Ο απαραίτητος κώδικας για την
παραγωγή τυχαίων αριθμών με την πρώτη μέθοδο είναι

  real (8)                     :: r
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 do icount = 1 , 1 0
   c a l l RANDOM_NUMBER ( r )
   print * , r
 enddo

ενώ με τη δεύτερη:

seeds στο πρόγραμμά σας. Δοκιμάστε τις εντολές set x = `< /dev/urandom tr -dc
"[:digit:]" | head -c9 | awk 'printf "%d",$1'` ; echo $x και set x = `perl
-e 'srand();print int(100000000*rand());'` ; echo $x. Χρησιμοποιήστε μετά την
τιμή μεταβλητής x για seed.
484                              ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ


 i n t e g e r , parameter        : : NR=20
 r e a l ( 8 ) , dimension ( NR ) : : randoms
 c a l l RANDOM_NUMBER ( randoms )
 p r i n t * , randoms


Τα παραπάνω συνοψίζονται στον κώδικα που βρίσκεται στο αρχείο
test_random_number.f90 τον οποίο παραθέτουμε παρακάτω:

program use_random_number
  i m p l i c i t none
  integer                                 : : NSEEDS
  integer , allocatable                   : : seeds ( : )
  integer                                 : : seed
  real (8)                                :: r
  i n t e g e r , parameter               : : NR=20
  r e a l ( 8 ) , dimension ( NR ) : : randoms
  integer (8)                             : : icount
  integer                                 :: i
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! s t a r t from a new seed :
  seed = 47279823
! g e t number o f s e e d s f o r g e n e r a t o r :
  c a l l RANDOM_SEED ( s i z e = NSEEDS )
 ALLOCATE( seeds ( NSEEDS ) )
! f i l l in the r e s t of the seeds :
  seeds = seed + 37 * ( / ( i − 1 , i = 1 , NSEEDS ) / )
! i n i t i a l i z e t h e g e n e r a t o r from t h e a r r a y s s e e d s :
  c a l l RANDOM_SEED ( PUT = seeds )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! g e n e r a t e random numbers one by one :
  do icount = 1 , 1 0
    c a l l random_number ( r )
    print * , r
  enddo
! g e n e r a t e random numbers i n an a r r a y :
  c a l l random_number ( randoms )
  p r i n t ’ (1000G28 . 1 7 ) ’ , randoms
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! save s t a t e o f random_number :
  open ( u n i t =11 , f i l e = ’rannum . seed ’ )
  c a l l RANDOM_SEED ( GET = seeds )
  w r i t e ( 1 1 , ’ (5 I20 ) ’ ) seeds
  close (11)
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! g e n e r a t e some randoms :
  c a l l random_number ( randoms )
  p r i n t ’ (A,1000G28 . 1 7 ) ’ , ’ #FIRST : ’ , randoms
11.2. ΧΡΗΣΗ ΓΕΝΝΗΤΡΙΩΝ ΨΕΥΔΟΤΥΧΑΙΩΝ ΑΡΙΘΜΩΝ                      485

!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! read s t a t e o f random_number :
  open ( u n i t =11 , f i l e = ’rannum . seed ’ )
  read ( 1 1 , * ) seeds
  c a l l RANDOM_SEED ( PUT = seeds )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! g e n e r a t e same randoms :
  c a l l random_number ( randoms )
  p r i n t ’ (A,1000G28 . 1 7 ) ’ , ’ #SECOND: ’ , randoms
end program use_random_number

Μεταγλωττίστε και δείτε τα αποτελέσματα με τις εντολές

> gfortran test_random_number . f90 −o random_number
> . / random_number

    Μια πολύ καλή γεννήτρια τυχαίων αριθμών προτάθηκε από τον Mar-
tin Lüscher [46] και το πρόγραμμα που τη χρησιμοποιεί λέγεται Ranlux.
Εκτός από την άριστη ποιότητα τυχαίων αριθμών με περίοδο μεγαλύ-
τερη από 10171 , το μεγάλο πλεονέκτημα της RANLUX είναι ότι ο κώδικας
θα τρέξει σε οποιαδήποτε πλατφόρμα διαθέτει Fortran, οπότε μπορείτε
να τη χρησιμοποιήσετε σε όλα σας τα προγράμματα, παντού. Το πρό-
γραμμα, το οποίο θα βρείτε και στο συνοδευτικό λογισμικό με κάποιες
μικρές μετατροπές ως προς τον αρχικό κώδικα, έχει γραφτεί από τον
Fred James και μπορείτε να το κατεβάσετε στην αρχική του μορφή
από τους συνδέσμους που δίνονται στη βιβλιογραφία [46]. Η γεννή-
τρια βασίζεται στον αλγόριθμο subtract-with-borrow των Marsaglia και
Zaman [48], ο οποίος έχει πολύ μεγάλη περίοδο, αλλά αποτυγχάνει σε
ορισμένα στατιστικά τεστ στα οποία υποβάλλεται. Βασιζόμενος στις
χαοτικές ιδιότητες του προαναφερόμενου αλγόριθμου, ο Lüscher πρό-
τεινε την εξαφάνιση των προβλημάτων αποδίδοντάς τα στους συσχετι-
σμούς των τυχαίων αριθμών που βρίσκονται κοντά μεταξύ τους στην
ακολουθία που παράγει ο αλγόριθμος.
    Για να ξεκινήσετε τη γεννήτρια από ένα συγκεκριμένο σημείο που
δίνεται από ένα seed που θα παρέχετε, χρησιμοποιείτε την υπορουτίνα
RLUXGO και ο απαραίτητος κώδικας είναι

  integer                          : : seed , ranlux_level
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 seed               = 58266273
 ranlux_level = 2
  c a l l RLUXGO ( ranlux_level , seed , 0 , 0 )
486                         ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

Προσέξτε την επιλογή της μεταβλητής ranlux_level: Αυτή καθορίζει
την ποιότητα των τυχαίων αριθμών που παράγει η ρουτίνα και μπο-
ρεί να παίρνει τιμές 1, 2, 3 ή 4. Για τις ανάγκες στο βιβλίο αυτό,
ranlux_level=2 είναι αρκετό, ranlux_level=3 είναι η προκαθορισμένη
τιμή. Φυσικά, όσο μεγαλύτερη η τιμή της ranlux_level, τόσο μεγαλύ-
τερος και ο χρόνος που χρειάζεται για την παραγωγή τυχαίων αριθμών
(δείτε σχετική άσκηση).
   Για να σώσουμε την κατάσταση που βρίσκεται η ρουτίνα, πρέπει
να έχουμε ορίσει ένα integer array μεγέθους 25 και να καλέσουμε την
υπορουτίνα RLUXUT για να αποθηκεύσει την κατάλληλη πληροφορία στο
array αυτό. Στη συνέχεια, μπορούμε να σώσουμε το array σε ένα αρ-
χείο για να το διαβάσουμε αργότερα. Ο απαραίτητος κώδικας για τη
λειτουργία αυτή είναι:

  i n t e g e r , parameter                 : : NSEEDS = 25
  i n t e g e r , dimension ( NSEEDS ) : : seeds
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 open ( u n i t =11 , f i l e = ’ ranl ux . seed ’ )
  c a l l RLUXUT ( seeds )
 w r i t e ( 1 1 , * ) seeds
  close (11)

Για να ξεκινήσουμε τη RANLUX από την κατάσταση που σώσαμε στο προ-
αναφερόμενο αρχείο, χρησιμοποιούμε την υπορουτίνα RLUXIN ως εξής:

 i n t e g e r , parameter                  : : NSEEDS = 25
 i n t e g e r , dimension ( NSEEDS ) : : seeds
 open ( u n i t =11 , f i l e = ’ ranl ux . seed ’ )
 read ( 1 1 , * ) seeds
 c a l l RLUXIN ( seeds )

Για να παράγουμε τυχαίους αριθμούς έναν-έναν χρησιμοποιώντας μια
μεταβλητή scalar, καλούμε την RANLUX ως εξής

  real (8)                  :: r
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  c a l l ranlux ( r , 1 )
  print * , r

ενώ για να πάρουμε πολλούς τυχαίους αριθμούς σε ένα μονοδιάστατο
array χρησιμοποιούμε τις εντολές
11.2. ΧΡΗΣΗ ΓΕΝΝΗΤΡΙΩΝ ΨΕΥΔΟΤΥΧΑΙΩΝ ΑΡΙΘΜΩΝ                           487

  i n t e g e r , parameter        : : NR=20
  r e a l ( 8 ) , dimension ( NR ) : : randoms
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  c a l l ranlux ( randoms , NR )
  p r i n t * , randoms

όπου η παράμετρος NR τίθεται κάθε φορά στην επιθυμητή τιμή. Βάζο-
ντας όλα τα παραπάνω μαζί σε ένα πρόγραμμα που θα βρείτε στο αρ-
χείο test_ranlux.f90, μπορούμε να δοκιμάσουμε τη χρήση της RANLUX:

program use_ranlux
  i m p l i c i t none
  i n t e g e r , parameter                 : : NSEEDS = 25
  i n t e g e r , dimension ( NSEEDS ) : : seeds
  integer                                   : : seed , ranlux_level
  integer (8)                               : : icount
  real (8)                                  :: r
  i n t e g e r , parameter                 : : NR=20
  r e a l ( 8 ) , dimension ( NR )          : : randoms
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! s t a r t from a new seed :
  seed                    = 58266273
  ranlux_level = 2
  c a l l RLUXGO ( ranlux_level , seed , 0 , 0 )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! g e n e r a t e random numbers one by one :
  do icount = 1 , 1 0
    c a l l ranlux ( r , 1 )
    print * , r
  enddo
! g e n e r a t e random numbers i n an a r r a y :
  c a l l ranlux ( randoms , NR )
  p r i n t ’ (1000G28 . 1 7 ) ’ , randoms
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! save s t a t e o f ran lux :
  open ( u n i t =11 , f i l e = ’ ranlux . seed ’ )
  c a l l RLUXUT ( seeds )
  w r i t e ( 1 1 , ’ (5 I20 ) ’ ) seeds
  close (11)
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! g e n e r a t e some randoms :
  c a l l ranlux ( randoms , NR )
  p r i n t ’ (A,1000G28 . 1 7 ) ’ , ’ #FIRST : ’ , randoms
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! read s t a t e o f ran lux :
  open ( u n i t =11 , f i l e = ’ ranlux . seed ’ )
  read ( 1 1 , * ) seeds
  c a l l RLUXIN ( seeds )
488                         ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! g e n e r a t e same randoms !
  c a l l ranlux ( randoms , NR )
  p r i n t ’ (A,1000G28 . 1 7 ) ’ , ’ #SECOND: ’ , randoms
end program use_ranlux


Μεταγλωττίστε, μαζί με το αρχείο ranlux.F που περιέχει τον κώδικα
για τη Ranlux, και τρέξτε το παραπάνω πρόγραμμα με τις εντολές

> g f o r t r a n test_ranlux . f90 ranlux . F −o ranlux
> . / ranlux




11.3 Τυχαίες Διαδρομές
Υποθέτουμε ότι ένα σωμάτιο μπορεί να βρεθεί στις θέσεις ενός τετρα-
γωνικού πλέγματος στις δύο διαστάσεις (στο επίπεδο). Αν σε κάποια
χρονική στιγμή βρίσκεται σε μια από τις θέσεις του πλέγματος και αφού
ισορροπήσει σε αυτή, τότε μπορεί να πηδήξει τυχαία σε μια γειτονική
θέση όπου με τη σειρά του κάθεται για κάποιο χρόνο και ισορροπεί.
Καθώς ισορροπεί, η ορμή που είχε και το βοήθησε να κάνει το πήδημα
χάνεται, οπότε χάνει τη μνήμη της θέσης που βρισκόταν προηγουμέ-
νως. Η διαδικασία αυτή επαναλαμβάνεται συνεχώς. Ο μηχανισμός του
φαινομένου δεν θα μας απασχολήσει⁸ και αναζητούμε μόνο ένα απλό
φαινομενολογικό μοντέλο της διαδικασίας.
    Υποθέτουμε ότι το σωμάτιο πηδάει με ίση πιθανότητα σε μια από τις
πλησιέστερες θέσεις του πλέγματος κάθε φορά που περνάει σταθερός
χρόνος τ . Οι θέσεις του πλέγματος απέχουν μεταξύ τους απόσταση a
(πλεγματική σταθερά). Το διάνυσμα που περιγράφει την μεταβολή της
θέσης του σωματιδίου στο i–οστό πήδημα είναι μια τυχαία μεταβλητή
ξ⃗i μέτρου |ξ⃗i | = a. Δηλαδή, δεδομένης της θέσης ⃗rk του σωματιδίου
τη χρονική στιγμή tk = kτ , η θέση του ⃗rk+1 τη χρονική στιγμή tk+1 =
(k + 1)τ = tk + τ θα είναι

                                     ⃗rk+1 = ⃗rk + ξ⃗k                   (11.21)

   ⁸Μπορεί λ.χ. να είναι θερμικά διεγερμένα ηχητικά κύματα που δίνουν στο σωμάτιο
την απαραίτητη ενέργεια για το πήδημα, το κβαντικό φαινόμενο σήραγγας κλπ
11.3. ΤΥΧΑΙΕΣ ΔΙΑΔΡΟΜΕΣ                                                    489

όπου                     
                         
                            ax̂       με   πιθανότητα          1
                                                               4
                            −ax̂       με   πιθανότητα          1
                    ξ⃗k =                                       4   .   (11.22)
                          
                            aŷ       με   πιθανότητα          1
                                                               4
                            −aŷ       με   πιθανότητα          1
                                                                4

Σύμφωνα με τα παραπάνω, οι τιμές των ξ⃗i είναι ανεξάρτητες από την
τιμή της θέσης που είχε προηγουμένως το σωμάτιο, οπότε οι τιμές ξ⃗i
και ξ⃗j είναι ασυσχέτιστες για i ̸= j και ισχύει ότι

                             ⟨ξ⃗i · ξ⃗j ⟩ = ⟨ξ⃗i ⟩ · ⟨ξ⃗j ⟩ .           (11.23)

Οι τιμές που παίρνουν τα ξ⃗i είναι ισοπίθανες, οπότε, επειδή οι θετικές
και αρνητικές τιμές συμβαίνουν το ίδιο συχνά οι θετικοί και αρνητικοί
όροι στον υπολογισμό της ⟨ξ⃗i ⟩ αλληλοαναιρούνται και έχουμε

                                      ⟨ξ⃗i ⟩ = ⃗0 ,                     (11.24)

και έτσι ⟨ξ⃗i · ξ⃗j ⟩ = 0 για i ̸= j. Επειδή το μήκος των διανυσμάτων είναι
σταθερό |ξ⃗i | = a, παίρνουμε επομένως τη σχέση

                                ⟨ξ⃗i · ξ⃗j ⟩ = a2 δi,j .                (11.25)

Η πιθανότητα να εμφανιστεί μια διαδρομή CN μήκους N είναι⁹
                                                   1
                                   p(CN ) =                             (11.26)
                                                  zN
όπου z = 4 ο αριθμός των πλησιέστερων γειτόνων μιας πλεγματικής
θέσης. Η πιθανότητα αυτή εξαρτάται από το μήκος της διαδρομής και
όχι από τη γεωμετρία της. Αυτό προκύπτει από την προφανή σχέση
p(CN +1 ) = z1 p(CN ), αφού υπάρχουν ακριβώς z ισοπίθανες περιπτώσεις.
Οπότε η συνάρτηση επιμερισμού είναι

                                    ZN = z N ,                          (11.27)

και είναι ίση με τον αριθμό των διαφορετικών διαδρομών μήκους N .
   Μέσα σε χρόνο t = N τ το σωμάτιο μετατοπίζεται κατά

                                            ∑
                                            N
                                   ⃗ =
                                   R              ξ⃗i .                 (11.28)
                                            i=1

   ⁹Δηλ. μετά από χρόνο t = N τ , όχι το φυσικό μήκος της καμπύλης. Μετράμε και
τα πηδήματα πάνω στους συνδέσμους του πλέγματος που έχει ήδη επισκεφτεί το
σωμάτιο.
490                  ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

Η μέση τιμή της μετατόπισης είναι 0

                                     ∑
                                     N
                           ⟨R⟩
                            ⃗ =             ⟨ξ⃗i ⟩ = ⃗0 .                   (11.29)
                                      i=1

Η μέση τιμή της μετατόπισης στο τετράγωνο είναι

                          ∑
                          N                        ∑
                                                   N
        ⟨R ⟩ = ⟨R
           2    ⃗ · R⟩
                    ⃗ =       ⟨ξ⃗i · ξ⃗j ⟩ = a2             δi,j = a2 N .   (11.30)
                          i,j=1                    i,j=1


Βγάζουμε λοιπόν το πολύ σημαντικό αποτέλεσμα ότι ο τυχαίος περι-
πατητής απομακρύνεται πολύ αργά από το αρχικό του σημείο
                         √         √    √
                   Rrms = ⟨R2 ⟩ = a N ∝ t .              (11.31)

Για σωμάτιο με μη μηδενική μέση ταχύτητα (δες πρόβλημα) αναμένεται
Rrms ∝ t.
   Η παραπάνω σχέση ορίζει έναν κρίσιμο εκθέτη ν

                                  ⟨R2 ⟩ ∼ N 2ν ,                            (11.32)

όπου το σύμβολο ∼ σημαίνει ασυμπτωτική συμπεριφορά για N → ∞.
Για ένα κλασικό περιπατητή ν = 1, ενώ για τον τυχαίο περιπατητή
ν = 12 .
    Παραλλαγές του Τυχαίου Περιπατητή (Random Walker – RW για
συντομία) αποτελούν ο Μη Επιστρέφων Τυχαίος Περιπατητής (Non
Reversal Random Walk – NRRW για συντομία) και ο Αυτοαποφεύγων
Τυχαίος Περιπατητής (Self Avoiding Random Walk – SAW για συντο-
μία). Ο NRRW ορίζεται όταν τα διανύσματα ξ⃗i επιλέγονται ισοπίθανα
αποκλείοντας την επιστροφή στο αρχικό σημείο. Ο SAW είναι ένας
NRRW όπου κάθε φορά που ο περιπατητής επισκέπτεται μία πλεγ-
ματική θέση που έχει ήδη επισκεφτεί, το ... περπάτημα σταματάει. Επί
πλέον είναι δυνατόν να προσθέσουμε, εκτός από την άπειρη απωστική
ενέργεια για σημεία που συμπίπτουν, και μια ελκτική ενέργεια −ϵ για
κάθε ζευγάρι σημείων που ανήκουν στη διαδρομή και είναι πλησιέστεροι
γείτονες. Κάθε επιτρεπόμενη διαδρομή θα ζυγίζεται τότε με πιθανότητα
κατά Boltzmann σύμφωνα με την (12.4).
    Για τον NRRW η σχέση (11.32) είναι ίδια με τον RW, δηλαδή ν =
1
2
  . Παρόλο που οι λεπτομέρειες των διαδρομών σε μικρές αποστάσεις
είναι διαφορετικές, οι ιδιότητες τους σε μακροσκοπικές κλίμακες είναι
παρόμοιες. Είναι περίπτωση συστημάτων που ανήκουν στην ίδια κλάση
11.3. ΤΥΧΑΙΕΣ ΔΙΑΔΡΟΜΕΣ                                         491

παγκοσμιότητας (universality class) σύμφωνα με τη συζήτηση που θα
βρείτε στην ενότητα 13.1.
   Δεν συμβαίνει το ίδιο και για τον SAW. Για το σύστημα αυτό προ-
βλέπεται ότι [49]
                                            3
                       ⟨R2 ⟩SAW ∼ N 2ν  ν= ,                (11.33)
                                            4
οπότε οι τυπικές διαδρομές στο πρότυπο αυτό είναι μεγαλύτερες από
τον RW. Αν εισάγουμε την έλξη μεταξύ πλησιέστερων γειτόνων σύμ-
φωνα με τα παραπάνω, τότε υπάρχει κρίσιμη θερμοκρασία βc τέτοια
ώστε για θερμοκρασία β < βc να έχουμε παρόμοια συμπεριφορά με
την (11.33), ενώ για β > βc οι διαδρομές να “συνθλίβονται” από την
αλληλεπίδραση και να παίρνουμε ν = 1/3 < νRW . Για β = βc έχουμε
ν = 21 . Για περισσότερες λεπτομέρειες παραπέμπουμε στο βιβλίο των
Binder-Heermann [7].
   Μπορούμε τώρα να προγραμματίσουμε τον τυχαίο περιπατητή. Ο
αλγόριθμος είναι πολύ απλός και οι μετρήσεις γίνονται με απλή δειγ-
ματοληψία:
   1. Επιλέγουμε αριθμό τυχαίων διαδρομών που θα παράγουμε.

   2. Επιλέγουμε αριθμό βημάτων κάθε διαδρομής.

   3. Επιλέγουμε αρχική θέση των διαδρομών

   4. Σε κάθε βήμα μιας διαδρομής επιλέγουμε με ίση πιθανότητα κί-
      νηση προς τα δεξιά, αριστερά, πάνω και κάτω.

   5. Στο τέλος κάθε διαδρομής, μετράμε τις ιδιότητες που μας ενδια-
              ⃗ R2 , κλπ).
      φέρουν (R,

   6. Στο τέλος υπολογίζουμε τις μέσες τιμές και σφάλματα στις ποσό-
      τητες που μετρήσαμε.
   Η μόνη έννοια που χρειάζεται να εξηγήσουμε πώς θα προγραμμα-
τίσουμε είναι αυτή της επιλογής της “τυχαίας διεύθυνσης ”. Το πρό-
γραμμα που δείχνεται παρακάτω θα το βρείτε στο αρχείο rw.f90

program random_walker
 i m p l i c i t none
 i n t e g e r , parameter : :   Nwalk = 1000
 i n t e g e r , parameter : :   Nstep = 100000
 integer                   ::    iwalk , istep , ir
 real (8)                  ::    x,y
 real (8)                  ::    drandom
492                             ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

 integer                      : : seed
 common / randoms /               seed

 seed = 374676287
 open ( u n i t =20 , f i l e = ’ dataR ’ )
 do iwalk = 1 , Nwalk
  x = 0.0 D0 ; y = 0.0 D0
  open ( u n i t =21 , f i l e = ’ data ’ )
  do istep =1 , Nstep
   ir = INT ( drandom ( ) * 4 )
    s e l e c t c a s e ( ir )
      case (0)
       x = x + 1 . 0 D0
      case (1)
       x = x − 1 . 0 D0
      case (2)
       y = y + 1 . 0 D0
      case (3)
       y = y − 1 . 0 D0
   end s e l e c t
    write (21 ,*) x , y
  enddo ! do i s t e p =1 , Nstep
  close (21)
  c a l l sleep ( 2 )
  w r i t e ( 2 0 , * ) x * x+y * y
  c a l l flush (20)
 enddo ! do iwalk = 1 , Nwalk
end program random_walker

Στο πρόγραμμα αυτό το μήκος των διαδρομών Nstep και ο αριθμός των
διαδρομών Nwalk είναι παράμετροι που έχουν προκαθορισμένες τιμές.
Οπότε για την αλλαγή των τιμών τους απαιτείται επαναμεταγλωττι-
σμός του προγράμματος. Τα αποτελέσματά μας τα αποθηκεύουμε στα
αρχεία dataR και data στα οποία αποθηκεύουμε το τετράγωνο της τε-
λικής μετατόπισης R2 του RW και τις συντεταγμένες των σημείων (x, y)
που επισκέπτεται ο περιπατητής, αντίστοιχα, σε κάθε διαδρομή. Για να
κάνουμε τα περιεχόμενα των αρχείων άμεσα διαθέσιμα, αδειάζουμε τα
I/O buffers με την υπορουτίνα flush(unit). Παρατηρούμε ότι το αρχείο
data ανοίγει και μηδενίζεται στην αρχή κάθε διαδρομής, οπότε περιέχει
της συντεταγμένες μιας μόνο διαδρομής.
   Κάθε διαδρομή εκτελείται σε Nstep βήματα, όπου αφού επιλεγεί το
τυχαίο διάνυσμα ξ⃗istep , προστίθεται στην εκάστοτε θέση ⃗ristep = (x, y).
To ξ⃗istep επιλέγεται στη γραμμή

    ir = INT ( drandom ( ) * 4 )
11.3. ΤΥΧΑΙΕΣ ΔΙΑΔΡΟΜΕΣ                                            493

όπου ο ir = 0, 1, 2, 3 λόγω της συνάρτησης INT που κόβει το δεκαδικό
μέρος ενός real. Οι τιμές του ir αντιστοιχούν στις τέσσερις δυνατές
          ⃗ Η ενημέρωση της θέσης του περιπατητή γίνεται με το select
τιμές του ξ.
case(ir) που ανάλογα με την τιμή του ir ενημερώνει τις συντεταγμένες
που μεταβάλλονται στην αντίστοιχη διεύθυνση.
   Για τη μεταγλώττιση του κώδικα και την εκτέλεση του προγράμμα-
τος δίνουμε τις εντολές

> g f o r t r a n rw . f90 drandom . f90 −o rw
> . / rw

που μας δίνει το εκτελέσιμο αρχείο rw που τρέχει το πρόγραμμα. Λόγω
της εντολής call sleep(2), το πρόγραμμα σταματάει για 2 δευτερό-
λεπτα κάθε φορά που ολοκληρώνεται μια διαδρομή (αφαιρέστε την,
όταν θα θέλετε να παράγετε πολλές διαδρομές). Αυτό μας επιτρέπει να
παρακολουθήσουμε γραφικά τις διαδρομές που παράγονται. Κατά τη
διάρκεια που το πρόγραμμα τρέχει, δώστε από το gnuplot την εντολή

gnuplot > p l o t ” data ” with lines

Επαναλάβετε την όσες φορές θέλετε για να δείτε άλλες τυχαίες δια-
δρομές. Για να γίνεται αυτή η διαδικασία αυτόματα χρησιμοποιήστε το
script eternal-rw από το συνοδευτικό λογισμικό:

> . / rw &
> . / eternal−rw &
> killall rw eternal−rw gnuplot

όπου την τελευταία εντολή τη δίνετε όταν θέλετε να τερματίσετε την
εκτέλεση των προγραμμάτων.
   Στο σχήμα 11.8 παρουσιάζονται τυπικές διαδρομές από το τρέξιμο
του παραπάνω προγράμματος. Στο σχήμα 11.9 φαίνονται τα αποτελέ-
σματα για την ποσότητα ⟨R2 ⟩ για N = 10, . . . , 100000 τα οποία επιβε-
βαιώνουν τη σχέση (11.30) ⟨R2 ⟩ = N . Το σχήμα αυτό μπορεί να αναπα-
ραχθεί ως εξής:

   1. Θέτουμε τις Nwalk και Nstep στις επιθυμητές τιμές στο αρχείο
      rw.f90. Αφαιρούμε τις εντολές call sleep(2) και write(21,*)
      x,y και μεταγλωττίζουμε τον κώδικα.

  2. Tρέχουμε το πρόγραμμα και αναλύουμε τα δεδομένα από το αρ-
     χείο dataR:
494                         ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ



         100


           50


            0


          -50


        -100

                 -100       -50         0         50        100

 Σχήμα 11.8: Τέσσερις τυπικές διαδρομές του τυχαίου περιπατητή για N = 10000.




      > . / rw
      > awk ’{ av += $1 }END{ p r i n t av / NR } ’ dataR

      και σημειώνουμε τα αποτελέσματα σε ένα αρχείο r2.dat σε δύο
      στήλες με το μήκος των διαδρομών N στην πρώτη και το υπο-
      λογιζόμενο ⟨R2 ⟩ στη δεύτερη. Το πρόγραμμα awk με την εντολή¹⁰
      {av+=$1} προσθέτει την πρώτη στήλη κάθε γραμμής του αρχείου
      dataR στη μεταβλητή av. Αφού διαβάσει το αρχείο, με την εντολή
      END{print av/NR}, τυπώνει τη μεταβλητή av διαιρεμένη με τον
      αριθμό των γραμμών στο αρχείο (NR = “Number of Records”).
      Παίρνουμε έτσι το μέσο όρο της πρώτης στήλης του dataR.

 3. Με τη μέθοδο των ελαχίστων τετραγώνων βρίσκουμε τη βέλτιστη
    ευθεία y = ax + b που περνάει από τα σημεία (ln N ,ln⟨R2 ⟩). Αυτό
    μπορεί να γίνει προσαρμόζοντας τα δεδομένα του αρχείου r2.dat
    με την εντολή fit του gnuplot:

      gnuplot > f i t a * x+b ” r2 . dat ” u ( l o g ( $1 ) ) : ( l o g ( $2 ) ) via a , b


 ¹⁰Η εντολή av+=$1 είναι ισοδύναμη με την av=av+$1.
11.3. ΤΥΧΑΙΕΣ ΔΙΑΔΡΟΜΕΣ                                                                    495



                16

                14

                12
      ln <R2>




                10

                8

                6

                4

                2
                     2    4        6        8        10       12       14       16
                                                 ln N
Σχήμα 11.9: Αριθμητική επιβεβαίωση της σχέσης ⟨R2 ⟩ = N για N = 10, . . . , 100000. Η
ευθεία γραμμή είναι προσαρμογή της συνάρτησης y = ax με a = 0.9994(13).



  4. Φτιάχνουμε τη γραφική παράσταση με την εντολή:

      gnuplot > p l o t ” r2 . dat ” u ( l o g ( $1 ) ) : ( l o g ( $2 ) ) w e , a * x+b

Φυσικά τα παραπάνω αποτελέσματα δεν έχουν νόημα αν δεν γνωρί-
ζουμε τα στατιστικά σφάλματα που υπεισέρχονται. Αφού πρόκειται για
στατιστικές ποσότητες ανεξάρτητες μεταξύ τους, η αναμενόμενη √ τιμή
προσεγγίζεται στο όριο άπειρων μετρήσεων με μια ταχύτητα ∼ 1/ M ,
όπου M είναι ο αριθμός των μετρήσεων. Επειδή παράγουμε στοχαστικά
ανεξάρτητες μεταξύ τους τυχαίες διαδρομές¹¹, το σφάλμα στις μετρή-
σεις μας θα δίνεται από τη σχέση (11.3), λ.χ.
                v       
                u
                u                        (         )2 
                u 1 1 ∑ 2 2                1 ∑ 2 
                              M               M
       δ⟨R2 ⟩ = t               (Ri ) −         R           (11.34)
                  M − 1 M i=1              M i=1 i

Το σφάλμα υπολογίζεται εύκολα, είτε προσθέτοντας τον υπολογισμό
στο πρόγραμμα rw.f90, είτε κρατώντας το βασικό πρόγραμμα στη δυ-
  ¹¹Αν υπάρχει στοχαστική εξάρτηση, τότε αυτή πρέπει να ληφθεί υπόψη όπως θα
δούμε στα επόμενα κεφάλαια.
496                      ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

νατόν απλούστερη μορφή και αφήνοντας την επαναλαμβανόμενη εργα-
σία σε εξωτερικά βοηθητικά προγράμματα (utilities). Στο αρχείο average
γράφουμε τις εντολές awk:

# ! / usr / bin / awk −f
{
    av += $1 ;         # t h e sum o f data
    er += $1 * $1 ; # t h e sum o f s q u a r e s o f data
}
END{
    av /= NR ;         # NR = ”Number o f Records ” = number o f l i n e s
    er /= NR ;
    # formula f o r e r r o r o f u n c o r r e l a t e d measurements
    er = s q r t ( ( er − av * av ) / ( NR −1) ) ;
    p r i n t av , ”+/−” , er ;
}

Το παραπάνω αρχείο είναι παράδειγμα από script το οποίο ερμηνεύεται
από την awk. Αυτό γίνεται αντιληπτό στο λειτουργικό σύστημα από την
πρώτη γραμμή #!/bin/awk -f που καλεί το πρόγραμμα όταν εκτελεστεί
το αρχείο average ως μια οποιαδήποτε εντολή. Για να γίνει αυτό, το
αρχείο πρέπει να γίνει εκτελέσιμο με την εντολή chmod a+x average.
Στη συνέχεια, μπορούμε να εκτελέσουμε τις εντολές που περιέχει πάνω
στο αρχείο dataR από τη γραμμή εντολών:

> . / average dataR

Θυμίζουμε πως στην awk οι εντολές που έχουμε μεταξύ { ... } εκτε-
λούνται για κάθε γραμμή του αρχείου dataR. Aυτές που είναι μεταξύ
END{ ... } εκτελούνται, αφού διαβαστεί όλο το αρχείο¹². Οπότε οι
γραμμές

  av += $1 ;        # t h e sum o f data
  er += $1 * $1 ;   # t h e sum o f s q u a r e s o f data

προσθέτουν στις μεταβλητές av και er την τιμή της πρώτης στήλης κάθε
γραμμής του αρχείου dataR και του τετραγώνου αυτής αντίστοιχα. Οι
γραμμές

  av /= NR ;        # NR = ”Number o f Records ” = number o f l i n e s

  ¹²Υπάρχει και η δυνατότητα εκτέλεσης εντολών πριν διαβαστεί το αρχείο (λ.χ. για
αρχικοποίηση μεταβλητών) όταν αυτές είναι μεταξύ BEGIN{ ... }
11.4. ΑΣΚΗΣΕΙΣ                                                  497

  er /= NR ;

εκτελούνται αφού διαβαστεί όλο το αρχείο dataR και διαιρούν τις πα-
ραπάνω μεταβλητές με την προκαθορισμένη μεταβλητή της awk NR. Αυτή
έχει σε κάθε στιγμή τιμή ίση με τον αριθμό των γραμμών του αρχείου
που έχει επεξεργαστεί το πρόγραμμα, άρα όταν εκτελείται το END{ ...
} έχει τιμή ίση με το συνολικό αριθμό γραμμών του αρχείου. Οι τελευ-
ταίες γραμμές του script κάνουν τον τελικό υπολογισμό του σφάλματος
σύμφωνα με τη σχέση (11.34) και τυπώνουν το αποτέλεσμα. Στο συ-
νοδευτικό λογισμικό, θα βρείτε το αρχείο rw1-anal.csh όπου όλες οι
παραπάνω εντολές κωδικοποιούνται σε ένα σενάριο φλοιού. Διαβάστε
τις οδηγίες χρήσεις στα αρχικά σχόλια που υπάρχουν εκεί.


11.4     Ασκήσεις
  1. Να αναπαράγετε τα αποτελέσματα του σχήματος 11.6 και να επι-
     βεβαιώσετε τη σχέση (11.5)

  2. Να παράγετε ακολουθία ψευδοτυχαίων αριθμών
                                          √        που έχουν Gaussian
     κατανομή με τυπική απόκλιση σ = 1/ 2. Να φτιάξετε το αντί-
     στοιχο σχήμα του 11.7 μαζί με τη συνάρτηση (11.12).

  3. Να παράγετε ακολουθία ψευδοτυχαίων αριθμών που έχουν κατα-
     νομή κατά Cauchy με c = 1. Να κάνετε το διάγραμμα σχετικών
     συχνοτήτων μαζί με τη συνάρτηση κατανομής.

  4. Να γράψετε πρόγραμμα που να υπολογίζει την περίοδο της συνάρ-
     τησης drandom(). Να ελέγξετε αν κατά τη διάρκεια της περιόδου
     παράγονται οι αριθμοί 0 και 1.

  5. Να ελέγξετε πόσο “κοστίζει” σε CPU χρόνο η παραγωγή τυχαίων
     αριθμών. Αν έχετε ένα εκτελέσιμο πρόγραμμα, λ.χ. random, τρέξτε
     το μαζί με την εντολή /usr/bin/time ως εξής:

     > / usr / bin / time . / random

     Όταν τελειώσει η εκτέλεση της εντολής, το πρόγραμμα /usr/bin/time
     θα τυπώσει στο stderr το χρόνο CPU που κατανάλωσε το πρό-
     γραμμα σε δευτερόλεπτα. Μετρήστε το χρόνο που χρειάζεται για
     την παραγωγή 109 τυχαίων αριθμών από την drandom(), την random_number
     και την ranlux. Στην τελευταία θα μεταβάλετε τον ranlux_level
498                    ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ

      από 1 έως 4. Πώς μεταβάλλεται ο χρόνος αυτός αν παράγετε τυ-
      χαίους αριθμούς με τις random_number και ranlux έναν-έναν και
      πώς αν τους ζητάτε σε ένα array μεγέθους 1000; Αν αυξήσετε
      το μέγεθος του array σε 10000, μεταβάλλεται ο χρόνος αυτός;
      (Υπόδειξη: Δείτε το αρχείο performance_ran.f90 στο συνοδευτικό
      λογισμικό)
  6. Για κάθε μία από τις γεννήτριες drandom(), random_number και
     ranlux να παράγετε 10 τυχαίους αριθμούς. Στη συνέχεια, να σώ-
     σετε την κατάστασή της σε ένα αρχείο. Μετά να παράγετε άλλους
     10 τυχαίους αριθμούς. Διαβάστε, στη συνέχεια, από το αρχείο την
     κατάσταση της γεννήτριας από το αρχείο και να παράγετε άλ-
     λους 10 τυχαίους αριθμούς. Βεβαιωθείτε πως οι δύο τελευταίες
     ακολουθίες είναι ίδιες.
  7. Μετατρέψτε το πρόγραμμα στο αρχείο seed.f90 που θα βρείτε στο
     συνοδευτικό λογισμικό, ώστε να κάνετε seeding τη ranlux. Να το
     κάνετε με δύο τρόπους: (a) Παράγοντας έναν seed και ξεκινώντας
     με την RLUXGO. (b) Παράγοντας 25 seeds και ξεκινώντας με την
     RLUXIN.
  8. Αποδείξτε ότι αν η μέση τιμή των διανυσμάτων ⟨ξ⃗i ⟩ = ⃗v τ , τότε
     ⟨R⟩
      ⃗ = ⃗v τ N και έχουμε γραμμική σχέση μεταξύ μετατόπισης–μήκους
     τροχιάς. Η ποσότητα ⃗v είναι η μέση ταχύτητα του σωματιδίου.
     Υπολογίστε το ⟨R2 ⟩ για μεγάλες τιμές του N .
  9. Εξετάστε αριθμητικά τις παραπάνω σχέσεις θέτοντας στον κώδικά
     σας την πιθανότητα στην πρώτη γραμμή της (11.22) ίση με 1/2
     και τις υπόλοιπες 1/6. Υπολογίστε τις ποσότητες ⟨(ξi )x ⟩, ⟨(ξi )y ⟩ και
     από αυτές τη μέση ταχύτητα του σωματιδίου. Εξετάστε τις σχέσεις
     ⟨R2 ⟩ ∼ N α και ⟨Rx ⟩ ∼ N 2ax ⟨Ry ⟩ ∼ N 2ay . Ποια η σχέση μεταξύ a,
     ax και ay ;
 10. Μεταβάλετε το πρόγραμμα rw.f90, ώστε ο χρήστης να παρέχει στο
     πρόγραμμα τις παραμέτρους Nwalk και Nstep από τα ορίσματα
     της εντολής που δίνει για να τρέξει το πρόγραμμα (δηλ. ./rw 100
     2000 αν θέλει να παράξει 100 τυχαίες διαδρομές με N = 2000).
     Χρησιμοποιήστε για το λόγο αυτό τις συναρτήσεις της Fortran
     GETARG και IARGC. (Υποδ.: δείτε το αρχείο rw1.f90 στο συνοδευτικό
     λογισμικό)
 11. Για τον τυχαίο περιπατητή γνωρίζουμε ότι ⟨R⟩   ⃗ = ⃗0. Υπολογίστε
     τις μέσες τιμές ⟨x⟩ και ⟨y⟩ για N = 100, 100000. Είναι πραγματικά
11.4. ΑΣΚΗΣΕΙΣ                                                  499

    μηδέν; Γιατί; Πώς εξαρτάται το αποτέλεσμά σας από τον αριθμό
    των μετρήσεων;

12. Υπολογίστε τη μέση τιμή του αριθμού των φορών που ο τυχαίος
    περιπατητής επιστρέφει στο αρχικό σημείο σαν συνάρτηση του N .
    Τι συμβαίνει για N → ∞ και γιατί;

13. Να αναπαράγετε τo σχήμα 11.9 για τον τυχαίο περιπατητή RW.

 14. Να γράψετε πρόγραμμα που να υλοποιεί τον αλγόριθμο για τον
     NRRW και να αναπαράγετε τo αντίστοιχο του σχήματος 11.9.

15. Στο πρόγραμμα rw.f90 η θέση του περιπατητή καθορίζεται από
    δύο REAL(8) μεταβλητές x,y. Η επόμενη θέση υπολογίζεται από τη
    σχέση x=x+1.0D0, y=y+1.0D0. Συζητήστε πόσο μεγάλες διαδρομές
    μπορείτε να μελετήσετε με αυτή την επιλογή. Να λάβετε υπόψη
    σας τη σχέση ⟨R2 ⟩ = N .

16. Να επαναλάβετε την προηγούμενη άσκηση ορίζοντας INTEGER(8)
    μεταβλητές x,y. Η επόμενη θέση υπολογίζεται τώρα από τη σχέση
    x=x+1, y=y+1. Συζητήστε τα πλεονεκτήματα και μειονεκτήματα
    κάθε επιλογής.

 17. Να επαναλάβετε την προηγούμενη άσκηση ορίζοντας INTEGER(4)
     μεταβλητές x,y. Συζητήστε τα πλεονεκτήματα και μειονεκτήματα
     κάθε επιλογής μετρώντας τώρα και πόσο γρήγορα τρέχει το πρό-
     γραμμά σας με την εντολή /usr/bin/time.

18. Να γράψετε κώδικα για τον SAW. Μέχρι πόσο μεγάλο N μπο-
    ρείτε να προσομοιώσετε; Να δείξετε πως ο υπολογιστικός χρόνος
    για τον υπολογισμό δεδομένου αριθμού τυχαίων διαδρομών αυ-
    ξάνει τουλάχιστον εκθετικά με το μέγεθος της διαδρομής N . Να
    αναζητήσετε στο ίντερνετ με πιο αλγόριθμο είναι δυνατόν να γίνει
    η προσομοίωση του SAW για αρκετά μεγάλα N .
500   ΚΕΦΑΛΑΙΟ 11. Ο ΤΥΧΑΙΟΣ ΠΕΡΙΠΑΤΗΤΗΣ
ΚΕΦΑΛΑΙΟ 12

Προσομοιώσεις Μόντε Κάρλο

Στο κεφάλαιο αυτό γίνεται επισκόπηση των βασικών αρχών της μεθό-
δου υπολογισμού Μόντε Κάρλο σε συστήματα της στατιστικής φυσικής.
Στην αρχή γίνεται μια επισκόπηση μερικών βασικών εννοιών της στα-
τιστικής φυσικής. Στόχος είναι οι έννοιες αυτές να “φρεσκαριστούν” σε
σύντομο χώρο στο κείμενο, οπότε δεν γίνεται προσπάθεια να είμαστε
απόλυτα ακριβείς. Ειδικά, αναφερόμαστε στη συνάρτηση επιμερισμού
της κανονικής συλλογής, στην εντροπία, στην πυκνότητα καταστάσεων
και στη μελέτη των διακυμάνσεων των θερμοδυναμικών ποσοτήτων.
Προτρέπουμε τον αναγνώστη να ανατρέξει στη βιβλιογραφία για πιο
πλήρη κατανόηση των εννοιών αυτών όπως, ενδεικτικά, στα συγγράμ-
ματα [4, 42, 50, 51, 52, 53].
   Δεν υπάρχει ενδιαφέρον φυσικό σύστημα του οποίου ο υπολογισμός
της συνάρτησης επιμερισμού να γίνεται με απ’ ευθείας υπολογισμό.
Στις περισσότερες περιπτώσεις καταφεύγουμε σε στατιστική δειγματο-
ληψία και η πιο διαδεδομένη μέθοδος, λόγω της αποτελεσματικότητας
της και της γενικής της εφαρμογής, είναι η μέθοδος Μόντε Κάρλο. Είναι
αξιοσημείωτο ότι σε συστήματα όπως το απλό πρότυπο Ising χρήσιμα
αποτελέσματα μπορούν να εξαχθούν σε μία τυπική προσομοίωση που
γίνεται σε ένα λάπτοπ με τη μελέτη δειγμάτων της τάξης του ≈ 10−3000
συνολικού χώρου των καταστάσεων¹. Για πιο πολύπλοκα συστήματα, ο
λόγος αυτός γίνεται ακόμα πιο εντυπωσιακός. Αυτό γίνεται διαισθητικά
αποδεκτό λαμβάνοντας υπόψη ότι και στο εργαστήριο ένα πραγματικό
στατιστικό σύστημα μας δίνει πειραματική πληροφορία, όταν μέσα στο
χρόνο του πειράματος το σύστημα επισκέπτεται ακόμα μικρότερα πο-

   ¹Λ.χ. για το d = 2, L = 100 πρότυπο Ising έχουμε 2100×100 = 210000 ≈ 103010
καταστάσεις. Σε μια τυπική προσομοίωση παίρνουμε δείγμα από ≈ 107 καταστάσεις
δηλ. ποσοστό ≈ 10−3003 !


                                     501
502             ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

σοστά του φασικού χώρου².


12.1 Στατιστική Φυσική
Η Στατιστική Φυσική έχει σκοπό να περιγράψει συστήματα με πολύ
μεγάλο αριθμό βαθμών ελευθερίας N . Απλά συστήματα έχουν τυπικά
N ≈ 1023 – 1044 . Για τα συστήματα αυτά οι εξισώσεις που περιγρά-
φουν μικροσκοπικά το σύστημα είναι πρακτικά αδύνατον και τελικά
μάλλον άχρηστο να λυθούν. Αρκούν μερικά σωστά ορισμένες “ιδιότητες
όγκου” (bulk properties) του συστήματος για να μας δώσουν τις χρήσι-
μες φυσικές πληροφορίες για το σύστημα. Λ.χ. σε έναν μαγνήτη πολλές
φορές μας αρκεί να γνωρίζουμε την εσωτερική ενέργεια και μαγνήτιση
του υλικού, σε ένα ρευστό την ενέργεια και πυκνότητά του κ.ο.κ. και
όχι αναλυτικά την θέση, ενέργεια, ορμή και στροφορμή κάθε σωματι-
δίου που τα αποτελούν. Αυτά είναι γνωστά από τη θερμοδυναμική, στη
στατιστική φυσική όμως γίνεται η απόπειρα να παραχθούν οι παρα-
πάνω ιδιότητες των συστημάτων από τις μικροσκοπικές τους ιδιότητες,
δηλ. κινηματική – βαθμοί ελευθερίας και δυναμική – Hamiltonian του
συστήματος.
   Στην περίπτωσή μας θα κάνουμε τις, όχι ιδιαίτερα περιοριστικές,
υποθέσεις ότι το σύστημά μας περιγράφεται από διακριτές καταστά-
σεις που μπορούν να απαριθμηθούν μέσα σε ένα σύνολο {µ} με αντί-
στοιχες ενέργειες E0 < E1 < . . . < En < . . . Το σύστημα αυτό είναι σε
επαφή με μεγάλη δεξαμενή θερμότητας θερμοκρασίας β = 1/kT με το
οποίο μπορεί να αλληλεπιδρά. Η επαφή με τη δεξαμενή και η δυναμική
των βαθμών ελευθερίας έχει σαν αποτέλεσμα να συμβαίνουν τυχαίες
μεταβάσεις μεταξύ καταστάσεων οι οποίες μπορούν να αλλάζουν την
ενέργεια του συστήματος³. Η θεμελιώδεις ποσότητες που μας ενδιαφέ-
ρουν είναι τα βάρη (weights) wµ (t) που μας δίνουν την πιθανότητα να
είναι το σύστημα στην κατάσταση µ τη χρονική στιγμή t. Αυτές κωδι-
κοποιούν την μικροσκοπική φυσική στη στατιστική φυσική.

   ²Ένα τυπικό αέριο με 1022 μόρια σε δοχείο 1 λίτρου σε θερμοκρασία δωματίου
και ατμοσφαιρική πίεση έχει μόρια που κινούνται με τυπικές ταχύτητες ≈ 100ms−1
δηλ. τυπικό μήκος κύματος κατά de Broglie ≈ 10−10 m δίνοντας ≈ 1027 διαφορετικές
                                                          22
καταστάσεις ανά μόριο. Συνολικά το σύστημα έχει (1027 )10 καταστάσεις Με ένα τυ-
πικό ρυθμό από 10 κρούσεις ανά δευτερόλεπτο έχουμε ≈ 1031 αλλαγές καταστάσεων
                 9
                                                       23
ανά δευτερόλεπτο. Άρα θα χρειαστεί χρόνο περίπου 1010 την ηλικία του σύμπαντος,
ώστε το σύστημα να επισκεφτεί όλες τις καταστάσεις [4].
   ³Σε ένα απομονωμένο σύστημα η ενέργεια διατηρείται. Τέτοια συστήματα στη
στατιστική φυσική μελετώνται στη μικροκανονική συλλογή.
12.1. ΣΤΑΤΙΣΤΙΚΗ ΦΥΣΙΚΗ                                           503

   Έστω ότι R(µ → ν) δίνουν το ρυθμό μετάβασης από την κατάσταση
µ → ν, δηλ.

    R(µ → ν)dt = Πιθανότητα μετάβασης µ → ν στο χρόνο dt        (12.1)

Τότε μπορούμε να γράψουμε την πολύ γενική “δεσπόζουσα εξίσωση”
(master equation):

           dwµ (t)   ∑
                   =     {wν (t)R(ν → µ) − wµ (t)R(µ → ν)}
             dt       ν
          ∑
            wµ (t) = 1 .                                        (12.2)
           µ

Η πρώτη από τις παραπάνω εξισώσεις μας λέει απλά ότι η μεταβολή
του βάρους wµ (t) είναι ίση με το ρυθμό που το σύστημα εισέρχεται
στην κατάσταση µ από οποιαδήποτε άλλη ν μείον το ρυθμό με τον
οποίο φεύγει από την κατάσταση µ. Η δεύτερη εκφράζει ότι τα βάρη
wµ (t) ερμηνεύονται ως πιθανότητα και φυσικά η πιθανότητα να είναι το
σύστημα σε κάποια κατάσταση είναι ίση με 1.
    Οι ρυθμοί μετάβασης R(µ → ν) προκύπτουν από τη θερμική φύση της
αλληλεπίδρασης του συστήματος με τη θερμική δεξαμενή. Στην πράξη
αυτοί προσομοιώνονται με κατάλληλες επιλογές κατά τη διάρκεια των
υπολογισμών Μόντε Κάρλο. Τα R(µ → ν) θεωρούνται ανεξάρτητα του
χρόνου, οπότε το παραπάνω σύστημα εξισώσεων για τα wµ (t) είναι
γραμμικό, και ο περιορισμός 0 ≤ wµ (t) ≤ 1 οδηγεί στο (μη τετριμμένο)
συμπέρασμα ότι σε άπειρο χρόνο τα wµ (t) συγκλίνουν γρήγορα (για
μεγάλα συστήματα) σε αριθμούς pµ , τις πιθανότητες κατάληψης ισορ-
ροπίας. Δηλαδή μετά από κάποιο χρόνο
                                         ∑
                   pµ = lim wµ (t) ,        pµ = 1 .            (12.3)
                       t→∞
                                               µ

Οι πιθανότητες pµ για σύστημα σε ισορροπία με θερμική ισορροπία με
δεξαμενή θερμοκρασίας β = 1/kT , k = 1.38 × 10−23 JK −1 μπορεί να
δειχθεί (Gibbs 1902) ότι ακολουθούν την κατανομή Boltzmann
                                    1 −βEµ
                             pµ =     e    .                    (12.4)
                                    Z
Η παράμετρος β θα αναφέρεται απλά ως η θερμοκρασία του συστή-
ματος και βλέπουμε ότι μέσω του εκθετικού στην εξίσωση (12.4) κα-
θορίζει μία χαρακτηριστική ενέργεια για το σύστημα. H μέτρησή της
σε βαθμούς Kelvin κλπ οφείλεται σε ιστορικό ατύχημα εξαιτίας της
504           ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

άγνοιας της μικροσκοπικής της προέλευσης κατά την αρχική θεμελίωση
της θερμοδυναμικής.
   Η σταθερά Z στην (12.4) είναι η συνάρτηση επιμερισμού του συστή-
ματος
∑      και είναι η σταθερά κανονικοποίησης της κατανομής pµ . Η σχέση
  µ pµ = 1 μας δίνει
                                  ∑
                           Z(β) =    e−βEµ                      (12.5)
                                     µ

   Η τιμή μιας φυσικής ποσότητας που μετριέται στο εργαστήριο έχει
στοχαστικό χαρακτήρα. Για συστήματα με πολύ μεγάλο αριθμό βαθμών
ελευθερίας N πρακτικά κάποιος ενδιαφέρεται για τη μέση τιμή μιας
ποσότητας. Αυτό γίνεται γιατί η πιθανότητα να μετρηθεί μια τιμή που
διαφέρει σημαντικά από τη μέση τιμή είναι αμελητέα. Σύμφωνα με τα
παραπάνω η μέση τιμή ⟨O⟩ μιας φυσικής ποσότητας O η οποία παίρνει
την τιμή Oµ στην κατάσταση µ θα είναι
                          ∑              1∑
                  ⟨O⟩ =       p µ Oµ =      Oµ e−βEµ .          (12.6)
                          µ
                                         Z

Όπως θα δούμε παρακάτω, η τυπική απόκλιση ∆O για ένα τυπικό θερ-
μοδυναμικό σύστημα είναι τέτοια, ώστε

                              ∆O   1
                                 ∼√ ,                           (12.7)
                               O   N

ποσοστό το οποίο είναι αμελητέο για συνήθη μακροσκοπικά συστή-
ματα (π.χ. για N ∼ 1023 έχουμε ∆O/O ∼ 10−11 ). Για το λόγο αυτό,
όταν το σύστημα είναι μεγάλο, οι διακυμάνσεις μπορούν να αγνοηθούν.
Το όριο N → ∞ ονομάζεται θερμοδυναμικό όριο και το ενδιαφέρον
μας εστιάζεται στην συμπεριφορά του συστήματος στο όριο αυτό. Στην
πράξη, ενώ τα συστήματα στο εργαστήριο είναι τις περισσότερες φορές
πολύ κοντά στο όριο αυτό, στις προσομοιώσεις μας, πολύ συχνά, δεν
είναι δυνατόν να μελετήσουμε αρκετά μεγάλα συστήματα. Η όλη τέχνη
επικεντρώνεται στο σχεδιασμό αλγορίθμων προσομοίωσης και μεθόδων
ανάλυσης, έτσι ώστε να έχουμε εμπιστοσύνη ότι τα αποτελέσματά μας
αντανακλούν τη συμπεριφορά του συστήματος στο θερμοδυναμικό όριο.
   Η συνάρτηση επιμερισμού κωδικοποιεί λόγω του ορισμού (12.5) όλη
τη στατιστική πληροφορία για το σύστημα. Δεν είναι μια απλή συνάρ-
τηση μίας μεταβλητής (της β), αλλά απαριθμεί με σχετικό βάρος τις
δυνατές καταστάσεις του συστήματος. Απλό παράδειγμα αποτελεί ο
υπολογισμός μέσω αυτής της μέσης ενέργειας ⟨E⟩ (εσωτερικής ενέρ-
12.2. ΕΝΤΡΟΠΙΑ                                                          505

γειας U στη θερμοδυναμική) του συστήματος:

                 1∑               1 ∑ ∂ −βEµ    1 ∂ ∑ −βEµ
  U ≡ ⟨E⟩ =          Eµ e−βEµ = −        e   =−        e
                 Z µ              Z µ ∂β        Z ∂β µ
            1 ∂Z    ∂ ln Z
      = −        =−        .                                          (12.8)
            Z ∂β      ∂β

   Με τον ίδιο τρόπο μπορεί κανείς να υπολογίσει την ειδική θερμότητα

            ∂U   ∂β ∂U              ∂ 2 ln Z           2
                                                    2 ∂ ln Z
       C=      =       = (−kβ 2 )(−          ) = kβ          .        (12.9)
            ∂T   ∂T ∂β                ∂β 2             ∂β 2


12.2      Εντροπία
Από τη θερμοδυναμική γνωρίζουμε ότι η εντροπία S ενός θερμοδυναμι-
κού συστήματος ορίζεται από τη σχέση

                               ∂F
                        S=−       ,   F = U − TS ,                   (12.10)
                               ∂T
όπου F είναι η ελεύθερη ενέργεια του συστήματος. Θα επιχειρήσουμε
τώρα να δώσουμε ορισμούς που να είναι συνεπείς με τους παραπάνω
και να προκύπτουν από τις μικροσκοπικές καταστάσεις του συστήμα-
τος.
   Ορίζουμε την ελεύθερη ενέργεια από τη σχέση
                                      ∑
                        e−βF = Z ≡        e−βEµ ,                    (12.11)
                                      µ


ή ισοδύναμα

                                  1
                             F = − ln Z .                            (12.12)
                                  β

Παρατηρήστε ότι ο παραπάνω ορισμός της F ταυτίζεται με την ενέργεια
θεμελιώδους κατάστασης για T → 0⁴. Πράγματι τότε β → ∞ και ο μόνος
όρος που επιζεί στο άθροισμα (12.11) είναι ο πρώτος. Για τον λόγο αυτό
από την (12.10) θα έχουμε limT →0 S = 0 που είναι ο τρίτος νόμος της
θερμοδυναμικής.
   ⁴Όταν δεν υπάρχει αυθόρμητο σπάσιμο συμμετρίας που οδηγεί σε εκφυλισμό της
ενέργειας της θεμελιώδους κατάστασης.
506            ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

   Ο ορισμός (12.11) είναι συνεπής με την (12.10), γιατί

         ∂ ln Z     ∂              ∂F       ∂F
 U =−           = − (−βF ) = F + β    =F −T    = F + T S . (12.13)
           ∂β      ∂β              ∂β       ∂T

   Η σύνδεση της εντροπίας S με τη μικροφυσική γίνεται με τις σχέσεις
(12.11) και (12.10):
         S   U −F                 ∑         1
           =      = β(U − F ) = β(   pµ Eµ + ln Z) .          (12.14)
         k    kT                   µ
                                            β

Αλλά
                         e−βEµ         1
                  pµ =         ⇒ Eµ = − (ln pµ + ln Z) ,      (12.15)
                           Z           β
οπότε
              S     ∑( 1                      1
                                                  )
                = β    − (ln pµ + ln Z)pµ + ln Z
              k     µ
                          β                  β
                    ∑                 ∑
                = −   pµ ln pµ − ln Z   pµ + ln Z
                           µ                        µ
                         ∑
                  = −          pµ ln pµ .                     (12.16)
                           µ


Τελικά                                  ∑
                               S = −k           pµ ln pµ      (12.17)
                                            µ

    Ας κάνουμε μία διερεύνηση του παραπάνω τύπου. Ας υποθέσουμε
ότι σε ένα (ομολογουμένως ασυνήθιστο ⁵) σύστημα όλες οι καταστάσεις
έχουν την ίδια ενέργεια. Στην περίπτωση αυτή, με απλή αντικατάσταση
στην εξίσωση (12.17) παίρνουμε ότι
                               1
                      pµ =       = σταθ. ⇒ S = k ln g .       (12.18)
                               g

Δηλαδή η εντροπία μετράει τον αριθμό των καταστάσεων του συστήμα-
τος, όπως ακριβώς και στην περίπτωση της μικροκανονικής συλλογής.
Πράγματι, η τελευταία σχέση προκύπτει και για την κατανομή
                            { 1
                              g(E)
                                   Eµ = E
                       pµ =                ,               (12.19)
                               0 Eµ ̸= E
  ⁵π.χ. η δισδιάστατη κβαντική βαρύτητα απουσία ύλης
12.2. ΕΝΤΡΟΠΙΑ                                                          507

που μπορεί να θεωρηθεί πως δίνει την μικροκανονική συλλογή αφού
βάζει τον περιορισμό Eµ = E = σταθ. Η συνάρτηση g(E) [σε πολλά
βιβλία συμβολίζεται με Ω(E)] μετράει τον αριθμό των καταστάσεων με
ενέργεια ίση με E. Από αυτή προκύπτει η πιθανότητα p(E) το σύστημα
να βρεθεί να έχει ενέργεια E
                       ∑                 1 ∑ −βEµ        1     ∑
   p(E) = ⟨δE,Eµ ⟩ =        pµ δE,Eµ =      e     δE,Eµ = e−βE   δE,Eµ .
                       µ
                                         Z               Z

                    ∑                                               (12.20)
Επειδή προφανώς         µ δE,Eµ   = g(E), παίρνουμε

                                               g(E) e−βE
                           p(E) = ⟨δE,Eµ ⟩ =             .          (12.21)
                                                  Z
Για ένα τυπικό σύστημα σαν αυτά που θα μελετήσουμε ισχύει

                                   g(E) ∼ E αN                      (12.22)

όπου N ο αριθμός των βαθμών ελευθερίας του συστήματος και α μια
σταθερά. Η ποιοτική συμπεριφορά της κατανομής (12.21) φαίνεται στο




                           ∆Ε                    p(E)
                                                   αN
                                                 E-βE
                                                 e



                        Ε∗

Σχήμα 12.1: Η πιθανότητα p(E) όπως προκύπτει από τον ανταγωνισμό του παράγο-
ντα Boltzmann e−βE και της πυκνότητας καταστάσεων g(E) ∼ E αN για μία τυπική
περίπτωση.



σχήμα 12.1. Γενικά παρατηρούμε ότι οι πιθανές τιμές της ενέργειας
επικεντρώνονται γύρω από μια τιμή E ∗ και η απόκλιση ∆E είναι ένα
508                 ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

μέτρο της διασποράς των τιμών που, όπως θα δείξουμε παρακάτω,√ ο
λόγος ∆E/E μειώνεται με το N με χαρακτηριστική συμπεριφορά 1/ N .
Πράγματι, η συνάρτηση (ανάλογη της p(E))

                            p̃(E) = E αN e−βE = e−βE−αN ln E                           (12.23)

έχει μέγιστο, όταν

      ∂ ln p̃(E)                   ∂                                                αN
                           =0⇒       (−βE + αN ln E)                       = −β +      =0
         ∂E        E=E ∗          ∂E                               E=E ∗            E∗
                                                                                       (12.24)
ή
                                               α
                                      E∗ =       N.                                    (12.25)
                                               β
Το E ∗ μετατοπίζεται προς μεγαλύτερες τιμές με την αύξηση της θερ-
μοκρασίας (μείωση του β) και είναι, όπως αναμένεται, ανάλογο του
μεγέθους του συστήματος. Αναπτύσσοντας κατά Taylor

                                                  ∂ ln p̃(E)
             ln p̃(E) = ln p̃(E ∗ ) + (E − E ∗ )
                                                      ∂E      E=E ∗
                                               2
                                   1          ∂ ln p̃(E)
                                + (E − E ∗ )2                    + ...
                                   2             ∂E 2      E=E ∗
                                                     (           )
                                     ∗  1        ∗ 2       αN
                           = ln p̃(E ) + (E − E ) − ∗ 2 + . . . ,                      (12.26)
                                        2                 (E )

                                                                                        ∂ 2 ln p̃(E)
όπου χρησιμοποιήσαμε την συνθήκη (12.24) και υπολογίσαμε την                                ∂E 2
                                                                                                               .
                                                                                                       E=E ∗
Οπότε, προκύπτει ότι
                                                       (E−E ∗ )2
                                                 −αN
                               p(E) ≈ p(E ∗ )e          2(E ∗ )2   .                   (12.27)

Η παραπάνω κατανομή είναι Gaussian με τυπική απόκλιση
                     √           √
                                             √
                          ∗
                        (E ) 2     ( αN
                                      β
                                        )2    N
               ∆E ∼            =           ∼    ,                                      (12.28)
                         αN          αN       β

όπου κρατήσαμε μόνο την εξάρτηση από το μέγεθος του συστήματος N
και τη θερμοκρασία β. Οπότε πράγματι επιβεβαιώνουμε τη σχέση (12.7)
                                          √
                                           N
                                  ∆E       β       1
                                     ∼           =√ .                                  (12.29)
                                  E∗      N
                                           β       N
12.2. ΕΝΤΡΟΠΙΑ                                                              509

Η παραπάνω ανάλυση υπέθεσε αναλυτική συμπεριφορά [ανάπτυγμα
Taylor, σχέση (12.26)] η οποία δεν ισχύει όταν είμαστε σε ένα κρίσιμο
σημείο μιας μετάβασης φάσης.
   Μια άλλη σημαντική περίπτωση που η παραπάνω ανάλυση δεν ισχύει
είναι όταν η κατανομή p(E) έχει παραπάνω από ένα μέγιστα ⁶ . Αυτό
συμβαίνει όταν το σύστημα υπόκειται σε μετάβαση φάσης πρώτης τά-
ξης, π.χ. όταν ο πάγος γίνεται νερό ή όταν ένα μαγνητικό υλικό που
βρίσκεται σε ένα μαγνητικό πεδίο χάσει τη μαγνήτισή του λόγω αύξη-
σης της θερμοκρασίας του. Στην περίπτωση αυτή, οι δύο καταστάσεις
πάγος – νερό/μαγνήτης – παραμαγνήτης έχουν την ίδια πιθανότητα εμ-
φάνισης (“συνυπάρχουν”) και μία τυπική κατανομή με δομή δύο κορυ-
φών φαίνεται στο σχήμα 12.2.


             p(E)                                   pmax




                                        ∆Ε




                                                    pmin


Σχήμα 12.2: Η πιθανότητα p(E) με δομή δύο κορυφών σε σύστημα με μετάβαση
φάσης 1ης τάξης. Τα δύο μέγιστα αντιστοιχούν στις δύο συνυπάρχουσες καταστάσεις
(“πάγος”–“νερό”) και ∆E/N αντιστοιχεί στη λανθάνουσα θερμότητα (latent heat). Στο
θερμοδυναμικό όριο N → ∞ το R = pmin /pmax μειώνεται σαν R ∼ e−f A , όπου A η
ελάχιστη επιφάνεια που χωρίζει τις δύο φάσεις και f η διεπαφική τάση (interface
tension).




   ⁶Όταν έχει περισσότερα από ένα τοπικά μέγιστα, το ολικό μέγιστο επικρατεί των
υπολοίπων στο θερμοδυναμικό όριο N → ∞.
510             ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

12.3 Διακυμάνσεις
Κάθε παρατηρήσιμη ποσότητα O έχει στοχαστική συμπεριφορά σύμ-
φωνα με μια κατανομή πιθανότητας p(O) που προκύπτει από την κα-
τανομή Boltzmann (12.4). Μια τέτοια κατανομή χαρακτηρίζεται πλήρως
από τη μέση τιμή ⟨O⟩ και τις ροπές ανώτερης τάξης, δηλ. τις μέσες τιμές
⟨(O − ⟨O⟩)n ⟩, n = 1, 2, 3. . . . Η πιο χρήσιμη ποσότητα από αυτές δίνεται
από τη διακύμανση γύρω από τη μέση τιμή για n = 2

                  (∆O)2 ≡ ⟨(O − ⟨O⟩)2 ⟩ = ⟨O2 ⟩ − ⟨O⟩2 .          (12.30)

Η ποσότητα αυτή δίνει τις περισσότερες φορές ένα μέτρο της απόκλισης
της O από τη μέση τιμή της ⟨O⟩. Για την περίπτωση της ενέργειας O = E
παίρνουμε
                (∆E)2 ≡ ⟨(E − ⟨E⟩)2 ⟩ = ⟨E 2 ⟩ − ⟨E⟩2 ,        (12.31)
και από τις σχέσεις

               1 ∑ 2 −βEµ   1 ∂ 2 ∑ −βEµ   1 ∂2Z
        ⟨E ⟩ =
          2
                  E e     =          e   =        ,               (12.32)
               Z µ µ        Z ∂β 2 µ       Z ∂β 2

και
               1∑               1 ∂ ∑ −βEµ    1 ∂Z
       ⟨E⟩ =       Eµ e−βEµ = −        e   =−      ,              (12.33)
               Z µ              Z ∂β µ        Z ∂β

προκύπτει ότι
                                   (       )2
                          1 ∂ 2Z      1 ∂Z      ∂ 2 ln Z
      (∆E) = ⟨E ⟩ − ⟨E⟩ =
          2      2       2
                                 −  −         =          ,        (12.34)
                          Z ∂β 2      Z ∂β        ∂β 2

που σύμφωνα με τη σχέση (12.9) είναι η ειδική θερμότητα

                              ∂⟨E⟩
                         C=        = kβ 2 (∆E)2 .                 (12.35)
                               ∂T
Άρα, καταλήγουμε στο ενδιαφέρον συμπέρασμα ότι η ειδική θερμότητα
ενός συστήματος (θερμοδυναμική ποσότητα) συνδέεται άμεσα με τις μι-
κροσκοπικές στατιστικές διακυμάνσεις της ενέργειας του συστήματος.
   Αυτό ισχύει γενικά για οποιαδήποτε φυσική ποσότητα του συστή-
ματος που έχει γραμμική σύζευξη με ένα εξωτερικό πεδίο. Μία τέτοια
ποσότητα για ένα μαγνητικό σύστημα που βρίσκεται μέσα σε ένα ομο-
γενές μαγνητικό πεδίο B είναι η μαγνήτιση M . Αν Mµ είναι η μαγνήτιση
12.3. ΔΙΑΚΥΜΑΝΣΕΙΣ                                                              511

του συστήματος στην κατάσταση µ και αν υποθέσουμε ότι είναι στην
              ⃗ τότε η Hamiltonian του συστήματος γίνεται
διεύθυνση του B,

                                H = E − BM                                   (12.36)

και η συνάρτηση επιμερισμού
                                  ∑
                             Z=         e−βEµ +βBMµ .                        (12.37)
                                    µ


Ο όρος “γραμμική σύζευξη” οφείλεται στο γραμμικό όρο BM στη Hami-
ltonian. Οι ποσότητες B και M ονομάζονται συζυγείς. Παρόμοια σχέση
έχουν η πίεση/όγκος (P /V ) σε ένα αέριο ή το χημικό δυναμικό/αριθμός
σωματιδίων (µ/N ) στη μεγαλοκανονική συλλογή.
    Εξαιτίας αυτής της γραμμικής σύζευξης παίρνουμε

                   1∑                    1 ∂Z    ∂F
          ⟨M ⟩ =       Mµ e−βEµ +βBMµ =       =−    ,                        (12.38)
                   Z µ                  βZ ∂B    ∂B

σχέση που είναι ανάλογη με την (12.8). Η αντίστοιχη της (12.34) προ-
κύπτει από (12.30) για O = M

                   (∆M )2 ≡ ⟨(M − ⟨M ⟩)2 ⟩ = ⟨M 2 ⟩ − ⟨M ⟩2 ,                (12.39)

και από
                          1 ∑ 2 −βEµ +βBMµ   1 ∂ 2Z
               ⟨M 2 ⟩ =       Mµ e         = 2       ,                       (12.40)
                          Z µ               β Z ∂B 2

οπότε
               {                (        )2 }
           1       1 ∂2Z    1       ∂Z              1 ∂ 2 ln Z   1 ∂⟨M ⟩
  (∆M )2 = 2            2
                          − 2                   =    2      2
                                                               =         .   (12.41)
          β        Z ∂B    Z        ∂B              β ∂B         β ∂B

Η μαγνητική επιδεκτικότητα χ ορίζεται από τη σχέση

                           1 ∂⟨M ⟩  β
                      χ=           = ⟨(M − ⟨M ⟩)2 ⟩ ,                        (12.42)
                           N ∂B     N

από όπου φαίνεται ότι σχετίζεται άμεσα με τις διακυμάνσεις της μαγνή-
τισης. Η παραπάνω ανάλυση μπορεί να γίνει πανομοιότυπα για οποιο-
δήποτε ζεύγος συζυγών ποσοτήτων.
512               ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

12.4 Συναρτήσεις Συσχετισμού
Οι συναρτήσεις συσχετισμού προκύπτουν από τη συζήτηση της προη-
γούμενης παραγράφου, αν θεωρήσουμε μαγνητικά πεδία τα οποία έχουν
τιμή που εξαρτάται από τη θέση στο χώρο. Για λόγους απλότητας (αλλά
και επειδή πρόκειται να μελετήσουμε μόνο τέτοια συστήματα) το σύ-
στημά μας βρίσκεται μέσα σε ένα “χώρο” στον οποίο οι δυνατές θέσεις
είναι οι διακριτές θέσεις ενός πλέγματος τις οποίες αντιστοιχούμε σε
φυσικούς αριθμούς⁷ i = 1, . . . , N . Τότε το μαγνητικό πεδίο Bi θα είναι
συνάρτηση της θέσης στο πλέγμα και αλληλεπιδρά με το σπιν si
                                        ∑
                           H=E−            Bi si ,                (12.43)
                                               i

και η μαγνήτιση ανά πλεγματική θέση mi ≡ si ⁸ στη θέση πλέγματος i
είναι
                                 1 ∂ ln Z
                         ⟨si ⟩ =          .                (12.44)
                                 β ∂Bi
Η συνάρτηση συσχετισμού δύο σημείων (connected two point correlation
function) ορίζεται ως

                                                                    1 ∂ 2 ln Z
  c (i, j) = ⟨(si − ⟨si ⟩)(sj − ⟨sj ⟩)⟩ = ⟨si sj ⟩ − ⟨si ⟩⟨sj ⟩ =
 G(2)                                                                           . (12.45)
                                                                    β 2 ∂Bi ∂Bj

Η παραπάνω συνάρτηση έχει μεγάλη θετική τιμή, όταν οι τιμές si , sj εί-
ναι ισχυρά συσχετισμένες, δηλ. “μεταβάλλονται μαζί” στα τυχαία δείγ-
ματα που παίρνουμε από το σύστημα, ενώ αντίθετα είναι σχεδόν μηδέν
όταν η τιμή της si εξαρτάται ελάχιστα από την sj (ασυσχέτιστες τυχαίες
μεταβλητές). Υπάρχει, φυσικά, και οι περίπτωση οι si , sj να είναι ισχυρά
αντι-συσχετισμένες και η συνάρτηση συσχετισμού να είναι αρνητική.
                                   (2)
     Η συνάρτηση συσχετισμού Gc (i, j) παίρνει τη μέγιστη τιμή της ⟨(si −
⟨si ⟩)2 ⟩ για i = j. Στη συνέχεια, πέφτει γρήγορα κατά απόλυτη τιμή. Για
ένα σύνηθες σύστημα
                                              −|xij |/ξ
                                  c (i, j) ∼ e
                                 G(2)                   ,                        (12.46)

όπου |xij | η απόσταση των σημείων i, j. Το μήκος συσχετισμού ξ, εί-
ναι ένα χαρακτηριστικό μήκος για το σύστημα που δίνει ένα μέτρο της
   ⁷Oι βαθμοί ελευθερίας που αναφέραμε προηγουμένως μπορεί να είναι περισσότεροι
από N .
   ⁸Οι δύο φυσικές ποσότητες είναι διαφορετικές, αλλά ανάλογες. Εδώ απλά αγνο-
ούμε τη σταθερά αναλογίας.
12.4. ΣΥΝΑΡΤΗΣΕΙΣ ΣΥΣΧΕΤΙΣΜΟΥ                                               513


                                                            e-|xij|/ξη
                                                            1/|xij|
           Gc (i,j)
          (2)




                                     |xij|
                                                (2)
     Σχήμα 12.3: Η συνάρτηση συσχετισμού Gc (i, j) για ξ < ∞ και ξ → ∞.



απόστασης όπου υπάρχει ουσιαστικός συσχετισμός μεταξύ των τιμών
της μαγνήτισης σε δύο πλεγματικές θέσεις. Εξαρτάται από τις παρα-
μέτρους που ορίζουν το σύστημα ξ = ξ(β, B, N, . . .). Είναι σημαντικό να
κατανοηθεί ότι το μήκος συσχετισμού ορίζει μια κλίμακα μήκους που
προκύπτει δυναμικά. Αντίθετα κλίμακες μήκους όπως το μέγεθος L του
συστήματος ή η απόσταση a μεταξύ δύο πλεγματικών σημείων (πλεγ-
ματική σταθερά) είναι κλίμακες μήκους που δίνονται από τον ορισμό
του συστήματος και δεν εξαρτώνται από τις δυναμικές παραμέτρους.
Συνήθως το ξ είναι της τάξης μεγέθους της πλεγματικής σταθεράς a και
το σύστημα δεν παρουσιάζει συσχετισμούς σε μακροσκοπικές κλίμακες
(δηλ. της τάξης του L).
   Πολύ ενδιαφέρουσα φυσική προκύπτει όταν σε κάποια συστήματα
μπορούμε να ρυθμίσουμε με λεπτότητα τις παραμέτρους από τις οποίες
εξαρτάται το ξ, έτσι ώστε στο θερμοδυναμικό όριο να πάρουμε ξ → ∞.
Αυτό γίνεται στην περιοχή μίας συνεχούς (όχι πρώτης τάξης) μετάβα-
σης φάσης. Στην περίπτωση, αυτή η εκθετική συμπεριφορά χάνεται και
                                    (2)
έχουμε πολύ βραδύτερη πτώση της Gc (i, j) (βλ. σχήμα 12.3), που σε d
χωρικές διαστάσεις δίνεται από
                                               1
                           c (i, j) ∼
                          G(2)                          .                (12.47)
                                        |xij   |d−2+η
Καθώς πλησιάζουμε το κρίσιμο σημείο, οι συσχετισμοί εκτείνονται σε
αποστάσεις |xij | ≫ a. Τότε το σύστημα παύει να “βλέπει” τις λεπτο-
514            ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

μέρειες του πλέγματος και συμπεριφέρεται με πολύ καλή προσέγγιση
σαν το πλέγμα να ήταν ένας συνεχής χώρος. Το όριο αυτό αναφέρεται
ως το “συνεχές όριο” (continuum limit) μιας θεωρίας που ορίζεται σε
ένα πλέγμα. Εξαιτίας του ότι οι λεπτομέρειες του πλέγματος γίνονται
ασήμαντες στο όριο αυτό, θεωρίες που ορίζονται μικροσκοπικά με δια-
φορετικό τρόπο (λ.χ. μια σε τετραγωνικό πλέγμα και μία σε εξαγωνικό)
έχουν το ίδιο συνεχές όριο. Το φαινόμενο αυτό ονομάζεται παγκοσμιό-
τητα (universality) και παίζει κεντρικό ρόλο στη μελέτη στατιστικών
συστημάτων, καθώς και στην κβαντική θεωρία πεδίου.


12.5 Δειγματοληψία
Ο κύριος στόχος μας είναι ο προσδιορισμός της μέσης τιμής ⟨O⟩ μιας
φυσικής ποσότητας O (λ.χ. ενέργειας, μαγνήτισης, συνάρτησης συσχετι-
σμού) σε ένα στατιστικό σύστημα στην κανονική συλλογή
                                      ∑
                         ∑              µ Oµ e
                                               −βEµ
                  ⟨O⟩ =      p µ Oµ =  ∑     −βEµ
                                                    .        (12.48)
                          µ               µe


Για το λόγο αυτό επιλέγουμε δείγμα από M καταστάσεις {µ1 , µ2 , . . . , µM }
οι οποίες κατανέμονται σύμφωνα με την κατανομή πιθανότητας Pµ και
ορίζουμε τον εκτιμητή (estimator) OM της ⟨O⟩
                              ∑M          −1 −βEµi
                                i=1 Oµi Pµi e
                       OM =     ∑M −1 −βEµ            .            (12.49)
                                  i=1 Pµi e
                                               i



Ο παραπάνω τύπος γίνεται εύκολα κατανοητός αφού, για μεγάλο δείγμα,
Pµi ≈ “Συχνότητα εύρεσης κατάστασης µi στο δείγμα”, και περιμέ-
νουμε ότι
                         ⟨O⟩ = lim OM .                    (12.50)
                                   M →∞

Ο στόχος μας είναι η κατάλληλη επιλογή της κατανομής Pµ , έτσι ώστε η
σύγκλιση (12.50) να γίνεται γρήγορα. Διακρίνουμε τις εξής περιπτώσεις:


12.5.1 Απλή Δειγματοληψία
Διαλέγουμε Pµ = σταθ., οπότε η (12.49) γίνεται
                                ∑M          −βEµi
                                  i=1 Oµi e
                         OM =     ∑ M     −βEµi
                                                  .                (12.51)
                                    i=1 e
12.5. ΔΕΙΓΜΑΤΟΛΗΨΙΑ                                                         515

Το πρόβλημα με την επιλογή αυτή είναι ότι έχουμε πρόβλημα επικάλυ-
ψης του δείγματος με τις καταστάσεις που πραγματικά συνεισφέρουν
στο άθροισμα (12.48). Όπως αναφέραμε και στην εισαγωγή, ο αριθμός
των καταστάσεων που επιλέγεται σε μια προσομοίωση Μόντε Κάρλο
στο δείγμα είναι ένα ελάχιστο ποσοστό του χώρου των καταστάσεων
του συστήματος. Άρα, η πιθανότητα να πάρουμε εκείνες τις καταστά-
σεις που δίνουν σημαντική συνεισφορά στο άθροισμα (12.48) είναι εν
γένει πολύ μικρή. Ας πάρουμε για παράδειγμα την περίπτωση O = E
σε ένα τυπικό μοντέλο. Σύμφωνα με τη σχέση (12.21) έχουμε
                                ∑
                          ⟨E⟩ =    E p(E)                   (12.52)
                                      E

όπου p(E) είναι η πιθανότητα εμφάνισης ενέργειας E στο σύστημα. Η
ποιοτική μορφή της φαίνεται στο σχήμα 12.1. Από τις σχέσεις (12.25)
και (12.28) έχουμε ότι E ∗ ∼ 1/β και ∆E ∼ 1/β, οπότε για τις περι-
πτώσεις β = 0 και β > 0 παίρνουμε ποιοτικά τη συμπεριφορά που
φαίνεται στο σχήμα 12.4. Η κατανομή της απλής δειγματοληψίας αντι-

          p(E)




                            β>0




                                                         β=0




                                                                 E


Σχήμα 12.4: Η πιθανότητα p(E) για θερμοκρασίες β = 0 και β > 0. Οι δύο κατανομές
έχουν ελάχιστη επικάλυψη.



στοιχεί στην περίπτωση β = 0 (βλ. σχέση (12.4)). Για να υπολογίσουμε
με ακρίβεια το άθροισμα (12.52) για β > 0 πρέπει να πάρουμε καλό
δείγμα στην περιοχή όπου το γινόμενο E pβ>0 (E) είναι σχετικά σημα-
ντικό. Όπως βλέπουμε και στο σχήμα 12.4, η πιθανότητα να πάρουμε
στο δείγμα κατάσταση με ενέργεια τέτοια ώστε το E pβ>0 (E) να είναι
516           ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

σχετικά σημαντικό είναι πολύ μικρή, όταν η δειγματοληψία γίνεται με
την κατανομή pβ=0 (E).
   Παρόλο που η συγκεκριμένη μέθοδος έχει το μειονέκτημα αυτό, μπο-
ρεί να φανεί χρήσιμη σε ορισμένες περιπτώσεις. Την εφαρμόσαμε ήδη
στην περίπτωση του τυχαίου περιπατητή. Παρατηρήστε επίσης ότι το
δείγμα που παίρνουμε είναι ανεξάρτητο του β και χρησιμοποιώντας τη
σχέση (12.51) υπολογίζουμε τις μέσες τιμές για κάθε β.

12.5.2 Importance Sampling
Από ότι είδαμε παραπάνω, ένα πολύ μικρό μέρος του χώρου των κα-
ταστάσεων δίνει σημαντική συνεισφορά στον υπολογισμό του ⟨O⟩. Αν
επιλέξουμε το δείγμα με πιθανότητα

                                      e−βEµ
                          Pµ = pµ =         ,                  (12.53)
                                        Z
περιμένουμε να δειγματοληπτήσουμε ακριβώς μέσα στον υπόχωρο αυτό.
Πράγματι, ο υπολογισμός του εκτιμητή (12.49) γίνεται με τη σχέση
               ∑M       ( −βE )−1 −βE
                                             1 ∑
                                                M
                 i=1 Oµi e         e
                              µi        µi

        O M = ∑M (            )            =       Oµi .     (12.54)
                         −βEµi −1 −βEµi      M i=1
                   i=1 e         e

Η παραπάνω δειγματοληψία λέγεται δειγματοληψία με κριτήριο σημα-
ντικότητας (importance sampling) και είναι ο τρόπος ο οποίος χρησι-
μοποιείται για προσομοιώσεις στατιστικών συστημάτων στην κανονική
συλλογή. Το δείγμα εξαρτάται από τη θερμοκρασία β και ο υπολογισμός
των μέσων τιμών (12.54) απαιτεί καινούργια δειγματοληψία κάθε φορά
σε αντίθεση με τη (12.51). Αυτή η δυσκολία όμως, στις περισσότερες πε-
ριπτώσεις, είναι πολύ μικρότερη από το πρόβλημα της επικάλυψης που
συζητήθηκε στην παράγραφο 12.5.1.


12.6 Διαδικασίες Markov
Για να πάρουμε ένα δείγμα το οποίο κατανέμεται σύμφωνα με την κα-
τανομή Pµ δεν αρκεί να το κάνουμε απευθείας. Λ.χ. αν επιχειρήσουμε
                                    −βEµ
να δημιουργήσουμε δείγμα με Pµ = e Z επιλέγοντας τυχαία κατά-
σταση µ και δεχόμαστε ή απορρίπτουμε την εισαγωγή στο δείγμα με
πιθανότητα Pµ θα έχουμε ελάχιστη πιθανότητα η κατάσταση να γίνει
αποδεκτή στο δείγμα. Οπότε θα βρεθούμε στην ίδια δυσκολία που βρή-
καμε στην περίπτωση της απλής δειγματοληψίας. Για το λόγο αυτό θα
12.6. ΔΙΑΔΙΚΑΣΙΕΣ MARKOV                                              517

χρησιμοποιήσουμε μια διαδικασία Markov για τη δημιουργία του δείγ-
ματος. Αυτή είναι μια διαδικασία όπου δεδομένου του συστήματος σε
μια κατάσταση µ παράγει με στοχαστικό τρόπο μια νέα κατάσταση ν.
Έτσι δημιουργείται μια αλυσίδα καταστάσεων

                          µ1 → µ2 → . . . → µM ,                  (12.55)

η οποία θα αποτελέσει το ζητούμενο δείγμα {µi } ≡ {µ1 , µ2 , . . . , µM }.
Φανταζόμαστε ότι η επιλογή της κατάστασης µi γίνεται στο “χρόνο’ i.
Η πιθανότητα μετάβασης P (µ → ν) (transition probability) στην κατά-
σταση ν, όταν το σύστημα είναι στην κατάσταση µ πρέπει να ικανοποιεί
τις παρακάτω συνθήκες:

  1. Είναι ανεξάρτητη του “χρόνου”.

  2. Εξαρτάται μόνο από τις καταστάσεις µ, ν και όχι από τη διαδρομή
     που κάναμε μέχρι την κατάσταση µ.

  3. Ικανοποιείται η σχέση
                              ∑
                                   P (µ → ν) = 1 .                (12.56)
                               ν

     Προσοχή, συνήθως P (µ → µ) > 0 και το σύστημα έχει πιθανότητα
     να παραμείνει στην ίδια κατάσταση.

  4. Για M → ∞ το δείγμα {µi } ακολουθεί την κατανομή Pµ .

Η προσομοίωση Μόντε Κάρλο με τον τρόπο αυτό γίνεται επιλέγοντας
κατάλληλα μια αρχική κατάσταση µ1 για το σύστημα και εφαρμόζοντας
τον παραπάνω αλγόριθμο. Η μεγαλύτερη προσπάθεια επικεντρώνεται
στον προσδιορισμό των πιθανοτήτων μετάβασης P (µ → ν), έτσι ώστε η
σύγκλιση 4 να επιτυγχάνεται γρήγορα.
   Σημαντική είναι και η επιλογή της αρχικής κατάστασης µ1 . Αν αυτή
δεν είναι μια τυπική κατάσταση του τελικού δείγματος θα πρέπει να
περάσει κάποιος χρόνος μέχρι το σύστημα να βρεθεί σε “κατάσταση
ισορροπίας” όπου πια η διαδικασία Markov δειγματοληπτεί μέσα στη
σωστή κατανομή. Ο χρόνος που απαιτείται (thermalization time) μπορεί
να γίνει σημαντικό μέρος της προσπάθειάς μας, αν γίνει λάθος επιλογή
της µ1 ή/και των P (µ → ν).
   Απαραίτητη προϋπόθεση για να πετύχουμε το δείγμα να ακολουθεί
την ζητούμενη κατανομή σε μια τέτοια διαδικασία είναι να ικανοποιεί
το κριτήριο της εργοδικότητας. Αυτό σημαίνει ότι από κάθε κατάσταση
518             ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

µ που επιλέγουμε, κάθε άλλη δυνατή κατάσταση ν είναι προσβάσιμη
μέσω της διαδικασίας με ένα πεπερασμένο αριθμό από βήματα. Αν
αυτό το κριτήριο δεν ικανοποιείται και υπάρχουν σημαντικές περιοχές
του χώρου των καταστάσεων στις οποίες δεν μπορούμε να δειγματολη-
πτήσουμε, δεν θα είναι δυνατόν να πετύχουμε τη ζητούμενη κατανομή.
Στην πράξη, επειδή δεδομένης της µ οι καταστάσεις ν για τις οποίες
P (µ → ν) > 0 είναι ελάχιστες, πρέπει να είμαστε ιδιαίτερα προσεκτικοί,
ώστε ο αλγόριθμος που επιλέγουμε να μην παραβιάζει τη συνθήκη της
εργοδικότητας⁹.


12.7 Συνθήκη Λεπτομερούς Ισορροπίας
Από την εξίσωση (12.2) μπορούμε εύκολα να καταλάβουμε ότι για να
βρεθεί το σύστημα σε κατάσταση ισορροπίας στην κατανομή pµ , οι πι-
θανότητες μετάβασης πρέπει να ικανοποιούν τη σχέση
                 ∑                  ∑
                     pµ P (µ → ν) =   pν P (ν → µ) .       (12.57)
                      ν                   µ

Αυτό σημαίνει ότι ο ρυθμός με τον οποίο το σύστημα μεταβαίνει από
την κατάσταση µ σε κάποια άλλη, είναι ίσος με το ρυθμό με τον οποίο
το σύστημα μεταβαίνει στην κατάσταση µ από κάποια άλλη. Προφανώς,
η σχέση (12.56) μας δίνει
                              ∑
                         pµ =   pν P (ν → µ) .              (12.58)
                                   µ


Η παραπάνω συνθήκη είναι αναγκαία αλλά δεν είναι ικανή (δες κε-
φάλαιο 2.2.3 του [4]). Μια ικανή, αλλά όχι αναγκαία, συνθήκη είναι η
συνθήκη λεπτομερούς ισορροπίας (detailed balance condition) η οποία
όταν ικανοποιείται από τις πιθανότητες μετάβασης, τότε το σύστημα
αργά ή γρήγορα θα φτάσει σε κατάσταση θερμικής ισορροπίας

                          pµ P (µ → ν) = pν P (ν → µ) .                 (12.59)
   ⁹Στην πράξη υπάρχουν αλγόριθμοι για του οποίους έχουμε παραβίαση της εργοδι-
κότητας, αλλά επειδή οι καταστάσεις που δεν είναι προσβάσιμες αποτελούν σύνολο
“μέτρου μηδέν” στο χώρο των καταστάσεων, η παραβίαση δεν επηρεάζει τα αποτελέ-
σματά μας. Αντίθετα, υπάρχουν περιπτώσεις όπου η συνθήκη δεν παραβιάζεται αλλά
η πιθανότητα να φτάσει κανείς σε κάποιες περιοχές του χώρου των καταστάσεων είναι
στην πράξη απαγορευτικά μικρή. Αυτό για παράδειγμα μπορεί να συμβεί κοντά σε
μια μετάβαση φάσης πρώτης τάξης όπου το σύστημα δυσκολεύεται να περάσει από
καταστάσεις της μιας φάσης στην άλλη.
12.7. ΣΥΝΘΗΚΗ ΛΕΠΤΟΜΕΡΟΥΣ ΙΣΟΡΡΟΠΙΑΣ                                519

Αθροίζοντας και τα δύο μέλη της (12.59) προκύπτει η συνθήκη ισορρο-
πίας (12.57). Για την κατανομή της κανονικής συλλογής (12.4) έχουμε

                    P (µ → ν)   pν
                              =    = e−β(Eν −Eµ ) .        (12.60)
                    P (ν → µ)   pµ
Μπορεί να δειχτεί ότι, αν οι πιθανότητες μετάβασης ικανοποιούν τις
παραπάνω συνθήκες, η κατανομή ισορροπίας του συστήματος θα είναι
η κατανομή Boltzmann (12.4). Το πρόγραμμα της προσομοίωσης Μόντε
Κάρλο μπορεί να συνοψιστεί στα επόμενα βήματα:
  1. Γράφουμε λογισμικό το οποίο κωδικοποιεί κατάλληλα επιλεγμένες
     πιθανότητες μετάβασης P (µ → ν) που ικανοποιούν την (12.60).
  2. Επιλέγουμε κατάλληλη αρχική κατάσταση µ1 .
  3. Αφήνουμε το σύστημα να εξελιχθεί μέχρι να προσεγγίσουμε την
     κατανομή Boltzmann (12.4) (thermalization).
  4. Συλλέγουμε δεδομένα για τις παρατηρήσιμες ποσότητες O και
     υπολογίζουμε τον εκτιμητή OM με την (12.54).
  5. Σταματάμε μόλις πετύχουμε την επιθυμητή ακρίβεια.
   Η εξίσωση (12.60) έχει πολλές λύσεις. Το ποια θα επιλέξουμε εξαρ-
τάται από την αποδοτικότητά τους σε ένα συγκεκριμένο πρόβλημα και
πρέπει να εξεταστεί προσεκτικά κατά περίπτωση. Παραδείγματα τέ-
τοιων επιλογών είναι:

                      P (µ → ν) = A · e− 2 β(Eν −Eµ ) ,
                                             1
                                                                (12.61)

                                          e−β(Eν −Eµ )
                    P (µ → ν) = A ·                      ,      (12.62)
                                        1 + e−β(Eν −Eµ )
                            {
                                e−β(Eν −Eµ ) Eν − Eµ > 0
          P (µ → ν) = A ·                                ,      (12.63)
                                1            Eν − Eµ ≤ 0
για κατάλληλα επιλεγμένες καταστάσεις ν ̸= µ,
                                   ∑
                   P (µ → µ) = 1 −   P (µ → ν) ,                (12.64)
                                         ν

ενώ P (µ → ν ′ ) = 0 για οποιαδήποτε άλλη κατάσταση ν ′ . Οι σταθερές A
πρέπει να επιλεγούν κατάλληλα, έτσι ώστε
                             ∑
                                P (µ → ν) < 1                    (12.65)
                            ν̸=µ
520           ΚΕΦΑΛΑΙΟ 12. ΠΡΟΣΟΜΟΙΩΣΕΙΣ ΜΟΝΤΕ ΚΑΡΛΟ

για να έχει νόημα η (12.64).
   Η σχέση (12.65) μας δίνει μεγάλη ελευθερία στην επιλογή των πιθα-
νοτήτων μετάβασης. Στην πράξη οι P (µ → ν) σπάνε σε δύο κομμάτια

                   P (µ → ν) = g(µ → ν) A(µ → ν) ,            (12.66)
τα οποία αντιστοιχούν σε διακριτά βήματα στον αλγόριθμο.
    Η πιθανότητα g(µ → ν) είναι η πιθανότητα επιλογής (selection
probability) της κατάστασης ν, όταν το σύστημα βρίσκεται στην κα-
τάσταση µ. Το πρώτο βήμα δηλαδή είναι να επιλέξουμε μια κατάσταση
ν ̸= µ με πιθανότητα g(µ → ν).
    Το δεύτερο βήμα είναι να επιλέξουμε με πιθανότητα A(µ → ν), αν το
σύστημα θα μεταβεί στην κατάσταση ν. Αν η απάντηση είναι όχι, τότε
παραμένουμε στην κατάσταση µ. Με τον τρόπο αυτό ικανοποιείται η
σχέση (12.64). Οι πιθανότητες A(µ → ν) ονομάζονται λόγοι αποδοχής.
    Ο στόχος μας επικεντρώνεται στην εύρεση αλγόριθμου τέτοιου, ώστε
οι πιθανότητες επιλογής να δίνουν τους μέγιστους δυνατούς λόγους
αποδοχής για καταστάσεις ν ασυσχέτιστες κατά το μέγιστο δυνατόν
από την κατάσταση µ. Ιδανική περίπτωση είναι να έχω A(µ → ν) = 1
για όλα τα ν για τα οποία g(µ → ν) > 0. Αυτό συμβαίνει για παράδειγμα
στους cluster αλγόριθμους συστημάτων σπιν (λ.χ. πρότυπα Ising, Potts)
όπως ο αλγόριθμος του Wolff που θα μελετήσουμε αργότερα.


12.8 Ασκήσεις
  1. Αποδείξτε τη σχέση (12.18).

  2. Αποδείξτε τη σχέση (12.19).

  3. Αποδείξτε τη σχέση (12.45).

  4. Αποδείξτε ότι οι σχέσεις (12.61)–(12.63) ικανοποιούν την (12.60).
ΚΕΦΑΛΑΙΟ 13

Το Πρότυπο Ising

Στο Κεφάλαιο αυτό θα γίνει εισαγωγή των βασικών μεθόδων Μόντε
Κάρλο για την προσομοίωση του πρότυπου Ising στο δισδιάστατο τε-
τραγωνικό πλέγμα. Αρχικά, η μελέτη θα γίνει με τον αλγόριθμο Metro-
polis όπου θα μελετηθεί η διαδικασία που φέρνουμε το σύστημα σε κα-
τάσταση θερμικής ισορροπίας (thermalization), καθώς και η διαδικασία
με την οποία παίρνουμε στατιστικά ανεξάρτητες μετρήσεις μελετώντας
τους χρόνους αυτοσυσχετισμού (autocorrelation times) του συστήματος.
Η κατανόηση των βασικών εννοιών είναι θεμελιώδης, αφού τα παρα-
πάνω είναι οι κύριες τεχνικές δυσκολίες που αντιμετωπίζουμε όταν
προσπαθούμε να μελετήσουμε συστήματα με μεγάλο αριθμό βαθμών
ελευθερίας.


13.1      Εισαγωγή
Το πρότυπο Ising (1925) [54] έχει παίξει ιστορικά πολύ σημαντικό ρόλο
στις εξελίξεις των ιδεών της στατιστικής φυσικής και της κβαντικής θε-
ωρίας πεδίου. Ειδικότερα στις δύο διαστάσεις, το πρότυπο είναι αρ-
κετά σύνθετο, ώστε να έχει ενδιαφέρουσες μη τετριμμένες ιδιότητες και
αρκετά απλό, ώστε να μπορούμε να αντλήσουμε αναλυτικά πολύτιμες
πληροφορίες για τη φυσική των μεταβάσεων φάσης. Το πρότυπο εκδη-
λώνει μετάβαση φάσης 2ης τάξης με αποτέλεσμα να μπορούν να μελε-
τηθούν οι ιδιότητες των συνεχών μεταβάσεων φάσης (κρίσιμοι εκθέτες,
παγκοσμιότητα, ομάδα επανακανονικοποίησης, συνεχές όριο). Με την
αναλυτική λύση¹ του Onsager (1948) [55] και άλλων παίρνουμε αποτε-
λέσματα με τα οποία μπορούμε να ελέγξουμε προσεγγιστικές μεθόδους,
   ¹Για μια πολύ καλή συζήτηση της λύσης του Onsager, δείτε το βιβλίο του T. Huang
[56] και την εργασία του C.N. Yang [57].


                                      521
522                                 ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

όπως οι προσομοιώσεις Μόντε Κάρλο, αναπτύγματα μεγάλης και μικρής
θερμοκρασίας, mean field theory κλπ. Επιπλέον έχει και φυσικό ενδια-
φέρον, επειδή είναι ένα πρότυπο ενός μαγνητικού υλικού που, παρόλη
την απλότητά του, περιγράφει ποιοτικά πολλές από τις μη τετριμμένες
ιδιότητες τους. Επίσης, λόγω της παγκοσμιότητας μπορεί να θεωρηθεί
πρότυπο και για τη μετάβαση φάσης σε υγρό-αέριο (τριπλό σημείο).
Εξαίρετο βιβλίο για πρότυπα της στατιστικής φυσικής που λύνονται
επακριβώς με αναλυτικές μεθόδους αποτελεί το βιβλίο του Baxter [53].
Για τον ορισμό του προτύπου θεωρήστε ένα δισδιάστατο τετραγωνικό


               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1
               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1

               1
               0
               0
               1     1
                     0
                     0
                     1     1
                           0
                           0
                           1    1
                                0
                                0
                                1     1
                                      0
                                      0
                                      1     1
                                            0
                                            0
                                            1     1
                                                  0
                                                  0
                                                  1     1
                                                        0
                                                        0
                                                        1     1
                                                              0
                                                              0
                                                              1     1
                                                                    0
                                                                    0
                                                                    1

               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1

               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1

               1
               0
               0
               1     1
                     0
                     0
                     1     1
                           0
                           0
                           1    1
                                0
                                0
                                1     1
                                      0
                                      0
                                      1     1
                                            0
                                            0
                                            1     1
                                                  0
                                                  0
                                                  1     1
                                                        0
                                                        0
                                                        1     1
                                                              0
                                                              0
                                                              1     1
                                                                    0
                                                                    0
                                                                    1

               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1
               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1

               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1

               1
               0     1
                     0     1
                           0    1
                                0     1
                                      0     1
                                            0     1
                                                  0     1
                                                        0     1
                                                              0     1
                                                                    0
               0
               1     0
                     1     0
                           1    0
                                1     0
                                      1     0
                                            1     0
                                                  1     0
                                                        1     0
                                                              1     0
                                                                    1

Σχήμα 13.1: Δισδιάστατο τετραγωνικό πλέγμα του οποίου οι θέσεις i = 1, . . . , N κα-
ταλαμβάνονται από “άτομα” ή “μαγνητάκια” με σπιν si τα οποία έχουν τυχαίο προ-
σανατολισμό στο επίπεδο (πρότυπο XY). Συνήθως, λαμβάνονται υπόψη μόνο οι αλ-
ληλεπιδράσεις πλησιέστερων γειτόνων −J⃗si · ⃗sj για κάθε σύνδεσμο ⟨ij⟩. Η τοπολογία
είναι τοροϊδής (toroidal), όταν ταυτίσουμε τις οριζόντιες πλευρές μεταξύ τους και τις
κάθετες μεταξύ τους, δηλ. τα ίδια χρώματα στο σχήμα.



πλέγμα, όπως αυτό του σχήματος 13.1 στο οποίο τοποθετείτε σε κάθε
πλεγματική θέση (node) “άτομα” ή “μαγνητάκια” με σπιν si . Η γεωμε-
τρία καθορίζεται από την ελάχιστη απόσταση μεταξύ των γειτόνων, την
πλεγματική σταθερά a, και τον αριθμό των πλεγματικών θέσεων N . Σε
13.1. ΕΙΣΑΓΩΓΗ                                                                523

κάθε πλευρά έχουμε L πλεγματικές θέσεις, έτσι ώστε N = L × L = Ld ,
με d = 2 τη διάσταση του χώρου. Η τοπολογία καθορίζεται από τις
σχέσεις γειτονίας, και ιδιαίτερα από τις σχέσεις γειτονίας των πλεγμα-
τικών θέσεων που βρίσκονται στο σύνορο του τετραγώνου. Η τοροϊδής
τοπολογία λαμβάνεται, αν δημιουργήσουμε δεσμό μεταξύ των γειτόνων
που ανήκουν στις κάθετες και οριζόντιες πλευρές του τετραγώνου του
σχήματος (13.1). Η δυναμική του συστήματος καθορίζεται από τη μα-
γνητική αλληλεπίδραση (spin–spin interaction) την οποία απλοποιούμε,
ώστε να είναι κοντινής εμβέλειας και ιδιαίτερα μόνο μεταξύ των πλη-
σιέστερων γειτόνων. Στο σιδηρομαγνητικό πρότυπο Ising θεωρούμε ότι



                   <ij>                                <ij>
           111
           000                111
                              000                11
                                                 00                  11
                                                                     00
           000
           111                000
                              111                00
                                                 11                  00
                                                                     11
           000
           111                000
                              111                00
                                                 11                  00
                                                                     11
           000
           111                000
                              111
                                    j        i   00
                                                 11                  00
                                                                     11   j
          i



              si               sj                si                  sj

Σχήμα 13.2: Τα σπιν στο πρότυπο Ising παίρνουν δύο μόνο τιμές “πάνω” και “κάτω”
και η ενέργεια του συστήματος προκύπτει από τη συνεισφορά κάθε συνδέσμου (link)
⟨ij⟩. Αυτή για το σιδηρομαγνητικό πρότυπο παίρνει δύο δυνατές τιμές +J και −J με
J > 0 για αντίρροπα και ομόρροπα σπιν αντίστοιχα. Το σύστημα έχει τη συμμετρία
της διακριτής ομάδας Z2 .



οι δυνατές τιμές των σπιν είναι δύο, +1 ή −1. Στην πιο απλή περί-
πτωση, η αλληλεπίδραση είναι αλληλεπίδραση σπιν–σπιν μόνο μεταξύ
πλησιέστερων γειτόνων με την κατάσταση που έχει τα σπιν ομόρροπα
να βρίσκεται στην κατάσταση χαμηλότερης ενέργειας². Αυτό απεικονίζε-
ται στο σχήμα 13.2. Το σύστημα μπορεί να βρίσκεται υπό την επίδραση
ομογενούς μαγνητικού πεδίου B του οποίου η διεύθυνση θεωρείται ότι
είναι παράλληλη ή αντιπαράλληλη με αυτή των σπιν. Είμαστε τώρα
έτοιμοι να γράψουμε την Hamiltonian και τη συνάρτηση επιμερισμού
του συστήματος.
   Θεωρούμε τετραγωνικό πλέγμα από N πλεγματικές θέσεις (sites ή
vertices) διατεταγμένες σε τετράγωνο με πλευρές από L πλεγματικές
θέσεις τις οποίες απαριθμούμε με αριθμούς i = 1, 2, . . . , N . Το πλέγμα
έχει Nl δεσμούς (bonds ή links) μεταξύ των πλησιέστερων γειτόνων.

   ²Το αντίστροφο ισχύει για το αντισιδηρομαγνητικό πρότυπο Ising.
524                                          ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

Αυτοί χαρακτηρίζονται από τα ζεύγη των πλεγματικών θέσεων i, j που
ενώνουν και θα τους συμβολίζουμε με ⟨ij⟩. Ταυτίζουμε τις πλευρές του
τετραγώνου, όπως στο σχήμα 13.1. Επειδή τότε κάθε δεσμός ενώνει
ακριβώς δύο πλεγματικές θέσεις και από κάθε πλεγματική θέση ξεκι-
νούν ακριβώς τέσσερις δεσμοί, θα ισχύει

                                   2Nl = 4N ⇒ Nl = 2N .                                                     (13.1)

Σε κάθε πλεγματική θέση τοποθετούμε σπιν si = ±1.
   Η Hamiltonian του συστήματος θα δίνεται από τη σχέση
                                             ∑                    ∑
                                 H = −J             si sj − B           si .                                (13.2)
                                             ⟨ij⟩                 i


Ο πρώτος όρος δίνει την αλληλεπίδραση μεταξύ των σπιν και για J > 0
– το οποίο υποθέτουμε στο βιβλίο αυτό – το σύστημα είναι σιδηρομα-
γνητικό. Κάθε δεσμός που ενώνει ομόρροπα σπιν έχει ενέργεια −J που
είναι κατά 2J μικρότερη από έναν δεσμό με αντίρροπα σπιν. Το σύ-
στημα ενεργειακά προτιμά καταστάσεις με δεσμούς ομόρροπους, δηλ.
τα σπιν να είναι όλα προσανατολισμένα προς την ίδια κατεύθυνση. Η
ελάχιστη ενέργεια αντιστοιχεί στη μοναδική³ κατάσταση με όλα τα σπιν
να κοιτούν προς την κατεύθυνση του B, την θεμελιώδη κατάσταση⁴. Η
ενέργειά της είναι

                           E0 = −JNl − BN = −(2J + B)N .                                                    (13.3)

   Η συνάρτηση επιμερισμού είναι
           ∑      ∑               ∑                       ∑             ∑                    ∑
      Z=                   ...            e−βH[{si }] ≡           eβJ       ⟨ij⟩ si sj +βB       i si   ,   (13.4)
           s1 =±1 s2 =±1         sN =±1                   {si }


όπου {si } ≡ {s1 , s2 , . . . , sN } είναι μια διάταξη (configuration) των σπιν
στο πλέγμα. Ο αριθμός των όρων του αθροίσματος είναι ίσος με τον
αριθμό των δυνατών διατάξεων {si } των σπιν που είναι 2N , δηλ. αυξά-
νουν εκθετικά με το N . Για ένα 5 × 5 πλέγμα, ο αριθμός των όρων είναι
225 ≈ 3.4 × 106 .
   ³Στην περίπτωση του αντισιδηρομαγνητικού συστήματος J < 0, η θεμελιώδης ενέρ-
γεια είναι εκφυλισμένη και οι αντίστοιχες καταστάσεις είναι πιο πολύπλοκο να περι-
γραφούν.
   ⁴Για B = 0, το σύστημα έχει “πάνω–κάτω” συμμετρία (συμμετρία Z2 ). Δύο κατα-
στάσεις που προκύπτουν με την εφαρμογή της συμμετρίας αυτής (αντιστροφή όλων
των σπιν) ταυτίζονται.
13.1. ΕΙΣΑΓΩΓΗ                                                              525

   Το δισδιάστατο πρότυπο Ising με B = 0 έχει την εξαιρετικά ενδια-
φέρουσα ιδιότητα ότι για β = βc , όπου
                           1        √
                    βc =     ln (1 + 2) ≈ 0.4406867935 . . .              (13.5)
                           2
το σύστημα παρουσιάζει μετάβαση φάσης από τη διατεταγμένη φάση
ή φάση χαμηλής θερμοκρασίας, όπου το σύστημα είναι μαγνητισμένο
(⟨|M |⟩ > 0) στην άτακτη φάση ή φάση υψηλής θερμοκρασίας, όπου η
μαγνήτιση χάνεται (⟨|M |⟩ = 0). Η θερμοκρασία βc είναι η κρίσιμη θερ-
μοκρασία, η θερμοκρασία Curie. Η μετάβαση φάσης είναι συνεχής και
δευτέρας τάξης, γιατί η συνάρτηση ⟨|M |⟩(β) είναι συνεχής για β = βc ,
αλλά όχι η παράγωγός της. Αυτό φαίνεται ποιοτικά στο σχήμα 13.3.
Επειδή η τιμή της ⟨|M |⟩ ξεχωρίζει τις δύο φάσεις του συστήματος, η
⟨|M |⟩ λέγεται παράμετρος τάξης. Για β ̸= βc , η συνάρτηση συσχετι-

           M
                                         C




                                     T

                             Tc                      Tc             T

Σχήμα 13.3: Ποιοτική συμπεριφορά της μαγνήτισης (αριστερά) και της ειδικής θερμό-
τητας (δεξιά) στη μετάβαση φάσης στο πρότυπο Ising. Με συνεχή γραμμή φαίνεται η
(μη αναλυτική) συμπεριφορά στο θερμοδυναμικό όριο, ενώ με διακεκομμένες η συμπε-
ριφορά για αυξανόμενο, αλλά πεπερασμένο μέγεθος N του συστήματος. Οι τελευταίες
συγκλίνουν ομοιόμορφα προς τις μη αναλυτικές συναρτήσεις.



σμού (12.45) συμπεριφέρεται όπως στη σχέση (12.46) με πεπερασμένο
μήκος συσχετισμού ξ(β). Καθώς πλησιάζουμε την κρίσιμη θερμοκρασία
το μήκος συσχετισμού τείνει στο άπειρο και μάλιστα συμπεριφέρεται
ασυμπτωτικά σαν
                                                   βc − β
                     ξ(β) ≡ ξ(t) ∼ |t|−ν      t=          .               (13.6)
                                                     βc
Η συνάρτηση συσχετισμού συμπεριφέρεται σύμφωνα με την εξίσωση
(12.47)
                                      1
                         c (i, j) ∼
                       G(2)                 .           (13.7)
                                    |xij |η
526                            ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

ενώ παρόμοια συμπεριφορά βάθμισης (scaling) παρουσιάζουν και η ει-
δική θερμότητα C, μαγνήτιση M ≡ ⟨M ⟩ και μαγνητική επιδεκτικότητα
χ σύμφωνα με τις σχέσεις

                              C ∼ |t|−α                            (13.8)
                              M ∼ |t|β                             (13.9)
                              χ ∼ |t|−γ .                         (13.10)

ενώ η μαγνήτιση για t = 0 και το μαγνητικό πεδίο B ̸= 0, συμπεριφέρε-
ται σύμφωνα με τη σχέση

                               M ∼ B −1/δ .                        (13.11)

Οι εκθέτες που παρουσιάζονται στις παραπάνω σχέσεις λέγονται κρίσι-
μοι εκθέτες ή εκθέτες βάθμισης (critical ή scaling exponents) και οι τιμές
τους παρουσιάζουν την ιδιότητα της παγκοσμιότητας. Δηλ. οι τιμές τους
δεν εξαρτώνται από τις λεπτομέρειες του πλέγματος (τετραγωνικό, τρι-
γωνικό κλπ) ή της αλληλεπίδρασης (πλησιέστερων ή μη γειτόνων, μεγα-
λύτερες δυνάμεις του σπιν κλπ) και μία ολόκληρη κλάση από πρότυπα
έχουν την ίδια συμπεριφορά! Απαραίτητη προϋπόθεση είναι τα πρότυπα
αυτά να έχουν τις ίδιες ιδιότητες συμμετρίας, να ορίζονται σε χώρο ίδιας
διάστασης και οι αλληλεπιδράσεις να είναι κοντινής εμβέλειας. Στο συ-
γκεκριμένο πρότυπο οι εκθέτες παίρνουν τις λεγόμενες τιμές Onsager

                         α = 0 , β = 18 , γ =   7
                                                4
                                                                  (13.12)
                                                1
                         δ = 15 , ν = 1 , η =   4

Η συμπεριφορά (13.6–13.11) χαρακτηρίζεται από τη μη αναλυτικότητα
των αντίστοιχων συναρτήσεων. Αυτή δεν είναι δυνατόν να προκύψει
από τη συνάρτηση επιμερισμού (13.4) για πλέγμα με N θέσεις, αφού σε
ένα πεπερασμένο άθροισμα από εκθετικά είναι αναγκαστικά αναλυτική
συνάρτηση (άρα και οι παράγωγοί της). Η μη αναλυτική συμπεριφορά
φανερώνεται στο όριο απείρου μεγέθους (θερμοδυναμικό όριο) όπου
οι παραπάνω συναρτήσεις τείνουν προς μια μη–αναλυτική συνάρτηση
όπως στο σχήμα 13.3. Η απώλεια της αναλυτικότητας οφείλεται στους
συσχετισμούς των σπιν σε μακροσκοπικές αποστάσεις.
   Σε πολλά συστήματα που μελετάμε τα παραπάνω μη αναλυτικά ση-
μεία, αναζητούμε μια παράμετρο τάξης (order parameter) η οποία χα-
ρακτηρίζει τη συμμετρία του συστήματος. Στη συγκεκριμένη περίπτωση
του πρότυπου Ising, η παράμετρος τάξης είναι η μαγνήτιση με τη συμ-
μετρία si → −si . Συνήθως, στη μία φάση η παράμετρος τάξης είναι μη
13.2. Ο ΑΛΓΟΡΙΘΜΟΣ METROPOLIS                                    527

μηδενική, ενώ στην άλλη μηδενίζεται. Αυτό συνεπάγεται μη αναλυτική
συμπεριφορά, αφού μια αναλυτική συνάρτηση που είναι μηδενική σε
ένα διάστημα, είναι παντού μηδέν.
    Η συμπεριφορά παγκοσμιότητας ή ανεξαρτησίας κλίμακας (scale
invariance) παρουσιάζεται κάθε φορά που έχουμε απόκλιση του μή-
κους συσχετισμού ξ → ∞. Στην περίπτωσή μας, για να φτάσουμε το
κρίσιμο σημείο, έχουμε να ρυθμίσουμε μόνο μια παράμετρο, τη θερ-
μοκρασία, οπότε αναμένει κανείς να εμφανιστεί μόνο μια καινούργια
κλίμακα στο πρότυπο. Ανεξαρτησία κλίμακας εμφανίζεται, όταν το μή-
κος συσχετισμού γίνει πολύ μεγαλύτερο από τη μικροσκοπική κλίμακα
a, οπότε οποιαδήποτε ποσότητα που είναι συνάρτηση της απόστασης r
μπορεί να εξαρτάται μόνο από το λόγο r/ξ. Η παγκοσμιότητα προκύ-
πτει από το γεγονός ότι, στην περίπτωση αυτή, φαίνεται ότι τα πάντα
εξαρτώνται από εκείνες τις διακυμάνσεις με μεγάλο μήκος κύματος που
απαιτούνται από τη συμμετρία της παραμέτρου τάξης. Η σημαντική
απλούστευση που προκύπτει είναι ότι για να μελετήσουμε ένα πραγ-
ματικό φυσικό σύστημα σε μια συνεχή μετάβαση φάσης ξ → ∞, αρκεί
να μελετήσουμε το απλούστερο πρότυπο με τη δεδομένη συμμετρία και
χωρικές διαστάσεις.


13.2     Ο Αλγόριθμος Metropolis
Θεωρούμε την περίπτωση του τετραγωνικού πλέγματος με L πλεγμα-
τικές θέσεις σε κάθε πλευρά, έτσι ώστε N = L × L = L2 να είναι ο συ-
νολικός αριθμός πλεγματικών θέσεων και Nl = 2N να είναι ο συνολικός
αριθμός των “δεσμών” μεταξύ των πλησιέστερων γειτόνων. Η τελευταία
σχέση ισχύει, επειδή επιλέγουμε ελικοειδείς συνοριακές συνθήκες στο
πλέγμα, όπως στο σχήμα 13.6, όπως θα αναλύσουμε στην επόμενη πα-
ράγραφο. Σε κάθε πλεγματική θέση i έχουμε ένα βαθμό ελευθερίας, το
“σπιν” si το οποίο παίρνει δύο τιμές, έστω ±1. Θεωρούμε το σύστημα
για την περίπτωση του μηδενικού μαγνητικού πεδίου B = 0, οπότε η
Hamiltonian του συστήματος θα δίνεται από τη σχέση⁵
                                  ∑
                            H=−       si sj .                (13.13)
                                      ⟨ij⟩
               ∑
Θυμίζουμε πως     ⟨ij⟩ είναι άθροισμα πάνω στους δεσμούς ⟨i, j⟩, δηλ.
                                              ∑            ∑ ∑N
πάνω στα ζεύγη γειτονικών πλεγματικών θέσεων. ⟨i,j⟩ = (1/2) N i=1   j=1
αφού στη δεύτερη περίπτωση κάθε δεσμός αθροίζεται δύο φορές, μία
  ⁵Η σταθερά J = 1 με κατάλληλη επιλογή μονάδων για τα si .
528                              ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

από κάθε πλεγματική θέση που βρίσκεται στα άκρα του. Η συνάρτηση
επιμερισμού είναι η
           ∑ ∑          ∑                 ∑ ∑
       Z=           ...     e−βH[{si }] ≡  eβ ⟨ij⟩ si sj . (13.14)
            s1 =±1 s2 =±1   sN =±1           {si }


Στόχος μας είναι η δημιουργία ενός δείγματος του συστήματος που
κατανέμεται σύμφωνα με την κατανομή Boltzmann (12.4) και θα το δη-
μιουργήσουμε φτιάχνοντας μια αλυσίδα Markov σύμφωνα με αυτά που
ειπώθηκαν στην παράγραφο 12.6. Η δειγματοληψία θα γίνει σύμφωνα
με την (12.53) και οι μέσες τιμές θα υπολογίζονται από το δείγμα από
την (12.54). Επιλέγοντας σε κάθε βήμα της διαδικασίας την επόμενη
κατάσταση του συστήματος σύμφωνα με την (12.60), το δείγμα μας θα
βρίσκεται προσεγγιστικά στην επιθυμητή κατανομή για αρκετά μεγάλο
πλήθος στοιχείων. Αυτό επιτυγχάνεται κάνοντας έναν αρκετά μεγάλο
αριθμό βημάτων (“χρόνο”) στην διαδικασία Markov.
   Έστω ότι το σύστημά μας βρίσκεται αρχικά στην κατάσταση µ⁶. Η
πιθανότητα να βρεθεί στο επόμενο βήμα της διαδικασίας στην κατά-
σταση ν, σύμφωνα με την (12.66) είναι

                      P (µ → ν) = g(µ → ν) A(µ → ν) ,            (13.15)

όπου g(µ → ν) είναι η πιθανότητα επιλογής της κατάστασης ν, όταν το
σύστημα βρίσκεται στην κατάσταση µ και A(µ → ν) ο λόγος αποδοχής,
δηλ. η πιθανότητα τότε το σύστημα να μεταβεί στη νέα κατάσταση. Αν
ικανοποιείται η συνθήκη λεπτομερούς ισορροπίας (12.60)

          P (µ → ν)   g(µ → ν) A(µ → ν)
                    =                   = e−β(Eν −Eµ ) ,        (13.16)
          P (ν → µ)   g(ν → µ) A(ν → µ)

τότε η κατανομή στο δείγμα μας θα συγκλίνει στην (12.4) pµ = e−βEµ /Z.
Για να είναι οι πιθανότητες P (µ → ν) αρκετά μεγάλες, ώστε το σύστημα
να αλλάζει συχνά κατάσταση, οι μεταβολές στην ενέργεια Eν − Eµ δε θα
πρέπει να είναι πολύ μεγάλες. Θα πρέπει το γινόμενο με τη θερμοκρα-
σία να είναι αριθμός της τάξης της μονάδας. Ένας τρόπος να το πετύ-
χουμε αυτό είναι να εφαρμόσουμε έναν αλγόριθμο που σε κάθε βήμα θα
μεταβάλλει την τιμή ενός από τα σπιν του πλέγματος si = ±1 → s′i ∓ 1.
Επειδή η ενέργεια (13.13) είναι τοπική ποσότητα, η μεταβολή της θα
είναι μικρή. Πιο συγκεκριμένα, αν κάθε πλεγματική θέση έχει z = 4
πλησιέστερους γείτονες, με μια τέτοια μεταβολή το πρόσημο του όρου
    ⁶Η κατάσταση µ εδώ ορίζεται από μία συγκεκριμένη διάταξη των N σπινς
{si }i=1...N .
13.2. Ο ΑΛΓΟΡΙΘΜΟΣ METROPOLIS                                                   529

si sj αλλάζει για z όρους της (13.13), αυτούς που έχουν στο ένα άκρο
τους τη θέση i. Η μεταβολή της ενέργειας είναι ±2 για κάθε δεσμό. Αν
η κατάσταση µ ορίζεται να είναι η {s1 , . . . , si , . . . , sN } και η κατάσταση
ν είναι η {s1 , . . . , s′i , . . . , sN } (δηλ. με όλα τα σπιν ίδια, εκτός από το si
το οποίο αλλάζει πρόσημο), τότε η μεταβολή της ενέργειας θα είναι

                    |∆E| ≤ 2z ⇔ Eµ − 2z ≤ Eν ≤ Eµ + 2z .                     (13.17)

Αν επιλέξουμε τη θέση i τυχαία, τότε
                          { 1
                                (µ, ν) διαφέρουν κατά ένα σπιν
    g(µ → ν) = g(ν → µ) =    N                                  ,
                            0 αλλιώς
                                                              (13.18)
και ο αλγόριθμος είναι εργοδικός. Θα πρέπει, τότε, να ισχύει

                            A(µ → ν)
                                     = e−β(Eν −Eµ ) .                       (13.19)
                            A(ν → µ)

Ένας απλός τρόπος να ικανοποιήσουμε τη συνθήκη αυτή είναι να πά-
ρουμε τη σχέση (12.61)

                         A(µ → ν) = A0 · e− 2 β(Eν −Eµ ) .
                                                1
                                                                            (13.20)

Για να μεγιστοποιήσουμε τους λόγους αποδοχής, αφού θα πρέπει να
ισχύει A(µ → ν) ≤ 1, |∆E| ≤ 2z, παίρνουμε A0 = e−βz . Άρα,

                          A(µ → ν) = e− 2 β(Eν −Eµ +2z) .
                                           1
                                                                            (13.21)

 Στο σχήμα 13.4 φαίνεται η εξάρτηση του A(µ → ν) από τη μεταβολή της
ενέργειας για διάφορα β. Παρατηρούμε ότι η πιθανότητα αυτή γίνεται
μικρή, ακόμα και για μηδενική μεταβολή της ενέργειας, με αποτέλεσμα
η αποδοτικότητα της επιλογής αυτής να είναι μικρή.
   Είναι πολύ αποδοτικότερο να χρησιμοποιήσουμε τον αλγόριθμο των
Nicolas Metropolis et. al. 1953 [58] ο οποίος δίνεται από την (12.63)
                             { −β(E −E )
                               e    ν   µ
                                           Eν − Eµ > 0
               A(µ → ν) =                               .        (13.22)
                               1           Eν − Eµ ≤ 0

Σύμφωνα με την παραπάνω σχέση, το σύστημα πάντα δέχεται την αλ-
λαγή μιας κατάστασης, όταν αυτή ελαττώνει την ενέργεια, ενώ όταν
η αλλαγή οδηγεί σε αύξηση της ενέργειας, αυτή γίνεται δεκτή με πι-
θανότητα μικρότερη της μονάδας. Όπως φαίνεται και από το σχήμα
13.4, το σύστημα δέχεται αλλαγές καταστάσεων πολύ συχνότερα από
530                                                      ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


              1                         β=0.20                            1
                                        β=0.44
             0.8                        β=0.60                           0.8
  A(µ → ν)




                                                              A(µ → ν)
             0.6                                                         0.6

             0.4                                                         0.4

             0.2                                                         0.2        β=0.20
                                                                                    β=0.44
                                                                                    β=0.60
              0                                                           0
                   -8   -6   -4   -2    0   2    4   6    8                    -8   -6   -4   -2    0   2   4   6   8
                                       ∆Ε                                                          ∆Ε

Σχήμα 13.4: Λόγοι αποδοχής A(µ → ν) για το δισδιάστατο πρότυπο Ising στο τε-
τραγωνικό πλέγμα για τη σχέση (13.21) (αριστερά) και για τον αλγόριθμο Metropolis
(δεξιά) σαν συνάρτηση της μεταβολής της ενέργειας ∆E = Eν − Eµ . Φαίνεται η υπε-
ροχή του τελευταίου, αφού οι λόγοι αποδοχής είναι πολύ μεγαλύτεροι.



την προηγούμενη επιλογή μας. Ο αλγόριθμος αυτός έχει πολύ γενικό-
τερη εφαρμογή από την περίπτωση που μελετάμε και έχει ευρεία χρήση
σε ένα μεγάλο φάσμα προβλημάτων λόγω της γενικότητας, απλότητας
και αποδοτικότητάς του. Να σημειώσουμε πως η επιλογή μας να αλλά-
ζουμε την κατάσταση µ → ν, αλλάζοντας την τιμή ενός μόνο σπιν δεν
είναι περιορισμός της μεθόδου αυτής και θα μπορούσε να εφαρμοστεί
για οποιαδήποτε αλλαγή καταστάσεων.


13.3 Σχεδιασμός Κώδικα
Για τον σχεδιασμό του κώδικα, το πιο σημαντικό βήμα είναι να ορίσουμε
τη δομή των δεδομένων. Οι βαθμοί ελευθερίας είναι τα σπιν si = ±1
ορισμένα στις N πλεγματικές θέσεις. Το πιο σημαντικό για την καλή
απόδοση του προγράμματος είναι να ορίσουμε τις σχέσεις γειτονίας
των πλεγματικών θέσεων στη μνήμη του υπολογιστή και τις συνοριακές
συνθήκες. Οι τελευταίες είναι πολύ σημαντικές και μια λάθος επιλογή
θα μπορούσε να κάνει την επίδραση του ορίου του πλέγματος σημαντική
και έτσι, να έχουμε σημαντικά σφάλματα πεπερασμένου μεγέθους του
πλέγματος (finite size effects). Οι πιο δημοφιλείς επιλογές είναι οι πε-
ριοδικές ή τοροειδείς συνοριακές συνθήκες, αλλά και οι ελικοειδείς συ-
νοριακές συνθήκες. Ο σημαντικός παράγοντας στις επιλογές αυτές είναι
ότι κάθε πλεγματική θέση έχει τον ίδιο αριθμό πλησιέστερων γειτόνων
και έτσι, έχουμε την ίδια τοπική γεωμετρία. Για παράδειγμα, αυτό δε
συμβαίνει αν επιλέξουμε το πλέγμα να έχει σύνορο πάνω στο οποίο τα
σπιν να παίρνουν καθορισμένες ή ελεύθερες τιμές.
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                                     531

                  1    2    3    4    5 1 2 3             4    5    1    2    3    4    5
                  6    7    8    9   10 6 7 8             9   10    6    7    8    9   10
                 11   12   13   14   15 11 12 13         14   15   11   12   13   14   15
                 16   17   18   19   20 16 17 18         19   20   16   17   18   19   20
                 21   22   23   24   25 21 22 23         24   25   21   22   23   24   25

                  1    2    3    4    5    1    2    3    4    5    1    2    3    4    5
                  6    7    8    9   10    6    7    8    9   10    6    7    8    9   10
                 11   12   13   14   15   11   12   13   14   15   11   12   13   14   15
                 16   17   18   19   20   16   17   18   19   20   16   17   18   19   20
                 21   22   23   24   25   21   22   23   24   25   21   22   23   24   25
                  1    2    3    4    5    1    2    3    4    5    1    2    3    4    5
                  6    7    8    9   10    6    7    8    9   10    6    7    8    9   10
                 11   12   13   14   15   11   12   13   14   15   11   12   13   14   15
                 16   17   18   19   20   16   17   18   19   20   16   17   18   19   20
                 21 22 23 24 25 21 22 23 24 25                     21 22 23 24 25

Σχήμα 13.5: Τετραγωνικό πλέγμα με περιοδικές συνοριακές συνθήκες και L = 5. Η
τοπολογία είναι τοροϊδής.




   Για την τοποθέτηση των βαθμών ελευθερίας στη μνήμη, μια πρώτη
επιλογή είναι να δώσουμε συντεταγμένες (i, j), i, j = 1, . . . , L σε κάθε
πλεγματική θέση. Τα σπιν τοποθετούνται σε ένα array s(L,L) και αν
επιλέξουμε μια θέση στο πλέγμα s(i,j), οι τέσσερις πλησιέστεροι γεί-
τονες θα είναι οι s(i±1,j), s(i,j±1). Οι τοροειδείς συνοριακές συνθή-
κες εφαρμόζονται εύκολα προσθέτοντας/αφαιρώντας L στα i,j, όποτε
αυτά γίνονται μικρότερα του 1/μεγαλύτερα του L αντίστοιχα. Αυτό φαί-
νεται στα σχήματα 13.5 και 13.34.
   Για να υπολογιστεί όμως μια θέση στο πλέγμα πρέπει να υπολο-
γιστεί η θέση της στη μνήμη (j-1)*L+i η οποία εμπεριέχει έναν (αθέ-
ατο) πολλαπλασιασμό. Μπορούμε να αποφύγουμε τον πολλαπλασια-
σμό αυτό εύκολα με εφαρμογή των ελικοειδών συνοριακών συνθηκών.
Οι συντεταγμένες των πλεγματικών θέσεων καθορίζονται από έναν μόνο
αριθμό i = 1, . . . , L2 = N όπως φαίνεται στα σχήματα 13.6 και 13.35.
Τα σπιν αποθηκεύονται στη μνήμη σε ένα μονοδιάστατο array s(N) και
για να προσδιορίσουμε τους γείτονες μιας θέσης s(i) αρκεί να πάρουμε
τα σπιν s(i±1) και s(i±L). Η απλότητα των ελικοειδών συνοριακών
συνθηκών οφείλεται στο ότι για τους πλησιέστερους γείτονες των σπιν
που βρίσκονται στο όριο του τετραγώνου, αρκεί να επαναφέρουμε τον
δείκτη του array στα αποδεκτά όρια 1≤ i ≤ N προσθέτοντας ή αφαι-
532                                            ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

                                                                      1 2         3 4 5
                                               1    2    3    4    5 6 7          8 9 10
                       1   2    3    4     5   6    7    8    9   10 11 12       13 14 15
                       6    7    8    9   10 11    12   13   14   15 16 17       18 19 20
                      11   12   13   14   15 16    17   18   19   20 21 22       23 24 25
                      16   17   18   19   20 21    22   23   24   25    1    2    3    4    5
                      21   22   23   24   25 1      2    3    4    5    6    7    8    9   10
                       1    2    3    4    5 6      7    8    9   10   11   12   13   14   15
                       6    7    8    9    10 11   12   13   14   15   16   17   18   19   20
                      11   12   13   14   15 16    17   18   19   20   21   22   23   24   25
                      16   17   18   19   20 21    22   23   24   25    1    2    3    4    5
                      21   22   23   24   25 1      2    3    4    5    6    7    8    9   10
                       1 2 3 4             5 6      7    8    9   10   11   12   13   14   15
                       6 7 8 9            10 11    12   13   14   15   16   17   18   19   20
                      11 12 13 14         15 16    17   18   19   20   21   22   23   24   25
                      16 17 18 19         20 21    22   23   24   25
                      21 22 23 24         25

Σχήμα 13.6: Τετραγωνικό πλέγμα με ελικοειδείς συνοριακές συνθήκες και L = 5. Η
τοπολογία είναι τοροϊδής.




ρώντας κατάλληλα τον αριθμό N. Έτσι, αν στο πρόγραμμά μας θέλουμε
να υπολογίσουμε τους τέσσερις πλησιέστερους γείτονες nn της θέσης i,
αρκεί το παρακάτω κομμάτι κώδικα:

 nn=i +1; i f   ( nn . gt . N ) nn=nn−N
 nn=i −1; i f   ( nn . lt . 1 ) nn=nn+N
 nn=i+L ; i f   ( nn . gt . N ) nn=nn−N
 nn=i−L ; i f   ( nn . lt . 1 ) nn=nn+N

Εμείς θα επιλέξουμε τις ελικοειδής συνοριακές συνθήκες λόγω του πλε-
ονεκτήματος ταχύτητας υπολογισμού της θέσης των πλησιέστερων γει-
τόνων. Αν και για μικρά πλέγματα μπορεί η μικρή παραμόρφωση που
εισάγουν να δώσει ένα μικρό σφάλμα, για τα μεγέθη πλεγμάτων που
θα μελετήσουμε αυτό θα είναι αμελητέο.
   Η δυναμική της Μόντε Κάρλο εξέλιξης καθορίζεται από την αρχική
κατάσταση του συστήματος και τον αλγόριθμο του Metropolis. Κατάλ-
ληλη επιλογή αρχικών συνθηκών μπορεί να είναι εξαιρετικά σημαντική
για προσομοιώσεις συστημάτων με τη μέθοδο Μόντε Κάρλο. Από αυτή
θα εξαρτηθεί το πόσο γρήγορα, ακόμα και το αν το σύστημα θα βρεθεί
σε κατάσταση θερμικής ισορροπίας. Στην περίπτωση μας, αυτό δε θα
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                       533

είναι ιδιαίτερα σημαντικό πρόβλημα, αλλά θα το μελετήσουμε λόγω της
σημασίας του σε άλλα προβλήματα. Εδώ η αρχική κατάσταση μπορεί
να επιλεγεί να είναι “παγωμένη” (β = ∞ - όλα τα σπιν να έχουν την ίδια
τιμή) ή “θερμή” (β = 0 - τα σπιν να έχουν τιμή ±1 με ίση πιθανότητα
1/2). Για μεγάλα πλέγματα όπου η εύρεση της κατάστασης θερμικής
ισορροπίας μπορεί να απαιτεί αρκετά βήματα, επιλέγουμε τη σταδιακή
μεταβολή της θερμοκρασίας από β = 0 ή β = ∞ στις επιθυμητές τιμές.
Σε κάθε βήμα μεταβολής της θερμοκρασίας χρησιμοποιούμε τη διάταξη
σπιν από την προηγούμενη προσομοίωση, έτσι ώστε να βρισκόμαστε
γρήγορα στη νέα κατάσταση θερμικής ισορροπίας.
   Ξεκινώντας από διαφορετικές αρχικές συνθήκες και συγκρίνοντας τα
αποτελέσματά μας ελέγχουμε την ορθότητα τους, δηλ. αν το σύστημά
μας έχει πετύχει τη θερμική ισορροπία και αν η μέθοδός μας πάσχει
από προβλήματα εργοδικότητας.
   Εξετάζουμε τώρα τα βήματα της διαδικασίας Markov που παράγε-
ται από τον αλγόριθμο Metropolis. Έστω ότι το σύστημά μας είναι στην
κατάσταση µ = {sµ1 , . . . , sµk , . . . , sµN } και εξετάζουμε τη μετάβαση στη νέα
κατάσταση ν = {sν1 , . . . , sνk , . . . , sνN } που προκύπτει από την αλλαγή της
τιμής του σπιν sνk = −sµk (spin flip), ενώ τα υπόλοιπα σπιν παραμένουν
τα ίδια sνj = sµj ∀j ̸= k.
   Η μεταβολή της ενέργειας θα είναι
                                              ∑                  ∑ µ µ
                   Eν − Eµ = (−                   sνi sνj ) − (−  si sj )   (13.23)
                                      ⟨ij⟩                          ⟨ij⟩
                                    ∑
                              = −            sµi (sνk   −   sµk )          (13.24)
                                     ⟨ik⟩
                                    ∑
                              = 2           sµi sµk                        (13.25)
                                    ⟨ik⟩
                                                       
                                            ∑
                              = 2sµk               sµi  ,                (13.26)
                                             ⟨ik⟩

όπου στη δεύτερη σειρά απαλείψαμε τους κοινούς όρους των δύο αθροι-
σμάτων και στην τρίτη χρησιμοποιήσαμε τη σχέση sνk − sµk = −2sµk που
μπορείτε εύκολα να αποδείξετε εξετάζοντας τις δύο περιπτώσεις sµk =
±1. Το μεγάλο πλεονέκτημα της παραπάνω σχέσης είναι ότι είναι το-
πική, εξαρτάται δηλαδή μόνο από τα γειτονικά σπιν και έτσι είναι γρή-
γορο να υπολογιστεί και η μεταβολή Eν − Eµ , η οποία είναι μικρός
αριθμός που δεν αυξάνει με το μέγεθος του πλέγματος.
   Ο αλγόριθμος Metropolis εφαρμόζεται τώρα εύκολα. Υπολογίζοντας
το άθροισμα στην παρένθεση της τελευταίας σειράς της (13.23) παίρ-
534                              ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

νουμε τη μεταβολή της ενέργειας Eν −Eµ . Αν Eν −Eµ ≤ 0, δεχόμαστε ότι
η κατάσταση ν είναι η νέα κατάσταση του συστήματος. Αν Eν − Eµ > 0,
τότε A(µ → ν) = e−β(Eν −Eµ ) < 1. Επιλέγουμε έναν ομοιόμορφα κατανε-
μημένο τυχαίο αριθμό 0 ≤ x < 1. Η πιθανότητα να έχουμε x < A(µ → ν)
είναι A(µ → ν). Άρα αν x < A(µ → ν), δεχόμαστε τη μεταβολή. Αν
A(µ → ν) < x, η μεταβολή απορρίπτεται και παραμένουμε στην κατά-
σταση µ.
   Μια μικρή τεχνική παρατήρηση στον σχεδιασμό (∑       του
                                                          ) προγράμματος
είναι ότι οι δυνατές τιμές του αθροίσματος              µ
                                                  ⟨ik⟩ si  = −4, −2, 0, 2, 4.
Οι τιμές που υπεισέρχονται στον υπολογισμό της A(µ → ν) είναι μόνο
αυτές που αυξάνουν την ενέργεια, δηλ. οι δύο τιμές 2, 4. Οι δύο αυτές
τιμές για τα A(µ → ν) μπορούν να αποθηκευτούν στη μνήμη του υπολο-
γιστή και να αποφύγουμε την ακριβή σε χρόνο επανάληψη υπολογισμού
των εκθετικών e−β(Eν −Eµ ) .
   Τέλος, το πρόγραμμά μας θα πρέπει να υπολογίζει τις φυσικές πο-
σότητες που θα μετρήσουμε κατά τη μελέτη του συστήματός μας. Αυτές
είναι η ενέργεια (13.13)
                                    ∑
                             E=−       si sj ,                     (13.27)
                                      ⟨ij⟩

και η μαγνήτιση
                                     ∑
                               M=            si .                    (13.28)
                                       i
Η απόλυτη τιμή στην τελευταία σχέση μπαίνει λόγω της συμμετρίας
ανάκλασης των σπιν του συστήματος (ομάδα Z2 ). Επειδή είναι ισοπί-
θανο να έχουμε δύο διατάξεις με όλα τα σπιν τους να  ∑έχουν αντίθετες
τις τιμές τους σε κάθε πλεγματική θέση, η μέση τιμή ⟨ i si ⟩ είναι πάντα
0. Για αρκετά μεγάλο αριθμό ∑ μετρήσεων, όσες φορές το σύστημά μας
θα είναι σε ∑μία διάταξη με i si = M1 , θα είναι και σε μία αντίστοιχη
διάταξη με i si = −M1 . Στην πράξη, όπως θα δούμε, η μετάβαση από
την κατάσταση με μαγνήτιση M1 στην κατάσταση με μαγνήτιση −M1
μπορεί να χρειάζεται μεγάλο αριθμό βημάτων Μόντε Κάρλο, ιδιαίτερα
όταν β ≫ βc , και αυτό να μην παρατηρείται στην προσομοίωσή μας. Στο
όριο N → ∞ (θερμοδυναμικό όριο) το σύστημα επιλέγει τη μία από τις
δύο καταστάσεις (αυθόρμητο σπάσιμο συμμετρίας).
    Οι μετρήσεις της ενέργειας και της μαγνήτισης μπορούν να γίνονται
με δύο τρόπους. Στον πρώτο ενημερώνουμε την τιμή της ενέργειας και
της μαγνήτισης σε κάθε βήμα Μόντε Κάρλο. Αυτό γίνεται εύκολα, γιατί
η μεταβολή των τιμών των αθροισμάτων στις (13.27) και (13.28) εξαρ-
τάται μόνο από την τιμή του σπιν sµk που αλλάζει και των τιμών του
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                   535

σπιν των πλησιέστερων γειτόνων. Τη μεταβολή της ενέργειας την υπο-
λογίζουμε έτσι κι αλλιώς από τη σχέση (13.23), ενώ η μεταβολή του
αθροίσματος στην (13.28) δίνεται απλά από την
                   ∑        ∑ µ
                      sνi −   si = sνk − sµk = −2sµk        (13.29)
                      i         i

Ο δεύτερος τρόπος είναι να υπολογίζουμε τα αθροίσματα (13.27) και
(13.28) κάθε φορά που θέλουμε να πάρουμε μια μέτρηση. Ποια μέθο-
δος είναι πιο συμφέρουσα εξαρτάται από το πόσο συχνά παίρνουμε
μια στατιστικά ανεξάρτητη μέτρηση⁷ και από τον λόγο αποδοχής των
βημάτων Μόντε Κάρλο. Λ.χ. για τον υπολογισμό της μαγνήτισης, αν ο
μέσος λόγος αποδοχής είναι Ā, τότε με τον πρώτο τρόπο έχω ĀN προ-
σθέσεις ανά Μόντε Κάρλο βήματα (1 sweep), ενώ με τον δεύτερο έχω
N προσθέσεις ανά μέτρηση.
   Είναι συνηθισμένο να κανονικοποιούμε την ενέργεια ανά δεσμό
                              1        1
                       ⟨e⟩ =    ⟨E⟩ =    ⟨E⟩ ,               (13.30)
                             Nl       2N
η οποία παίρνει τιμή από -1 (θεμελιώδης κατάσταση, όλοι οι 2N δεσμοί
έχουν τιμή -1) μέχρι +1, ενώ τη μαγνήτιση ανά πλεγματική θέση
                                   1
                             ⟨m⟩ = ⟨M ⟩ ,                     (13.31)
                                   N
η οποία παίρνει τιμή από 0 (πλήρης αταξία - β = 0) έως 1 (θεμελιώδης
κατάσταση - β = ∞). Για τον λόγο αυτό, η μαγνήτιση είναι μια παρά-
μετρος τάξης (order parameter), δηλ. μια φυσική ποσότητα της οποίας
η μέση τιμή μας υποδεικνύει πότε το σύστημα βρίσκεται σε φάση τάξης
(ordered phase) ή σε φάση αταξίας (disordered phase).
   Από τις ποσότητες αυτές υπολογίζουμε τις διακυμάνσεις της ενέρ-
γειας από την ειδική θερμότητα
                c = β 2 N ⟨(e − ⟨e⟩)2 ⟩ = β 2 N (⟨e2 ⟩ − ⟨e⟩2 ) ,      (13.32)
και της μαγνήτισης από τη μαγνητική επιδεκτικότητα
               χ = βN ⟨(m − ⟨m⟩)2 ⟩ = βN (⟨m2 ⟩ − ⟨m⟩2 ) .             (13.33)
   Για να εκτιμήσουμε πόσα δεδομένα πρέπει να συλλέξουμε για μια
καλή μέτρηση των παραπάνω ποσοτήτων, ανατρέχουμε στο αποτέλεσμα
της στατιστικής που μας λέει ότι αν έχουμε n ανεξάρτητες
                                              √          μετρήσεις,
τότε το στατιστικό σφάλμα ελαττώνεται σαν ∼ 1/ n. Το πρόβλημα είναι
πότε έχουμε ανεξάρτητες μετρήσεις, το οποίο θα το αντιμετωπίσουμε
παρακάτω.
  ⁷Εξαρτάται, όπως θα δούμε παρακάτω, από τον χρόνο αυτοσυσχετισμού.
536                                ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

13.3.1 Ο Κώδικας
Στην παράγραφο αυτή θα παρουσιάσουμε και αναλύσουμε τον κώδικα⁸
που θα χρησιμοποιήσουμε στην προσομοίωση του πρότυπου Ising. Ο
κώδικας αυτός βρίσκεται στο συνοδευτικό λογισμικό, στον κατάλογο
Ising_Introduction του κεφαλαίου αυτού.
   Θα ακολουθήσουμε τη φιλοσοφία του modular programming όπου
θα τοποθετήσουμε σε διαφορετικά αρχεία ξεχωριστές ενότητες του κώ-
δικα. Αυτό κάνει ευκολότερη την ανάπτυξη, έλεγχο και συντήρηση του
κώδικα από έναν ή και περισσότερους προγραμματιστές. Αρχικά, σε ένα
αρχείο–επικεφαλίδα (header file) τοποθετούμε τους ορισμούς που είναι
κοινοί για ένα ή περισσότερα αρχεία. Το πλεονέκτημα μιας τέτοιας επι-
λογής είναι ότι έχουμε συγκεντρωμένες σε ένα αρχείο, όλες τις βασικές
παραμέτρους και κοινές μεταβλητές (common blocks), ώστε κάθε αλ-
λαγή τους να γίνεται αυτόματα και χωρίς λάθη παντού στον κώδικα. Το
αρχείο αυτό, εδώ το ονομάζουμε include.inc, θα συμπεριλαμβάνεται
σε κάθε αρχείο που θα το χρησιμοποιεί με μια εντολή του include:

! ============== i n c l u d e . i n c ==================
   i m p l i c i t none
  i n t e g e r , parameter           : : L = 12
  i n t e g e r , parameter           : : N = L*L
  i n t e g e r , parameter           : : XNN = 1 , YNN = L
  i n t e g e r , dimension ( N )     :: s
  r e a l ( 8 ) , dimension ( 0 : 4 ) : : prob
  real (8)                            : : beta
  common / lattice /                      s
  common / parameters /                   beta , prob
! function definitions :
  real (8)                            : : drandom
  integer                             : : seed
  common / randoms /                      seed

Το μέγεθος του πλέγματος εισάγεται ως σταθερή παράμετρος, ενώ οι
μεταβλητές σπιν και παράμετροι της προσομοίωσης τοποθετούνται σε
common blocks. To array s(N) είναι τα σπιν στις πλεγματικές θέσεις
και παίρνουν τιμές ±1. Η μεταβλητή beta είναι η θερμοκρασία β του
συστήματος και στην prob(0:4) τοποθετούμε τις δυνατές τιμές των πι-
θανοτήτων A(µ → ν) όπως εξηγήσαμε στη σελίδα 534. Η drandom() είναι
αυτή που θα χρησιμοποιήσουμε για γεννήτρια ψευδοτυχαίων αριθμών
και ο σπόρος seed είναι ορατός από όλο το πρόγραμμα, έτσι ώστε να
   ⁸Οι βασικές ιδέες του προγράμματος έχουν παρθεί από το βιβλίο των Newmann
και Barkema [4].
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                  537

μπορούμε να τον θέσουμε από διαφορετικές συναρτήσεις, όποτε το επι-
θυμούμε. Τέλος, οι παράμετροι XNN και YNN είναι αυτές που μας οδηγούν
στους πλησιέστερους γείτονες μιας πλεγματικής θέσης σύμφωνα με όσα
είπαμε στην αρχή της ενότητας 13.3. Για παράδειγμα i+XNN είναι ο πλη-
σιέστερος γείτονας της (εσωτερικής) θέσης i κατά την +x διεύθυνση και
i-YNN είναι ο πλησιέστερος γείτονας κατά την −y διεύθυνση.
   Το κυρίως πρόγραμμα βρίσκεται στο αρχείο main.f90 και οδηγεί την
προσομοίωση:

! ============== main . f90                ==================
program Ising2D
  include ’ include . inc ’
  i n t e g e r : : start      ! s t a r t = 0 ( c o l d ) / 1 ( hot )
  i n t e g e r : : isweep , nsweep

 nsweep = 1000
 beta =0.21 D0 ; seed =9873; start =1;
 c a l l init ( start )
 do isweep = 1 , nsweep
   c a l l met
   c a l l measure
 end do
end program Ising2D

Εδώ θέτουμε τις παραμέτρους της προσομοίωσης. Η αρχική κατάσταση
καθορίζεται από την τιμή της start και είναι ψυχρή για start=0 και
θερμή για start=1. Η θερμοκρασία τίθεται από την τιμή της beta και ο
αριθμός των sweeps του πλέγματος από την nsweep. Από το μικρό αυτό
αρχείο βλέπουμε τη βασική δομή της προσομοίωσης: Στην αρχή τίθεται
η αρχική κατάσταση του συστήματος (init), ενώ μετά για κάθε sweep
κάνουμε ένα Metropolis sweep (met) και μία μέτρηση (measure).
   Σε ένα επίπεδο παρακάτω, βλέπουμε το πρόγραμμα της init στην
οποία περνάμε τη μεταβλητή start, προκειμένου να θέσει το πλέγμα
στην αρχική του κατάσταση:

! ============== i n i t . f90              ==================
! f i l e i n i t . f90
! i n i t ( s t a r t ) : s t a r t = 0: cold s t a r t
!                         s t a r t = 1 : hot s t a r t
! =============================================
s u b r o u t i n e init ( start )
  include ’ include . inc ’
  i n t e g e r : : start
  integer : : i
538                                           ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

!−−−−−−−−−−−−−−−−−−−−−−
! i n i t i a l i z e p r o b a b i l i t i e s f o r E_\nu > E_mu
  prob =0.0 D0
 do i =2 ,4 ,2 ! i = dE/ 2 = ( E_nu−E_mu) /2=2 ,4
    prob ( i ) = exp ( −2.0 D0 * beta * i )
  enddo
! i n i t i a l configuration :
  s e l e c t c a s e ( start )
    case (0) ! cold :
      s = 1 ! all s( i ) = 1
    c a s e ( 1 ) ! hot :
      do i =1 , N
        i f ( drandom ( ) . lt . 0.5 D0 ) then
          s(i) = 1
        else
          s ( i ) = −1
        endif
      enddo
    case default
      p r i n t * , ’ i n i t : s t a r t = ’ , start , ’ not v a l i d . E x i t i n g . . . ’
      stop
    end s e l e c t

end s u b r o u t i n e init

Η δομή της συνάρτησης είναι πολύ απλή. Αρχικοποιεί το array prob(0:4)
                                                                    ∑
                                                             −2βsµ         µ
                                                                 k ( ⟨ik⟩ si ) .
με τις τιμές των πιθανοτήτων A(µ → ν) = e−β(Eν(−Eµ ) = e)
                                                   ∑
Οι πιθανότητες αυτές μας ενδιαφέρουν, όταν sµk             µ
                                                     ⟨ik⟩ si   > 0 και οι
δυνατές τιμές που μπορεί τότε να πάρει είναι 2 και 4. Αυτές είναι και
οι τιμές που αποθηκεύουμε
              (          )   και θυμόμαστε ότι ο δείκτης του array είναι
             µ ∑       µ
η έκφραση sk     ⟨ik⟩ si , όταν αυτή είναι θετική.
   Στη συνέχεια, καθορίζουμε την αρχική διάταξη των σπιν ανάλογα
με την τιμή που παίρνει ο ακέραιος start. Το select case block μας
επιτρέπει να προσθέσουμε στο μέλλον και άλλες δυνατότητες, αν τυχόν
αναβαθμίσουμε τον κώδικα. Αν start=0, οι τιμές όλων τον σπιν τίθενται
ίσες με 1, ενώ αν start=1 θέτουμε τις τιμές των σπιν με ίση πιθανότητα
±1. Η πιθανότητα drandom()<0.5 είναι 1/2, οπότε στην περίπτωση αυτή
s(i)=1, αλλιώς (πιθανότητα 1 − 1/2 = 1/2) s(i)=-1.
   Η καρδιά του προγράμματος είναι η υπορουτίνα met(). Αυτή εκτελεί
N Metropolis βήματα. Επισκέπτεται N φορές μία τυχαία πλεγματική θέση
και θέτει το ερώτημα αν θα μεταβάλλει την τιμή του σπιν (spin flip).
Αυτό γίνεται σύμφωνα με τον αλγόριθμο Metropolis υπολογίζοντας τη
μεταβολή στην ενέργεια πριν και μετά την αλλαγή του σπιν σύμφωνα
με τη σχέση (13.23):
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                        539


! ============== met . f90                ==================
s u b r o u t i n e met ( )
  include ’ include . inc ’
  integer : : i , k
  i n t e g e r : : nn , snn , dE

  do k =1 , N
! p i c k a random s i t e :
   i = INT ( N * drandom ( ) ) +1
! snn=sum o f n e i g h b o r i n g s p i n s :
   snn = 0
   nn=i+XNN ; i f ( nn . gt . N ) nn=nn−N ; snn =        snn   +   s ( nn )
   nn=i−XNN ; i f ( nn . lt . 1 ) nn=nn+N ; snn =        snn   +   s ( nn )
   nn=i+YNN ; i f ( nn . gt . N ) nn=nn−N ; snn =        snn   +   s ( nn )
   nn=i−YNN ; i f ( nn . lt . 1 ) nn=nn+N ; snn =        snn   +   s ( nn )
! dE=change i n energy / 2 :
   dE=snn * s ( i )
! flip :
    i f ( dE . le . 0 ) then
      s ( i ) = −s ( i ) ! a c c e p t
    e l s e i f ( drandom ( ) < prob ( dE ) ) then
      s ( i ) = −s ( i ) ! a c c e p t
   endif
  enddo ! do k =1 ,N: end sweep
end s u b r o u t i n e met

Η γραμμή

  i = INT ( N * drandom ( ) ) +1

επιλέγει ισοπίθανα μια πλεγματική θέση i=1,...,N. Εδώ, είναι σημα-
ντικό να μην παρουσιαστεί ποτέ η τιμή i=N+1 που θα μπορούσε να
γίνει, αν drandom()=1.0. Την τιμή αυτή την έχουμε αποκλείσει, όπως
συζητήσαμε στην Παράγραφο 11.1.           (∑          )
                                                    µ
   Στη συνέχεια, υπολογίζουμε το άθροισμα         s
                                              ⟨ik⟩ i    της (13.23). Για
τον λόγο αυτό πρέπει να βρούμε τους πλησιέστερους γείτονες της θέσης
i και αυτό γίνεται με τις γραμμές

  snn = 0
  nn=i+XNN ;    if   ( nn . gt . N ) nn=nn−N ; snn   =   snn   +   s ( nn )
  nn=i−XNN ;    if   ( nn . lt . 1 ) nn=nn+N ; snn   =   snn   +   s ( nn )
  nn=i+YNN ;    if   ( nn . gt . N ) nn=nn−N ; snn   =   snn   +   s ( nn )
  nn=i−YNN ;    if   ( nn . lt . 1 ) nn=nn+N ; snn   =   snn   +   s ( nn )
                                                                              (∑          )
Στη συνέχεια, θέτουμε στη μεταβλητή delta το γινόμενο (13.23) sµk                       µ
                                                                                   ⟨ik⟩ i .
                                                                                       s
540                                     ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

Αν αυτό είναι αρνητικό, τότε η μεταβολή της ενέργειας είναι αρνη-
τική και η αλλαγή του σπιν γίνεται δεκτή. Αν όχι, τότε εφαρμόζουμε
το κριτήριο (13.22) χρησιμοποιώντας την τιμή του array prob(delta)
σύμφωνα με τον τρόπο που το κατασκευάσαμε στην init. Η πιθα-
νότητα του ομοιόμορφα κατανεμημένου στο διάστημα (0, 1) αριθμού
drandom()<prob(delta) είναι prob(delta) και στην περίπτωση αυτή η
αλλαγή γίνεται δεκτή. Σε κάθε άλλη περίπτωση, η αλλαγή δε γίνεται
δεκτή και το σπιν s(i) διατηρεί την παλιά του τιμή.
   Μετά από κάθε Metropolis sweep έχουμε επιλέξει να κάνουμε μια
μέτρηση της ενέργειας και της μαγνήτισης. Εδώ επιλέγουμε μινιμαλι-
στική προσέγγιση του κεντρικού κώδικα και υπολογίζουμε μόνο τα ανα-
γκαία. Αφήνουμε στη διαδικασία της ανάλυσης τον υπολογισμό των μέ-
σων τιμών, των στατιστικών σφαλμάτων, της ειδικής θερμότητας και της
μαγνητικής επιδεκτικότητας. Δίνουμε στην ανάλυση τη μέγιστη δυνατή
πληροφορία που θέλουμε να παρέχουμε και αφήνουμε στη φάση εκείνη
να αποφασιστεί αν και πώς θα υπολογιστεί μια φυσική ποσότητα. Αυτό,
αν δεν έχουμε πρόβλημα αποθηκευτικού χώρου, είναι προτιμητέο, αν η
παραγωγή των δεδομένων είναι “ακριβή” και η ανάλυση “φτηνή”. Ένας
άλλος λόγος που παρέχουμε στην ανάλυση την εκάστοτε τιμή της ενέρ-
γειας και μαγνήτισης είναι ώστε να γίνει δυνατή η λεπτομερής παρακο-
λούθηση της προσομοίωσης και να εντοπιστούν προβλήματα. Μπορούμε
να δούμε αν το σύστημα έφτασε σε θερμική ισορροπία, αν παρουσιά-
ζονται μεγάλοι αυτοσυσχετισμοί ή αν υπάρχουν λάθη στο πρόγραμμα.
   Η measure υπολογίζει κάθε φορά που καλείται τη συνολική ενέργεια
και μαγνήτιση (χωρίς την απόλυτη τιμή) καλώντας τις ξεχωριστές συ-
ναρτήσεις E() και M(). Αυτές απλά εφαρμόζουν τις σχέσεις (13.27) και
(13.28) (χωρίς την απόλυτη τιμή).

! ============== measure . f90 ==================
s u b r o u t i n e measure ( )
  include ’ include . inc ’
  integer : : E , M
  print * , E () ,M ()
end s u b r o u t i n e measure
! =====================
integer function E ()
  include ’ include . inc ’
  i n t e g e r en , sum , i , nn
  en = 0
  do i =1 , N
! Sum o f n e i g h b o r i n g s p i n s : only forward nn n e c e s s a r y i n t h e sum
    sum = 0
    nn=i+XNN ; i f ( nn . gt . N ) nn=nn−N ; sum = sum + s ( nn )
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                       541

   nn=i+YNN ; i f ( nn . gt . N ) nn=nn−N ; sum = sum + s ( nn )
   en=en+sum* s ( i )
  enddo
  e = −en
end f u n c t i o n E
! =====================
integer function M ()
  include ’ include . inc ’
  M=SUM( s )
end f u n c t i o n M


Η μεταγλώττιση του κώδικα γίνεται με την εντολή

> g f o r t r a n main . f90 met . f90 init . f90 measure . f90 drandom . f90 \
   −o is


η οποία παράγει το εκτελέσιμο αρχείο is το οποίο μπορούμε τώρα να
τρέξουμε:

> . / is > out . dat
> l e s s out . dat
−52 10
−48 40
−64 44
−92 64
......


Η έξοδος του προγράμματος είναι σε δύο στήλες, στην πρώτη τυπώνε-
ται η συνολική ενέργεια και στη δεύτερη η μαγνήτιση (χωρίς απόλυτη
τιμή). Για να φτιάξουμε τις λεγόμενες “χρονοσειρές ” των μετρήσεών
μας μπορούμε να δώσουμε τις εντολές

gnuplot > p l o t ” out . dat ” using 1 with lines
gnuplot > p l o t ” out . dat ” using 2 with lines
gnuplot > p l o t ” out . dat ” using ( ( $2 >0) ? $2:−$2 ) with lines


Στην τελευταία γραμμή φτιάχνουμε∑ το γράφημα της M παίρνοντας την
απόλυτη τιμή του αθροίσματος i si . Ζητάμε από το gnuplot να μας
κάνει τη γραφική παράσταση παίρνοντας τη δεύτερη στήλη $2, αν αυτή
είναι θετική ($2>0)?, αλλιώς το αντίθετό της -$2.
542                                 ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

13.3.2 Βελτίωση του Interface
Στην ενότητα αυτή θα κάνουμε βελτιώσεις στον κώδικα, κυρίως στο
επίπεδο αλληλεπίδρασης με το χρήστη (user interface). Τον κώδικα του
προγράμματος που συζητείται παρακάτω θα τον βρείτε στον κατάλογο
Ising_Metropolis στο συνοδευτικό λογισμικό αυτού του κεφαλαίου. Το
πρόγραμμα στη μορφή που του δώσαμε στην προηγούμενη ενότητα έχει
προγραμματισμένες (hard coded) τις διάφορες παραμέτρους της προ-
σομοίωσης και κάθε φορά που θέλουμε να τις αλλάξουμε, πρέπει να
τις κωδικοποιήσουμε στο αντίστοιχο αρχείο και να επαναμεταγλωττί-
σουμε. Επίσης αλλάζουμε τον κώδικα, έτσι ώστε να αποθηκεύεται η
τελευταία διάταξη στην οποία βρίσκεται το σύστημα, καθώς και να ει-
σάγεται διάταξη του συστήματος που έχει αποθηκευτεί στο δίσκο.
    Ανάμεσα στις παραμέτρους που θα μπορεί ο χρήστης να ορίζει τη
στιγμή που τρέχει το πρόγραμμα είναι και το μέγεθος του πλέγμα-
τος L. Αυτό καθορίζει την απαιτούμενη μνήμη για το array s(N) την
οποία θα πρέπει να ζητήσουμε δυναμικά από το σύστημα με τη συ-
νάρτηση ALLOCATE. Το πρόβλημα είναι πως το s(N) έχει δεδομένα που
πρέπει να είναι προσβάσιμα από όλες τις διαδικασίες του προγράμ-
ματος και arrays που είναι allocatable και δεν μπορούν να μπουν σε
common blocks. Ένας άλλος τρόπος να μοιράζονται οι διαδικασίες δε-
δομένα είναι με τη χρήση modules. Αυτός είναι και ο προτιμότερος σε
νέα προγράμματα Fortran όπου η χρήση των common blocks συνιστάται
να αποφεύγεται. Τα δεδομένα (εδώ απλά παράμετροι και μεταβλητές)
τοποθετούνται ανάμεσα στις δηλώσεις

module global_data
 i m p l i c i t none
 SAVE
  ....
end module global_data

Στις ... τοποθετούμε δηλώσεις μεταβλητών και χρησιμοποιούμε την
εντολή SAVE. Το όνομα του module εδώ είναι global_data και όποια
διαδικασία θέλει να μοιραστεί τα δεδομένα του module πρέπει να ξε-
κινήσει με την εντολή use global_data:

s u b r o u t i n e share_global_data
  use global_data
  i m p l i c i t none
  ....
end s u b r o u t i n e share_global_data
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                           543

Σε ένα αρχείο global_data.f90 ορίζουμε τις μεταβλητές που θα είναι
προσβάσιμες από όλες τις διαδικασίες:

module global_data
 i m p l i c i t none
 SAVE
 integer                               ::   L
 integer                               ::   N
 integer                               ::   XNN , YNN
 integer , allocatable                 ::   s(:)
 r e a l ( 8 ) , dimension ( 0 : 4 )   ::   prob
 real (8)                              ::   beta
 integer                               ::   nsweep , start
 integer                               ::   seed , ranlux_level
 real (8)                              ::   acceptance
 c h a r a c t e r (1024)              ::   prog
end module global_data

Το array s(:) είναι τώρα allocatable και θα το ορίσουμε κατά την αρ-
χικοποίηση του προγράμματος στην init, ενώ οι μεταβλητές L, N, XNN
και YNN δεν ορίζονται πια ως παράμετροι και η τιμή τους θα καθοριστεί,
επίσης, στην init. Οι καινούργιες μεταβλητές είναι οι acceptance που
δίνει το ποσοστό των spin flips που γίνονται αποδεκτά κατά την προσο-
μοίωση, ranlux_level που καθορίζει το luxury level της RANLUX και
prog είναι το όνομα του προγράμματος που τρέχει την προσομοίωση.
   Στο κυρίως πρόγραμμα δεν έχουμε μεγάλες αλλαγές:

! ============== main . f90                 ==================
program Ising2D
  use global_data
  i m p l i c i t none
  i n t e g e r : : isweep

 c a l l init
 do isweep = 1 , nsweep
   c a l l met
   c a l l measure
 end do
 c a l l endsim
end program Ising2D

Παρατηρήστε τη γραμμή use global_data που δίνει πρόσβαση στα δε-
δομένα του module global_data. Με αυτή τη γραμμή θα ξεκινάνε όλες
οι διαδικασίες του προγράμματος της προσομοίωσης. Επίσης, η υπο-
ρουτίνα endsim κάνει τις εργασίες που απαιτούνται πριν κλείσει το
544                                           ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

πρόγραμμα. Ιδιαίτερα εδώ θα σταθούμε στην εγγραφή της τελικής διά-
ταξης του συστήματος στον δίσκο για μετέπειτα χρήση.

   Στην init έχουμε κάνει αρκετές αλλαγές, έτσι ώστε να ενσωματώ-
σουμε τις νέες δυνατότητες του προγράμματος:

! ============== i n i t . f90                     ==================
! s t a r t = 0: cold s t a r t
! s t a r t = 1 : hot s t a r t
! s t a r t = 2 : use old c o n f i g u r a t i o n
! =============================================
s u b r o u t i n e init
  use global_data
  i m p l i c i t none
  integer                                           : : i , chk
  real (8)                                          : : obeta=−1.0D0 , r
  integer                                           : : OL=−1
  c h a r a c t e r (1024)                          : : buf
  i n t e g e r , parameter                         : : f_in =17 ! f i l e u n i t
  integer                                           : : seeds (2 5 )
!−−−−−−−−−−−−−−−−−−−−−−
! D e f i n e parameters from o p t i o n s :
  L=−1;beta=−1.0D0 ; nsweep=−1;start=−1;seed=−1
  ranlux_level=3
  c a l l get_the_options
  i f ( start . EQ . 0 . OR . start . EQ . 1 ) then
    i f (L          < 0         ) c a l l locerr ( ’L             has not been s e t . ’ )
    i f ( seed < 0              ) c a l l locerr ( ’ seed has not been s e t . ’ )
    i f ( beta < 0.0 D0 ) c a l l locerr ( ’ b e t a has not been s e t . ’ )
! Derived parameters :
    N=L * L ; XNN =1; YNN=L
! A l l o c a t e memory f o r t h e s p i n s :
    ALLOCATE( s ( N ) ,STAT=chk )
    i f ( chk             > 0) c a l l locerr ( ’ a l l o c a t i o n f a i l u r e f o r s (N) ’ )
  e n d i f ! i f ( s t a r t .EQ. 0 .OR. s t a r t .EQ. 1 )
  i f ( start             < 0) c a l l locerr ( ’ s t a r t has not been s e t . ’ )
  i f ( nsweep            < 0) c a l l locerr ( ’ nsweep has not been s e t . ’ )
!−−−−−−−−−−−−−−−−−−−−−−
! i n i t i a l i z e p r o b a b i l i t i e s f o r E_\nu > E_mu
  prob =0.0 D0
  do i =2 ,4 ,2 ! i = dE/ 2 = ( E_nu−E_mu) /2=2 ,4
    prob ( i ) = exp ( −2.0 D0 * beta * i )
  enddo
  acceptance = 0.0 D0
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! i n i t i a l c o n f i g u r a t i o n : c o l d ( 0 ) , hot ( 1 ) , old ( 2 )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  s e l e c t c a s e ( start )
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                                                545

!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   case (0) ! cold :
      c a l l simmessage ( 6 )
      c a l l RLUXGO ( ranlux_level , seed , 0 , 0 )
     s = 1 ! all s( i ) = 1
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   c a s e ( 1 ) ! hot :
   c a l l simmessage ( 6 )
      c a l l RLUXGO ( ranlux_level , seed , 0 , 0 )
     do i =1 , N
        c a l l ranlux ( r , 1 )
        i f ( r . lt . 0.5 D0 ) then
          s(i) = 1
        else
          s ( i ) = −1
        endif
     enddo
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   c a s e ( 2 ) ! old :
      i f ( beta < 0.0 D0 ) c a l l locerr ( ’ b e t a has not been s e t . ’ )
     open ( f_in , f i l e = ’ c o n f ’ , s t a t u s = ’OLD’ ,ERR=101)
     read ( f_in , * ) buf ! read i n a comment l i n e
     read ( f_in , ’ (A4 , I5 , A4 , I5 , A6 , G28 . 1 7 , A6, 2 5 I16 ) ’ )&
        buf , OL , buf , OL , buf , obeta , buf , seeds
      i f ( L < 0 ) L = OL ! i f L has not been s e t , read from f i l e
      i f ( L /= OL ) & ! /= t h e same as .NE. ( not equal )
        c a l l locerr ( ’L d i f f e r e n t from t h e one read from c o n f . ’ )
     N=L * L ; XNN =1; YNN=L
! A l l o c a t e memory f o r t h e s p i n s :
    ALLOCATE( s ( N ) ,STAT=chk ) ;
      i f ( chk            > 0) c a l l locerr ( ’ a l l o c a t i o n f a i l u r e f o r s (N) ’ )
      c a l l simmessage ( 6 )
     p r i n t ’ (A) ’ , ’ # Reading c o n f i g u r a t i o n from f i l e c o n f ’
     do i =1 , N
        read ( f_in , * ,END=102) s ( i )
        i f ( s ( i ) /= 1 . AND . s ( i ) /= −1)&
          c a l l locerr ( ’ wrong v a l u e o f s p i n ’ )
     enddo
     c l o s e ( f_in )
      i f ( seed < 0) then ! i n i t i a l i z e from s e e d s read from f i l e :
        c a l l RLUXIN ( seeds )
     else                            ! o p t i o n seed s e t s new seed :
        c a l l RLUXGO ( ranlux_level , seed , 0 , 0 )
     endif
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   case default
     p r i n t * , ’ i n i t : s t a r t = ’ , start , ’ not v a l i d . E x i t i n g . . . ’
     stop 1
   end s e l e c t
546                                        ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   return
! here we put e r r o r messages :
101 c a l l locerr ( ’ C o n f i g u r a t i o n f i l e c o n f not found . ’ )
102 c a l l locerr ( ’ F i l e c o n f ended b e f o r e r e a d i n g a l l s p i n s . ’ )
end s u b r o u t i n e init

Ξεκινάμε με τον ορισμό των παραμέτρων του προγράμματος δίνοντάς
τους προκαθορισμένες τιμές, οι οποίες, όταν είναι αρνητικές, αυτό εί-
ναι ένδειξη ότι δεν έχουν οριστεί από το χρήστη. Μετά, καλούμε την
υπορουτίνα⁹ get_the_options η οποία διαβάζει τις τιμές που θέτει ο
χρήστης από τη γραμμή εντολών:

 L=−1;beta=−1.0D0 ; nsweep=−1;start=−1;seed=−1
 c a l l get_the_options

Όταν επιστρέφει, θεωρείται ότι οι τιμές έχουν τεθεί και πρέπει να γίνει
έλεγχος αν αυτό έχει γίνει σωστά. Για παράδειγμα, αν ο χρήστης ξεκι-
νάει μια καινούργια προσομοίωση και έχει ξεχάσει να ορίσει το L, τότε
καλείται η συνάρτηση locerr η οποία σταματάει το πρόγραμμα με το
μήνυμα σφάλματος που περιέχεται στην παρένθεση:

   i f ( L < 0 ) c a l l locerr ( ’L has not been s e t . ’ )

Όταν γίνει γνωστή η τιμή του N, τότε το πρόγραμμα μπορεί να ζητήσει
την εκχώρηση μνήμης για το s(N):

  N=L * L
  ALLOCATE( s ( N ) ,STAT=chk )
  i f ( chk > 0) c a l l locerr ( ’ a l l o c a t i o n f a i l u r e f o r s (N) ’ )

Η μεταβλητή chk που ορίζεται από το όρισμα STATUS είναι 0, όταν η
εκχώρηση είναι επιτυχής. Αν δεν είναι, τότε το πρόγραμμα σταματάει
με κλήση της locerr.
   Στη συνέχεια, έχουμε το SELECT CASE(start) που αρχικοποιεί το
πρόγραμμα ανάλογα με την τιμή της start. Αν start=0, ξεκινάμε όπως
και πριν με όλα τα σπιν να έχουν την τιμή 1. Το μόνο καινούργιο είναι
η κλήση της υπορουτίνας simmmessage(f_unit) που τυπώνει πληροφο-
ρίες για την προσομοίωση στο αρχείο που έχουμε συνδέσει με το unit
f_unit. Επίσης, ξεκινάμε τη γεννήτρια τυχαίων αριθμών RANLUX με την
RLUXGO όπως είχαμε πει στην Παράγραφο 11.2, σελ. 485. Εδώ γίνεται
   ⁹Θα την προγραμματίσουμε εμείς αργότερα στο αρχείο options.f90.
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                      547

και η χρήση της global μεταβλητής ranlux_level της οποίας την τιμή
προκαθορίσαμε παραπάνω να είναι ίση με 3 και την οποία μπορεί, αν
θέλει, να αλλάξει ο χρήστης από την get_the_options. Αν start=0, ξεκι-
νάμε από θερμή διάταξη των σπιν, όπως κάναμε και στην προηγούμενη
παράγραφο.
   Αν start=2, τότε επιχειρούμε να διαβάσουμε διάταξη των σπιν η
οποία έχει προηγουμένως αποθηκευτεί στο δίσκο. Αυτή υποθέτουμε
πως είναι σε ένα αρχείο με όνομα conf το οποίο έχει αυστηρά προ-
καθορισμένο format (το οποίο ορίζεται στην υπορουτίνα endsim). Αν το
αρχείο δεν υπάρχει, το όρισμα ERR=101 μεταφέρει τη ροή του προγράμ-
ματος στο τέλος, στην εντολή με ετικέτα 101, όπου τυπώνεται μήνυμα
σφάλματος από την locerr. Για να καταλάβουμε τις επόμενες εντολές
read πρέπει να ξέρουμε το format του conf το οποίο είναι (περίπου)
της μορφής:

# Configuration of 2d Ising model on square lattice . . . .
Lx= 12 Ly= 12 beta= 0.21 seed= 3718479 5267541 12092770 . . . .
 −1
  1
  1
  1
 −1
.....

Τα σχόλια “πετιούνται’ στην character μεταβλητή buf, ενώ διαβάζονται
δεδομένα που δίνουν το μέγεθος του πλέγματος, τη θερμοκρασία και
την κατάσταση της RANLUX. Αυτά δεν αποθηκεύονται απευθείας στις
μεταβλητές L, beta, αλλά σε προσωρινές μεταβλητές OL, obeta, έτσι
ώστε να συγκριθούν με τις τιμές που μπορεί να έχει δώσει αρχικά ο
χρήστης.
   Αν ο χρήστης έχει δώσει δικό του seed, τότε η RANLUX αρχικοποιείται
με το seed. Αν όχι, τότε η κατάσταση της RANLUX καθορίζεται από τα
seeds της προηγούμενης προσομοίωσης. Και οι δύο επιλογές έχουν σο-
βαρούς λόγους: Μπορεί ο χρήστης να θέλει να συνεχίσει την προσομοί-
ωση ακριβώς από το σημείο που την είχε αφήσει στο conf. Τότε θα θέλει
η RANLUX να συνεχίσει να παράγει την ίδια ακολουθία τυχαίων αριθμών
που είχε σταματήσει στο conf. Μπορεί όμως να θέλει να παράγει πολλά
ανεξάρτητα αποτελέσματα από την ίδια διάταξη των σπιν. Τότε θα ξε-
κινήσει κάθε φορά τη RANLUX με διαφορετικό seed και θα κάνει έτσι
ανεξάρτητες προσομοιώσεις¹⁰. Αυτό επιτυγχάνεται με τις γραμμές

  ¹⁰Οι προσομοιώσεις γίνονται ανεξάρτητες μετά από χρόνο τουλάχιστον 2τ , όπως θα
548                                       ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


    i f ( seed < 0) then ! i n i t i a l i z e from s e e d s read from f i l e :
      c a l l RLUXIN ( seeds )
    else                     ! o p t i o n seed s e t s new seed :
      c a l l RLUXGO ( ranlux_level , seed , 0 , 0 )
    endif

Τέλος, να σημειώσουμε πως διαβάζουμε τις τιμές των σπιν με προσοχή,
έτσι ώστε να έχουν μόνο τις επιτρεπτές τιμές ±1 και να είναι ίσα σε
αριθμό με αυτόν που καθορίζεται από το μέγεθος του πλέγματος¹¹.
Το τελευταίο επιτυγχάνεται με το όρισμα END=102 της εντολής READ,
όπου 102 είναι η ετικέτα της εντολής όπου θα μεταφερθεί ο έλεγχος
του προγράμματος από την εντολή READ, όταν επιχειρήσει να διαβάσει
μετά το τέλος του αρχείου. Αυτό θα συμβεί, αν π.χ. επιχειρήσουμε να
διαβάσουμε ένα κατεστραμμένο αρχείο.
   Ας δούμε τώρα την αποθήκευση της τελευταίας διάταξης των σπιν
από την υπορουτίνα endsim. Αυτή βρίσκεται στο αρχείο end.f90:

! ============== end . f90                 ==================
s u b r o u t i n e endsim ( )
  use global_data
  i m p l i c i t none
  i n t e g e r , parameter : : f_out = 17
  integer                      : : i , seeds (2 5 )

 c a l l RLUXUT ( seeds )
 c a l l rename ( ’ c o n f ’ , ’ c o n f . old ’ )
 open ( u n i t=f_out , f i l e = ’ c o n f ’ )
 w r i t e ( f_out , ’ (A) ’ )&
   ’ # C o n f i g u r a t i o n o f 2d I s i n g model on square l a t t i c e . . . ’
 w r i t e ( f_out , ’ (A4 , I5 , A4 , I5 , A6 , G28 . 1 7 , A6, 2 5 I16 ) ’ )&
   ’Lx= ’ , L , ’ Ly= ’ , L , ’ b e t a= ’ , beta , ’ seed= ’ , seeds
 do i =1 , N
   w r i t e ( f_out , ’ ( I3 ) ’ ) s ( i )
 enddo
 c l o s e ( f_out )
 p r i n t ’ (A, F7 . 3 ) ’ , ’ # a c c e p t a n c e= ’ ,&
   acceptance /DBLE( N ) /DBLE( nsweep )
end s u b r o u t i n e endsim

Καταρχήν, καλούμε την RLUXUT να σώσει την κατάσταση της RANLUX στο
array seeds. Με την υπορουτίνα RENAME μετονομάζουμε, αν υπάρχει,

δούμε όταν θα συζητήσουμε τους χρόνους αυτοσυσχετισμού.
  ¹¹Χρησιμοποιούμε τους ισοδύναμους τελεστές σύγκρισης                            '>'⇔'.GT.',
'>='⇔'.GE.', '/='⇔'.NE.', '=='⇔'.EQ.' κ.ο.κ.
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                     549

το αρχείο conf σε conf.old για να μην καταστραφεί η παλιά διάταξη
των σπιν από τη νέα. Στη συνέχεια, γράφουμε τις παραμέτρους της
προσομοίωσης και το seeds με το format (A4, I5, A4, I5, A6, G28.17,
A6, 25I16) το οποίο είναι ακριβώς το ίδιο με αυτό που χρησιμοποιούμε
στην εντολή READ στην init προκειμένου να διαβάσουμε τη διάταξη των
σπιν.
   Τέλος, παραθέτουμε και τον κώδικα για τις υπορουτίνες get_the_options(),
η οποία διαβάζει τις παραμέτρους μέσω unix options, simmessage(),
που τυπώνει πληροφορίες που καθορίζουν τις συνθήκες της προσο-
μοίωσης και locerr(), που σταματάει το πρόγραμμα τυπώνοντας ένα
μήνυμα στο stderr. Η επιλογή να περάσουμε τις παραμέτρους μέσω
unix options έχει τα πλεονεκτήματα ότι τις περνάμε προαιρετικά και
με όποια σειρά θέλουμε. Ας δούμε, κατ’ αρχήν, πώς δουλεύουν. Έστω
ότι το εκτελέσιμο αρχείο του προγράμματος είναι το is. Η εντολή

> . / is −L 10 −b 0.44 −s 1 −S 5342 −n 1000

θα τρέξει το πρόγραμμα θέτοντας L=10 (-L 10), beta=0.44 (-b 0.44),
start=1 (-s 1), seed=5342 (-S 5342) και nsweep=1000 (-n 1000). Τα
-L, -b, -s, -S, -n είναι τα options ή switches και μπορούμε να τα
βάλουμε με όποια σειρά θέλουμε. Οι τιμές που ακολουθούν είναι οι
τιμές που θα περάσουν στις τιμές των αντίστοιχων μεταβλητών. Υπάρ-
χουν και options που δεν απαιτούν ορίσματα, αλλά μεταβάλλουν τον
τρόπο που λειτουργεί το πρόγραμμα¹². Στην περίπτωσή μας, το option
-h (help) τυπώνει ένα σύντομο μήνυμα βοήθειας πάνω στη χρήση του
προγράμματος και σταματάει το πρόγραμμα:

> . / is −h
Usage : . / is [ options ]
         −L : Lattice length ( N=L * L )
         −b : beta
         −s : start (0 cold , 1 hot , 2 old config . )
         −S : seed
         −n : number of sweeps and measurements
         −u : seed from / dev / urandom
         −r : ranlux _ level
Monte Carlo simulation of 2d Ising Model . Metropolis is used by
default . Using the options , the parameters of the simulations
must be set for a new run ( start =0 ,1) . If start =2 , a
configuration is read from the file conf .

  ¹²Θυμηθείτε λ.χ. πώς το -l αλλάζει τον τρόπο λειτουργίας της εντολής ls, αν την
εκτελέσουμε ως ls -l.
550                                     ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

Έτσι μπορούμε να θυμόμαστε τον τρόπο χρήσης του προγράμματος.
   Ας δούμε πώς προγραμματίζουμε τα παραπάνω. Παίρνουμε τον κώ-
δικα από το αρχείο options.f90:

! ============== o p t i o n s . f90 ==================
s u b r o u t i n e get_the_options
  use global_data
  use getopt_m            ! from g e t o p t . f90
  i m p l i c i t none
  c a l l getarg ( 0 , prog )

 do
  s e l e c t c a s e ( getopt ( ”−hL : b : s : S : n : r : u” ) )
  c a s e ( ’L ’ )
    read ( optarg , * ) L
  case ( ’b ’ )
    read ( optarg , * ) beta
  case ( ’ s ’ )
    read ( optarg , * ) start
  case ( ’S ’ )
    read ( optarg , * ) seed
  c a s e ( ’n ’ )
    read ( optarg , * ) nsweep
  case ( ’ r ’ )
    read ( optarg , * ) ranlux_level
  c a s e ( ’u ’ )
    open ( 2 8 , f i l e =” / dev / urandom” , &
      a c c e s s =” stream ” , form=” unformatted ” )
    read (2 8) seed
    seed = ABS( seed )
    c l o s e (2 8)
  c a s e ( ’h ’ )
    c a l l usage
  case ( ’ ? ’ )
    p r i n t * , ’unknown o p t i o n      ’ , optopt
    stop
  c a s e ( char ( 0 ) ) ! done with o p t i o n s
    exit
  c a s e ( ’− ’ )         ! use −− t o e x i t from o p t i o n s
    exit
  case default
    p r i n t * , ’ unhandled o p t i o n ’ , optopt
  end s e l e c t
 enddo
end s u b r o u t i n e get_the_options


Με την εντολή call getarg(0,prog) αποθηκεύουμε το όνομα του προ-
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                                            551

γράμματος στη μεταβλητή character prog. Η συνάρτηση getopt είναι
μια συνάρτηση προγραμματισμένη από τον Mark Gates που ο κώδικάς
της είναι στο αρχείο getopt.f90. Είναι γραμμένη έτσι, ώστε να προσο-
μοιάζει, ως προς τον τρόπο χρήσης, την αντίστοιχη συνάρτηση της C¹³.
Το όρισμά της "-hL:b:s:S:n:r:u" ορίζει ως επιτρεπτά options τους χα-
ρακτήρες '-', 'L', 'b', 's', 'S', 'n', 'r', 'u'. Κάθε φορά που ο
χρήστης τους περνάει από τη γραμμή εντολών (ως λ.χ. -L 100, -h), το
do loop μας πάει στο αντίστοιχο CASE από όπου εκτελούμε τις εντολές
που θέλουμε. Αν κάποιο option δεν παίρνει argument (λ.χ. -h), τότε
εκτελείται μια εντολή όπως η call usage. Αν ένα option θέλουμε να
πάρει argument, τότε στο όρισμα της getopt μπαίνει μαζί με ':' (λ.χ.
L:, b:, ...) και το argument είναι προσβάσιμο από το πρόγραμμα μέσω
της μεταβλητής character optarg. Λ.χ. με τις γραμμές

   c a s e ( ’L ’ )
     read ( optarg , * ) L

η γραμμή εντολών που περιέχει -L 10 έχει σαν αποτέλεσμα η optarg να
έχει την τιμή '10'. Αυτό δεν είναι αριθμός, αλλά ακολουθία χαρακτήρων!
Για να μετατρέψουμε το character '10' στον integer 10, χρησιμοποιούμε
την εντολή READ σα να διαβάζαμε από ... αρχείο. Το ίδιο κάνουμε και
με τις άλλες παραμέτρους.
   Η υπορουτίνα locerr παίρνει στην είσοδο ένα μήνυμα σφάλματος,
το τυπώνει στο stderr με το όνομα του προγράμματος και σταματάει
το πρόγραμμα:

s u b r o u t i n e locerr ( errmes )
  use global_data
  i m p l i c i t none
  c h a r a c t e r ( * ) : : errmes
  w r i t e ( 0 , ’ (A, A) ’ ) ,TRIM( prog ) , ’ : ’ ,TRIM( errmes ) , ’ E x i t i n g . . . . ’
  stop 1
end s u b r o u t i n e locerr

Προσέξτε τη χρήση της πολύ χρήσιμης συνάρτησης TRIM. Αυτή “κόβει” τα
τελευταία κενά μιας μεταβλητής character. Αν δεν τη χρησιμοποιούσαμε,
η μεταβλητή character(1024) :: prog θα έπαιρνε στην εκτύπωση 1024
θέσεις χαρακτήρων, κάτι που δε θα μας άρεσε και πολύ...
   Η υπορουτίνα usage παίζει και αυτή πολύ σημαντικό ρόλο: Μας δίνει
σύντομες πληροφορίες για τη χρήση του προγράμματος και σύντομα θα

   ¹³Διαβάστε τα σχόλια στο αρχείο getopt.f90 για περισσότερες πληροφορίες.
552                                      ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

την εκτιμήσετε πολύ! Η σωστή τεκμηρίωση του προγράμματός μας είναι
αναπόσπαστο μέρος της δουλειάς μας...

s u b r o u t i n e usage
  use global_data
  i m p l i c i t none
  p r i n t ’ (3A) ’ , ’ Usage : ’ ,TRIM( prog ) , ’ [ o p t i o n s ] ’
  p r i n t ’ ( A) ’ , ’         −L : L a t t i c e l e n g t h (N=L*L) ’
  p r i n t ’ ( A) ’ , ’         −b : b e t a ’
  p r i n t ’ ( A) ’ , ’         −s : s t a r t (0 cold , 1 hot , 2 old c o n f i g . ) ’
  p r i n t ’ ( A) ’ , ’         −S : seed ’
  p r i n t ’ ( A) ’ , ’         −n : number o f sweeps and measurements ’
  p r i n t ’ ( A) ’ , ’         −u : seed from / dev / urandom ’
  p r i n t ’ ( A) ’ , ’         −r : r a n l u x _ l e v e l ’
  p r i n t ’ ( A) ’ , ’ Monte C a r l o s i m u l a t i o n o f 2d I s i n g Model . . . . ’
  stop
end s u b r o u t i n e usage

   Τέλος, η υπορουτίνα simmessage τυπώνει πληροφορίες για την προ-
σομοίωση που τρέχουμε. Δε χρειάζεται να τονίσουμε πόσο σημαντικό
είναι αυτό: Δεδομένα χωρίς ετικέτα είναι καλύτερα να τα πετάμε, γιατί
είναι επικίνδυνα, όπως κάνουμε και με τα ... φάρμακα. Εκτός από τις
παραμέτρους της προσομοίωσης, τυπώνουμε και πληροφορίες από το
περιβάλλον που τρέχει το πρόγραμμα: Το όνομα του υπολογιστή, το
είδος του λειτουργικού συστήματος, την ημερομηνία και το όνομα του
χρήστη που έτρεξε το πρόγραμμα. Όλες αυτές οι πληροφορίες μπορεί
να μας γίνουν πολύτιμες. Αλλάζοντας την μεταβλητή unit, μπορούμε να
τυπώσουμε το μήνυμα σε όποιο αρχείο θέλουμε.

s u b r o u t i n e simmessage ( u n i t )
  use global_data
  i m p l i c i t none
  integer : : unit
  c h a r a c t e r ( 1 0 0 ) : : user , host , mach , tdate
  c a l l GETLOG ( user )
  c a l l GETENV ( ’HOST ’             , host )
  c a l l GETENV ( ’HOSTTYPE ’ , mach )
  c a l l FDATE ( tdate )
  w r i t e ( u n it , ’ ( A           ) ’ )&
    ’ # ##################################################### ’
  w r i t e ( u n it , ’ ( A           ) ’ )&
    ’ # 2d I s i n g Model M e t r o p o l i s a l g o r i t h m on square l a t t i c e ’
  w r i t e ( u n it , ’ ( 8A          ) ’ )&
    ’ # Run on ’ ,TRIM( host ) , ’ ( ’ ,TRIM( mach ) , ’ ) by ’ ,TRIM( user ) ,&
    ’ on ’ ,TRIM( tdate )
13.3. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                                        553

 w r i t e ( uni t , ’ (   A, I6 , A ) ’ ) ’ # L            =   ’   , L , ’ (N=L*L) ’
 w r i t e ( uni t , ’ (   A, I14       ) ’ ) ’ # seed      =   ’   , seed
 w r i t e ( uni t , ’ (   A, I12 , A ) ’ ) ’ # nsweeps     =   ’   , nsweep , ’ (No . sweeps ) ’
 w r i t e ( uni t , ’ (   A, G28 . 1 7 ) ’ ) ’ # b e t a   =   ’   , beta
 w r i t e ( uni t , ’ (   A, I4 ,A ) ’ ) ’ # s t a r t     =   ’   , start ,&
  ’ (0 cold , 1            hot , 2 old c o n f i g ) ’
end s u b r o u t i n e    simmessage

Για τη μεταγλώττιση του κώδικα απαιτείται η εντολή:

> gfortran global _ data . f90 getopt . f90 \
  main . f90 init . f90 met . f90 measure . f90 end . f90 \
  options . f90 ranlux . F −o is

Είναι σημαντικό ότι τα αρχεία με τα modules global_data.f90, getopt.f90
προηγούνται των αρχείων με κώδικα που χρησιμοποιεί τα modules που
περιέχουν.
   Για να τρέξουμε το πρόγραμμα, περνάμε τις παραμέτρους μέσω των
options, όπως για παράδειγμα:

> / usr / bin / time . / is −L 10 −b 0.44 −s 1 −S 5342 −n 10000 \
     >& out . dat &

όπου προσθέσαμε και την εντολή time για τη μέτρηση των αποδόσεων
του προγράμματος.
   Ένα χρήσιμο εργαλείο για τη μεταγλώττιση του προγράμματος εί-
ναι το πρόγραμμα make. Θα μπορούσε να γραφτεί ολόκληρο κεφάλαιο
για το make, όμως παραπέμπουμε τον ενδιαφερόμενο αναγνώστη στις
σχετικές info pages¹⁴. Ας αρκεστούμε να πούμε πως, αν στον κατά-
λογο που βρίσκεστε, υπάρχει ένα αρχείο με όνομα Makefile που έχει
περιεχόμενα¹⁵:

# ####################       M a k e f i l e ############################
FC     = gfortran
OBJS   = global_data . o getopt . o \
          main . o init . o met . o measure . o end . o \
          options . o ranlux . o

  ¹⁴Με την εντολή: info             make ή στο διαδίκτυο στη διεύθυνση
www.gnu.org/software/make/manual/make.html
  ¹⁵Προσοχή, ένα από τα ... βίτσια του make είναι ότι οι εκτελέσιμες εντολές ($(FC),
/bin/rm στο παράδειγμα) βρίσκονται σε μια γραμμή που αρχίζει από TAB και όχι από
κενά ή άλλους χαρακτήρες. Άρα, στο παραπάνω παράδειγμα Makefile ο κενός χώρος
που φαίνεται στις γραμμές αυτές είναι ένα TAB και όχι 8 κενοί χαρακτήρες.
554                               ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

FFLAGS = −O2

is : $ ( OBJS )
     $ ( FC ) $ ( FFLAGS ) $^ −o $@

$ ( OBJS ) :     global_data . f90
options . o : getopt . f90
%.o : %.f90
      $ ( FC ) $ ( FFLAGS ) −c −o $@ $<

είναι αρκετό για να “φτιάξει” το εκτελέσιμο αρχείο is. Τι κερδίσαμε;
Για να δείτε, κάντε μια μετατροπή σε ένα από τα αρχεία του κώ-
δικα, λ.χ. στο main.f90 και εκτελέστε την εντολή make ξανά. Θα δείτε
πως μόνο το αρχείο που μεταβάλατε ξαναμεταγλωττίζεται και όχι τα
άλλα. Θέτοντας κανόνες εξάρτησης (dependencies), μπορείτε να πετύ-
χετε ακόμα πιο πολύπλοκες μεταγλωττίσεις. Με τη χρήση μεταβλητών
μπορούμε να κωδικοποιήσουμε τη σύνδεση με βιβλιοθήκες, επίπεδα βελ-
τιστοποίησης, μεταγλώττιση υπό συνθήκες (αρχιτεκτονική, μεταγλωττι-
στής κλπ) και άλλα ... πολλά! Ενθαρρύνουμε τον φοιτητή με ενδιαφέρον
στον προγραμματισμό να επενδύσει λίγο χρόνο για να μάθει περισσό-
τερα¹⁶.


13.4 Θερμική Ισορροπία
Στην ενότητα αυτή θα συζητήσουμε τα τεχνικά προβλήματα που συνα-
ντά μια προσομοίωση μέχρι να φέρουμε το σύστημα σε θερμική ισορρο-
πία. Το πρόβλημα αυτό μπορεί να είναι από αμελητέο μέχρι και απαγο-
ρευτικό για την προσομοίωση κάποιων συστημάτων. Έτσι παρόλο που
δεν είναι ιδιαίτερα σημαντικό πρόβλημα για το δισδιάστατο πρότυπο
Ising, θα το μελετήσουμε λόγω της σπουδαιότητάς του για άλλα προ-
βλήματα.
    Όπως ήδη είδαμε, όταν ξεκινούμε μια προσομοίωση, χρειάζεται να
τοποθετήσουμε το σύστημά σε μια αρχική κατάσταση, έτσι ώστε με τον
αλγόριθμο που έχουμε επιλέξει να ξεκινήσουμε μια διαδικασία Markov
για την παραγωγή του δείγματός μας. Γνωρίζουμε όμως από την ενό-
τητα 12.2, πως όταν το σύστημα είναι σε θερμική ισορροπία σε μια
δεδομένη θερμοκρασία, τότε βρίσκεται κυρίως σε καταστάσεις με ενέρ-
γεια που διαφέρει λίγο από τη μέση τιμή της. Καταστάσεις με ενέργεια
   ¹⁶Την εποχή που γραφόταν το βιβλίο, το make είχε ορισμένα προβλήματα με πο-
λύπλοκα προγράμματα γραμμένα σε Fortran. Μπορείτε να δείτε και το πρόγραμμα
foray στο code.google.com/p/foraytool ή να αναζητήσετε την τρέχουσα “state of the
art”.
13.4. ΘΕΡΜΙΚΗ ΙΣΟΡΡΟΠΙΑ                                                    555

που διαφέρει κατά πολύ από τη μέση τιμή της, τις επισκέπτεται πολύ
σπάνια¹⁷. Έτσι, αν η αρχική κατάσταση που θα επιλέξουμε δεν είναι μια
τυπική κατάσταση, θα πρέπει το σύστημά μας να κάνει έναν τυχαίο ...
περίπατο στον χώρο των καταστάσεων μέχρι να “βρει” την περιοχή των
καταστάσεων εκείνη που αντιστοιχεί στη θερμοκρασία που έχουμε επι-
λέξει. Αυτή είναι η διαδικασία της εύρεσης της κατάστασης θερμικής
ισορροπίας (thermalization).
   Εδώ παρουσιάζονται δύο προβλήματα: Το πρώτο είναι η κατάλληλη
επιλογή της αρχικής κατάστασης και το δεύτερο είναι να εντοπίσουμε
πότε το σύστημά μας έχει βρεθεί σε κατάσταση θερμικής ισορροπίας.
Ως προς το πρώτο, έχουμε ήδη δει πως η αρχική κατάσταση για το
πρότυπο Ising μπορεί να επιλεγεί να είναι (α) παγωμένη, (β) θερμή, (γ)
σε μια άλλη - πιθανώς γειτονική - θερμοκρασία από μια προηγούμενη
προσομοίωση. Είναι φυσικά κατανοητό πως, αν επιλέξουμε την αρχική
κατάσταση να είναι λ.χ. καυτή για να προσομοιώσουμε το σύστημα σε
μια χαμηλή θερμοκρασία, το σύστημα θα αργήσει περισσότερο να βρε-
θεί σε θερμική ισορροπία από ότι αν επιλέγαμε την αρχική κατάσταση
να είναι παγωμένη (ή σε κάποια κοντινή θερμοκρασία). Αυτό φαίνεται
καθαρά στο σχήμα 13.7. Η δυσκολία της διαδικασίας εξαρτάται από
τη φυσική ποσότητα, τη θερμοκρασία και το μέγεθος του συστήματος.
Η ενέργεια βρίσκει πιο γρήγορα τις τιμές που παίρνει στην κατάσταση
θερμικής ισορροπίας, παρά η μαγνήτιση. Μια τοπική ποσότητα (local
quantity, fast mode) μελετάται ευκολότερα από μια που έχει μη τοπι-
κές εξαρτήσεις (non--local quantity, slow mode). Η κατάσταση θερ-
μικής ισορροπίας βρίσκεται ευκολότερα, όταν είμαστε μακρυά από την
κρίσιμη θερμοκρασία. Είναι ευκολότερο να φέρουμε σε θερμική ισορρο-
πία ένα μικρό σύστημα, παρά ένα μεγάλο. Το δεύτερο πρόβλημα είναι
να εντοπίσουμε πότε το σύστημά έχει βρεθεί σε κατάσταση θερμικής
ισορροπίας και φυσικά να αγνοήσουμε όλες τις μετρήσεις που έχουμε
κάνει πιο πριν. Από το σχήμα 13.7 βλέπουμε πως η στιγμή αυτή, ακόμα
και για την ίδια αρχική κατάσταση, μπορεί να έχει τιμή με μεγάλες
διακυμάνσεις. Ο πιο απλός τρόπος είναι να ξεκινήσουμε αρκετές προ-
σομοιώσεις με διαφορετικές αρχικές καταστάσεις ή/και από την ίδια
αρχική κατάσταση, αλλά ακολουθώντας διαφορετική στοχαστική ... πο-
ρεία και να παρακολουθήσουμε την εξέλιξη στον (Μόντε Κάρλο) χρόνο
των προς μέτρηση φυσικών ποσοτήτων. Όταν όλα τα μονοπάτια συνα-
ντηθούν, τότε μάλλον έχουμε πετύχει θερμική ισορροπία και μπορούμε
να ξεκινήσουμε τις μετρήσεις μας.
   Πιο συστηματικά όμως αποκτούμε πεποίθηση ότι όντως έχουμε πε-

  ¹⁷Φυσικά αυτό γίνεται εντονότερο όσο το σύστημά μας έχει μεγαλύτερο μέγεθος.
556                               ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


               1
             0.9
             0.8
             0.7
             0.6
      m




             0.5
             0.4
             0.3
             0.2
             0.1
               0
                   0 100 200 300 400 500 600 700 800 9001000
                                      t (sweeps)
Σχήμα 13.7: Μαγνήτιση ανά πλεγματική θέση για το πρότυπο Ising με L = 40, β =
0.48. Φαίνεται η διαδικασία εύρεσης θερμικής ισορροπίας για μια αρχική κατάσταση
παγωμένη και τρεις αρχικές καταστάσεις καυτές. Επαναλαμβάνοντας τη διαδικασία
αυτή για τη δεύτερη περίπτωση, φαίνεται πως για βρεθεί το σύστημα σε κατάσταση
θερμικής ισορροπίας χρειαζόμαστε περισσότερα από ∼ 1000 sweeps.




τύχει θερμική ισορροπία, όταν τα αποτελέσματά μας έχουν σταθερή
τιμή (μέσα στα όρια του στατιστικού σφάλματος), καθώς αποκόπτουμε
από το δείγμα μας όλο και μεγαλύτερο αριθμό από μετρήσεις. Η διαδι-
κασία φαίνεται στο σχήμα 13.10 όπου για τις μετρήσεις του πάνω σχή-
ματος αποκόπτουμε διαδοχικά 0, 20, 50, 100, 200, 400, 800, 1600, 3200 και
6400 αρχικές μετρήσεις μέχρι η μέση τιμή της μαγνήτισης να πάρει μια
σταθερή τιμή μέσα στα όρια του στατιστικού σφάλματος.


13.5 Αυτοσυσχετισμοί
Για να κατασκευάσουμε ένα δείγμα από στατιστικά ανεξάρτητες με-
τρήσεις από μια διαδικασία Markov θα πρέπει το επόμενο βήμα να μην
έχει στατιστικό συσχετισμό με το προηγούμενο. Είναι, όμως, φανερό
πως με τους αλγόριθμους που χρησιμοποιούμε αυτό δεν είναι δυνατόν.
Στον αλγόριθμο Metropolis το επόμενο βήμα διαφέρει από το προηγού-
μενο το πολύ κατά την τιμή ενός σπιν. Άρα, η επόμενη διάταξη των
13.5. ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΙ                                                          557


              1


            0.8


            0.6
      m




            0.4


            0.2                                              24
                                                             18
                                                             14
                                                             10
              0
                  0       50       100      150       200      250       300
                                         t (sweeps)
Σχήμα 13.8: Μαγνήτιση ανά πλεγματική θέση για το πρότυπο Ising με L = 10, 14, 18, 24
και β = 0.50. Φαίνεται η διαδικασία εύρεσης θερμικής ισορροπίας για μια αρχική
κατάσταση καυτή και ότι η δυσκολία αυξάνει με το μέγεθος του συστήματος.



σπιν είναι στατιστικά πολύ ισχυρά συσχετισμένη με την προηγούμενη.
Θα περίμενε κανείς να πάρει μία στατιστικά ανεξάρτητη διάταξη, όταν
κάνει ένα βήμα Metropolis ανά πλεγματική θέση, αυτό που ονομάζεται
ένα “sweep” του πλέγματος. Ενώ αυτό όντως συμβαίνει στην πράξη για
πολλές περιπτώσεις, λ.χ. στο πρότυπο Ising για θερμοκρασίες αρκετά
διαφορετικές από την κρίσιμη βc , στις περισσότερες ενδιαφέρουσες πε-
ριπτώσεις χρειαζόμαστε πολύ μεγαλύτερο αριθμό από sweeps για να
πάρουμε μια στατιστικά ανεξάρτητη διάταξη. Αυτό γίνεται λ.χ. όταν το
μήκος συσχετισμού ξ (12.46) γίνεται πολύ μεγαλύτερο από μια πλεγ-
ματική θέση, κάτι που συμβαίνει στην κρίσιμη περιοχή μιας συνεχούς
μετάβασης φάσης. Αυτό μπορεί να γίνει κατανοητό από τα σχήματα
13.36. Καθώς πλησιάζουμε την κρίσιμη θερμοκρασία από τη θερμή πε-
ριοχή όπου τα σπιν είναι σε αταξία, δημιουργούνται μεγάλες περιοχές
(clusters) από όμοια σπιν. Καταλαβαίνουμε ότι για να έχουμε δύο ασυ-
σχέτιστες διατάξεις σπιν στην περίπτωση αυτή, πρέπει το μέγεθος, το
σχήμα και η θέση αυτών των clusters να είναι ασυσχέτιστα. Για να γί-
νει κάτι τέτοιο, πρέπει να καταστραφούν τα υπάρχοντα clusters και
να δημιουργηθούν κάπου αλλού. Με ένα single–flip αλγόριθμο όπως ο
Metropolis η διαδικασία αυτή παίρνει αρκετό χρόνο.
558                                   ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


              1
                                                               30
            0.9                                                60
                                                               90
            0.8                                               120
            0.7
            0.6
      m




            0.5
            0.4
            0.3
            0.2
            0.1
              0
                  0          5        10       15        20         25   30
                                           t (sweeps)
Σχήμα 13.9: Μαγνήτιση ανά πλεγματική θέση για το πρότυπο Ising με L =
30, 60, 90, 120 και β = 0.20. Φαίνεται η διαδικασία εύρεσης θερμικής ισορροπίας για
μια αρχική κατάσταση παγωμένη. Εδώ, η δυσκολία δεν αυξάνει με το μέγεθος του
συστήματος.



   Για την ποσοτική μελέτη του αυτοσυσχετισμού των διατάξεων σπιν
που παράγονται στην προσομοίωσή μας, χρησιμοποιούμε τη συνάρτηση
αυτοσυσχετισμού (autocorrelation function). Έστω μια φυσική ποσότητα
O (λ.χ. ενέργεια, μαγνήτιση, μαγνητική επιδεκτικότητα κλπ) και O (t)
η τιμή της μετά από Μόντε Κάρλο “χρόνο” t. Οι μονάδες του t μπορεί
να είναι sweeps ή (υπο)πολλαπλάσια των sweeps. Η συνάρτηση αυτο-
συσχετισμού ρO (t) της φυσικής ποσότητας O ορίζεται για κάθε χρόνο
t να είναι η
                             ⟨(O (t′ ) − ⟨O ⟩)(O (t′ + t) − ⟨O ⟩)⟩t′
                  ρO (t) =                                           ,    (13.34)
                                          ⟨(O − ⟨O ⟩)2 ⟩
όπου ⟨. . .⟩t′ είναι η μέση τιμή πάνω σε όλα τα στοιχεία του δείγματος
με t′ < tmax − t. Η κανονικοποίηση που βάζουμε στον παρονομαστή είναι
τέτοια, ώστε ρO (0) = 1.
   Ο ορισμός θυμίζει τη συνάρτηση συσχετισμού των σπιν στον χώρο
(βλ. εξ. (12.45)). Η συζήτηση για τη σημασία του ορισμού είναι πα-
ράλληλη με αυτή της ενότητας 12.4. Με λίγα λόγια, όταν η τιμή μιας
ποσότητας μετά από χρόνο t είναι ισχυρά συσχετισμένη με την αρχική,
13.5. ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΙ                                                                            559

            1


           0.9


           0.8


           0.7


           0.6
     <m>




           0.5


           0.4


           0.3


           0.2


           0.1


            0
                 0   1000   2000   3000   4000      5000     6000   7000   8000   9000   10000
                                           thermalization sweeps

Σχήμα 13.10: Μαγνήτιση ανά πλεγματική θέση για το πρότυπο Ising με L = 100
και β = 0.48. Φαίνεται η διαδικασία εύρεσης θερμικής ισορροπίας για μια αρχική
κατάσταση καυτή.




τότε το γινόμενο στον αριθμητή της (13.34) θα είναι σχεδόν πάντοτε
θετικό, με αποτέλεσμα η μέση τιμή να είναι θετική. Όταν ο συσχετισμός
είναι ασθενής, τότε το γινόμενο θα είναι πότε θετικό και πότε αρνητικό
στο δείγμα, έτσι ώστε ο μέσος όρος να είναι μικρός. Αν υπάρχει αντι-
συσχετισμός, τότε το κλάσμα είναι αρνητικό. Αρνητικές τιμές για την
ρO (t) οφείλονται στο πεπερασμένο μέγεθος του δείγματος και πρέπει
να απορρίπτονται.
    Ασυμπτωτικά, η συνάρτηση ρO (t) ελαττώνεται με εκθετικό τρόπο

                                      ρO (t) ∼ e−t/τO .                                   (13.35)

Η κλίμακα χρόνου τO χαρακτηρίζει τον αποσυσχετισμό των μετρήσεων
της O και ονομάζεται χρόνος αυτοσυσχετισμού της O . Μετά από χρόνο
2τO , η ρO (t) έχει πέσει στο 1/e2 ≈ 14% της αρχικής της τιμής. Συμβατικά
θεωρούμε ότι τότε έχουμε μία ανεξάρτητη μέτρηση της O ¹⁸. Άρα, αν
έχουμε tmax μετρήσεις, ο αριθμός των ανεξάρτητων μετρήσεων της O

  ¹⁸Οι χρόνοι αυτοσυσχετισμού μπορεί να είναι πολύ διαφορετικοί για διαφορετικές
φυσικές ποσότητες.
560                                  ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

            0.95




             0.9




            0.85
      <m>




             0.8




            0.75




             0.7




            0.65
                   0   1000   2000       3000          4000   5000   6000   7000
                                      thermalization sweeps

Σχήμα 13.11: Μαγνήτιση ανά πλεγματική θέση για το πρότυπο Ising με L = 100
και β = 0.48. Υπολογίζουμε τη μέση τιμή ⟨m⟩ αποκόπτοντας “thermalization sweeps”
μετρήσεις και τις δείχνουμε στο δεύτερο σχήμα μαζί με τα αντίστοιχα σφάλματα.
Παρατηρούμε ότι όταν αποκόψουμε ικανό αριθμό από αρχικές μετρήσεις, σε συμφωνία
με το πάνω σχήμα, το αποτέλεσμα σταθεροποιείται [⟨m⟩ = 0.880(1)] και βρίσκουμε
πως το σύστημα είναι σε θερμική ισορροπία.




θα είναι
                                             tmax
                                     nO =         .                         (13.36)
                                             2τO
Αν μία μέτρηση κοστίζει σε χρόνο, τότε από τα παραπάνω βλέπουμε ότι
θα τη μετράμε σε διαστήματα χρόνου ∼ τO . Αν όμως το κόστος της μέ-
τρησης δεν είναι μεγάλο, τότε μετράμε συχνότερα. Αυτό συμβαίνει γιατί
υπάρχει στατιστική πληροφορία και στις μετρήσεις που είναι ελαφρά
συσχετισμένες. Η ακριβής μέτρηση του τO , ειδικά αν είναι μεγάλο, είναι
δύσκολη, γιατί πρέπει να πάρουμε μετρήσεις για t ≫ τO .
    Ένα παράδειγμα φαίνεται στο σχήμα 13.12 για την περίπτωση της
μαγνήτισης (O = m). Υπολογίζουμε τη συνάρτηση ρm (t) και βλέπουμε
ότι η προσαρμογή στην (13.35) είναι πολύ καλή με τm = 235 ± 3 sweeps.
Η μέτρηση έγινε σε ένα δείγμα από 106 μετρήσεις με 1 μέτρηση/sweep.
Άρα, οι ανεξάρτητες μετρήσεις μας ήταν στην πραγματικότητα ≈ 106 /(2×
235) ≈ 2128.
    Ένας άλλος εκτιμητής του χρόνου αυτοσυσχετισμού είναι ο ολο-
13.5. ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΙ                                                         561


                1

             0.8

             0.6
     ρm(t)




             0.4

             0.2

                0

             -0.2
                    0       500   1000 1500 2000 2500 3000
                                       t (sweeps)
Σχήμα 13.12: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης ρm (t) για το πρότυπο
Ising και L = 100, β = 0.42. Φαίνεται η εκθετική πτώση της και ότι τm ≈ 200 sweeps.
Φαίνονται και τα φαινόμενα πεπερασμένου μεγέθους το δείγματος (1,000,000 μετρή-
σεις) όταν η ρ αρχίζει να έχει διακυμάνσεις γύρω από το 0.



κληρωμένος χρόνος αυτοσυσχετισμού τint,O (integrated autocorrelation
time). Ο ορισμός του προκύπτει από την υπόθεση (13.35) από όπου
παίρνουμε
                   ∫ +∞             ∫ +∞
          τint,O =      dt ρO (t) ∼      dt e−t/τO = τO .    (13.37)
                        0               0

Προφανώς τint,O ∼ τO , αλλά στον υπολογισμό υπεισέρχονται συστημα-
τικά σφάλματα, γι’ αυτό οι δύο ορισμοί μπορεί να δίνουν τιμές που δια-
φέρουν λίγο στην πράξη. Αν το δείγμα μας είναι καλό, τότε θα έχουμε
καλύτερη συμφωνία. Επίσης, επειδή το δείγμα μας δεν είναι άπειρο,
πρέπει να επιλέξουμε ένα tmax όπου θα κόψουμε την ολοκλήρωση¹⁹
                                      ∫ tmax
                     τint,O (tmax ) =        dt ρO (t) ,       (13.38)
                                         0

   ¹⁹Για μικρούς χρόνους tmax δε θα έχουμε ακριβώς τη συμπεριφορά (13.35) και αυτό
θα προσθέσει στο συστηματικό σφάλμα. Αλλά παρόμοια προβλήματα έχουμε και όταν
προσπαθούμε να υπολογίσουμε τον τO με προσαρμογή των δεδομένων: Πρέπει να
γίνει εκτίμηση των ορίων στο διάστημα του χρόνου που θα γίνει η προσαρμογή που
θα αντιστοιχεί στην (13.35), κάτι το οποίο αποτελεί ... τέχνη!
562                                ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


                  1
                                                       e-t/τ
      ρm(t)                                           ρm(t)




               0.1




              0.01
                      0   100 200 300 400 500 600 700 800
                                        t (sweeps)
Σχήμα 13.13: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης ρm (t) για το πρότυπο
Ising και L = 100, β = 0.42. Γίνεται προσαρμογή στην εκθετική πτώση Ce−t/τ (βλ. εξ.
(13.35)) με τ = 235(3) sweeps.



και κάνουμε τη γραφική παράσταση τint,O (tmax ). Όταν παρατηρήσουμε
πως η τιμή του τint,O (tmax ) σταθεροποιείται για κάποιο διάστημα του
tmax , παίρνουμε αυτή την τιμή ως εκτιμητή του τint,O .
     Η διαδικασία αυτή φαίνεται στο σχήμα 13.14, όπου χρησιμοποιήσαμε
τις ίδιες μετρήσεις με αυτές του σχήματος 13.12. Το αποτέλεσμα είναι
τint,m = 217(3)sweeps που είναι μικρότερο από αυτό που υπολογίσαμε
προηγουμένως. Η διαφορά αυτή συχνά δεν είναι σημαντική. Συνήθως,
αυτό που μας ενδιαφέρει είναι η εξάρτηση του χρόνου αυτοσυσχετισμού
από τις παραμέτρους του συστήματος, εδώ το μέγεθος L και τη θερμο-
κρασία β. Και οι δύο εκτιμητές θα μας δώσουν το ίδιο αποτέλεσμα για
την κύρια (ασυμπτωτική) συμπεριφορά για αρκετά μεγάλα L και για
β αρκετά κοντά στην κρίσιμη θερμοκρασία βc . Συνήθως, προτιμάμε να
υπολογίσουμε τον τint,O λόγω της ευκολότερης διαδικασίας.
     Ο χρόνος αυτοσυσχετισμού δεν είναι σοβαρό πρόβλημα, όταν το σύ-
στημα βρίσκεται μακριά από την κρίσιμη περιοχή θερμοκρασιών. Στο
σχήμα 13.15 βλέπουμε πως αυτός είναι μόνο μερικά sweeps και ότι
το γεγονός αυτό είναι ανεξάρτητο από το μέγεθος του συστήματος
L. Όταν όμως πλησιάζουμε την κρίσιμη περιοχή, ο χρόνος αυτοσυσχε-
τισμού μεγαλώνει. Στην κρίσιμη περιοχή η αύξηση αυτή παρουσιάζει
13.5. ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΙ                                                       563


                     250

                     200
     τint, m(tmax)




                     150

                     100

                     50
                                                          τ1
                                                          τ2
                      0
                           0   500 1000 1500 2000 2500 3000 3500
                                       tmax (sweeps)

Σχήμα 13.14: Υπολογισμός του ολοκληρωμένου χρόνου αυτοσυσχετισμού της μαγνή-
τισης (integrated autocorrelation time) για τα δεδομένα του σχήματος 13.19. Παρα-
τηρούμε ένα πλατό στις τιμές του τint,m για τ1 = 214(1)sweeps, αλλά και ένα μέγι-
στο για τ2 ≈ 219.5 sweeps. Η πτώση των τιμών από τ1 σε τ2 οφείλεται σε αρνητι-
κές τιμές της ρm (t) λόγω θορύβου του δείγματος των μετρήσεων. Άρα, θα πάρουμε
τint,m = 217(3)sweeps να είναι το αποτέλεσμά μας.




βάθμιση (scaling). Για τον αλγόριθμο του Metropolis αυτό σημαίνει ότι
για μεγάλα L έχουμε
                                        τ ∼ Lz ,                        (13.39)

όπου για την περίπτωση της μαγνήτισης έχουμε z = 2.1665 ± 0.0012 [59].
Αυτή η τιμή είναι μεγάλη και κάνει τον αλγόριθμο ακριβό. Σημαίνει πως
ο χρόνος για την προσομοίωση του συστήματος για δεδομένο αριθμό
ανεξάρτητων διατάξεων σπιν θα αυξάνει σαν

                                  tCPU ∼ Ld+z ≈ L4.17 .                 (13.40)

Αυτό είναι το φαινόμενο της κρίσιμης επιβράδυνσης. Σε επόμενα κεφά-
λαια θα συζητήσουμε με περισσότερη λεπτομέρεια τη σχέση βάθμισης
(13.39), καθώς και καλύτερους αλγόριθμους που βελτιώνουν δραστικά
τη συμπεριφορά αυτή.
564                                ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


                1
                                                        10
                                                        20
              0.8                                       40
                                                        60
              0.6                                       80
      ρm(t)




              0.4

              0.2

                0

              -0.2
                     0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
                                       t (sweeps)
Σχήμα 13.15: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης για το πρότυπο Ising σε
υψηλή θερμοκρασία β = 0.20 για L = 10, 20, 40, 60, 80. Ο χρόνος αυτοσυσχετισμού σε
sweeps είναι ανεξάρτητος του L.




13.6 Στατιστικά Σφάλματα
Σε μια τυχαία μεταβλητή, όπως είναι μία παρατηρήσιμη ποσότητα σε
μία προσομοίωση Μόντε Κάρλο, η μέση τιμή της, εκτιμώμενη από ένα
δείγμα, δε δίνει καμιά πληροφορία για την αξία της μέτρησης. Η γνώση
της πραγματικής στατιστικής κατανομής δίνει όλη τη σχετική πληροφο-
ρία, αλλά στην πράξη, συνήθως, αρκούμαστε από τη γνώση του “σφάλ-
ματος ” της μέτρησης. Για να ορίσουμε αυτό που θα ονομάζουμε στατι-
στικό σφάλμα στο βιβλίο αυτό, θα κάνουμε την πολύ απλή, αλλά πρα-
κτική, υπόθεση ότι η κατανομή των μετρήσεων είναι Gaussian. Αυτό
γενικά είναι μια πολύ καλή προσέγγιση, όταν έχουμε ανεξάρτητες με-
τρήσεις σε ένα πρότυπο στατιστικής φυσικής. Η αιτία του στατιστικού
σφάλματος είναι οι θερμικές διακυμάνσεις γύρω από τη μέση τιμή που
όπως έχουμε συζητήσει στην ενότητα 12.2 (βλ. και σχέση (12.27)) έχουν
συνήθως κατά πολύ καλή προσέγγιση Gaussian κατανομή. Χαρακτηρι-
στικό των στατιστικών σφαλμάτων είναι ότι εξαλείφονται αυξάνοντας
τον αριθμό των μετρήσεων. Αυτό γίνεται σχετικά σιγά αφού μειώνο-
νται αντιστρόφως ανάλογα με την τετραγωνική ρίζα του μεγέθους το
δείγματος.
13.6. ΣΤΑΤΙΣΤΙΚΑ ΣΦΑΛΜΑΤΑ                                                   565


               1
                                                         5
                                                        10
             0.8                                        20
                                                        40
             0.6
     ρm(t)




             0.4

             0.2

               0

             -0.2
                    0   1    2    3    4    5     6    7     8   9    10
                                      t (sweeps)
Σχήμα 13.16: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης για το πρότυπο Ising
σε χαμηλή θερμοκρασία β = 0.65 για L = 5, 10, 20, 40. Ο χρόνος αυτοσυσχετισμού σε
sweeps είναι ανεξάρτητος του L.




   Μια άλλη κατηγορία σφαλμάτων είναι τα συστηματικά σφάλματα
τα οποία, συνήθως, δεν έχουν ... συστηματικό τρόπο να τα εκτιμήσουμε.
Αυτά, στην περίπτωσή μας, μπορούν να έχουν απλή αιτία (λ.χ. να μην
είναι το σύστημα σε θερμική ισορροπία) ή αρκετά δυσκολότερη να εντο-
πιστεί (λ.χ. μία κακή γεννήτρια ψευδοτυχαίων αριθμών).

   Τέλος, στην περίπτωση που κάποιος χρησιμοποιεί ένα διακριτό και
πεπερασμένο πρότυπο (όπως το Ising) για να προσομοιώσει ένα συ-
νεχές και άπειρο μοντέλο, στους εκτιμητές υπεισέρχονται σφάλματα
λόγω της διακριτοποίησης και του πεπερασμένου μεγέθους του συστή-
ματος. Αυτά τα σφάλματα μειώνονται με την προσομοίωση μεγαλύτε-
ρων συστημάτων και αντιμετωπίζονται συστηματικά με μεθόδους όπως
η βάθμιση πεπερασμένου μεγέθους (finite size scaling). Χρησιμοποιώ-
ντας βάθμιση πεπερασμένου μεγέθους, μπορούμε από τις μετρήσεις που
παίρνουμε για πεπερασμένο μέγεθος συστήματος να εκτιμήσουμε την
τιμή της μετρήσιμης ποσότητας για το απείρως μεγάλο σύστημα. Αυτό
θα είναι αντικείμενο της μελέτης μας σε επόμενο κεφάλαιο.
566                                 ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


                1
                                                       0.38
                                                       0.40
              0.8                                      0.41
                                                       0.42
                                                       0.43
              0.6                                    0.4407
      ρm(t)




              0.4

              0.2

                0

              -0.2
                     0   200 400 600 800 1000 1200 1400 1600 1800 2000
                                        t (sweeps)
Σχήμα 13.17: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης για το πρότυπο Ising
για L = 40. Φαίνεται πώς αυξάνει ο χρόνος αυτοσυσχετισμού όταν πλησιάζουμε την
κρίσιμη θερμοκρασία από τη θερμή φάση (φάση αταξίας).



13.6.1 Σφάλματα Ανεξάρτητων Μετρήσεων
Από την υπόθεση ότι η πηγή των σφαλμάτων στις μετρήσεις μας είναι
οι θερμικές διακυμάνσεις προκύπτει ότι η πραγματική τιμή μπορεί να
εκτιμηθεί από τη μέση τιμή του δείγματος και ότι το σφάλμα θα είναι το
σφάλμα της μέσης τιμής. Έτσι, αν έχουμε ένα δείγμα από n μετρήσεις
O 0 , O 1 , . . . , O n−1 , η μέση τιμή τους είναι ένας εκτιμητής της ⟨O ⟩ και
παίρνουμε
                                           1∑
                                             n−1
                                    ⟨O ⟩ =       Oi.                   (13.41)
                                           n i=0
Ενώ το σφάλμα της μέσης τιμής του δείγματος θα είναι εκτιμητής του
σφάλματος δO , οπότε έχουμε
                      { n−1               }
                   1   1 ∑                    1 ( 2          )
   (δO )2 ≡ σO
             2
               =             (O i − ⟨O ⟩)2 =     ⟨O ⟩ − ⟨O ⟩2 .
                 n − 1 n i=0                 n−1
                                                           (13.42)
Οι παραπάνω σχέσεις υποθέτουν πως το δείγμα μας αποτελείται από
ανεξάρτητες μετρήσεις. Αυτό όπως είδαμε δε συμβαίνει σε μια προ-
13.6. ΣΤΑΤΙΣΤΙΚΑ ΣΦΑΛΜΑΤΑ                                                 567


               1
                                                    0.4407
             0.9                                      0.45
             0.8                                      0.46
                                                      0.47
             0.7                                      0.50
             0.6
             0.5
     ρm(t)




             0.4
             0.3
             0.2
             0.1
               0
             -0.1
                    0   200 400 600 800 1000 1200 1400 1600 1800 2000
                                       t (sweeps)
Σχήμα 13.18: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης για το πρότυπο Ising
για L = 40. Φαίνεται πώς αυξάνει ο χρόνος αυτοσυσχετισμού όταν πλησιάζουμε την
κρίσιμη θερμοκρασία από την ψυχρή φάση (φάση τάξης).



σομοίωση Μόντε Κάρλο λόγω του αυτοσυσχετισμού των μετρήσεων.
Είδαμε πως, αν ο χρόνος αυτοσυσχετισμού, μετρημένος σε μονάδες
“αριθμός μετρήσεων”, είναι τO , σύμφωνα με την 13.36 θα έχουμε nO =
n/(2τO ) ανεξάρτητες μετρήσεις. Στην περίπτωση αυτή, μπορεί να δει-
χθεί ότι το πραγματικό στατιστικό σφάλμα στη μέτρηση της O είναι [60]
(δείτε επίσης Κεφ. 4.1 του [5])
                            1 + 2τO ( 2            )
                   (δO )2 =           ⟨O ⟩ − ⟨O ⟩2 .          (13.43)
                             n−1
Αν τO ≪ 1, τότε παίρνουμε την (13.42). Αν τO ≫ 1, τότε παίρνουμε
                               2τO ( 2            )
                  (δO )2 ≈           ⟨O ⟩ − ⟨O ⟩2             (13.44)
                              n−1
                                 1     ( 2           )
                          ≈             ⟨O ⟩ − ⟨O ⟩2          (13.45)
                              (n/2τO )
                                 1    ( 2           )
                          ≈            ⟨O ⟩ − ⟨O ⟩2           (13.46)
                              nO − 1
που δεν είναι παρά η (13.42) για nO ανεξάρτητες μετρήσεις (υποθέ-
σαμε ότι 1 ≪ nO ≪ n). Η παραπάνω σχέση δικαιολογεί το γεγονός ότι
θεωρήσαμε τις μετρήσεις πρακτικά ανεξάρτητες μετά από χρόνο ∼ 2τO .
568                                 ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


                1
                                                         5
                                                        10
              0.8                                       20
                                                        40
                                                        60
              0.6                                       80
      ρm(t)




              0.4

              0.2

                0

              -0.2
                     0   200 400 600 800 1000 1200 1400 1600 1800 2000
                                        t (sweeps)
Σχήμα 13.19: Η συνάρτηση αυτοσυσχετισμού της μαγνήτισης για το πρότυπο Ising
για β = 0.4407 ≈ βc για διαφορετικά L. Παρατηρούμε τη μεγάλη αύξηση του χρόνου
αυτοσυσχετισμού με το μέγεθος του συστήματος στην κρίσιμη περιοχή.




    Οι παραπάνω σχέσεις μας δίνουν την ελευθερία να επιλέξουμε όπως
μας βολεύει το πόσο συχνά θα παίρνουμε μετρήσεις πάνω στο σύστημα.
Αλλά έχουν μερικές δυσκολίες στην εφαρμογή τους. Η πρώτη είναι
πως πρέπει να κάνουμε τη μέτρηση του χρόνου αυτοσυσχετισμού με
τις γνωστές δυσκολίες που περιγράψαμε στην ενότητα 13.5. Η δεύτερη
είναι ότι δεν ξέρουμε τα αποτελέσματα που θα έχει στον υπολογισμό
του σφάλματος η πραγματική κατανομή των μετρήσεων, ιδιαίτερα αν
η ποσότητα που μετράμε δεν είναι μια απλή τοπική ποσότητα όπως
λ.χ. η ενέργεια. Ας πάρουμε για παράδειγμα τη μαγνητική επιδεκτι-
κότητα (13.33). Αυτό προϋποθέτει τη μέτρηση των ⟨m⟩ και ⟨m2 ⟩ [ή
ακόμα καλύτερα την ποσότητα (mi − ⟨m⟩) πάνω σε κάθε διάταξη i]
και δεν μπορεί να οριστεί πάνω σε μία μόνο διάταξη των σπιν. Αν υπο-
λογίσουμε τις παραπάνω ποσότητες, αφού συγκεντρώσουμε το δείγμα
μπαίνει το ερώτημα πώς θα υπολογιστεί το σφάλμα δχ. Αυτό δεν είναι
απλή συνάρτηση των δ⟨m⟩ και δ⟨m2 ⟩ λόγω του συσχετισμού των δύο
ποσοτήτων και δεν ισχύει ο γνωστός τύπος διάδοσης των σφαλμάτων
(δ(⟨m2 ⟩ − ⟨m⟩2 ))2 = (δ⟨m2 ⟩)2 + (δ⟨m⟩2 )2 .
13.6. ΣΤΑΤΙΣΤΙΚΑ ΣΦΑΛΜΑΤΑ                                                         569



               1000



                100
      τint,m




                  10



                   1
                                    10                                    100
                                                L
Σχήμα 13.20: Ο ολοκληρωμένος χρόνος αυτοσυσχετισμού τint,m για β = βc σε διά-
γραμμα λογαριθμικής κλίμακας. Η συνεχής καμπύλη είναι προσαρμογή στη συνάρ-
τηση 0.136(10)L2.067(21) . H αναμενόμενη τιμή του εκθέτη είναι 2.1665(12) και η διαφορά
οφείλεται στα σχετικά μικρά μεγέθη του συστήματος.




13.6.2         Jackknife
Η πιο απλή λύση που βρίσκει κανείς στα προβλήματα που αναφέραμε
στην προηγούμενη υποενότητα είναι να χωρίσει κανείς το δείγμα του σε
blocks ή bins. Το όνομα προέρχεται από την εικόνα ότι τις n μετρήσεις
μας τις βάζουμε σε nb “καλάθια” και κάθε καλάθι το χρησιμοποιούμε
ως μία ανεξάρτητη μέτρηση. Αυτό θα είναι σωστό, αν ο αριθμός των
μετρήσεων σε κάθε καλάθι είναι b = (n/nb ) ≫ τO . Αν O bi i = 0, . . . , nb − 1
είναι οι μέσες τιμές της O στο καλάθι i, τότε το σφάλμα θα δίνεται από
την (13.42)
                                 { n −1                   }
                              1   1  ∑b

                  (δO )2 =               (O bi − ⟨O b ⟩)2             (13.47)
                           nb − 1 nb i=0

Αυτή είναι η μέθοδος binning ή blocking και είναι απλή στη χρήση της.
Παρατηρήστε ότι ποσότητες όπως η μαγνητική επιδεκτικότητα υπολο-
γίζονται σε κάθε καλάθι σαν να ήταν ένα ανεξάρτητο δείγμα και το
σφάλμα είναι τότε εύκολο να υπολογιστεί από την (13.47). Όπως εί-
παμε, για να είναι δυνατή η μέθοδος αυτή θα πρέπει κάθε καλάθι
570                                       ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

να είναι στατιστικά ανεξάρτητο από το άλλο. Αν δεν είναι, τότε το
σφάλμα θα είναι υποεκτιμημένο κατά τον παράγοντα 2τO /(nb − 1) της
σχέσης (13.43). Τα καλάθια είναι στην πράξη στατιστικά ανεξάρτητα
όταν b ∼ 2τO . Αν δεν γνωρίζουμε τον τO , υπολογίζουμε επανειλημμένα
το σφάλμα (13.47) μειώνοντας διαδοχικά τον αριθμό των καλαθιών nb .
Όταν το σφάλμα παύει να αυξάνεται και πάρει σταθερή τιμή, τότε θε-
ωρούμε πως η μέθοδος συγκλίνει στη σωστή τιμή.
   Η μέθοδος όμως που θα επιλέξουμε στις προσομοιώσεις μας είναι η
μέθοδος του ... σουγιά (jackknife method). Είναι πιο σταθερή και δίνει
πιο αξιόπιστα αποτελέσματα. Η βασική ιδέα είναι ίδια με τη μέθοδο
binning με τη μόνη διαφορά ότι τα “καλάθια” φτιάχνονται με διαφορε-
τικό τρόπο και η σχέση (13.47) ελαφρά τροποποιείται. Χωρίζουμε τα δε-
δομένα μας σε nb bins τα οποία περιέχουν από b = n−(n/nb ) στοιχεία ως
εξής: Το bin j προκύπτει από τα αρχικά δεδομένα O 0 , . . . , O n−1 , αν δια-
γράψουμε τα περιεχόμενα του j-καλαθιού της μεθόδου binning. Η δια-
δικασία φαίνεται σχηματικά στο σχήμα 13.21. Σε κάθε bin υπολογίζουμε

                                                                                 Data


                                                                                 Bin 1
                                                                                 Bin 2
                                                                                 Bin 3
                                                                                 Bin 4
                                                                                 Bin 5
Σχήμα 13.21: Η μέθοδος jackknife για ένα δείγμα από n = 20 μετρήσεις. Χωρίζουμε
τα δεδομένα σε nb = 5 bins το οποίο το καθένα έχει b = n − (n/nb ) = 20 − 4 = 16
μετρήσεις (οι γεμάτοι δίσκοι).
                        √      Σε κάθε δείγμα υπολογίζουμε τη μέση τιμή O bi και από
αυτές το σφάλμα δO = nb (⟨(O b )2 ⟩ − ⟨O b ⟩2 ).



τη μέση τιμή της O . Προκύπτουν τότε οι μέσες τιμές O b0 , O b1 , . . . , O bnb −1 .
Τότε το σφάλμα στην μέτρηση της O είναι
                   b −1
                  n∑
                          (                   )2       (                    )
              2
        (δO ) =               O bj − ⟨O b ⟩        = nb ⟨(O b )2 ⟩ − ⟨O b ⟩2 .     (13.48)
                   j=0

Όπως και στη μέθοδο binning, ο αριθμός των bins καθορίζεται μετα-
βάλλοντάς τον και προσδιορίζοντας εκείνες τις τιμές για τις οποίες η
τιμή του σφάλματος σταθεροποιείται.
   Για περισσότερες λεπτομέρειες και αποδείξεις των ισχυρισμών στην
υποενότητα αυτή, παραπέμπουμε τον αναγνώστη στο βιβλίο του Berg
13.6. ΣΤΑΤΙΣΤΙΚΑ ΣΦΑΛΜΑΤΑ                                                        571

[5]. Στο παράρτημα 13.8.1 δίνουμε πρόγραμμα για τη χρήση της μεθό-
δου και σχετικά παραδείγματα.
    Η μέθοδος jackknife είναι η μέθοδος υπολογισμού των σφαλμάτων
που προτιμάται από την πλειοψηφία της επιστημονικής κοινότητας και
αυτή θα ακολουθήσουμε στο βιβλίο αυτό.

13.6.3     Bootstrap
Μια άλλη μέθοδος, χρήσιμη στην εκτίμηση των σφαλμάτων, είναι η μέ-
θοδος bootstrap. Έστω ότι έχουμε n ανεξάρτητες μετρήσεις. Από αυτές
δημιουργούμε nS τυχαία δείγματα: Με ομοιόμορφη πιθανότητα διαλέ-
γουμε μία μέτρηση από τις n μετρήσεις. Αυτό το κάνουμε n φορές από
το ίδιο σύνολο των n μετρήσεων - δηλ. χωρίς να αφαιρούμε τη μέτρηση
που διαλέξαμε από αυτές που θα διαλέξουμε την επόμενη φορά και
έτσι φτιάχνουμε ένα δείγμα. Αυτό σημαίνει ότι το δείγμα θα περιέ-
χει ∼ 1 − 1/e ≈ 63% ίδιες μετρήσεις. Σε κάθε δείγμα i = 0, . . . , nS − 1
υπολογίζουμε την ποσότητα O Si και από αυτές τη μέση τιμή
                                         nS −1
                                       1 ∑
                               ⟨O ⟩ =
                                  S
                                               OS,                            (13.49)
                                      nS i=0 i
και την
                                            nS −1
                           (     )
                                S 2       1 ∑     ( S )2
                          ⟨ O         ⟩=           Oi .                       (13.50)
                                         nS i=0
Η εκτίμηση για το σφάλμα στη μέτρηση του ⟨O ⟩ είναι τότε²⁰
                               ( )2
                     (δO )2 = ⟨ O S ⟩ − ⟨O S ⟩2 .                             (13.51)
Πρέπει να τονίσουμε ότι ο παραπάνω τύπος δίνει το σφάλμα για ανε-
ξάρτητες μετρήσεις. Αν έχουμε μη αμελητέους χρόνους αυτοσυσχετι-
σμού, πρέπει να χρησιμοποιήσουμε τη διόρθωση που δίνει η σχέση
                                  (( )               )
                                       S 2
                (δO ) = (1 + 2τO ) ⟨ O
                     2
                                           ⟩ − ⟨O ⟩
                                                 S 2
                                                            (13.52)

Στο παράρτημα 13.8.2 δείχνουμε πώς να χρησιμοποιήσουμε τη μέθοδο
bootstrap για να υπολογίσουμε το πραγματικό σφάλμα δO , χωρίς a
priori γνώση του τO .
   Για περισσότερες λεπτομέρειες παραπέμπουμε τον αναγνώστη στα
άρθρα του Bradley Efron [61]. Στο παράρτημα 13.8.2 δίνουμε πρό-
γραμμα για τη χρήση της μεθόδου και σχετικά παραδείγματα.
  ²⁰Παρατηρήστε ότι το δεξί μέλος της (13.51) δεν διαιρείται με 1/(ns − 1).
572                                      ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

13.7 Παράρτημα: Συνάρτηση Αυτοσυσχετισμού
Στο παράρτημα αυτό θα δείξουμε τις τεχνικές λεπτομέρειες του υπο-
λογισμού της συνάρτησης αυτοσυσχετισμού (13.34) και του χρόνου αυ-
τοσυσχετισμού (13.35) και (13.37). Τα προγράμματα σε αυτό και το
επόμενο παράρτημα θα τα βρείτε στον κατάλογο Tools στο συνοδευ-
τικό λογισμικό.
   Σε ένα δείγμα από n μετρήσεις O (0), O (1), . . . , O (n − 1) θα χρησι-
μοποιήσουμε ως εκτιμητή της σχέσης (13.34) την

                 1 1 ∑
                         n−1−t
        ρO (t) =                (O (t′ ) − ⟨O ⟩0 )(O (t′ + t) − ⟨O ⟩t )              (13.53)
                 ρ0 n − t t′ =0

όπου οι μέσες τιμές ορίζονται από τις σχέσεις²¹

                1 ∑                                  1 ∑
                   n−1−t                                n−1−t
      ⟨O ⟩0 ≡             O (t′ )          ⟨O ⟩t ≡             O (t′ + t) .          (13.54)
              n − t t′ =0                          n − t t′ =0

Η σταθερά ρ0 επιλέγεται έτσι, ώστε ρO (0) = 1.
   Το πρόγραμμα για τον υπολογισμό της συνάρτησης (13.34) και του
χρόνου (13.37) είναι απλό να γραφτεί. Παραθέτουμε το αρχείο autoc.f90
από το συνοδευτικό λογισμικό. Διαβάστε τα ένθετα σχόλια για επεξη-
γήσεις των σημαντικών βημάτων.

! ======================================================
! f i l e : a u t o c . f90
MODULE rho_function
  i m p l i c i t none
  SAVE
  integer                                   : : NMAX , tmax
  c h a r a c t e r (200)                   : : prog
  CONTAINS
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! rho i s t h e unnormalized a u t o c o r r e l a t i o n f u n c t i o n a t t :
    r e a l ( 8 ) f u n c t i o n rho ( x , ndat , t )
      i m p l i c i t none
      integer                               : : ndat , t
      r e a l ( 8 ) , dimension ( 0 : ) : : x
                                                        ∑n
  ²¹Θα μπορούσαμε να πάρουμε ⟨O ⟩0 = ⟨O ⟩t = (1/n) t′ =0 O (t′ ), χωρίς να έχουμε
μεγάλη διαφορά στα αποτελέσματα, όταν έχουμε t ≪ n. Με τον ορισμό που χρησιμο-
ποιούμε έχουμε ελαφρά μικρότερα φαινόμενα πεπερασμένου μεγέθους∑n−1−t του δείγματος.
Επίσης, η επιλογή μας (13.53) αντί για την ρO (t) ∝ (1/(n − t)) t′ =0 O (t′ )O (t′ + t) −
⟨O ⟩0 ⟨O ⟩t μειώνει τα σφάλματα στρογγυλοποίησης.
13.7. ΠΑΡΑΡΤΗΜΑ: ΣΥΝΑΡΤΗΣΗ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                                              573

      integer                                 : : n , t0
      real (8)                                : : xav0 , xavt , r
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
      n=ndat−t
      i f ( n <1) c a l l locerr ( ’ rho : n<1 ’ )
! C a l c u l a t e t h e two a v e r a g e s : xav0=<x>_0 , x a v t=<x> _ t
      xav0 = SUM( x ( 0 : n−1 ) ) / n
      xavt = SUM( x ( t : n−1+t ) ) / n
      rho = SUM( ( x ( 0 : n−1)−xav0 ) * ( x ( t : n−1+t )−xavt ) ) / n
    end f u n c t i o n rho
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    s u b r o u t i n e locerr ( errmes )
      i m p l i c i t none
      c h a r a c t e r ( * ) : : errmes
      w r i t e ( 0 , ’ (A, A) ’ ) ,TRIM( prog ) , ’ : ’ ,TRIM( errmes ) , ’ E x i t i n g . . . . ’
      stop 1
    end s u b r o u t i n e locerr
END MODULE rho_function
! ======================================================
program autocorrelations
  USE rho_function
  i m p l i c i t none
  r e a l ( 8 ) , a l l o c a t a b l e , dimension ( : ) : : r , tau , x
  real (8)                                                : : norm
  integer                                                 : : i , ndat , t , tcut , chk
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! D e f a u l t v a l u e s f o r max number o f data and max time f o r
! rho and tau :
  NMAX =2000000; tmax=1000 !NMAX=2e6 r e q u i r e s ~ 2e6 *8=16MB
  c a l l get_the_options
  ALLOCATE( x ( 0 : NMAX −1) ,STAT=chk )
  i f ( chk > 0) c a l l locerr ( ’ Not enough memory f o r x ’ )
  ndat=0
  do while ( ndat < NMAX )
    read ( * , * ,END=101) x ( ndat )
    ndat = ndat+1
  enddo !
101 c o n t i n u e
  i f ( ndat >= NMAX ) w r i t e ( 0 , ’ (3A, I14 , A, I14 ) ’ ) &
            ’ # ’ ,TRIM( prog ) ,                                             &
            ’ : Warning : read ndat= ’ , ndat ,                               &
            ’ and reached t h e l i m i t : ’ , NMAX
!We d e c r e a s e tmax i f i t i s comparable or l a r g e o f ndat
  i f ( tmax > ( ndat / 1 0 ) ) tmax = ndat / 1 0
! r ( t ) s t o r e s t h e v a l u e s o f t h e a u t o c o r r e l a t i o n f u n c t i o n rho ( t )
  ALLOCATE( r ( 0 : tmax −1) )
  do t =0 , tmax−1
    r ( t ) = rho ( x , ndat , t )
  enddo
574                                             ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

  norm = 1 . 0 D0 / r ( 0 ) ; r = norm * r
! tau ( t ) s t o r e s i n t e g r a t e d a u t o c o r r e l a t i o n t i m e s with t c h t = t
  ALLOCATE( tau ( 0 : tmax −1) )
  do tcut =0 , tmax−1
    tau ( tcut ) =0.0 D0
    do t =0 , tcut
     tau ( tcut ) = tau ( tcut )+r ( t )
    enddo
  enddo
! Output :
  p r i n t ’ (A) ’ , ’ # =========================================== ’
  p r i n t ’ (A) ’ , ’ # Autoc f u n c t i o n rho and i n t a u t o c time tau ’
  p r i n t ’ (A, I12 , A, I8 ) ’ , ’ # ndat= ’ , ndat , ’ tmax= ’ , tmax
  p r i n t ’ (A) ’ , ’ # t                    rho ( t )                          tau ( t c u t = t ) ’
  p r i n t ’ (A) ’ , ’ # =========================================== ’
  do t =0 , tmax−1
    p r i n t ’ ( I8 , 2 G28 . 1 7 ) ’ , t , r ( t ) , tau ( t )
  enddo
end program autocorrelations
! ======================================================
s u b r o u t i n e get_the_options
  use rho_function
  use getopt_m               ! from g e t o p t . f90
  i m p l i c i t none
  c a l l getarg ( 0 , prog )

 do
  s e l e c t c a s e ( getopt ( ”−ht : n : ” ) )
  case ( ’ t ’ )
    read ( optarg , * ) tmax
  c a s e ( ’n ’ )
    read ( optarg , * ) NMAX
  c a s e ( ’h ’ )
    c a l l usage
  case ( ’ ? ’ )
    p r i n t * , ’unknown o p t i o n      ’ , optopt
    stop
  c a s e ( char ( 0 ) ) ! done with o p t i o n s
    exit
  c a s e ( ’− ’ )        ! use −− t o e x i t from o p t i o n s
    exit
  case default
    p r i n t * , ’ unhandled o p t i o n ’ , optopt
  end s e l e c t
 enddo

end s u b r o u t i n e get_the_options
! ======================================================
s u b r o u t i n e usage
13.7. ΠΑΡΑΡΤΗΜΑ: ΣΥΝΑΡΤΗΣΗ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                                       575

  use rho_function
  i m p l i c i t none
  p r i n t ’ (3A) ’ , ’ Usage : ’ ,TRIM( prog ) , ’ [− t <maxt >] [−n <ndat >] ’
  p r i n t ’ ( A) ’ , ’         Reads data from s t d i n ( one column ) and ’
  p r i n t ’ ( A) ’ , ’          computes a u t o c o r r e l a t i o n f u n c t i o n and ’
  p r i n t ’ ( A) ’ , ’           i n t e g r a t e d a u t o c o r r e l a t i o n time . ’
  stop
end s u b r o u t i n e usage
! ======================================================

Να σημειώσουμε ότι τον υπολογισμό της συνάρτησης αυτοσυσχετισμού
την “πακετάραμε” σε ένα module rho_function και μπορείτε να τη
χρησιμοποιήσετε σε οποιοδήποτε πρόγραμμα το οποίο ξεκινάει με την
εντολή use rho_function. Αυτό γίνεται στο module μετά τη λέξη–κλειδί
CONTAINS. Μετά, μπορούμε να προσθέσουμε κώδικα για υπορουτίνες
και συναρτήσεις στις οποίες έχει πρόσβαση²² οποιοδήποτε πρόγραμμα
χρησιμοποιεί το module. Φυσικά, όπως και σε άλλα προγράμματα, χρη-
σιμοποιούμε το module για να ορίσουμε τις μεταβλητές NMAX, tmax και
prog, έτσι ώστε να είναι προσβάσιμες από όλα τα μέρη του προγράμ-
ματος που χρησιμοποιούν το module.
   Για τον μεταγλωττισμό του προγράμματος χρησιμοποιούμε την εντολή



> g f o r t r a n −O2 getopt . f90 autoc . f90 −o autoc

Αν έχουμε τα δεδομένα μας σε μία στήλη στο αρχείο data υπολογίζουμε
τη συνάρτηση αυτοσυσχετισμού και τον ολοκληρωμένο χρόνο αυτοσυ-
σχετισμού με την εντολή

> cat data |        . / autoc > data . rho

όπου τα αποτελέσματα στο αρχείο data.rho είναι σε τρεις στήλες. Η
πρώτη είναι ο χρόνος t, η δεύτερη η ρO (t) και η τρίτη η τint,O (t) [σχέση
(13.38)]. Τα αντίστοιχα σχήματα φτιάχνονται με τις εντολές gnuplot:

gnuplot > p l o t ” data . rho ” using 1 : 2 with lines
gnuplot > p l o t ” data . rho ” using 1 : 3 with lines

Αν θέλουμε να αλλάξουμε τον μέγιστο αριθμό δεδομένων NMAX (λ.χ. αν
έχουμε περισσότερα δεδομένα ή αν θέλουμε να μειώσουμε τη μνήμη
  ²²Στην πραγματικότητα είναι γνωστό το explicit interface της συνάρτησης ή
υπορουτίνας σε όλα τα μέρη του προγράμματος που χρησιμοποιούν το module.
576                                       ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

που δεσμεύει το πρόγραμμα) ή το μέγιστο χρόνο tmax στη συνάρτηση
αυτοσυσχετισμού, χρησιμοποιούμε τα options -n και -t αντίστοιχα:

> cat data | autoc −n 20000000 −t 20000 > data . rho

Για την απευθείας εισαγωγή των δεδομένων δοκιμάστε την εντολή:

gnuplot > p l o t ” < . / i s −L 20 −b 0.4407 −s 1 −S 345 −n 400000|\
                   grep −v ’ # ’ | awk ’{ p r i n t ( $2 >0) ? $2:−$2 ; } ’ | \
                    a u t o c −t 500” using 1 : 2 with lines

Η παραπάνω gnuplot εντολή είναι σπασμένη σε 3 γραμμές για να φαί-
νεται στη σελίδα. Για να τη χρησιμοποιήσετε, ενώστε τις γραμμές και
αφαιρέστε τις \.
   Στη συνέχεια, παραθέτουμε το script autoc_L το οποίο κάνει τους
απαραίτητους υπολογισμούς για το σχήμα 13.19.

# ! / bin / t c s h −f

s e t nmeas = 2100000
s e t Ls          = (5 10 20 40 60 80)
s e t beta        = 0.4407
s e t tmax        = 2000
f o r e a c h L ( $Ls )
  set N           = ‘awk −v L=$L ’BEGIN{ p r i n t L * L } ’ ‘
  s e t rand = ‘ p e r l −e ’ srand ( ) ; p r i n t int (3000000* rand ( ) ) + 1 ; ’ ‘
  s e t out       = outL$ {L}b$ { beta }
  echo ” Running L${L}b${ b e t a } ”
  . / is −L $L −b $beta −s 1 −S $rand −n $nmeas > $out
  echo ” A u t o c o r r e l a t i o n s L${L}b${ b e t a } ”
  grep −v ’ # ’ $out | \
    awk −v N=$N ’ NR >100000{ p r i n t ( $2 >0) ? ( $2 / N ) :( − $2 / N ) } ’ | \
    autoc −t $tmax > $out . rhom
end

Στη συνέχεια, κατασκευάζουμε το σχήμα με το gnuplot:

gnuplot >       plot       ” outL5b0 . 4 4 0 7 . rhom”   u   1:2   w   lines   t   ”5”
gnuplot >     replot     ” outL10b0 . 4 4 0 7 . rhom”    u   1:2   w   lines   t   ” 10 ”
gnuplot >     replot     ” outL20b0 . 4 4 0 7 . rhom”    u   1:2   w   lines   t   ”20”
gnuplot >     replot     ” outL40b0 . 4 4 0 7 . rhom”    u   1:2   w   lines   t   ”40”
gnuplot >     replot     ” outL60b0 . 4 4 0 7 . rhom”    u   1:2   w   lines   t   ”60”
gnuplot >     replot     ” outL80b0 . 4 4 0 7 . rhom”    u   1:2   w   lines   t   ”80”

Με παρόμοιο τρόπο φτιάχνουμε και τα σχήματα 13.17.
13.7. ΠΑΡΑΡΤΗΜΑ: ΣΥΝΑΡΤΗΣΗ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                                    577

    Για τον υπολογισμό του τm εργαζόμαστε ως εξής:

gnuplot >    f ( x ) = c * exp(−x / t )
gnuplot >    set l o g y
gnuplot >    plot [ : 1 0 0 0 ] ” outL40b0 . 4 4 0 7 . rhom” u 1 : 2      w lines
gnuplot >    c = 1 ; t = 300
gnuplot >    fit [ 1 5 0 : 6 5 0 ] f ( x ) ” outL40b0 . 4 4 0 7 . rhom”   u 1 : 2 via c , t
gnuplot >    plot [ : 1 0 0 0 ] ” outL40b0 . 4 4 0 7 . rhom” u 1 : 2      w lines , f ( x )
gnuplot >    plot [ : ]           ” outL40b0 . 4 4 0 7 . rhom” u 1 : 3    w lines

όπου με την τελευταία γραμμή συγκρίνουμε με την τιμή του τint,m . Η
εντολή fit είναι ενδεικτική. Πρέπει να δοκιμαστούν διάφορες τιμές για
τα όρια τα οποία εδώ επιλέχτηκαν να είναι τα [150:650]. Αφού με
την πρώτη εντολή plot δούμε πότε η συνάρτηση έχει την αναμενόμενη
ασυμπτωτική συμπεριφορά (τη συνάρτηση f(x) = c exp(-x/t)), μετα-
βάλουμε τα άνω και κάτω όρια, έτσι ώστε η τιμή για τον τm να στα-
θεροποιηθεί ενώ το ²³ χ2 /dof της προσαρμογής να είναι ελάχιστο²⁴. Το
χ2 /dof της προσαρμογής το διαβάζουμε από το αποτέλεσμα της εντολής
fit

.....
degrees of freedom ( FIT_NDF )                            : 449
rms of residuals   ( FIT_STDFIT )= s q r t ( WSSR / ndf ) : 0.000939
variance of residuals ( reduced chisquare )=WSSR / ndf : 8.82 e−07

Final s e t of parameters                          Asymptotic Standard Error
=======================                            ==========================

c                      = 0.925371                  +/− 0.0003773              (0.04078%)
t                      = 285.736                   +/− 0 . 1 1 4 1            (0.03995%)
.....

από τη γραμμή “variance of residuals”. Από τις επόμενες γραμμές
διαβάζουμε τις τιμές των παραμέτρων με τα σφάλματά τους²⁵ και συ-
μπεραίνουμε ότι τm = 285.7 ± 0.1.
   ²³Αν έχουμε τα δεδομένα {(xi , yi )}, i = 1, . . . , n με σφάλμα
                                                                  ∑δy i τα οποία θέλουμε να
προσαρμόσουμε στην f (x; c, t) = c e−x/t , τότε το χ2 (c, t) = i=1 (yi − f (xi ; c, t))2 /δyi2 .
                                                                    n

Το χ2 /dof είναι κανονικοποιημένο στον αριθμό των βαθμών ελευθερίας (dof = degrees
of freedom= n − 2) που είναι ο αριθμός των σημείων στην προσαρμογή n μείον τον
αριθμό των ελεύθερων παραμέτρων της προσαρμογής (εδώ οι c, t είναι 2).
   ²⁴Αποδεκτά χ2 /dof ∼ 1, αλλά επειδή εδώ δεν παρέχουμε τα σφάλματα στην τιμή
της συνάρτησης αυτοσυσχετισμού, το χ2 /dof δεν είναι σωστά κανονικοποιημένο. Το
πρόγραμμα θέτει δyi = 1 ∀i.
   ²⁵Στις παρενθέσεις είναι το επίπεδο εμπιστοσύνης (confidence level). Αυτό ορίζεται
να είναι η πιθανότητα οι τιμές των παραμέτρων να είναι μέσα στο διάστημα που ορίζει
578                                  ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

   Πρέπει να τονιστεί ότι το σφάλμα αυτό είναι το στατιστικό σφάλμα
της προσαρμογής για τα δεδομένα όρια που επιλέξαμε και όχι το πραγ-
ματικό σφάλμα. Συνήθως, όπως και εδώ, τα μεγαλύτερα σφάλματα
στην προσαρμογή των δεδομένων σε μία συνάρτηση είναι συστηματικά
που οφείλονται (εδώ) κυρίως στην επιλογή των ορίων²⁶. Δοκιμάζοντας
διάφορες τιμές μέχρι να διπλασιαστεί η τιμή του χ2 /dof, βρίσκουμε
τm = 285(2).
   Στη συγκεκριμένη περίπτωση, το μεγαλύτερο συστηματικό σφάλμα
προέρχεται από την παράλειψη της επίδρασης και άλλων χρόνων αυ-
τοσυσχετισμού του συστήματος. Λάβαμε υπόψη μόνο την κύρια συνει-
σφορά από τον μεγαλύτερο χρόνο αυτοσυσχετισμού προσαρμόζοντας
τα δεδομένα στη συνάρτηση

                                   f (t) = c e−t/τ .                          (13.55)

   Στην πραγματικότητα, λαμβάνοντας υπόψη και μικρότερους χρόνους
αυτοσυσχετισμού, περιμένουμε ρm (t) ∼ a1 e−t/τ1 +a2 e−t/τ2 +. . .. Βρίσκουμε
πως τα δεδομένα μας προσαρμόζονται με πολύ σταθερό τρόπο στη
συνάρτηση
                 h(x) = a1 e−t/τ1 + a2 e−t/τ2 + a3 e−t/τ3 .           (13.56)
Όπως φαίνεται και στο σχήμα 13.22, πετυχαίνουμε άριστη προσαρμογή
για πολύ μικρούς χρόνους και τα αποτελέσματά μας για τον κύριο
χρόνο αυτοσυσχετισμού τm ≡ τ1 = 286.3(3). Οι δευτερεύοντες χρόνοι
αυτοσυσχετισμού είναι τ2 = 57(3), τ3 = 10.5(8) οι οποίοι είναι αρκετά
μικρότεροι από τον τ1 .
   Για διευκόλυνση του αναγνώστη παραθέτουμε τις βασικές εντολές
για την αναφερόμενη ανάλυση:

gnuplot >   h ( x ) = a1 * exp(−x / t1 ) + a2 * exp(−x / t2 ) + a3 * exp(−x / t3 )
gnuplot >   a1 = 1 ; t1 = 285; a2 = 0 . 0 4 ; t2 = 56;
gnuplot >   a3 = 0 . 0 3 ; t3 = 10
gnuplot >   f i t [ 1 : 6 0 0 ] h ( x ) ” outL40b0 . 4 4 0 7 . rhom” \
            using 1 : 2 via a1 , t1 , a2 , t2 , a3 , t3

το σφάλμα. Αυτό υποθέτει ότι έχουμε το σωστό στατιστικό βάρος σε κάθε σημείο που
δίνεται από το σφάλμα - στο παράδειγμα δεν το έχουμε γι’ αυτό και το επίπεδο
είναι τόσο χαμηλό. Μια τιμή κάτω από 5% είναι πολύ χαμηλή και υποδηλώνει ότι
το μοντέλο έχει ανάγκη από διορθώσεις. Οι αριθμητικές τιμές υποθέτουν Gaussian
κατανομή των μετρήσεων και αν η υπόθεση αυτή δεν ισχύει πρέπει να ληφθούν απλά
σαν μια ποιοτική ένδειξη.
   ²⁶Για ένα προσεκτικό υπολογισμό μιας ποσότητας που προκύπτει από προσαρμογή
δεδομένων, δοκιμάζουμε και άλλες συναρτήσεις που μπορεί να περιέχουν διορθώσεις
της ασυμπτωτικής συμπεριφοράς.
13.7. ΠΑΡΑΡΤΗΜΑ: ΣΥΝΑΡΤΗΣΗ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                                579


                   1
                                                                  h(t)
                                                                  f(t)
      ρm(t)




                 0.1




               0.01
                       0         200         400         600         800         1000
                                                     t
Σχήμα 13.22: Προσαρμογή της συνάρτησης αυτοσυσχετισμού ρm (t) στις συναρτήσεις
f (t) = c e−t/τ και h(t) = a1 e−t/τ1 +a2 e−t/τ2 +a3 e−t/τ3 . Για μεγάλους χρόνους f (t) ≈ h(t),
αλλά η h(t) είναι αναγκαία για την προσαρμογή των μικρών χρόνων. Η επιλογή αυτή
δίνει σταθερή τιμή για τον κύριο χρόνο αυτοσυσχετισμού τm = τ = τ1 . Οι τιμές των
παραμέτρων δίνονται στο κείμενο.




...
Final s e t of parameters                            Asymptotic Standard Error
=======================                              ==========================
a1                    = 0.922111                     +/− 0.001046            (0.1135%)
t1                    = 286.325                      +/− 0.2354              (0.08221%)
a2                    = 0.0462523                    +/− 0.001219            (2.635%)
t2                    = 56.6783                      +/− 2.824               (4.982%)
a3                    = 0.0300761                    +/− 0.001558            (5.18%)
t3                    = 10.5227                      +/− 0.8382              (7.965%)
gnuplot > p l o t [ : 1 5 0 ] [ 0 . 5 : ]     ” outL40b0 . 4 4 0 7 . rhom” using 1 : 2 \
           with lines notit , h ( x ) , f ( x )
gnuplot > p l o t [ : 1 0 0 0 ] [ 0 . 0 1 : ] ” outL40b0 . 4 4 0 7 . rhom” using 1 : 2 \
           with lines notit , h ( x ) , f ( x )
580                              ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


              1
                                                        h(t)
      ρm(t)                                              f(t)




                  0   20    40     60        80   100     120   140
                                         t
Σχήμα 13.23: Το σχήμα 13.22 σε μικρότερη κλίμακα χρόνου, όπου φαίνεται καθαρό-
τερα η επίδραση των μικρότερων χρόνων αυτοσυσχετισμού.




13.8 Παράρτημα: Υπολογισμός Σφαλμάτων

13.8.1 Η Μέθοδος Jackknife
Εδώ δίνουμε το πρόγραμμα που υπολογίζει τα σφάλματα με τη μέθοδο
jackknife που περιγράψαμε στην ενότητα 13.6.2. Στο σχήμα 13.21 φαίνε-
ται πώς χωρίζουμε τα δεδομένα μας σε bins. Σε κάθε bin υπολογίζουμε
τη μέση τιμή της ποσότητας O που μας ενδιαφέρει και στη συνέχεια,
από τη σχέση (13.48) τα σφάλματα. Για την εφαρμογή της μεθόδου,
παραθέτουμε πρόγραμμα από το αρχείο jack.f90 (θα το βρείτε στον
υποκατάλογο Tools/ στο συνοδευτικό λογισμικό) το οποίο υπολογίζει
τις ποσότητες ⟨O ⟩, δO , χ ≡ ⟨(O − ⟨O ⟩)2 ⟩ και δχ.

! ======================================================
! f i l e : j a c k . f90
MODULE jack_function
  i m p l i c i t none
  SAVE
  integer                 : : JACK , MAXDAT
  c h a r a c t e r (200) : : prog
13.8. ΠΑΡΑΡΤΗΜΑ: ΥΠΟΛΟΓΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ                                                            581

  CONTAINS
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! jackknife function :
   s u b r o u t i n e jackknife ( ndat , jack , x ,&
             avO , erO , avchi , erchi )
     integer                             : : ndat , jack ! l o c a l j a c k . . .
     r e a l ( 8 ) , dimension ( 0 : ) : : x
     real (8)                            : : avO , erO , avchi , erchi
     integer                             : : i , j , binw , bin
     real (8) , a l l o c a t a b l e    : : O ( : ) , chi ( : )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    ALLOCATE( O ( 0 : jack −1) ) ;ALLOCATE( chi ( 0 : jack −1) )
     O =0.0 D0 ; chi =0.0 D0 ;
     binw=ndat / jack
     i f ( binw <1) c a l l locerr ( ’ j a c k k n i f e : binw < 1 ’ )
! Average v a l u e :
     do i =0 , ndat−1
       do j =0 , jack−1
         i f ( ( i / binw ) /= j ) &
                   O (j) = O (j) + x(i)
       enddo
     enddo
     O       = O / ( ndat−binw ) ! normalize
! Susceptibility :
     do i =0 , ndat−1
       do j =0 , jack−1
         i f ( ( i / binw ) /= j ) &
                   chi ( j ) = chi ( j ) + ( x ( i )−O ( j ) ) * ( x ( i )−O ( j ) )
       enddo
     enddo
     chi         = chi / ( ndat−binw ) ! normalize
!−−−−−−−−−−−−−−−
     avO         = SUM( O ) / jack ; avchi=SUM( chi ) / jack
     erO         = sqrt (SUM( ( O −avO ) * ( O −avO ) ) )
     erchi = sqrt (SUM( ( chi−avchi ) * ( chi−avchi ) ) )
!−−−−−−−−−−−−−−−
    DEALLOCATE( O ) ;DEALLOCATE( chi )
   end s u b r o u t i n e jackknife
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   s u b r o u t i n e locerr ( errmes )
     i m p l i c i t none
     c h a r a c t e r ( * ) : : errmes
     w r i t e ( 0 , ’ (A, A) ’ ) ,TRIM( prog ) , ’ : ’ ,TRIM( errmes ) , ’ E x i t i n g . . . . ’
     stop 1
   end s u b r o u t i n e locerr
END MODULE jack_function
! ======================================================
program jackknife_errors
  use jack_function
582                                     ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

  i m p l i c i t none
  integer                           : : ndat , chk
  real (8)                          : : O , dO , chi , dchi
  real (8) , a l l o c a t a b l e : : x ( : )
  MAXDAT =1000000; JACK=10
  c a l l get_the_options
  ALLOCATE( x ( 0 : MAXDAT −1) ,STAT=chk )
  i f ( chk > 0) c a l l locerr ( ’ Not enough memory f o r x ’ )
  ndat=0
  do while ( ndat < MAXDAT )
    read ( * , * ,END=101) x ( ndat )
    ndat = ndat+1
  enddo
101 c o n t i n u e
  i f ( ndat >= MAXDAT ) w r i t e ( 0 , ’ (3A, I14 , A, I14 ) ’ ) &
           ’ # ’ ,TRIM( prog ) ,                                    &
           ’ : Warning : read ndat= ’ , ndat ,                      &
           ’ and reached t h e l i m i t : ’ , MAXDAT
  c a l l jackknife ( ndat , JACK , x , O , dO , chi , dchi )
  p r i n t ’ (A, I14 , A, I12 , A) ’ , ’ # NDAT = ’ , ndat ,       &
              ’ data . JACK = ’ , JACK , ’ groups ’
  p r i n t ’ (A) ’ , ’ # <o > , c h i= ( <o^2>−<o >^2) ’
  p r i n t ’ (A) ’ , ’ # <o> +/− e r r                        c h i +/− e r r ’
  p r i n t ’ (4G28 . 1 7 ) ’ , O , dO , chi , dchi
end program jackknife_errors
! ======================================================
s u b r o u t i n e get_the_options
  use jack_function
  use getopt_m               ! from g e t o p t . f90
  i m p l i c i t none
  c a l l getarg ( 0 , prog )

 do
  s e l e c t c a s e ( getopt ( ”−h j : d : ” ) )
  case ( ’ j ’ )
    read ( optarg , * ) JACK
  c a s e ( ’d ’ )
    read ( optarg , * ) MAXDAT
  c a s e ( ’h ’ )
    c a l l usage
  case ( ’ ? ’ )
    p r i n t * , ’unknown o p t i o n       ’ , optopt
    stop
  c a s e ( char ( 0 ) ) ! done with o p t i o n s
    exit
  c a s e ( ’− ’ )        ! use −− t o e x i t from o p t i o n s
    exit
  case default
    p r i n t * , ’ unhandled o p t i o n ’ , optopt
13.8. ΠΑΡΑΡΤΗΜΑ: ΥΠΟΛΟΓΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ                                              583

  end s e l e c t
 enddo

end s u b r o u t i n e get_the_options
! =============================================
s u b r o u t i n e usage
  use jack_function
  i m p l i c i t none
  p r i n t ’ (3A) ’ , ’ Usage : ’ ,TRIM( prog ) , ’ [ o p t i o n s ] ’
  p r i n t ’ ( A) ’ , ’         −j   : No . j a c k groups Def . 10 ’
  p r i n t ’ ( A) ’ , ’         −d : Max . no . o f data p o i n t s read ’
  p r i n t ’ ( A) ’ , ’ Computes <o > , c h i= ( <o^2>−<o >^2) ’
  p r i n t ’ ( A) ’ , ’ Data i s i n one column from s t d i n . ’
  stop
end s u b r o u t i n e usage

Για τη μεταγλώττιση χρησιμοποιούμε την εντολή

> gfortran −O2 getopt . f90 jack . f90 −o jack

Αν τα δεδομένα μας είναι σε μία στήλη στο αρχείο data, τότε η εντολή
για να κάνουμε τον υπολογισμό των σφαλμάτων με 50 jack bins είναι:

> cat data | jack −j 50

Το πρόγραμμα δέχεται το πολύ MAXDAT=1,000,000 μετρήσεις. Αν έχουμε
παραπάνω, πρέπει να χρησιμοποιήσουμε τον διακόπτη -d 2000000 για
2,000,000 μετρήσεις λ.χ. Η επιλογή να διαβάζουμε από το stdin γί-
νεται για να μπορεί το πρόγραμμα να χρησιμοποιηθεί σε συνδυασμό
με φίλτρα. Για παράδειγμα, για την ανάλυση της μαγνήτισης με το
πρόγραμμα που έχουμε γράψει για το πρότυπο Ising μπορούμε να χρη-
σιμοποιήσουμε την εντολή:

> is −L 20 −b 0.4407 −s 1 −S 342 −n 2000000 | grep −v # | \
  awk −v L=20 ’ { p r i n t ( $2 >0) ? ( $2 / ( L*L) ) :( − $2 / ( L*L) ) } ’ | \
  jack −j 50 −d 2000000                                      | grep −v # | \
  awk −v b =0.4407 −v L=20 ’ { p r i n t $1 , $2 , b *L*L* $3 , b *L*L* $4} ’

Η παραπάνω εντολή είναι μία γραμμή, αν αφαιρέσουμε τις τελευταίες
ανάποδα κάθετες γραμμές (backslash – ’\’). Για πληρότητα ας την εξη-
γήσουμε: Η πρώτη γραμμή τρέχει το πρόγραμμα is για το πρότυπο Ising
για N = L × L = 20 × 20 πλεγματικές θέσεις (-L 20) και β = 0.4407 (-b
0.4407). Αρχίζει από “καυτή” διάταξη σπιν (-s 1) και κάνει 2,000,000
μετρήσεις (-n 2000000). Φιλτράρουμε με την εντολή grep -v τα σχό-
584                                      ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

λια από την έξοδο του προγράμματος. Στη δεύτερη γραμμή, καλούμε
την awk ορίζοντας τη μεταβλητή L=20 να τυπώσει την απόλυτη τιμή της
δεύτερης στήλης διαιρεμένης με τον αριθμό των πλεγματικών θέσεων
L*L. Στην τρίτη γραμμή, γίνεται ο υπολογισμός της μέσης τιμής ⟨m⟩
και ⟨(m − ⟨m⟩)2 ⟩ με τα σφάλματά τους από το πρόγραμμα jack. Από τα
αποτελέσματα αφαιρούνται τα σχόλια με την εντολή grep -v. Η τέταρτη
γραμμή γίνεται απλά για τον υπολογισμό της μαγνητικής επιδεκτικό-
τητας (13.33), όπου πρέπει να πολλαπλασιάσουμε με τον παράγοντα
βN = βL2 τις διακυμάνσεις ⟨(m − ⟨m⟩)2 ⟩ και το σφάλμα τους για να
πάρουμε την χ.


13.8.2 Η Μέθοδος Bootstrap
Στην υποενότητα αυτή, παραθέτουμε το πρόγραμμα για τον υπολογισμό
των σφαλμάτων με τη μέθοδο bootstrap σύμφωνα με τα όσα είπαμε στην
ενότητα 13.6.3. Το πρόγραμμα κωδικοποιείται στο αρχείο boot.f90:

! ======================================================
! f i l e : boot . f90
MODULE boot_function
  i m p l i c i t none
  SAVE
  integer                               : : SAMPLES , MAXDAT
  c h a r a c t e r (200)               : : prog
  integer                               : : seed
  CONTAINS
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
! jackknife function :
    s u b r o u t i n e bootstrap ( ndat , samples , x ,&
              avO , erO , avchi , erchi )
      integer                           : : ndat , samples ! l o c a l samples . . .
      r e a l ( 8 ) , dimension ( 0 : ) : : x
      real (8)                          : : avO , erO , avchi , erchi
      integer                           :: i,j,k
      real (8) , a l l o c a t a b l e  : : O ( : ) , O2 ( : ) , chi ( : )
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
     ALLOCATE( O ( 0 : samples −1) ) ;ALLOCATE( O2 ( 0 : samples −1) ) ;
     ALLOCATE( chi ( 0 : samples −1) )
      O =0.0 D0 ; O2 =0.0 D0 ; chi =0.0 D0 ;
      do j =0 , samples−1
        do i =0 , ndat         −1
          k = INT ( ndat * drandom ( ) ) ! 0 , . . . , ndat −1
          O (j) = O (j) + x(k)
          O2 ( j ) = O2 ( j ) + x ( k ) * x ( k )
        enddo
13.8. ΠΑΡΑΡΤΗΜΑ: ΥΠΟΛΟΓΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ                                                             585

        O ( j ) = O ( j ) / ndat ; O2 ( j ) = O2 ( j ) / ndat
        chi ( j ) = O2 ( j )−O ( j ) * O ( j )
      enddo
!−−−−−−−−−−−−−−−
      avO         = SUM( O ) / samples ; avchi=SUM( chi ) / samples
      erO         = sqrt (SUM( ( O −avO ) * ( O −avO ) ) / samples )
      erchi = sqrt (SUM( ( chi−avchi ) * ( chi−avchi ) ) / samples )
! compute t h e r e a l avO :
      avO         = SUM( x ( 0 : ndat −1) ) / ndat
!−−−−−−−−−−−−−−−
     DEALLOCATE( O ) ;DEALLOCATE( chi )
    end s u b r o u t i n e bootstrap
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    r e a l ( 8 ) f u n c t i o n drandom ( )
      i m p l i c i t none
      i n t e g e r , parameter : : a = 16807
      i n t e g e r , parameter : : m = 2147483647
      i n t e g e r , parameter : : q = 127773
      i n t e g e r , parameter : : r = 2836
      r e a l ( 8 ) , parameter : : f = ( 1 . 0 D0 / m )
      integer                        :: p
      real (8)                       : : dr
101 c o n t i n u e
      p               = seed / q
      seed            = a * ( seed− q * p ) − r * p
      i f ( seed . lt . 0) seed = seed + m
      dr              = f * seed
      i f ( dr . le . 0.0 D0 . or . dr . ge . 1 . 0 D0 ) goto 101
      drandom = dr
    end f u n c t i o n drandom
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    s u b r o u t i n e locerr ( errmes )
      i m p l i c i t none
      c h a r a c t e r ( * ) : : errmes
      w r i t e ( 0 , ’ (A, A) ’ ) ,TRIM( prog ) , ’ : ’ ,TRIM( errmes ) , ’ E x i t i n g . . . . ’
      stop 1
    end s u b r o u t i n e locerr
END MODULE boot_function
! ======================================================
program bootstrap_errors
  use boot_function
  i m p l i c i t none
  integer                            : : ndat , chk
  real (8)                           : : O , dO , chi , dchi
  real (8) , a l l o c a t a b l e : : x ( : )
  MAXDAT =1000000; SAMPLES=1000
  c a l l get_the_options
  ALLOCATE( x ( 0 : MAXDAT −1) ,STAT=chk )
  i f ( chk > 0) c a l l locerr ( ’ Not enough memory f o r x ’ )
586                                     ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING

  ndat=0
  do while ( ndat < MAXDAT )
    read ( * , * ,END=101) x ( ndat )
    ndat = ndat+1
  enddo
101 c o n t i n u e
  i f ( ndat >= MAXDAT ) w r i t e ( 0 , ’ (3A, I14 , A, I14 ) ’ ) &
            ’ # ’ ,TRIM( prog ) ,                                  &
            ’ : Warning : read ndat= ’ , ndat ,                    &
            ’ and reached t h e l i m i t : ’ , MAXDAT
  open ( 2 8 , f i l e =” / dev / urandom” , a c c e s s =” stream ” ,&
    form=” unformatted ” )
  read (2 8) seed
  seed = ABS( seed )
  c l o s e (2 8)
  c a l l bootstrap ( ndat , SAMPLES , x , O , dO , chi , dchi )
  p r i n t ’ (A, I14 , A, I12 , A) ’ ,&
    ’ # NDAT = ’ , ndat , ’ data . SAMPLES = ’ , SAMPLES , ’ groups ’
  p r i n t ’ (A                     ) ’ ,&
    ’ # <o > , c h i= ( <o^2>−<o >^2) ’
  p r i n t ’ (A                     ) ’ ,&
    ’ # <o> +/− e r r                                             c h i +/− e r r ’
  p r i n t ’ (4G28 . 1 7 ) ’ , O , dO , chi , dchi
end program bootstrap_errors
! ======================================================
s u b r o u t i n e get_the_options
  use boot_function
  use getopt_m              ! from g e t o p t . f90
  i m p l i c i t none
  c a l l getarg ( 0 , prog )

 do
  s e l e c t c a s e ( getopt ( ”−hs : d : ” ) )
  case ( ’ s ’ )
    read ( optarg , * ) SAMPLES
  c a s e ( ’d ’ )
    read ( optarg , * ) MAXDAT
  c a s e ( ’h ’ )
    c a l l usage
  case ( ’ ? ’ )
    p r i n t * , ’unknown o p t i o n      ’ , optopt
    stop
  c a s e ( char ( 0 ) ) ! done with o p t i o n s
    exit
  c a s e ( ’− ’ )        ! use −− t o e x i t from o p t i o n s
    exit
  case default
    p r i n t * , ’ unhandled o p t i o n ’ , optopt
  end s e l e c t
13.8. ΠΑΡΑΡΤΗΜΑ: ΥΠΟΛΟΓΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ                                                 587

    enddo

end s u b r o u t i n e get_the_options
! =============================================
s u b r o u t i n e usage
  ...
end s u b r o u t i n e usage
! =============================================

Για τη μεταγλώττιση χρησιμοποιούμε την εντολή

> gfortran −O2 getopt . f90 boot . f90 −o boot

Αν τα δεδομένα μας είναι σε μία στήλη στο αρχείο data, τότε η εντολή
για να κάνουμε τον υπολογισμό των σφαλμάτων με 500 samples είναι:

> c a t data | boot −s 500

Το πρόγραμμα δέχεται το πολύ 1,000,000 μετρήσεις, όπως και στο πρό-
γραμμα jack. Αν έχουμε παραπάνω, πρέπει να χρησιμοποιήσουμε το
διακόπτη -d 2000000 για 2,000,000 μετρήσεις λ.χ. Για παράδειγμα, για
την ανάλυση της μαγνήτισης με το πρόγραμμα που έχουμε γράψει για
το πρότυπο Ising μπορούμε να χρησιμοποιήσουμε την εντολή:

>     is −L 20 −b 0.4407 −s 1 −S 342 −n 2000000 | grep −v # | \
     awk −v L=20 ’ { p r i n t ( $2 >0) ? ( $2 / ( L*L) ) :( − $2 / ( L*L) ) } ’ | \
     boot −s 1000 −d 2000000                                    | grep −v # | \
     awk −v b =0.4407 −v L=20 ’ { p r i n t $1 , $2 , b *L*L* $3 , b *L*L* $4} ’

Η παραπάνω εντολή είναι μία γραμμή, αν αφαιρέσουμε τις τελευταίες
ανάποδα κάθετες γραμμές (backslash – ’\’).


13.8.3        Σύγκριση των Μεθόδων
Στην υποενότητα αυτή θα χρησιμοποιήσουμε και θα συγκρίνουμε τις
μεθόδους που αναφέραμε στις προηγούμενες ενότητες για τον υπολο-
γισμό των σφαλμάτων. Θα χρησιμοποιήσουμε τη σχέση (13.43), τη μέ-
θοδο jackknife (13.48) και τη μέθοδο bootstrap (13.52). Για να φανούν οι
διαφορές, θα χρησιμοποιήσουμε δεδομένα με ισχυρό αυτοσυσχετισμό.
Επιλέγουμε στο πρότυπο Ising τον αλγόριθμο Metropolis για L = 40,
β = 0.4407 ≈ βc . Ειδικότερα, θα μελετήσουμε τη μαγνήτιση ανά πλεγ-
ματική θέση (13.31). Κάνουμε 1, 000, 000 μετρήσεις με τις εντολές:
588                                     ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


> . / is −L 40 −b 0.4407 −s 1 −S 5434365 −n 1000000 \
                                       > outL40b0 . 4 4 0 7 . dat &
> grep −v # outL40b0 . 4 4 0 7 . dat | \
  awk −v L=40 ’{ i f ( $2 <0) { $2=−$2 } ; p r i n t $2 / ( L * L ) } ’ \
                                       > outL40b0 . 4 4 0 7 . m
> c a t outL40b0 . 4 4 0 7 . m | autoc −t 10000 −n 1000000 \
                                       > outL40b0 . 4 4 0 7 . rhom

Το αρχείο outL40b0.4407.m έχει σε μία στήλη τις μετρήσεις της μαγνήτι-
σης, ενώ το αρχείο outL40b0.4407.rhom τη συνάρτηση αυτοσυσχετισμού
και τον ολοκληρωμένο χρόνο αυτοσυσχετισμού. Με το gnuplot μελε-
τούμε το χρόνο αυτοσυσχετισμού, όπως περιγράψαμε από τη σελίδα
577 και μετά. Παίρνουμε τm = 286.3(3). Υπολογίζουμε και τον ολοκλη-
ρωμένο χρόνο αυτοσυσχετισμού με αποτέλεσμα τint,m = 254(1).
   Η μέση τιμή ⟨m⟩ = 0.638682. Η εφαρμογή της σχέσης (13.42) (που
προϋποθέτει στατιστικά ανεξάρτητες μετρήσεις) δίνει το (υποεκτιμη-
μένο) σφάλμα στατιστικής απόκλισης
                               √      δc m = 0.00017. Χρησιμοποιώντας
τη σχέση (13.43), έχουμε δm = 1 + 2τ δc m ≈ 0.004. Τη μαγνητική επι-
δεκτικότητα δεν είναι δυνατόν να την υπολογίσουμε με τον τρόπο αυτό.
Άρα, δίνουμε το αποτέλεσμα

                          ⟨m⟩ = 0.639 ± 0.004 ≡ 0.639(4) .                  (13.57)

 Για τον υπολογισμό της μαγνητικής επιδεκτικότητας είναι αναγκαίο να
χρησιμοποιήσουμε μία από τις μεθόδους jackknife ή bootstrap. Η δεύ-
τερη εφαρμόζεται αρχικά με μεταβλητό αριθμό δειγμάτων nS , έτσι ώστε
να προσδιορίσουμε τον βέλτιστο αριθμό από αυτά για να χρησιμοποιή-
σουμε στην ανάλυσή μας. Στο σχήμα 13.24 φαίνονται τα αποτελέσματα
για τη μαγνήτιση. Παρατηρούμε πολύ γρήγορη σύγκλιση στο σφάλμα
της στατιστικής απόκλισης δc m = 0.00017 για μικρό αριθμό δειγμάτων.
Θα μπορούσαμε με ασφάλεια για την ανάλυση των δεδομένων της μα-
γνήτισης να επιλέγαμε nS = 100. Για την περίπτωση της μαγνητικής επι-
δεκτικότητας η σύγκλιση είναι πιο αργή, αλλά πάλι θα μπορούσαμε να
πάρουμε nS = 500. Παίρνουμε χ = 20.39 και για το σφάλμα δc χ = 0.0435.
Η τιμή του σφάλματος, όμως, αφορά ανεξάρτητες μετρήσεις, κάτι που
δε συμβαίνει στην περίπτωσή
                    √        μας. Η τιμή αυτή θα πρέπει να διορθωθεί
από τον παράγοντα 1 + 2τm και να δώσει δχ = 1. Άρα,

                                  χ = 20 ± 1 ≡ 20(1) .                      (13.58)

Αξίζει να παρατηρηθεί ότι το σφάλμα είναι αρκετά μεγάλο, κάτι που
δείχνει την πρακτική δυσκολία που φέρνουν οι μεγάλοι χρόνοι αυτοσυ-
σχετισμού [στην πραγματικότητα έχουμε μόνο n/(2τm ) ≈ 1, 000, 000/(2×
13.8. ΠΑΡΑΡΤΗΜΑ: ΥΠΟΛΟΓΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ                                  589


            0.00021
              0.0002
            0.00019
            0.00018
            0.00017
     δm




            0.00016
            0.00015
            0.00014
            0.00013
            0.00012
                       1       10      100        1000   10000 100000
                                             nS

Σχήμα 13.24: Το σφάλμα δm της μαγνήτισης υπολογισμένο με τη μέθοδο bootstrap
ως συνάρτηση του αριθμού των δειγμάτων nS . Παρατηρούμε πολύ γρήγορη σύγκλιση
στην τιμή του σφάλματος που παίρνουμε από τη σχέση (13.42) δc m = 0.00017.



286) ≈ 1750 ανεξάρτητες μετρήσεις]. Επίσης, σημειώνουμε ότι για τον
υπολογισμό του σφάλματος με τον τρόπο αυτό είναι αναγκαία η γνώση
του τm .
   Πιο ασφαλής, γρήγορη και ευσταθής μέθοδος είναι η μέθοδος ja-
ckknife. Εδώ, δε θα χρειαστεί η εκ των προτέρων γνώση του τm . Για
τον προσδιορισμό του σφάλματος αρκεί να μελετήσουμε τα δεδομένα
με μεταβλητό αριθμό από jackknife bins nb . Στο σχήμα 13.26 φαίνο-
νται τα αποτελέσματά μας για τη μαγνήτιση. Όταν τα jackknife bins
nb = n, τότε τα δείγματά μας αποτελούνται από όλες τις μετρήσεις
εκτός από ένα στοιχείο. Τότε το σφάλμα θα είναι το ίδιο με το σφάλμα
της στατιστικής
             √ απόκλισης και θα είναι υποεκτιμημένο κατά τον γνωστό
παράγοντα 1 + 2τm . Αυτό φαίνεται στο σχήμα 13.26 όπου παρατηρεί-
ται μια πολύ αργή σύγκλιση στην τιμή δc m = 0.00017. Η επίδραση των
αυτοσυσχετισμών εξαφανίζεται, καθώς από το δείγμα μας αφαιρούμε
(bin width) ≈ 2τm μετρήσεις. Αυτό γίνεται, όταν nb ≈ n/(bin width) =
n/(2τm ) = 1, 000, 000/572 ≈ 1750. Φυσικά, αυτή η εκτίμηση δίνει την τάξη
μεγέθους και μια προσεκτική μελέτη είναι αναγκαία για τον προσδιορι-
σμό του σωστού αριθμού nb . Στο σχήμα 13.26 βλέπουμε ότι το σφάλμα
συγκλίνει για 100 < nb < 800 στην τιμή δm = 0.0036 που είναι αρκετά
590                                 ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


             0.045

               0.04

             0.035
      δχ




               0.03

             0.025

               0.02
                      1        10       100        1000   10000 100000
                                              nS

Σχήμα 13.25: Το σφάλμα δχ της μαγνητικής επιδεκτικότητας υπολογισμένο με τη μέ-
θοδο bootstrap ως συνάρτηση του αριθμού των δειγμάτων nS . Παρατηρούμε σύγκλιση
για nS > 1000 στην τιμή δc χ = 0.0435.



                  √
κοντά στην τιμή 1 + 2τm δc m ≈ 0.004 (και ακόμα κοντύτερα, αν χρη-
σιμοποιήσουμε τον ολοκληρωμένο χρόνο αυτοσυσχετισμού τint,m = 254).
Επίσης, παρατηρούμε ότι χοντρική εκτίμηση του σφάλματος μπορούμε
να πάρουμε για πολύ μικρό αριθμό nb ≈ 20 − 40, κάτι που μπορεί να
χρησιμοποιηθεί για γρήγορους υπολογισμούς.
   Παρόμοια αποτελέσματα παίρνουμε και για τη μαγνητική επιδεκτι-
κότητα χ, όπου το σφάλμα συγκλίνει στην τιμή δχ = 0.86 σε συμφωνία
με τις προηγούμενες εκτιμήσεις μας. Για nb → n, το σφάλμα συγκλίνει
στο (υποεκτιμημένο) σφάλμα δc χ = 0.0421. Γεννιέται το ερώτημα αν η
μέθοδος bootstrap μπορεί να χρησιμοποιηθεί με ανάλογο τρόπο με αυτό
της jackknife για τον προσδιορισμό του πραγματικού σφάλματος δm, δχ
χωρίς τη γνώση του τm . Η απάντηση είναι ναι. Θα χρησιμοποιήσουμε τη
διαίσθησή μας από τη μέθοδο jackknife και binning. Χωρίζουμε τα δε-
δομένα μας σε nb bins²⁷ των οποίων το εύρος (bin width) = n/nb . Κάθε
bin θεωρείται ως μια ανεξάρτητη μέτρηση που είναι η μέση τιμή της πα-

   ²⁷Προσοχή, αν το nb είναι πολύ μικρό, τότε έχουμε συστηματικό σφάλμα στην τιμή
της χ. Οι τιμές, όπως και τα σφάλματα, πρέπει να παρακολουθούνται, έτσι ώστε να
βρεθεί το εύρος των τιμών του nb όπου το αποτέλεσμα είναι ανεξάρτητο του nb .
13.8. ΠΑΡΑΡΤΗΜΑ: ΥΠΟΛΟΓΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ                                      591


              0.004
             0.0035
              0.003
             0.0025
     δm




              0.002
             0.0015
              0.001
             0.0005
                   0
                       1     10     100 1000 10000 1000001e+06
                                      jackknife bins
Σχήμα 13.26: Το σφάλμα δm της μαγνήτισης υπολογισμένο με τη μέθοδο jackknife ως
συνάρτηση του αριθμού των δειγμάτων jackknife bins nb . Παρατηρούμε σύγκλιση για
100 < nb < 800 στην τιμή δm = 0.0036. Φαίνεται καθαρά ότι καθώς φτάνουμε στο όριο
να αφαιρούμε μόνο ένα στοιχείο από τα δεδομένα (nb = n), το σφάλμα πλησιάζει στην
τιμή που υπολογίζεται από τη σχέση√ (13.42) δc m = 0.00017. Οι οριζόντιες γραμμές
αντιστοιχούν
          √  στις τιμές  δc m και  1 + 2τm δc m ≈ 0.004 όπου τm = 286.3. Ο λόγος
δm/δc m ≈ 1 + 2τm .




ρατηρήσιμης ποσότητας μέσα στο bin αυτό. Παίρνουμε nS = 1000 και
εφαρμόζουμε τη μέθοδο bootstrap στο δείγμα των nb μετρήσεων. Στα
σχήματα 13.30 και 13.32 δείχνουμε τα αποτελέσματά μας ως συνάρτηση
του (bin width). Όταν αυτό γίνει (bin width) ≈ 2τm οι μετρήσεις μας θα
είναι πρακτικά ανεξάρτητες και θα πρέπει να πάρουμε το πραγματικό
σφάλμα. Στο σχήμα 13.30 δείχνουμε τα αποτελέσματα για τη μαγνή-
τιση όπου για bin width=1, έχουμε το αποτέλεσμα δc m = 0.00017. Όταν
το εύρος γίνει > 2τm , το σφάλμα γίνεται δm = 0.0036, το οποίο το δια-
βάζουμε στο plateau για 1100 < (bin width) < 16000, σε συμφωνία με τη
μέθοδο jackknife. Στο σχήμα 13.30 δείχνουμε τα αποτελέσματα για τη
μαγνητική επιδεκτικότητα. Πάλι για bin width=1, έχουμε το αποτέλεσμα
δc χ = 0.0421. Όταν το εύρος γίνει > 2τm , το σφάλμα γίνεται δχ = 0.615,
το οποίο το διαβάζουμε στο plateau για 500 < (bin width) < 1000 που
δεν είναι πολύ διαφορετικό από το αποτέλεσμα που πήραμε με τη μέ-
θοδο jackknife.
592                                       ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


               0.004
              0.0035
               0.003
              0.0025
      δm




               0.002
              0.0015
               0.001
              0.0005
                    0
                        0        200       400    600     800           1000 1200
                                             jackknife bins
Σχήμα 13.27: Το σχήμα 13.26 μεγενθυμένο στην περιοχή που εμφανίζεται  √ πλατό στις
τιμές του δm. Οι οριζόντιες γραμμές αντιστοιχούν
                                         √       στις τιμές δ c m και  1 + 2τm δc m ≈
0.004 όπου τm = 286.3. Ο λόγος δm/δc m ≈ 1 + 2τm .




   Κλείνουμε την υποενότητα αυτή με μια σημαντική παρατήρηση. Στην
παρουσίασή μας υπολογίσαμε πρώτα το χρόνο αυτοσυσχετισμού τm από
τη συνάρτηση αυτοσυσχετισμού και στη συνέχεια, προσδιορίσαμε πότε
οι μέθοδοι που χρησιμοποιήσαμε έδωσαν το (υποεκτιμημένο) σφάλμα
στατιστικής απόκλισης των μετρήσεων και πότε το πραγματικό που
λαμβάνει υπόψη τους αυτοσυσχετισμούς. Στην πράξη όμως, οι μέθοδοι
αυτοί αποτελούν μία
                  √ ανεξάρτητη μέθοδο υπολογισμού του τm από τις
σχέσεις δO /δc O = 1 + 2τO . Έτσι, από τα παραπάνω συνάγεται ότι
                    ((          )2     )         ((          )2    )
                1        δm                  1        δχ
           τm =                      −1    =                      −1   ...     (13.59)
                2        δc m                2        δc χ

σχέσεις που μπορούν να χρησιμοποιηθούν για τον έλεγχο της αυτοσυνέ-
πειας της ανάλυσης των δεδομένων μας. Φυσικά θα υπενθυμίσουμε ότι
ένα σύστημα έχει πολλούς χρόνους αυτοσυσχετισμού και διαφορετικές
παρατηρήσιμες ποσότητες και μπορεί η συμπεριφορά τους να καθορί-
ζεται από διαφορετικούς χρόνους αυτοσυσχετισμού (fast modes, slow
modes).
13.9. ΑΣΚΗΣΕΙΣ                                                                 593


             1.2

               1

             0.8
      δχ




             0.6

             0.4

             0.2

               0
                   1      10       100 1000 10000 100000 1e+06
                                     jackknife bins
Σχήμα 13.28: Το σφάλμα δχ της μαγνητικής επιδεκτικότητας υπολογισμένο με τη
μέθοδο jackknife ως συνάρτηση του αριθμού των δειγμάτων jackknife bins nb . Πα-
ρατηρούμε σύγκλιση για 100 < nb < 800 στην τιμή δχ = 0.86. Φαίνεται καθαρά ότι,
καθώς φτάνουμε στο όριο να αφαιρούμε μόνο ένα στοιχείο από τα δεδομένα (nb = n),
το σφάλμα πλησιάζει στην τιμή που θα παίρναμε, αν θεωρούσαμε τις μετρήσεις ανε-
ξάρτητες δc χ = 0.0421. Η τιμή αυτή είναι πολύ κοντά στην τιμή που πήραμε με τη
μέθοδο bootstrap.
         √        Οι τιμές αυτές απεικονίζονται στις δύο οριζόντιες γραμμές. Ο λόγος
δχ/δc χ ≈ 1 + 2τm .




13.9       Ασκήσεις
   1. Αποδείξτε ότι η (13.22) ικανοποιεί τη συνθήκη λεπτομερούς ισορ-
      ροπίας.

  2. Γράψτε πρόγραμμα που θα σας τυπώνει την ποσότητα μνήμης σε
     bytes που πιάνουν οι ακόλουθοι τύποι μεταβλητών: character,
     integer, integer(8), real, real(8). Υπολογίστε πόση μνήμη
     απαιτείται για ένα array 2,000,000 θέσεων για κάθε ένα τύπο
     μεταβλητών.

  3. Μεταβάλετε τον πρόγραμμα, έτσι ώστε να μετράει τον μέσο λόγο
     αποδοχής acceptance των βημάτων Metropolis. Δηλ. μετρήστε τον
     αριθμό των δεκτών αλλαγών στα σπιν σε σχέση με τον αριθμό των
     επιχειρούμενων αλλαγών. Εξετάστε τη σχέση του αριθμού με τη
594                               ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


            1.2

              1

            0.8
      δχ




            0.6

            0.4

            0.2

              0
                  0     200      400    600      800      1000     1200
                                   jackknife bins
Σχήμα 13.29: Το σχήμα 13.28 μεγενθυμένο στην περιοχή που εμφανίζεται πλατό στις
τιμές του δχ. Παρατηρούμε σύγκλιση για 100 < nb < 800 στην τιμή δχ = 0.86. Οι
√ οριζόντιες γραμμές αντιστοιχούν στις τιμές των δχ και δc χ. Ο λόγος δχ/δc χ ≈
δύο
  1 + 2τm .



      θερμοκρασία και το μέγεθος του συστήματος. Πάρτε L = 20 και
      β = 0.20, 0.30, 0.40, 0.42, 0.44, 0.46, 0.48, 0.50. Στη συνέχεια, πάρτε
      β = 0.20, L = 10, 20, 40, 80, 100. Επαναλάβατε για τις ίδιες τιμές
      του L για β = 0.44 και β = 0.48.

  4. Αναπαράγετε τα σχήματα 13.12 και υπολογίστε τον τm . Επανα-
     λάβετε το ίδιο για την ενέργεια και υπολογίστε τον τe . Συγκρίνετε
     τις τιμές που βγάλατε με τις τιμές των τint,m και τint,e .

  5. Αναπαράγετε τα σχήματα 13.15 και επαναλάβετε τον υπολογισμό
     σας για την ενέργεια.

  6. Αναπαράγετε τα σχήματα 13.17. Επαναλάβατε το ίδιο και για την
     ενέργεια. Στη συνέχεια, κάντε τα ανάλογα σχήματα για τους τint,m
     και τint,e σαν συνάρτηση του tmax (βλ. σχήμα 13.14)

  7. Αναπαράγετε τα σχήματα 13.19 και 13.20. Επαναλάβετε το ίδιο
     και για την ενέργεια. Στη συνέχεια, κάντε τα ανάλογα σχήματα
     για τους τint,m και τint,e σαν συνάρτηση του tmax (βλ. σχήμα 13.14)
13.9. ΑΣΚΗΣΕΙΣ                                                               595


              0.004
             0.0035
              0.003
             0.0025
     δm




              0.002
             0.0015
              0.001
             0.0005
                    0
                        1     10     100     1000 10000 100000 1e+06
                                           bin width
Σχήμα 13.30: Το σφάλμα δm της μαγνήτισης υπολογισμένο με τη μέθοδο bootstrap.
Παίρνουμε nS = 1000 και χωρίζουμε τα δεδομένα μας σε bins των οποίων το εύρος bin
width φαίνεται στον οριζόντιο άξονα. Κάθε bin θεωρείται ως μια ανεξάρτητη μέτρηση.
Για bin width=1, έχουμε το αποτέλεσμα δc m = 0.00017. Όταν το εύρος γίνει > 2τm ,
το σφάλμα γίνεται δm = 0.0036, το οποίο το διαβάζουμε στο plateau για 1100 <
(bin width) < 16000, σε συμφωνία με τη μέθοδο jackknife. Οι οριζόντιες γραμμές
αντιστοιχούν στις τιμές των δc m και δm που αναφέρθηκαν παραπάνω.



  8. Κάνετε τις απαραίτητες μετατροπές στον κώδικα, ώστε να προ-
     σομοιώσετε το πρότυπο Ising παρουσία εξωτερικού μαγνητικού
     πεδίου B (βλ. εξ. (13.2)). Υπολογίστε τη μαγνήτιση m(β, B) για
     L = 32 και B = 0.2, 0.4, 0.6, 0.8, 1.0 στο ενδιαφέρον φάσμα των
     θερμοκρασιών. Παρατηρήστε τη διαδικασία εύρεσης της θερμικής
     ισορροπίας, καθώς αυξάνει το B από διαφορετικές αρχικές κα-
     ταστάσεις: Παγωμένη με σπιν παράλληλα στο B, παγωμένη με
     σπιν αντιπαράλληλα στο B, καυτή και την προηγούμενη κατά-
     σταση σε γειτονική θερμοκρασία. Μελετήστε πως μεταβάλλεται η
     θερμοκρασία στην οποία έχουμε μετάβαση από μη μαγνητισμένη
     σε μαγνητισμένη κατάσταση, καθώς αυξάνει το B.

  9. Φαινόμενο υστέρησης: Στην προηγούμενη άσκηση το σύστημα για
     B ̸= 0 παρουσιάζει μετάβαση φάση πρώτης τάξης, δηλ. ασυνέχεια
     στην τιμή της παραμέτρου τάξης. Εδώ, αυτή είναι η μαγνήτιση ως
     συνάρτηση του B. Παρουσιάζεται στο σύστημα αυτό το φαινόμενο
596                                ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


                0.004
              0.0035
                0.003
              0.0025
       δm




                0.002
              0.0015
                0.001
              0.0005
                    0
                          1000                     10000
                                           bin width
      Σχήμα 13.31: Το σχήμα 13.30 στην περιοχή του plateau των τιμών του δm.



       της υστέρησης. Για να το δείτε, θέστε L = 32 και β = 0.55.
       (αʹ) Φέρτε το σύστημα σε θερμική ισορροπία για B = 0.
       (βʹ) Προσομοιώστε το σύστημα για B = 0.2 χρησιμοποιώντας ως
            αρχική κατάσταση αυτή του προηγουμένου βήματος. Κάντε
            100 sweeps και υπολογίστε την ⟨m⟩.
       (γʹ) Συνεχίστε την ίδια διαδικασία αυξάνοντας το μαγνητικό πε-
            δίο κατά δB = 0.2 κάθε φορά. Σταματήστε, όταν ⟨m⟩ ≈ 0.95.
       (δʹ) Από την τελευταία διάταξη του προηγουμένου βήματος αρχί-
            στε να ελαττώνετε διαδοχικά το μαγν. πεδίο κατά δB = −0.2
            μέχρι ⟨m⟩ ≈= −0.95.
       (εʹ) Επαναλάβετε ξανά από την τελευταία διάταξη του συστήμα-
            τος, αυξάνοντας το μαγν. πεδίο ξανά κατά δB = 0.2 μέχρι
            ⟨m⟩ ≈ 0.95.
       Τι παρατηρείτε; Φτιάξατε μια κλειστή καμπύλη στο επίπεδο (B, m);
       Ποιες είναι οι τιμές της μαγνήτισης για B = 0; Γιατί είναι διαφο-
       ρετικές;
       Τα συστήματα που παρουσιάζουν μετάβαση πρώτης τάξης, πα-
       ρουσιάζουν καταστάσεις που είναι τοπικά ελάχιστα της ελεύθε-
13.9. ΑΣΚΗΣΕΙΣ                                                                 597


             0.7

             0.6

             0.5

             0.4
      δχ




             0.3

             0.2

             0.1

               0
                   1       10       100      1000 10000 100000 1e+06
                                          bin width
Σχήμα 13.32: Το σφάλμα δχ της μαγνητικής επιδεκτικότητας υπολογισμένο με τη
μέθοδο bootstrap. Παίρνουμε nS = 1000 και χωρίζουμε τα δεδομένα μας σε bins των
οποίων το εύρος bin width φαίνεται στον οριζόντιο άξονα. Κάθε bin θεωρείται ως μια
ανεξάρτητη μέτρηση. Για bin width=1, έχουμε το αποτέλεσμα δc χ = 0.0421. Όταν το
εύρος γίνει > 2τm , το σφάλμα γίνεται δχ = 0.615, το οποίο το διαβάζουμε στο plateau
για 500 < (bin width) < 1000 που δεν είναι πολύ διαφορετικό από το αποτέλεσμα
που πήραμε με τη μέθοδο jackknife. Οι οριζόντιες γραμμές αντιστοιχούν στις τιμές
των δc χ και δχ που αναφέρθηκαν παραπάνω.




      ρης ενέργειας, αλλά υπάρχει μόνο ένα πραγματικό ελάχιστο. Αυτό
      φαίνεται στο σχήμα 12.2 όπου απεικονίζονται οι δύο καταστάσεις
      να έχουν την ίδια ελεύθερη ενέργεια. Αυτό συμβαίνει ακριβώς στο
      κρίσιμο σημείο. Όταν φύγουμε από αυτό, τότε το ένα ελάχιστο
      είναι το πραγματικό, ενώ το άλλο έχει μεγαλύτερη ελεύθερη ενέρ-
      γεια. Όταν το σύστημα βρεθεί σε αυτή την κατάσταση, τότε χρειά-
      ζεται μεγάλο χρόνο για να μπορέσει να υπερπηδήσει το φράγμα
      ελεύθερης ενέργειας και να βρει το πραγματικό ελάχιστο. Μία
      τέτοια κατάσταση ονομάζεται μετασταθής. Σε μια προσομοίωση
      Μόντε Κάρλο μια τέτοια περίπτωση παρουσιάζει μεγάλη δυσκο-
      λία, αφού μπορούμε να θεωρήσουμε κατά λάθος ότι βρισκόμαστε
      στη θεμελιώδη κατάσταση. Εσείς επαναλάβετε τις προσομοιώσεις
      που κάνατε παραπάνω, αλλά κάντε αυτή τη φορά 100, 000 sweeps.
      Παρατηρήστε τη χρονοσειρά της μαγνήτισης και παρατηρήστε τις
598                                ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING


              0.7

              0.6

              0.5

              0.4
       δχ




              0.3

              0.2

              0.1

                0
                     200    400     600      800 1000 1200 1400
                                          bin width
      Σχήμα 13.33: Το σχήμα 13.32 στην περιοχή του plateau των τιμών του δχ.



       μεταπτώσεις από τη μια μετασταθή κατάσταση στην άλλη. Κά-
       νετε το ιστόγραμμα των τιμών της μαγνήτισης και εντοπίστε τη
       μετασταθή κατάσταση. Πώς μεταβάλλεται το ιστόγραμμα, καθώς
       αυξάνεται το B;

 10. Γράψτε κώδικα για το πρότυπο Ising στις 2 διαστάσεις, αλλά σε
     ένα πλέγμα τριγωνικό. Η κύρια διαφορά είναι ότι ο αριθμός των
     πλησιέστερων γειτόνων είναι z = 6 αντί για z = 4. Για τη δομή
     του πλέγματος θα βρείτε χρήσιμη πληροφορία στο κεφ. 13.1.2 των
     Newman και Barkema (ειδικά από το σχήμα 13.4). Υπολογίστε
     ξανά τη μεταβολή της ενέργειας σε κάθε spin flip για το βήμα
     Metropolis. Από τα μέγιστα της μαγνητικής επιδεκτικότητας και
     της ειδικής θερμότητας εξετάστε αν η κρίσιμη θερμοκρασία του
     συστήματος είναι πράγματι βc ≈ 0.274653072. Παρατηρήστε ότι
     ενώ η τιμή της βc αλλάζει σε σχέση με το τετραγωνικό πλέγμα, οι
     κρίσιμοι εκθέτες παραμένουν οι ίδιοι (παγκοσμιότητα).

 11. Γράψτε κώδικα για το πρότυπο Ising στις τρεις διαστάσεις πάνω
     σε κυβικό πλέγμα. Χρησιμοποιήστε ελικοειδείς συνοριακές συνθή-
     κες και τότε θα χρειαστούν πολύ λίγες μετατροπές στον κώδικα
     (μαζί με τα XNN=1 και YNN=L θα έχετε και ZNN=L*L).
13.9. ΑΣΚΗΣΕΙΣ                                                  599

12. Γράψτε κώδικα για το πρότυπο Ising στις τρεις διαστάσεις πάνω
    σε κυβικό πλέγμα. Χρησιμοποιήστε περιοδικές συνοριακές συν-
    θήκες. [Υπόδειξη: Χρησιμοποιήστε πάλι ένα array s(N). Πριν ξε-
    κινήσει το πρόγραμμα υπολογίστε arrays XNN(-N:N), YNN(-N:N),
    ZNN(-N:N) που να δίνουν τους πλησιέστερους γείτονες της θέσης
    i από τις τιμές XNN(i), XNN(-i), YNN(i), YNN(-i), ZNN(i),
    ZNN(-i).]

13. Προσομοιώστε το αντισιδηρομαγνητικό πρότυπο Ising. Στον κώ-
    δικα που έχετε αρκεί να πάρετε αρνητικές θερμοκρασίες. Ποια
    είναι η θεμελιώδης κατάσταση;
    Ορίστε την staggered magnetization ms να είναι η μαγνήτιση ανά
    πλεγματική θέση ενός υποπλέγματος το οποίο περιέχει τα πλεγμα-
    τικά σημεία με περιττή x και y συντεταγμένη. Θέστε L = 32 και
    υπολογίστε την εξάρτηση της ενέργειας, ms , ειδικής θερμότητας
    και μαγνητικής επιδεκτικότητας χ και της staggered μαγνητικής
    επιδεκτικότητας χs = βN /4⟨(ms − ⟨ms ⟩)2 ⟩.
    Η χ παρουσιάζει ένα μέγιστο στην περιοχή β ≈ 0.4407. Υπολογίστε
    την τιμή της στη θερμοκρασία αυτή για L = 32 − 120. Δείξτε ότι
    η τιμή αυτή δεν αποκλίνει για L → ∞, άρα δεν έχουμε ένδειξη
    μετάβασης φάσης από την χ.
    Επαναλάβετε για την χs . Τι συμπεραίνετε; Συγκρίνετε τη συμπε-
    ριφορά της ⟨ms ⟩ για το αντισιδηρομαγνητικό πρότυπο Ising με την
    ⟨m⟩ του σιδηρομαγνητικού.

 14. Μετατρέψτε το πρόγραμμα boot.f90, έτσι ώστε να κάνει binning
     στα δεδομένα. Αναπαράγετε τα σχήματα 13.30 και 13.32. (Λύση:
     Το πρόγραμμα boot_bin.f90 στον υποκατάλογο Tools/ του συνο-
     δευτικού λογισμικού.)
600                                           ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING




                   1    2    3    4 5     1    2    3    4 5     1    2    3    4 5
                   6    7    8    9 10    6    7    8    9 10    6    7    8    9 10
                  11   12   13   14 15   11   12   13   14 15   11   12   13   14 15
                  16   17   18   19 20   16   17   18   19 20   16   17   18   19 20
                  21   22   23   24 25   21   22   23   24 25   21   22   23   24 25

                   1    2    3    4 5     1    2    3    4 5     1    2    3    4 5
                   6    7    8    9 10    6    7    8    9 10    6    7    8    9 10
                  11   12   13   14 15   11   12   13   14 15   11   12   13   14 15
                  16   17   18   19 20   16   17   18   19 20   16   17   18   19 20
                  21 22 23 24 25         21 22 23 24 25         21 22 23 24 25
                   1 2 3 4 5              1 2 3 4 5              1 2 3 4 5
                   6 7 8 9 10             6 7 8 9 10             6 7 8 9 10
                  11 12 13 14 15         11 12 13 14 15         11 12 13 14 15
                  16 17 18 19 20         16 17 18 19 20         16 17 18 19 20
                  21 22 23 24 25         21 22 23 24 25         21 22 23 24 25




Σχήμα 13.34: Οριζόντια κίνηση στο τετραγωνικό πλέγμα με περιοδικές συνοριακές
συνθήκες και L = 5. Η τροχιά είναι κύκλος.
13.9. ΑΣΚΗΣΕΙΣ                                                                            601




                                                                   1    2 3       4 5
                                             1    2    3    4 5     6    7    8    9 10
                      1    2    3    4 5     6    7    8    9 10   11   12   13   14 15
                      6    7    8    9 10   11   12   13   14 15   16   17   18   19 20
                     11   12   13   14 15   16   17   18   19 20   21   22   23   24 25
                     16   17   18   19 20   21   22   23   24 25    1    2    3    4 5
                     21   22   23   24 25    1    2    3    4 5     6    7    8    9 10
                      1    2    3    4 5     6    7    8    9 10   11   12   13   14 15
                      6    7    8    9 10   11   12   13   14 15   16   17   18   19 20
                     11   12   13   14 15   16   17   18   19 20   21   22   23   24 25
                     16   17   18   19 20   21   22   23   24 25    1    2    3    4 5
                     21   22   23   24 25    1    2   3     4 5     6    7    8    9 10
                      1    2    3    4 5     6    7   8     9 10   11   12   13   14 15
                      6    7    8    9 10   11   12   13   14 15   16   17   18   19 20
                     11   12   13   14 15   16   17   18   19 20   21   22   23   24 25
                     16   17   18   19 20   21   22   23   24 25
                     21   22   23   24 25




Σχήμα 13.35: Οριζόντια κίνηση στο τετραγωνικό πλέγμα με ελικοειδείς συνοριακές
συνθήκες και L = 5. Η τροχιά είναι σπείρα.
602                               ΚΕΦΑΛΑΙΟ 13. ΤΟ ΠΡΟΤΥΠΟ ISING




Σχήμα 13.36: Διατάξεις σπιν για το πρότυπο Ising με L = 400, β = 0.4292 μετά
από 4000, 9000, 12000 και 45000 sweeps αντίστοιχα. Παρατηρούμε τη δημιουργία
μεγάλων clusters από όμοια σπιν τα οποία είναι δύσκολο να καταστρέψουμε και να
δημιουργήσουμε αλλού με έναν single–flip αλγόριθμο, όπως ο Metropolis. Για το λόγο
αυτό, οι χρόνοι αυτοσυσχετισμού είναι μεγάλοι.
ΚΕΦΑΛΑΙΟ 14

Κρίσιμοι Εκθέτες

14.1       Εισαγωγή
Ήδη αναφέραμε σε προηγούμενα κεφάλαια πως ένα φυσικό σύστημα
το οποίο εμφανίζει μία συνεχή μετάβαση φάσης κατά την οποία, καθώς
β → βc ή, ισοδύναμα, καθώς η αδιάστατη ή ανηγμένη θερμοκρασία¹
                                       βc − β
                                  t≡          → 0,                             (14.1)
                                         βc
το μήκος συσχετισμού στο θερμοδυναμικό όριο ξ ≡ ξ(β, L = ∞) απειρί-
ζεται σύμφωνα με τη σχέση
                      ξ ∼ |t|−ν        (ν = 1 για 2d-Ising) ,                  (14.2)
βρίσκεται σε μία κλάση παγκοσμιότητας (universality class) η οποία χα-
ρακτηρίζεται από κρίσιμους εκθέτες. Οι κρίσιμοι εκθέτες περιγράφουν
την κύρια μη αναλυτική συμπεριφορά των φυσικών ποσοτήτων που πα-
ρουσιάζεται ασυμπτωτικά στο θερμοδυναμικό όριο² L → ∞, όταν t → 0.
Αυτό που χαρακτηρίζει μία κλάση παγκοσμιότητας είναι ότι, ενώ απο-
τελείται από συστήματα που δίνονται από διαφορετικές Χαμιλτονιανές,
τα συστήματα αυτά έχουν τους ίδιους κρίσιμους εκθέτες. Έτσι, αν στο
πρότυπο Ising αλλάξουμε την αλληλεπίδραση πλησιέστερων γειτόνων
προσθέτοντας όρους από πιο απομεμακρυσμένες πλεγματικές θέσεις
(πάντα όμως σε απόσταση ≪ ξ) ή αν αλλάξουμε την τοπολογία του
πλέγματος από τετραγωνικό σε τριγωνικό, εξαγωνικό κλπ, θα παρα-
μείνουμε στην ίδια κλάση παγκοσμιότητας. Έτσι, μπορούμε να μελε-
τήσουμε ένα πολύπλοκο φυσικό σύστημα στην περιοχή της μετάβασης
   ¹Συνήθως στη βιβλιογραφία ορίζεται t = (T −Tc )/Tc , αλλά για t ≪ 1, οι δύο ορισμοί
είναι σχεδόν ισοδύναμοι (διαφέρουν κατά ένα όρο ∼ t2 ).
   ²Προσοχή: πρώτα L → ∞ και μετά t → 0.


                                         603
604                              ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

φάσης χρησιμοποιώντας το απλούστερο δυνατόν μοντέλο που ανήκει
στην ίδια κλάση παγκοσμιότητας. Για παράδειγμα, η μετάβαση φάσης
υγρό/ατμός κοντά στο τρικρίσιμο σημείο ανήκει στην ίδια κλάση πα-
γκοσμιότητας με το πρότυπο Ising στο επίπεδο.
   Στο πρότυπο Ising είδαμε στο Κεφάλαιο 12 τους κρίσιμους εκθέτες

                          χ ∼ |t|−γ ,      γ = 7/4 ,                   (14.3)

                        c ∼ |t|−α ,      α=0           και             (14.4)

                    ⟨m⟩ ∼ |t|β        t < 0,         β = 1/8 .         (14.5)
Η παραπάνω συμπεριφορά παρουσιάζεται, μόνο όταν L → ∞. Για πε-
περασμένο πλέγμα όλες οι ποσότητες είναι αναλυτικές, αφού υπολογί-
ζονται από την αναλυτική συνάρτηση επιμερισμού Z που δίνεται από
την (13.4). Στο πεπερασμένο πλέγμα όσο 1 ≪ ξ ≪ L, το μοντέλο συμπε-
ριφέρεται (προσεγγιστικά) όπως το άπειρο σύστημα ενώ καθώς β ≈ βc
και το ξ ∼ L, παρουσιάζονται φαινόμενα επίδρασης του πεπερασμέ-
νου μεγέθους (finite size effects). Οι διακυμάνσεις χ, c στο πεπερασμένο
πλέγμα παρουσιάζουν μέγιστο για μια ψευδοκρίσιμη θερμοκρασία βc (L)
η οποία φυσικά³
                             lim βc (L) = βc .                   (14.6)
                              L→∞

Θυμίζουμε στον αναγνώστη ότι για το πρότυπο Ising στο√τετραγωνικό
πλέγμα που δίνεται από την (13.14) έχουμε βc = log(1 + 2)/2.
   Για β = βc (L), λόγω της (14.2), έχουμε ξ(t, L) ∼ L ⇒ |t| = |(βc − βc (L))/βc |
∼ L−1/ν οπότε οι σχέσεις (14.3)–(14.5) γίνονται

                                  χ ∼ Lγ/ν ,                           (14.7)


                              c ∼ Lα/ν         και                     (14.8)

                                 m ∼ L−β/ν .                           (14.9)
Τονίζουμε ότι οι παραπάνω σχέσεις αφορούν όλη την ψευδοκρίσιμη πε-
ριοχή, οπότε στην πράξη μπορούμε να πάρουμε είτε τις τιμές των ποσο-
τήτων, όταν β = βc (L) είτε όταν β = βc ⁴. Στις επόμενες παραγράφους θα
   ³Κάθε φυσική ποσότητα μπορεί να έχει (ελαφρά) διαφορετική ψευδοκρίσιμη θερ-
μοκρασία οπότε μπορεί να γράφουμε βcχ (L), βcc (L).
   ⁴Στο όριο L → ∞ η διαφορά δεν έχει σημασία. Η ταχύτητα σύγκλισης στις ασυμ-
πτωτικές αυτές σχέσεις μπορεί να διαφέρει.
14.2. ΚΡΙΣΙΜΗ ΕΠΙΒΡΑΔΥΝΣΗ                                                    605

δείξουμε πώς να υπολογίσουμε τους κρίσιμους εκθέτες από τις σχέσεις
(14.3)–(14.5) και (14.7)–(14.9).


14.2      Κρίσιμη Επιβράδυνση
Η μελέτη των κρίσιμων εκθετών απαιτεί προσομοιώσεις ακριβείας, άρα
και υψηλής στατιστικής. Ο αλγόριθμος Metropolis που αναπτύχθηκε
στο προηγούμενο κεφάλαιο πάσχει από κρίσιμη επιβράδυνση (critical
slowing down) στην κρίσιμη περιοχή αλλαγής φάσης και είναι αδύνα-
τον να μελετήσουμε αρκετά μεγάλα πλέγματα για την εξαγωγή απο-
τελεσμάτων ακριβείας. Στο κεφάλαιο αυτό, θα αναλύσουμε τους λό-
γους εμφάνισης και τις δυσκολίες που παρουσιάζει το φαινόμενο αυτό
στις προσομοιώσεις Monte Carlo. Θα παρουσιάσουμε τον αλγόριθμο
του Wolff που σχεδόν εξαλείφει το φαινόμενο. Αλγόριθμοι σαν και αυ-
τόν βασίζονται στη μερική κατανόηση της δυναμικής των μοντέλων που
μελετούμε και έχουν ειδική εφαρμογή σε αντίθεση με τον αλγόριθμο
Metropolis που εφαρμόζεται σε όλα τα συστήματα στατιστικής φυσικής
και έχει γενική εφαρμογή.
    Όπως συζητήσαμε στην ενότητα 13.5, η προσομοίωση του πρότυπου
Ising στην κρίσιμη περιοχή αλλαγής φάσης με τον αλγόριθμο Metropolis
παρουσιάζει μεγάλη αύξηση του χρόνου αυτοσυσχετισμού που δίνεται
από τη σχέση βάθμισης
                               τ ∼ ξz .                      (14.10)
Στην ψευδοκρίσιμη περιοχή το μήκος συσχετισμού γίνεται ξ ∼ L και
παίρνουμε τη σχέση (13.39) τ ∼ Lz . Όταν z > 0, έχουμε το φαινόμενο
της κρίσιμης επιβράδυνσης στην προσομοίωση.
   Εδώ αξίζει να αναφέρουμε ότι το φαινόμενο αυτό είναι που ουσια-
στικά περιορίζει τη δυνατότητα που έχουμε να προσομοιώσουμε συ-
στήματα με πολύ μεγάλο L από την άποψη του διαθέσιμου tCPU ⁵. Όταν
μετράμε μια τοπική ποσότητα, όπως η μαγνήτιση ανά πλεγματική θέση
⟨m⟩, η αύξηση του L αυξάνει τον χρόνο⁶ tCPU ∼ Ld , αλλά ταυτόχρονα
οι μετρήσεις που παίρνουμε για την ⟨m⟩ αυξάνουν με τον ίδιο ρυθμό.
Άρα, αν σε κάθε sweep του πλέγματος παίρναμε μία στατιστικά ανε-
ξάρτητη διάταξη των σπιν, τότε δε θα είχαμε επιπλέον κόστος για μια
δεδομένης ακρίβειας μέτρηση, αφού με την αύξηση του L το αυξημένο

   ⁵Φυσικά, το μέγεθος της μνήμης είναι ο άλλος σημαντικός παράγοντας που θα βάλει
φραγμό στις προσομοιώσιμες τιμές του L.
   ⁶d = 2 στην περίπτωση του πρότυπου Ising στο επίπεδο, αλλά το επιχείρημα ισχύει
και για περισσότερες διαστάσεις d > 2.
606                             ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

κόστος παραγωγής της διάταξης θα αντισταθμιζόταν από τα περισ-
σότερα σπιν πάνω στα οποία θα μετρήσουμε την ⟨m⟩ και θα είχαμε
για τον χρόνο συλλογής δεδομένης στατιστικής για τη μαγνήτιση ανά
                 ⟨m⟩
πλεγματική θέση tCPU ∼ L0 = 1. Οπότε θα μας συνέφερε η μέτρηση
στο μεγαλύτερο δυνατόν L, ώστε να ελαχιστοποιήσουμε τα φαινόμενα
επίδρασης του πεπερασμένου μεγέθους του πλέγματος.
   Η παρουσία κρίσιμης επιβράδυνσης, όμως, προσθέτει το κόστος πα-
                                                 ⟨m⟩
ραγωγής ανεξάρτητων μετρήσεων και παίρνουμε tCPU ∼ Lz με απο-
τέλεσμα για κάποια τιμή του L να γίνεται απαγορευτικά ακριβό να
προσομοιώσουμε μεγαλύτερο σύστημα. Στη συγκεκριμένη περίπτωση
που μελετάμε, το πρότυπο Ising στο επίπεδο με τον αλγόριθμο Metro-
polis, z ≈ 2.17 και το πρόβλημα αυτό παρουσιάζεται πολύ γρήγορα.
Είναι ιδιαίτερα ενδιαφέρον να αναζητηθούν αλγόριθμοι που να ελαχι-
στοποιούν το φαινόμενο και στην περίπτωση του πρότυπου Ising, αλλά
και άλλων μοντέλων με σπιν η λύση είναι αρκετά απλή. Όπως θα δούμε
όμως, η λύση προκύπτει από τη βαθύτερη κατανόηση της δυναμικής που
προκαλεί το φαινόμενο της κρίσιμης επιβράδυνσης και αφορά μόνο τα
πρότυπα εκείνα με παρόμοια δυναμική δομή⁷.
   Ο λόγος που παρουσιάζεται το φαινόμενο της κρίσιμης επιβράδυνσης
είναι η αύξηση του μήκους συσχετισμού ξ στην κρίσιμη περιοχή. Καθώς
πλησιάζουμε την κρίσιμη θερμοκρασία β → βc− από τη φάση αταξίας
των σπιν, δημιουργούνται στο πλέγμα μεγάλες περιοχές όπου τα σπιν
δείχνουν προς την ίδια κατεύθυνση. Η επικράτηση των περιοχών αυ-
τών είναι αυτή που τελικά θα οδηγήσει το σύστημα στη φάση τάξης με
μη μηδενική μαγνήτιση ανά πλεγματική θέση στο θερμοδυναμικό όριο.
Ο αλγόριθμος Metropolis επιχειρεί την αλλαγή των σπιν ένα–ένα, κάτι
το οποίο είναι δύσκολο ειδικά για σπιν μέσα στις περιοχές αυτές. Για
ένα σπιν με τέσσερις γείτονες που έχουν σπιν στην ίδια κατεύθυνση με
αυτό, η αλλαγή γίνεται δεκτή με πιθανότητα ∼ e−8βc ≈ 0.029, η οποία
είναι πολύ μικρή. Τα περισσότερα σπιν στα οποία η αλλαγή γίνεται
δεκτή βρίσκονται στα όρια των περιοχών αυτών και η αλλαγή από μία
διάταξη σε μια άλλη όπου οι περιοχές αυτές βρίσκονται σε ανεξάρτη-
τες θέσεις και έχουν ανεξάρτητα σχήματα απαιτεί μεγάλο χρόνο: Μια
περιοχή δημιουργείται/καταστρέφεται (στοχαστικά φυσικά) μετακινώ-
ντας το σύνορό της.



   ⁷Ενώ, αντίθετα, ο αλγόριθμος Metropolis έχει γενική εφαρμογή στα περισσότερα
συστήματα της στατιστικής φυσικής.
14.3. Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ WOLFF                                               607

14.3      Ο Αλγόριθμος του Wolff
Για τη βελτίωση της επίδρασης του φαινομένου της κρίσιμης επιβράδυν-
σης είναι ανάγκη να επινοηθούν αλγόριθμοι όπου θα μπορεί κανείς σε
ένα βήμα να αλλάξει την τιμή των σπιν σε περιοχές συγκρίσιμες με τις
μεγάλες περιοχές όμοιων σπιν. Οι περιοχές αυτές από κατάλληλα επι-
λεγμένα όμοια σπιν ονομάζονται τα clusters του αλγόριθμου. Το πρώτο
βήμα έγινε με τον αλγόριθμο Swendsen-Wang [62], ενώ αργότερα πα-
ρουσιάστηκε και ο αλγόριθμος του Uli Wolff [63].




               µ                                              ν
Σχήμα 14.1: Οι δύο διατάξεις των σπιν που προκύπτουν από την αλλαγή των σπιν
ενός Wolff cluster. Φαίνονται οι δεσμοί που δημιουργούνται/καταστρέφονται κατά τη
μετάβαση οι οποίοι βρίσκονται στο σύνορο του cluster.



   Από την ιδέα που παρουσιάσαμε προκύπτει ότι η διαδικασία κατα-
σκευής των clusters πρέπει να είναι στοχαστική και να εξαρτάται από
τη θερμοκρασία. Σε ψηλές θερμοκρασίες β ≪ βc πρέπει να ευνοείται η
κατασκευή μικρών clusters με μέγεθος ίσο με μερικές πλεγματικές στα-
θερές, ενώ σε χαμηλές θερμοκρασίες β ≫ βc να ευνοείται η κατασκευή
μεγάλων clusters με μέγεθος ∼ L.
   Η βασική ιδέα στον αλγόριθμο του Wolff είναι να επιλέξουμε έναν
σπιν-“σπόρο” (γεννήτορα, seed) και να κατασκευάσουμε ένα cluster
γύρω από αυτόν. Σε κάθε βήμα προσθέτουμε μέλη στο cluster με πιθα-
νότητα Padd = Padd (β). Με κατάλληλα επιλεγμένη Padd (β) το cluster θα
αναπτύσσεται με τον αναμενόμενο τρόπο και θα ικανοποιείται η συν-
θήκη λεπτομερούς ισορροπίας (12.59). Η σχέση φαίνεται γραφικά στο
σχήμα 14.1. Στην κατάσταση µ το cluster περιγράφεται από τη διακε-
κομμένη γραμμή. Η νέα κατάσταση ν είναι αυτή όπου όλα τα σπιν του
608                           ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

cluster αντιστρέφονται, ενώ όλα τα σπιν στις πλεγματικές θέσεις εκτός
του cluster μένουν τα ίδια.
   Η κατάλληλη επιλογή της Padd θα μας δώσει τη σχέση (12.60)
                        P (µ → ν)
                                  = e−β(Eν −Eµ ) ,              (14.11)
                        P (ν → µ)
και η συζήτηση που θα ακολουθήσει βασίζεται στην πολύ απλή από-
δειξη που βρίσκεται στο βιβλίο των Newman και Barkema [4]. Η κρί-
σιμη παρατήρηση είναι πως η μεταβολή της ενέργειας στο δεξί μέλος
της (14.11) οφείλεται στο σπάσιμο/δημιουργία δεσμών στο σύνορο του
cluster, αφού στο εσωτερικό του δεν μεταβάλλονται οι δεσμοί από όμοια
σπιν, ενώ εκτός του cluster δεν επέρχεται καμιά μεταβολή. Αυτό μπο-
ρείτε να το δείτε στο απλό παράδειγμα του σχήματος 14.1. Με κατάλ-
ληλη επιλογή πιθανότητας επιλογής g(µ → ν) της κατάστασης ν και του
λόγου αποδοχής A(µ → ν), έτσι ώστε
                   P (µ → ν) = g(µ → ν) A(µ → ν) ,              (14.12)
θα πετύχουμε να ισχύει η (14.11) και να μεγιστοποιηθούν οι λόγοι απο-
δοχής. Μάλιστα, στην περίπτωσή μας, θα βρούμε ότι A(µ → ν) = 1!
   Η πιθανότητα επιλογής g(µ → ν) είναι η πιθανότητα να κατασκευά-
σουμε το συγκεκριμένο cluster και σπάει σε 3 όρους από ανεξάρτητες
επιλογές:
                   g(µ → ν) = pseed × pint
                                        yes × pno
                                               border
                                                              (14.13)
   Ο πρώτος όρος είναι η πιθανότητα να ξεκινήσουμε το cluster από το
συγκεκριμένο seed. Επιλέγοντας με ομοιόμορφη πιθανότητα μια πλεγ-
ματική θέση έχουμε
                                          1
                                  pseed =   .                   (14.14)
                                          N
   Στη συνέχεια, το cluster αναπτύσσεται γύρω από τον γεννήτορά του.
Ο δεύτερος όρος pint
                   yes είναι η πιθανότητα να ενσωματώσουμε όλα τα μέλη
του cluster. Η πιθανότητα αυτή είναι πολύπλοκη σχέση του μεγέθους και
σχήματος του cluster, αλλά ευτυχώς δεν είναι σημαντική στον υπολογι-
σμό μας. Ο λόγος είναι ότι κατά τη μετάβαση ν → µ ο αντίστοιχος όρος
είναι ακριβώς ο ίδιος, αφού τα δύο cluster είναι ακριβώς τα ίδια (έχουν
μόνο αντίθετα σπιν)!

                    yes (µ → ν) = pyes (ν → µ) ≡ Cµν .
                   pint            int
                                                                (14.15)
   Ο τρίτος όρος είναι ο πιο ενδιαφέρων. Το cluster σταματάει την ανά-
πτυξή του όταν στις θέσεις πάνω στο σύνορο του πούμε “όχι” στην εν-
σωμάτωση των γειτονικών όμοιων σπιν (τα αντίθετα σπιν, προφανώς,
14.3. Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ WOLFF                                            609

δεν ενσωματώνονται). Αν Padd είναι η πιθανότητα να πούμε “ναι” στην
ενσωμάτωση, η πιθανότητα να πούμε “όχι” είναι 1−Padd . Ας υποθέσουμε
πως τα γειτονικά με το cluster όμοια σπιν στην κατάσταση µ είναι m,
ενώ στην κατάσταση ν είναι n. Λ.χ. στο σχήμα 14.1 m = 5 και n = 7.
Άρα, η πιθανότητα να σταματήσουμε το cluster της κατάστασης µ στο
σύνορό που φαίνεται στο σχήμα είναι να πούμε “όχι” m φορές, κάτι που
γίνεται με πιθανότητα (1 − Padd )m :

                         pborder
                          no     (µ → ν) = (1 − Padd )m .            (14.16)

Ανάλογα, το cluster στην κατάσταση ν σταματάει στο ίδιο σύνορο με
πιθανότητα
                     pborder
                      no     (ν → µ) = (1 − Padd )n .      (14.17)
Τελικά, παίρνουμε

     P (µ → ν)      1
                        Cµν (1 − Padd )m A(µ → ν)
               =    N
                                                  = e−β(Eν −Eµ ) .   (14.18)
     P (ν → µ)      1
                    N
                        Cµν (1 − Padd )n A(ν → µ)
Το δεξί μέλος της παραπάνω εξίσωσης εξαρτάται πάλι μόνο από τους
δεσμούς στο σύνορο του cluster. Οι εσωτερικοί δεσμοί δε συνεισφέρουν,
οπότε η μεταβολή στην ενέργεια οφείλεται μόνο στη δημιουργία/κατα-
στροφή των δεσμών στο σύνορο. Κάθε δεσμός που δημιουργείται στο
σύνορο κατά τη μετάβαση µ → ν μειώνει την ενέργεια κατά 2, ενώ κάθε
δεσμός που σπάει την αυξάνει κατά 2:

                 Eν − Eµ = (−2n) − (−2m) = 2(m − n) ,                (14.19)

οπότε παίρνουμε
            A(µ → ν)               A(µ → ν) [ 2β           ]n−m
(1 − Padd )m−n       = e−2β(m−n) ⇒          = e (1 − Padd )     .
            A(ν → µ)               A(ν → µ)
                                                           (14.20)
Από την παραπάνω σχέση βλέπουμε ότι αν επιλέξουμε

                    1 − Padd = e−2β ⇒ Padd = 1 − e−2β ,              (14.21)

μπορούμε επίσης να επιλέξουμε

                          A(µ → ν) = A(ν → µ) = 1 !                  (14.22)

Άρα, μπορούμε να έχουμε τη συνθήκη (14.11) να ισχύει φτιάχνοντας το
cluster με την Padd της (14.21), κάνοντας πάντα τη νέα κατάσταση που
προκύπτει δεκτή στο επόμενο βήμα του Μόντε Κάρλο.
   Συνοψίζοντας, ένα βήμα του αλγόριθμου Wolff γίνεται ως εξής:
610                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

  1. Επιλέγουμε με ομοιόμορφη πιθανότητα pseed = N1 μία πλεγματική
     θέση που θα είναι ο γεννήτορας (seed) του cluster. Είναι το πρώτο
     νέο μέλος του cluster.

  2. Επαγωγικά: Για κάθε νέο μέλος του cluster επισκεπτόμαστε τους
     πλησιέστερους γείτονές του που δεν ανήκουν ήδη στο cluster. Αν
     το σπιν τους είναι ίδιο με αυτό των μελών του cluster, τους προ-
     σθέτουμε στα “νέα μέλη” με πιθανότητα Padd . Το αρχικό σπιν είναι
     πια “παλιό μέλος”.

  3. Όταν τελειώσουν τα “νέα μέλη”, η διαδικασία ανάπτυξης του clu-
     ster σταματάει.

  4. Αλλάζουμε την τιμή του σπιν κάθε μέλους του cluster.

Ο αλγόριθμος είναι εργοδικός, αφού από μια οποιαδήποτε κατάσταση
μπορούμε να πάμε σε μία άλλη με μια σειρά από clusters μεγέθους
1 (ισοδύναμο με single-flip). Η πιθανότητα Padd εξαρτάται από τη θερ-


               1


              0.8


              0.6
      <n>/N




              0.4


              0.2


               0
                    0       0.2       0.4        0.6       0.8         1
                                            β
Σχήμα 14.2: Η εξάρτηση του μεγέθους των Wolff clusters από τη θερμοκρασία. Φαί-
νεται το μέσο μέγεθος ενός Wolff cluster σε σχέση με το μέγεθος του πλέγματος. Σε
μεγάλες θερμοκρασίες β ≪ βc αυτό είναι ∼ 1/N , ενώ όταν η θερμοκρασία γίνεται πολύ
μικρή β ≫ βc γίνεται ∼ 1. Τα δεδομένα είναι για το πρότυπο Ising στο τετραγωνικό
πλέγμα για L = 40.
14.3. Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ WOLFF                                                  611

μοκρασία β και είναι μικρή για μεγάλες θερμοκρασίες (β ≪ βc ) και
σχεδόν 1, όταν η θερμοκρασία τείνει στο μηδέν (β ≫ βc ). Άρα, στην
πρώτη περίπτωση ο αλγόριθμος φτιάχνει πολύ μικρά clusters (μεγέ-
θους 1 για β = 0), ενώ μεγάλα στη δεύτερη. Άρα, στις μεγάλες θερ-
μοκρασίες έχουμε σχεδόν τυχαία spin flips όπως και στον αλγόριθμο
Metropolis, ενώ στις μικρές θερμοκρασίες (μεγάλο β) ο αλγόριθμος έχει
μεγάλη πιθανότητα να αλλάξει το cluster που επικρατεί στο πλέγμα.
Αυτό φαίνεται καθαρά στο σχήμα 14.2 όπου υπολογίζουμε το ποσο-
στό του πλέγματος που καλύπτεται από το τυπικό Wolff cluster ⟨n⟩/N
ως συνάρτηση της θερμοκρασίας. Για μικρά β, ⟨n⟩/N → 1/N , ενώ για
μεγάλα ⟨n⟩/N → 1.




Σχήμα 14.3: Μία τυπική διάταξη των σπιν στη φάση αταξίας (αριστερά, β = 0.25) και
τάξης (δεξιά, β = 0.5556) για το πρότυπο Ising στο τετραγωνικό πλέγμα για L = 100.




   Στο σχήμα 14.3 βλέπουμε τυπικές διατάξεις των σπιν σε μικρές και
μεγάλες θερμοκρασίες. Για μικρά β, ο αλγόριθμος Wolff επιλέγει τυ-
χαία πλεγματική θέση, φτιάχνει (συνήθως) ένα μικρό cluster και του
αλλάζει την τιμή των σπιν. Ο αλγόριθμος Metropolis επιλέγει τυχαία
πλεγματική θέση και με μεγάλη πιθανότητα της αλλάζει το σπιν. Το
αποτέλεσμα είναι η (σχεδόν) τυχαία κατανομή των σπιν όπως αναμένε-
ται στη φάση αταξίας. Για μεγάλα β, οι διατάξεις των σπιν “παγώνουν”
με μικρές θερμικές διακυμάνσεις σκορπισμένες στο πλέγμα. Ο αλγόριθ-
μός του Wolff τυπικά επιλέγει για seed μία πλεγματική θέση στο cluster
που επικρατεί στο πλέγμα και το νέο cluster είναι με μεγάλη πιθανό-
τητα σχεδόν όλο το προηγούμενο. Με την αλλαγή της τιμής των σπιν,
όλες οι θερμικές διακυμάνσεις των αντίθετων σπιν ενσωματώνονται στο
νέο cluster. Νέες θερμικές διακυμάνσεις προκύπτουν από τα (λίγα και
612                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

σκόρπια) spin που δεν ενσωματώθηκαν στο νέο cluster. Ο αλγόριθμος
Metropolis επιλέγει τυχαίες θέσεις στο πλέγμα και αλλάζει με μικρή
πιθανότητα τα σπιν μέσα στο μεγάλο cluster, ενώ εξαφανίζει με πιθα-
νότητα 1 τις θερμικές διακυμάνσεις. Οι δύο αλγόριθμοι λειτουργούν με
όμοια αποτελεσματικότητα.




Σχήμα 14.4: Δύο τυπικές διατάξεις των σπιν στην (ψευδο)κρίσιμη περιοχή (β = 0.4348)
για το πρότυπο Ising στο τετραγωνικό πλέγμα για L = 100. Οι δύο διατάξεις “απέ-
χουν” 5000 sweeps χρησιμοποιώντας τον αλγόριθμο Metropolis.



   Στο σχήμα 14.3 βλέπουμε τυπικές διατάξεις των σπιν στην ψευδο-
κρίσιμη περιοχή. Αυτές κυριαρχούνται από cluster μεγάλου μεγέθους
με τυχαίο σχήμα, μέγεθος και κατανομή θέσης στο πλέγμα. Ο αλγό-
ριθμος Wolff φτιάχνει με μεγάλη πιθανότητα μεγάλα clusters, με απο-
τέλεσμα μεγάλα cluster να καταστρέφονται και να δημιουργούνται σε
χρόνο ανάλογο με το μέγεθος των cluster (στο σχήμα 14.2 βλέπουμε ότι
⟨n⟩/N ≈ 0.5). Αντιθέτως, ο αλγόριθμος Metropolis αλλάζει τα cluster
κυρίως μεταβάλλοντας το σχήμα τους στο σύνορο, με αποτέλεσμα να
χρειάζονται πολλά sweeps για την καταστροφή μιας διάταξης από spin
clusters και τη δημιουργία μιας νέας και στατιστικά ανεξάρτητης από
την προηγούμενη. Αναμένεται λοιπόν δραστική μείωση του χρόνου αυ-
τοσυσχετισμού στην ψευδοκρίσιμη περιοχή με τη χρήση του αλγόριθμου
του Wolff.
   Η μέση τιμή του μεγέθους των Wolff clusters είναι μια δυναμική
ποσότητα. Για να το δούμε αυτό καθαρά θα δείξουμε ότι στη φάση
αταξίας (β < βc ) ισχύει
                              χ = β⟨n⟩ .                     (14.23)
   Παρουσιάζουμε την απόδειξη από τους Newmann και Barkema [4]:
Αντί να κατασκευάσουμε ένα Wolff cluster, επισκεπτόμαστε κάθε ζευ-
γάρι από πλεγματικές θέσεις και αν έχουν το ίδιο σπιν, τότε δημιουρ-
14.3. Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ WOLFF                                                                      613

γούμε μεταξύ τους έναν δεσμό με πιθανότητα Padd = 1 − e−2β . Όταν
τελειώσει η διαδικασία, το πλέγμα έχει χωριστεί σε Nc Wolff⁸ clusters
κάθε ένα από τα οποία έχει ni μέλη και σπιν Si . Επιλέγουμε τυχαία μία
πλεγματική θέση και αλλάζουμε το σπιν του cluster στο οποίο ανήκει.
Καταστρέφουμε τους δεσμούς και επαναλαμβάνουμε τη διαδικασία⁹. Η
συνολική μαγνήτιση τότε είναι:
                                               ∑
                                               Nc
                                         M=          Si n i ,                                (14.24)
                                               i=1

και
              (N              )( N         )
               ∑ c              ∑ c                  ∑                          ∑
 ⟨M 2 ⟩ = ⟨          Si n i            Sj nj ⟩ = ⟨          Si Sj ni nj ⟩ + ⟨       Si2 n2i ⟩ . (14.25)
               i=1               j=1                 i̸=j                       i

Οι τιμές Si = ±1 είναι ισοπίθανες λόγω της συμμετρίας του μοντέλου,
άρα ο πρώτος όρος είναι μηδέν. Επειδή Si2 = 1, παίρνουμε τελικά
                            1          1 ∑ 2
                    ⟨m2 ⟩ = 2 ⟨M 2 ⟩ = 2 ⟨   ni ⟩ .           (14.26)
                           N          N    i

   Στον αλγόριθμο Wolff η κατασκευή ενός cluster ισοδυναμεί με την
επιλογή ενός από τα cluster που φτιάξαμε παραπάνω. Σύμφωνα με τα
παραπάνω (τυχαία επιλογή πλεγματικής θέσης και αλλαγή του σπιν στο
cluster που ανήκει), η πιθανότητα επιλογής του cluster i είναι
                                                   ni
                                            pi =      ,                                       (14.27)
                                                   N
άρα, η μέση τιμή των Wolff clusters θα είναι
                        ∑              ∑ ni
                ⟨n⟩ = ⟨   p i ni ⟩ = ⟨      ni ⟩ = N ⟨m2 ⟩ .                                 (14.28)
                        i              i
                                         N

Χρησιμοποιώντας τη Σχέση (14.26) και το γεγονός ότι για β < βc έχουμε
⟨m⟩ = 0¹⁰, παίρνουμε τελικά
                               χ = βN (⟨m2 ⟩ − ⟨m⟩2 ) = β⟨n⟩ .                               (14.29)
    ⁸Αυτά είναι πραγματικά Wolff clusters, αφού οι δεσμοί ενεργοποιήθηκαν με τη
σωστή πιθανότητα. Υπάρχουν φυσικά και απομονωμένες πλεγματικές θέσεις, χωρίς
ενεργοποιημένους δεσμούς. Αυτές αποτελούν Wolff clusters μεγέθους 1.
    ⁹Αυτό είναι ισοδύναμο ως προς το αποτέλεσμα με τον αλγόριθμο Wolff, φυσικά όχι
με τον πιο ... αποδοτικό τρόπο.
   ¹⁰Αυτό ισχύει στο θερμοδυναμικό όριο, για πεπερασμένο πλέγμα οι δύο ποσότητες
θα διαφέρουν κατά τον παράγοντα βN ⟨m⟩2 > 0, η διαφορά αυτή, όμως, εξαφανίζεται,
καθώς το μέγεθος του πλέγματος απειρίζεται.
614                           ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

14.4 Σχεδιασμός Κώδικα
Στην παράγραφο αυτή θα σχεδιάσουμε την υλοποίηση του αλγόριθμου
Wolff όπως αυτός παρουσιάστηκε στη σελίδα 609. Για να αναπτύξουμε
ένα cluster γύρω από το seed που επιλέγεται, θα χρειαστεί να χρη-
σιμοποιηθεί μια βοηθητική θέση στη μνήμη (buffer) από την οποία θα
ανασύρουμε τα νέα μέλη του cluster για να εξετάσουμε αν θα προσθέ-
σουμε στο cluster τους πλησιέστερους γείτονές τους. Κάθε πλεγματική
θέση που θα προσθέτουμε θα αποθηκεύεται στο buffer για να εξεταστεί
με τη σειρά του αργότερα.
    Υπάρχουν δύο τέτοιες δομές δεδομένων που αρκούν για τη δουλειά
που θέλουμε να κάνουμε. Η πρώτη είναι το stack (ή LIFO: last in – first
out) και η δεύτερη το queue (ή FIFO: first in – first out). Kαι οι δύο
είναι arrays στα οποία η διαφορά είναι το πώς ανασύρουμε τα δεδομένα
από αυτά. Αυτό γίνεται ακριβώς όπως λέει και το όνομά τους. Στο
stack, όταν ανασύρουμε ένα στοιχείο, παίρνουμε αυτό που είχαμε βάλει
τελευταίο. Στο queue, όταν ανασύρουμε ένα στοιχείο, παίρνουμε αυτό
που είχαμε βάλει πρώτο.
    Το stack υλοποιείται από ένα μονοδιάστατο array stack(0:N-1) στο
οποίο “σπρώχνουμε” (push) μια νέα τιμή και “αντλούμε” (pop) μια τιμή
που θέλουμε να χρησιμοποιήσουμε. Για τη χρήση αυτή χρειαζόμαστε
έναν ακέραιο m ίσο με τα ενεργά στοιχεία στο stack. Το στοιχείο που θα
αντλήσουμε ανά πάσα στιγμή είναι το stack(m-1). Για να σπρώξουμε
ένα στοιχείο e στο stack ακολουθούμε τα εξής βήματα:
  1. Ελέγχουμε αν το stack έχει άδειες θέσεις (m<N).

  2. Θέτουμε stack(m) = e.

  3. Αυξάνουμε το m κατά 1.
Αντίθετα, για να τραβήξουμε μια τιμή και να την αποθηκεύσουμε στη
μεταβλητή e, κάνουμε τα εξής:
  1. Ελέγχουμε αν το stack περιέχει στοιχεία (m>0).

  2. Μειώνουμε το m κατά 1.

  3. Θέτουμε e = stack(m).
   Η υλοποίηση του queue γίνεται διαφορετικά. Η τοπολογία της διάτα-
ξης των στοιχείων είναι κυκλική αντί για γραμμική, όπως φαίνεται στο
σχήμα 14.5. Χρησιμοποιούμε ένα array queue(0:N-1) και δύο ακέραιους
m, n να δείχνουν την αρχή και τέλος του buffer. Η αρχή των δεδομένων
14.4. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                          615

                                             queue(0)
                                queue(N−1)
                                                        queue(1)
                       queue(N−2)
                                                               queue(2)
                   queue(N−3)
                                                                   queue(3)

                                                                      queue(4)




Σχήμα 14.5: Η τοπολογία των δεδομένων στο queue. Στο εικονιζόμενο array έχουμε 8
στοιχεία αποθηκευμένα στο queue(N-3) ... queue(4). Έχουμε m=5, n=N-3, m-n = 8
mod N. Ένα στοιχείο προστίθεται στο queue(m)=queue(5) και ένα στοιχείο ανασύρεται
διαβάζοντας το queue(n)=queue(N-3).



είναι το στοιχείο queue(m-1), ενώ το τέλος το queue(n). Όταν το queue
είναι άδειο m=n ενώ το ίδιο ισχύει και όταν είναι γεμάτο. Άρα, θα χρεια-
στούμε και μια μεταβλητή flag στην οποία αρχικά θα δώσουμε την τιμή
0 (άδειο queue)¹¹. Ο αριθμός (m-n) mod N είναι ο αριθμός των αποθη-
κευμένων στοιχείων¹². Όταν το queue περιέχει δεδομένα θα παίρνει την
τιμή 1. Άρα, για να προσθέσουμε ένα στοιχείο e στο queue ακολουθούμε
τα εξής βήματα:
  1. Ελέγχουμε αν το stack είναι γεμάτο (m=n και flag=1).

  2. Θέτουμε flag=1.

  3. Θέτουμε queue(m) = e.

  4. Αυξάνουμε το m κατά 1 mod N .
Για να τραβήξουμε μια τιμή και να την αποθηκεύσουμε στη μεταβλητή
e κάνουμε τα εξής:
  1. Ελέγχουμε αν το stack είναι άδειο (m=n και flag=0).

  2. Θέτουμε e = queue(n).

  3. Αυξάνουμε το n κατά 1 mod N .
  ¹¹Αν επιλέξουμε να αποθηκεύουμε το πολύ N-1 στοιχεία στο queue(N), τότε ο αλ-
γόριθμος απλοποιείται (άσκηση).
  ¹²Εκτός αν m=n, οπότε είναι 0 ή N ανάλογα με την τιμή της flag.
616                           ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

  4. Αν m=n θέτουμε flag=0.
    Συνοψίζοντας, η αλγοριθμική διαδικασία κατασκευής ενός Wolff clu-
ster στην περίπτωση του πρότυπου Ising είναι η εξής:
  1. Επιλέγουμε ένα seed από το πλέγμα με πιθανότητα 1/N .

  2. Ελέγχουμε τους πλησιέστερους γείτονές του. Αν έχουν το ίδιο
     σπιν, τους προσθέτουμε στο cluster με πιθανότητα Padd = 1 − e−2β .
     Τα σπιν που προσθέτουμε (“νέα μέλη”) αποθηκεύονται στο array
     stack(0:N-1) σύμφωνα με τα παραπάνω.

  3. Ανασύρουμε μία πλεγματική θέση από το stack(0:N-1). Αν είναι
     άδειο, προχωρούμε στο επόμενο βήμα. Ελέγχουμε τους πλησιέστε-
     ρους γείτονές της. Αν δεν είναι ήδη στο cluster και έχουν το ίδιο
     σπιν, τους προσθέτουμε στο cluster με πιθανότητα Padd .

  4. Σημειώνουμε το μέγεθος του cluster και αλλάζουμε το σπιν του.
    Η επιλογή stack ή queue δεν έχει ουσιαστική διαφορά. Τα αποτελέ-
σματα είναι ίδια και δεν υπάρχουν σημαντικές διαφορές στην ταχύτητα.
Η διαφορά είναι μόνο στον τρόπο που αναπτύσσονται τα clusters (για
stack το cluster αναπτύσσεται σπειροειδώς γύρω από το seed, ενώ για
queue το cluster αναπτύσσεται πρώτα σε μία διεύθυνση και μετά στην
άλλη). Ο προσεκτικός προγραμματιστής θα δοκιμάσει και τις δύο, ώστε
να ελέγξει τα αποτελέσματά του για λάθη στον κώδικα. Πιο σημαντικός
λόγος είναι να ελέγξει την ποιότητα της γεννήτριας τυχαίων αριθμών,
αφού ο αλγόριθμος του Wolff είναι ιδιαίτερα ευαίσθητος στις ατέλειές
τους.


14.4.1 Ο Κώδικας
Στην παράγραφο αυτή θα παρουσιάσουμε και θα αναλύσουμε τον κώ-
δικα που θα χρησιμοποιήσουμε στην προσομοίωση του πρότυπου Ising
με τον αλγόριθμο Wolff.
    Η καρδιά του αλγόριθμου βρίσκεται στην υπορουτίνα wolff() την
οποία αποθηκεύουμε στο αρχείο wolff.f90. Κάθε κλήση της από το
κυρίως πρόγραμμα κατασκευάζει ένα Wolff cluster, του αλλάζει το σπιν
και σημειώνει το μέγεθός του.
    Στο πρώτο μέρος της υπορουτίνας δημιουργούμε το buffer τύπου
stack stack(0:N-1) το οποίο θα χρησιμοποιήσουμε στην κατασκευή του
cluster. Αυτό το κάνουμε δυναμικά με τη χρήση της ALLOCATE και είμα-
στε προσεκτικοί στο τέλος να ελευθερώσουμε τη ζητούμενη μνήμη με
14.4. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                                           617

την DEALLOCATE (αλλιώς θα έχουμε “memory leak” και η μνήμη που ζητά
το πρόγραμμα θα αυξηθεί ανεξέλεγκτα).

ALLOCATE( stack ( 0 : N−1) ,STAT=chk )
i f ( chk >0) c a l l locerr ( ’ a l l o c a t i o n f a i l u r e f o r s t a c k i n w o l f f ’ )
   ....
DEALLOCATE( stack ) ! f r e e memory o f s t a c k

Παρατηρούμε πως αν το σύστημα αδυνατεί να μας δώσει τη ζητούμενη
μνήμη, τότε θέτει chk>0 και η locerr() σταματάει το πρόγραμμα.
   Στη συνέχεια, αρχικοποιούμε το cluster με την επιλογή του seed.

 c a l l ranlux ( r , 1 )
 cseed       = INT ( N * r ) +1
 stack ( 0 ) = cseed
 nstack      = 1                     ! t h e s t a c k has 1 member , t h e seed
 sold        = s ( cseed )
 snew        = −s ( cseed )          ! t h e new s p i n v a l u e o f t h e c l u s t e r
 s ( cseed ) = snew                  ! we f l i p a l l new members o f c l u s t e r
 ncluster = 1                        ! s i z e o f c l u s t e r =1

cseed είναι το seed και τοποθετείται αμέσως στο cluster [stack(0) =
cseed]. Η μεταβλητή nstack είναι ο αριθμός των στοιχείων του stack και
αρχικά τίθεται ίση με 1. Η ncluster μετράει τον αριθμό των πλεγματι-
κών θέσεων στο cluster και τίθεται αρχικά ίση με 1. sold=s(cseed) είναι
η παλιά τιμή του σπιν του cluster και snew=-sold η νέα. Η τιμή του σπιν
του νέου μέλους του cluster αλλάζεται αμέσως (s(cseed)=snew)! Αυτό
βοηθάει στην πιο αποτελεσματική εφαρμογή του αλγόριθμου. Ελέγχο-
ντας αν το σπιν ενός πλησιέστερου γείτονα είναι ίσο με sold, ελέγχει
ταυτόχρονα αν το σπιν του είναι ίδιο με του cluster και αν ήδη έχει ήδη
μπει στο cluster από προηγούμενο έλεγχο!
   Ο βρόχος επανάληψης πάνω στα νέα μέλη του cluster συνοψίζεται
παρακάτω:

  do while ( nstack > 0)
! pull a s i t e o f f the stack :
   nstack = nstack              − 1 ; scluster = stack ( nstack )
! check i t s f o u r neighbours :
!−−−−−−−−−−−−−s c l u s t e r + XNN:
   nn             = scluster + XNN ; i f ( nn > N ) nn = nn − N
   i f ( s ( nn ) == sold ) then
     c a l l ranlux ( r , 1 )
     i f ( r<padd ) then
       stack ( nstack )=nn ; nstack = nstack + 1
618                                        ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

      s ( nn )         =snew
      ncluster         =ncluster+1
    endif
  endif
! . . . check o t h e r 3 n e a r e s t n e i g h b o r s . . .
 enddo


Ο βρόχος do while(nstack > 0) εκτελείται όσο nstack>0, δηλ. όσο
το stack είναι γεμάτο και έχουμε νέα μέλη στο cluster. Η μεταβλητή
scluster είναι η τρέχουσα πλεγματική θέση που τραβάμε από το stack
για να κοιτάξουμε τους πλησιέστερους γείτονές της. Η γραμμή nn =
scluster + XNN; if(nn > N) nn = nn - N επιλέγει τον πλησιέστερο
γείτονα προς τα δεξιά και τον αποθηκεύει στη μεταβλητή nn. Αν το
σπιν s(nn) του nn είναι ίσο με sold, τότε ο γείτονας αυτός έχει σπιν
ίδιο με αυτό του cluster και δεν έχει ήδη μπει στο cluster (γιατί τότε θα
είχαμε αλλάξει το σπιν του). Η μεταβλητή padd είναι ίση με Padd (αυτό
τίθεται στην init) και αν r<padd (το οποίο συμβαίνει με πιθανότητα
Padd ), προσθέτουμε τον nn στο cluster: Τον προσθέτουμε στο stack, αλ-
λάζουμε το σπιν [s(nn)=snew] και αυξάνουμε το μέγεθος του cluster
κατά 1. Επαναλαμβάνουμε ακριβώς τα ίδια και για τους υπόλοιπους
πλησιέστερους γείτονες. Ολόκληρος ο κώδικας παρατίθεται παρακάτω
για τη διευκόλυνση του αναγνώστη:

s u b r o u t i n e wolff
  use global_data
  i m p l i c i t none
  integer                               : : cseed , nstack , sold , snew , scluster , nn , chk
  integer                               : : ncluster
  real (8)                              :: r
  i n t e g e r , a l l o c a t a b l e : : stack ( : )
! a l l o c a t e s t a c k memory :
 ALLOCATE( stack ( 0 : N−1) ,STAT=chk )
  i f ( chk >0) c a l l locerr ( ’ a l l o c a t i o n f a i l u r e f o r s t a c k i n w o l f f ’ )
! choose a seed f o r t h e c l u s t e r , put i t on t h e s t a c k and f l i p i t
  c a l l ranlux ( r , 1 )
  cseed            = INT ( N * r ) +1
  stack ( 0 ) = cseed
  nstack           = 1                      ! t h e s t a c k has 1 member , t h e seed
  sold             = s ( cseed )
  snew             = −s ( cseed )           ! t h e new s p i n v a l u e o f t h e c l u s t e r
  s ( cseed ) = snew                        ! we f l i p a l l new members o f c l u s t e r
  ncluster = 1                              ! s i z e o f c l u s t e r =1
! s t a r t t h e loop on s p i n s i n t h e s t a c k :
  do while ( nstack > 0)
! pull a s i t e o f f the stack :
14.4. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                   619

   nstack = nstack                    − 1 ; scluster = stack ( nstack )
! check i t s f o u r neighbours :
!−−−−−−−−−−−−−s c l u s t e r + XNN:
   nn              = scluster + XNN ; i f ( nn > N ) nn = nn − N
    i f ( s ( nn ) == sold ) then
      c a l l ranlux ( r , 1 )
      i f ( r<padd ) then
        stack ( nstack )=nn ; nstack = nstack + 1
        s ( nn )           =snew
        ncluster           =ncluster+1
      endif
   endif
!−−−−−−−−−−−−−s c l u s t e r − XNN:
   nn              = scluster − XNN ; i f ( nn < 1 ) nn = nn + N
    i f ( s ( nn ) == sold ) then
      c a l l ranlux ( r , 1 )
      i f ( r<padd ) then
        stack ( nstack )=nn ; nstack = nstack + 1
        s ( nn )           =snew
        ncluster           =ncluster+1
      endif
   endif
!−−−−−−−−−−−−−s c l u s t e r + YNN:
   nn              = scluster + YNN ; i f ( nn > N ) nn = nn − N
    i f ( s ( nn ) == sold ) then
      c a l l ranlux ( r , 1 )
      i f ( r<padd ) then
        stack ( nstack )=nn ; nstack = nstack + 1
        s ( nn )           =snew
        ncluster           =ncluster+1
      endif
   endif
!−−−−−−−−−−−−−s c l u s t e r − YNN:
   nn              = scluster − YNN ; i f ( nn < 1 ) nn = nn + N
    i f ( s ( nn ) == sold ) then
      c a l l ranlux ( r , 1 )
      i f ( r<padd ) then
        stack ( nstack )=nn ; nstack = nstack + 1
        s ( nn )           =snew
        ncluster           =ncluster+1
      endif
   endif
  enddo ! do while ( n s t a c k > 0)
  p r i n t ’ (A, I14 ) ’ , ’ # c l u ’ , ncluster
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 DEALLOCATE( stack ) ! f r e e memory o f s t a c k
!−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
end s u b r o u t i n e wolff
620                                  ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

Για να συνδέσουμε τη συνάρτηση με το υπόλοιπο πρόγραμμα, ώστε να
έχουμε κατασκευή ενός cluster ανά “sweep”¹³, μεταβάλλουμε τη main()
ως εξής:

! ============== main . f90          ==================
program Ising2D
  use global_data
  i m p l i c i t none
  i n t e g e r : : isweep

 c a l l init
 do isweep = 1 , nsweep
   i f ( algorithm . eq . 1 ) then
     c a l l wolff
   else
     c a l l met
   endif
   c a l l measure
 end do
 c a l l endsim
end program Ising2D

Ορίσαμε τη (global) μεταβλητή algorithm, ώστε ο χρήστης να μπορεί
να ελέγχει τον αλγόριθμο που θα χρησιμοποιήσει (Wolff ή Metropolis)¹⁴.
Μένει να οριστεί η (global) μεταβλητή padd≡ Padd = 1 − e−2β , κάτι το
οποίο κάνουμε στην init(). Στο αρχείο global_data.f90 προσθέτουμε
τις γραμμές

 real (8)                       : : padd
 integer                        : : algorithm

στο init.c

 algorithm=0                 ! def au lt i s metropolis , 1 i s wolff
 padd     = 1 . 0 D0 − exp ( −2.0 D0 * beta )

ενώ μεταβάλλουμε το αρχείο options.f90, ώστε να παίρνει ένα διακό-
πτη -w όπου θα θέτει algorithm=1, ώστε το πρόγραμμα να λειτουργεί
τον αλγόριθμο του Wolff:
   ¹³Προσοχή, ένα Metropolis sweep δεν είναι το ίδιο με ένα cluster update. Το μέσο μέ-
γεθος κάθε cluster μεταβάλλεται με τη θερμοκρασία και είναι πολύ μικρό για μεγάλες
θερμοκρασίες.
   ¹⁴Μεταβάλετε την παραπάνω συνάρτηση, ώστε η wolff() να καλείται μέχρι φτιάξει
clusters με συνολικό μέγεθος τουλάχιστον N.
14.4. ΣΧΕΔΙΑΣΜΟΣ ΚΩΔΙΚΑ                                                  621


  .....
  s e l e c t c a s e ( getopt ( ”−hL : b : s : S : n : r :uw” ) )
  c a s e ( ’w’ )
    algorithm = 1
  .....



Προσθέτουμε τη σχετική πληροφορία στο μήνυμα βοήθειας usage και
simmessage και ... είμαστε έτοιμοι! Για τη μεταγλώττιση χρησιμοποιούμε
το Makefile

FC       =gfortran
OBJS     =global_data . o getopt . o main . o init . o met . o wolff . o \
          measure . o end . o options . o ranlux . o
FFLAGS = −O2

is : $ ( OBJS )
     $ ( FC ) $ ( FFLAGS ) $^ −o $@

$ ( OBJS ) :     global_data . f90
options . o : getopt . f90
%.o : %.f90
      $ ( FC ) $ ( FFLAGS ) −c −o $@ $<



και με τις εντολές

> make
> . / is −h
Usage : . / is [ options ]
         −L : Lattice length ( N=L * L )
         −b : beta ( options beta overrides the one in config )
         −s : start (0 cold , 1 hot , 2 old config . )
         −S : seed ( options seed overrides the one in config )
         −n : number of sweeps and measurements of E and M
         −w : use wolff algorithm for the updates
          .......
> . / is −L 20 −b 0.44 −s 1 −S 34235322 −n 5000 −w > outL20b 0.44



μεταγλωττίζουμε, υπενθυμίζουμε στον εαυτό μας τον τρόπο χρήσης του
εκτελέσιμου αρχείου is και κάνουμε ένα δοκιμαστικό τρέξιμο για L =
40, β = 0.44 φτιάχνοντας 5000 clusters ξεκινώντας από μία “θερμή”
διάταξη των σπιν αποθηκεύοντας τα δεδομένα στο αρχείο outL20b0.44.
622                              ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

14.5 Συλλογή Δεδομένων
Για να πάρουμε τα αποτελέσματά μας, επιλέγουμε αρχικά το μέγεθος
ενός πλέγματος που θέλουμε να προσομοιώσουμε και στη συνέχεια, τις
θερμοκρασίες που θα προσομοιώσουμε. Η δουλειά γίνεται γρήγορα βα-
ρετή, επαναλαμβανόμενη, κουραστική και τότε είναι που υπεισέρχονται
απρόσκλητοι επισκέπτες τα ... ζουζούνια! Η τεμπελιά στην περίπτωση
αυτή είναι αρετή και αξίζει να μάθουμε μερικές τεχνικές που κάνουν
τη ζωή μας ευκολότερη, αλλά και τα αποτελέσματά μας πιο αξιόπιστα
(συνήθως...). Στη βοήθειά μας έρχεται ο φλοιός (Shell) και τα εργαλεία
του. Ο φλοιός μας επιτρέπει να εκτελέσουμε μια σειρά εντολών με το
ίδιο ακριβώς συντακτικό που θα χρησιμοποιούσαμε στη γραμμή εντο-
λών γράφοντάς τις σε ένα απλό αρχείο κειμένου. Ένα απλό παράδειγμα
είναι η σειρά εντολών που γράφουμε στο αρχείο run1:

# ###################     run1   ########################
. / is −L 20 −b 0.10 −s   1 −n   5000 −w −S 3423 > outL20b0 . 1 0
. / is −L 20 −b 0.20 −s   2 −n   5000 −w > outL20b0 .20
. / is −L 20 −b 0.30 −s   2 −n   5000 −w > outL20b0 .30
. / is −L 20 −b 0.40 −s   2 −n   5000 −w > outL20b0 .40
. / is −L 20 −b 0.42 −s   2 −n   5000 −w > outL20b0 . 42
. / is −L 20 −b 0.44 −s   2 −n   5000 −w > outL20b0 . 4 4
. / is −L 20 −b 0.46 −s   2 −n   5000 −w > outL20b0 .46
. / is −L 20 −b 0.48 −s   2 −n   5000 −w > outL20b0 . 48
. / is −L 20 −b 0.50 −s   2 −n   5000 −w > outL20b0 .50
. / is −L 20 −b 0.60 −s   2 −n   5000 −w > outL20b0 .60
. / is −L 20 −b 0.70 −s   2 −n   5000 −w > outL20b0 . 7 0

Η πρώτη γραμμή που αρχίζει από τον χαρακτήρα # είναι σχόλιο και θα
αγνοηθεί από τον φλοιό. Η δεύτερη ξεκινάει από την αρχή μια προσο-
μοίωση από “καυτή” διάταξη σπιν (-s 1) για πλέγμα με L=20 (-L 20)
και θερμοκρασία β = 0.10 (-b 0.10). Αρχικό seed καθορίζεται ο αριθ-
μός 3423 (-S 3423) και κάνουμε μετρήσεις πάνω σε 5000 Wolff clusters
(-n 5000 -w). Τα αποτελέσματα ανακατευθύνονται από το stdout στο
αρχείο outL20b0.10 (> outL20b0.10).
    Οι επόμενες δέκα γραμμές συνεχίζουν την προσομοίωση στις θερμο-
κρασίες β = 0.20 – 0.70. Κάθε προσομοίωση συνεχίζει από τη διάταξη
σπιν που αποθήκευσε το πρόγραμμα στο αρχείο conf στην προηγούμενη
προσομοίωση.
    Μόλις φτιάξαμε ένα (πρωτόγονο είναι αλήθεια) σενάριο φλοιού (shell
script)! Για να τρέξουν οι εντολές αυτές πρέπει να κάνουμε το αρχείο
εκτελέσιμο, δίνοντάς του (την πρώτη φορά μόνο) άδεια πρόσβασης x
14.5. ΣΥΛΛΟΓΗ ΔΕΔΟΜΕΝΩΝ                                                    623


> chmod a+x run1

και στη συνέχεια, να το εκτελέσουμε καλώντας το

> . / run1

Δεν τα πήγαμε και άσχημα... Αλλά μπορούμε και καλύτερα! Αντί να
βάλουμε μία γραμμή για κάθε προσομοίωση, μπορούμε να χρησιμοποι-
ήσουμε τις δυνατότητες προγραμματισμού του φλοιού. Ας δούμε πώς.
Στο αρχείο run2 γράφουμε:

# ! / bin / t c s h −f
# ################### run2 ################################
set L               = 20
s e t betas         = ( 0 . 1 0 0.20 0.30 0.40 0.42 0.44 0.46 0.48 0.50\
                        0.60 0 . 7 0 )
s e t start         = ”−s 1 −S 3423”
s e t nsweeps = 5000

f o r e a c h beta ( $betas )
  echo ”L= $L b e t a= $ b e t a ”
  . / is −L $L −b $beta −n $nsweeps −w $start > outL$ {L} b$ { beta }
  s e t start = ”−s 2”
end

    Η πρώτη γραμμή καλεί τον φλοιό tcsh να ερμηνεύσει το σενάριο.
Αυτό δε χρειαζόταν στο run1, γιατί οποιοσδήποτε φλοιός μπορούσε να
ερμηνεύσει τις εντολές που είχαμε γράψει. Εδώ όμως βάζουμε συντα-
κτικό που είναι κατανοητό μόνο από τον συγκεκριμένο φλοιό. Το ζεύγος
χαρακτήρων #! πρέπει να είναι οι δύο πρώτοι χαρακτήρες του αρχείου.
    Η δεύτερη γραμμή είναι σχόλιο.
    Η τρίτη γραμμή ορίζει μία μεταβλητή φλοιού με το όνομα L. Η τιμή
της μεταβλητής είναι "20" (string, όχι αριθμός ακέραιος) και έχουμε
πρόσβαση σε αυτή βάζοντας ένα $ μπροστά από το όνομά της. Δηλ.
όπου γράφουμε στο σενάριο $L (ή ${L}), ο φλοιός θα αντικαθιστά το
string 20. Για παράδειγμα όταν γράφουμε στο σενάριο outL${L}b, ο
φλοιός θα φτιάχνει το string outL20b.
    Η τέταρτη γραμμή ορίζει ένα array με το όνομα betas. Πρόσβαση
στα στοιχεία του array παρέχεται από το συντακτικό $betas[αριθμός],
όπου “αριθμός” είναι το στοιχείο του array αρχίζοντας από το 1. Στο
παραπάνω παράδειγμα $betas[1] = 0.10, $betas[2] = 0.20, ...,
$betas[11] = 0.70. Ειδικά η μεταβλητή $#betas = 11 είναι ο αριθμός
624                              ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

των στοιχείων του array. Όταν γράφουμε $betas, ο φλοιός αντικαθιστά
όλες τις τιμές του array¹⁵.
    Η πέμπτη γραμμή ορίζει τη μεταβλητή start να έχει την τιμή $start
ίση με το string "-s 1 -S 3423". Τα εισαγωγικά μπήκαν επειδή οι λέξεις
χωρίζονται με κενά και ορίζουν έτσι επακριβώς το string. Οτιδήποτε
γράφουμε από τον χαρακτήρα # και μετά είναι σχόλιο και ο φλοιός το
αγνοεί.
    Η εντολή foreach είναι ένας τρόπος να τρέξουμε έναν βρόχο στον
φλοιό tcsh. Οι επαναλαμβανόμενες εντολές αρχίζουν από την επόμενη
γραμμή και τελειώνουν στη γραμμή με την εντολή end. Οι επαναλήψεις
γίνονται μία για κάθε τιμή του array που βάζουμε ανάμεσα στις παρεν-
θέσεις. Εδώ θα γίνει μία φορά για κάθε τιμή της μεταβλητής $betas.
Κάθε φορά που γίνεται μια επανάληψη, η μεταβλητή βρόχου, το όνομα
της οποίας μπαίνει αμέσως μετά τη λέξη foreach αντικαθίσταται από
το επόμενο στοιχείο του array. Άρα, ο βρόχος που γράψαμε θα εκτελε-
στεί μία φορά για κάθε τιμή του betas και η μεταβλητή beta θα παίρνει
διαδοχικά τις τιμές 0.10, 0.20, ... , 0.70. Οι επόμενες τρεις γραμμές είναι
οι εντολές που θα εκτελεστούν έντεκα φορές. Η echo “αντηχεί” τα ορί-
σματά της και μας πληροφορεί για την τρέχουσα τιμή των παραμέτρων
της προσομοίωσης που τρέχει (πολύ χρήσιμο, ειδικά αν οι προσομοιώ-
σεις θέλουν αρκετό χρόνο). Η ./is τρέχει το πρόγραμμα, κάθε φορά
με διαφορετική τιμή για τη beta. Προσέξτε πώς το αρχείο στο οποίο
ανακατευθύνουμε τα δεδομένα αλλάζει όνομα, κάθε φορά που αλλάζει
η τιμή της beta. Άρα, στο τέλος θα έχουμε τα δεδομένα μας στα αρχεία
outL20b0.10, outL20b0.20, ..., outL20b0.70. Η τρίτη εντολή αλλάζει
τον τρόπο που αρχίζει η προσομοίωση, από θερμή διάταξη σπιν στο να
διαβάσει τη διάταξη από το αρχείο conf. Την πρώτη φορά που τρέχει ο
βρόχος η τιμή της start είναι "-s 1 -S 3423" (θερμή διάταξη, seed ίσο
με 3423), ενώ στις επόμενες η τιμή της είναι "-s 2" (old configuration).
    Όταν λοιπόν θέλουμε να τρέξουμε για μια άλλη τιμή του L, δεν
έχουμε παρά να αλλάξουμε την τιμή της αντίστοιχης μεταβλητής και
να τρέξουμε πάλι το ίδιο script. Ή μήπως όχι... Χτύπησε πάλι η τεμπε-
λιά:

# ! / bin / t c s h −f

s e t Ls      = (10 20 40)
s e t betas   = ( 0 . 1 0 0.20 0.30 0.40 0.42 0.44 0.46 0.48 0.50\
                  0.60 0 . 7 0 )
s e t nsweeps = 5000

   ¹⁵Δοκιμάστε την εντολή: echo $betas[3] $#betas $betas.
14.6. ΑΝΑΛΥΣΗ ΔΕΔΟΜΕΝΩΝ                                                           625


foreach L           ( $Ls    )
 s e t start       = ”−s 1 −S 3423”
 f o r e a c h beta ( $betas )
   echo ”L= $L b e t a= $ b e t a ”
   . / is −L $L −b $beta −n $nsweeps −w $start > outL$ {L}b$ { beta }
   s e t start = ”−s 2”
 end
end

Δεν έχουμε παρά να προσθέσουμε έναν βρόχο για κάθε τιμή του L ορί-
ζοντας τώρα τη μεταβλητή–array Ls και βάζοντας όσα L τραβάει η ψυχή
μας... Προσέξτε μόνο πού μετακινήσαμε τον ορισμό της μεταβλητής
start (γιατί;).


14.6       Ανάλυση Δεδομένων
Ο πρώτος έλεγχος στα δεδομένα μας είναι να εξετάσουμε γραφικά την
εξέλιξή τους στον Μόντε Κάρλο χρόνο (time histories). Από εκεί θα
κάνουμε μια πρώτη διάγνωση για τυχόν προβλήματα και λάθη και θα
αποκτήσουμε μία αίσθηση για τους χρόνους εύρεσης της κατάστασης
θερμικής ισορροπίας (thermalization) και των χρόνων αυτοσυσχετισμού.
Από τα αρχεία που παράγαμε στην προηγούμενη παράγραφο μπορούμε
να το καταφέρουμε εύκολα με τη βοήθεια του gnuplot. Για παράδειγμα,
οι εντολές μέσα από το gnuplot¹⁶:

gnuplot > p l o t ”<grep −v ’# ’           outL40b0 . 4 4 ” u 1               \
                   with lines t i t l e ”E”
gnuplot > p l o t ”<grep −v ’# ’           outL40b0 . 4 4 ” u ( abs ( $2 ) ) \
                   with lines t i t l e ” |M| ”
gnuplot > p l o t ”<awk ’ / # c l u / { p r i n t $2 } ’ outL40b0 . 4 4 ” u 1 \
                   with lines t i t l e ”n”

μας δίνουν με απλό τρόπο τα time histories της ενέργειας, της απόλυτης
τιμής της μαγνήτισης και του μεγέθους των cluster που κατασκευάζονται
από τον αλγόριθμο του Wolff για L = 40, β = 0.44.
    Για να υπολογίσουμε τις τιμές της μέσης ενέργειας ανά link ⟨e⟩ =
 1
2N
   ⟨E⟩ και της (απόλυτης τιμή της) μαγνήτισης ανά πλεγματική θέση
⟨m⟩ = N1 ⟨M ⟩ μπορούμε να χρησιμοποιήσουμε το πρόγραμμα για jack-
knife που περιγράψαμε στο Παράρτημα 13.8. Αυτό θα το βρείτε και
   ¹⁶Σας θυμίζουμε πως η εντολή plot στο gnuplot δέχεται αντί για το όνομα ενός αρ-
χείου δεδομένων, το stdout μιας εντολής command με το συντακτικό plot "<command".
626                                         ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

στα Tools στο συνοδευτικό λογισμικό στο αρχείο jack.f90. Το μετα-
γλωττίζουμε στο εκτελέσιμο αρχείο jack και αντιγράφουμε το αρχείο
στον κατάλογο που εργαζόμαστε. Η μέση τιμή ⟨e⟩ μπορεί τότε να υπο-
λογιστεί με την εντολή

> grep −v # outL40b0 . 4 4                                   \
   | awk −v L=40 ’ NR >500{ p r i n t $1 / ( 2 * L * L ) } ’ \
   | . / jack

όπου με την awk ορίσαμε, χρησιμοποιώντας το option -v, τη μεταβλητή
L=40 και τυπώσαμε την πρώτη στήλη διαιρεμένη με 2N = 2L2 . Με τη
συνθήκη NR>500 τυπώνουμε αφού περάσουν οι πρώτες 500 γραμμές,
απορρίπτοντας τις πρώτες μετρήσεις για να είμαστε σίγουροι για την
εύρεση της θερμικής ισορροπίας. Το αποτέλεσμα τυπώνεται στο stdout
ως εξής:

# NDAT = 4500 data . JACK = 10 groups
# <o > , chi= ( <o^2>−<o >^2)
# <o> +/− err                   chi +/− err
−0.71091166666 0.0024162628283 0.0015719190590 7.819205433e−05

Οι γραμμές που αρχίζουν με # είναι σχόλια του προγράμματος και μας
εξηγούν τα αποτελέσματα. Οι δύο πρώτοι αριθμοί είναι η ⟨e⟩ και το
σφάλμα της, ενώ ο τρίτος και ο τέταρτος οι διακυμάνσεις της ενέργειας
⟨e2 ⟩ − ⟨e⟩2 και το σφάλμα της. Πολλαπλασιάζοντας την τελευταία με
β 2 N , παίρνουμε την ειδική θερμότητα c και το σφάλμα της σύμφωνα με
την εξίσωση (13.32). Μπορούμε να τυπώσουμε τις πληροφορίες αυτές
βολικά για να τις αποθηκεύσουμε σε ένα αρχείο με την εντολή:

> set L = 40; set b = 0.44 ;                                           \
  grep −v # outL$ {L} b$ {b}                                         | \
  awk −v L=$L ’NR>500{ p r i n t $1 / ( 2 * L*L) } ’ | \
  . / jack | grep −v #                                               | \
  awk −v L=$L −v b=$b                                                  \
    ’ { p r i n t ” e ” , L , b , $1 , $2 , b * b *L*L* $3 , b * b *L*L* $4} ’

Γιατί το κάναμε αυτό; Όχι λόγω ... μαζοχισμού! Οι παραπάνω εντολές
δίνονται σε μία γραμμή στη γραμμή εντολών (φυσικά εμείς τη σπάμε για
να φαίνεται στο κείμενο με τη γνωστή σύμβαση της \). Ανακαλώντας
τις και αλλάζοντας μόνο την τιμή της L ή/και της b, παίρνουμε χωρίς
καινούργιο κόπο τα αποτελέσματα για διαφορετική τιμή του L ή/και
β. Επίσης, το shell script που θα φτιάξουμε σε λίγο θα μας φαίνεται
λιγότερο ακατανόητο... Το αποτέλεσμα είναι
14.6. ΑΝΑΛΥΣΗ ΔΕΔΟΜΕΝΩΝ                                                            627


e 40 0.42 −0.619523333 0.00189807 0.311391 0.0228302

που δίνει ⟨e⟩ = −0.6195(19) και c = 0.311(23).
   Η εντολή για τον υπολογισμό της μαγνήτισης δεν παρουσιάζει τώρα
ιδιαίτερη δυσκολία. Το μόνο που έχουμε να κάνουμε είναι να υπολογί-
σουμε την απόλυτη τιμή της δεύτερης στήλης του αρχείου των δεδομέ-
νων για τις γραμμές που δεν αρχίζουν από #

> s e t L = 40 ; s e t b = 0.42 ;                                              \
  grep −v # outL$ {L}b${b}                                                   | \
  awk −v L=$L ’ NR >500{m=($2 >0) ? $2:−$2 ; p r i n t m / ( L * L ) } ’ | \
  . / jack | grep −v #                                                       | \
  awk −v L=$L −v b=$b                                                          \
    ’{ p r i n t ”m” , L , b , $1 , $2 , b * L * L * $3 , b * L * L * $4 } ’

Η απόλυτη τιμή υπολογίζεται από την έκφραση ($2>0)?$2:-$2, αποθη-
κεύεται στη μεταβλητή m και τυπώνεται αφού διαιρεθεί με N = L2 . Το
αποτέλεσμα είναι

m 40 0.44 0.6250527778 0.00900370 21.8345 1.39975

που δίνει ⟨m⟩ = 0.6251(90) και χ = 21.8(14).
   Παρόμοια δίνουμε την εντολή για τον υπολογισμό του ⟨n⟩/N :

> s e t L = 40 ; s e t b = 0.44 ;                       \
  grep ’ # clu ’ outL$ {L}b${b}                       | \
  awk −v L=$L ’ NR >500{ p r i n t $2 / ( L * L ) } ’ | \
  . / jack | grep −v #                                | \
  awk −v L=$L −v b=$b ’{ p r i n t ”n” , L , b , $1 , $2 } ’

Το αποτέλεσμα είναι

n 40 0.44 0.4257476389 0.01302602

που δίνει ⟨n⟩/N = 0.426(13).
   Όσα είπαμε παραπάνω τα γράφουμε όλα μαζί στο script run3:

# ! / bin / t c s h −f
s e t Ls            = (10 20 40 60 80       100)
s e t betas         = ( 0 . 0 0 0.10 0.20   0.25 0.30 0.34 0.38 \
                        0.40 0.42 0.43      0.44 0.45 0.46 0.48 \
                        0.48 0.50 0.55      0.60 0.65 0.70 0.80 )
628                                     ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ


               1
                                                                       10
             0.9                                                       20
                                                                       40
             0.8                                                       60
             0.7                                                       80
                                                                      100
             0.6
      <m>




             0.5
             0.4
             0.3
             0.2
             0.1
               0
                   0      0.1     0.2      0.3      0.4     0.5      0.6      0.7      0.8
                                                    β
Σχήμα 14.6: Τα αποτελέσματα από τις προσομοιώσεις που γίνονται από το σενάριο
φλοιού run3. Στο σχήμα δείχνεται η ⟨m⟩ και φαίνεται καθαρά η μείωση της μαγνήτισης
σε ψηλές θερμοκρασίες β ≪ βc ως 1/L.




s e t nsweeps = 100000

foreach L               ( $Ls        )
 s e t start          = ”−s 1 −S 3423”
 f o r e a c h beta ( $betas )
   . / is −L $L −b $beta −n $nsweeps −w $start > outL$ {L} b$ { beta }
   s e t start = ”−s 2”
   # C a l c u l a t e <e> = <E> / ( 2N and c=b e t a ^2*N*( < e^2>−<e >^2) :
   grep −v ’ # ’ outL$ {L}b${ b e t a }                                    | \
   awk −v L=$L ’ NR >500{ p r i n t $1 / ( 2 * L * L ) } ’ | \
   . / jack | grep −v ’ # ’                                                | \
   awk −v L=$L −v b=$beta                                                     \
     ’{ p r i n t ” e ” , L , b , $1 , $2 , b * b * L * L * $3 , b * b * L * L * $4 } ’
   # C a l c u l a t e <m> = <|M| > /N and c h i=b e t a *N*( <m^2>−<m>^2)
   grep −v ’ # ’ outL$ {L}b${ b e t a }                                                 | \
   awk −v L=$L ’ NR >500{m=($2 >0) ? $2:−$2 ; p r i n t m / ( L * L ) } ’ | \
   . / jack | grep −v ’ # ’                                                             | \
   awk −v L=$L −v b=$beta                                                                 \
     ’{ p r i n t ”m” , L , b , $1 , $2 , b * L * L * $3 , b * L * L * $4 } ’
 end
end
14.6. ΑΝΑΛΥΣΗ ΔΕΔΟΜΕΝΩΝ                                                      629


           1000
                                                            10
                                                            20
             100                                            40
                                                            60
                                                            80
              10                                           100

                1
   χ




             0.1

            0.01

           0.001
                    0   0.1    0.2    0.3     0.4    0.5    0.6    0.7    0.8
                                              β
Σχήμα 14.7: Τα αποτελέσματα από τις προσομοιώσεις που γίνονται από το σενάριο
φλοιού run3. Στο σχήμα δείχνεται η μαγνητική επιδεκτικότητα χ. Μακριά από την
κρίσιμη περιοχή είναι σχεδόν ανεξάρτητη από το μέγεθος του πλέγματος, ενώ στην
ψευδοκρίσιμη περιοχή έχουμε γρήγορη αύξηση, όπως αναμένεται από την εξίσωση
(13.10).




Το τρέχουμε με την εντολή

> . / run3 > out &

και αφού τελειώσει μπορούμε να δούμε τα αποτελέσματα με το gnuplot¹⁷:



s e t xlabel ” beta ”
s e t y l a b e l ”<m>”
plot        ”<grep ’^m 10 ’   out ” u 3 : 4 : 5 with errorbars t i t l e ” 10 ”
r e p l o t ”<grep ’^m 20 ’   out ” u 3 : 4 : 5 with errorbars t i t l e ” 20”
r e p l o t ”<grep ’^m 40 ’   out ” u 3 : 4 : 5 with errorbars t i t l e ” 40”

  ¹⁷Πρόκειται για εντολές που δίνουμε μέσα στο gnuplot, παρόλο που δεν ακολου-
θούμε τη συνηθισμένη σύμβαση να προτάσσουμε το prompt gnuplot>.
630                                    ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ


            0.1
                                                                   10
              0                                                    20
            -0.1                                                   40
                                                                   60
            -0.2                                                   80
            -0.3                                                  100
            -0.4
      <e>




            -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
                                                 β
Σχήμα 14.8: Τα αποτελέσματα από τις προσομοιώσεις που γίνονται από το σενάριο
φλοιού run3. Στο σχήμα δείχνεται η ⟨e⟩.



r e p l o t ”<grep ’^m 60 ’ out ” u 3 : 4 : 5 with errorbars t i t l e ” 60”
r e p l o t ”<grep ’^m 80 ’ out ” u 3 : 4 : 5 with errorbars t i t l e ” 80”
r e p l o t ”<grep ’^m 100 ’ out ” u 3 : 4 : 5 with errorbars t i t l e ” 100 ”

Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της μαγνήτισης.

set ylabel ” chi ”
s e t log y
plot        ”<grep ’^m   10 ’    out ”   u   3:6:7   with   errorbars   title   ” 10 ”
r e p l o t ”<grep ’^m   20 ’    out ”   u   3:6:7   with   errorbars   title   ” 20”
r e p l o t ”<grep ’^m   40 ’    out ”   u   3:6:7   with   errorbars   title   ” 40”
r e p l o t ”<grep ’^m   60 ’    out ”   u   3:6:7   with   errorbars   title   ” 60”
r e p l o t ”<grep ’^m   80 ’    out ”   u   3:6:7   with   errorbars   title   ” 80”
r e p l o t ”<grep ’^m   100 ’   out ”   u   3:6:7   with   errorbars   title   ” 100 ”

Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της μαγνητικής
επιδεκτικότητας.

s e t y l a b e l ”<e>”
plot        ”<grep ’^ e 10 ’     out ” u 3 : 4 : 5 with errorbars t i t l e ” 10 ”
14.6. ΑΝΑΛΥΣΗ ΔΕΔΟΜΕΝΩΝ                                                                 631


           0.7
                                                                      10
                                                                      20
           0.6                                                        40
                                                                      60
           0.5                                                        80
                                                                     100
           0.4
    c




           0.3

           0.2

           0.1

             0
                 0          0.1     0.2     0.3     0.4        0.5   0.6    0.7     0.8
                                                    β
Σχήμα 14.9: Τα αποτελέσματα από τις προσομοιώσεις που γίνονται από το σενάριο
φλοιού run3. Στο σχήμα δείχνεται η ειδική θερμότητα c. Μακριά από την κρίσιμη πε-
ριοχή είναι σχεδόν ανεξάρτητη από το μέγεθος του πλέγματος, ενώ στην ψευδοκρίσιμη
περιοχή έχουμε αύξηση, όπως αναμένεται από την εξίσωση (13.8).



replot   ”<grep      ’^ e   20 ’    out ”   u   3:4:5   with   errorbars   title   ” 20”
replot   ”<grep      ’^ e   40 ’    out ”   u   3:4:5   with   errorbars   title   ” 40”
replot   ”<grep      ’^ e   60 ’    out ”   u   3:4:5   with   errorbars   title   ” 60”
replot   ”<grep      ’^ e   80 ’    out ”   u   3:4:5   with   errorbars   title   ” 80”
replot   ”<grep      ’^ e   100 ’   out ”   u   3:4:5   with   errorbars   title   ” 100 ”




Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της ενέργειας.

set ylabel ” c ”
plot   ”<grep ’^ e          10 ’    out ”   u   3:6:7   with   errorbars   title   ” 10 ”
replot ”<grep ’^ e          20 ’    out ”   u   3:6:7   with   errorbars   title   ” 20”
replot ”<grep ’^ e          40 ’    out ”   u   3:6:7   with   errorbars   title   ” 40”
replot ”<grep ’^ e          60 ’    out ”   u   3:6:7   with   errorbars   title   ” 60”
replot ”<grep ’^ e          80 ’    out ”   u   3:6:7   with   errorbars   title   ” 80”
replot ”<grep ’^ e          100 ’   out ”   u   3:6:7   with   errorbars   title   ” 100 ”
632                                 ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ


               1
                                                                10
              0.9                                               20
                                                                40
              0.8                                               60
              0.7                                               80
                                                               100
              0.6
      <n>/N




              0.5
              0.4
              0.3
              0.2
              0.1
               0
                    0   0.1   0.2     0.3     0.4        0.5   0.6    0.7     0.8
                                              β
Σχήμα 14.10: Τα αποτελέσματα από τις προσομοιώσεις που γίνονται από το σενάριο
φλοιού run3. Δίνεται η γραφική παράσταση του μέσου μεγέθους των Wolff clusters
σαν ποσοστό του συνολικού πλέγματος ⟨n⟩/N .




Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της ειδικής θερ-
μότητας.

set ylabel ”<n > /N”
plot   ”<grep ’^n 10 ’        out ”   u   3:4:5   with   errorbars   title   ” 10 ”
replot ”<grep ’^n 20 ’        out ”   u   3:4:5   with   errorbars   title   ” 20”
replot ”<grep ’^n 40 ’        out ”   u   3:4:5   with   errorbars   title   ” 40”
replot ”<grep ’^n 60 ’        out ”   u   3:4:5   with   errorbars   title   ” 60”
replot ”<grep ’^n 80 ’        out ”   u   3:4:5   with   errorbars   title   ” 80”
replot ”<grep ’^n 100 ’       out ”   u   3:4:5   with   errorbars   title   ” 100 ”

Οι παραπάνω εντολές δίνουν τη γραφική παράσταση της ⟨n⟩/N .



14.7 Χρόνοι Αυτοσυσχετισμού
Στην περίπτωση του αλγόριθμου του Metropolis ορίσαμε τη “μονάδα
του χρόνου” στην κατασκευή του δείγματος στην προσομοίωση Μόντε
14.7. ΧΡΟΝΟΙ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                           633

Κάρλο το “sweep”. Ένα sweep ορίζεται, όταν έχουμε N απόπειρες αλ-
λαγής των σπιν του πλέγματος.
   Στην περίπτωση του αλγόριθμου του Wolff έχουμε την επιπλέον πο-
λυπλοκότητα που εισάγει το μεταβλητό μέγεθος των Wolff clusters με
τη θερμοκρασία. Άρα, αν ορίσουμε ένα βήμα του αλγόριθμου να είναι η
κατασκευή ενός cluster, τότε δεν έχουμε έναν καλό ορισμό του sweep.
Για πολύ χαμηλές θερμοκρασίες β ≫ βc , η κατασκευή ενός cluster είναι
σχεδόν ισοδύναμη με μία αλλαγή σπιν ανά πλεγματική θέση. Αν κρατή-
σουμε αυτό να είναι η μονάδα μέτρησης του χρόνου στην προσομοίωση,
τότε ένα τέτοιο sweep θα είναι ίσο με
                                N
                 (1 sweep) =       (Wolff cluster updates)         (14.30)
                               ⟨n⟩
   Για μεγάλες θερμοκρασίες β ≪ βc χρειαζόμαστε περίπου N Wolff
clusters για να έχουμε ένα sweep του πλέγματος. Ανάλογα θα ορίσουμε
και τους χρόνους αυτοσυσχετισμού. Για μια φυσική ποσότητα O ο χρό-
νος αυτοσυσχετισμού σε μονάδες κατασκευής Wolff cluster θα συμβο-
λίζεται με τOW , ενώ ο χρόνος αυτοσυσχετισμού τO που θα χρησιμοποιή-
σουμε για τον έλεγχο της απόδοσης του αλγόριθμου θα είναι σε μονάδες
sweeps και θα ισχύει
                                       ⟨n⟩
                              τO = τOW     .                  (14.31)
                                        N
   Αρχικά πραγματοποιούμε προσομοιώσεις για L = 10, 20, 40, 60, 80
και 100 στη θερμοκρασία β = 0.4407. Κατασκευάζουμε 5 × 106 clusters.
Τα αποτελέσματα αποθηκεύονται σε αρχεία με όνομα outL${L}b0.4407.
Στη συνέχεια, πραγματοποιούμε προσομοιώσεις με τον αλγόριθμο Me-
tropolis και πραγματοποιούμε 10 × 106 sweeps. Τα αποτελέσματα απο-
θηκεύονται σε αρχεία με το όνομα outL${L}b0.4407met. Το παρακάτω
σενάριο φλοιού κάνει τα πράγματα πιο ... ξεκούραστα.

# ! / bin / t c s h −f
s e t Ls            = (10 20 40 60 80 100)
s e t beta          = 0.4407
s e t nsweeps = 5000000
s e t start         = ”−s 1 −S 3423”
# Wolff c l u s t e r a l g o r i t h m :
foreach L              ( $Ls )
  . / is −L $L −b $beta −n $nsweeps $start −w> outL$ {L} b$ { beta }
 # Mean c l u s t e r s i z e <n > /N
  grep ’ # clu ’ outL$ {L}b${ b e t a }                | \
 awk −v L=$L ’ NR >10000{ p r i n t $2 / ( L * L ) } ’ | \
  . / jack −d $nsweeps | grep −v ’ # ’                 | \
634                                     ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

 awk −v L=$L −v b=$beta ’{ p r i n t ”n” , L , b , $1 , $2 } ’
end
# Metropolis algorithm
s e t nsweeps = 10000000
foreach L        ( $Ls )
  . / is −L $L −b $beta −n $nsweeps $start           > outL$ {L} b$ { beta } met
end

Μεταγλωττίζουμε το αρχείο autoc.f90 από τον κατάλογο Tools και
αντιγράφουμε το εκτελέσιμο αρχείο autoc στον κατάλογο που δουλεύ-
ουμε και με το παρακάτω σενάριο φλοιού μετράμε τις συναρτήσεις
αυτοσυσχετισμού της μαγνήτισης ρm (t)

# ! / bin / t c s h −f
s e t Ls = (10 20 40 60 80 100)
s e t b = 0.4407
# Wolff
s e t tmax = 1000
s e t ndata = 5000000
f o r e a c h L ( $Ls )
  s e t f = outL$ {L}b$ {b}
  grep −v ’ # ’ $ f | \
  awk −v L=$L           \
    ’BEGIN{N=L * L}NR >100000{ p r i n t ( $2 >0) ? ( $2 / N ) :( − $2 / N ) } ’ | \
  . / autoc −t $tmax −n $ndata > $f . rhom
end
# Metropolis
s e t tmax = 8000
s e t ndata = 10000000
f o r e a c h L ( $Ls )
  s e t f = outL$ {L}b$ {b} met
  grep −v ’ # ’ $ f | \
  awk −v L=$L           \
    ’BEGIN{N=L * L}NR >100000{ p r i n t ( $2 >0) ? ( $2 / N ) :( − $2 / N ) } ’ | \
  . / autoc −t $tmax −n $ndata > $f . rhom
end

Ο μέγιστος χρόνος στη μέτρηση της ρm (t) είναι φυσικά πολύ μεγαλύ-
τερος για τον αλγόριθμο Metropolis (μεταβλητή $tmax). Επίσης, πετάμε
τις πρώτες 100000 μετρήσεις. Τα αποτελέσματα τα βρίσκουμε σε αρ-
χεία των οποίων οι καταλήξεις είναι .rhom. Στη συνέχεια, προσαρμό-
ζουμε την ρm (t) στη συνάρτηση (13.56) με τρεις χρόνους αυτοσυσχετι-
σμού όπως περιγράφεται στο Παράρτημα 13.7. Τα αποτελέσματά μας
δίνονται στον πίνακα 14.1¹⁸
   ¹⁸Παρατηρούμε μια διαφορά στις μετρήσεις μας για τον χρόνο αυτοσυσχετισμού
για τον αλγόριθμο Metropolis σε σχέση με τις αριθμητικές τιμές που παρουσιάσαμε
14.7. ΧΡΟΝΟΙ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                                                     635

                L      W
                      τm            ⟨n⟩/N            τm            τm,Metropolis
                10    2.18(2)       0.6124(2)        1.33(1)       16.1(1)
                20    3.48(5)       0.5159(1)        1.80(3)       70.7(4)
                40    5.10(6)       0.4342(2)        2.21(3)       330(6)
               60     6.12(6)       0.3927(2)        2.40(2)       795(5)
                80    7.33(7)       0.3653(3)        2.68(3)       1740(150)
               100    8.36(6)       0.3457(1)        2.89(2)       2660(170)


Πίνακας 14.1: Οι χρόνοι αυτοσυσχετισμού της μαγνήτισης που προκύπτουν από τις
προσομοιώσεις και την ανάλυση που περιγράφεται στο κείμενο. Στη 2η στήλη είναι
                              W
οι χρόνοι αυτοσυσχετισμού τm     του αλγόριθμου Wolff, με μονάδα “χρόνου” την κα-
τασκευή ενός Wolff cluster. Η 3η στήλη έχει το μέσο μέγεθος των Wolff clusters σαν
ποσοστό του μεγέθους του πλέγματος ⟨n⟩/N . Η 4η στήλη έχει το τm = τm  W
                                                                         ⟨n⟩/N , τον
χρόνο αυτοσυσχετισμού της μαγνήτισης σε ένα Wolff sweep σύμφωνα με την εξίσωση
(14.31). Και τέλος, η 5η στήλη έχει τους χρόνους αυτοσυσχετισμού της μαγνήτισης για
τον αλγόριθμο Metropolis για σύγκριση.


   Από τη σχέση (14.10) αναμένεται να έχουμε τm ∼ Lz όπου z ο δυνα-
μικός κρίσιμος εκθέτης. Ο z υπολογίζεται εύκολα σε μία συνεδρία του
gnuplot

gnuplot >   tau ( x ) = c * x * * z
gnuplot >   fit tau ( x ) ” a u t o c . dat ” u    1:2:3   via c , z
gnuplot >   plot ” a u t o c . dat ” u 1 : 2 : 3   w e t   ”W s t e p s          ” , tau ( x )
gnuplot >   fit tau ( x ) ” a u t o c . dat ” u    1:6:7   via c , z
gnuplot >   plot ” a u t o c . dat ” u 1 : 6 : 7   w e t   ”W sweeps ” , tau ( x )
gnuplot >   fit tau ( x ) ” a u t o c . dat ” u    1:8:9   via c , z
gnuplot >   plot ” a u t o c . dat ” u 1 : 8 : 9   w e t   ” M e t r o p o l i s ” , tau ( x )

όπου υπολογίζουμε το z για τον αλγόριθμο Wolff σε Wolff steps, Wolff
sweeps και για τον αλγόριθμο Metropolis σε Metropolis sweeps. Τα απο-
τελέσματα είναι
                      W
                     τm ∼ Lz ,    z = 0.54 ± 0.02              (14.32)

                            τm ∼ Lz ,         z = 0.29 ± 0.02                              (14.33)

                      τm,Metropolis ∼ Lz ,          z = 2.21 ± 0.02                        (14.34)
  Οι αντίστοιχες γραφικές παραστάσεις δίνονται στα σχήματα 14.11-
στο Παράρτημα 13.7. Η διαφορά είναι ο πενταπλασιασμός της στατιστικής μας και
δείχνει πως το πραγματικό σφάλμα στον προσδιορισμό των τ εμπεριέχει συστηματικά
σφάλματα που δεν έχουμε λάβει υπόψη μας.
636                                  ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

               9
               8
               7
               6
               5
         τWm




               4
               3
               2
               1
                                                         c Lz
               0
                   0       20          40          60   80       100
                                               L
                                         W
Σχήμα 14.11: Οι χρόνοι αυτοσυσχετισμού τm   της μαγνήτισης για τον αλγόριθμο του
Wolff για β = 0.4407. Η μονάδα του χρόνου είναι ένα Wolff cluster. Ο δυναμικός κρίσι-
                                                            W
μος εκθέτης βρίσκεται με την προσαρμογή της συνάρτησης cLz από όπου προκύπτει
z W = 0.54(2).



14.13. Οι τιμές που αναμένονται από τη βιβλιογραφία είναι 0.50(1),
0.25(1) και 2.167(1) [4, 59, 66]. Καλύτερα αποτελέσματα μπορούμε να
πάρουμε αυξάνοντας τη στατιστική και το μέγεθος του πλέγματος, κάτι
που το αφήνουμε ως άσκηση στον αναγνώστη.
   Αξίζει τον κόπο να σημειώσουμε τη σχέση μεταξύ των δυναμικών
εκθετών των εξισώσεων (14.32) και (14.33). Από την εξίσωση (14.29)
χ = β⟨n⟩ και από την εξίσωση (13.10) χ ∼ |t|−γ , (13.6) ξ ∼ |t|−ν και στην
ψευδοκρίσιμη περιοχή ξ ∼ L παίρνουμε
                                 ⟨n⟩    zW L
                                            γ/ν
                                                    W
                             W
                       τm = τm     2
                                     ∼ L     2
                                                = Lz +γ/ν−2               (14.35)
                                 L          L
                  ∼ Lz , z W ≡ 0.54(2) και τm ∼ Lz . Οπότε παίρνουμε
                W               W
όπου υποθέσαμε τm
                                      γ
                                        − 2.
                                    z = zW +                 (14.36)
                                      ν
Χρησιμοποιώντας τις τιμές (13.12) γ = 7/4, ν = 1 παίρνουμε
                                        1
                              z = zW − ,                     (14.37)
                                        4
που ισχύει για τις τιμές που υπολογίσαμε, μέσα στα όρια του σφάλμα-
τος, καθώς και για τις τιμές της βιβλιογραφίας.
14.7. ΧΡΟΝΟΙ ΑΥΤΟΣΥΣΧΕΤΙΣΜΟΥ                                                637



                        L     γ(t < 0)      γ(t > 0)
                        40    1.7598(44)    1.730(17)
                        60    1.7455(24)    1.691(14)
                        80    1.7409(21)    1.737(12)
                       100    1.7420(24)    1.7226(75)
                       120    1.7390(15)    1.7725(69)
                       140    1.7390(23)    1.7354(72)
                       160    1.7387(10)    1.746(17)
                       200    1.7380(11)    1.759(15)
                       500    1.7335(8)     1.7485(83)


Πίνακας 14.2: Υπολογισμός του κρίσιμου εκθέτη γ από την προσαρμογή των δεδομένων
των Σχημάτων 14.14 και 14.15. Στην πρώτη στήλη προσαρμόζονται τα δεδομένα για
β > βc (t < 0) και στη δεύτερη τα δεδομένα για β < βc (t > 0). Στις παρενθέσεις
δίνονται τα στατιστικά σφάλματα των προσαρμογών και όχι τα συστηματικά που
προέρχονται από την επιλογή του διαστήματος της προσαρμογής. Η αναμενόμενη
τιμή είναι γ = 7/4.




                        L     β(t < 0)      β+ (t > 0)
                        40    0.1101(7)     0.1122(29)
                       60     0.1129(5)     0.1102(19)
                        80    0.1147(5)     0.1118(21)
                       100    0.1175(3)     0.1170(11)
                       120    0.1167(4)     0.1172(16)
                       140    0.1190(2)     0.1187(19)
                       160    0.1191(4)     0.1134(20)
                       200    0.1205(10)    0.1138(24)
                       500    0.1221(2)     0.1294(50)


Πίνακας 14.3: Υπολογισμός του κρίσιμου εκθέτη β από την προσαρμογή των δεδομένων
των Σχημάτων 14.16. Στην πρώτη στήλη προσαρμόζονται τα δεδομένα για β > βc (t <
0) και στη δεύτερη τα δεδομένα για β < βc (t > 0). Στις παρενθέσεις δίνονται τα
στατιστικά σφάλματα των προσαρμογών και όχι τα συστηματικά που προέρχονται
από την επιλογή του διαστήματος της προσαρμογής. Η αναμενόμενη τιμή είναι β =
β+ = 1/8.
638                              ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                 3

               2.5

                 2
         τm



               1.5

                 1

               0.5

                                                        c Lz
                 0
                     0      20       40         60     80      100
                                            L

Σχήμα 14.12: Οι χρόνοι αυτοσυσχετισμού τm της μαγνήτισης για τον αλγόριθμο του
Wolff για β = 0.4407. Η μονάδα του χρόνου είναι ένα Wolff sweep. Ο δυναμικός κρίσι-
μος εκθέτης βρίσκεται με την προσαρμογή της συνάρτησης cLz από όπου προκύπτει
z = 0.29(2).



14.8 Βάθμιση Θερμοκρασίας
Στην παράγραφο αυτή θα ελέγξουμε τον βαθμό με τον οποίο οι σχέσεις
(14.3)–(14.5) μπορούν να χρησιμοποιηθούν για τον υπολογισμό των κρί-
σιμων εκθετών γ, α και β. Το συμπέρασμα που θα βγάλουμε είναι πως
οι σχέσεις αυτές δεν είναι η καλύτερη επιλογή για τον εν λόγω υπολο-
γισμό και ότι θα πρέπει να αποφεύγονται, αν είναι δυνατόν¹⁹. Για να
δούμε καθαρή βάθμιση, θα πρέπει να προσομοιώσουμε για πολύ μικρά
t ≪ 1 και για αρκετά μεγάλο L λόγω των μεγάλων φαινομένων επί-
δρασης πεπερασμένου μεγέθους (finite size effects). Επίσης, υπάρχουν
παραδείγματα που οι τιμές που παίρνει κανείς εξαρτώνται ισχυρά από
το διάστημα προσαρμογής των δεδομένων με αποτέλεσμα να έχουμε με-
γάλα συστηματικά σφάλματα από τη διαδικασία προσαρμογής (fitting)
ή ακόμα και λάθος αποτελέσματα²⁰.
   ¹⁹Παρατηρήστε πως στο συγκεκριμένο μοντέλο η κρίσιμη θερμοκρασία μας είναι
επακριβώς γνωστή. Όταν δεν την γνωρίζουμε, τότε υπεισέρχονται επιπλέον συστημα-
τικά σφάλματα που δυσχεραίνουν τον υπολογισμό. Για τον αριθμητικό υπολογισμό
της κρίσιμης θερμοκρασίας θα μιλήσουμε σε επόμενη παράγραφο.
   ²⁰Στο σύγγραμμα [4] αναφέρεται πως στο random field Ising model παρουσιάζεται
ψευδοβάθμιση για ένα διάστημα του t, ενώ για πολύ μικρότερο t έχουμε crossover σε
14.8. ΒΑΘΜΙΣΗ ΘΕΡΜΟΚΡΑΣΙΑΣ                                                   639

               10000



                1000
         τm




                 100



                   10


                                                         c Lz
                    1
                             20       40          60    80      100
                                              L

Σχήμα 14.13: Οι χρόνοι αυτοσυσχετισμού τm,Metropolis της μαγνήτισης για τον αλγό-
ριθμο Metropolis για β = 0.4407. Η μονάδα του χρόνου είναι ένα Metropolis sweep. Ο
δυναμικός κρίσιμος εκθέτης βρίσκεται με την προσαρμογή της συνάρτησης cLz από
όπου προκύπτει z = 2.21(2).




    Για τον λόγο αυτό προσομοιώσαμε το πρότυπο Ising για L = 40, 60,
80, 100, 120, 140, 160, 200 και 500. Διαλέξαμε θερμοκρασίες που αντι-
στοιχούν σε αρκετά μικρά t γύρω από την κρίσιμη θερμοκρασία. Στο
συνοδευτικό λογισμικό θα βρείτε τα shell scripts που χρησιμοποιήθηκαν
για τον λόγο αυτό.
    Αρχικά υπολογίζουμε τον εκθέτη γ από τη σχέση (14.3). Προσαρμό-
ζουμε στην κατάλληλη περιοχή του |t| την τιμή της χ(t) για κάθε τιμή του
L στη συνάρτηση a |t|−γ που έχει δύο ανεξάρτητες παραμέτρους γ, a. Η
επιλογή του διαστήματος γίνεται με τον εντοπισμό γραμμικής συμπε-
ριφοράς της χ(t) σε διάγραμμα με λογαριθμική κλίμακα και στους δύο
άξονες²¹. Παρατηρούμε ότι για μεγάλο |t| έχουμε απόκλιση από τη γραμ-
μική συμπεριφορά, ενώ για πολύ μικρό |t| παρουσιάζονται σφάλματα
από τα φαινόμενα επίδρασης πεπερασμένου μεγέθους, όταν ξ ≈ L. Κα-
θώς το L μεγαλώνει, τα φαινόμενα επίδρασης πεπερασμένου μεγέθους
μειώνονται και τα δεδομένα πλησιάζουν κοντύτερα προς την ασυμπτω-
τική συμπεριφορά |t|−γ για ολοένα και μικρότερο |t|. Τα αποτελέσματα

διαφορετική βάθμιση που δίνει το σωστό εκθέτη. Δείτε επίσης τα [67], [68].
   ²¹Η προσαρμογή μπορεί να γίνει και με γραμμική προσαρμογή σε ευθεία των ση-
μείων (log |ti | , log χ(ti )) με απλή μέθοδο ελαχίστων τετραγώνων.
640                             ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

               ✁✥✥✥




                ✁✥✥




                 ✁✥
                       ▲✝✞✥
           ❝
                       ▲✝✟✥
                       ▲✝✠✥
                  ✁
                      ▲✝✁✥✥
                      ▲✝✁✡✥
                      ▲✝✁✞✥
                ✥ ✁   ▲✝✁✟✥
                      ▲✝✡✥✥
                      ▲✝☛✥✥


                                  ✥ ✥✁               ✥ ✁

                                         ⑤✂⑤ ✄✂☎✥✆


Σχήμα 14.14: Οι συναρτήσεις της μαγνητικής επιδεκτικότητας χ(t, L) στην περιοχή
θερμοκρασιών που παρουσιάζεται βάθμιση σύμφωνα με την σχέση (14.3). Η ευθεία
γραμμή είναι προσαρμογή στη σχέση αυτή για το μεγαλύτερο πλέγμα. Παρατηρήστε
την ελάττωση των finite size effects καθώς το L μεγαλώνει και το διάστημα προσαρ-
μογής επεκτείνεται σε ολοένα μικρότερα |t|. Τα δεδομένα είναι για θερμοκρασίες
β > βc (t < 0) όπου το κρίσιμο σημείο προσεγγίζεται από τη φάση τάξης.




είναι καθαρότερα για β > βc (t < 0), γιατί για t > 0 οι διακυμάνσεις εί-
ναι ισχυρότερες κοντά στην ψευδοκρίσιμη θερμοκρασία βc (L) < βc και
έχουμε μεγαλύτερα φαινόμενα επίδρασης πεπερασμένου μεγέθους.
   Στον πίνακα 14.2 σημειώνουμε τα αποτελέσματα για τον εκθέτη γ
για όλες τις τιμές του L που μετρήσαμε. Τα σφάλματα που σημειώνο-
νται στον πίνακα είναι τα απλά στατιστικά σφάλματα της προσαρμο-
γής που έδωσε το αναφερόμενο αποτέλεσμα και είναι πολύ μικρότερο
από το συστηματικό σφάλμα της προσαρμογής. Το τελευταίο προέρχε-
ται κυρίως από την εκτίμηση του διαστήματος θερμοκρασιών t που θα
συμπεριλάβουμε στην προσαρμογή. Μία συστηματική αντιμετώπιση της
εκτίμησης των σφαλμάτων αυτών είναι να αλλάζουμε το διάστημα αυτό
και να συμπεριλάβουμε στις δυνατές τιμές αυτές που προκύπτουν από
όλες τις αποδεκτές προσαρμογές στη συνάρτηση που επιλέξαμε. Κα-
μιά φορά αυτό δίνει υπερεκτιμημένο σφάλμα και έγκειται στην “τέχνη”
και εμπειρία μας να αποφασίσουμε τις τιμές που θα κρατήσουμε. Για
παράδειγμα, από τα σχήματα 14.14 και 14.15 παρατηρούμε ότι το διά-
στημα της προσαρμογής γίνεται πιο ευδιάκριτο μελετώντας την χ(t) για
ολοένα και μεγαλύτερα L. Καθώς το L μεγαλώνει, τα σημεία πλησιά-
14.8. ΒΑΘΜΙΣΗ ΘΕΡΜΟΚΡΑΣΙΑΣ                                                   641


               ✥




                ✥

           ❝

                        ▲✝✞
                        ▲✝✟
                   ✥    ▲✝✠
                       ▲✝✥
                       ▲✝✥✡
                       ▲✝✥✞
                       ▲✝✥✟
                       ▲✝✡
                       ▲✝☛
                               ✁ ✥                                   ✁✥
                                             ⑤✂⑤ ✄✂☎ ✆

Σχήμα 14.15: Οι συναρτήσεις της μαγνητικής επιδεκτικότητας χ(t, L) στην περιοχή
θερμοκρασιών που παρουσιάζεται βάθμιση σύμφωνα με την σχέση (14.3). Η ευθεία
γραμμή είναι προσαρμογή στη σχέση αυτή για το μεγαλύτερο πλέγμα. Παρατηρήστε
την ελάττωση των finite size effects καθώς το L μεγαλώνει και το διάστημα προσαρ-
μογής επεκτείνεται σε ολοένα μικρότερα |t|. Τα δεδομένα είναι για θερμοκρασίες
β < βc (t > 0) όπου το κρίσιμο σημείο προσεγγίζεται από τη φάση αταξίας. Τα finite
size effects είναι μεγαλύτερα από την περίπτωση t < 0 λόγω της επίδρασης των μεγά-
λων διακυμάνσεων στο ψευδοκρίσιμο σημείο βc (L) < βc .



ζουν προς την ασυμπτωτική καμπύλη ολοένα και περισσότερο. Επίσης,
οι λογικές τιμές για τις παραμέτρους που υπεισέρχονται στην προσαρ-
μογή μπορούν να αποτελέσουν και αυτές ένα κριτήριο αποδοχής ή όχι
του αποτελέσματος μιας προσαρμογής (λ.χ. να έχει η σταθερά a τιμές
∼ 1). Λαμβάνοντας υπόψη τα παραπάνω, μπορούμε να αναφέρουμε τα
αποτελέσματα
                       γ = 1.74 ± 0.02  (t < 0) ,            (14.38)

                              γ = 1.73 ± 0.04            (t > 0) .        (14.39)
Στη συνέχεια, υπολογίζουμε τον κρίσιμο εκθέτη β από την εξίσωση
(14.5). Η σχέση αυτή ισχύει, καθώς προσεγγίζουμε το κρίσιμο σημείο
από την ψυχρή περιοχή β > βc ή t < 0. Στο θερμοδυναμικό όριο η
μαγνήτιση είναι παντού μηδέν για κάθε β < βc . Παρόλα αυτά, στο πε-
περασμένο πλέγμα ⟨m⟩ > 0 και είναι λογικό να περιμένουμε μία σχέση
βάθμισης της μορφής

                              ⟨m⟩ ∼ |t|β+ −1 ,           t > 0.           (14.40)
642                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                ✥ ✆
                       ▲✌✍✥
                       ▲✌✂✥
                       ▲✌☎✥
                ✥ ☎   ▲✌✝✥✥
                      ▲✌✝✎✥
                      ▲✌✝✍✥
                      ▲✌✝✂✥
            ✟   ✥ ✄
                      ▲✌✎✥✥
            ✞
            ❁         ▲✌✁✥✥




                ✥ ✂




                ✥ ✁
                      ✥ ✥✥✝                   ✥ ✥✝                   ✥ ✝

                                          ⑤✠⑤ ✡✠☛✥☞


Σχήμα 14.16: Οι συναρτήσεις της μαγνήτισης ⟨m⟩(t, L) στην περιοχή θερμοκρασιών
που παρουσιάζεται βάθμιση σύμφωνα με την σχέση (14.5). Η ευθεία γραμμή είναι
προσαρμογή στη σχέση αυτή για το μεγαλύτερο πλέγμα. Παρατηρήστε την ελάττωση
των finite size effects καθώς το L μεγαλώνει και το διάστημα προσαρμογής επεκτείνεται
σε ολοένα μικρότερα |t|. Τα δεδομένα είναι για θερμοκρασίες β > βc (t < 0) όπου το
κρίσιμο σημείο προσεγγίζεται από τη φάση τάξης.



όπου ο ορισμός του β+ γίνεται έτσι, γιατί όπως θα δούμε

                                 β+ = β = 1/8 .                            (14.41)

   Ακολουθούμε τη διαδικασία προσαρμογής των δεδομένων που πε-
ριγράψαμε παραπάνω. Τα αποτελέσματα για τους εκθέτες β και β+
καταγράφονται στον πίνακα 14.3. Λαμβάνοντας υπόψη τα συστημα-
τικά σφάλματα που περιγράψαμε παραπάνω βρίσκουμε ότι

                          β = 0.121 ± 0.003           t < 0,               (14.42)


                         β+ = 0.120 ± 0.007           t < 0,               (14.43)
που πρέπει να συγκριθεί με την αναμενόμενη τιμή β = β+ = 1/8.
   Η περίπτωση του εκθέτη α χρειάζεται ιδιαίτερη προσοχή. Η τιμή που
αναμένεται είναι α = 0. Αυτό δε σημαίνει ότι c ∼ σταθ αλλά ότι²²

                                  c ∼ |log |t|| .                          (14.44)
  ²²Αυτό δεν αποκλείει η κύρια συμπεριφορά να είναι μια δύναμη του λογαρίθμου ή
λογάριθμος του λογαρίθμου κλπ. Αυτό θα πρέπει να μελετηθεί με προσοχή.
14.9. ΒΑΘΜΙΣΗ ΠΕΠΕΡΑΣΜΕΝΟΥ ΜΕΓΕΘΟΥΣ                                           643

                                                              ✆▲✡✥
                                                              ✆▲☛✥
                                                              ✆▲☞✥
                                                              ✆▲✁✥✥
                                                              ✆▲✁✌✥
                                                              ✆▲✁✡✥
                 ✥ ✁
                                                              ✆▲✁☛✥
            ✄
            ✂                                                 ✆▲✌✥✥
            ❁
                                                              ✆▲✍✥✥




                ✥ ✥✁



                          ✁                           ✁✥              ✁✥✥
                                                ✶✝♥
                                        ⑤☎⑤ ✆         ✞☎✟✥✠


Σχήμα 14.17: Οι συναρτήσεις της μαγνήτισης ⟨m⟩(t, L) στην περιοχή θερμοκρασιών
που παρουσιάζεται βάθμιση σύμφωνα με την σχέση (14.40). Η ευθεία γραμμή είναι
προσαρμογή στη σχέση αυτή για το μεγαλύτερο πλέγμα. Παρατηρήστε την ελάττωση
των finite size effects καθώς το L μεγαλώνει και το διάστημα προσαρμογής επεκτείνεται
σε ολοένα μικρότερα |t|. Τα δεδομένα είναι για θερμοκρασίες β < βc (t > 0) όπου το
κρίσιμο σημείο προσεγγίζεται από τη φάση αταξίας.



Στην περίπτωση αυτή βρίσκουμε ότι τα δεδομένα προσαρμόζονται κα-
λύτερα στην παραπάνω σχέση παρά σε μια σχέση δύναμης, όπως στην
περίπτωση της μαγνήτισης και της μαγνητικής επιδεκτικότητας. Αυτό
μπορεί να φανεί εποπτικά κάνοντας τη γραφική παράσταση σε λογα-
ριθμική κλίμακα μόνο κατά τον άξονα |t| και να συγκρίνουμε με την
ανάλογη γραφική παράσταση όπου και οι δύο άξονες είναι σε λογαριθ-
μική κλίμακα. Βρίσκουμε ότι τα δεδομένα μας ακολουθούν μια ευθεία
στην πρώτη περίπτωση ενώ στη δεύτερη όχι. Μια προσεκτική μελέτη
θα συγκρίνει την ποιότητα των προσαρμογών στις δύο συναρτήσεις και
θα επιλέξει το καλύτερο μοντέλο. Το αφήνουμε ως άσκηση στον ανα-
γνώστη.


14.9       Βάθμιση Πεπερασμένου Μεγέθους
Στην παράγραφο αυτή θα υπολογίσουμε τους κρίσιμους εκθέτες με τη
βοήθεια των σχέσεων (14.7)-(14.9), δηλ. με τη βάθμιση που παρουσιά-
ζουν ασυμπτωτικά οι χ(β = βc , L), c(β = βc , L) και ⟨m⟩(β = βc , L), καθώς
το μέγεθος του συστήματος αυξάνει. Η διεθνής ορολογία για τη μέθοδο
αυτή του υπολογισμού είναι “finite size scaling”.
644                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                ✥ ✝




                ✥ ✆




                ✥ ☎

                       ▲☞✄✥
            ❝
                       ▲☞✆✥
                ✥ ✄
                       ▲☞✌✥
                      ▲☞✞✥✥
                      ▲☞✞✁✥
                ✥ ✂
                      ▲☞✞✄✥
                      ▲☞✞✆✥
                      ▲☞✁✥✥
                ✥ ✁
                      ▲☞☎✥✥


                                       ✥ ✥✞                     ✥ ✞

                                          ⑤✟⑤ ✠✟✡✥☛


Σχήμα 14.18: Οι συναρτήσεις της ειδικής θερμότητας c(t, L) στην περιοχή θερμοκρα-
σιών που παρουσιάζεται βάθμιση σύμφωνα με την σχέση (14.44). Παρατηρήστε ότι
μόνο ο άξονας |t| είναι σε λογαριθμική κλίμακα. Τα δεδομένα είναι για θερμοκρασίες
β > βc (t < 0) όπου το κρίσιμο σημείο προσεγγίζεται από τη φάση τάξης.




   Η σχέση (14.7) δίνει τον εκθέτη γ/ν. Για τον υπολογισμό του, χρη-
σιμοποιούμε τις τιμές της μαγνητικής επιδεκτικότητας στη γνωστή θερ-
μοκρασία βc για διαφορετικές τιμές του L. Με προσαρμογή των τιμών
χ(βc , L) στη συνάρτηση aLg υπολογίζουμε τις σταθερές a και g και συ-
γκρίνουμε την τελευταία με την αναμενόμενη τιμή γ/ν = 7/4 = 1.75. Στη
διαδικασία των προσαρμογών πρέπει να αποφασίσουμε ποιες τιμές του
L θα χρησιμοποιήσουμε. Φυσικά, το πρώτο κριτήριο είναι οι προσαρ-
μογές να δίνουν αποδεκτό χ2 /dof ≲ 1 και το σφάλμα στις σταθερές g
και a να είναι μικρό, αλλά παρατηρούμε ότι και ο περιορισμός αυτός

                         L          γ/ν          β/ν
                       40–100       1.754(1)     0.1253(1)
                      140–1000      1.740(2)     0.1239(3)
                      40–1000       1.749(1)     0.1246(1)


Πίνακας 14.4: Οι κρίσιμοι εκθέτες γ/ν και β/ν που δίνονται από τη μελέτη βάθμι-
σης μεγέθους των σχέσεων (14.7) και (14.9). Στην πρώτη στήλη δίνονται τα διαστή-
ματα στις τιμές του L που θεωρήθηκαν στην προσαρμογή των τιμών των χ(βc , L) και
⟨m⟩(βc , L) σε συναρτήσεις της μορφής aLg και δίπλα οι αντίστοιχες τιμές για (την
απόλυτη τιμή) των εκθετών g που προκύπτουν.
14.9. ΒΑΘΜΙΣΗ ΠΕΠΕΡΑΣΜΕΝΟΥ ΜΕΓΕΘΟΥΣ                                          645

                 ✥ ✂


                ✥ ✆✂


                 ✥ ✆


                ✥ ☎✂

                        ▲✡✆✥
            ❝    ✥ ☎
                        ▲✡☛✥
                        ▲✡☞✥
                ✥ ✄✂
                       ▲✡✁✥✥

                 ✥ ✄   ▲✡✁✄✥
                       ▲✡✁✆✥
                ✥ ✁✂   ▲✡✁☛✥
                       ▲✡✄✥✥
                 ✥ ✁   ▲✡✂✥✥


                                                      ✥ ✁

                                          ⑤✝⑤ ✞✝✟✥✠


Σχήμα 14.19: Οι συναρτήσεις της ειδικής θερμότητας c(t, L) στην περιοχή θερμοκρα-
σιών που παρουσιάζεται βάθμιση σύμφωνα με την σχέση (14.44). Παρατηρήστε ότι
μόνο ο άξονας |t| είναι σε λογαριθμική κλίμακα. Τα δεδομένα είναι για θερμοκρασίες
β < βc (t > 0) όπου το κρίσιμο σημείο προσεγγίζεται από τη φάση αταξίας.



δεν είναι αρκετός: Στον πίνακα 14.4 βλέπουμε μικρές μεταβολές στις
τιμές του εκθέτη γ/ν που παίρνουμε για διαφορετικά διαστήματα προ-
σαρμογής. Οι μεταβολές αυτές μας δίνουν ένα μέτρο του συστηματικού
σφάλματος στον προσδιορισμό τους. Στο πρόβλημα 9 σας ζητείται να
δοκιμάσετε τον υπολογισμό μόνοι σας. Στον πίνακα 14.4 δίνονται τα
αποτελέσματα και στο σχήμα 14.20 η αντίστοιχη γραφική παράσταση.
Το τελικό αποτέλεσμα, λαμβάνοντας υπόψη το συστηματικό σφάλμα,
είναι:
                          γ
                            = 1.748 ± 0.005 .               (14.45)
                          ν
   Η σχέση (14.9) δίνει τον εκθέτη β/ν. Για τον υπολογισμό του, ακο-
λουθούμε ανάλογη διαδικασία για τις τιμές της μαγνήτισης ⟨m⟩(βc , L)
στην κρίσιμη θερμοκρασία. Το αποτέλεσμα είναι

                             β
                               = 0.1245 ± 0.0006 .                       (14.46)
                             ν

   Η σχέση (14.9) δίνει τον εκθέτη α/ν. Αλλά η αναμενόμενη τιμή α = 0
οδηγεί, σε αναλογία με τη σχέση (14.44), στη σχέση

                               c(βc , L) ∼ log L .                        (14.47)
646                                     ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                   ✥
                                   ❣✝✞❂✥✟✠✡☛☞✌✍ ✟   ✥



                       ✥
            ✆
            ☎✱
            ✂✁ ✄
            ❝
                           ✥



                               ✥
                                           ✥                       ✥
                                                    ▲
Σχήμα 14.20: Οι τιμές χ(βc , L) στην κρίσιμη θερμοκρασία για διαφορετικές τιμές του
L. Οι κλίμακες στους άξονες είναι λογαριθμικές και η γραμμική σχέση των δεδομένων
που προκύπτει, αποδεικνύει τη σχέση δύναμης χ(βc , L) = cLg . Με προσαρμογή των
δεδομένων στην συνάρτηση αυτή, ο υπολογισμός του εκθέτη g δίνει τον κρίσιμο εκθέτη
γ/ν, όπως προκύπτει από τη σχέση (14.7).




   Η σχέση αυτή δείχνεται στο σχήμα 14.22. Ο κάθετος άξονας δεν εί-
ναι σε λογαριθμική κλίμακα, ενώ ο οριζόντιος είναι. Η γραμμική σχέση
των δεδομένων στο σχήμα δείχνει ότι είναι συμβατά με την εξίσωση
(14.47). Στο πρόβλημα 9 θα πρέπει να δείξετε αν η προσαρμογή των
δεδομένων στο λογάριθμο είναι καλύτερη από την προσαρμογή σε μια
συνάρτηση δύναμης της μορφής cLa + b και να μελετήσετε τις δυσκο-
λίες που προκύπτουν στη μελέτη αυτή. Βελτιώνοντας τα δεδομένα του
πίνακα 14.8 με μεγαλύτερη στατιστική (ελάττωση στατιστικού σφάλ-
ματος) και μετρήσεις σε μεγαλύτερα L, τα αποτελέσματα μπορούν να
γίνουν ακόμα καθαρότερα.
   Παρατηρούμε ότι με τη μέθοδο βάθμισης πεπερασμένου μεγέθους
(finite size scaling) οι τιμές που προκύπτουν για τους κρίσιμους εκθέτες
προκύπτουν ευκολότερα από τη μελέτη της βάθμισης ως προς τη θερμο-
κρασία που μελετήσαμε στην παράγραφο 14.8. Οι τιμές που μετράμε
ακολουθούν την ασυμπτωτική σχέση βάθμισης που δίνουν οι σχέσεις
(14.7)–(14.9) με πολύ μικρότερη επίδραση των φαινομένων επίδρασης
πεπερασμένου μεγέθους²³. Μπορούμε με τη μελέτη πολύ μικρότερου συ-

   ²³Θυμίζουμε στον αναγνώστη πως στους υπολογισμούς που δώσανε τις παραπάνω
τιμές είχαμε μεγαλύτερη αστάθεια στις προσαρμογές ως προς την επιλογή διαστήμα-
14.10. ΠΡΟΣΔΙΟΡΙΣΜΟΣ ΤΗΣ βC                                                     647

                      ✥ ☎




                      ✥ ✄

             ☞
             ✱☛
                  ❝
             ❜
             ✡
             ✠
             ✟
             ❁        ✥ ✂




                                 ✌✍✎❂✥ ✝✞✁✄✏✑✒✥ ✥✥✥✝
                      ✥ ✁
                            ✁✥     ✄✥   ✆✥✝✥✥   ✝✄✥✞✥✥     ✂✥✥      ✝✥✥✥

                                                  ▲


Σχήμα 14.21: Οι τιμές ⟨m⟩(βc , L) στην κρίσιμη θερμοκρασία για διαφορετικές τιμές του
L. Οι κλίμακες στους άξονες είναι λογαριθμικές και η γραμμική σχέση των δεδομένων
που προκύπτει, αποδεικνύει τη σχέση δύναμης ⟨m⟩(βc , L) = cLg . Με προσαρμογή των
δεδομένων στην συνάρτηση αυτή, ο υπολογισμός του εκθέτη g δίνει τον κρίσιμο εκθέτη
β/ν, όπως προκύπτει από τη σχέση (14.9).



στήματος να πάρουμε τιμές που έχουν μεγαλύτερη ακρίβεια και προ-
κύπτουν καθαρότερα από αυτές που δώσαμε στις εξισώσεις (14.38),
(14.39), (14.42), (14.43).


14.10             Προσδιορισμός της βc
Στην παράγραφο 14.3 συζητήσαμε τη βάθμιση των φυσικών ποσοτή-
των ως συνάρτηση της ανηγμένης θερμοκρασίας t και του μεγέθους του
συστήματος L. Τη συζήτηση βοήθησε √  σημαντικά η γνώση της ακριβούς
κρίσιμης θερμοκρασίας βc = log(1 + 2)/2 η οποία είναι γνωστή από
τους αναλυτικούς υπολογισμούς και ειδικότερα από τη λύση του On-
sager [55]. Δυστυχώς, στις περισσότερες ενδιαφέρουσες περιπτώσεις η
κρίσιμη παράμετρος δεν είναι γνωστή. Στην περίπτωση αυτή η ανάλυση
γίνεται δυσκολότερη, αφενός μεν γιατί η κρίσιμη θερμοκρασία πρέπει
να υπολογιστεί και αφετέρου, διότι η πεπερασμένη ακρίβεια υπολογι-
σμού της (άρα και στον υπολογισμό της t) εισάγει σημαντικά συστη-
τος των τιμών των δεδομένων. Στην επόμενη παράγραφο θα δούμε ότι όταν η ακριβής
τιμή της κρίσιμης θερμοκρασίας μας είναι άγνωστη, η υπεροχή του finite size scaling
είναι ακόμα μεγαλύτερη.
648                                ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                      ✥ ✆✂


                       ✥ ✆


                      ✥ ☎✂


                       ✥ ☎
             ☞
             ☛✱
                  ✡   ✥ ✄✂
             ❜
             ✠
             ❝
                       ✥ ✄


                      ✥ ✂✂


                       ✥ ✂


                      ✥ ✁✂
                             ✁✥   ✄✥   ✆✥ ✝✥✥   ✝✁✥   ✞✥✥   ✟✥✥ ✁✥✥✂✥✥

                                                ▲


Σχήμα 14.22: Οι τιμές c(βc , L) στην κρίσιμη θερμοκρασία για διαφορετικές τιμές του
L. Η κλίμακα στον οριζόντιο άξονα είναι λογαριθμική, ενώ στον κάθετο δεν είναι. Αυτό
αποδεικνύει τη σχέση c(βc , L) = c log L το οποίο αποδεικνύεται και με την προσαρ-
μογή των δεδομένων στην αντίστοιχη συνάρτηση. Αυτό είναι συμβατό με το γνωστό
αποτέλεσμα α = 0 στη σχέση (14.8).




ματικά σφάλματα στον υπολογισμό των κρίσιμων εκθετών. Επίσης, η
μη εκ των προτέρων γνώση της βc κάνει την επιλογή των τιμών που θα
επιλέξουμε στις σχέσεις βάθμισης (14.7)–(14.9) να πρέπει να προσδιο-
ριστεί ακριβώς, ώστε να έχουμε γρήγορη σύγκλιση στην ασυμπτωτική
συμπεριφορά και ελαχιστοποίηση των συστηματικών σφαλμάτων. Εδώ
η κατανόηση της αιτίας της βάθμισης των φυσικών ποσοτήτων μπορεί
να βοηθήσει. Ο λόγος που οδηγεί την ψευδοκρίσιμη συμπεριφορά ενός
πεπερασμένου συστήματος που παρουσιάζει συνεχή μετάβαση φάσης
στο θερμοδυναμικό όριο είναι η αύξηση του μήκους συσχετισμού ξ σε
μέγεθος που συγκρίνεται με το μέγεθος του συστήματος L. Περαιτέρω
αύξηση του ξ “πνίγεται” από το πεπερασμένο μέγεθος του πλέγματος
και παρουσιάζονται τα φαινόμενα επίδρασης πεπερασμένου μεγέθους
(finite size effects). Αυτά τα μεγάλα finite size effects προσδιορίζουν την
ψευδοκρίσιμη περιοχή. Στην περιοχή αυτή, ποσότητες που απειρίζονται
στο θερμοδυναμικό όριο (ή παρουσιάζουν μη αναλυτική συμπεριφορά,
λ.χ. απότομη αλλαγή της τιμής της παραγώγου), έχουν πεπερασμένη,
μέγιστη τιμή (ή πλησιάζουν προς τη μη αναλυτική συμπεριφορά). Αυτή,
καθώς το μέγεθος του συστήματος μεγαλώνει, εκτείνεται σε μια όλο
και πιο στενή περιοχή γύρω από την κρίσιμη θερμοκρασία. Οποιαδή-
14.10. ΠΡΟΣΔΙΟΡΙΣΜΟΣ ΤΗΣ βC                                                    649

           L     βc (L)          χmax         βc′ (L)         cmax
          40     0.4308(4)       30.68(4)     0.437(1)        0.5000(20)
          60     0.4342(2)       62.5(1)      0.4382(7)       0.5515(15)
          80     0.4357(2)       103.5(1)     0.4388(5)       0.5865(12)
         100     0.4368(1)       153.3(2)     0.4396(2)       0.6154(18)
         120     0.4375(1)       210.9(2)     0.4396(4)       0.6373(20)
         140     0.43793(13)     276.2(4)     0.4397(5)       0.6554(18)
         160     0.4382(1)       349.0(5)     0.4398(4)       0.6718(25)
         200     0.43870(7)      516.3(7)     0.4399(2)       0.6974(17)
         500     0.43988(4)      2558(5)      0.44038(8)      0.7953(25)
        1000     0.44028(4)      8544(10)     0.44054(8)      0.8542(36)


Πίνακας 14.5: Ο υπολογισμός των ψευδοκρίσιμων θερμοκρασιών βc (L) και βc′ (L) που
προκύπτουν από τον υπολογισμό της θέσης των μέγιστων της μαγνητικής επιδεκτι-
κότητας χmax και της ειδικής θερμότητας cmax αντίστοιχα. Δίνονται και οι αντίστοιχες
τιμές των μέγιστων.


ποτε τιμή και αν πάρουμε στην περιοχή αυτή με συστηματικό τρόπο²⁴
για αρκετά μεγάλο L θα πάρουμε τις ασυμπτωτικές συμπεριφορές που
δίνονται από τις σχέσεις (14.7)-(14.9). Μία επιλογή που δίνει καλά απο-
τελέσματα είναι να υπολογίσουμε τις ποσότητες στην ψευδοκρίσιμη
θερμοκρασία βc (L). Αυτή ορίζεται από την τιμή που παρουσιάζεται το
μέγιστο των διακυμάνσεων της παραμέτρου τάξης που εδώ είναι η μα-
γνήτιση ⟨m⟩
                         χ(βc (L), L) ≡ χmax (L) .               (14.48)
Στην περίπτωση αυτή, στο αριστερό μέλος των εξισώσεων (14.7)–(14.9)
είναι οι τιμές κάθε φυσικής ποσότητας για β = βc (L).
    Ο ορισμός της βc (L) μπορεί να μην είναι μοναδικός. Θα μπορούσε
λ.χ. κανείς να χρησιμοποιήσει το μέγιστο της ειδικής θερμότητας

                             c(βc′ (L), L) ≡ cmax (L) .                    (14.49)

που ορίζει μια διαφορετική βc′ (L). Προφανώς limL→∞ βc (L) = limL→∞ βc′ (L)
= βc οπότε και οι δύο επιλογές θα δώσουν τα ίδια αποτελέσματα για
αρκετά μεγάλα L. Δεν συμβαίνει όμως το ίδιο γρήγορα και για τις δύο
επιλογές, οπότε είναι συνήθως ευνοϊκή μία από αυτές (εδώ η βc (L)).
   Το πρώτο βήμα είναι ο υπολογισμός του βc . Όταν είμαστε στην ψευ-
δοκρίσιμη περιοχή, έχουμε ξ ≈ L, οπότε η βασική σχέση (14.2) δίνει
  ²⁴Όπως λ.χ. κάναμε στην παράγραφο 14.3 όπου υπολογίσαμε κάθε ποσότητα ακρι-
βώς στην βc .
650                                 ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                    0.442
                                                fit to: βc - c (1/L)1/ν
                     0.44               1/ν =     1.006 +/- 0.017
                                         βc = 0.44066 +/- 0.00003
                    0.438

                    0.436
            βc(L)



                    0.434

                    0.432

                     0.43

                    0.428
                            0   0.005    0.01    0.015      0.02      0.025   0.03
                                                  1/L

Σχήμα 14.23: Προσδιορισμός της κρίσιμης θερμοκρασίας βc και του κρίσιμου εκθέτη ν
από τη σχέση (14.50). Χρησιμοποιώντας τις τιμές των ψευδοκρίσιμων θερμοκρασιών
βc (L) από τον πίνακα 14.5 προσαρμόζουμε τα δεδομένα σε μια συνάρτηση a−c(1/L)b .
Από τις τιμές που προκύπτουν για τις παραμέτρους a, b και c υπολογίζουμε
                                                             √           τα βc = a,
1/ν = b. Η οριζόντια γραμμή είναι η ακριβής τιμή βc = log(1 + 2)/2 = 0.44069 . . ..




                βc − βc (L)                                c
                            ∼ ξ − ν ∼ L− ν ⇒ βc (L) = βc − 1 .
                                  1      1
        |t| =                                                                        (14.50)
                    βc                                    Lν

Η διαδικασία είναι απλή, ως προς την αρχή της: Μετράμε αρχικά τη μα-
γνητική επιδεκτικότητα. Για κάθε L προσδιορίζουμε την ψευδοκρίσιμη
περιοχή και υπολογίζουμε τη θέση βc (L) και την τιμή του μέγιστου χmax .
Για να γίνει αυτό μπορεί να χρειαστεί να πάρουμε αρκετές μετρήσεις
γύρω από τη βc (L). Ιδιαίτερη προσοχή δίνουμε στο να έχουμε αρκετές
ανεξάρτητες μετρήσεις μετρώντας τον χρόνο αυτοσυσχετισμού (αυτός
αυξάνει με το μέγεθος L σαν τ ∼ Lz ) και φυσικά να έχουμε φτάσει στην
κατάσταση θερμικής ισορροπίας. Χρησιμοποιούμε τη σχέση (14.50) και
προσαρμόζουμε τα δεδομένα μας σε μια συνάρτηση της μορφής a−c/Lb
και από τις τιμές που προκύπτουν για τις σταθερές a, b και c υπολογί-
ζουμε τις βc = a, ν = 1/b. Σε περίπτωση που γνωρίζουμε μια από τις
σταθερές βc , ν κρατάμε στην προσαρμογή τις αντίστοιχες παραμέτρους
a, b σταθερές και υπολογίζουμε την άλλη.
    Τα αποτελέσματα παρουσιάζονται στο σχήμα 14.23 όπου γίνεται η
γραφική παράσταση των δεδομένων του πίνακα 14.5. Το αποτέλεσμα
14.10. ΠΡΟΣΔΙΟΡΙΣΜΟΣ ΤΗΣ βC                                                           651


                     0.441                       fit to: βc - c (1/L)1/ν

                      0.44                  1/ν =   1.09 +/- 0.18
                                          βc = 0.44062 +/- 0.00008

                     0.439
            β’c(L)




                     0.438

                     0.437

                     0.436

                     0.435
                             0    0.005   0.01    0.015      0.02      0.025   0.03
                                                   1/L

Σχήμα 14.24: Προσδιορισμός της κρίσιμης θερμοκρασίας βc και του κρίσιμου εκθέτη ν
από τη σχέση (14.50). Χρησιμοποιώντας τις τιμές των ψευδοκρίσιμων θερμοκρασιών
βc′ (L) από τον πίνακα 14.5 προσαρμόζουμε τα δεδομένα σε μια συνάρτηση a−c(1/L)b .
Από τις τιμές που προκύπτουν για τις παραμέτρους a, b και c υπολογίζουμε
                                                             √           τα βc = a,
1/ν = b. Η οριζόντια γραμμή είναι η ακριβής τιμή βc = log(1 + 2)/2 = 0.44069 . . ..



είναι:

                                 βc = 0.44066 ± 0.00003
                                  1
                                    = 1.006 ± 0.017 .
                                 ν
                                                           √
Αυτό μπορεί να συγκριθεί με τις γνωστές τιμές βc = log(1 + 2)/2 ≈
0.44069 και 1/ν = 1.
    Η διαδικασία επαναλαμβάνεται για τις ψευδοκρίσιμες θερμοκρασίες
 ′
βc (L) όπου προκύπτουν από τα μέγιστα της ειδικής θερμότητας cmax .Τα
αποτελέσματα παρουσιάζονται στο σχήμα 14.24. Το αποτέλεσμα είναι:

                                 βc = 0.44062 ± 0.00008
                                  1
                                    = 1.09 ± 0.18 .
                                 ν
Παρατηρούμε από το σχήμα 14.24 και από τα παραπάνω αποτελέσματα
ότι η μέτρηση από τη μελέτη της ειδικής θερμότητας δίνει αποτελέσματα
συμβατά με τις εξισώσεις (14.51), αλλά με πολύ μικρότερη ακρίβεια και
καθαρότητα. Τα μέγιστα της ειδικής θερμότητας είναι πιο ασαφή από
αυτά της μαγνητικής επιδεκτικότητας.
652                                         ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                    ✥                       ❣✡☛ ☞ ✥✌✍✁✎ ✏✑✒ ✌ ✥



                        ✥
            ✠
            ✭✟ ✞
                ✝
            ❝♠
                            ✥



                                ✥
                                    ✁   ✂   ✄ ✥   ✥✁ ☎            ✆   ✥
                                                     ▲
Σχήμα 14.25: Υπολογισμός του κρίσιμου εκθέτη γ/ν από τα μέγιστα της μαγνητικής
επιδεκτικότητας, εφαρμόζοντας την ασυμπτωτική σχέση (14.9). Οι τιμές χmax (L) λαμ-
βάνονται από τον πίνακα (14.5) και προσαρμόζονται σε μια συνάρτηση της μορφής
aLb . Από το αποτέλεσμα της προσαρμογής παίρνουμε γ/ν = 1.749(1).



   Από τα μέγιστα της μαγνητικής επιδεκτικότητας χmax (L) υπολογί-
ζουμε τον εκθέτη γ/ν. Οι τιμές τους δίνονται στον πίνακα 14.5. Σύμ-
φωνα με την ασυμπτωτική σχέση (14.9) προσαρμόζουμε τα δεδομένα
σε μια συνάρτηση της μορφής aLb , με a και b προσδιοριστέες παραμέ-
τρους. Βρίσκουμε πολύ καλή βάθμιση, άρα τα δεδομένα μας είναι μέσα
στην ασυμπτωτική περιοχή. Το αποτέλεσμα είναι
                                        γ
                                          = 1.749 ± 0.001 ,               (14.51)
                                        ν
που είναι σε άριστη συμφωνία με την αναμενόμενη τιμή 7/4.
   Από τα μέγιστα της ειδικής θερμότητας υπολογίζουμε τον εκθέτη
α/ν. Λόγω του ότι α = 0, η μορφή της ασυμπτωτικής σχέσης αναμέ-
νεται να δίνεται από την (14.47). Βρίσκουμε ότι τα δεδομένα μας δεν
προσαρμόζονται καλά σε μια απλή συνάρτηση της μορφής a log L και
είναι πιθανό να παίρνουμε συνεισφορές από όρους που μηδενίζονται
στο θερμοδυναμικό όριο, αλλά που δίνουν πεπερασμένη και μη αμε-
λητέα συνεισφορά για πεπερασμένο L. Πράγματι, προσαρμόζοντας τα
δεδομένα σε μια συνάρτηση της μορφής a log L + b − c/L, παίρνουμε
πολύ καλή προσαρμογή των δεδομένων.²⁵ Η απόπειρα προσαρμογής σε

  ²⁵Τα αποτελέσματά μας δικαιώνονται και από τους αναλυτικούς υπολογισμούς στο
14.11. ΜΕΛΕΤΗ ΒΑΘΜΙΣΗΣ ΜΕ ... ΚΑΤΑΡΡΕΥΣΗ                                             653

                     ✥ ✝




                     ✥ ✆




             ☞       ✥ ☎
             ☛
             ✭
                 ✡
                 ✠
                 ♠
             ❝
                     ✥ ✄




                     ✥ ✂




                     ✥ ✁
                           ✁✥   ✄✥   ✆✥✞✥✥ ✞✁✥   ✟✥✥           ✂✥✥      ✞✥✥✥

                                                 ▲


Σχήμα 14.26: Υπολογισμός του κρίσιμου εκθέτη α/ν από τα μέγιστα της ειδικής
θερμότητας, εφαρμόζοντας την ασυμπτωτική σχέση (14.8). Οι τιμές cmax (L) λαμβά-
νονται από τον πίνακα (14.5) και προσαρμόζονται σε μια συνάρτηση της μορφής
a log L + b − c/L. Παίρνουμε a = 0.107(3), b = 0.13(1) και c = 1.2(3) με χ2 /dof = 0.9 για
προσαρμογή των σημείων L = 40, . . . , 500. Αν αποπειραθούμε προσαρμογή κάτω από
τις ίδιες συνθήκες σε συνάρτηση της μορφής aLd + b − c/L παίρνουμε d = 0.004(97),
δηλ. εκθέτη συμβατό με την τιμή μηδέν και “περίεργες” τιμές για τις σταθερές a, b.
Συμπεραίνουμε ότι τα δεδομένα μας είναι συμβατά με τον εκθέτη α/ν να είναι μηδέν.



συνάρτηση δύναμης της μορφής aLd + b − c/L δεν είναι επιτυχής²⁶ και
δίνει έτσι και αλλιώς εκθέτη συμβατό με τιμή μηδέν. Τα αποτελέσματα
παρουσιάζονται στο σχήμα 14.26.


14.11        Μελέτη Βάθμισης με ... Κατάρρευση
Οι σχέσεις βάθμισης (14.3)–(14.9) προέρχονται από τη δυναμική εμ-
φάνιση μιας μοναδικής κλίμακας μήκους που απειρίζεται στην κρίσιμη
περιοχή, του μήκους συσχετισμού ξ.²⁷ Η εμφάνιση αυτής της κλίμακας
που απειρίζεται, καθώς πλησιάζουμε το κρίσιμο σημείο σαν ξ ∼ |t|−ν ,
[69] όπου αποδεικνύεται
              ∑∞           ότι οι διορθωτικοί όροι είναι ακέραιες δυνάμεις του 1/L:
c = a log L + k=0 ck /Lk .
   ²⁶Τα a και b δεν προσδιορίζονται μέσα στο σφάλμα, ουσιαστικά ο ένας όρος αναιρεί
τον άλλο και μένει μόνο ο τρίτος, το c.
   ²⁷Προσοχή: εδώ το ξ = ξ(t) είναι το μήκος συσχετισμού που έχει το άπειρο σύστημα
σε θερμοκρασία t και όχι το μήκος συσχετισμού που μετράμε στο πεπερασμένο σύ-
στημα.
654                                                 ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                ✥ ✥✆
                                                                                 ✏✎☎✥
                       ✓✔✓✕✙
                                                                                 ✏✎✝✥
                                                                                 ✏✎▲✥

                       ✓✔✓✕✘                                                     ✏✎✁✥✥
                ✥ ✥☎
                                                                                 ✏✎✁✂✥
                                                                                 ✏✎✁☎✥
                       ✓✔✓✕✗                                                     ✏✎✁✝✥
        ✟
        ✡                                                                        ✏✎✂✥✥
        ✱
        ❜       ✥ ✥✄                                                             ✏✎✆✥✥
        ✭              ✓✔✓✕✖
        ✍                                                                    ✏✎✁✥✥✥
   ✌☞                          ✓✔✖   ✓✔✘        ✚   ✚✔✛
   ☛❣
        ✡
        ✠
        ✟
        ✞       ✥ ✥✂
        ✭
            ❝
        ❋




                ✥ ✥✁




                  ✥
                         ✲☎                ✲✂             ✥              ✂   ☎           ✝
                                                                 ✶✑♥
                                                              ①✎✏    ✒


Σχήμα 14.27: “Κατάρρευση” (collapse) των καμπύλων χ(β, L) για διαφορετικές τιμές
του L σύμφωνα με √ τη σχέση (14.59). Για το σχήμα έχουν χρησιμοποιηθεί οι γνωστές
τιμές βc = ln(1 + 2)/2, ν = 1 και γ/ν = 7/4.




οδηγεί στην παγκοσμιότητα της κρίσιμης συμπεριφοράς όλων των συ-
στημάτων που ανήκουν στην ίδια κλάση παγκοσμιότητας. Αν πάρουμε
για παράδειγμα τη μαγνητική επιδεκτικότητα χ(β, L), οι τιμές της εξαρ-
τώνται ξεχωριστά από τη θερμοκρασία β, το μέγεθος του συστήματος L
και φυσικά από τις λεπτομέρειες του συστήματος. Η εμφάνιση παγκό-
σμιας συμπεριφοράς για ολόκληρη την κλάση ισοδυναμίας που ανήκει
το μοντέλο που μελετάμε μας οδηγεί στην υπόθεση ότι η μαγνητική
επιδεκτικότητα στην περιοχή αυτή εξαρτάται μόνο από το μήκος συ-
σχετισμού ξ. Καθώς στο πεπερασμένο σύστημα πλησιάζουμε την κρί-
σιμη θερμοκρασία, τα φαινόμενα κυριαρχούνται από την “κατάπνιξη”
των διακυμάνσεων που προκύπτουν όταν ξ ∼ L. Άρα, οι κλίμακες μή-
κους που καθορίζουν την κύρια συμπεριφορά των συναρτήσεων που
περιγράφουν τη βάθμιση χ ∼ ξ γ/ν είναι οι ξ και L, άρα η αδιάστατη
μεταβλητή L/ξ είναι η μοναδική μεταβλητή που υπεισέρχεται στις συ-
ναρτήσεις βάθμισης. Για να πάρουμε την σχέση βάθμισης χ ∼ ξ γ/ν αρκεί
14.11. ΜΕΛΕΤΗ ΒΑΘΜΙΣΗΣ ΜΕ ... ΚΑΤΑΡΡΕΥΣΗ                                                     655

                                                                                  ✒✑✂✥
                 ✆ ✂                                                              ✒✑✄✥
                                                                                  ✒✑☎✥
                                                                                 ✒✑✆✥✥
                 ✆ ✁                                                             ✒✑✆✁✥
                                 ✘✖✙
                                                                                 ✒✑✆✂✥
        ✠                                                                        ✒✑✆✄✥
        ✱☛        ✆
        ✏                                                                        ✒✑✁✥✥
        ✭
        ✎                                                                        ✒✑✝✥✥
                                  ✘
        ✍                                                                        ✒✑✆✥✥✥
        ❁
   ✌☞            ✥ ☎
   ❜
        ☛
        ✡
                                 ✕✖✗
        ✠        ✥ ✄
        ✟
        ✭
             ♠
        ❋
                 ✥ ✂
                                       ✚✘     ✚✕✖✛          ✕         ✕✖✛   ✘



                 ✥ ✁




                  ✥
                       ✲✝   ✥           ✝            ✆✥          ✆✝         ✁✥      ✁✝      ✞✥
                                                             ✶✓♥
                                                          ①✑✒    ✔


Σχήμα 14.28: “Κατάρρευση” (collapse) των καμπύλων ⟨m⟩(β, L) για διαφορετικές τιμές
του L σύμφωνα με √ τη σχέση (14.60). Για το σχήμα έχουν χρησιμοποιηθεί οι γνωστές
τιμές βc = ln(1 + 2)/2, ν = 1 και β/ν = 1/8.



να υποθέσουμε ότι κοντά στην κρίσιμη περιοχή²⁸

                                        χ = ξ γ/ν Fχ(0) (L/ξ) ,                           (14.52)

                 (0)
όπου Fχ (z) είναι μια συνάρτηση μιας μεταβλητής με τις ιδιότητες

                                Fχ(0) (z) = σταθ.               z ≫ 1,                    (14.53)

και
                                Fχ(0) (z) ∼ z γ/ν               z → 0.                    (14.54)
Πράγματι όταν 1 ≪ ξ ≪ L (z ≫ 1), η μαγνητική επιδεκτικότητα παίρνει
τιμές πολύ κοντά στις τιμές του άπειρου συστήματος (θερμοδυναμικό
όριο) και από την (14.53) παίρνουμε χ ∼ ξ γ/ν . Καθώς ξ ∼ L, εμφανί-
ζονται τα φαινόμενα επίδρασης πεπερασμένου μεγέθους και από την
(14.54) παίρνουμε χ ∼ ξ γ/ν (L/ξ)γ/ν = Lγ/ν . Η τελευταία δεν είναι άλλη
από τη σχέση (14.7) για τα μέγιστα της μαγνητικής επιδεκτικότητας στο

  ²⁸Για περισσότερες λεπτομέρειες παραπέμπουμε στο Παράρτημα 14.13.
656                                        ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                               ✏✎▲✥
                   ✥ ✄✆
                               ✏✎✁✥
                           ✏✎✄✥✥
         ✞
         ✡         ✥ ✄☎    ✏✎✄☎✥
         ✭
         ✍                 ✏✎✄✓✥
         ☞✌☛               ✏✎✄▲✥
         ✞         ✥ ✄✄
                           ✏✎☎✥✥
         ✱✡
         ❜
         ✭
         ✠          ✥ ✄
         ✟
         ✞
         ✝
         ✭         ✥ ✥✂
               ❝
         ❋

                   ✥ ✥✁




                          ✲✆          ✲☎     ✲✄        ✥           ✄   ☎   ✆
                                                         ✶✑♥
                                                   ①✎✏         ✒


Σχήμα 14.29: “Κατάρρευση” (collapse) των καμπύλων c(β, L) για διαφορετικές τιμές
του L σύμφωνα με √ τη σχέση (14.61). Για το σχήμα έχουν χρησιμοποιηθεί οι γνωστές
τιμές βc = ln(1 + 2)/2 και ν = 1.



πεπερασμένο σύστημα που μελετήσαμε στο σχήμα 14.25. Άρα, η συ-
           (0)
νάρτηση Fχ (z) περιγράφει τον τρόπο που “αποκόπτεται” η μαγνητική
επιδεκτικότητα από τα φαινόμενα επίδρασης πεπερασμένου μεγέθους.
                   (0)
   Η συνάρτηση Fχ (z) μπορεί να υπολογιστεί από τις μετρήσεις που
κάνουμε στην προσομοίωση Μόντε Κάρλο. Επειδή το μήκος συσχετι-
σμού δεν υπολογίζεται άμεσα, αλλά υπεισέρχεται έμμεσα στις μετρή-
σεις μας, είναι πιο βολικό να ορίσουμε την αδιάστατη μεταβλητή βάθ-
μισης να είναι η
                              x = L1/ν t ,                   (14.55)
όπου |x| ∼ (L/ξ)1/ν αφού²⁹ ξ ∼ |t|−ν . Ορίζοντας τότε Fχ (x) ∝ x−γ Fχ (xν ),
                                                                               (0)

έτσι ώστε η σχέση (14.52) να γίνει

                               χ = Lγ/ν Fχ (x) = Lγ/ν Fχ (L1/ν t) .            (14.56)

Οι ασυμπτωτικές ιδιότητες της συνάρτησης βάθμισης Fχ (x) προκύπτουν
                                                                 (0)
από τις σχέσεις (14.53) και (14.54). Για x = L1/ν t ≫ 1 για την Fχ (xν )
                                 (0)
ισχύει η (14.53) και παίρνουμε Fχ (xν ) = σταθ. Από τον ορισμό Fχ (x) =
x−γ Fχ (xν ) παίρνουμε Fχ (x) ∼ x−γ = (L/ξ)−γ/ν και επιβεβαιώνουμε την
     (0)


   ²⁹Αγνοούμε την απόλυτη τιμή στον ορισμό της x, ώστε να έχουμε ενιαίο φορμαλισμό
για τις περιοχές πάνω και κάτω από την κρίσιμη θερμοκρασία
14.11. ΜΕΛΕΤΗ ΒΑΘΜΙΣΗΣ ΜΕ ... ΚΑΤΑΡΡΕΥΣΗ                               657

ιδιότητα βάθμισης της μαγνητικής επιδεκτικότητας στο θερμοδυναμικό
όριο χ ∼ Lγ/ν Fχ (x) ∼ Lγ/ν (L/ξ)−γ/ν = ξ γ/ν . Άρα,

                         Fχ (x) ∼ x−γ         x ≫ 1.               (14.57)
                                        (0)
    Όταν x → 0, ισχύει η (14.54) και Fχ (xν ) ∼ (xν )γ/ν = xγ . Τότε έχουμε
Fχ (x) ∝ x−γ Fχ (xν ) ∼ x−γ xγ = σταθ. Επιβεβαιώνουμε ότι όταν επικρα-
              (0)

τούν τα φαινόμενα επίδρασης πεπερασμένου μεγέθους (x → 0), παίρ-
νουμε χ = Lγ/ν Fχ (x) ∼ Lγ/ν όπως και παραπάνω. Άρα,

                       Fχ (x) ∼ σταθ.         |x| ≪ 1 .            (14.58)

   Αντιστρέφοντας τη σχέση (14.56) μπορούμε να δούμε πώς είναι δυ-
νατόν να υπολογιστεί η συνάρτηση βάθμισης από τις μετρήσεις της μα-
γνητικής επιδεκτικότητας

                        Fχ (L1/ν t) = L−γ/ν χ(β, L) ,              (14.59)

όπου η χ(β, L) μετριέται σε θερμοκρασίες κοντά στην κρίσιμη περιοχή
για διαφορετικές τιμές του L. Όταν η σχέση (14.59) ισχύει, τότε όλες
οι μετρήσεις μας θα πέφτουν πάνω στην ίδια καμπύλη που δίνει τη
συνάρτηση Fχ (x) ανεξάρτητα από το μέγεθος του συστήματος L! Φυ-
σικά, μικρές αποκλίσεις αναμένονται λόγω φαινομένων επίδρασης πε-
περασμένου μεγέθους, ιδιαίτερα για μικρά L. Αλλά όπως θα δούμε, η
σύγκλιση γίνεται στην πράξη αρκετά γρήγορα.
   Το μεγάλο κέρδος από την προσέγγιση αυτή στις μετρήσεις μας είναι
ότι μπορούμε να χρησιμοποιήσουμε την παραπάνω σχέση για να προσ-
διορίσουμε την κρίσιμη θερμοκρασία βc , τον εκθέτη ν, καθώς και τον
λόγο γ/ν ταυτόχρονα! Παρατηρήστε ότι για να ισχύει η (14.59) πρέπει
να προσδιορίσουμε την μεταβλητή x = L1/ν t για την οποία είναι ανα-
γκαίο να γνωρίζουμε την βc (t = (βc − β)/βc ) και τον εκθέτη ν. Για τον
υπολογισμό της Fχ χρειάζεται να γνωρίζουμε τον εκθέτη γ/ν που πα-
ρουσιάζεται στο δεξί μέλος της (14.59). Η σχέση (14.59) βρίσκεται να
είναι πολύ ευαίσθητα εξαρτημένη από τις παραμέτρους βc , ν και γ/ν
και έτσι έχουμε μια εξαίρετη και ακριβή μέθοδο για τον υπολογισμό
τους.
   Ο υπολογισμός γίνεται εύκολα. Θέτουμε δοκιμαστικές τιμές για τις
παραμέτρους (βc , ν, γ/ν). Από τα δεδομένα μας χρησιμοποιούμε τις τι-
μές L, β, βc και ν για να υπολογίσουμε τη μεταβλητή βάθμισης x =
L1/ν t = L1/ν (βc − β)/βc . Αυτή την αντιστοιχούμε στην τιμή της μαγνητι-
κής επιδεκτικότητας χ(β, L) από την οποία, μαζί με την τιμή του γ/ν,
υπολογίζουμε την Fχ = χ(β, L)/Lγ/ν . Κάνουμε τη γραφική παράσταση
658                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

των σημείων (xi , Fχ (xi )) και επικεντρωνόμαστε στο διάστημα κοντά
στην κρίσιμη περιοχή (t ≈ 0). Αλλάζουμε τις τιμές των παραμέτρων
(βc , ν, γ/ν) μέχρι να πετύχουμε βέλτιστη σύμπτωση των καμπύλων που
προκύπτουν για τα διαφορετικά L που μελετάμε. Μόλις το πετύχουμε,
οι τιμές των (βc , ν, γ/ν) που αντιστοιχούν στη βέλτιστη σύμπτωση είναι
και οι ζητούμενες.
     Η “κατάρρευση” (collapse) των καμπύλων που προκύπτουν από τα
            1/ν             −γ/ν
σημεία (Li (βc −βi )/βc , Li     χ(βi , Li )) για διαφορετικά L είναι η αποδο-
τικότερη μέθοδος εκμετάλλευσης των ιδιοτήτων βάθμισης στην κρίσιμη
περιοχή. Στο σχήμα 14.27 δείχνουμε τη συνάρτηση          √ Fχ (x) για τις γνω-
στές τιμές των παραμέτρων (βc , ν, γ/ν) = (ln(1 + 2)/2, 1, 7/4). Μικρές
μεταβολές από τις τιμές αυτές κάνουν εμφανή την διαφορά αυτή. Μετα-
βάλλοντας μια από τις παραμέτρους και παρατηρώντας την αποστασιο-
ποίηση των καμπύλων μεταξύ διαφορετικών L, μπορούμε να πάρουμε
μια πρόχειρη εκτίμηση της ελάχιστης ακρίβειας της μεθόδου

                          βc = 0.44069 ± 0.00001
                           ν = 1.00 ± 0.01
                          γ
                             = 1.750 ± 0.002 ,
                          ν
Παρατηρούμε ότι με αυτή την πρόχειρη μέθοδο πετύχαμε ακρίβεια συ-
γκρίσιμη με αυτή των προηγούμενων (συστηματικών) υπολογισμών μας!
   Ανάλογη διαδικασία μπορεί να ακολουθηθεί και για άλλες υπολο-
γιζόμενες ποσότητες που παρουσιάζουν βάθμιση, όπως είναι η ειδική
θερμότητα και η μαγνήτιση. Οι σχέσεις (14.8) και (14.9) γενικεύονται
σύμφωνα με τα παραπάνω για τη μαγνήτιση³⁰

                        ⟨m⟩(β, L) = L−β/ν Fm (L1/ν t) ,                 (14.60)

και για την ειδική θερμότητα σε

                 c(β, L) = Lα/ν Fc (L1/ν t) = log(L)Fc (L1/ν t) ,       (14.61)

αφού α = 0. Τα αποτελέσματα παρουσιάζονται στα σχήματα 14.28 και
14.29 αντίστοιχα.
   Για διευκόλυνση του αναγνώστη παραθέτουμε ένα πρόγραμμα gnuplot
για την εύκολη κατασκευή σχημάτων, όπως αυτά που παρουσιάζονται
στα σχήματα 14.27–14.29. Αν υποθέσουμε ότι τα δεδομένα μας είναι σε
ένα αρχείο all τοποθετημένα ως εξής³¹:
  ³⁰Προσοχή στο αριστερό μέλος β είναι η θερμοκρασία, ενώ στο δεξί ο εκθέτης που
ορίστηκε στη σχέση βάθμισης (14.5).
  ³¹Το αρχείο μπορεί να βρεθεί στο συνοδευτικό λογισμικό στο αρχείο all.
14.11. ΜΕΛΕΤΗ ΒΑΘΜΙΣΗΣ ΜΕ ... ΚΑΤΑΡΡΕΥΣΗ                                                        659


# ##########################################################
# e L b e t a <e>     +/− e r r c     +/− e r r
# m L b e t a <m>     +/− e r r c h i +/− e r r
# n L b e t a <n > /N +/− e r r
# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
....
e 1000 0.462721 −0.79839031 7.506 e−07 0.290266 0.00027
m 1000 0.462721 0.82648701 1.384 e−06 2 . 1 3 7 0.00179
....

όπου γραμμές που αρχίζουν με m έχουν τις μετρήσεις (L, β, ⟨m⟩, δ⟨m⟩, χ, δχ),
ενώ αυτές που αρχίζουν από e τις μετρήσεις (L, β, ⟨e⟩, δ⟨e⟩, c, δc). Οι
εντολές που πρέπει να προγραμματίσουμε γράφονται σε ένα αρχείο
scale_gamma.gpl:

#   Usage :
#   Ls = ”40 60 80 100 120 140 160 200 500 1000”
#   bc = bcc ; nu = 1 ; gnu = 1 . 7 5 ; load ” scale_gamma . gp l ” ;
#   Ls : t h e v a l u e s o f L used i n t h e c o l l a p s e
#   bc : t h e c r i t i c a l temperature used i n t h e c a l c u l a t i o n o f
#         t =( b e t a _ c −b e t a ) / b e t a _ c
#   nu : t h e exponent used i n t h e c a l c u l a t i o n o f x=L ^ { 1 / nu} t
#   gnu : t h e exponent used i n t h e c a l c u l a t i o n o f
#         F_chi = L^{−gnu} c h i ( beta , L)

# t h e e x a c t c r i t i c a l temperature ( use bc=bcc i s you wish ) :
bcc        = 0.5* log (1.0+ sqr t (2.0) ) ;
NLs        = words ( Ls ) ; # The number o f l a t t i c e s i z e s
LL ( i ) = word ( Ls , i ) ; # Returns t h e i _ t h l a t t i c e s i z e
cplot ( i ) = sprintf ( ”\
      <grep ’m %s ’ a l l | \
      s o r t −k 3 ,3 g | \
      awk −v L=%s −v bc=%f −v nu=%f −v gnu=%f \
      ’{ p r i n t L ^ ( 1 . 0 / nu ) * ( bc−$3 ) / bc , L^(−gnu ) * $6 , L^(−gnu ) * $7 } ’\
                                  ” , LL ( i ) , LL ( i ) , bc , nu , gnu ) ;

s e t macros
s e t term wxt enhanced

s e t t i t l e sprintf ( ” b_c= %f nu= %f g / n= %f ” , bc , nu , gnu )
s e t x l a b e l ” x=L ^ { 1 / nu} t ”
s e t y l a b e l ”F( x ) = L^{−g / n} c h i ( { / Symbol b } ,L) ”

p l o t for [ i =1: NLs ] cplot ( i ) u 1 : 2 : 3 w e t sprintf ( ”L=%s ” , LL ( i ) )

Για τη χρήση του προγράμματος, ξεκινάμε το gnuplot και δίνουμε τις
εντολές
660                              ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ


gnuplot > Ls = ”40 60 80 100 120 140 160 200 500 1000 ”
gnuplot > bc = 0.4406868; nu = 1 ; gnu = 1 . 7 5 ;
gnuplot > load ” scale_gamma . gpl ”

Οι δύο πρώτες εντολές καθορίζουν τις παραμέτρους του διαγράμματος.
Η μεταβλητή Ls περιέχει τα μεγέθη του πλέγματος, την ... κατάρρευση
των οποίων θέλουμε να μελετήσουμε, κάθε L χωρισμένο από το άλλο
από ένα ή περισσότερα κενά. Η μεταβλητές bc, nu, gnu είναι οι παρά-
μετροι βc , ν, γ/ν που θα χρησιμοποιηθούν στη βάθμιση (14.59). Η τρίτη
εντολή καλεί το πρόγραμμά μας και φτιάχνει το διάγραμμα. Αν δεν
έχουμε διαλέξει τις επιθυμητές παραμέτρους, τις επαναορίζουμε και...
επαναλαμβάνουμε.
   Για να καταλάβετε πώς λειτουργεί το πρόγραμμα, δείτε την τεκμη-
ρίωση του gnuplot³². Θα σταθούμε μόνο στην κατασκευή του φίλτρου
που μας δίνει τα σημεία του γραφήματος σωστά κανονικοποιημένα. Το
gnuplot το βλέπει σαν μια ακολουθία χαρακτήρων (string) cplot(i)
που είναι διαφορετική για κάθε L (ο δείκτης i αντιστοιχεί στην i–λέξη
στη μεταβλητή Ls). To string αυτό τοποθετείται στην εντολή plot για
κάθε i και έχει τη μορφή "< grep ... L(̂-gnu)*$7}'". Οι εκάστοτε
τιμές περνούν στο string αυτό μέσω της συνάρτησης sprintf() η οποία
κάθε φορά καλείται με διαφορετικό i. Την κύρια δουλειά την κάνει η
awk που πολλαπλασιάζει την κάθε μέτρηση (στήλες 6 και 7: $6, $7 είναι
η χ και το σφάλμα της δχ) με τον σωστό παράγοντα. Η συνιστώσα του
φίλτρου με το grep επιλέγει τις γραμμές από το αρχείο all που έχουν
τη μαγνητική επιδεκτικότητα για το δεδομένο μέγεθος πλέγματος L.
Η συνιστώσα του φίλτρου με την εντολή sort ταξινομεί τα δεδομένα
που παίρνει με σειρά αύξουσας θερμοκρασίας (στήλη 3: -k3,3g).
   Το καίριο ερώτημα είναι πώς θα συστηματοποιηθεί η παραπάνω μέ-
θοδος; Πώς κρίνουμε ότι μια κατάρρευση είναι καλή και πότε παύει
να είναι; Πώς θα εκτιμήσουμε τα σφάλματα στις παραμέτρους που
προσπαθούμε να προσδιορίσουμε; Για το τελευταίο ερώτημα προσπα-
θήσαμε να δώσουμε παραπάνω μια πρόχειρη μέθοδο για την εκτίμηση
των σφαλμάτων. Μια άλλη μέθοδος είναι να εφαρμόσουμε μια μέθοδο
τύπου binning ή bootstrap. Στην πρώτη περίπτωση χωρίζουμε τα δεδο-
μένα μας σε nb bins και εργαζόμαστε ανεξάρτητα σε κάθε ένα από αυτά.
Κάθε bin θα μας δώσει μια βέλτιστη ομάδα παραμέτρων (βc , ν, γ/ν) την
οποία θα χρησιμοποιήσουμε σαν μια ανεξάρτητη μέτρηση. Το σφάλμα
τότε θα υπολογιστεί από τον γνωστό τύπο (13.42) (για n = nb ).

  ³²Από την online τεκμηρίωση, μπορείτε να χρησιμοποιήσετε τις εντολές help word,
help words, help macros, help sprintf, help plot iteration.
14.11. ΜΕΛΕΤΗ ΒΑΘΜΙΣΗΣ ΜΕ ... ΚΑΤΑΡΡΕΥΣΗ                                                661

    Για να μελετήσουμε ποσοτικά την ποιότητα της κατάρρευσης ορί-
ζουμε μία ποσότητα που θυμίζει το χ2 /dof που ορίζεται σε μια κοινή
προσαρμογή δεδομένων όπως παρουσιάστηκε στο Παράρτημα 13.7. Αυτή
θα πρέπει να είναι μεγαλύτερη, όταν αυξάνεται η απόσταση μεταξύ
των καμπύλων που προκύπτουν από την κατάρρευση των δεδομένων
για κάθε L. Έστω ότι οι μετρήσεις μας αποτελούνται από NL σετ με-
τρήσεων για L = L1 , L2 , . . . , LNL . Αφού επιλέξουμε ένα σετ παραμέτρων
p ≡ (βc , ν, γ/ν) και ένα διάστημα ∆x ≡ [xmin , xmax ] υπολογίζουμε τα σετ
των δεδομένων {(xi,k , Fχ (xi,k ; p, Li ))}k=1,...,ni που προκύπτουν από τις με-
τρήσεις μας. Αυτά αποτελούνται από τα ni σημεία στο σετ δεδομένων
με L = Li των οποίων τα xk βρίσκονται μέσα στο διάστημα ∆x. Για
κάθε σημείο xk υπολογίζουμε την προκύπτουσα συνάρτηση βάθμισης
                       −γ/ν
Fχ (xi,k ; p, Li ) = Li     χ(βi,k , Li ) η οποία εξαρτάται από τις επιλεχθείσες
παραμέτρους p και το επιλεγμένο μέγεθος Li . Στη συνέχεια, επιλέ-
γουμε έναν τρόπο παρεμβολής (interpolation) μεταξύ των παραπάνω
σημείων η οποία ορίζει συνεχείς συναρτήσεις παρεμβολής Fχ (x; p, Li ),³³
ώστε να έχουμε μια καλή εκτίμηση της συνάρτησης βάθμισης μεταξύ
των διακριτών σημείων που αποτελούν τα δεδομένα μας. Τότε κάθε
σημείο στο σετ δεδομένων {(xi,k , Fχ (xi,k ; p, Li ))}i έχει δεδομένη από-
σταση από κάθε άλλο σετ δεδομένων j (j = 1, . . . , NL και j ̸= i) ίση
με³⁴ |Fχ (xi,k ; p, Li ) − Fχ (xi,k ; p, Lj )|. Ορίζεται τότε η ποσότητα

                           1
   χ2 (p; ∆x) =                                                                 (14.62)
                    NL (NL − 1)npoints
                          ∑
                          NL    ∑
                                NL      ∑
                                        ni
                                           (Fχ (xi,k ; p, Li ) − Fχ (xi,k ; p, Lj ))2
                      ×
                          i=1 {j=1,j̸=i} k=1
                                                      (δFχ (xi,k ; p, Li ))2

              ∑ L
όπου npoints = N
               i=1 ni είναι ο αριθμός των όρων στο άθροισμα. Η κανο-
νικοποίηση με NL (NL − 1) γίνεται, γιατί αυτός είναι ο αριθμός που οι
καμπύλες συνδυάζονται ανά ζεύγη μεταξύ τους. Κάθε όρος ζυγίζεται
με το σφάλμα του δFχ (xi,k ; p, Li ) (που προέρχεται από το δχ), ώστε τα
σημεία με μεγάλο σφάλμα να έχουν μικρότερη συνεισφορά από αυτά με
μεγαλύτερο. Ο ορισμός αυτός χρησιμοποιήθηκε στο [70], αλλά ο ανα-
γνώστης μπορεί να δει και εναλλακτικές προσεγγίσεις στα [4], [68].

  ³³Αυτή είναι ίσως και η πιο σημαντική επιλογή που θα κάνουμε. Πολυωνυμική
προσαρμογή (συμπ. και γραμμικής), παρεμβολή τύπου cspline ή γενίκευσης της,
multihistogramming είναι δυνατές επιλογές. Πιο απαλλαγμένη από συστηματικά
σφάλματα είναι η τελευταία.
  ³⁴Εδώ φαίνεται η ανάγκη της παρεμβολής, αφού η τιμή xi,k μπορεί να μην υπάρχει
στο σετ δεδομένων j.
662                                 ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

   Το χ2 (p; ∆x) εξαρτάται από τις παραμέτρους p και το διάστημα ∆x.
Γίνεται καταρχήν μια ελαχιστοποίηση του ως προς τις παραμέτρους p
κρατώντας το ∆x σταθερό. Το ελάχιστο δίνεται από τις τιμές των πα-
ραμέτρων pmin που είναι και η εκτίμηση των τιμών που θέλουμε να
υπολογίσουμε. Για τον υπολογισμό των σφαλμάτων δp η πιο συστη-
ματική διαδικασία είναι η μέθοδος binning όπως αναφέραμε και πα-
ραπάνω στη σελίδα 660. Εναλλακτικά, αν υποθέσουμε μια κατανομή
των μετρήσεων τύπου χ2 και το αποτέλεσμα μας δίνει χ2 ≲ 1, τότε τα
διαστήματα των παραμέτρων μέσα στα όρια του σφάλματος είναι αυτά
για τα οποία χ2 ≲ 2.
   Τα αποτελέσματα εξαρτώνται από το διάστημα ∆x. Συνήθως [68]
αυτό επιλέγεται να έχει το κέντρο του στο μέγιστο της Fχ (x), έτσι ώστε
∆x = [xmax − δx, xmax + δx]. Αν το δx είναι μεγαλύτερο από όσο πρέπει,
τότε το χ2 (pmin ; ∆x) είναι μεγάλο, γιατί δεν έχουμε καλή βάθμιση. Αν
είναι πολύ μικρό, τότε τα σφάλματα δp θα είναι μεγάλα. Παίρνοντας
το όριο δx → 0, μελετάμε τη σύγκλιση των τιμών pmin (βλ. σχήμα 8.7,
σελ. 238 στο [4] καθώς και το [68]) από όπου καταλήγουμε στις τελικές
τιμές του υπολογισμού μας.



14.12 Binder Cumulant
Μέχρι τώρα μελετήσαμε τις διακυμάνσεις των φυσικών ποσοτήτων από
τον υπολογισμό cumulant³⁵ δεύτερης τάξης (μαγνητική επιδεκτικότητα
και ειδική θερμότητα). Σημαντική πληροφορία για τους κρίσιμους εκθέ-
τες και την κρίσιμη θερμοκρασία μπορεί να ληφθεί από τη μελέτη των
cumulant ανωτέρας τάξης. Ο πιο γνωστός, ο Binder cumulant, είναι τέ-
ταρτης τάξης³⁶ και παίρνει το όνομα του Kurt Binder που τον μελέτησε
πρώτος [71, 72]
                                              ⟨m4 ⟩
                                  U =1−             .                          (14.63)
                                             3⟨m2 ⟩

Στο παράρτημα 14.13 παρουσιάζονται με λεπτομέρεια οι ιδιότητές του.
Αυτές που μας αφορούν άμεσα είναι πως σε μια συνεχή μετάβαση φάσης

   ³⁵
http://en.wikipedia.org/wiki/Cumulant,
http://mathworld.wolfram.com/Cumulant-GeneratingFunction.html
   ³⁶Στη στατιστική το cumulant 4ης τάξης μιας τυχαίας μεταβλητής x ισούται με
κ4 = ⟨(x − ⟨x⟩)4 ⟩ − 3⟨(x − ⟨x⟩)2 ⟩ και κ2 = ⟨(x − ⟨x⟩)2 ⟩, οπότε U = −κ4 /3κ2 για x = m
και ⟨m⟩ = 0.
14.12. BINDER CUMULANT                                                                                          663

                                                
                                                 0   β ≪ βc
                                                    ∗
                                             U=   U β = βc ,                                                 (14.64)
                                                 2
                                                  3
                                                      β ≫ βc
όπου U ∗ = 0.610690(1) για το πρότυπο Ising στο τετραγωνικό πλέγμα
[72]. Η τιμή U = 0 ταυτίζεται με αυτή της γκαουσιανής κατανομής,
ενώ U = 2/3 αντιστοιχεί περίπου με την γκαουσιανή κατανομή μικρής
διασποράς γύρω από δύο συμμετρικές τιμές ±⟨m⟩ (βλ. ασκήσεις 14 και
15 στο Παράρτημα 14.13).
   Στην πράξη, βρίσκεται πως οι διορθώσεις στην τιμή U ∗ από φαι-
νόμενα επίδρασης πεπερασμένου μεγέθους είναι πολύ μικρές, οπότε
ο υπολογισμός του U (β, L) δίνει με πολύ καλή ακρίβεια την κρίσιμη
θερμοκρασία βc . Το σημείο τομής των U (β, L) στο σημείο (βc , U ∗ ) για
διαφορετικά L θα δίνει μια πολύ καλή εκτίμηση της βc .


                                                                                               L=40
                                                                                               L=60
             0.6      0.62
                                                                                               L=80
                                                                                              L=100
                                                                                              L=120
                                                                                              L=140
             0.5                                                                              L=160
                      0.61                                                                    L=200
                                                                                              L=500
             0.4                                                                             L=1000
                                                                                                 2/3
         U




                          0.6

             0.3                0.4395   0.4405   0.4415   0.4425




             0.2


             0.1


               0
                   0.36            0.38            0.4              0.42       0.44   0.46      0.48   0.5
                                                                           β

Σχήμα 14.30: Ο Binder cumulant για διαφορετικές θερμοκρασίες και πλεγματικά με-
γέθη. Στο ένθετο μεγεθύνεται η κρίσιμη περιοχή. Η οριζόντια γραμμή είναι η αναμε-
νόμενη τιμή U ∗ = 0.610690(1) [72].



    Στο σχήμα 14.30 δείχνουμε τις μετρήσεις μας για το U (β, L). Φαί-
νεται η εντυπωσιακή τομή των καμπύλων στο κρίσιμο σημείο (βc , U ∗ ).
Στον πίνακα 14.6 κάνουμε μια απόπειρα για συστηματικό υπολογι-
σμό της βc υπολογίζοντας την κρίσιμη θερμοκρασία από την τομή των
U (β, L) για τρεις τιμές του L. Λαμβάνοντας υπόψη όλες τις μετρήσεις
664                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

                         L            βc             U∗
                 40      60   80      0.44069(4)     0.6109(5)
                 60      80  100      0.44069(4)     0.6108(7)
                 80     100  120      0.44068(4)     0.6108(7)
                100     120  140      0.44069(4)     0.6108(11)
                120     140  160      0.44069(4)     0.6109(20)
                140     160 200       0.44067(3)     0.6102(12)
                160     200 500       0.44067(2)     0.6105(10)
                200     500 1000      0.44068(1)     0.6106(9)


Πίνακας 14.6: Υπολογισμός της κρίσιμης θερμοκρασίας βc και της τιμής U ∗ από την
τομή των καμπύλων U (β, L) που παρουσιάζονται στο σχήμα 14.30. Για τον υπολογισμό
χρησιμοποιούνται κάθε φορά τρεις τιμές του L. Οι αναμενόμενες τιμές από τη θεωρία
και τη βιβλιογραφία [72] είναι βc = 0.44068679 . . ., U ∗ = 0.610690(1).


για L = 100 – 1000, το αποτέλεσμα που παίρνουμε είναι

                      βc = 0.440678(9)      U ∗ = 0.6107(4) ,           (14.65)

που είναι σε πολύ καλή συμφωνία με τις αναμενόμενες τιμές βc =
0.44068679 . . ., U ∗ = 0.610690(1). Παρατηρούμε ότι στον υπολογισμό του
U ∗ , ενώ το συστηματικό σφάλμα λόγω πεπερασμένου μεγέθους μειώνε-
ται, καθώς αυξάνουμε το L, αυξάνεται το στατιστικό λόγω της αύξησης
της κλίσης της καμπύλης U (β, L) κοντά στο σημείο β = βc . Ο προσδιο-
ρισμός όμως της βc γίνεται με αυξανόμενη ακρίβεια.
     Οι σχέσεις βάθμισης πεπερασμένου μεγέθους μπορούν να χρησιμο-
ποιηθούν και για τον Binder cumulant προκειμένου να προσδιοριστεί
και έτσι η κρίσιμη θερμοκρασία και ο κρίσιμος εκθέτης 1/ν. Από τις
σχέσεις (14.90) (14.119) του Παραρτήματος 14.13 περιμένουμε ότι η
βάθμιση του U δίνεται από

                            U = FU (x) = FU (L1/ν t) .                  (14.66)

Αυτό επιβεβαιώνεται εντυπωσιακά στο σχήμα 14.31. Από την τιμή FU (x =
0) παίρνουμε U ∗ = 0.6107(4) σε συμφωνία με την (14.65).
   Ο απευθείας υπολογισμός των κρίσιμων εκθετών, ιδιαίτερα του 1/ν,
είναι αρκετά δύσκολος σε ένα γενικό υπό μελέτη σύστημα. Οπότε είναι
θεμιτό να πάρει κανείς επιπλέον εκτιμήσεις από ποσότητες που είναι
εύκολο να μετρηθούν και έχουν γνωστές και καλές ιδιότητες βάθμισης.
Παρακάτω παραθέτουμε μερικές από αυτές³⁷. Χαρακτηριστικό τους εί-
  ³⁷Ιδιαίτερη επιτυχία είχαν στη μελέτη του 3d πρότυπου Ising [74].
14.12. BINDER CUMULANT                                                                              665


                                                                                        L=40
                                                                                        L=60
                 0.6                                                                    L=80
                                                                                       L=100
                                                                                       L=120
                 0.5                                                                   L=140
                         0.63                                                          L=160
                                                                                       L=200
                                                                                       L=500
                 0.4     0.62
                                                                                      L=1000
          U(x)




                                                                                          2/3
                         0.61
                 0.3
                          0.6


                 0.2
                         0.59



                 0.1     0.58
                                -0.3   -0.2   -0.1   0     0.1   0.2     0.3



                  0
                   -40             -30                   -20               -10    0         10
                                                                       x=L1/ν t


Σχήμα 14.31: Βάθμιση του Binder cumulant για 1/ν = 1 χρησιμοποιώντας την ακριβή
τιμή της βc στην ανηγμένη θερμοκρασία t = (βc − β)/βc . Στο ένθετο μεγεθύνεται η
κρίσιμη περιοχή. Η οριζόντια γραμμή είναι η αναμενόμενη τιμή U ∗ = 0.610690(1) [72].



ναι ότι δίνονται από το συσχετισμό της τιμής της ενέργειας με την τιμή
(κάποιας δύναμης της) μαγνήτισης.
   Η παράγωγος του Binder Cumulant είναι

                  ∂U   ⟨m4 E⟩⟨m2 ⟩ + ⟨m4 ⟩ (⟨m2 ⟩⟨E⟩ − 2⟨m2 E⟩)
        DU =         =                                                                           (14.67)
                  ∂β                   3⟨m2 ⟩3

   Η βάθμισή του δίνεται από τη σχέση (14.120)

                          DU = L1/ν FDU (x) = L1/ν FDU (L1/ν t) .                                (14.68)

η οποία αναπαρίσταται στο σχήμα 14.32. Παρατηρούμε ότι η DU ορίζει
και αυτή μια ψευδοκρίσιμη περιοχή από το μέγιστο των αντίστοιχων
διακυμάνσεων. Η βάθμιση και θέση του μεγίστου θα μπορούσε να μας
δώσει τον κρίσιμο εκθέτη 1/ν σύμφωνα με την ανάλυση που κάναμε
στα σχήματα 14.23 και 14.25 για τη μαγνητική επιδεκτικότητα.
   Επίσης, μπορεί να φανεί χρήσιμη η μελέτη συναρτήσεων συσχετισμού
της μορφής
                           ∂ ln⟨mn ⟩         ⟨Emn ⟩
                  Dln mn =           = ⟨E⟩ −        ,        (14.69)
                              ∂β              ⟨mn ⟩
666                                         ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ


                         L=40
                         L=60
                 0.6     L=80
                        L=100
                        L=120
                 0.5    L=140
                        L=160
                        L=200
                        L=500
         DU(x)



                 0.4
        -1/ν




                 0.3
         L




                 0.2


                 0.1


                  0
                         -6          -4        -2              0   2         4
                                                    x=L1/ν t


Σχήμα 14.32: Βάθμιση της παραγώγου του Binder cumulant DU (βλ. εξίσωση (14.67))
για 1/ν = 1 χρησιμοποιώντας την ακριβή τιμή της βc στην ανηγμένη θερμοκρασία
t = (βc − β)/βc .



των οποίων η βάθμιση δίνεται από την εξίσωση (14.126) του Παραρτή-
ματος 14.13

                       Dln mn = L1/ν FDln mn (x) = L1/ν FDln mn (L1/ν t) .       (14.70)

Ειδικότερα, μας ενδιαφέρει η περίπτωση n = 1
                                          ∂ ln⟨|m|⟩         ⟨E|m|⟩
                              Dln |m| =             = ⟨E⟩ −        ,             (14.71)
                                             ∂β              ⟨|m|⟩
και n = 2
                                          ∂ ln⟨m2 ⟩         ⟨Em2 ⟩
                              Dln m2 =              = ⟨E⟩ −        .             (14.72)
                                             ∂β              ⟨m2 ⟩

   Τέλος, αναφέρουμε το Energy Cumulant V

                                                     ⟨e4 ⟩
                                          V =1−             .                    (14.73)
                                                    3⟨e2 ⟩2

   Στην εργασία [75] δείχνεται ότι σε μια μετάβαση φάσης δεύτερης
τάξης στο κρίσιμο σημείο V ∗ = 2/3, ενώ σε μια μετάβαση φάσης πρώ-
της τάξης παίρνουμε μη τετριμμένη τιμή. Έτσι, αυτή η ποσότητα μπορεί
14.13. ΠΑΡΑΡΤΗΜΑ: ΒΑΘΜΙΣΗ                                                             667


                                    L=40
                           0.5      L=60
                                    L=80
                                   L=100
                                   L=120
                           0.4     L=140
                                   L=160
                                   L=200
         L-1/νDln |m|(x)




                                   L=500
                           0.3


                           0.2


                           0.1


                            0
                                 -30   -25   -20   -15   -10        -5   0   5   10
                                                         x=L1/ν t


Σχήμα 14.33: Βάθμιση της Dln |m| (βλ. εξίσωση (14.71)) για 1/ν = 1 χρησιμοποιώντας
την ακριβή τιμή της βc στην ανηγμένη θερμοκρασία t = (βc − β)/βc .



να χρησιμοποιηθεί ως παράμετρος διαφοροποίησης μιας μετάβασης φά-
σης 1ης τάξης. Αυτό επιβεβαιώνεται στο σχήμα 14.35. Τα ελάχιστα των
καμπύλων V (β, L) τείνουν προς την κρίσιμη θερμοκρασία σύμφωνα με
την σχέση (14.50).


14.13                      Παράρτημα: Βάθμιση
14.13.1                    Binder Cumulant
Στο κεφάλαιο 14.12 μελετήσαμε αριθμητικά τις ιδιότητες βάθμισης της
ποσότητας
                                  ⟨m4 ⟩
                         U =1−           ,                  (14.74)
                                 3⟨m2 ⟩2
γνωστής στη βιβλιογραφία ως Binder Cumulant. Εδώ χρησιμοποιώντας
βασικές ιδιότητες βάθμισης ενός συστήματος κοντά στην κρίσιμη θερ-
μοκρασία θα υπολογίσουμε τις ιδιότητες βάθμισης της ποσότητας αυ-
τής και των παραγώγων της. Για περισσότερες λεπτομέρειες παραπέ-
μπουμε τον αναγνώστη στα [72], [6]
   Οι τιμές του U είναι απλές και τετριμμένες σε δύο περιπτώσεις: Όταν
έχουμε γκαουσιανή κατανομή της μαγνήτισης, κάτι το οποίο συμβαίνει
668                                                 ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ


                      0.9      L=40
                               L=60
                      0.8      L=80
                              L=100
                              L=120
                      0.7     L=140
                              L=160
                      0.6     L=200
                              L=500
          Dln m2(x)




                      0.5
         -1/ν




                      0.4
          L




                      0.3

                      0.2

                      0.1

                       0
                            -30   -25     -20       -15        -10          -5         0        5      10
                                                                 x=L1/ν t


Σχήμα 14.34: Βάθμιση της Dln m2 (βλ. εξίσωση (14.72)) για 1/ν = 1 χρησιμοποιώντας
την ακριβή τιμή της βc στην ανηγμένη θερμοκρασία t = (βc − β)/βc .



όταν είμαστε στη φάση αταξίας (ψηλή θερμοκρασία) U = 0 και όταν
είμαστε στη φάση τάξης (χαμηλή θερμοκρασία) U = 2/3. Η απόδειξη
είναι πολύ εύκολη και τη σκιαγραφούμε στις ασκήσεις 14 και 15.
    Όταν πλησιάζουμε την κρίσιμη θερμοκρασία μιας συνεχούς μετά-
βασης φάσης, το σύστημα παρουσιάζει ιδιότητες βάθμισης λόγω του
απειριζόμενου μήκους συσχετισμού ξ, όπως περιγράψαμε στο κεφά-
λαιο 14. Ας υποθέσουμε ότι πλησιάζουμε από τις ψηλές θερμοκρασίες
και η συνάρτηση κατανομής της μαγνήτισης ανά πλεγματική θέση s (όχι
τις απόλυτης τιμής) είναι προσεγγιστικά της μορφής
                                                                           (           ) 12
                                                1         −    s2                βLd               d
                                                                                                2L β
                        P (L, s) = √                  e       2⟨s2 ⟩   =                      e−s 2χ   ,    (14.75)
                                           2π⟨s2 ⟩                               2πχ

πού είναι μια γκαουσιανή με τυπική απόκλιση σ 2 = ⟨s2 ⟩ = χ/(βLd ) και
προσωρινά έχουμε υποθέσει ότι το σύστημα είναι πάνω σε d–διάστατο
υπερκυβικό πλέγμα με ακμή υπερκύβου L.
   Όταν πλησιάζουμε την κρίσιμη θερμοκρασία, η βάθμιση παρουσιά-
ζεται στη συνάρτηση κατανομής P (L, s) σύμφωνα με τη σχέση

                                                                                  L
                                        P (L, s) = Lx p0 P̃ (aLy s,                 ),                      (14.76)
                                                                                  ξ
14.13. ΠΑΡΑΡΤΗΜΑ: ΒΑΘΜΙΣΗ                                                                669


             0.6665

              0.666

             0.6655

              0.665

             0.6645
         V




              0.664
                                                                        L=40
                                                                        L=60
             0.6635                                                     L=80
                                                                       L=100
              0.663                                                    L=120
                                                                       L=140
             0.6625                                                    L=160
                                                                       L=200
                                                                       L=500
              0.662                                                       2/3
                      0.35     0.4       0.45   0.5       0.55   0.6      0.65   0.7
                                                      β

Σχήμα 14.35: Ο Energy Cumulant που ορίζεται στην εξίσωση (14.73). Καθώς αυξάνεται
το μέγεθος του συστήματος, η τιμή του τείνει στην τιμή 2/3 όπως αναμένεται σε μια
μετάβαση φάσης 2ης τάξης. Η θέση των ελαχίστων τείνουν στην κρίσιμη θερμοκρασία
σαν L−1/ν




όπου ξ =ξ(t)= limL→∞ ξ(β, L), t = (βc −β)/βc , είναι το μήκος συσχετισμού
στο θερμοδυναμικό όριο. Καθώς πλησιάζουμε την κρίσιμη θερμοκρασία
limt→0 ξ(t) = +∞, έτσι ώστε ξ ∼ |t|−ν . Η εξίσωση (14.76) είναι μια υπό-
θεση κλιμάκωσης (scaling hypothesis) η οποία παίζει θεμελιώδη ρόλο
στη μελέτη των κρίσιμων φαινομένων.
   Για να υπολογίσουμε τους εκθέτες στην παραπάνω σχέση, εφαρμό-
ζουμε καταρχήν τη συνθήκη κανονικοποίησης της πιθανότητας
                                     ∫   +∞
                             1 =      ds P (L, s)
                                     ∞
                                     ∫ +∞
                                 x                        L
                              = L p0        ds P̃ (aLy s, )
                                       ∞                  ξ
                                          ∫ +∞
                                      1                   L
                              = Lx p0 y          dz P̃ (z, )
                                     aL ∞                  ξ
                                          ∫ +∞
                                        1                 L
                              = Lx−y p0          dz P̃ (z, ) ,                         (14.77)
                                        a ∞               ξ

όπου θέσαμε z = aLy s. Για να είναι μονάδα το αριστερό μέλος πρέπει
670                                    ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

x = y,
                                   ∫   +∞
                                                        L
                          C0 ≡              dz P̃ (z,     )<∞                 (14.78)
                                       ∞                ξ
και p0 = a/C0 . C0 = C0 (L/ξ), p0 = p0 (L/ξ) και p0 C0 = a είναι μία σταθερά
ανεξάρτητη από τα L και ξ. Τελικά παίρνουμε

                                           a y            L
                          P (L, s) =          L P̃ (aLy s, ) .                (14.79)
                                           C0             ξ

Οι ροπές της κατανομής των σπιν ⟨sk ⟩ θα είναι τότε
                          ∫   +∞
              ⟨s ⟩ =
                k
                              ds sk P (L, s)
                         ∞
                              ∫
                         a y +∞                      L
                      =    L         ds sk P̃ (aLy s, )
                        C0      ∞                    ξ
                                            ∫ +∞
                         a y        1                           L
                      =    L k+1 (k+1)y            dz z k P̃ (z, )
                        C0 a L                ∞                 ξ
                                ( )
                                  L
                      = L−ky Fk        .                                      (14.80)
                                  ξ

Όταν πάρουμε το θερμοδυναμικό όριο και μετά πλησιάσουμε την κρί-
σιμη θερμοκρασία, τότε έχουμε αποκλίνον μήκος συσχετισμού ξ → ∞
με L/ξ → ∞. Στην περιοχή β < βc (⟨m⟩ = 0) έχουμε χ = βLd ⟨s2 ⟩ και
από τη σχέση
                                       }
                     χ = χ+ t−γ                       χ+
                                           ⇒χ=                ξ γ/ν ∼ ξ γ/ν   (14.81)
                     ξ = ξ+ t−ν                      γ/ν
                                                    ξ+

παίρνουμε
                                                 χ+
                    ⟨s2 ⟩ = β −1 L−d χ =           γ/ν
                                                           ξ γ/ν ∼ ξ γ/ν .    (14.82)
                                              βLd ξ+
Στις παραπάνω σχέσεις εισάγαμε τα “παγκόσμια” πλάτη (universal
amplitudes) χ+ και ξ+ τα οποία είναι παγκόσμιες σταθερές (ίδιες στην
ίδια κλάση παγκοσμιότητας) και ορίζονται από τη σχέση (14.81). Στο
όριο αυτό, για έχει συνεπή βάθμιση η σχέση (14.80) για k = 2 στο δεξί
και αριστερό μέλος, παίρνουμε (πρβλ. εξ. (14.57))
                    ( ) ( )−γ/ν
                     L   L                                         L
                 F2    ∼                                για          ≫ 1.     (14.83)
                     ξ   ξ                                         ξ
14.13. ΠΑΡΑΡΤΗΜΑ: ΒΑΘΜΙΣΗ                                             671

Για να βρούμε τη βάθμιση ως προς L αντικαθιστούμε τις παραπάνω
σχέσεις στην (14.80) για k = 2 και παίρνουμε
                                           ( )−γ/ν
                        χ+             −2y  L
                          γ/ν
                              ξ γ/ν
                                    ∼L                   (14.84)
                     βLd ξ+                 ξ

από την οποία παίρνουμε
                                     γ     dν − γ  β
       L−d ∼ L−2y L−γ/ν ⇒ d = 2y +     ⇒y=        = ,             (14.85)
                                     ν       2ν    ν
όπου χρησιμοποιήσαμε τη γνωστή³⁸ σχέση υπερβάθμισης (hyperscaling
relation)
                          d ν = γ + 2β .                  (14.86)
Καταλήγουμε στις σχέσεις που ισχύουν στην περιοχή αταξίας β < βc
                                 a β/ν            L
                     P (L, s) =     L P̃ (aLβ/ν s, )              (14.87)
                                 C0               ξ
                                             ( )
                                    −2β/ν     L
                          ⟨s ⟩ = L
                            2
                                          F2                      (14.88)
                                              ξ
                                             ( )
                                              L
                          ⟨s4 ⟩ = L−4β/ν F4                       (14.89)
                                              ξ
Από τη σχέση (14.74) βρίσκουμε ότι η κρίσιμη συμπεριφορά του Binder
cumulant είναι
                                  ( )              ( )
                        L−4β/ν F4 Lξ         1 F 4
                                                    L
                                                     ξ
               U ∼1−              ( )2 = 1 −       ( )2      (14.90)
                          −4β/ν    L         3      L
                       3L       F2 ξ           F2 ξ

Στην ψευδοκρίσιμη περιοχή υπερτερούν τα φαινόμενα πεπερασμένου
μεγέθους τα οποία πνίγουν τις κρίσιμες διακυμάνσεις και θέτουν στις
συναρτήσεις Fk (x) πεπερασμένες τιμές. Η ψευδοκρίσιμη περιοχή στο
θερμοδυναμικό όριο δίνεται από το όριο L → ∞ κρατώντας πεπερα-
σμένο το λόγο L/ξ. Άρα, αντιστοιχεί στις τιμές των συναρτήσεων Fk (x)
για μικρά x. Οπότε παίρνουμε³⁹
                                         1 F4 (0)
          lim U (t = 0, L) ≡ U ∗ = 1 −             = const. .     (14.91)
          L→∞                            3 F2 (0)2
  ³⁸Δείτε λ.χ. [73], σχέσεις 3.35, 3.36, 3.53.
  ³⁹Ακριβώς για t = 0 έχουμε ξ(0) = +∞, οπότε για πεπερασμένο L έχουμε ότι
L/ξ = 0.
672                                ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

Έτσι γίνεται τώρα απλή η κατανόηση του γεγονότος ότι το U στην κρί-
σιμη θερμοκρασία παίρνει τιμές σχεδόν ανεξάρτητες από το μέγεθος
του συστήματος L. Η τιμή U ∗ βρίσκεται να εξαρτάται από τις συνορια-
κές συνθήκες και από την ανισοτροπικότητα των αλληλεπιδράσεων. Για
τετραγωνικό πλέγμα στο πρότυπο Ising έχουμε [72] (Kamieniarz+Blöte)

                                U ∗ = 0.610690(1)                             (14.92)


14.13.2 Βάθμιση
Η βασική υπόθεση για τη βάθμιση των θερμοδυναμικών ποσοτήτων στην
περιοχή μιας συνεχούς μετάβασης φάσης κάτω από μια αλλαγή κλίμα-
κας μήκους στο πλέγμα όπου το αδιάστατο μήκος συσχετισμού (στο
θερμοδυναμικό όριο) αλλάζει ως⁴⁰

                                             ξ
                                      ξ→       .                              (14.93)
                                             b
όπου b είναι ο παράγοντας αλλαγής της κλίμακας μήκους, είναι ότι η
ελεύθερη ενέργεια του συστήματος αλλάζει ως⁴¹

                           f (t, h) = b−d f (tbyt , hbyh ) ,                  (14.94)

όπου t η ανηγμένη θερμοκρασία και h το εξωτερικό μαγνητικό πε-
δίο. Η παραπάνω σχέση συμπυκνώνει την υπόθεση βάθμισης (scaling
hypothesis) και είναι μια σχέση ανάλογη με αυτή της (14.76). Η σχέση
αυτή μπορεί να γίνει κατανοητή μέσω της προσέγγισης της ομάδας επα-
νακανονικοποίησης και η βασική υπόθεση είναι η εμφάνιση μιας μονα-
δικής δυναμικής κλίμακας μήκους που απειρίζεται, καθώς πλησιάζουμε
το κρίσιμο σημείο και από την οποία εξαρτώνται όλες οι φυσικές πο-
σότητες. Τα ορίσματα tbyt και hbyh δίνουν την αλλαγή που πρέπει να
γίνει στις “σταθερές σύζευξης” t και h κάτω από την αλλαγή κλίμακας
μήκους, ώστε να ισχύει η ισότητα.
   Εφαρμόζοντας την παραπάνω σχέση n φορές, παίρνουμε

                         f (t, h) = b−nd f (tbnyt , hbnyh ) .                 (14.95)

Αν την εφαρμόσουμε ένα μεγάλο αριθμό από φορές έτσι ώστε n → ∞,
t → 0 κρατώντας το γινόμενο tbnyt = t0 = O(1), τότε αντικαθιστώντας
  ⁴⁰λ.χ. κεφ. 3 στο [73].
  ⁴¹Για την ακρίβεια το ιδιάζον (singular) κομμάτι της ελεύθερης ενέργειας.
14.13. ΠΑΡΑΡΤΗΜΑ: ΒΑΘΜΙΣΗ                                                     673

τη σχέση που προκύπτει bn ∼ t−1/yt παίρνουμε

                         f (t, h) = td/yt f (t0 , ht−yh /yt )
                                  ≡ td/yt Ψ(ht−yh /yt )
                                  = t2−α Ψ(ht−yh /yt ) ,                   (14.96)

όπου στη δεύτερη γραμμή ορίσαμε τη συνάρτηση βάθμισης Ψ(z) και
στην τρίτη ορίσαμε τον κρίσιμο εκθέτη
                                                d
                                    α=2−           .                       (14.97)
                                                yt
Εφαρμόζοντας την παραπάνω υπόθεση στη σχέση (14.93) για το μήκος
συσχετισμού

        ξ(t, h) = b−1 ξ(tbyt , hbyh ) = . . . = b−n ξ(tbnyt , hbnyh ) ,    (14.98)

και παίρνοντας το όριο n → ∞, t → 0 κρατώντας το γινόμενο tbnyt ∼
O(1), το αριστερό μέλος θα έχει μια πεπερασμένη τιμή, έστω ξ0 < ∞,
ενώ το δεξί θα μας δώσει

                             ξ0 = t1/yt ξ(t0 , ht−yh /yt ) .               (14.99)

Θεωρώντας την περίπτωση h = 0 και συγκρίνοντας με τη γνωστή σχέση
ξ ∼ t−ν (εξίσωση (14.4)) που όρισε τον κρίσιμο εκθέτη ν, παίρνουμε
                                                       1
                             ξ = ξ0 t−1/yt ⇒ ν =          .               (14.100)
                                                       yt
   Παραγωγίζοντας τη σχέση (14.96) ως προς τη θερμοκρασία, παίρ-
νουμε
       ∂f
          ∼ t1−α Ψ(ht−yh /yt ) + t2−α ht−yh /yt −1 Ψ′ (ht−yh /yt ) .      (14.101)
       ∂t
Στην παραπάνω σχέση, και σε όλες που ακολουθούν που έχουν το σύμ-
βολο ∼ θα αμελούμε σταθερές που είναι άσχετες με τις ιδιότητες βάθ-
μισης.
   Παραγωγίζοντας την παραπάνω σχέση άλλη μια φορά, και θέτοντας
h = 0 παίρνουμε την ειδική θερμότητα
                                    ∂ 2f
                               c∼        ∼ t−α Ψ(0) .                     (14.102)
                                    ∂t2
Άρα, ο κρίσιμος εκθέτης α δεν είναι άλλος από τον κρίσιμο εκθέτη της
ειδικής θερμότητας που ορίσαμε στην σχέση (14.4).
674                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

   Την μαγνητική επιδεκτικότητα την παίρνουμε με ανάλογο τρόπο πα-
ραγωγίζοντας την (14.96) ως προς h

        ∂f
           ∼ td/yt t−yh /yt Ψ′ (ht−yh /yt ) ∼ tνd−νyh Ψ′ (ht−νyh )     (14.103)
        ∂h
Παραγωγίζοντας την παραπάνω σχέση άλλη μια φορά, και θέτοντας
h = 0, παίρνουμε την μαγνητική επιδεκτικότητα

                                ∂ 2f
                          χ∼         ∼ tνd−2νyh Ψ′ (0) ,               (14.104)
                                ∂h2

και συγκρίνοντας με τη σχέση (14.3) χ ∼ t−γ παίρνουμε

                           1    γ       β  β+γ
       γ = 2νyh − νd ⇔ yh = (d + ) = d − =                             (14.105)
                           2    ν       ν   ν
όπου στις τελευταίες δύο σχέσεις χρησιμοποιήσαμε τις “σχέσεις υπερ-
βάθμισης” (hyperscaling relations)

                                  νd = γ + 2β .                        (14.106)


14.13.3 Βάθμιση Πεπερασμένου Μεγέθους
Ας επαναλάβουμε την ανάλυση της προηγούμενης παραγράφου στην
περίπτωση που το σύστημά μας έχει πεπερασμένο μέγεθος. Για τον
λόγο αυτό, θα υποθέσουμε ότι το σύστημα έχει τους βαθμούς ελευθε-
ρίας του πάνω σε ένα πλέγμα με γραμμική διάσταση l = La (ο όγκος
V = ld , d ο αριθμός των διαστάσεων), όπου το L είναι ο (αδιάστατος)
αριθμός των πλεγματικών θέσεων και a είναι το μήκος που δίνει την
πλεγματική σταθερά. Θα υποθέσουμε ότι παίρνουμε το όριο L → ∞ με
a → 0 κρατώντας το μήκος l σταθερό. Αλλάζοντας την κλίμακα του L
μειώνοντας τις πλεγματικές θέσεις κατά ένα παράγοντα

                                  L
                           L→       ⇔ L−1 → bL−1 ,                     (14.107)
                                  b
έτσι ώστε να μειωθεί
                                      a → ba                           (14.108)
η σχέση (14.94) γενικεύεται στην

                 f (t, h, L−1 ) = b−nd f (tbnyt , hLnyh , bn L−1 ) .   (14.109)
14.13. ΠΑΡΑΡΤΗΜΑ: ΒΑΘΜΙΣΗ                                                                675

Παίρνοντας πάλι το όριο (προσέγγιση κρίσιμου σημείου) tbnyt = t0 < ∞
⇒ bn ∼ t−1/yt η παραπάνω σχέση γίνεται
  f (t, h, L−1 ) = td/yt f (t0 , ht−yh /yt , t−1/yt L−1 ) = td/yt Ψ(ht−yh /yt , t−1/yt L−1 ) .
                                                                                     (14.110)
   Παραγωγίζοντας όπως και στην προηγούμενη παράγραφο και θέτο-
ντας h = 0 παίρνουμε
                         ∂ 2f                                       ξ
          χ(t, L−1 ) =                = t−γ ϕ2 (L−1 t−ν ) = t−γ ϕ2 ( ) .           (14.111)
                         ∂h2    h=0                                 L
όπου θέσαμε τις τιμές yt = 1/ν, ϕ2 (x) = Ψ(2,0) (0, x) = ∂ 2 Ψ(z, x)/∂z 2 |z=0 .
    Το θερμοδυναμικό όριο το παίρνουμε για L ≫ ξ όπου ϕ2 ( Lξ ) →
ϕ2 (0) < ∞, οπότε παίρνουμε τη γνωστή σχέση χ ∼ t−γ .
    Αλλά όταν το L συγκρίνεται με το ξ, επικρατούν τα φαινόμενα επί-
δρασης πεπερασμένου μεγέθους. Αυτά “πνίγουν” τις μεγάλες διακυ-
μάνσεις και η μαγνητική επιδεκτικότητα παρουσιάζει ένα μέγιστο στη
θερμοκρασία crossover tX ≡ (βc − βc (L))/βc όπου tX ∼ L−1/ν , όπου η
τελευταία σχέση ισχύει γιατί L ∼ ξ ∼ t−ν . Παίρνουμε τότε
    χmax ∼ t−γ     −1 −ν
            X ϕ2 (L tX ) ∼ L
                            γ/ν
                                ϕ2 (L−1 L) ∼ Lγ/ν ϕ2 (1) ∼ Lγ/ν .                  (14.112)
Άρα, στην περιοχή του μεγίστου θα πάρουμε μια συναρτησιακή σχέση
της μορφής
                     χ(t, L−1 ) = Lγ/ν Fχ (L1/ν t) ,     (14.113)
που δεν είναι άλλη από την εξίσωση (14.59). Η συνάρτηση Fχ (x) είναι
αναλυτική ως προς το όρισμά της x = L1/ν t, αφού για το πεπερασμένο
σύστημα η χ(t, L−1 ) είναι αναλυτική συνάρτηση της θερμοκρασίας⁴². Στο
θερμοδυναμικό όριο (L → ∞, t πεπερασμένο άρα x → ∞)
                                Fχ (x) ∼ x−γ         x ≫ 1,                        (14.114)
ώστε χ(t, L−1 ) = Lγ/ν Fχ (L1/ν t) ∼ Lγ/ν (L1/ν t)γ ∼ t−γ και κοντά στο ψευ-
δοκρίσιμο σημείο
             Fχ (x) = Fχ,0 + Fχ,1 x + Fχ,2 x2 + . . .         x≪1                  (14.115)
οπότε περιμένουμε να έχουμε για L1/ν t ≪ 1
                         (                                   )
        χ(t, L−1 ) = Lγ/ν 1 + χ1 L1/ν t + χ2 L2/ν t2 + . . .                       (14.116)
    Οι παραπάνω σχέσεις μας οδηγούν στα συμπεράσματα:
  ⁴²Προκύπτει από τον ορισμό της συνάρτησης επιμερισμού η οποία είναι αναλυτική
συνάρτηση της θερμοκρασίας στην ψευδοκρίσιμη περιοχή. Άρα η x = L1/ν t είναι η
μεταβλητή βάθμισης και όχι μια δύναμη αυτής λ.χ. η x̃ που χρησιμοποιείται στις
σχέσεις (14.53) και (14.54).
676                                  ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

   • Το ψευδοκρίσιμο σημείο μετατοπίζεται σαν ∼ L−1/ν [σχέση (14.50)].

   • Το ύψος της κορυφής της μαγνητικής επιδεκτικότητας αυξάνει σαν
     χmax ∼ Lγ/ν .

   • Η κατεύθυνση μετατόπισης της κορυφής της μαγνητικής επιδεκτι-
     κότητας εξαρτάται από τις συνοριακές συνθήκες:

           – Περιοδικές συνθήκες καταπιέζουν τα αποτελέσματα των δια-
             κυμάνσεων, αφού τα wave vectors περιορίζονται από 2π   L
                                                                      n.
             Αυτό αυξάνει την ψευδοκρίσιμη θερμοκρασία Tc (L) (βc (L) <
             βc ⇒ c > 0 στην (14.50)).
           – Ελεύθερες συνοριακές συνθήκες οδηγούν σε ελεύθερες δια-
             κυμάνσεις στο σύνορο οι οποίες μειώνουν την ψευδοκρίσιμη
             θερμοκρασία Tc (L) (βc (L) > βc ⇒ c < 0 στην (14.50)).
           – Παγωμένα σπιν στο σύνορο οδηγούν σε αυξημένη τάξη στο
             σύστημα. Αυτό αυξάνει την ψευδοκρίσιμη θερμοκρασία Tc (L)
             (βc (L) < βc ⇒ c > 0 στην (14.50)).

Καταλήγουμε ότι η Fχ (L1/ν t) εξαρτάται από τις συνοριακές συνθήκες
και τη γεωμετρία του πλέγματος.
   Με ανάλογο τρόπο παίρνουμε
                      k
                                                        ( )
               −d ∂ f                                     ξ
    ⟨m ⟩ ∼ L
       k
                      ∼ L−d td/yt −kyh /yt ϕk (L−1 t−ν ) ∼ L−d tνd−kνyh ϕk
                                                              ,
                  ∂hk                                     L
                                                          (14.117)
και με ανάλογα επιχειρήματα που μας οδήγησαν στην εξίσωση (14.113)
παίρνουμε
                                                   β+γ
            ⟨mk ⟩ ∼ L−d L−d+kyh Fk (L1/ν t) ∼ Lk    ν    Fk (L1/ν t) .         (14.118)

    Για το Binder cumulant θα έχουμε από τα παραπάνω

            ⟨m4 ⟩          L4yh F4 (L1/ν t)
U = 1−            ∼  1 −                      ∼ U∗ + U1 (L1/ν t) + U2 (L1/ν t)2 + . . . ,
          3⟨m2 ⟩2        3(L2yh F2 (L1/ν t))2
                                                                             (14.119)
όπου στην τελευταία ισότητα αναπτύξαμε τις αναλυτικές συναρτήσεις
F2,4 (L1/ν t) για μικρά L1/ν t. Βλέπουμε τότε ότι

                                 ∂U
                                    ∼ ∂t U ∼ L1/ν .                           (14.120)
                                 ∂β
14.13. ΠΑΡΑΡΤΗΜΑ: ΒΑΘΜΙΣΗ                                                                    677

   Παραγωγίζοντας την (14.110) ως προς τη θερμοκρασία, παίρνουμε

              ∂f
                     ∼ td/yt −1 Ψ(htyh /yt , L−1 t−1/yt )
              ∂t
                       +td/yt (htyh /yt −1 )Ψ(1,0) (htyh /yt , L−1 t−1/yt )
                       +td/yt L−1 t−1/yt −1 Ψ(0,1) (htyh /yt , L−1 t−1/yt )
                     ∼ tνd−1 Ψ(htνyh , L−1 t−ν )
                       +htνd+νyh −1 Ψ(1,0) (htνyh , L−1 t−ν )
                       +L−1 tνd−1−ν Ψ(0,1) (htνyh , L−1 t−ν ) ,                          (14.121)

όπου υιοθετήσαμε το συμβολισμό Ψ(n,m) (x, z) = ∂ n+m Ψ(x, z)/∂xn ∂z m . Ο
όρος που είναι ανάλογος του h εξαφανίζεται, όταν θέσουμε h = 0. Στην
ψευδοκρίσιμη περιοχή με tX ∼ L−1/ν ο πρώτος και ο τρίτος όρος είναι
ίδιας τάξης ως προς L και παίρνουμε

                            ∂f
                                            = L−d+ ν F 1 (L1/ν t) ,
                                                       1
                                                                                         (14.122)
                            ∂t      h=0

και με διαδοχικές παραγωγίσεις

                            ∂kf
                                            = L−d+ ν F k (L1/ν t) .
                                                        k
                                                                                         (14.123)
                            ∂tk       h=0

   Οι παράγωγοι

        ∂ 2f                                                      1−β
                     = L−d+yh + ν F11 (L1/ν t) = L
                                      1
                                                                   ν    F11 (L1/ν t) ,   (14.124)
        ∂t∂h   h=0


                        ∂ 1+k f
                                           = L−d+kyh + ν Fk1 (L1/ν t) .
                                                             1
                                                                                         (14.125)
                        ∂t∂hk       h=0

Ειδικότερα

                            ∂ 1+k f
                                                  L−d+kyh + ν
                                                                  1
             ⟨E mk ⟩        ∂t∂hk
                     =                h=0
                                                ∼             ∼ L1/ν                     (14.126)
              ⟨mk ⟩          ∂k f                  L−d+kyh
                             ∂hk
                                      h=0


                           −d ∂ 4 f
              ⟨e4 ⟩     L     ∂t4                          L− ν
                                                              4

                    = (                   h=0
                                                )2 ∼                  ∼ σταθ.            (14.127)
             ⟨e2 ⟩2            ∂2f                     (L− ν )2
                                                             2
                        L−d    ∂t2
                                          h=0
678                               ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

14.14 Παράρτημα: Κρίσιμοι Εκθέτες
14.14.1 Ορισμοί


      α:   c ∼ t−α ,   cmax ∼ Lα/ν , c(t, L) = Lα/ν F 2 (L1/ν t)
      β:   m ∼ tβ ,    m ∼ L−β/ν , m(t, L) = L−β/ν F1 (L1/ν t)
      γ:   χ ∼ tγ ,    χmax ∼ Lγ/ν , χ(t, L) = Lγ/ν F2 (L1/ν t)
                                                                         (14.128)
      ν:   ξ ∼ t−ν ,   ξ ∼ L,
      δ:   M ∼ h1/δ
      z:   τ ∼ ξz
μαζί με τη σχέση βάθμισης που ορίζει τους εκθέτες yt , yh
                           f (t, h) = td/yt Ψ(htyh /yt )                 (14.129)
και την σχέση που ορίζει τον εκθέτη η από τη συνάρτηση συσχετισμού
δύο σημείων G(r, t) = ⟨s(r) · s(0)⟩ όπου στο κρίσιμο σημείο t = 0 έχουμε
                                                1
                            G(r, t = 0) ∼             .                  (14.130)
                                             rd−2+η

14.14.2 Σχέσεις
Από τους ορισμούς και τις σχέσεις υπερβάθμισης (hyperscaling relations)
έχουμε
                             α + 2β + γ       =     2
                                 γ + 2β       =     νd
                                  2 − νd      =     α
                            α + β(1 + δ)      =     2
                                ν(2 − η)      =     γ                    (14.131)


           1   d                 β+γ   1(    γ)     β
       yt = =               yh =     =    d+    =d−                      (14.132)
           ν  2−α                 ν    2     ν      ν

             d           d − yh             2yh − d               yh
      α=2−         β=                 γ=                   δ=            (14.133)
             yt            yt                  yt               d − yh

                  η = d + 2 − 2yh ⇔ d − 2 + η = 2(d − yh )               (14.134)
14.14. ΠΑΡΑΡΤΗΜΑ: ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ                                                  679




     Μοντέλο                ν       α         β           γ        δ           η      yt      yh
  q=0 Potts (2d) [65]       ∞      −∞         1
                                              6
                                                         ∞        ∞            0      0       2
  q=1 Potts (2d) [65]
                            4
                            3
                                   − 23       5
                                              36
                                                            7
                                                         2 18    18 15          5
                                                                               24
                                                                                          3
                                                                                          4
                                                                                              91
                                                                                              48
                                              1            7                    1             15
    Ising (2d) [65]         1       0         8            4
                                                                  15            4
                                                                                      1       8
                            5       1         1           13                    4         6   28
  q=3 Potts (2d) [65]
                            6       3         9            9
                                                                  14           15         5   15
                            2       2         1            7                    1         3   15
 q=4 Potts (2d) [65, 77]
                            3       3         12           6
                                                                  15            4         2   8
                            1                 1
   classical (4d) [76]
                            2
                                    0         2
                                                          1        3           0      2       3
   Spherical (3d) [76]        1    −1         1
                                              2
                                                          2        5           0      1       5
                                                                                              2
     Ising (3d) [76]         −       1
                                     8
                                              5
                                              16
                                                           5
                                                           4
                                                                   5           −      −       −
     Ising (3d) [80]       0.631 0.108(5) 0.327(4)    1.237(4) 4.77(5)       0.039    −       −
  Heisenberg (3d) [78]      0.70   −0.1     0.36         1.4       5         0.03     −       −
     XY (3d) [79]          0.663    −         −       1.327(8)    −            −      −       −
 AF q=3 Potts (3d) [81]     0.66 −0.011     0.351      1.309    4.73           −      −       −


Πίνακας 14.7: Τιμές για τους κρίσιμους εκθέτες για τα μοντέλα που αναφέρονται
στην πρώτη στήλη. Όπου οι τιμές είναι με υποδιαστολή είναι προσεγγιστικές, οι υπό-
λοιπες ακριβώς υπολογισμένες. Στις προσεγγιστικές τιμές δεν εφαρμόζουμε σχέσεις
υπερβάθμισης, αλλά αναφέρουμε απλά τις τιμές της βιβλιογραφίας. Οι τιμές για το
πρότυπο 3d Ising από την [76] είναι εικασία. Για 3d Ising δες, επίσης, [42] p. 244. 3d
XY και 3d AF q=3 Potts εικάζεται ότι ανήκουν στην ίδια κλάση παγκοσμιότητας. Wu
for q=1 Potts (2d) reports yh = 51/48 and for q=4 (2d) η = 1/2, not compatible with
hyperscaling relations - assume typos.
680                            ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

14.15 Ασκήσεις
Στα αρχεία all και allem του συνοδευτικού λογισμικού αυτού του κε-
φαλαίου, υπάρχουν μετρήσεις που μπορείτε να τις χρησιμοποιήσετε για
ανάλυση δεδομένων ή για να τα συγκρίνετε με τις δικές σας μετρήσεις.

  1. Υπολογίστε τον μέσο λόγο αποδοχής Ā στον αλγόριθμο Metropolis
     ως συνάρτηση της θερμοκρασίας για L = 10, 40, 100. Στις ίδιες
     θερμοκρασίες υπολογίστε για τον αλγόριθμο Wolff το μέσο μέγε-
     θος των κατασκευαζόμενων clusters ⟨n⟩. Στη συνέχεια, υπολογίστε
     τον αριθμό των Wolff clusters που ισοδυναμούν με ένα Metropolis
     sweep για κάθε θερμοκρασία που προσομοιώσατε. Παραστήστε
     γραφικά τις παραπάνω ποσότητες.

  2. Στα σχήματα 14.6–14.10 προσθέστε ανάλογα σημεία για L = 50,
     120, 140, 160, 180, 200.

  3. Στα σχήματα 14.11–14.12 προσθέστε ανάλογα σημεία για L = 50,
     90, 130, 150, 190, 250. Επαναϋπολογίστε τον κρίσιμο εκθέτη z χρη-
     σιμοποιώντας και τα δικά σας δεδομένα.

  4. Στo σχήμα 14.13 προσθέστε ανάλογα σημεία για L = 30, 50, 70,
     90. Επαναϋπολογίστε τον κρίσιμο εκθέτη z χρησιμοποιώντας και
     τα δικά σας δεδομένα.

  5. Να αναπαράξετε τα αποτελέσματα του πίνακα 14.1. Προσθέστε
                                      A
     και μια 6η στήλη υπολογίζοντας τm,Metropolis = τm,Metropolis Ā, όπου Ā
     είναι ο μέσος λόγος αποδοχής του αλγόριθμου Metropolis. Αυτό
     αλλάζει τη μονάδα χρόνου σε N δεκτές αλλαγές των σπιν. Αυτοί
     είναι και οι αριθμοί που θα πρέπει να συγκριθούν άμεσα με τους
     τm .

  6. Εκτελέστε προσομοιώσεις με σκοπό να προσδιορίσετε τα μέγιστα
     της μαγνητικής επιδεκτικότητας και της ειδικής θερμότητας με
     ακρίβεια ανάλογη με αυτή που παρουσιάζεται στον πίνακα 14.5
     για L = 10, 20, 40, 80, 100. Υπολογίστε τις αντίστοιχες ψευδοκρί-
     σιμες θερμοκρασίες. Σε κάθε περίπτωση να κάνετε εκτίμηση των
     σφαλμάτων.

  7. Εκτελέστε τις προσαρμογές που οδηγούν στα αποτελέσματα (14.38),
     (14.39), (14.41) και (14.43)
14.15. ΑΣΚΗΣΕΙΣ                                                                    681

           L        χ(βc , L)          ⟨m⟩(βc , L)             c(βc , L)
          40     20.50      0.02    0.6364 0.0001          0.4883 0.0007
          60     41.78      0.08    0.6049 0.0002          0.5390 0.0008
          80     69.15      0.09    0.5835 0.0001          0.5743 0.0012
         100     102.21 0.25        0.5673 0.0002          0.6026 0.0014
         120     140.18 0.11        0.5548 0.0001          0.6235 0.0010
         140     183.95 0.33        0.5442 0.0002          0.6434 0.0006
         160     232.93 0.55        0.5351 0.0001          0.6584 0.0020
         200     342.13 0.72        0.5206 0.0001          0.6858 0.0014
         500     1687.2 4.4         0.4647 0.0002          0.7794 0.0018
        1000     6245       664     0.4228 0.0040          –          –


Πίνακας 14.8: Ο πίνακας των τιμών χ(βc , L), ⟨m⟩(βc , L) και c(βc , L) στην κρίσιμη θερ-
μοκρασία για διαφορετικά L που δίνεται για την άσκηση 9.


  8. Μελετήστε τη βάθμιση της ειδικής θερμότητας ως συνάρτηση της
     θερμοκρασίας. Συγκρίνετε την ποιότητα των προσαρμογών στις
     συναρτήσεις a log |t| και a |t|α μετρώντας το χ2 /dof όπως περιγρά-
     φεται στο Παράρτημα 13.7 μετά τη Σελ. 577.

  9. Δίνεται ο πίνακας 14.8 των μετρήσεων των τιμών των χ(βc , L),
     ⟨m⟩(βc , L) και c(βc , L). Κάντε τις απαραίτητες προσαρμογές, ώστε
     να πάρετε τους εκθέτες γ/ν, β/ν και α όπως περιγράφεται στο
     κείμενο. Ειδικά για τον α να δοκιμάσετε προσαρμογή σε δύναμη
     και σε λογάριθμο και να συγκρίνετε τα αποτελέσματα σύμφωνα
     με το κείμενο.

 10. Δίνεται ο πίνακας 14.5 των μετρήσεων των τιμών των L, βc (L),
     χmax , βc′ (L) και cmax . Κάντε τις απαραίτητες προσαρμογές, ώστε να
     πάρετε τoυς εκθέτες 1/ν, γ/ν, α/ν και την κρίσιμη θερμοκρασία βc
     όπως περιγράφεται στο κείμενο. Ειδικά για τον α να δοκιμάσετε
     προσαρμογή σε δύναμη και σε λογάριθμο και να συγκρίνετε τα
     αποτελέσματα σύμφωνα με το κείμενο.

 11. Αναπαράγετε τις “καταρρεύσεις” των σχημάτων 14.27-14.29. Χρη-
     σιμοποιήστε τα δεδομένα από το αρχείο all από το συνοδευτικό
     λογισμικό, το οποίο περιγράφεται στο κείμενο. Καθορίστε αρχικά
     τις γνωστές παραμέτρους και υπολογίστε τις συναρτήσεις βάθ-
     μισης Fχ,m,c . Μεταβάλετε κάθε παράμετρο χωριστά μέχρι η “κα-
     τάρρευση” να μην είναι ικανοποιητική και πάρτε τη μεταβολή της
     παραμέτρου να είναι το σφάλμα προσδιορισμού της. Προσδιορί-
682                              ΚΕΦΑΛΑΙΟ 14. ΚΡΙΣΙΜΟΙ ΕΚΘΕΤΕΣ

      στε το διάστημα της μεταβλητής x = L1/ν t όπου η βάθμιση είναι
      ικανοποιητική. Επαναλάβετε τον υπολογισμό σας, κάνοντας τις
      απαραίτητες μετρήσεις για L = 10, 20, και κρατώντας τις μετρή-
      σεις μόνο για L = 10, 20, 40, 80, 120. Συγκρίνετε τα αποτελέσματα
      που θα πάρετε με τα προηγούμενα.

 12. Αποδείξτε ότι για οποιαδήποτε παρατηρήσιμη ποσότητα O ισχύει
     ∂⟨O ⟩/∂β = −⟨EO⟩ + ⟨O⟩⟨E⟩ = −⟨(E − ⟨E⟩)(O − ⟨O⟩)⟩. Από τη
     σχέση αυτή υπολογίστε την παράγωγο του Binder Cumulant DU
     και αποδείξτε τη σχέση (14.67).

 13. Από το μέγιστο της παραγώγου του Binder Cumulant DU , υπολο-
     γίστε τον κρίσιμο εκθέτη 1/ν σύμφωνα με την ανάλυση που κάναμε
     στα σχήματα 14.23 και 14.25 για τη μαγνητική επιδεκτικότητα.

 14. Δείξτε ότι για μία γκαουσιανή κατανομή f (x) = ae−x /2σ έχουμε
                                                                  2   2


     ⟨x2 ⟩ = σ 2 και ⟨x4 ⟩ = 3σ 4 . Συμπεράνετε ότι 1 − ⟨x2 ⟩/(3⟨x4 ⟩) = 0.

 15. Θεωρήστε την κατανομή που δίνεται από την πυκνότητα πιθανό-
     τητας                    (                   )
                                  (x−m)2   (x+m)2
                                −        −
                     f (x) = a e 2σ2 + e 2σ2

      Κάντε τη γραφική της παράσταση και εξηγήστε γιατί μοιάζει με
      την κατανομή της μαγνήτισης στη φάση χαμηλής θερμοκρασίας
      β ≫ βc . Δείξτε ότι ⟨x4 ⟩ = m4 + 6m2 σ 2 + 3σ 2 και ⟨x2 ⟩ = m2 + σ 2 . Ερ-
      μηνεύστε τα αποτελέσματα, δηλ. τι εκφράζει η κάθε αναμενόμενη
      τιμή. Δείξτε ότι για σ ≪ m παίρνουμε U ≈ 2/3. Βεβαιωθείτε ότι
      η προσέγγιση που κάνατε αφορά το σύστημα που μελετάμε στη
      χαμηλή θερμοκρασία.

 16. Υπολογίστε την παράγωγο ∂U /∂β σαν συνάρτηση των ⟨em4 ⟩, ⟨em2 ⟩,
     ⟨m4 ⟩, ⟨m2 ⟩. Εφαρμόστε τα επιχειρήματα βάθμισης πεπερασμένου
     μεγέθους και αποδείξτε την εξίσωση (14.120).

 17. Από τις σχέσεις (14.131) και τις yt = 1/ν, γ = (2yh −d)/yt να δείξετε
     τις υπόλοιπες ισότητες στις σχέσεις (14.132) και (14.133).
ΒΙΒΛΙΟΓΡΑΦΙΑ

[Συγγράμματα]

[1] www.physics.ntua.gr/˜konstant/ComputationalPhysics/ Ο ιστό-
    τοπος του βιβλίου. Εκεί θα βρείτε το συνοδευτικό λογισμικό και
    συμπληρωματικό υλικό.

[2] H. Gould, J. Tobochnik and H. Christian, “Computer Simulation
    Methods, Application to Physical Systems”, Third Edition, Addison
    Wesley (2007). Ένα εξαιρετικό εισαγωγικό βιβλίο στην υπολογι-
    στική φυσική. Ο προγραμματισμός γίνεται σε περιβάλλον Java. Το
    λογισμικό δίνεται με άδεια ανοιχτού λογισμικού και μπορεί να
    ανακτηθεί από τη διεύθυνση opensourcephysics.org

[3] R. Landau, M. J. Páez and C. C. Bordeianu, “Computational Physics:
    Problem Solving with Computers”, Wiley-VCH, 2 ed. (2007).

[4] M. E. J. Newman and G. T. Barkema, “Monte Carlo Methods in
    Statistical Physics”, Clarendon Press, Oxford (2002). Εξαιρετικό βι-
    βλίο για ένα εισαγωγικό, αλλά και πιο προχωρημένο, μάθημα στις
    μεθόδους Μόντε Κάρλο στη φυσική.

[5] B. A. Berg, “Markov Chain Monte Carlo Simulations and Their Statistical
    Analysis. With Web-Based Fortran Code”, World Scientific, 2004. Μό-
    ντε Κάρλο για ένα μεταπτυχιακό μάθημα από έναν από τους κο-
    ρυφαίους του πεδίου. Διδάσκει πολλές από τις πιο προχωρημένες
    μεθόδους.

[6] D. P. Landau and K. Binder, “A Guide to Monte Carlo Simulations in
    Statistical Physics”, Cambridge University Press, 3rd Edition, 2009.

[7] K. Binder and D. W. Heermann, “Monte Carlo Simulation in Statistical
    Physics”, Fifth Edition, Springer (2010).

                                  683
684                                                    ΒΙΒΛΙΟΓΡΑΦΙΑ

 [8] W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flanney,
     “Numerical Recipes, The Art of Scientific Computing”, Third Edition,
     Cambridge University Press (2007), www.nr.com Το απόλυτα απα-
     ραίτητο εγχειρίδιο για κάθε επιστήμονα, με συνταγές για τις πιο
     βασικές αριθμητικές μεθόδους.

[Κεφάλαιο 1]

 [9] M. Metcalf, J. Reid , M. Cohen, “Modern Fortran Explained”, 4th
     Edition, OUP Oxford (2011).

[10] J. C. Adams, W. S. Brainerd, R. A. Hendrickson, R. E. Maine, J. T.
     Martin and B. T. Smith, “The Fortran 2003 Handbook: The Complete
     Syntax, Features and Procedures”, Springer (2009).

[11] T. M. R. Ellis, I. R. Philips and T. M. Lahey, “Fortran 90
     Programming”, Addison-Wesley (1994).

[12] C. G. Page, “Professional Programmer’s Guide       to   Fortran77”,
     http://www.star.le.ac.uk/˜cgp/prof77.html

[13] Gnuplot official site http://gnuplot.info/

[14] P. K. Janert, “Gnuplot in Action: Understanding Data with Graphs”,
     Manning Publications (2009).

[15] tcsh homepage: http://www.tcsh.org/Home

[16] P. DuBois, “Using csh & tcsh”, O’Reilly and Associates (1995),
     www.kitebird.com/csh-tcsh-book/

[17] M. J. Currie, “C-shell Cookbook”,
     http://www.astro.soton.ac.uk/unixtut/sc4.pdf

[18] Wiki book: “C Shell Scripting”,
     http://en.wikibooks.org/wiki/C_Shell_Scripting

[19] G. Anderson and P. Anderson, “The Unix C Shell Field Guide”,
     Prentice Hall (1986).

[Κεφάλαιο 3]

[20] R. M. May, “Simple Mathematical Models with Very Complicated Dyna-
     mics”, Nature 261 (1976) 459.
ΒΙΒΛΙΟΓΡΑΦΙΑ                                                          685

[21] C. Efthimiou, “Introduction to Functional Equations: Theory and
     Problem-Solving Strategies for Mathematical Competitions and Beyond”,
     MSRI Mathematical Circles Library (2010). Δείτε την ενότητα 16.7.

[22] P. Cvitanović, R. Artuso, R. Mainieri, G. Tanner and G. Vattay,
     “Chaos: Classical and Quantum”, ChaosBook.org, Niels Bohr Institute
     (2012).

[23] L. Smith, “Chaos: A Very Short Introduction”, Oxford University Press
     (2007).

[24] M. Schroeder, “Fractals, Chaos, Power Laws: Minutes from an Infinite
     Paradise”, W.H. Freeman (1991).

[25] S. H. Strogatz, “Non Linear Dynamics and Chaos”, Addison-Wesley
     (1994).

[26] Wikipedia: “Chaos Theory”, “Logistic Map”, “Bifurcation Diagram”,
     “Liapunov Exponents”, “Fractal Dimension”, “Feigenbaum
     constants”.

[27] Wikipedia: “List of chaotic maps”.

[28] Wikipedia: “Newton’s method”.

[29] M. Jakobson, “Absolutely continuous invariant measures for one-
     parameter families of one-dimensional maps”, Commun. Math. Phys. 81
     (1981) 39.

[Κεφάλαιο 4]

[30] W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flanney,
     “Numerical Recipes, The Art of Scientific Computing”, Third Edition,
     Cambridge University Press (2007), www.nr.com Δείτε τα κεφάλαια
     πάνω στις μεθόδους Runge–Kutta.

[31] E. W. Weisstein, “Runge-Kutta Method”, from MathWorld–A
     Wolfram Web Resource.
     http://mathworld.wolfram.com/Runge-KuttaMethod.html

[32] J. H. E. Cartwright and O. Piro, “The dynamics of Runge-Kutta
     methods”, Int. J. Bifurcation and Chaos 2, (1992) 427-449.

[33] J. H. Mathews and K. Fink, “Numerical Methods Using Matlab”,
     Prentice Hall (2003), Chapter 9.
686                                                       ΒΙΒΛΙΟΓΡΑΦΙΑ

[34] J. H. Mathews, “Numerical Analysis - Numerical Methods Project”,
     http://math.fullerton.edu/mathews/numerical.html

[35] I. Percival and D. Richards, “Introduction to Dynamics”, Cambridge
     University Press (1982). Δείτε επίσης την [37].

[36] J. B. McLaughlin, “Period Doubling bifurcations and chaotic motion for
     a parametrically forced pendulum”, J. Stat. Phys. 24 (1981) 375–388.

[Κεφάλαιο 5]

[37] J. V. José and E. J. Saletan, “Classical Dynamics, a Contemporary
     Approach”, Cambridge University Press, 1998.

[Κεφάλαιο 6]

[38] R. W. Brankin, I. Gladwell, and L. F. Shampine, “RKSUITE: a
     suite of Runge-Kutta codes for the initial value problem for ODEs”,
     Softreport 92-S1, Department of Mathematics, Southern Methodist
     University, Dallas, Texas, U.S.A (1992). Διαθέσιμο από τη διεύθυνση
     www.netlib.org/ode/rksuite και από το συνοδευτικό λογισμικό
     του βιβλίου.

[Κεφάλαιο 9]

[39] See    the   Mathematica    Notebooks           of     Peter     West
     http://young.physics.ucsc.edu/115/

[40] U. Wolff, B. Bunk, F. Knechtli, “Computational Physics I”,
     http://www.physik.hu-berlin.de/com/
     teachingandseminars/previous_CPI_CPII

[41] F. T. Hioe and E. W. Montroll, “Quantum theory of
     anharmonic oscillators. I. Energy levels of oscillators with
     positive quartic anharmonicity”, J. Math. Phys. 16 (1975) 1945,
     http://dx.doi.org/10.1063/1.522747

[Κεφάλαιο 11]

[42] L. Kadanoff, “Statistical Physics – Statics,           Dynamics    and
     Renormalization”, World Scientific (2000).

[43] J. Ambjørn, B. Durhuus and T. Jonsson, “Quantum Geometry”,
     Cambridge Monographs on Mathematical Physics, Cambridge
     University Press (1997).
ΒΙΒΛΙΟΓΡΑΦΙΑ                                                             687

[44] C. Itzykson and J. M. Drouffe, “Statistical Field Theory”, Volume
     1, Cambridge Monographs on Mathematical Physics, Cambridge
     University Press (1989).

[45] D. E. Knuth, “Seminumerical Algorithms”, Vol. 2 of “The Art of
     Computer Programming”, Addison-Wesley (1981).

[46] M. Lüscher, Comput. Phys. Commun. 79 (1994) 100; F.
     James, Comput. Phys. Commun. 79 (1994) 111; Erratum 97
     (1996) 357. Το πρόγραμμα είναι διαθέσιμο στις διευθύνσεις
     http://cpc.cs.qub.ac.uk/summaries/ACPR_v1_0.html
     http://wwwasd.web.cern.ch/wwwasd/cernlib/
     download/2001_wnt/src/mathlib/gen/v/ranlux.F

[47] L. Schrage, “A More Portable Fortran Random Number Generator”,
     ACM Transactions on Mathematical Software, 5 (1979) 132-138; P.
     Bratley, B. L. Fox and L. Schrage, “A Guide to Simulation”, Springer-
     Verlag, 1983.

[48] G. Marsaglia and A. Zaman, Ann. Appl. Prob. 1 (1991) 462.

[49] B. Li, N. Madras and A. D. Sokal, “Critical Exponents, Hyperscaling
     and Universal Amplitude Ratios for Two- and Three-Dimensional
     Self-Avoiding Walks”, J.Statist.Phys. 80 (1995) 661-754 [arXiv:hep-
     lat/9409003]; G. Slade, “The self-avoiding walk: A brief survey”,
     Surveys in Stochastic Processes, pp. 181-199, eds. J. Blath, P. Imkeller
     and S. Roelly, European Mathematical Society, Zurich, (2011),
     http://www.math.ubc.ca/˜slade/spa_proceedings.pdf

[Κεφάλαιο 12]

[50] J. J. Binney, N. J. Dowrick, A. J. Fisher and M. E. J. Newman, “The
     Theory of Critical Phenomena”, Clarenton Press (1992).

[51] R. K. Pathria and P. D. Beale, “Statistical Mechanics”, Third Edition,
     Elsevier (2011).

[52] F. Mandl, “Statistical Physics”, Second Edition, Wiley (1988).

[53] R. J. Baxter, “Exactly Solved Models in Statistical Mechanics”, Dover
     Publications (2008).

[Κεφάλαιο 13]
688                                                          ΒΙΒΛΙΟΓΡΑΦΙΑ

[54] E. Ising, “Beitrag zur Theorie des Ferromagnetizmus”, Z. Phys. 31
     (1925) 253–258.

[55] L. Onsager, “Crystal Statistics. I. A Two–Dimensional Model with an
     Order–Disorder Transition”, Phys. Rev. 65 (1944) 117–119.

[56] K. Huang, “Statistical Mechanics”, John Wiley & Sons, New York,
     (1987). Λεπτομερής παρουσίαση της λύσης Onsager.

[57] C. N. Yang, “The Spontaneous Magnetization of a Two-Dimensional Ising
     Model”, Phys. Rev. 85 (1952) 809.

[58] N. Metropolis, A. W. Rosenbluth, M. N. Rosenbluth, A. H. Teller
     and E. J. Teller, “Perspective on “Equation of state calculations by fast
     computing machines””, Chem. Phys. 21 (1953) 1087.

[59] M. P. Nightingale and H. W. J. Blöte, “Dynamic Exponent of the
     Two-Dimensional Ising Model and Monte Carlo Computation of the
     Subdominant Eigenvalue of the Stochastic Matrix”, Phys. Rev. Lett. 76
     (1996) 4548.

[60] H. Müller-Krumbhaar and K. Binder, “Dynamic properties of the
     Monte Carlo method in statistical mechanics”, J. Stat. Phys. 8 (1973) 1.

[61] B. Efron, “Computers and the Theory of Statistics: Thinking the
     Unthinkable”, SIAM Review 21 (1979) 460; “Bootstrap Methods:
     Another Look at the Jackknife”, Ann. Statist. 7 (1979) 1; B. Efron
     and R. Tibshirani, “Bootstrap Methods for Standard Errors, Confidence
     Intervals, and Other Measures of Statistical Accuracy”, Statistical Science
     1 (1986) 54. Ελεύθερα διαθέσιμο από το projecteuclid.org

[Κεφάλαιο 14]

[62] R. H. Swendsen and J.-S. Wang, “Nonuniversal critical dynamics in
     Monte Carlo simulations”, Phys. Rev. Lett. 58 (1987) 86.

[63] U. Wolff, “Collective Monte Carlo Updating for Spin Systems”, Phys.
     Rev. Lett. 62 (1989) 361.

[64] A. Pelisseto and E. Vicari, “Critical Phenomena and Renormalization–
     Group Theory”, Phys. Reports 368 (2002) 549.

[65] F. Y. Wu, “The Potts Model”, Rev. Mod. Phys. 54 (1982) 235.
ΒΙΒΛΙΟΓΡΑΦΙΑ                                                              689

[66] P. D. Coddington and C. F. Baillie, “Empirical relations between static
     and dynamic exponents for Ising model cluster algorithms”, Phys. Rev.
     Lett. 68 (1992) 962.

[67] H. Rieger, “Critical behavior of the three-dimensional random-field Ising
     model: Two-exponent scaling and discontinuous transition”, Phys. Rev.
     B 52 (1995) 6659.

[68] M. E. J. Newman and G. T. Barkema, “Monte Carlo study of the
     random-field Ising model”, Phys. Rev. E 53 (1996) 393.

[69] A. E. Ferdinand and M. E. Fisher, “Bounded and Inhomogeneous Ising
     Models. I. Specific-Heat Anomaly of a Finite Lattice”, Phys. Rev. 185
     (1969) 832; N. Sh. Izmailian and C. -K. Hu, “Exact amplitude ratio
     and finite-size corrections for the M × N square lattice Ising model”,
     Phys. Rev. E 65 (2002) 036103; J. Salas, “Exact finite-size-scaling
     corrections to the critical two-dimensional Ising model on a torus: II.
     Triangular and hexagonal lattices”, J. Phys. A 34 (2001) 1311; W.
     Janke and R. Kenna, “Exact finite-size scaling with corrections in the
     two-dimensional Ising model with special boundary conditions”, Nucl.
     Phys. (Proc. Suppl.) 106 (2002) 929.

[70] J. Ambjørn and K. N. Anagnostopoulos, “Quantum geometry of 2D
     gravity coupled to unitary matter”, Nucl. Phys. B 497 (1997) 445.

[71] K. Binder, “Critical Properties from Monte Carlo Coarse Graining and
     Renormalization”, Phys. Rev. Lett. 47 (1981) 693.

[72] K. Binder, “Finite size scaling analysis of ising model block distribution
     functions”, Z. Phys. B 43 (1981) 119; G. Kamieniarz and H. W.
     J. Blöte, “Universal ratio of magnetization moments in two-dimensional
     Ising models”, J. Phys. A 26 (1993) 201.

[73] J. Cardy, “Scaling and Renormalization in Statistical Physics”, 1st
     Edition, Cambridge University Press (1996).

[74] A. M. Ferrenberg and D. P. Landau, “Critical behavior of the three-
     dimensional Ising model: A high-resolution Monte Carlo study, Phys.
     Rev. B44 (1991) 5081.

[75] M. S. S. Challa, D. P. Landau and K. Binder, “Finite-size effects
     at temperature-driven first-order transitions”, Phys. Rev. B34 (1986)
     1841.
690                                                      ΒΙΒΛΙΟΓΡΑΦΙΑ

[76] H. E. Stanley, “Introduction to Phase Transitions and Critical
     Phenomena”, Oxford (1971).

[77] R. Creswick and S.-Y. Kim, “Critical exponents of the four-state Potts
     model, J. Phys. A: Math.Gen. 30 (1997) 8785.

[78] C. Holm and W. Janke, “Critical exponents of the classical three-
     dimensional Heisenberg model: A single-cluster Monte Carlo study”,
     Phys. Rev. B 48 (1993) 936 [arXiv:hep-lat/9301002].

[79] M. Hasenbusch and S. Meyer, “Critical exponents of the 3D XY model
     from cluster update Monte Carlo”, Phys. Lett. B 241 (1990) 238.

[80] M. Kolesik and M. Suzuki, “Accurate estimates of 3D Ising critical
     exponents using the coherent-anomaly method”, Physica A 215 (1995)
     138.

[81] M. Kolesik and M. Suzuki, “Critical exponents of the 3D
     antiferromagnetic three-state Potts model using the coherent-anomaly
     method”, Physica A 216 (1995) 469.