Ανέκαθεν οι άνθρωποι αντιµετώπιζαν προβλήµατα υπολογισµού µη κανονικών ποσοτήτων όπως είναι για παράδειγµα το εµβαδόν ενός χωραφιού µε ακανόνιστο περίγραµµα, ή ο όγκος µιας δεξαµενής κωνικού σχήµατος κλπ. Στην προσπάθεια επίλυσης τέτοιων προβληµάτων αναπτύχθηκαν διάφορα εργαλεία προσέγγισης της ζητούµενης τιµής, τα οποία εισάγουν λιγότερο ή περισσότερο σφάλµα στον υπολογισµό της. Η βασική αρχή πάνω στην οποία στηρίζεται κάθε τέτοια προσέγγιση είναι η διακριτοποίηση των συνεχών ποσοτήτων του πραγµατικού κόσµου σε στοιχειώδη τµήµατα (σύνολα διακεκριµένων τιµών). Η µεθοδολογία αυτή έχει τις ρίζες της στην αρχαιότητα και πέρασε κατά σειρά από τους αρχαίους Βαβυλώνιους, τους Αιγυπτίους και τους Έλληνες. Χαρακτηριστικές είναι οι περιπτώσεις του Αρχιµήδη (220 π.χ.) ο οποίος υπολόγισε την τιµή του άρρητου αριθµού π, µε ακρίβεια ικανοποιητική ακόµη και για σήµερα, και του Ήρωνα (100 π.χ.) ο οποίος έδωσε έναν επαναληπτικό τύπο για την εύρεση της τετραγωνικής ρίζας πραγµατικού αριθµού, ο οποίος αποτελεί µερική περίπτωση της µεθόδου Newton-Raphson που βρέθηκε µετά από 18 αιώνες. Η εµφάνιση των ηλεκτρονικών υπολογιστών στα µέσα του 20 ου αιώνα και η συνεχής και αλµατώδης ανάπτυξη των δυνατοτήτων τους, υπερκέρασαν το εµπόδιο του τεράστιου πλήθους υπολογισµών που πολλές φορές απαιτούνται για να εφαρµοστούν οι αριθµητικές µέθοδοι και επέτρεψε έτσι την ευρεία χρήση τους. Όπως είναι γνωστό, οι εγγενείς µαθηµατικές δυνατότητες των υπολογιστών εξαντλούνται στις βασικές πράξεις της αριθµητικής. Έτσι, ένα από τα αντικείµενα των αριθµητικών µεθόδων είναι η µετατροπή όλων των γνωστών Μαθηµατικών σε άλλα, κατά κάποιον τρόπο ισοδύναµα Μαθηµατικά, στα οποία είναι αρκετές µόνον αυτές οι βασικές πράξεις και εποµένως είναι επεξεργάσιµα από τους ηλεκτρονικούς υπολογιστές. Με βάση αυτό το χαρακτηριστικό, οι αριθµητικές µέθοδοι είναι όχι µόνο χρήσιµες, αλλά και απαραίτητες σε πολλούς τοµείς των εφαρµοσµένων Μαθηµατικών, όπως η στατιστική, η επιχειρησιακή έρευνα κλπ, αλλά και άλλων βασικών ή εφαρµοσµένων επιστηµών όπως η Φυσική, η Χηµεία, η Βιολογία, η Μηχανική, η Τοπογραφία, η Ναυπηγική κλπ. Συνήθως, δεν είναι αναγκαίο να δηµιουργούνται νέοι αλγόριθµοι κάθε φορά που κάποιο πρόβληµα αντιµετωπίζεται µε βάση τις αριθµητικές µεθόδους. Στην πλειοψηφία των περιπτώσεων έχουν ήδη επινοηθεί λιγότερο ή περισσότερο επιτυχηµένοι αλγόριθµοι για κάθε µαθηµατική δραστηριότητα που ενδέχεται να αντιµετωπίσει ο επιστήµονας, ο µηχανικός κλπ. Έτσι, η προσωπική συνεισφορά αυτού που χρησιµοποιεί κάποια αριθµητική µέθοδο, συνίσταται στην επιλογή του βέλτιστου αλγόριθµου για το πρόβληµα που θέλει να επιλύσει και στην σωστή υλοποίηση του µε την χρήση µιας γλώσσας προγραµµατισµού. Η επιλογή αυτή είναι µια καθόλου προφανής, δύσκολη και συχνά επίπονη διαδικασία, αφού πρέπει να συνεκτιµηθούν πάρα πολλοί παράγοντες, όπως η ευστάθεια 1 των προσεγγιστικών λύσεων, το σφάλµα που εισάγεται, οι υπολογιστικές δυνατότητες που διατίθενται, κλπ. Με τις περισσότερες από αυτές τις κρίσιµες παραµέτρους θα ασχοληθούµε στο υπόλοιπο µέρος του βιβλίου. διακριτοποίηση αριθµητική παραγώγιση Οι βασικές µαθηµατικές πράξεις (operations), όπως η παραγώγιση και η ολοκλήρωση συναρτήσεων, δεν είναι πάντοτε εφικτές µε αναλυτικές µεθόδους. Από την άλλη µεριά, υπάρχουν πάρα πολλές περιπτώσεις όπου η πολυπλοκότητα της 1 Αναφέρεται στην εύρεση της ίδιας πάντοτε λύσης, ανεξάρτητα από τις αρχικές εκτιµήσεις και τις άλλες φυσικές και αριθµητικές παραµέτρους του προβλήµατος. 1
συνάρτησης σε συνδυασµό µε την επιθυµητή ακρίβεια καθιστούν ασύµφορο και επισφαλή τον αναλυτικό υπολογισµό 'µε το χέρι'. Οι αριθµητικές µέθοδοι προτείνουν τρόπους επίλυσης αυτών ακριβώς των προβληµάτων που δεν µπορούν ή δεν συµφέρει να λυθούν αναλυτικά. Για την αριθµητική παραγώγιση ειδικά, απαραίτητη προϋπόθεση για την χρήση αριθµητικής µεθόδου είναι να µεταφράσουµε το πρόβληµα σε κάτι που να µπορεί να υπολογιστεί αριθµητικά εισάγοντας τις εξισώσεις διαφορών. Ας δούµε πως: Είναι γνωστό ότι: f ( x+ h) f ( x) f ( x) = lim h 0 h Από την άλλη µεριά, για οποιαδήποτε συνεχή συνάρτηση f(x) ισχύει η έκφραση για το ανάπτυγµα κατά Taylor: 2 n h h n f ( x) = f ( x0) + hf ( x0) + f ( x0) +... + f ( x0) 2! n! Αν το h είναι πάρα πολύ µικρό (αλλά όχι µηδενικό), τότε οι όροι τάξης h, h 2, h 3, είναι ασήµαντοι σε σχέση µε τον πρώτο όρο διότι τείνουν εκθετικά στο µηδέν όσο µικραίνει το h. Έτσι, για πολύ µικρά h 'επιζούν' µόνο οι δυο πρώτοι όροι της σειράς, οπότε είναι: f ( x) f ( x+ h) f ( x) h Ας δούµε την εφαρµογή της προηγούµενης διαδικασίας για την συνάρτηση του επόµενου σχήµατος. ιαµερίζουµε (χωρίζουµε) το πεδίο ορισµού [0,1] της συνάρτησης σε Ν-το-πλήθος υποδιαστήµατα που το καθένα τους έχει µήκος h=1/ν. Φαίνεται αµέσως πως όσο πιο µεγάλο είναι το Ν, δηλ. όσο πιο πυκνή είναι η διαµέριση, τόσο πιο µικρό είναι το h, δηλ. τόσο πιο κοντά στην παράγωγο βρίσκεται η έκφραση [f(x+h)- f(x)]/h. f( x i-1 ) f( x i ) f( x i+1 ) f( x ) h h X 1 X i X 0 = 0 X i-1 X N-1 X N = 1 X i+1 Τώρα, είναι απλό να υπολογιστεί η f ( x) µέσω της προηγούµενης αριθµητικής έκφρασης: f ( x i+ 1 ) f ( x i ) f ( x i ) = h 2
Η παραπάνω έκφραση για την πρώτη παράγωγο ονοµάζεται προς τα εµπρός διαφορά (forward difference). Οι εξισώσεις διαφορών είναι πολύ βολικές για να χρησιµοποιηθούν από τον υπολογιστή, ακριβώς επειδή διαχειρίζονται διακριτές ποσότητες αντί για συνεχείς. Πρέπει όµως να τονίσουµε πως προϋπήρξαν κατά πολύ των υπολογιστών και κατά το µεγαλύτερο διάστηµα της ύπαρξής τους, οι όποιες επαναληπτικές πράξεις απαιτούνταν, γίνονταν µε το χέρι! Περισσότερα για τις εξισώσεις διαφορών θα δούµε στην συνέχεια αυτού του κεφαλαίου, όταν θα µιλήσουµε διεξοδικά για την αριθµητική παραγώγιση. Προς το παρόν ας δούµε έναν σχετικά απλό κώδικα που υπολογίζει την f ( x) σε κάποιο σηµείο x 0 µε χρήση προς τα εµπρός διαφορών: PROGRAM ForwardDifferences_ABS!!αντικείµενο:! Το πρόγραµµα υπολογίζει την πρώτη παράγωγο της! συνάρτησης!! f(x)= LOG (EXP(SIN(x))+1000.-SIN(EXP(x)))!! σε οποιοδήποτε σηµείο ζητήσει ο χρήστης µε χρήση! προς-τα-εµπρός διαφορών. Η διαδικασία αυτή επαναλαµβάνεται! για τρεις διαφορετικές διαµερίσεις, δηλ τρία! διαφορετικά βήµατα (0.1, 0.01 και 0.001).! Ακόµη υπολογίζει το απόλυτο σφάλµα σε! σχέση µε την αναλυτικά προσδιοριζόµενη τιµή.!σχόλιο:! Για να υπολογιστεί η πρώτη παράγωγος οποιασδήποτε! άλλης συνάρτησης το µόνο που χρειάζεται να κάνει ο! χρήστης είναι να αλλάξει τις! εκφράσεις για το B και το D στις δυο functions. IMPLICIT NONE! δηλώσεις: REAL::H(3), &!3 διαφ. βήµατα point,&!το σηµείο στο οποίο θα υπολογιστεί η f'(x) DER_A,&!πραγµατική τιµή της f'(x) DER_N,&!αριθµητική τιµή της f'(x) ERR_ABS!απόλυτο σφάλµα INTEGER::i! εκφράσεις: H=(/0.1,0.01,0.001/)!3 διαφ. βήµατα CONTAINS PRINT*,'give the point'!ο χρήστης ορίζει το σηµείο READ*,point!στο οποίο θα υπολογιστεί!η παράγωγος! πραγµατική τιµή της παραγώγου DER_A=DF(point)! προς τα εµπρός διαφορές DO i=1,3 DER_N=(F(point+H(i))-F(point))/H(i) ERR_ABS=ABS(DER_N-DER_A) PRINT*, DER_N,DER_A, ERR_ABS 3
!συνάρτηση: REAL FUNCTION F(A) RESULT(B) REAL, INTENT(IN) ::A B=LOG (EXP(SIN(A))+1000.-SIN(EXP(A))) END FUNCTION F!αναλυτική έκφραση παραγώγου: REAL FUNCTION DF(C) RESULT(D) REAL, INTENT(IN) ::C D=(EXP(SIN(C))*COS(C)-COS(EXP(C))*EXP(C))/ & (EXP(SIN(C))+1000.-SIN(EXP(C))) END FUNCTION DF END PROGRAM ForwardDifferences_ABS Τα αποτελέσµατα που παράγονται µε χρήση του παραπάνω κώδικα για την παράγωγο της συνάρτησης f(x) στο σηµείο x 0 =0.12345, είναι τα ακόλουθα: h Αριθµητική Προσέγγιση Αναλυτική τιµή Σφάλµα 0.1 7.2956085 x 10-4 6.4099283 x 10-4 8.8568020 x 10-5 0.01 6.1988831 x 10-4 6.4099283 x 10-4 2.1104526 x 10-5 0.001 6.2985783 x 10-4 6.4099283 x 10-4 1.1134989 x 10-5 Το παραπάνω παράδειγµα αποτελεί µια καλή βάση για να αντιληφθεί ο αναγνώστης τις έννοιες της διαµέρισης και της προσέγγισης. Εδώ η προσέγγιση συνίσταται στην απαλοιφή των επιπρόσθετων όρων τάξης h, h 2, h 3,... από την έκφραση της παραγώγου ενώ η διαµέριση του συνεχούς διαστήµατος [x 0,x N ] σε Ν-το-πλήθος διακριτά διαστήµατα µήκους h επιτρέπει τον υπολογισµό της παραγώγου σε καθένα από τα άκρα τους. Εννοείται ότι, όσο πιο µεγάλο είναι το Ν (δηλ. όσο πιο µικρό είναι το h) τόσο πιο κοντά στο συνεχές διάστηµα είναι η διαµέριση και, όπως φαίνεται και από τον πίνακα των αποτελεσµάτων, τόσο πιο µικρό το σφάλµα. Αλλά µέχρι στιγµής δεν είπαµε τίποτε για το πως υπολογίζεται το σφάλµα. σφάλµατα Κάθε µέτρηση που κάνουµε σε οποιοδήποτε φυσικό µέγεθος εµπεριέχει κάποιο σφάλµα, υπό την έννοια ότι διαφέρει, έστω και απειροελάχιστα, από την πραγµατική τιµή που µετράµε. Μπορεί αυτή η 'απόσταση' ανάµεσα στον πραγµατικό κόσµο και αυτόν που µπορούµε να αντιληφθούµε µέσω των µετρήσεων να απασχολεί κατά µείζονα λόγο την φυσική ή την φιλοσοφία, όµως αφορά έµπρακτα και σε άλλα επιστηµονικά πεδία, µεταξύ των οποίων δεσπόζουσα θέση κατέχουν οι αριθµητικές µέθοδοι. Τα σφάλµατα που υπεισέρχονται στις αριθµητικές µεθόδους µπορούν να κατηγοριοποιηθούν µε πολλούς τρόπους, ανάλογα µε την οπτική που τα αντιµετωπίζει κανείς. Έτσι, έχουµε: ανάλογα µε τον τρόπο που τα εκτιµάµε, τα υπολογιστικά σφάλµατα διακρίνονται σε απόλυτα και σχετικά ανάλογα µε την αιτία που τα προκαλεί, τα υπολογιστικά σφάλµατα διακρίνονται σε λειτουργικά και προγραµµατισµού 4
Πριν όµως αναφερθούµε διεξοδικά στα διάφορα είδη σφαλµάτων και την αντιµετώπισή τους, θα πρέπει να τα ορίσουµε αυστηρότερα και να µιλήσουµε για την φύση και την σηµασία τους. α) ορισµοί για τα σφάλµατα, ανάλογα µε τον τρόπο που τα εκτιµάµε Είναι ήδη σαφές ότι κάθε διαδικασία προσέγγισης µιας συνεχούς ποσότητας εµπεριέχει εξ' ορισµού κάποιο λάθος. Η διαφορά της υπολογιζόµενης τιµής ενός µεγέθους από την πραγµατική ονοµάζεται σφάλµα. Στην πράξη, δεν ενδιαφέρει το πρόσηµο του σφάλµατος αλλά µόνο η απόλυτη τιµή του 2, η οποία ονοµάζεται απόλυτο σφάλµα. Έτσι, αν µια πραγµατική απόσταση ενός µέτρου υπολογίζεται αριθµητικά ότι είναι δύο µέτρα, τότε το απόλυτο σφάλµα αυτού του υπολογισµού είναι 1 µέτρο. Οµοίως, 1 µέτρο είναι και πάλι το απόλυτο σφάλµα ενός υπολογισµού που προσεγγίζει µια πραγµατική απόσταση 2000 µέτρων µε την τιµή 1999 µέτρα. Παρόλο που και στις δύο περιπτώσεις το απόλυτο σφάλµα είναι το ίδιο, είναι φανερό ότι ο δεύτερος υπολογισµός είναι πολύ ακριβέστερος του πρώτου. Αυτό συµβαίνει επειδή συγκρίνεται το απόλυτο σφάλµα µε την τιµή που υπολογίσθηκε. Η σύγκριση αυτή ονοµάζεται σχετικό σφάλµα και ορίζεται ως: πραγµατικηɺ τιµηɺ υπολογιζοµενη ɺ τιµηɺ σχετικοɺ σφαλµα ɺ = πραγµατικηɺ τιµηɺ Το σφάλµα που εµφανίστηκε προηγουµένως είναι απόλυτο σφάλµα. Προφανώς µπορούµε να υπολογίσουµε και το σχετικό σφάλµα προσθέτοντας στον κώδικα την γραµµή: ERR_REL=(ABS(DER_N-DER_A)/DER_A)*100. Αν αντικατασταθεί λοιπόν το απόλυτο σφάλµα µε το σχετικό και ταυτόχρονα αναχθεί σε ποσοστό %, ο κώδικας παράγει τα ακόλουθα αποτελέσµατα για την παράγωγο της συνάρτησης f(x)= ln (e sinx + 1000 - sine x ) στο σηµείο x 0 =0.12345: h Αριθµητική Προσέγγιση Αναλυτική τιµή Σχετικό Σφάλµα (%) 0.1 7.2956085 x 10-4 6.4099283 x 10-4 13.82 0.01 6.1988831 x 10-4 6.4099283 x 10-4 3.29 0.001 6.2985783 x 10-4 6.4099283 x 10-4 1.74 Τώρα, η ψυχολογική εντύπωση του αναγνώστη σχετικά µε την ακρίβεια της προσέγγισης γίνεται µετρήσιµη ποσότητα: ενώ µε βάση το απόλυτο σφάλµα ο αναγνώστης ήξερε ότι για h = 0.001 ο αριθµητικός υπολογισµός απείχε της πραγµατικής τιµής κατά 1.11 x 10-5, κάτι που από µόνο του δεν σηµαίνει και πολλά πράγµατα, µε βάση το σχετικό σφάλµα ξέρει ότι απέχει κατά 1.74%, δηλαδή ότι ο υπολογισµός του είναι κατά 98.26% ακριβής. Πολύ µεγάλη διαφορά! Από εδώ και πέρα, όταν αναφερόµαστε στον όρο 'σφάλµα' θα εννοούµε 'σχετικό σφάλµα', αφού όπως είδαµε, αντιπροσωπεύει πολύ επιτυχέστερα την απόκλιση της µέτρησης ή του υπολογισµού µας από το πραγµατικό φυσικό µέγεθος. 2 Αυτό συµβαίνει διότι στην πράξη δεν έχει τόση σηµασία αν η υπολογιζόµενη τιµή υπερβάλλει ή υπολείπεται της πραγµατικής, αλλά µόνο πόσο απέχει από την πραγµατική. 5
β) ορισµοί για τα σφάλµατα, ανάλογα µε την αιτία που τα προκαλεί Γενικά στις αριθµητικές µεθόδους τα σφάλµατα µπορούν να οφείλονται σε δύο αιτίες: την λειτουργία του υπολογιστή και σε διάφορες προγραµµατιστικές αδυναµίες, οι οποίες µπορεί να σχετίζονται µε την σειρά των πράξεων, την στρογγύλευση των αριθµών, την διάδοση των σφαλµάτων κλπ. Για τα σφάλµατα που οφείλονται στην αρχιτεκτονική του υπολογιστή, το µόνο που µπορούµε να κάνουµε είναι να τα λαµβάνουµε υπ' όψιν µας σε κάθε κώδικα που γράφουµε, προσέχοντας να µην µας ξεφύγει κάποια διαδικασία που τα περιέχει, ενώ για τα δεύτερα (αυτά δηλ. που συνήθως οφείλονται σε προγραµµατιστικές αδυναµίες), θα δούµε στην συνέχεια κάποιες πολύ χρήσιµες τεχνικές υπέρβασής τους. Ποια όµως είναι αυτά τα σφάλµατα; Τα σφάλµατα που οφείλονται στην διαχείριση των αριθµητικών ποσοτήτων από τον υπολογιστή διακρίνονται σε σφάλµατα αποκοπής και σε σφάλµατα στρογγύλευσης. Λέµε ότι ένας αριθµός αποκόπτεται στο n-οστό ψηφίο του όταν διατηρούνται τα n πρώτα ψηφία του ενώ αγνοούνται τα υπόλοιπα. Αντίστοιχα, λέµε ότι ένας αριθµός στρογγυλοποιείται στο n-οστό ψηφίο του όταν αντικαθίσταται από έναν αριθµό µε 'n' το πλήθος ψηφία που τον αναπαριστά αρκετά πιστά. Για παράδειγµα, ο αριθµός 2/3, που σε δεκαδική µορφή γράφεται 0.6666666 αποκόπτεται στο 5 ο δεκαδικό του ψηφίο ως 0.66666 αλλά στρογγυλοποιείται στο 5 ο δεκαδικό του ψηφίο ως 0.66667. Σφάλµα αποκοπής ονοµάζεται το σφάλµα που προκύπτει από την αντικατάσταση ενός δεκαδικού αριθµού µε έναν άλλον ο οποίος έχει αποκοπεί σε λιγότερα δεκαδικά ψηφία. Η αντικατάσταση αυτή είναι αναγκαία είτε επειδή ο δεκαδικός έχει άπειρα δεκαδικά ψηφία (π.χ. ο αριθµός π=3.1415926535...) είτε επειδή το πλήθος των δεκαδικών ψηφίων του είναι µεγαλύτερο από την επιθυµητή ακρίβεια. Σφάλµα στρογγύλευσης ονοµάζεται το σφάλµα που προκύπτει από την αντικατάσταση ενός δεκαδικού αριθµού µε έναν άλλον ο οποίος τον στρογγυλεύει σε λιγότερα δεκαδικά ψηφία. Η αντικατάσταση αυτή είναι αναγκαία για τους ίδιους λόγους που είναι και η αποκοπή, αλλά προτιµείται επειδή προσφέρει µεγαλύτερη ακρίβεια. Έτσι, για τον αριθµό 0.12345678 για παράδειγµα, το απόλυτο σφάλµα αποκοπής του στο 5ο δεκαδικό ψηφίο είναι 0.12345-0.12345678 = 0.00000678, ενώ το απόλυτο σφάλµα στρογγύλευσης είναι 0.12346-0.12345678 = 0.00000322. Τα σφάλµατα αποκοπής και στρογγύλευσης είναι απολύτως αναπόφευκτα ακριβώς επειδή είναι αδύνατον να δουλέψει ο υπολογιστής ή ο άνθρωπος µε άπειρο πλήθος σηµαντικών 3 ψηφίων. 3 Σηµαντικά ψηφία ενός αριθµού ονοµάζονται όλα τα ψηφία ενός αριθµού εκτός από ενδεχόµενα 6
Από την άλλη µεριά, τα προγραµµατιστικά σφάλµατα συνήθως οφείλονται στον τρόπο που διαχειρίζεται ο κώδικάς µας τις διάφορες αριθµητικές ποσότητες. Τα κρίσιµα σηµεία είναι: η αντικατάσταση µιας σειράς (δηλαδή ενός αθροίσµατος άπειρου πλήθους όρων) µε ένα µερικό άθροισµά της (δηλαδή ενός αθροίσµατος πεπερασµένου πλήθους όρων). Αυτό συνέβη ήδη στο παράδειγµα της παραγώγου ( 12.2) όπου η άπειρη σειρά που αναπαριστά την f ( x) αντικαταστάθηκε από τον πρώτο όρο της. οι πράξεις µεταξύ ποσοτήτων που το µέγεθός τους διαφέρει κατά πολλές τάξεις (π.χ. η αφαίρεση 10 40-10 -40 ). η σειρά των πράξεων η χρήση µεικτής αριθµητικής η µετατροπή πραγµατικών σε ακέραιους και αντίστροφα Στο τέλος του κεφαλαίου θα δούµε κάποια παραδείγµατα κωδίκων όπου εµφανίζονται σφάλµατα που οφείλονται τόσο στην αρχιτεκτονική του υπολογιστή όσο και στον προγραµµατισµό του. Εκεί επίσης θα µάθουµε πως να τα υπερβαίνουµε. γ) σφάλµατα κατά την εκτέλεση των πράξεων Υπάρχει µια κατηγορία σφαλµάτων που εµφανίζονται κατά την εκτέλεση των πράξεων στις αριθµητικές εκφράσεις. Αυτά τα σφάλµατα γενικά είναι προβλήµατα περιορισµού του πεδίου τιµών των αριθµών ή προβλήµατα ακρίβειας, π.χ. προβλήµατα που προκύπτουν από την πρόσθεση ενός πολύ µεγάλου και ενός πολύ µικρού αριθµού, την αφαίρεση σχεδόν ίσων αριθµών, όταν το αποτέλεµα µιας πράξης είναι µικρότερο ή µεγαλύτερο από το πεδίο αναπαράστασης του τύπου που χρησιµοποιούµε κλπ. Για να γίνουν όµως κατανοητά τα προβλήµατα που απορρέουν από την εκτέλεση των πράξεων, ας δούµε κατ' αρχήν τα ακόλουθα παραδείγµατα: Έστω ότι θέλουµε να λύσουµε την δευτεροβάθµια εξίσωση 10 30 x 2-5*10 30 x+4*10 30 =0 η οποία είναι ισοδύναµη της x 2-5x+4=0 και έχει τις ρίζες x 1 =1 και x 2 =4. Αν προσπαθήσουµε να υπολογίσουµε την διακρίνουσά της µε απλή ακρίβεια θα διαπιστώσουµε πως οι εκφράσεις β 2 και 4αγ είναι εκτός των ορίων του πεδίου τιµών των πραγµατικών απλής ακρίβειας οπότε προκύπτει λάθος. Μια λύση είναι να κανονικοποιήσουµε τους αριθµούς που θα διαχειριστούµε. Έτσι, αν στο παράδειγµά µας διαιρέσουµε όλους τους όρους της εξίσωσης µε το 1030 όλα θα δουλέψουν κανονικά. Ωστόσο κάποιες άλλες περιπτώσεις µπορεί να µην επιδέχονται τόσο απλή αντιµετώπιση. Για παράδειγµα, η εξίσωση 10-20 x 2-10 20 x+10 20 =0 µηδενικά που υπάρχουν στην αρχή του αριθµού. Έτσι, ο αριθµός 1.2345 έχει 4 δεκαδικά και 5 σηµαντικά ψηφία ενώ ο 0.0001 έχει πάλι 4 δεκαδικά αλλά µόνο ένα σηµαντικό ψηφίο. 7
η οποία έχει µια λύση το 1 και µια λύση κοντά στο 10 40. Αν προσπαθήσουµε να εφαρµόσουµε την διακρίνουσα και σ' αυτήν την περίπτωση, πάλι ο όρος β 2 είναι εκτός του πεδίου τιµών των πραγµατικών απλής ακρίβειας. Αν πάλι διαιρέσουµε όλους τους όρους της εξίσωσης µε το 10 20 θα πάρουµε την 10-40 x 2 -x+1=0 και επειδή οι αριθµοί απλής ακρίβειας δεν µπορούν να είναι µικρότεροι από 10-38, ο υπολογιστής αγνοεί τον πρώτο όρο µετασχηµατίζοντάς την εξίσωση στην: -x+1=0 και συνεπώς βρίσκει µόνο την µια λύση. Αυτό µπορεί να ξεπεραστεί αλλάζοντας µε την τον αλγόριθµο, όπως θα δούµε στη συνέχεια. Συµπέρασµα: Είναι απαραίτητο να αποφεύγουµε να έχουµε στις ίδιες εκφράσεις αριθµούς που διαφέρουν κατά πολλές τάξεις µεγέθους. Ας δούµε, τέλος, και µια πιο ακραία περίπτωση. Έστω ότι θέλουµε να λύσουµε την εξίσωση x 2-10 5 x+1=0 η οποία έχει ρίζες κοντά στο 10 5 και 10-5. Αν εφαρµόσουµε τον τύπο της διακρίνουσας, έχουµε την έκφραση x= 5 10 10 ± 10 4 και επειδή το 10 10 είναι πολύ µεγαλύτερο του 4, η υπόρριζος ποσότητα είναι 10 10 και έτσι έχουµε τελικά: 5 5 10 ± 10 x= 2 δηλ. x 1 =10 5 που είναι σωστό και x 2 =0 που είναι απολύτως λάθος! Συµπέρασµα: Ο καλύτερος τρόπος για να αποφύγουµε τα προβλήµατα που µπορεί να προκύψουν από την ακρίβεια των αριθµών είναι να χρησιµοποιούµε αριθµητική διπλής ακρίβειας. Με την αριθµητική διπλής ακρίβειας κερδίζουµε σε εύρος πεδίου τιµών εξασφαλίζοντας ταυτόχρονα και περισσότερα σηµαντικά ψηφία. Από την άλλη µεριά, το κόστος της αριθµητικής διπλής ακρίβειας είναι η δέσµευση περισσότερης µνήµης και η παραγωγή κώδικα που εκτελείται πιο αργά. Παρόλα αυτά ούτε η διπλή ακρίβεια είναι πανάκεια: το πρόβληµα που προέκυψε στο τελευταίο παράδειγµα µε την εξίσωση x 2-10 5 x+1=0 δεν θα µπορούσε να ξεπεραστεί µ' αυτόν τον τρόπο. Σε αυτές τις περιπτώσεις, αυτό που έχουµε να κάνουµε είναι να σχεδιάσουµε έναν 'εξυπνότερο' αλγόριθµο. Πως γίνεται αυτό στην περίπτωση που εξετάζουµε εδώ; Παρατηρούµε ότι η σωστή ρίζα προκύπτει από την πρόσθεση του 10 5 µε το 10-5 ενώ η αφαίρεσή τους οδηγεί σε τελείως άσχετο αποτέλεσµα. Αυτό λοιπόν που έχουµε να κάνουµε είναι να υπολογίσουµε την δεύτερη ρίζα µε άλλο τρόπο. Πράγµατι, γνωρίζουµε από τα στοιχειώδη µαθηµατικά ότι: 2 8
x1x2 γ = α και έτσι µπορούµε να υπολογίσουµε µε ασφάλεια την δεύτερη ρίζα. δ) διάδοση των σφαλµάτων Μια ακόµα σηµαντική παράµετρος για τον επιτυχή αριθµητικό υπολογισµό µιας ποσότητας είναι ο έλεγχος και τελικά ο περιορισµός της µετάδοσης των σφαλµάτων που εγγενώς έχουν οι περισσότερες αριθµητικές ποσότητες εξαιτίας της εκτέλεσης πράξεων µε αυτές. Όπως είναι λογικό, κάθε αριθµητική πράξη που τελείται σε αριθµούς που εµπεριέχουν σφάλµα, τελείται και στο σφάλµα τους. Για παράδειγµα, το σφάλµα του γινοµένου α β, όπου ο α έχει σχετικό σφάλµα κ και ο β έχει λ, είναι περίπου κ λ. Είναι λοιπόν αναγκαίο να ελέγξουµε την σειρά των πράξεων, ούτως ώστε να ελαχιστοποιηθεί το µεταδιδόµενο σφάλµα. Αυτό φαίνεται στο ακόλουθο παράδειγµα: Έστω οι εκφράσεις 4xy και (x+x+x+x)y µε x=0.568 και y=0.502. Και οι δυο εκφράσεις ισούνται µε 1.140554, ποσότητα η οποία στρογγυλοποιείται σε 1.14 για αριθµητική ακρίβειας τριών σηµαντικών ψηφίων. Αν τώρα προσπαθήσουµε να επαληθεύσουµε αυτό το αποτέλεσµα µε τον (υποθετικό) υπολογιστή µας ακρίβειας τριών σηµαντικών ψηφίων, θα διαπιστώσουµε ότι οι δυο εκφράσεις δεν είναι ίσες! Πράγµατι, έχουµε: 4xy : 4.00 x 0.568 = 2.27 x 0.502 = 1.13 (x+x+x+x)y : 0.568 + 0.568 = 1.13 + 0.568 = 1.69 + 0.568 = 2.25 x 0.502 = 1.12 Εδώ βλέπουµε ότι η έκφραση µε τις περισσότερες πράξεις εµφάνισε και το µεγαλύτερο σφάλµα. Η διαδικασία αυτή µπορεί να οδηγήσει και σε παραβίαση των βασικών κανόνων της άλγεβρας. Ας δούµε ένα τέτοιο παράδειγµα: Έστω οι αριθµοί α=0.0256, β=0.0224, γ=0.939 και δ=0.879 και έστω ότι ζητάµε την έκφραση α-β+γ+δ η οποία εύκολα βλέπουµε ότι ισούται µε 1.8212 το οποίο στρογγυλοποιείται σε 1.82 για αριθµητική ακρίβειας τριών σηµαντικών ψηφίων. Αν προσπαθήσουµε να επαληθεύσουµε το αποτέλεσµα, βρισκόµαστε αντιµέτωποι µε την ακόλουθη κατάσταση: (α-β)+(γ+δ)=(0.0256-0.0224)+(0.939+0.879) =0.0032+1.81=1.81 (γ-β)+(α+δ)=(0.939-0.0224) +(0.0256+0.879)=0.917+0.904=1.82 όπου διαπιστώνουµε ότι το αποτέλεσµα εξαρτάται από την σειρά των πράξεων! Προφανώς όλα τα παραπάνω προβλήµατα εµφανίζονται σπανιότερα όσο αυξάνεται ο αριθµός των σηµαντικών ψηφίων. Ωστόσο, ούτε στην περίπτωση των 15 σηµαντικών ψηφίων των πραγµατικών διπλής ακρίβειας, ούτε πολύ περισσότερο στην περίπτωση των 7 σηµαντικών ψηφίων των πραγµατικών απλής ακρίβειας είναι απίθανο να συµβούν. Όλα εξαρτώνται από τον αριθµό των ψηφίων που είναι σηµαντικά στο µαθηµατικό ή φυσικό πρόβληµα που αντιµετωπίζουµε. Γενικά, πρέπει να δίνεται πάρα πολύ µεγάλη προσοχή στις πράξεις και στην 9
σειρά µε την οποία γίνονται, διαφορετικά κινδυνεύουµε να δηµιουργήσουµε έναν κατά τα άλλα εξαιρετικό, αλλά πλήρως αναξιόπιστο κώδικα. ξανά η αριθµητική παραγώγιση Μιλήσαµε ήδη για την αριθµητική παραγώγιση µε προς τα εµπρός διαφορές στην 12.2. Είδαµε ότι σε γενικές γραµµές, η παραγωγή της έκφρασης, για την πρώτη παράγωγο µιας συνάρτησης, προκύπτει από την ανάπτυξη της συνάρτησης σε σειρά Taylor µε ταυτόχρονη απαλοιφή των µη σηµαντικών όρων αυτής της σειράς. Γενικά, για οποιαδήποτε συνεχή συνάρτηση f(x) ισχύει: 2 n h h n f ( x) = f ( x0) + hf ( x0) + f ( x0) +... + f ( x0) 2! n! όπου h=x-x 0. Αντικαθιστώντας τα x, x 0 µε τα x i+1, x i αντιστοίχως, παίρνουµε την έκφραση: 2 n h h n f ( xi+ 1) = f ( xi ) + hf ( xi ) + f ( xi ) +... + f ( xi ) 2! n! και µε απαλοιφή των όρων τάξης µεγαλύτερης του h παίρνουµε την έκφραση για τις προς τα εµπρός διαφορές που ήδη είδαµε στην 12.2. Βλέπουµε όµως ότι η έκφραση Taylor µας αφήνει και άλλα περιθώρια αντικαταστάσεων, τα οποία δηµιουργούν τις προς-τα-πίσω και τις κεντρικές διαφορές. α) οι προς τα πίσω διαφορές Αντικαθιστώντας τα x, x 0 µε τα x i, x i-1 αντιστοίχως αντί για x i+1, x i όπως πριν, παίρνουµε την έκφραση 2 n h h n f ( xi ) = f ( xi 1) + hf ( xi 1) + f ( xi 1) +... + f ( xi 1) 2! n! και απαλείφοντας εκ νέου τους όρους h 2, h 3,..., h n,... έχουµε: f ( xi ) f ( xi 1) f ( x) = h Η παραπάνω έκφραση ονοµάζεται προς τα πίσω διαφορά (backward difference) και διαφέρει από την προς-τα εµπρός διαφορά στο ότι χρησιµοποιεί στον υπολογισµό το προηγούµενο αντί του εποµένου σηµείο από αυτό στο οποίο ζητάµε την παράγωγο. β) οι κεντρικές διαφορές Αν προσθέσουµε κατά µέλη τις εκφράσεις για τις προς τα εµπρός και προς τα πίσω διαφορές θα έχουµε: f ( x ) = i f ( xi+ 1) f ( xi 1) 2h 10
Η παραπάνω έκφραση ονοµάζεται κεντρική διαφορά (central difference) και χρησιµοποιεί ταυτόχρονα το προηγούµενο και το επόµενη σηµείο από αυτό στο οποίο ζητάµε την παράγωγο, αλλά όχι το ίδιο. Αρκετά επεξηγηµατικό είναι το επόµενο σχήµα: προς-τα-πίσω διαφορά προς-τα-εµπρός διαφορά X i-1 X i X i+1 κεντρική διαφορά δ) σύγκριση των διαφορών Ο κώδικας για τις προς-τα-εµπρός διαφορές που ήδη παρουσιάσαµε είναι µεν επαρκής για την εισαγωγή στις έννοιες της διακριτοποίησης και της διαµέρισης, αλλά δεν είναι επαρκής για να χρησιµοποιηθεί σε πραγµατικά προβλήµατα. Έτσι, παρουσιάζουµε στην συνέχεια έναν πιο πολύπλοκο αλλά και πιο 'καλοφτιαγµένο' κώδικα που µπορεί να υπολογίζει την πρώτη παράγωγο µιας οποασδήποτε συνάρτησης σε ένα οποιοδήποτε κλειστό διάστηµα-υποσύνολο του πεδίου ορισµού της. PROGRAM Differences!!αντικείµενο! Το πρόγραµµα υπολογίζει την f'(x) στο δι! [a,b] και µε τους τρεις τύπους διαφορών! IMPLICIT NONE INTERFACE SUBROUTINE diff(y,h,m,df) REAL,INTENT(IN)::y(:),h CHARACTER(1),INTENT(IN)::m REAL,INTENT(OUT)::df(:) END SUBROUTINE diff END INTERFACE REAL:: L_e=1., R_e=5.,& h!τα άκρα του διαστήµατος [a,b]!το βήµα της διαµέρισης REAL,ALLOCATABLE,DIMENSION(:)::x,y,df!x = πινακοποιηµένα x!y = πινακοποιηµένα f(x)!df = πινακοποιηµένα f'(x) INTEGER::status,k,N=100 ALLOCATE(x(N),Y(N),df(N),STAT=status)!εδώ ελέγχουµε αν υπάρχει αρκετή διαθέσιµη µνήµη IF(status/=0) STOP 'NOT ENOUGH MEMORY' H=ABS(R_e-L_e)/N DO k=1,n X(k)=L_e+k*H!εδώ δίνουµε τιµές στα X και Y!µέσω της συνάρτησης F(X) 11
Y(k)=F(X(k))!Θα µπορούσαµε να δώσουµε αυτές τις τιµές!διαβάζοντας ένα αρχείο ή και µε άλλον τρόπο open (unit=1,file='df.dat') CALL diff(y,h,'',df)!κεντρικές διαφορές DO k=1,n WRITE(1,*)X(k),Y(k),df(k),F_TONOS(x(k)) DEALLOCATE(X,Y,DF) CLOSE(1) CONTAINS!η συνάρτηση REAL FUNCTION F(A) RESULT(B) REAL, INTENT(IN) ::A B=EXP(-A)! B=SIN(X)/X! B=X**2+3.*X-1 END FUNCTION F REAL FUNCTION F_TONOS(A) RESULT(B) REAL, INTENT(IN) ::A B=-EXP(A)! B=(A*COS(X)-SIN(X))/(X**2)! B=2.*X+3. END FUNCTION F_TONOS END PROGRAM Differences SUBROUTINE diff(y,h,m,df)!αντικείµενο:! Η υπορρουτίνα αυτή υπολογίζει την πρώτη παράγωγο µιας! συνάρτησης και µε τους τρεις τύπους διαφορών.! Για να λειτουργήσει προϋποθέτει! α)την ύπαρξη πινακοποιηµένων τιµών Yi=f(xi)! β)οι πινακοποιηµένες αυτές τιµές να ισαπέχουν!! Η αλφαριθµητική µεταβλητή m είναι το κριτήριο για! το ποιό τύπο διαφορών θα χρησιµοποιήσει η υπορρουτίνα. REAL,INTENT(IN)::y(:),h CHARACTER(1),INTENT(IN)::m REAL,INTENT(OUT)::df(:) INTEGER:: i SELECT CASE (m) CASE ('f','f') DO i=1,size(y)-1 df(i)=(y(i+1)-y(i))/h CASE ('b','b') DO i=2,size(y) df(i)=(y(i)-y(i-1))/h CASE DEFAULT 12
END SUBROUTINE diff DO i=2,size(y)-1 df(i)=(y(i+1)-y(i-1))/(2.*h) END SELECT Ο παραπάνω κώδικας χρησιµοποιεί κεντρικές διαφορές για να προσεγγίσει την πρώτη παράγωγο. Για να έχουµε προς-τα-εµπρός και προς-τα-πίσω διαφορές θα πρέπει να τροποποιήσουµε την κλήση της υπορρουτίνας ως εξής: και CALL diff(y,h,'f',df)!προς-τα-εµπρός διαφορές CALL diff(y,h,' b ',df)!προς-τα-πίσω διαφορές αντίστοιχα. Στον παραπάνω κώδικα, αξίζει να σχολιάσουµε το γεγονός της πινακοποίησης των ζευγών (x i,f(x i )). Έτσι, ο κώδικάς µας µπορεί να είναι χρήσιµος και στην περίπτωση όπου έχουµε να παραγωγίσουµε πινακοποιηµένες τιµές (π.χ. τα αποτελέσµατα κάποιο πειράµατος). Προσοχή χρειάζεται στο ότι τα δεδοµένα θα πρέπει να ισαπέχουν. Στην περίπτωση που δεν έχουµε τα δεδοµένα µας σε τέτοια µορφή, θα πρέπει να τα µετατρέψουµε χρησιµοποιώντας κάποια από της µεθόδους παρεµβολής που θα δούµε στην συνέχεια. Με την χρήση του παραπάνω κώδικα, µας δίνεται η ευκαιρία να συγκρίνουµε τους τρεις τύπους διαφορών για τρείς ουσιωδώς διαφορετικές µεταξύ τους συναρτήσεις, µιαν εκθετική (f(x)=e -x ), µια τριγωνοµετρική (f(x)=sinx/x) και µια πολυωνυµική (f(x)=x 2 +3x-1). Τα αποτελέσµατα φαίνονται στα επόµενα σχήµατα: f(x) και f'(x) 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0,0-0,1-0,2-0,3 f(x)=e -x Αναλυτική f'(x)=-e -x f'(x) µε προς-τα-πίσω διαφορές f'(x) µε προς-τα-εµπρός διαφορές f'(x) µε κεντρικές διαφορές -0,4 1 2 3 4 5 x Σχετικό σφάλµα (%) 1 0,1 0,01 1E-3 1E-4 1E-5 f(x)=e -x σχετικό σφάλµα προς-τα-πίσω διαφορών σχετικό σφάλµα προς-τα-εµπρός διαφορών σχετικό σφάλµα κεντρικών διαφορών 1E-6 1 2 3 4 5 X 13
f(x) και f'(x) 1,5 1,0 0,5 0,0 f(x)=sin(x)/x Αναλυτική f'(x)=xcos(x)-sinx / x 2 f'(x) µε κεντρικές διαφορές f'(x) µε προς-τα-εµπρός διαφορές f'(x) µε προς-τα-πίσω διαφορές -0,5 1 2 3 4 5 X Σχετικό σφάλµα (%) 1 0,1 0,01 1E-3 1E-4 1E-5 1E-6 1E-7 f(x)=sin(x)/x σχετικό σφάλµα προς-τα-πίσω διαφορών σχετικό σφάλµα προς-τα-εµπρός διαφορών σχετικό σφάλµα κεντρικών διαφορών 1 2 3 4 5 X 60 10 f(x) και f'(x) 50 40 30 20 f(x)=x 2 +3x-1 Αναλυτική f'(x)=2x+3 f'(x) µε κεντρικές διαφορές f'(x) µε προς-τα-εµπρός διαφορές f'(x) µε προς-τα-πίσω διαφορές Σχετικό σφάλµα (%) 1 0,1 0,01 f(x)=x 2 +3x-1 σχετικό σφάλµα προς-τα-πίσω διαφορών σχετικό σφάλµα προς-τα-εµπρός διαφορών σχετικό σφάλµα κεντρικών διαφορών 10 1E-3 0 1 2 3 4 5 X 1E-4 1 2 3 4 5 X Συγκρίνοντας τις τρεις διαφορετικές προσεγγίσεις για την πρώτη παράγωγο, µπορούµε να συµπεράνουµε τα ακόλουθα: Οι κεντρικές διαφορές είναι οι πλέον ακριβείς από όλες τις µορφές διαφορών, ακόµη και για αρκετά µεγάλο βήµα h. Οι προς-τα-µπρος διαφορές δεν παρουσιάζουν ουσιαστικές διαφορές από τις προς-τα-πίσω διαφορές, σε σχέση µε τον προσδιορισµό πρώτων παραγώγων. Όλες οι διαφορές προσεγγίζουν µε εξαιρετική ακρίβεια την αναλυτική παράγωγο. Είναι σηµαντικό ότι το µέγιστο σχετικό σφάλµα και στα τρία παραδείγµατά µας είναι < 5% και στις περισσότερες περιπτώσεις είναι < 1% Το πρώτο από τα παραπάνω συµπεράσµατα αποσαφηνίζεται ακόµη περισσότερο στο επόµενο γράφηµα όπου παρουσιάζεται συγκριτικά και για τους τρεις τύπους διαφορών το σχετικό σφάλµα που έχει η προσέγγιση της πρώτης παραγώγου της συνάρτησης f(x)= ln (e sinx + 1000 - sine x ) στο σηµείο x i = 0.12345. 14
10 Σχετικό % σφάλµα για την f(x) 1 0.1 0.01 1E-3 1E-4 1E-5 Forward Differences Backward Differences Central Differences 10 100 1000 Πλήθος σηµείων Ν Πέραν αυτών, αξίσει να σηµειώσουµε πως οι κεντρικές διαφορές παράγουν τις οι πλέον ευσταθείς 4 λύσεις όταν χρησιµοποιηθούν για να περιγράψουν την πρώτη και την δεύτερη παράγωγο σε ένα φυσικό πρόβληµα. Η ευστάθεια ή όχι µιας λύσης αναφέρεται στην επίλυση εξισώσεων µε επαναληπτικές µεθόδους και αφορά την εύρεση της ίδιας πάντοτε λύσης ανεξάρτητα από τις αρχικές τιµές που χρησιµοποιούµε για να ξεκινήσει η όποια επαναληπτική διαδικασία. Όλα τα προηγούµενα είναι έννοιες στις οποίες θα αναφερθούµε διεξοδικά στο επόµενο κεφάλαιο. παρεµβολή και παρέκταση Υπάρχουν πολλές περιπτώσεις που το πλήθος των µετρήσεων που έχουµε για κάποιο φυσικό µέγεθος δεν µας επαρκεί για να το επεξεργαστούµε στον βαθµό που θέλουµε. Για παράδειγµα, οι απογραφές του πληθυσµού της Ελλάδας, ο οποίος µετριέται κάθε 10 χρόνια, φαίνονται στον επόµενο πίνακα για τα έτη από το 1940 ως το 1990: ΠΙΝΑΚΑΣ 12-1 ο πληθυσµός της Ελλάδας 5 Έτος 1940 1951 1961 1971 1981 1991 Πληθυσµός (σε χιλ.) 7.345 7.633 8.389 8.769 9.740 10.260 Κατά την επεξεργασία τέτοιων πινακοποιηµένων (tabulated) δεδοµένων µπορούν να υπάρξουν ερωτήµατα της µορφής: «Πόσος ήταν ο πληθυσµός το 1964;» ή «Πόσος θα είναι ο πληθυσµός το 2010;» δηλ. ερωτήµατα που αφορούν τιµές που δεν βρίσκονται στον πίνακα. Για να απαντηθούν τέτοιου είδους προβλέψεις είναι απαραίτητο να υπάρξει κάποια συνάρτηση που να περιγράφει µε επαρκή ακρίβεια τα δεδοµένα. Ο προσδιορισµός µιας τέτοιας συνάρτησης ονοµάζεται παρεµβολή (interpolation) όταν αναφερόµαστε σε σηµεία µεταξύ των πινακοποιηµένων τιµών και παρέκταση (extrapolation) όταν τα ζητούµενα σηµεία είναι εκτός των ορίων των τιµών του πίνακα. Έτσι, η απάντηση στο πρώτο ερώτηµα θα βρεθεί µε παρεµβολή ενώ στο δεύτερο µε παρέκταση. Η µεθοδολογία, οι µαθηµατικές εκφράσεις και οι αλγόριθµοι που ισχύουν για την παρεµβολή, ισχύουν και για την παρέκταση και αντιστρόφως. Το πρόβληµα είναι το ίδιο είτε ζητάµε απλώς να παρεµβάλουµε µερικά σηµεία είτε αναζητάµε την έκφραση της καµπύλης που διέρχεται µε τον καλύτερο τρόπο (δηλ. µε την ελάχιστη απόκλιση) από όλα τα σηµεία που έχουµε. Όπως θα δούµε στην συνέχεια, προϋπόθεση για τον προσδιορισµό ενός παρεµβαλλόµενου σηµείου είναι η ύπαρξη µιας τέτοιας υποθετικής καµπύλης (συνήθως πολυωνύµου). 4 ες για παράδειγµα το βιβλίο των Dahlquist, G. & A. Bjorck Numerical Methods, Prentice-Hall, Englewwod Cliffs, NJ, 1974. 5 Επίσηµα στοιχεία της ΕΣΥΕ δηµοσιευµένα στην εφηµερίδα 'Καθηµερινή', (1996) 15
Οι πιο κοινές µέθοδοι αριθµητικής παρεµβολής / παρέκτασης είναι η παρεµβολή Taylor και η παρεµβολή Lagrange, οι οποίες παρουσιάζονται αναλυτικά στις επόµενες παραγράφους. Φυσικά, υπάρχουν και άλλες, πιο ειδικές, µέθοδοι αριθµητικής παρεµβολής / παρέκτασης όπως οι cubic και bicubic splines κλπ. 6, οι οποίες δεν είναι γενικής χρήσης αλλά χρησιµοποιούνται σε ειδικότερες περιπτώσεις όπου απαιτείται η µέγιστη δυνατή ακρίβεια προσέγγισης ενώ τα δεδοµένα ταιριάζουν συνήθως σε κάποιας ειδικής µορφής καµπύλη. α) παρεµβολή Taylor Η πιο διαδεδοµένη οικογένεια συναρτήσεων που χρησιµοποιείται για να προσεγγιστούν πινακοποιηµένες τιµές, είναι τα πολυώνυµα. Τα πλεονεκτήµατα των πολυωνύµων είναι ότι οι τιµές τους υπολογίζονται εύκολα, ότι προστίθενται, πολλαπλασιάζονται, παραγωγίζονται και ολοκληρώνονται εξίσου εύκολα και ακόµη, αν α είναι µια πραγµατική σταθερά και p(x) ένα πολυώνυµο, τότε και τα p(αx), p(x+α) είναι πολυώνυµα. Όπως αποδεικνύεται από το θεώρηµα Weierstrass 7, για οποιαδήποτε συνάρτηση f(x) υπάρχει κάποιο πολυώνυµο βαθµού n το οποίο βρίσκεται όσο «κοντά» στην συνάρτηση θέλουµε. Έστω ότι έχουµε n+1 τιµές f(x i ), i=0,,n σε n+1 σηµεία x i. Από αυτές τις τιµές µπορεί να περάσει ένα πολυώνυµο Taylor βαθµού n, της µορφής: P ( x) = a + a x+ a x + a x +... + a x n 2 3 0 1 2 3 n n Έτσι, το µόνο που χρειάζεται να υπολογίσουµε είναι οι n+1 συντελεστές a 0, a 1,, a n οι οποίοι προκύπτουν από την επίλυση του γραµµικού συστήµατος: f ( x ) = P( x ), i= 1,2,..., n j= 0,1,..., n j i i Έτσι παράγεται ένα (n+1) x (n+1) γραµµικό σύστηµα αλγεβρικών εξισώσεων, το οποίο µπορεί να λυθεί µε κάποια από τις µεθόδους που θα παρουσιαστούν στο επόµενο κεφάλαιο ή και αναλυτικά. Το ερώτηµα που προκύπτει εδώ αφορά τον βέλτιστο βαθµό του πολυωνύµου. Συγκεκριµένα, τι βαθµού πολυώνυµο πρέπει να χρησιµοποιήσουµε για να προσεγγίσουµε µε τον καλύτερο τρόπο m-το-πλήθος σηµεία; Είναι προφανές πως ο µέγιστος βαθµός είναι m-1 καθώς για µεγαλύτερο από αυτόν το σύστηµα που περιγράψαµε πριν θα είναι πάντοτε αόριστο, αφού θα έχει περισσότερους αγνώστους από εξισώσεις. Από εκεί και πέρα, µπορούµε να πάρουµε και πολυώνυµα µικρότερου βαθµού (έως και πρώτου, οπότε έχουµε την γνωστή µας γραµµική παρεµβολή), φροντίζοντας όµως έτσι ώστε το σύστηµα να είναι συµβατό µε όλα τα υποσυστήµατά του µέχρι τον βαθµό που επιλέξαµε. Για παράδειγµα, αν έχουµε 3 σηµεία, µπορούµε να παράξουµε ένα δευτεροβάθµιο πολυώνυµο αλλά και µια ευθεία που να διέρχεται αρκετά 'κοντά' από τα 3 σηµεία µας. Πρέπει όµως οι συντελεστές τις ευθείας να ικανοποιούν και τα τρία 2x2 υποσυστήµατα που εµπεριέχονται στο αρχικό 3x3 σύστηµα. 6 7 Περισσότερα για την θεωρία interpolation / extrapolation θα βρεις στο άρθρο Numerical treatment of ordinary differential equations by extrapolation methods', Burlisch, R. and J.Stoer, Numerische Mathematik, 8,1-13 (1966). ες για παράδειγµα τα βιβλία του Α. Ralston A first course in numerical analysis, McGraw-Hill, New York, 1965 και του Β. Wendroff ' Τheoretical numerical analysis', Academic Press, New York, 1966. 16
Ο αλγόριθµος για την παρεµβολή Taylor είναι ο ακόλουθος : ιάβασε τα ƒ j (x i ) και το σηµείο x m στο οποίο ψάχνεις την τιµή Λύσε το σύστηµα ƒ j (x i )=P(x i ) και βρες τα α 0, α 1,., α n Υπολόγισε την ποσότητα Μ=α 0 +α 1 x m +α 1 x m 2 +..+α n x m n Ο κώδικας fortran που τον υλοποιεί είναι ο ακόλουθος: ΠΑΡΑ ΕΙΓΜΑ 12-1. PROGRAM Taylor!αντικείµενο:! Το πρόγραµµα διαβάζει τα ζεύγη τιµών που υπάρχουν και! υπολογίζει την τιµή µιας άγνωστης συνάρτησης σε! oποιοδήποτε σηµείο ζητήσει ο χρήστης µε χρήση της µεθόδου! του Taylor.! IMPLICIT NONE! δηλώσεις: REAL,ALLOCATABLE, DIMENSION(:) :: & A(:,:),&!οι συντελεστές του συστήµατος XX,YY, &!οι πινακοποιηµένες τιµές S!οι συντελεστές του πολυωνύµου REAL :: Tayl=0.,&!η τιµή που βρίσκει η Taylor point,&!στο σηµείο της παρεµβολής ATHRISMA=0. INTEGER:: status,i,j,n=6 ALLOCATE (XX(N),YY(N),A(N,N),S(N), STAT=status) IF (status/=0) STOP 'Not enough memory'! εκφράσεις: do_value:do i=1,n!ο χρήστης δίνει ζεύγη τιµών PRINT*,'give sets of X and Y' READ*, XX(i),YY(i) do_value PRINT*,'give the point' READ*,point!Ο χρήστης δίνει τo σηµείο!στο οποίο ζητείται η τιµή!αλγόριθµος Taylor FORALL (i=1:n,j=1:n) A(i,j)=XX(i)**(j-1)!Μπορούµε να χρησιµοποιήσουµε οποιαδήποτε!από τις µεθόδους επίλυσης συστηµάτων που!θα δούµε αναλυτικά στο επόµενο κεφάλαιο.!εδώ χρησιµοποιούµε µια Gauss CALL gauss (A,YY,S) DO i=1,n Tayl=Tayl+S(i)*point**(i-1) PRINT*, Tayl CONTAINS SUBROUTINE gauss(a,b,x) 17
REAL::A(:,:),B(:) REAL:: ATHRISMA,M(SIZE(B)) REAL,INTENT(OUT)::X(:) INTEGER, SAVE:: i,j,k DO i=1,size(b)-1 DO j=i+1,size(b) M(j)= -A(j,i)/A(i,i) DO k=1,size(b) A(j,k)=A(j,k)+M(j)*A(i,k) B(j)=B(j)+M(j)*B(i) DO i=size(b),1,-1 ATHRISMA=0.0d0 ATHRISMA=SUM(A(i,i:SIZE(B))*X(i:SIZE(B))) X(i)=(B(i)-ATHRISMA) /A(i,i) END SUBROUTINE gauss END PROGRAM Taylor Χρησιµοποιώντας τον παραπάνω κώδικα υπολογίζουµε τα f(2) και f(9) από τις τιµές f(1)=4, f(3)=16, f(5)=36, f(8)=81, f(11)=144 και f(15)=256 και βρίσκουµε f(2)=9 και f(9)=100. Παρατηρούµε ότι οι πινακοποιηµένες τιµές περιγράφουν την συνάρτηση g(x)=(x+1) 2 και πράγµατι g(2)=9 και g(9)=100, δηλ. η παρεµβολή Taylor είναι απολύτως ακριβής για πολυωνυµικές συναρτήσεις, όπως αναµέναµε. εν συµβαίνει όµως το ίδιο για πιο πολύπλοκες εκφράσεις, όπως φαίνεται στο επόµενο παράδειγµα όπου χρησιµοποιούµε τον παραπάνω κώδικα για να υπολογίσουµε το f(9) από τις τιµές f(1)=1, f(3)=0.11111, f(5)=0.04, f(8)=0.01563, f(11)=0.00826 και f(15)=0.00444 Πράγµατι, µε βάση την µέθοδο Taylor βρίσκουµε f(9)= -0.0125615 και καθώς παρατηρούµε ότι οι πινακοποιηµένες τιµές περιγράφουν την συνάρτηση g(x)=1/x 2, αγνωρίζουµε πως g(9)=0.01235, δηλ. η παρεµβολή Taylor παρήγαγε σφάλµα της τάξης του 200%!!! Αυτό οφείλεται στο µικρό πλήθος των πινακοποιηµένων τιµών. Πράγµατι, 6 τιµές είναι λίγες για να προσεγγιστεί µε ικανοποιητική ακρίβεια µια συνάρτηση τέτοιας µορφής. Έτσι, για να έχουµε µεγαλύτερη ακρίβεια προσέγγισης, το µόνο που µπορούµε να κάνουµε είναι να f(x) 1,0 0,8 0,6 0,4 0,2 0,0 αρχικό σύνολο 6 σηµείων εκτεταµένο σύνολο 14 σηµείων παρεµβολή µε 6 σηµεία παρεµβολή µε 14 σηµεία 0 2 4 6 8 10 12 14 16 X αυξήσουµε το σύνολο των τιµών που έχουν πινακοποιηθεί, θέτοντας f(1) = 1, f(2) = 0.25, f(3) = 0.11111, f(4) = 0.0625, f(5) = 0.04, f(6) = 0.02778, f(7) = 0.02041, f(8) = 0.01563, f(10) = 0.01, f(11) = 0.00826, f(12) = 0.00694, f(13) = 0.00592, f(14) = 0.0051 και f(15) = 0.00444 (οι οποίες και πάλι αφορούν την ίδια συνάρτηση) και βρίσκουµε f(9)=0.011893496, δηλαδή το παραγόµενο σφάλµα είναι πολύ µικρότερο (περίπου 3.7%)!!! Τα αποτελέσµατα αυτά οπτικοποιούνται στο παρακείµενο διάγραµµα. Για όλους τους παραπάνω υπολογισµούς χρησιµοποιήσαµε τον κώδικα του παραδείγµατος 12.4 αλλάζοντας απλώς τις διαστάσεις των πινάκων. Βλέπουµε λοιπόν πως η ακρίβεια παρεµβολής που µπορεί να µας παρέχει η µέθοδος Taylor µπορεί να είναι από εξαιρετική εως µέτρια, ανάλογα την µορφή της 18
καµπύλης που ταιριάζει στα πινακοποιηµένα σηµεία και, βέβαια, ανάλογα µε το πλήθος αυτών των σηµείων. Γενικά, όσο πιό οµαλή είναι η καµπύλη των σηµείων και όσο πιο πολλά είναι αυτά, τόσο πιο ικανοποιητική παρεµβολή παρέχει η µέθοδος Taylor. β) παρεµβολή Lagrange Τα πολυώνυµα παρεµβολής Lagrange χρησιµοποιούνται συνηθέστερα αντί των «κλασσικών» πολυωνύµων Taylor της προηγούµενης παραγράφου, κυρίως επειδή το γραµµικό σύστηµα f j (x i ) = P(x i ), j=0,,n, i=1,2,...,n που αναφέραµε πριν, δεν είναι πάντα εύκολο να λυθεί. Η βασική διαφορά από την προηγούµενη µεθοδολογία εστιάζεται στην έκφραση που περιγράφει το πολυώνυµο, η οποία είναι: ( x x )( x x )...( x x ) P x = + 2 3 n n( ) f ( x1) ( x1 x2)( x1 x3)...( x1 xn) ( x x1)( x x3)...( x xn ) f ( x2) +... + ( x x )( x x )...( x x ) 2 1 2 3 2 ( x x1)( x x2)...( x xn 1) f ( xn ) ( x x )( x x )...( x x ) n 1 n 2 n n 1 n Ο αλγόριθµος που υλοποιεί την παρεµβολή Langrange αφορά κατά βάση τον υπολογισµό του πολυωνύµου P n (x) και δεν περιλαµβάνει επίλυση κανενός συστήµατος. Απλώς ο υπολογιστής µπορεί να µας βοηθήσει στον ταχύτερο υπολογισµό των όρων του πολυωνύµου. Ο κώδικας fortran που τον υλοποιεί είναι ο ακόλουθος: ΠΑΡΑ ΕΙΓΜΑ 12-2. PROGRAM Lagrange!αντικείµενο:! Το πρόγραµµα διαβάζει τα ζεύγη τιµών που υπάρχουν και! υπολογίζει την τιµή µιας άγνωστης συνάρτησης! σε οποιοδήποτε ζητήσει ο χρήστης µε χρήση! της µεθόδου του Lagrange.! IMPLICIT NONE! δηλώσεις: REAL,ALLOCATABLE,DIMENSION(:):: & YY,&!Οι τιµές που έχουµε XX!στα δηµεία XX(1) ως ΧΧ(4) REAL:: Lagr=0.,&!η τιµή που βρίσκει η Lagrange point!στο σηµείο της παρεµβολής XX(0) INTEGER:: status,i,j,n=6 ALLOCATE (XX(N),YY(N), STAT=status) IF (status/=0) STOP 'Not enough memory'! εκφράσεις: do_value:do i=1,n!ο χρήστης δίνει ζεύγη τιµών PRINT*,'give sets of X and Y' READ*,XX(i),YY(i) 19
do_value!µεταβλητές: PRINT*,'give the point' READ*,point!Ο χρήστης δίνει τo σηµείο!στο οποίο ζητείται η τιµή!αλγόριθµος Lagrange DO i=1,n Lagr =Lagr + prod(i,point,xx)*yy(i) PRINT*, Lagr CONTAINS REAL FUNCTION prod (i,point,xx)!η διαδικασία αυτή υπολογίζει τα γινόµενα!που εµφανίζονται στους συντελεστές!των f(xi)=yy(i) REAL::XX(:),point,res,xi INTEGER::i,j res=1 ;xi=xx(i) DO j=1,size(xx)-1 IF (j==i) THEN res=res ELSE res=res*(point-xx(j))/(xi-xx(j)) END IF PROD=res END FUNCTION prod END PROGRAM Lagrange Χρησιµοποιώντας τον παραπάνω κώδικα ξαναλύνουµε τα παραδείγµατα της προηγούµενης παραγράφου, χρησιµοποιώντας την παρεµβολή Lagrange αντί για την παρεµβολή Taylor. Για την πρώτη περίπτωση υπολογίζουµε τα f(2) και f(9) από τις τιµές f(1)=4, f(3)=16, f(5)=36, f(8)=81, f(11)=144 και f(15)=256 και βρίσκουµε f(2)=9 και f(9)=100 δηλ. η παρεµβολή Lagrange είναι απολύτως ακριβής για πολυωνυµικές προσεγγίσεις, όπως συµβαίνει µε την παρεµβολή Taylor. f(x) 1,0 0,8 0,6 0,4 0,2 0,0 αρχικό σύνολο 6 σηµείων εκτεταµένο σύνολο 14 σηµείων παρεµβολή µε 6 σηµεία παρεµβολή µε 14 σηµεία 0 2 4 6 8 10 12 14 16 X Για την δεύτερη περίπτωση υπολογίζουµε το f(9) από τις τιµές f(1)=1, f(3)=0.11111, f(5)=0.04, f(8)=0.01563, f(11)=0.00826 και f(15)=0.00444 και βρίσκουµε f(9)= - 0.0125651, δηλ. η παρεµβολή Lagrange είναι το ίδιο ανακριβής µε την παρεµβολή Taylor για πολύπλοκες συναρτήσεις και λίγα πινακοποιηµένα σηµεία. Για την τρίτη περίπτωση υπολογίζουµε πάλι το f(9) από τις τιµές f(1) = 1, f(2) = 0.25, f(3) = 0.11111, f(4) = 0.0625, f(5) = 0.04, f(6) = 0.02778, f(7) = 0.02041, f(8) = 0.01563, f(10) = 0.01, f(11) = 0.00826, f(12) = 0.00694, f(13) = 0.00592, f(14) = 0.0051 και f(15) = 0.00444 και βρίσκουµε f(9)=0.01227826, δηλαδή έχουµε ακρίβεια βελτιωµένη σε σχέση µε την Taylor (σφάλµα 0.6% αντί για 3.7%). Τα αποτελέσµατα 20
αυτά οπτικοποιούνται στο διάγραµµα της προηγούµενης σελίδας. Για όλους τους παραπάνω υπολογισµούς χρησιµοποιήσαµε τον κώδικα του παραδείγµατος 12.5 αλλάζοντας απλώς τις διαστάσεις των πινάκων. Βλέπουµε λοιπόν πως η ακρίβεια παρεµβολής που µπορεί να µας παρέχει η µέθοδος Lagrange είναι εφάµιλη αυτής της Taylor. Για να συγκρίνουµε µε περισσότερη ασφάλεια τις δυο µεθόδους, παραθέτουµε τα επόµενα διαγράµµατα, όπου παρουσιάζουµε την παρεµβολή που επτυγχάνουµε δεδοµένου ενός συνόλου 6 τιµών οι οποίες προσαρµόζονται σε συναρτήσεις εκθετικής και τριγωνοµετρικής µορφής αντίστοιχα. Τιµές για την f(x)=e -x 0,40 0,35 0,30 0,25 0,20 0,15 0,10 0,05 0,00 πινακοποιηµένες τιµές αναλυτικά παρεµβαλλόµενες τιµές παρεµβολή Taylor παρεµβολή Lagrange σφάλµα Taylor σφάλµα Lagrange 10 8 10 7 10 6 10 5 10 4 10 3 10 2 10 1 Σφάλµα (%) Τιµές για την f(x)=cos(x)/x 0,6 0,4 0,2 0,0-0,2 πινακοποιηµένες τιµές αναλυτικά παρεµβαλλόµενες τιµές παρεµβολή Taylor παρεµβολή Lagrange σφάλµα Taylor σφάλµα Lagrange 10 4 10 3 10 2 Σφάλµα (%) -0,05 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 10 0-0,4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 10 1 x x Όπως φαίνεται και στα διαγράµµατα, οι δυο µέθοδοι έχουν πολύ κοινή συµπεριφορά και παρόµοια ακρίβεια. Έτσι, η επιλογή της µιας ή της άλλης για την επίλυση ενός προβλήµατος, αναγκαγκαστικά θα πρέπει να γίνει µε βάση λόγους διαφορετικούς της αποτελεσµατικότητας και της ακρίβειας. Συµπερασµατικά λοιπόν Και οι δυό µέθοδοι παρεµβολής είναι παρόµοιας ακρίβειας. Η παρεµβολή Lagrange πλεονεκτεί αυτής του Taylor στην ακρίβεια της προσέγγισης σε κάποιες ιδιαίτερες περιπτώσεις (δες προηγούµενα παραδείγµατα). Η παρεµβολή Lagrange πλεονεκτεί ως προς τον υπολογιστικό χρόνο που απαιτεί, ο οποίος είναι σηµαντικά µικρότερος αυτού που απαιτεί η Taylor µιας και δεν επιλύεται κανένα σύστηµα. Η εφαρµογή της παρεµβολής Lagrange προϋποθέτει αρκετή 'χειρωνακτική' δουλειά, µιας και πρέπει να γίνουν αρκετές πράξεις ώστε να προσδιοριστούν οι συντελεστές του x στο κάθε πολυώνυµο Lagrange 12.6 αριθµητική ολοκλήρωση Η αριθµητική ολοκλήρωση είναι µια από τις συνηθέστερα χρησιµοποιούµενες αριθµητικές διαδικασίες, καθώς σε πολλά επιστηµονικά προβλήµατα τα δεδοµένα είναι διακριτές εργαστηριακές µετρήσεις των οποίων οι αναλυτικές µαθηµατικές συναρτήσεις είναι άγνωστες. Πέραν αυτού, είναι ένα εξαιρετικά χρήσιµο εργαλείο στις περιπτώσεις όπου το αόριστο (και, κατ' επέκταση και το ορισµένο) ολοκλήρωµα µιας συνάρτησης υπάρχει αλλά δεν µπορεί να εκφραστεί µε ένα πεπερασµένο πλήθος στοιχειωδών συναρτήσεων (π.χ. το 2 exp(- x ) dx ). Η βασική ιδέα της αριθµητικής 21
ολοκλήρωσης είναι η αντικατάσταση του ολοκληρώµατος µιας συνάρτησης, f ( x) dx, από ένα πεπερασµένο άθροισµα, a f i ( x i), όπως φαίνεται στο παρακάτω σχήµα: i f( x i-1 ) f( xi ) f( xi+1 ) f( x ) E i = h f (x i ) E i+1= h f(x i+1 ) h h X 0 = 0 X 1 X i-1 X i X i+1 X N-1 X N = 1 Σύµφωνα µε το προηγούµενο σχήµα, το f ( x ) dx = E = h f ( x ) i i i i δηλ. το ολοκλήρωµα (που είναι ένα εµβαδόν) προσεγγίζεται από το άθροισµα των εµβαδών Ε i των στοιχειωδών παραλληλογράµµων σταθερής βάσης h και ύψους f(x i ) σε κάθε σηµείο x i. Εννοείται και πάλι ότι όσο πιο λεπτή είναι η διαµέριση, δηλ. όσο πιο µικρό είναι το h, τόσο πιο κοντά στο πραγµατικό εµβαδόν βρίσκεται το άθροισµα των στοιχειωδών εµβαδών. Οι πιο κοινές µέθοδοι αριθµητικής ολοκλήρωσης είναι η µέθοδος του τραπεζίου και η µέθοδος Simpson, οι οποίες παρουσιάζονται παρακάτω. Υπάρχουν και άλλες, πιο ειδικές, µέθοδοι όπως η µέθοδος Romberg, η µέθοδος MONTE CARLO 8, η µέθοδος 3h/8 και άλλες 9, οι οποίες χρησιµοποιούνται όταν υπάρχει συγκεκριµένη ανάγκη. α) µέθοδος του τραπεζίου Έστω η συνεχής και ολοκληρώσιµη συνάρτηση f:[x 0,x n ] R της οποίας ζητάµε το ολοκλήρωµα: x n x 0 f ( x ) d x και έστω ότι η συνάρτηση έχει την µορφή του σχήµατος: 8 9 ες κεφάλαιο 11. Περισσότερα για την θεωρία της αριθµητικής ολοκλήρωσης θα βρείτε π.χ στο βιβλίο των Davis, P.J. & P. Rabinowitz Methods of numerical integration, Academic Press, New York, 1975. 22
f(x) D C f(x) A B x 0 x n Όπως φαίνεται το ζητούµενο ολοκλήρωµα µπορεί να προσεγγιστεί από το εµβαδόν του τραπεζίου ABCD το οποίο είναι ½(BC+AD)AB, οπότε τελικά: x n x 0 h f ( x) dx= ( f ( xn) + f ( x0)) 2 όπου h=x n -x 0. Όµως, γενικά οι συναρτήσεις είναι πολύ πιο πολύπλοκες στην πραγµατικότητα από αυτήν που φαίνεται στο σχήµα. Η χρήση ενός τραπεζίου για τον υπολογισµό του ολοκληρώµατος θα οδηγούσε προφανώς σε τεράστιο σφάλµα. Αυτό λοιπόν που κάνουµε είναι να χωρίζουµε την περιοχή ολοκλήρωσης σε πολλές µικρές υποπεριοπεριοχές, τα λεγόµενα στοιχειώδη ολοκληρώµατα, και να υπολογίζουµε το καθένα ξεχωριστά µε βάση τον παραπάνω τύπο. Προφανώς, όσο µικρότερη είναι η περιοχή (δηλ. το h του τύπου), τόσο πιο ακριβής είναι ο υπολογισµός του στοιχειώδους ολοκληρώµατος. Τέλος, η άλγεβρα των ολοκληρωµάτων µας επιτρέπει να παράξουµε το συνολικό ολοκλήρωµα αθροίζοντας απλώς τα στοιχειώδη ολοκληρώµατα. Η παραπάνω διαδικασία φαίνεται (για 5 διαστήµατα) στο ακόλουθο σχήµα: f(x) E 1 E 2 E 3 E 4 E5 f(x) h x 0 x 1 x 2 x 3 x 4 x 5 x Προσέξτε ότι οι γραµµές που παρεµβάλλονται ανάµεσα στα διάφορά f(x i ) είναι ευθείες. Ο αλγόριθµος που αντιστοιχεί σε αυτήν την µέθοδο είναι ο ακόλουθος: Χωρίζουµε το διάστηµα [x 0,x n ] σε n-το πλήθος διαστήµατα. Υπολογίζουµε τις ποσότητες E i =½h[f(x i )+f(x i-1 )] Αθροίζουµε τις ποσότητες αυτές. 23
Ο κώδικας fortran που τον υλοποιεί είναι ο ακόλουθος: ΠΑΡΑ ΕΙΓΜΑ 12-3. PROGRAM Trapezoid!!αντικείµενο:! Το πρόγραµµα χρησιµεύει ως οδηγός για την εξωτερική διαδικασία! integral_trapezio η οποία υπολογίζει! το ολοκλήρωµα µιας συνάρτησης! σε οποιοδήποτε διάστηµα ζητήσει ο χρήστης! µε χρήση της µεθόδου του τραπεζίου.! Η διαδικασία αυτή επαναλαµβάνεται για τέσσερις! διαφορετικές διαµερίσεις, δηλ για 10, 100, 1000 και! 10000 σηµεία.! Ακόµη υπολογίζει το σχετικό σφάλµα σε σχέση µε την αναλυτικά! προσδιοριζόµενη τιµή του ολοκληρώµατος.!σχόλιο:! Για να υπολογιστεί το ολοκλήρωµα οποιασδήποτε άλλης! συνάρτησης το µόνο που χρειάζεται να κάνει ο! χρήστης είναι να αλλάξει την έκφραση για το Υ στην function.! Ακόµη πρέπει να αλλάξει την τιµή του VAL ανάλογα. IMPLICIT NONE INTERFACE SUBROUTINE integral_trapezio (Y,H,S) REAL, INTENT(IN)::Y(:) REAL, INTENT(OUT)::S END SUBROUTINE integral_trapezio END INTERFACE! δηλώσεις: REAL:: lower, upper, &!Άκρα του ολοκληρώµατος step, &!βήµα ολοκλήρωσης integral, &!Τιµή του ολοκληρώµατος ERR_REL=0.0, &!Σχετικό σφάλµα VAL=...!Αναλυτικό ολοκλήρωµα REAL, ALLOCATABLE, DIMENSION(:)::X,Y INTEGER:: status,k, & diam,&!µετρητής των διαµερίσεων N(4)=(/10,100,1000,10000/)! 4 διαµερίσεις! εκφράσεις: PRINT*,'give upper and lower bounds' READ*,upper,lower!Ο χρήστης δίνει τα άκρα του!διαστήµατος! ολοκλήρωση foralldivisions:do diam=1,4 step=abs(upper-lower)/n(diam) ALLOCATE(X(N(diam)),Y(N(diam)),STAT=status) IF (status/=0) THEN STOP 'Not enough memory' ELSE X=0;Y=0;Integral=0. END IF DO k=1,n(diam) 24
X(k)=lower+k*step Y(k)=F(X(k)) call integral_trapezio(y,step,integral) ERR_REL=100.*ABS(integral-VAL)/VAL PRINT*,lower,upper,VAL,integral,ERR_REL,N(diam) DEALLOCATE (X,Y) foralldivisions CONTAINS! ορισµός συνάρτησης REAL FUNCTION F(X) RESULT(Y) REAL, INTENT (IN) ::X Y=... END FUNCTION F END PROGRAM Trapezoid SUBROUTINE integral_trapezio(y,h,s)!αντικείµενο:! Η υπορρουτίνα αυτή υλοποιεί την µέθοδο του τραπεζίου.! Για να λειτουργήσει προϋποθέτει! α)την ύπαρξη πινακοποιηµένων τιµών Yi=f(xi)! β)οι πινακοποιηµένες αυτές τιµές να ισαπέχουν! Επιστρέφει την τιµή του ολοκληρώµατος S REAL, INTENT(IN)::Y(:) REAL, INTENT(OUT)::S INTEGER:: i DO i=1,size(y)-1 S=S+0.5*H*(Y(i)+Y(i+1)) END SUBROUTINE integral_trapezio Χρησιµοποιούµε τον παραπάνω κώδικα για να ολοκληρώσουµε τις συναρτήσεις f 1 (x) = x 2 +3x-1 στο διάστηµα [1,5] f 2 (x) = e -x στο διάστηµα [1,5] παράγουµε τον ακόλουθο πίνακα αποτελεσµάτων: ΠΙΝΑΚΑΣ 12-2 ολοκλήρωση µε την µέθοδο τραπεζίου Πραγµατική Τιµή Υπολογιζόµενη Τιµή Σχετικό Σφάλµα (%) Πλήθος ιαµερίσεων f 1 73.3333... 71.80800 2.0791 10 73.21036 0.1676 100 73.32133 0.0016 1000 73.33212 0.0002 10000 f 2 0.3611415 0.24305 32.6912 10 0.34676 3.9814 100 0.35967 0.4064 1000 0.36099 0.0407 10000 25