Εργασία 2: Αριθμητική κινητής υποδιαστολής και γραμμικά συστήματα#
Οδηγίες#
Όι ζητούμενες συναρτήσεις δεν πρέπει έχουν αναφορές σε global μεταβλητές εκτός από τις σταθερές καθιερωμένων μονάδων κώδικα (π.χ numpy.pi) και όσες μεταβλητές δίνονται στο πρώτο κελί.
Ο αριθμός μητρώου πρέπει να είναι σύμφωνος με αυτόν που έχει δηλωθεί στο προφίλ του eclass.
Όπου χρησιμοποιούνται ψηφία του αριθμού μητρώου, πρέπει να είναι απευθείας δηλωμένα στον κώδικα (hard-coded) κάθε συνάρτησης και όχι να εξάγονται από τον ΑΜ.
Το αρχείο της εργασίας πρέπει να τρέχει εξ ολοκλήρου (Run All) για να βαθμολογηθεί.
ΠΡΟΣΟΧΗ: Υπάρχουν προφανή τυπογραφικά λάθη στις εκφωνήσεις.
# Εισαγωγή μονάδων κώδικα
# - Μην αλλάζετε αυτό το κελί.
import numpy as np
import matplotlib.pyplot as plt
C=1e10
# Στοιχεία φοιτητή
# - Εισάγετε το όνομά σας με ελληνικούς χαρακτήρες.
onoma = "onoma"
eponymo = "eponymo"
AM = 3100999
Άσκηση 1#
Γράψτε μια συνάρτηση με το όνομα myfunction1
που δέχεται ως όρισμα ενα διάνυσμα \(C=[c_a,c_b,c_c]\) και υπολογίζει τις ρίζες του τριωνύμου
όπου a,b,c τα 3 τελευταία ψηφία του αριθμού μητρώου σας (c=τελευταίο).
Η συνάρτηση πρέπει να επιστρέφει ένα διάνυσμα δύο τιμών με τις ρίζες, εκτός από τις 2 παρακάτω περιπτώσεις:
Όταν το τριώνυμο απλοποιείται σε εξίσωση πρώτου βαθμού, η δεύτερη τιμή πρέπει να είναι απροσδιόριστη.
Όταν δεν υπάρχουν πραγματικές ρίζες ή η εξίσωση είναι αδύνατη, η συνάρτηση πρέπει να επιστρέφει δύο απροσδιόριστες τιμές.
Χρησιμοποιήσετε την εναλλακτική έκφραση για την δεύτερη ρίζα.
Ελέγξτε τα αποτελέσματα της συνάρτησης για:
\(C=[1,-1,-1]\)
\(C=[1,-10000,-1000]\)
\(C=[0,1,-1]\)
# Λύση της άσκησης 1
# - Σε αυτό το κελί γράψτε μόνο τις ζητούμενες συναρτήσεις χωρίς print και input.
def myfunction1(C: np.ndarray) -> np.ndarray:
xroot=np.array([0.,0.])
return xroot
# Πρόχειρο άσκησης 1
# - Σε αυτό το κελί μπορείτε να τυπώσετε μεταβλητές και να κάνετε γραφικές παραστάσεις για επαλήθευση. Δεν λαμβάνεται υπόψη στην βαθμολόγηση.
print(myfunction1(np.array([1.,-1.,-1.])), myfunction1(np.array([1.,-10000.,-1000.])), myfunction1(np.array([0.,1.,-1.])))
[0. 0.] [0. 0.] [0. 0.]
Άσκηση 2#
Η μετάδοση θερμότητας εντός ενός μονοδιάστατου τοιχώματος σε συνθήκες μόνιμης κατάστασης δίνεται από την διαφορική εξίσωση:
με τις παρακάτω οριακές συνθήκες σε πρακτικές εφαρμογές: $\( \left. {-k\frac{dT}{dx}}\right|_{x=0}=h_{in}(T_{in}-T_{x=0})\\ \left. -k\frac{dT}{dx}\right|_{x=L}=h_{out}(T_{x=L}-T_{out}) \)$
Το παραπάνω πρόβλημα μπορεί να λυθεί αριθμητικά εφαρμόζοντας πεπερασμένες διαφορές και καταλήγοντας σε ένα γραμμικό σύστημα \(n\) εξισώσεων και \(n\) άγνωστων θερμοκρασιών που αντιστοιχούν στα σημεία \(0,Δx,2Δx,\dots,L\):
με
\(k\) τον συντελεστή θερμικής αγωγιμότητας του υλικού του τοιχώματος
\(Δx=\frac{L}{n-1}\) το χωρικό βήμα της διακριτοποίησης του πάχους \(L\) του τοιχώματος
\(h_{in}\) τον συντελεστή συναγωγής στο εσωτερικό
\(h_{out}\) τον συντελεστή συναγωγής στο εξωτερικό
Γράψτε μια συνάρτηση myfunction2
που δέχεται ως ορίσματα τα μεγέθη \(k,L,h_{in},h_{out},n\) και επιστρέφει ένα διάνυσμα με τις θερμοκρασίες \([Τ_1,Τ_2,\dots,T_n]\). Για τον υπολογισμό του διανύσματος μπορεί να επιλεγεί οποιαδήποτε μέθοδος επίλυσης.
Οι οριακές θερμοκρασίες δίνονται με βάση τον αριθμό μητρώου:
\([21+a-\frac{b}{2}]*C\)
\([8-c]°C\)
Ελέγξτε τα αποτελέσματα της συνάρτησης για
\(k=1\quad\frac{W}{mK}\)
\(L=0.3\quad m\)
\(h_{in}=6\quad \frac{W}{m^2K}\)
\(h_{out}=8\quad \frac{W}{m^2K}\)
\(n=10\)
Για δικιά σας κατανόηση μπορείτε να κατασκευάσετε γράφημα θερμοκρασίας[°C]-απόστασης[m] με τα σημεία \((0,Τ_1),(Δx,T_2),(2Δx,T_3),\dots,((n-1)Δx,T_n)\).
Ερώτηση για τις εξετάσεις: Λαμβάνοντας υπόψη την μορφή του πίνακα, ποια μέθοδο επίλυσης θα εφαρμόζατε για να περιορίσετε το υπολογιστικό φορτίο;
# Λύση της άσκησης 2
# - Σε αυτό το κελί γράψτε μόνο τις ζητούμενες συναρτήσεις χωρίς print και input.
def myfunction2(k: float, L:float, hin:float, hout:float, n:int)->np.ndarray:
T=np.zeros(n)
return T
# Πρόχειρο άσκησης 2
# - Σε αυτό το κελί μπορείτε να τυπώσετε μεταβλητές και να κάνετε γραφικές παραστάσεις για επαλήθευση. Δεν λαμβάνεται υπόψη στην βαθμολόγηση.
print(myfunction2(1.0, 0.3, 6., 8.,10))
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
Άσκηση 3#
Γράψτε μια συνάρτηση myfunction3
που επιλύει το γραμμικό σύστημα:
όπου a,b,c τα 3 τελευταία ψηφία του αριθμού μητρώου σας (c=τελευταίο).
Χρησιμοποιήστε την μέθοδο Gauss-Seidel σταματώντας όταν όλα τα στοιχεία της καινούργιας εκτίμησης αποκλίνουν από την προηγούμενη λιγότερο από 2ΟE-4 κατά απόλυτη τιμή ή όταν το πλήθος των επαναλήψεων φτάσει τις 100. Η συνάρτηση θα δέχεται ως όρισμα ένα διάνυσμα \(x_{init}\) με τις αρχικές τιμές και θα επιστρέφει ένα διάνυσμα 3 στοιχείων \([x_1,x_2,x_3]\) με τα τελικά αποτελέσματα.
Ελέγξτε τα αποτελέσματα της συνάρτησης για \(x_{init}=[0.,0.,0.]\) και \(x_{init}=[100.,100.,100.]\).
Υπόδειξη: Χρησιμοποιήστε .copy(), όταν θέλετε να αντιγράψετε τις τιμές σε διαφορετικό χώρο μνήμης και όχι να δημιουργήσετε ένα δείκτη σε υπάρχοντα πίνακα.
Ερώτηση για τις εξετάσεις: Ποιο διάνυσμα αρχικών τιμών δινει πιο γρήγορη σύγκλιση και γιατί;
# Λύση της άσκησης 3
# - Σε αυτό το κελί γράψτε μόνο τις ζητούμενες συναρτήσεις χωρίς print και input.
def myfunction3(xinit: np.ndarray)->np.ndarray:
xnew=np.zeros(3)
return xnew
# Πρόχειρο άσκησης 3
# - Σε αυτό το κελί μπορείτε να τυπώσετε μεταβλητές και να κάνετε γραφικές παραστάσεις για επαλήθευση. Δεν λαμβάνεται υπόψη στην βαθμολόγηση.
print(myfunction3(np.array([0., 0., 0.])),myfunction3(np.array([100., 100., 100.])))
[0. 0. 0.] [0. 0. 0.]