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 Το Πρόγραμμα - Το Κυρίως Πιάτο
Στην παράγραφο αυτή περιγράφουμε τη λειτουργία και τ