Κυριακή, 6 Σεπτεμβρίου 2015

Υπολογισμός όγκου λίμνης

Στην φύση οι επιφάνειες σπάνια δίνονται από συναρτήσεις αλλά ακόμη και να δίνονται χαρακτηρίζονται από μη γραμμικές συναρτήσεις. Όμως πολλά από τα προβλήματα του μηχανικού απαιτούν ολοκλήρωση αυτών των συναρτήσεων. Μπορούμε να αναφέρουμε δύο χαρακτηριστικά προβλήματα: τον υπολογισμό του όγκου νερού μίας λίμνης και τον υπολογισμό του όγκου χώματος. Το πρόβλημα που θα μας απασχολήσει είναι η "ολοκλήρωση" του πυθμένα μίας λίμνης ώστε να προκύψει ο όγκος νερού.

Αρχικά, πρέπει με κάποιον τρόπο να σχηματίσουμε μία εικόνα για τον πυθμένα της λίμνης. Με άλλα λόγια, είναι απαραίτητο να έχουμε δεδομένα για την μορφολογία του πυθμένα καθώς είναι η επιφάνεια που περικλείει το νερό. Χρησιμοποιώντας βυθόμετρο (τοπογραφικό όργανο που μετράει το βάθος) μπορούμε να μετρήσουμε το βάθος της λίμνης σε διάφορα σημεία. Το πιο βολικό είναι τα σημεία αυτά να είναι κατανεμημένα σε κάναβο συγκεκριμένων διαστάσεων (σχήμα 1). Τα σημεία μέτρησης του βυθού κατά x απέχουν απόσταση a και κατά y απόσταση b. Καθώς έχουμε να κάνουμε με ένα πρόβλημα διακριτοποίησης όσο πιο μικρά είναι τα a και b τόσο καλύτερη αναπαράσταση του βυθού έχουμε.

σχήμα 1, ο κάναβος των σημείων μέτρησης του βυθού. Βλέπουμε πως κατά x έχουμε 9 σημεία μέτρησης και κατά y 5 σημεία μέτρησης. Συνεπώς έχουμε μετρήσεις σε 45 σημεία.

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

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

σχήμα 2, με κίτρινες γραμμές φαίνεται ο πυθμένας της λίμνης.

Τα μετρημένα βάθη μπορούμε να τα ταξινομήσουμε σε έναν πίνακα. Η ταξινόμηση θα γίνει με τέτοιον τρόπο ώστε πχ το σημείο που βρίσκεται στην τρίτη γραμμή και στην τέταρτη στήλη του κανάβου να βρίσκεται και στην τρίτη γραμμή και στην τέταρτη στήλη του πίνακα. Με άλλα λόγια πρέπει η σχετική θέση μεταξύ των σημείων στον κάναβο και τον πίνακα είναι η ίδια. Αυτό συμβαίνει διότι κάθε σημείο μέτρησης του βάθους χαρακτηρίζεται και από την θέση του στον κάναβο, δηλαδή από τις συντεταγμένες του x και y. Τα x και y εκφράζονται στο συγκεκριμένο παράδειγμα από τα i και j, όπου i είναι η στήλη του κανάβου στην οποία βρίσκεται το σημείο και j είναι η γραμμή. Ας υποθέσουμε πως οι μετρήσεις μας έχουν ταξινομηθεί στον παρακάτω πίνακα. Επιπλέον, ας υποθέσουμε πως a=2 και b=3.


Οπτικοποιώντας αυτόν τον πίνακα στο surfer προκύπτει το σχήμα 3. Όσο πιο σκούρο είναι το χρώμα τόσο πιο βαθιά είναι η λίμνη σε αυτό το σημείο.

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

Αρχικά χωρίζουμε την λίμνη σε διατομές. Για την διευκόλυνση μας οι διατομές είναι καλό να γίνουν για j=1, 2...5. Συγκεκριμένα για j=2 η διατομή φαίνεται στο σχήμα 4.


σχήμα 4, η διατομή για j=2. Φαίνονται τα σημεία μέτρησης του βάθους και οι αντίστοιχες τιμές του βάθους.
Είναι εύκολο να υπολογίσουμε το εμβαδόν της διατομής του σχήματος 4. Απλώς αθροίζουμε τα τραπέζια και τα τρίγωνα που σχηματίζονται. Αυτή την διαδικασία την κάνουμε για κάθε διατομή και ως εκ τούτου έχουμε 5 τιμές που αντιπροσωπεύουν εμβαδόν. Η ισαποχή των διατομών είναι ίση με b=3. Έτσι, αν θεωρήσουμε πως το εμβαδόν κάθε διατομής μπορεί να αναπαρασταθεί με το μήκος ενός ευθύγραμμου τμήματος προκύπτει το σχήμα 5.

σχήμα 5, οι τιμές που αναγράφονται είναι τα εμβαδά των αντίστοιχων διατομών.
Με κόκκινο χρώμα φαίνονται τα ευθύγραμμα τμήματα που αντιπροσωπεύουν το
εμβαδόν των διατομών. Στις διατομές j=0 και 5 το εμβαδόν είναι μηδενικό.
Το εμβαδόν της διαγεγραμμένης περιοχής αποτελεί τον όγκο νερού της λίμνης και υπολογίζεται χωρίζοντας την περιοχή σε τρίγωνα και τραπέζια (δηλαδή με την ίδια μέθοδο που υπολογίσαμε το εμβαδόν κάθε διατομής).

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

Private Sub Command1_Click()

'δηλώσεις μεταβλητών
Dim n1 As Integer, n2 As Integer, a As Double, b As Double
Dim z() As Double, E() As Double

'εισαγωγή των διαστάσεων του προβλήματος μας και των a και b
n1 = InputBox("δώσε τον αριθμό των σημείων κατά x")
n2 = InputBox("δώσε τον αριθμό των σημείων κατά y")
a = InputBox("δώσε την ισαποχή των σημείων κατά x")
b = InputBox("δώσε την ισαποχή των σημείων κατά y")

'επαναδήλωση πινάκων
ReDim z(n1, n2) As Double, E(n2) As Double

'άνοιγμα αρχείου για την εισαγωγή δεδομένων
Open "data.txt" For Input As #1

'εισαγωγή των δεδομένων από το αρχείο
For m = 1 To n2
For n = 1 To n1
Input #1, z(n, m)
Next n
Next m

'υπολογισμός του εμβαδού κάθε διατομής
For j = 1 To n2
Sum = 0
For i = 1 To n1 - 1
g = (z(i, j) + z(i + 1, j)) * a / 2
Sum = Sum + g
Next i
E(j) = Sum
Next j

V = 0

'υπολογισμός του όγκου νερού
For k = 1 To n2 - 1
h = (E(k) + E(k + 1)) * b / 2
V = h + V
Next k

'εκτύπωση του αποτελέσματος στην φόρμα
Text1.Text = Format(V, "0.00")

End Sub

Στο σχήμα 6 μπορούμε να δούμε την φόρμα του κώδικα.

σχήμα 6, η φόρμα του κώδικα.

Για να τρέξει λοιπόν ο παραπάνω κώδικας δημιουργούμε το αρχείο data.txt όπως φαίνεται στο σχήμα 7.

σχήμα 7, φαίνεται η δομή του αρχείου data.txt

Έπειτα, πιέζουμε το πλήκτρο "υπολογισμός". Ως δεδομένα εισάγουμε πως έχουμε 9 σημεία κατά x, 5 σημεία κατά y και πως a=2 και b=3. Μετά την εισαγωγή των δεδομένων προκύπτει πως ο όγκος νερού της συγκεκριμένης λίμνης ισούται με 767.4 m3.

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

Μπορείτε να κατεβάσετε τον κώδικα από την καρτέλα Λογισμικό.

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου