Επιστημονικός προγραμματισμός
Λύνουμε εξισώσεις με ωμή δύναμη και φτιάχνουμε απλά μοντέλα φυσικών φαινομένων σε Python.
45 λεπτά
Θα μάθεις να
- Να λύνεις μια εξίσωση με ωμή δύναμη, δοκιμάζοντας με βρόχο όλες τις υποψήφιες τιμές.
- Να εξηγείς γιατί η ωμή δύναμη βρίσκει μόνο ό,τι υπάρχει στο εύρος και στο βήμα που διάλεξες.
- Να φτιάχνεις σε Python ένα απλό μοντέλο που προχωρά βήμα βήμα στον χρόνο, όπως η ελεύθερη πτώση ή το κρύωμα ενός ροφήματος.
- Να συγκρίνεις το μοντέλο με μετρήσεις και να λες τι αγνοεί.
Ο υπολογιστής ως εργαλείο του επιστήμονα
Ένας φυσικός θέλει να ξέρει πού θα πέσει ένας δορυφόρος, ένας μετεωρολόγος τι καιρό θα κάνει αύριο, ένας γιατρός πώς θα απλωθεί μια επιδημία. Κανείς τους δεν μπορεί να κάνει το πείραμα πρώτα, για να δει. Γράφουν όμως ένα πρόγραμμα που μιμείται το φαινόμενο, και το τρέχουν.
Αυτό λέγεται επιστημονικός προγραμματισμός. Θα δούμε δύο από τα βασικά του εργαλεία: τη λύση εξισώσεων με ωμή δύναμη, και τα μοντέλα που προχωρούν βήμα βήμα στον χρόνο.
Ωμή δύναμη: δοκίμασε τα όλα
Ποιος ακέραιος ικανοποιεί την ; Στα Μαθηματικά θα τη λύσεις ως εξίσωση δευτέρου βαθμού. Ο υπολογιστής όμως μπορεί κάτι πιο απλό: να δοκιμάσει κάθε υποψήφιο, πολύ γρήγορα.
for x in range(-20, 21):
if x * x + x == 56:
print("Λύση:", x)
Λύση: -8
Λύση: 7
Αυτή η μέθοδος λέγεται ωμή δύναμη (brute force): χωρίς έξυπνο κόλπο, δοκιμάζεις όλες τις πιθανές τιμές και κρατάς όσες ταιριάζουν. Για έναν άνθρωπο οι δοκιμές θέλουν ώρα. Για τον υπολογιστή, ένα κλάσμα του δευτερολέπτου.
Όταν η λύση δεν είναι ακέραια
Ποιος αριθμός υψωμένος στον κύβο δίνει ; Το είναι λίγο, το πολύ. Η λύση είναι ανάμεσα, και δεν είναι ακέραια.
Εδώ η ωμή δύναμη αλλάζει λίγο. Δοκιμάζουμε με μικρό βήμα, π.χ. , και αφού δεν θα πέσουμε ακριβώς πάνω στη λύση, κρατάμε την τιμή με το μικρότερο λάθος:
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 δίνει την απόλυτη τιμή, ώστε ένα λάθος προς τα κάτω να μετρά όσο ένα
προς τα πάνω. Το απέχει λιγότερο από από το . Με βήμα
θα πλησιάζαμε περισσότερο, με δέκα φορές περισσότερες δοκιμές.
Το ίδιο κυνήγι, για τετραγωνικές ρίζες, μπορείς να το κάνεις με το χέρι: κάθε γύρος στενεύει την παγίδα κατά ένα δεκαδικό ψηφίο.
Ένα μοντέλο που προχωρά στον χρόνο
Ένα μοντέλο είναι μια απλοποιημένη περιγραφή ενός φαινομένου, που κρατά ό,τι μετράει περισσότερο και αφήνει έξω τα υπόλοιπα.
Πάρε μια πέτρα που αφήνεις να πέσει. Η Φυσική λέει ότι, αν αγνοήσουμε τον αέρα,
η ταχύτητά της αυξάνεται κατά περίπου 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 | Πόσα μέτρα σε 2 s | Λάθος |
|---|---|---|
| s | ||
| s | ||
| s | ||
| s |
Δέκα φορές μικρότερο βήμα, περίπου δέκα φορές μικρότερο λάθος, και δέκα φορές περισσότεροι υπολογισμοί.
Το μοντέλο και η πραγματικότητα
Ένα ζεστό ρόφημα κρυώνει πιο γρήγορα όταν είναι πολύ ζεστό, και πιο αργά όσο πλησιάζει τη θερμοκρασία του δωματίου. Ένας απλός κανόνας λέει: σε κάθε λεπτό, η θερμοκρασία πέφτει κατά ένα σταθερό ποσοστό της διαφοράς από το δωμάτιο.
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) |
|---|---|---|
| 5 | 74,6 | 75 |
| 10 | 62,7 | 64 |
| 15 | 53,5 | 56 |
| 20 | 46,4 | 50 |
Στην αρχή το μοντέλο πέφτει σχεδόν πάνω στις μετρήσεις. Όσο περνά ο χρόνος, απομακρύνεται: το πραγματικό ρόφημα κρυώνει πιο αργά. Ίσως το που διαλέξαμε είναι μεγάλο. Ίσως το φλιτζάνι κρατά ζέστη και τη δίνει σιγά σιγά πίσω. Το μοντέλο δεν ξέρει τίποτα για φλιτζάνια, καπάκια ή ρεύματα αέρα.
Αυτή είναι η δουλειά του επιστήμονα με τα μοντέλα: τρέχει, συγκρίνει με τις μετρήσεις, διορθώνει, π.χ. δοκιμάζει άλλο ή προσθέτει αυτό που λείπει, και ξανά από την αρχή.
Λυμένα παραδείγματα
Παράδειγμα 1
Βρες με ωμή δύναμη δύο θετικούς μονοψήφιους ακέραιους με άθροισμα 10 και γινόμενο 21.
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Παράδειγμα 2
Με το μοντέλο του ροφήματος (T = 90, θερμοκρασία δωματίου 22, k = 0,05), υπολόγισε με το χέρι τη θερμοκρασία μετά από 1 και μετά από 2 λεπτά.
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Ασκήσεις
Πρώτα ερωτήσεις με επιλογές: διαλέγεις, πατάς «Έλεγξε» και μαθαίνεις αμέσως αν το βρήκες και γιατί. Στο τέλος, λίγες ασκήσεις χωρίς επιλογές — εκεί κρύβεται μόνο η απάντηση.
Τα κατάφερες;
- Να λύνεις μια εξίσωση με ωμή δύναμη, δοκιμάζοντας με βρόχο όλες τις υποψήφιες τιμές.
- Να εξηγείς γιατί η ωμή δύναμη βρίσκει μόνο ό,τι υπάρχει στο εύρος και στο βήμα που διάλεξες.
- Να φτιάχνεις σε Python ένα απλό μοντέλο που προχωρά βήμα βήμα στον χρόνο, όπως η ελεύθερη πτώση ή το κρύωμα ενός ροφήματος.
- Να συγκρίνεις το μοντέλο με μετρήσεις και να λες τι αγνοεί.
Λύσε τις ασκήσεις πιο πάνω και θα δεις εδώ πού στέκεσαι.