0.1. ΕΚΧΕΙΛ ΙΣΕΙΣ ΚΑΤ Α ΤΗΝ ΕΠ ΙΛΥΣΗ ΤΕΤΡΑΓΩΝΙΚ ΗΣ ΕΞ ΙΣΩΣΗΣ 1 0.1 Εκχειλίσεις κατά την Επίλυση Τετραγωνικής Εξίσωσης Θεώρησε, για a 0 την τετραγωνική εξίσωση ax 2 +bx+c = 0, η οποία, ως γνωστόν, έχει δύο πραγµατικές λύσεις (ϱίζες) οι οποίες δίδονται από τον τύπο: x 1,2 = b± b 2 4ac, 2a εφόσον = b 2 4ac 0. Θα υποθέσουµε στην συνέχεια ότι 0. Για παράδειγµα, η εξίσωσηx 2 6x+5 = 0 έχει τις ακριβείς ϱίζεςx 1 = 5 καιx 2 = 1. Η εξίσωση 10 30 x 2 6 10 30 x + 5 10 30 = 0 είναι µαθηµατικά ισοδύναµη µε την προηγούµενη και συνεπώς έχει τις ίδιες ακριβείς ϱίζες x 1 = 5 και x 2 = 1. Ας ϑεωρήσουµε τώρα ότι ο υποθετικός, δεκαδικού συστήµατος, υπολογιστής µας 1 µας έχει ακρίβεια αναπαράστασης (precision) 6 δεκαδικών ψηφίων και εκθετικό εύρος (exponent range) e [ 40, 40]. Σε µία τέτοια περίπτωση, ο υπολογισµός των ϱιζών σύµφωνα µε τον δεδοµένο τύπο ϑ απαιτούσε τους υπολογισµούς: x 1,2 = 6 1030 ± (6 10 30 ) 2 4 10 30 5 10 30 2 10 30 Σύµφωνα όµως µε την υπόθεσή µας, ο αριθµός 10 60 δεν είναι δυνατόν να αντιπροσωπευθεί στον υπολογιστή µας. Συνεπώς ο υπολογισµός ϑα οδηγήσει σε υπερ(εκ)χείλιση (overflow). Οµοίως εάν η αρχική εξίσωση είχε πολλαπλασιασθεί µε 10 30, οι υπολογισµοί στον υποθετικό υπολογιστή ϑα οδηγούσαν σε υπο(εκ)χείλιση (underflow). Εάν 1 32 bits PC είναι πολύ κοντά σ αυτήν την υπόθεση στην περίπτωση απλής ακρίβειας (single precision) αναπαράστασης αριθµών κινητής υποδιαστολής.
2 ο υπολογιστής αντιστοιχούσε την τιµή 0 στην υποεκχείλιση, τότε ϑα παρήγαγε τις λύσεις: x 1,2 = 6 10 30 ± (6 10 30 ) 2 4 10 30 5 10 30 2 10 30 = 6 10 30 ± 0 2 10 30 = 3, 3 οι οποίες δεν αντιστοιχούν στις πραγµατικές. Ενας τρόπος καταπολέµησης αυτών των ϕαινοµένων ϑα ήταν ενδεχοµένως η χρήση της διαδικασίας αλλαγής κλίµακας (scaling), να διαιρείται δηλαδή πάντοτε η εξίσωση µε τον συντελεστή κλίµακας (scaling factor) f = max{ a, b, c } έτσι ώστε όλοι οι συντελεστές της να κείνται στο διάστηµα [ 1,1]. Βέβαια κάτι τέτοιο δεν αποτελεί πανάκεια. Εάν π.χ. είχαµε την εξίσωση 10 20 x 2 +10 20 x+10 20 = 0 µε την µία ϱίζα κοντά στο 1 και την άλλη κοντά στο 10 40, η διαίρεση µε των συντελεστών µε το10 20 ϑα οδηγούσε σε υποεκχείλιση και ενδεχοµένως στην αντικατάσταση του συντελεστή του x 2 µε 0, οπότε η εξίσωση που ουσιαστικά ϑα επιλύαµε είναι ηx+1 = 0 µε µοναδική ϱίζα την 1. Η δεύτερη ϱίζα ϑα είχε χαθεί. Και ακόµη χειρότερα, εάν το γεγονός αυτό δεν εντοπίζονταν έγκαιρα ϑα οδηγούµεθα σε διαί- ϱεση µε το 0 και σε ολική κατάρευση των υπολογισµών λόγω της συνεπαγόµενης υπερεκχείλισης. Η επόµενη εξίσωση έχει δύο ϱίζες όπου η µία υπερέχει κατά πολύ της άλλης σε απόλυτη τιµή. Η εξίσωση x 2 10 6 x+1 = 0 έχει δύο πραγµατικές ϱίζες που, για ακρίβεια έξι σηµαντικών ψηφίων, είναι 10 6 και 10 6 αντίστοιχα. Η εφαρµογή όµως του κλασσικού τύπου οδηγεί στην ανάγκη υπολογισµού του 10 6 ± (10 6 ) 2 4 2
0.1. ΕΚΧΕΙΛ ΙΣΕΙΣ ΚΑΤ Α ΤΗΝ ΕΠ ΙΛΥΣΗ ΤΕΤΡΑΓΩΝΙΚ ΗΣ ΕΞ ΙΣΩΣΗΣ 3 εδοµένων των σφαλµάτων στρογγυλοποίησης, επειδή το 4 δεν προσθέτει σηµαντικά στο 10 12, ο υπολογισµός αυτός αντιστοιχεί για τον υποθετικό υπολογιστή µας στο 10 6 ± (10 6 ) 2 2 Η κατάληξη αυτών των υπολογισµών είναι η 10 6, που είναι σωστή λύση, και η 0, που δεν είναι καθόλου σωστή. Ενας τρόπος αποφυγής αυτής της κατάστασης είναι να υπολογίζεται πρώτα η ϱίζα για την οποία το πρόσηµο του b 2 4ac είναι το ίδιο µε το πρόσηµο του b. Ο σκοπός είναι η εξάλειψη του καταστροφικού σφάλµατος αλληλοεξάλειψης που προκύπτει όταν αφαιρούµε δύο σχεδόν ίσους αριθµούς. Για τον υπολογισµό της δεύτερης ϱίζας παρατηρούµε ότι το γινόµενο των δύο ϱιζών ισούται µε το c a. Συνεπώς, η δεύτερη ϱίζα λαµβάνεται διαιρώντας το c µε την πρώτη a ϱίζα. Για το συγκεκριµένο παράδειγµα, επειδή το ( 10 6 ) είναι ϑετικό, υπολογίζουµε την πρώτη ϱίζα για το ϑετικό πρόσηµο της b 2 4ac, οπότε έχουµε (10 6 +10 6 )/2 ή 10 6. Η δεύτερη ϱίζα υπολογίζεται συνεπώς ως (1/1)/10 6 ή 10 6. Η ακόλουθη υπορουτίνα σε Fortran 95 2 υλοποιεί τις προηγούµενες παρατηρήσεις: SUBROUTINE quad_eq (a,b,c,x1,x2, error ) IMPLICIT NONE REAL, INTENT(IN ) : : a,b, c REAL, INTENT(OUT) : : x1, x2 LOGICAL, INTENT(OUT) : : e rror REAL : : a0, b0, c0, f, d x1 = 0.0; x2 = 0.0 error = a==0.0; IF ( error ) RETURN f = MAX( ABS(a), ABS(b), ABS( c ) ) a0 = a/f ; b0 = b/f ; c0 = c/f error = a0==0.0; IF ( error ) RETURN d = b0 b0 4.0 a0 c0 error = d<0.0; IF ( error ) RETURN d = SQRT( d ) 2 Κατά συνθήκη και παράδοση αποδίδουµε τους γλωσσικούς όρους της Fortran µε κεφαλαία χωρίς αυτό ν αποτελεί αναγκαίο στυλιστικό στοιχείο.
4 IF ( b0 > 0.0 ) THEN x1 = ( b0 d ) / ( a0 + a0 ) ELSE x1 = ( b0 + d ) / ( a0 + a0 ) ENDIF x2 = ( c0/a0)/x1 END SUBROUTINE quad_eq Μία αντίστοιχη υλοποίηση στην γλώσσα προγραµµατισµού των Scilab, Octave και Matlab δίδεται από τον κάτωθι κώδικα: function [x1,x2] = quad_eq ( a,b, c ) x1 = NaN; x2 = NaN; if ( a == 0.0 ) return; f = max( [ abs (a), abs (b), abs ( c ) ] ) ; a0 = a/f ; b0 = b/f ; c0 = c/f ; i f ( a0 == 0.0 ) return; d = b0 b0 4.0 a0 c0; if ( d < 0.0 ) return; d = sqrt ( d ) ; if ( b0 > 0.0 ) x1 = ( b0 d ) / ( a0 + a0 ) ; else x1 = ( b0 + d ) / ( a0 + a0 ) ; x2 = ( c0/a0)/x1; end Βέβαια η προεπιλογή στα συστήµατα αυτά είναι αριθµοί κινητής υποδιαστολής διπλής ακρίβειας, ενώ στον αντίστοιχο κώδικα της Fortran προσδιορίσαµε τους αριθµούς ως απλής ακρίβειας οπότε τ αποτελέσµατα µπορεί να είναι δραµατικά διαφορετικά. Μπορούµε όµως να απαιτήσουµε διπλή ακρίβεια καθορίζοντας τους ορισµούς των µεταβλητών ως εξής:
0.2. ΑΣΚ ΗΣΕΙΣ 5 DOUBLE PRECISION, INTENT(IN ) : : a,b, c DOUBLE PRECISION, INTENT(OUT) : : x1, x2 DOUBLE PRECISION : : a0, b0, c0, f, d 0.2 Ασκήσεις Άσκηση 0.1 Ασκήσεις κατανόησης 1. Να στρογγυλοποιηθούν οι κάτωθι αριθµοί σε τρία σηµαντικά ψηφία και να υπολογιστούν τ απόλυτα και σχετικά σφάλµατα των προσεγγίσεων που προκύπτουν. (α) 2.1514, (ϐ) 0.16152, (γ) 0.01204, (δ)1.225, (ε) 0.0015281. [Απαντήσεις: (α) ā = 2.15,ǫ = 0.14 10 2,δ = 0.65 10 3, (ϐ) ā = 0.162,ǫ = 0.48 10 3,δ = 0.3 10 2, (γ) ā = 0.0120,ǫ = 0.4 10 4,δ = 0.33 10 2, (δ) ā = 1.23,ǫ = 0.5 10 2,δ = 0.41 10 2, (ε) ā = 0.00153,ǫ = 0.19 10 5,δ = 0.12 10 2 ] 2. Να εκτιµηθεί τ απόλυτο σφάλµα των κάτωθι προσεγγίσεων όταν είναι γνωστό το σχετικό τους σφάλµα: (α) ā = 13267,δ = 0.1%, (ϐ) ā = 2.32,δ = 0.7%, (γ) ā = 35.72,δ = 1%, (δ) ā = 0.896,δ = 10%, (ε) ā = 232.44,δ = 1% [Απαντήσεις: (α) 0.13 10 2, (ϐ) 0.16 10 1, (γ) 0.36 (δ) 0.9 10 1, (ε) 0.23 10 1 ] 3. Ποιος είναι ο αριθµός ορθών ψηφίων στους κάτωθι αριθµούς µε δεδοµένα τ απόλυτα σφάλµατα; (α) ā = 0.3941,ǫ = 0.25 10 2, (ϐ) ā = 0.1132,ǫ = 0.1 10 3, (γ) ā = 38.2543,ǫ = 0.27 10 2, (δ) ā = 32.285,ǫ = 0.2 10 2, (ε) ā = 0.2113,ǫ = 0.5 10 2 [Απαντήσεις: (α) 2, (ϐ) 3, (γ) 4, (δ) 4, (ε) 2] 4. Ποιος είναι ο αριθµός ορθών ψηφίων στους κάτωθι αριθµούς µε δεδοµένα τα σχετικά σφάλµατα; (α)ā = 1.8921,δ = 0.1 10 2, (ϐ)ā = 0.2218,δ = 0.1 10 1, (γ)ā = 22.351,δ = 0.1, (δ) ā = 592.8,δ = 2%, (ε) ā = 14.9360,δ = 1% [Απαντήσεις: (α) 3, (ϐ) 2, (γ) 1, (δ) 1, (ε) 2] 5. Ποια είναι τ απόλυτα σφάλµατα όταν στρογγυλοποιούµε τον αριθµόπ = 3.1415926535... σε πέντε, τέσσερα και τρία σηµαντικά ψηφία; [Απάντηση: 0.5 10 4,0.5 10 3 και 0.5 10 2 αντίστοιχα.]
6 6. Ποιο είναι το σχετικό σφάλµα όταν προσεγγίζουµε τον π µε π = 3.14; [Απάντηση: 1 6 %] 7. Υπολόγισε0.348+0.1834+345.4+235.2+11.75+9.27+0.0849+0.0214+0.000354 όταν όλα τα ψηφία των αριθµών είναι ορθά. [Απάντηση: 602.2 µε ǫ = 0.15] 8. Υπολόγισε 1.137 1.073 όταν ǫ 1 = ǫ 2 = 0.011. [Απάντηση: 0.064 µε ǫ = 0.022 και δ = 35%. Κανένα ορθό ψηφίο!] 9. Υπολόγισε 5.125 5.135 όταν όλα τα ψηφία των αριθµών είναι ορθά. Ποιο είναι το σχετικό σφάλµα; [Απάντηση: δ = 10%] 10. Υπολόγισε το 0.348+0.1834+345.4+235.2+11.75+9.27+0.0849+0.0214+0.000354 όταν οι αριθµοί δίδονται µε σφάλµα10 t,tηϑέση του τελευταίου δεκαδικού ψηφίου που διατηρούν. [Απάντηση: 602.2±0.3] 11. Υπολόγισε το 3.6 84.489 όταν όλα τα ψηφία των δύο αριθµών είναι ορθά. [Απάντηση: 304.20 µε δύο µόνον ορθά σηµαντικά ψηφία] 12. Υπολόγισε το 12.4 65.54 όταν όλα τα ψηφία των δύο αριθµών είναι ορθά. [Απάντηση: 813±4] 13. Υπολόγισε το 5.735 1.23 όταν όλα τα ψηφία των δύο αριθµών είναι ορθά. [Απάντηση: 4.66±0.03 µε δ = 0.0042.] 14. Υπολόγισε 3.2 356.7 0.04811 7.1948 34.56 όταν όλα τα ψηφία των αριθµών είναι ορθά. [Απάντηση: 0.221 µε δ = 1.6% και ǫ = 0.0036. Στρογγυλοποίηση σε 0.22 µε ǫ < 0.005] Εργαστηριακή Άσκηση 0.1 Χρησιµοποίησε τους κώδικες της 0.1 στις εξισώσεις που αναφέρονται στα παραδείγµατα της 0.1. Κάνε τις κατάλληλες µετατροπές για να ελέγξεις τους ισχυρισµούς της 0.1. Χρησιµοποίησε απλή και διπλή ακρίβεια. Συµφωνούν τα συµπεράσµατα της 0.1 µε τα εργαστηριακά σου ευρήµατα; Είναι αναγκαία η διπλή ακρίβεια;
0.2. ΑΣΚ ΗΣΕΙΣ 7 Εργαστηριακή Άσκηση 0.2 Για την εξίσωση x 2 + 10 6 x +1 = 0 έλεγξε τόσο σε απλή όσο και σε διπλή ακρίβεια εάν οι λύσεις της µπορούν να υπολογισθούν µε το παραδοσιακό τύπο ή µε τους κώδικες της 0.1. Είναι αναγκαία η διπλή ακρίβεια; Εργαστηριακή Άσκηση 0.3 Επέκτεινε τους κώδικες της 0.1 έτσι ώστε να χειρίζονται και την περίπτωση µιγαδικών λύσεων.