Εργασία 2: Αριθμητική κινητής υποδιαστολής και γραμμικά συστήματα

Εργασία 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]\) και υπολογίζει τις ρίζες του τριωνύμου

\[c_a (1+a) x^2+c_b(1+b) x+c_c (1+c)=0\]

όπου 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#

Η μετάδοση θερμότητας εντός ενός μονοδιάστατου τοιχώματος σε συνθήκες μόνιμης κατάστασης δίνεται από την διαφορική εξίσωση:

\[ \frac{d}{dx}\left(k\frac{dT}{dx}\right)=0 \]

με τις παρακάτω οριακές συνθήκες σε πρακτικές εφαρμογές: $\( \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\):

\[\begin{split} \begin{bmatrix} \frac{k}{Δx}+h_{in} & -\frac{k}{Δx} & 0 & {\ldots} & 0 &{\ldots}& 0 \\ -\frac{k}{Δx} & 2\frac{k}{Δx} & -\frac{k}{Δx} & {\ldots} & 0 &{\ldots}& 0 \\ 0 & -\frac{k}{Δx} & 2\frac{k}{Δx} & -\frac{k}{Δx} & 0 &{\ldots}& 0 \\ {\ldots} &{\ldots} &{\ldots} & {\ldots}&{\ldots} &{\ldots}&{\ldots}\\ 0 & 0 & -\frac{k}{Δx}& 2\frac{k}{Δx}& -\frac{k}{Δx} & 0 &{\ldots} \\ {\ldots} &{\ldots} &{\ldots} & {\ldots}&{\ldots}&{\ldots}&{\ldots} \\ 0& 0 & 0 & {\ldots}& 0 & -\frac{k}{Δx} &\frac{k}{Δx}+h_{out} \\ \end{bmatrix} \begin{bmatrix} T_1\\ T_2\\ T_3\\ {\ldots}\\ {T_i}\\ {\ldots}\\ T_n\\ \end{bmatrix} = \begin{bmatrix} h_{in}T_{in}\\ 0\\ 0\\ {\ldots}\\ 0\\ {\ldots}\\ h_{out}T_{out}\\ \end{bmatrix} \end{split}\]

με

  • \(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 που επιλύει το γραμμικό σύστημα:

\[\begin{split} \begin{bmatrix} 3 & -1 & -2\\ 2 & 5 & -3\\ 3 & -2 & 5 \end{bmatrix} \cdot \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} = \begin{bmatrix} a+1\\ b+2\\ c+3 \end{bmatrix} \end{split}\]

όπου 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.]