Μετάβαση στο περιεχόμενο

Επιστημονικός προγραμματισμός

Λύνουμε εξισώσεις με ωμή δύναμη και φτιάχνουμε απλά μοντέλα φυσικών φαινομένων σε Python.

45 λεπτά

Θα μάθεις να

  1. Να λύνεις μια εξίσωση με ωμή δύναμη, δοκιμάζοντας με βρόχο όλες τις υποψήφιες τιμές.
  2. Να εξηγείς γιατί η ωμή δύναμη βρίσκει μόνο ό,τι υπάρχει στο εύρος και στο βήμα που διάλεξες.
  3. Να φτιάχνεις σε Python ένα απλό μοντέλο που προχωρά βήμα βήμα στον χρόνο, όπως η ελεύθερη πτώση ή το κρύωμα ενός ροφήματος.
  4. Να συγκρίνεις το μοντέλο με μετρήσεις και να λες τι αγνοεί.

Ο υπολογιστής ως εργαλείο του επιστήμονα

Ένας φυσικός θέλει να ξέρει πού θα πέσει ένας δορυφόρος, ένας μετεωρολόγος τι καιρό θα κάνει αύριο, ένας γιατρός πώς θα απλωθεί μια επιδημία. Κανείς τους δεν μπορεί να κάνει το πείραμα πρώτα, για να δει. Γράφουν όμως ένα πρόγραμμα που μιμείται το φαινόμενο, και το τρέχουν.

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

Ωμή δύναμη: δοκίμασε τα όλα

Ποιος ακέραιος xx ικανοποιεί την x2+x=56x^2 + x = 56; Στα Μαθηματικά θα τη λύσεις ως εξίσωση δευτέρου βαθμού. Ο υπολογιστής όμως μπορεί κάτι πιο απλό: να δοκιμάσει κάθε υποψήφιο, πολύ γρήγορα.

for x in range(-20, 21):
    if x * x + x == 56:
        print("Λύση:", x)
Λύση: -8
Λύση: 7

Αυτή η μέθοδος λέγεται ωμή δύναμη (brute force): χωρίς έξυπνο κόλπο, δοκιμάζεις όλες τις πιθανές τιμές και κρατάς όσες ταιριάζουν. Για έναν άνθρωπο οι 4141 δοκιμές θέλουν ώρα. Για τον υπολογιστή, ένα κλάσμα του δευτερολέπτου.

Όταν η λύση δεν είναι ακέραια

Ποιος αριθμός υψωμένος στον κύβο δίνει 2020; Το 23=82^3 = 8 είναι λίγο, το 33=273^3 = 27 πολύ. Η λύση είναι ανάμεσα, και δεν είναι ακέραια.

Εδώ η ωμή δύναμη αλλάζει λίγο. Δοκιμάζουμε με μικρό βήμα, π.χ. 0,010{,}01, και αφού δεν θα πέσουμε ακριβώς πάνω στη λύση, κρατάμε την τιμή με το μικρότερο λάθος:

x = 0
kalyteri = 0
mikrotero_lathos = 1000
while x <= 5:
    lathos = abs(x ** 3 - 20)
    if lathos < mikrotero_lathos:
        mikrotero_lathos = lathos
        kalyteri = x
    x = x + 0.01
print(round(kalyteri, 2), round(mikrotero_lathos, 3))
2.71 0.097

Η abs δίνει την απόλυτη τιμή, ώστε ένα λάθος προς τα κάτω να μετρά όσο ένα προς τα πάνω. Το 2,7132{,}71^3 απέχει λιγότερο από 0,10{,}1 από το 2020. Με βήμα 0,0010{,}001 θα πλησιάζαμε περισσότερο, με δέκα φορές περισσότερες δοκιμές.

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

Κυνήγι ρίζας με δοκιμές

Διάλεξε αριθμό και στένεψε την παγίδα. Κάθε γύρος είναι μια ωμή δύναμη με δέκα φορές μικρότερο βήμα από τον προηγούμενο.

Ποια ρίζα ψάχνουμε

4 < √20 < 5

Οι δοκιμές16 < 20 < 25

Η παγίδα στένεψε, αλλά δεν έκλεισε

Κάθε μικρότερο βήμα φέρνει πιο κοντά, αλλά ποτέ ακριβώς. Ο υπολογιστής σταματά όταν το λάθος γίνει αρκετά μικρό για αυτό που χρειάζεσαι.

Ένα μοντέλο που προχωρά στον χρόνο

Ένα μοντέλο είναι μια απλοποιημένη περιγραφή ενός φαινομένου, που κρατά ό,τι μετράει περισσότερο και αφήνει έξω τα υπόλοιπα.

Πάρε μια πέτρα που αφήνεις να πέσει. Η Φυσική λέει ότι, αν αγνοήσουμε τον αέρα, η ταχύτητά της αυξάνεται κατά περίπου 9,819{,}81 m/s σε κάθε δευτερόλεπτο. Το πρόγραμμα δεν χρειάζεται τύπο για τη θέση της. Προχωρά τον χρόνο σε μικρά βήματα dt, και σε κάθε βήμα κάνει δύο απλές ενημερώσεις:

g = 9.81
dt = 0.5
t = 0
v = 0
y = 0
while t < 2:
    y = y + v * dt
    v = v + g * dt
    t = t + dt
print(round(y, 1))

Η πρώτη γραμμή λέει: στο μικρό διάστημα dt, η πέτρα έπεσε περίπου «ταχύτητα επί χρόνο». Η δεύτερη λέει: στο ίδιο διάστημα, η ταχύτητα μεγάλωσε κατά g * dt.

Η πτώση βήμα βήμα, με dt = 0,5 s

Σε κάθε βήμα, πρώτα αλλάζει η θέση με την παλιά ταχύτητα, μετά η ταχύτητα. Υπολόγισε την επόμενη γραμμή πριν πατήσεις.

Βήμαt (s)y (m) που έπεσεv (m/s)
Ζωντανή ενημέρωση

Γιατί βγήκε λιγότερο; Σε κάθε μισό δευτερόλεπτο το μοντέλο χρησιμοποιεί την ταχύτητα που είχε η πέτρα στην αρχή του διαστήματος, ενώ στην πραγματικότητα η ταχύτητα αυξάνεται συνεχώς. Όσο μικραίνει το βήμα, τόσο μικραίνει και το λάθος:

Βήμα dtΠόσα μέτρα σε 2 sΛάθος
11 s9,89{,}89,89{,}8
0,50{,}5 s14,714{,}74,94{,}9
0,10{,}1 s18,618{,}61,01{,}0
0,010{,}01 s19,519{,}50,10{,}1

Δέκα φορές μικρότερο βήμα, περίπου δέκα φορές μικρότερο λάθος, και δέκα φορές περισσότεροι υπολογισμοί.

Το μοντέλο και η πραγματικότητα

Ένα ζεστό ρόφημα κρυώνει πιο γρήγορα όταν είναι πολύ ζεστό, και πιο αργά όσο πλησιάζει τη θερμοκρασία του δωματίου. Ένας απλός κανόνας λέει: σε κάθε λεπτό, η θερμοκρασία πέφτει κατά ένα σταθερό ποσοστό kk της διαφοράς από το δωμάτιο.

T = 90
T_dom = 22
k = 0.05
for lepto in range(1, 21):
    T = T - k * (T - T_dom)
    if lepto % 5 == 0:
        print(lepto, round(T, 1))

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

ΛεπτόΜοντέλο (°C)Μέτρηση (°C)
574,675
1062,764
1553,556
2046,450

Στην αρχή το μοντέλο πέφτει σχεδόν πάνω στις μετρήσεις. Όσο περνά ο χρόνος, απομακρύνεται: το πραγματικό ρόφημα κρυώνει πιο αργά. Ίσως το kk που διαλέξαμε είναι μεγάλο. Ίσως το φλιτζάνι κρατά ζέστη και τη δίνει σιγά σιγά πίσω. Το μοντέλο δεν ξέρει τίποτα για φλιτζάνια, καπάκια ή ρεύματα αέρα.

Αυτή είναι η δουλειά του επιστήμονα με τα μοντέλα: τρέχει, συγκρίνει με τις μετρήσεις, διορθώνει, π.χ. δοκιμάζει άλλο kk ή προσθέτει αυτό που λείπει, και ξανά από την αρχή.

Λυμένα παραδείγματα

Παράδειγμα 1

Βρες με ωμή δύναμη δύο θετικούς μονοψήφιους ακέραιους με άθροισμα 10 και γινόμενο 21.

Δοκίμασέ το πρώτα. Μετά δες τη λύση.

Παράδειγμα 2

Με το μοντέλο του ροφήματος (T = 90, θερμοκρασία δωματίου 22, k = 0,05), υπολόγισε με το χέρι τη θερμοκρασία μετά από 1 και μετά από 2 λεπτά.

Δοκίμασέ το πρώτα. Μετά δες τη λύση.

Ασκήσεις

Πρώτα ερωτήσεις με επιλογές: διαλέγεις, πατάς «Έλεγξε» και μαθαίνεις αμέσως αν το βρήκες και γιατί. Στο τέλος, λίγες ασκήσεις χωρίς επιλογές — εκεί κρύβεται μόνο η απάντηση.

Πολλαπλή επιλογήΆσκηση 1 από 12
Τι σημαίνει ότι λύνεις μια εξίσωση με ωμή δύναμη;

Τα κατάφερες;

  • Να λύνεις μια εξίσωση με ωμή δύναμη, δοκιμάζοντας με βρόχο όλες τις υποψήφιες τιμές.
  • Να εξηγείς γιατί η ωμή δύναμη βρίσκει μόνο ό,τι υπάρχει στο εύρος και στο βήμα που διάλεξες.
  • Να φτιάχνεις σε Python ένα απλό μοντέλο που προχωρά βήμα βήμα στον χρόνο, όπως η ελεύθερη πτώση ή το κρύωμα ενός ροφήματος.
  • Να συγκρίνεις το μοντέλο με μετρήσεις και να λες τι αγνοεί.

Λύσε τις ασκήσεις πιο πάνω και θα δεις εδώ πού στέκεσαι.