8 ΕΠΙΛΥΣΗ ΜΗ ΓΡΑΜΜΙΚΩΝ ΕΞΙΣΩΣΕΩΝ Στο παρόν κεφάλαιο θα ασχοληθούμε με μεθόδους επίλυσης εξισώσεων την μορφής f(x) = 0. Αναζητούμε μια ακολουθία { n} n 0 x προσεγγίσεων της λύσης, έτσι ώστε lim x = n = α, με f ( α ) = 0. Φυσικά, για κάποιο πεπερασμένο n, η τιμή x n θα είναι μια προσέγγιση του α. Για τις μεθόδους που θα δούμε, θα χρειαστεί να ξέρουμε μια αρχική εκτίμηση του α, ή ένα διάστημα που την περιέχει. 8.1 Η μέθοδος της διχοτόμησης Το m-file με το όνομα bisection.m, που φαίνεται πιο κάτω υλοποιεί τη λεγόμενη μέθοδο της διχοτόμησης (bisection method). Οι μεταβλητές εισόδου είναι οι εξής: Η συνάρτηση fname, που αντιπροσωπεύει την f(x) και είναι είτε συνάρτηση βιβλιοθήκης είτε συνάρτηση που έχει οριστεί ανώνυμα ή μέσω κάποιου m- file. Τα a και b είναι τα άκρα του αρχικού διαστήματος τέτοια ώστε f(a) f(b) < 0 n Το delta είναι η ανοχή σφάλματος, έτσι ώστε το τελικό αποτέλεσμα που παίρνουμε να ικανοποιεί x α delta. Η μεταβλητή εξόδου είναι η προσέγγιση της λύσης. n Σημειώνουμε επίσης ότι χρησιμοποιούμε τη μεταβλητή eps στο m-file, η οποία είναι η σχετική ακρίβεια της αριθμητικής κινητής υποδιαστολής που χρησιμοποιεί η MATLAB. Χρησιμοποιείται ως προεπιλεγμένη ανοχή (default tolerance). Όπως είδαμε, η τιμή της είναι >> eps ans = 2.220446049250313e-016 bisection.m function root=bisection(fname,a,b,delta) Metablhtes eisodou: fname: onoma sunexous sunarthshs mias metablkhths f(x) a, b : orizoun to diasthma [a,b] opou
Γ. Γεωργίου & Χρ. Ξενοφώντος f(a)*f(b) < 0 delta: anoxh (mh arnhjtikos pragmatikos) Metablhth exodou: root: to meson tou diasthmatos [alpha, beta] me thn idiothta f(alpha)*f(beta) <= 0 kai beta-alpha <= delta+eps*max( alpha, beta ) fa = feval(fname,a); fb = feval(fname,b); while abs(a-b) > delta+eps*max(abs(a), abs(b)) mid = (a+b)/2; fmid = feval(fname,mid); if fa*fmid <=0 uparxei riza sto [a,mid] b = mid; fb = fmid; else uparxei riza sto [mid,b] a = mid; fa = fmid; (a+b)/2; Παράδειγμα 8.1.1 Θεωρούμε την εξίσωση cos(x) = 0 η οποία έχει ρίζα την x = π/2 = 1.5707963267949. Πιο κάτω φαίνονται τα αποτελέσματα που πήραμε σε διάφορες περιπτώσεις με την Bisection. >> format long >> root=bisection('cos',0,3,0.001) 1.57067871093750 >> error=root-pi/2-1.176158573965580e-004 >> root=bisection('cos',0,3,0.00001) 1.57079601287842 >> error=root-pi/2-3.139164785892490e-007 >> root=bisection('cos',0,3,0.00000001) 1.57079632859677 >> error=root-pi/2 1.801874205398235e-009 Παράδειγμα 8.1.2 Θεωρούμε τώρα την εξίσωση f x x x 2 ( ) = 2 228
8. Επίλυση μη γραμμικών εξισώσεων με (προφανείς) ρίζες τις x 1 = 1 και x 2 = 2. Επειδή η f(x) δεν αντιστοιχεί σε συνάρτηση βιβλιοθήκης την ορίζουμε σαν ανώνυμη συνάρτηση: >> f = @(x) x.^2 - x - 2; Ακολουθούν αποτελέσματα που πήραμε σε διάφορες περιπτώσεις με την Bisection. >> format long >> root=bisection(f,0,4,0.000001) 1.99999952316284 >> error=2-root1 4.768371582031250e-007 >> root2=bisection(f,-3,1, 0.000001) root2 = -1.000000476837158 >> error=-1-root2 4.768371582031250e-007 8.2. Η μέθοδος Newton Το m-file με το όνομα Newton1.m επιλύει μια βαθμωτή εξίσωση της μορφής με τη μέθοδο Newton: f(x) = 0, f( x ) x x, k 0,1,2, = k k + 1 k f ( xk ) = Σημειώνουμε ότι πρέπει να ξέρουμε την παράγωγο της συνάρτησης όπως και μια αρχική εκτίμηση x 0. Επιπλέον, πρέπει να ισχύει f ( x ) 0 k. Οι μεταβλητές εισόδου της Newton1.m είναι: Η συνάρτηση fname που είναι είτε συνάρτηση βιβλιοθήκης, είτε function m- file είτε ανώνυμη συνάρτηση που ορίζεται από τον χρήστη. Η συνάρτηση fdname είναι η παράγωγος της συνάρτησης που ορίζεται στην fname, και πάλι πρέπει να οριστεί από τον χρήστη. Το x 0 είναι η αρχική εκτίμηση της ζητούμενης λύσης. Το delta είναι η ανοχή σφάλματος. Το Nmax είναι ο μέγιστος επιτρεπτός αριθμός επαναλήψεων. Σημειώνεται ότι η Newton1.m τυπώνει σε κάθε επανάληψη τις τιμές των x k και f(x k ) με την εντολή sprintf που είδαμε στο προηγούμενο κεφάλαιο. k 229
Γ. Γεωργίου & Χρ. Ξενοφώντος Newton1.m function root=newton1(fname,fdname,x0,delta,nmax) Epilush mh grammikhs exiswshs f(x)=0 me th me0odo Newton: f(x_k) x_k+1 = x_k - --------- f'(x_k) Metablhtes eisodou: fname : onoma sunexous sunarthshs mias metablhths f(x) fdname: h paragwgos df/dx ths f(x ) x0 : arxikh ektimhsh ths rizas delta : anoxh (mh arnhjtikos pragmatikos) Nmax : megistos ari0mos epanalhyewn Metablhth exodou: root: h riza pou upologizetai me th me0odo Newton xk=x0; fk=feval(fname,xk); dfk=feval(fdname,xk); disp('---------------------------------------------') disp(' k x_k f(x_k)') disp('---------------------------------------------') disp(sprintf(' 3.0f 14.9f 14.9f', 0, xk, fk)) for k=1:nmax xk1=xk-fk/dfk; dx=abs(xk1-xk); xk=xk1; fk=feval(fname,xk); dfk=feval(fdname,xk); disp(sprintf(' 3.0f 14.9f 14.9f', k, xk, fk)) if dx < delta+eps disp('---------------------------------------------') disp('newton method has converged'); root=xk; return disp('no convergence after Nmax iterations'); Telos tou Newton1.m Παράδειγμα 8.2.1 Για την εξίσωση f(x) = x cos(x) = 0 ορίζουμε την f και την παράγωγο της σαν ανώνυμες συναρτήσεις: >> fnewt = @(x) x - cos(x); >> dfnewt = @(x) 1 + sin(x); Καλώντας την Newton1.m παίρνουμε τα πιο κάτω αποτελέσματα: 230
8. Επίλυση μη γραμμικών εξισώσεων >> Newton1('fnewt','dfnewt',1,0.000001,1000) --------------------------------------------- k x_k f(x_k) --------------------------------------------- 0 1.000000000 0.459697694 1 0.750363868 0.018923074 2 0.739112891 0.000046456 3 0.739085133 0.000000000 4 0.739085133 0.000000000 --------------------------------------------- Newton method has converged 8.3 Η συνάρτηση fzero Η συνάρτηση βιβλιοθήκης fzero προσπαθεί να βρει μια ρίζα της εξίσωσης f(x) = 0 με αρχική εκτίμηση x 0. Η σύνταξή της είναι fzero(fun, x0) Η συνάρτηση fun μπορεί να είναι συνάρτηση βιβλιοθήκης, ανώνυμη συνάρτηση ή function m-file, π.χ. fzero(@sin, 3) ή fzero('sin', 3) ή ακόμα και fzero(@(x) sin(3*x), 2) Παράδειγμα 8.3.1 Για την εξίσωση f(x) = x cos(x) = 0 ξέρουμε από το προηγούμενο παράδειγμα ότι η λύση της ανήκει στο διάστημα [0, 1], άρα, διαλέγουμε σαν αρχική εκτίμηση το 1/2 και έχουμε: >> f = @(x) x - cos(x); >> fzero(f,0.5) ans = 0.739085133215161 Παράδειγμα 8.3.2 Θεωρούμε την εξίσωση cos(x) = 0 η οποία έχει ρίζα την x = π/2 = 1.5707963267949. Επομένως, >> fzero('cos',1) ans = 1.570796326794897 231
Γ. Γεωργίου & Χρ. Ξενοφώντος 8.4 Ασκήσεις 8.1 Θεωρείστε την εξίσωση ax x f( x) = e b όπου a και b το τρίτο και τέταρτο ψηφίο, αντίστοιχα, του ΑΜ σας. Χρησιμοποιώντας τη MATLAB: (α) Ορίστε τη συνάρτηση f(x) σαν ανώνυμη συνάρτηση και κατασκευάστε τo γράφημα της έτσι ώστε να φαίνεται η μοναδική ρίζα της. Το γράφημα πρέπει να έχει λεζάντα και ετικέτες για τους άξονες. (β) Επιλύστε την f(x) = 0 με τη μέθοδο της διχοτόμησης για διάφορες τιμές της ανοχής delta. Συγκρίνετε στη συνέχεια τα αποτελέσματά σας με το αποτέλεσμα που δίνει η εντολή fzero. 8.2 Θεωρούμε την εξίσωση f ( x) Χρησιμοποιώντας τη MATLAB: 4 e 3 = 2 x / 2 log x 1 + = 0 x (α) Ορίστε τη συνάρτηση f(x) και την παράγωγό της σαν ανώνυμες συναρτήσεις, και κατασκευάστε τo γράφημα της f(x) έτσι ώστε να φαίνεται η μοναδική ρίζα της. Το γράφημα πρέπει να έχει λεζάντα και ετικέτες για τους άξονες. (β) Επιλύστε την f(x) = 0 με τη μέθοδο Newton για διάφορες τιμές της ανοχής delta και της αρχικής τιμής x 0. Για την τελευταία δοκιμάστε τιμές στα διαστήματα (0, 0.8), (0.8, 1.2) και (1.2, ). Συγκρίνετε στη συνέχεια τα αποτελέσματά σας με το αποτέλεσμα που δίνει η εντολή fzero. 8.3 Πριν 200 χρόνια ο Gauss ανάπτυξε μία μέθοδο για τον υπολογισμό των τροχιών ουρανίων σωμάτων, η οποία βασιζόταν στη γωνιακή θέση του σώματος που εκτελούσε την τροχιά. Ο Laplace ανέπτυξε παρόμοια μέθοδο με την οποία, όπως και με αυτή του Gauss, παίρνουμε ένα πολυώνυμο 8 ου βαθμού του οποίου η θετική ρίζα μας δίνει το ζητούμενο. Για παράδειγμα, αν εφαρμόσουμε τη μέθοδο του Gauss σε ένα διαστημόπλοιο που περιστρέφεται γύρω από τη Γη με ελλειπτική τροχιά που έχει μεγάλο άξονα 2.9 επί την ακτίνα της Γης, και εκκεντρότητα 0.3, τότε παίρνουμε την εξής εξίσωση: 8 6 3 r 0.9945225r 3.370698r 365.7847 = 0. Η θετική ρίζα της πιο πάνω εξίσωσης χρησιμοποιείται για τον υπολογισμό των στοιχείων που καθορίζουν την τροχιά του διαστημοπλοίου. Να κάνετε τη γραφική παράσταση του πιο πάνω πολυωνύμου για να βρείτε μια καλή αρχική εκτίμηση για την θετική του ρίζα. Στη συνέχεια, να βρείτε την θετική ρίζα του πολυωνύμου με ακρίβεια 10 6, χρησιμοποιώντας όποια μέθοδο θέλετε. 232