ΑΡΙΘΜΗΤΙΚΗ ΟΛΟΚΛΗΡΩΣΗ. Αθροίσματα Riemann Στο κεφάλαιο αυτό θα ασχοληθούμε με αριθμητικές μεθόδους υπολογισμού του ορισμένου ολοκληρώματος b a f ( d ) όπου τα a, b είναι γνωστά και η συνάρτηση f() είναι συνεχής και επίσης γνωστή. Γνωρίζουμε ότι αν διαμερίσουμε το διάστημα [a, b] σε n υποδιαστήματα ίσου μήκους Δ = ( b a)/ n και κομβικά σημεία τα = a, = a+δ, = a+ Δ,..., i = a+ iδ,..., n = a+ nδ = b τότε έχουμε b n n ( ) ( ) f ( d ) = lim f Δ = lim f i Δ. a i n n i= i= Τα πιο πάνω αθροίσματα καλούνται αθροίσματα Riemann (αριστερό και δεξιό, αντίστοιχα). Αν τώρα, χρησιμοποιήσουμε ένα πεπερασμένο αριθμό κομβικών σημείων (δηλ. δεν πάρουμε το όριο όταν το n τείνει στο άπειρο) τότε έχουμε μια προσέγγιση για το ολοκλήρωμα. Τα πιο κάτω m-files υπολογίζουν το αριστερό και δεξιό άθροισμα Riemann, αντίστοιχα, παίρνοντας σαν δεδομένα εισόδου τη συνάρτηση συνάρτηση f, τα άκρα a, b του διαστήματος [a, b], και ένα ακέραιο αριθμό n, και δίνουν σαν δεδομένο εξόδου την προσέγγιση του ολοκληρώματος της f() στο διάστημα [a, b]. function [I] = leftsum(f,a,b,n) function [I] = leftsum(f,a,b,n) Ypologizei to Aristero Aroisma Reimann gia to oloklhrwma ths f() sto diasthma [a,b] me n upodiasthmata. d = (b-a)/n; =linspace(a,b,n+); I=; for i=:n I = I + feval(f,(i))*d; Telos tou leftsum.m
Γ. Γεωργίου & Χρ. Ξενοφώντος function [I] = rightsum(f,a,b,n) function [I] = rightsum(f,a,b,n) Ypologizei to Deksio Aroisma Reimann gia to oloklhrwma ths f() sto diasthma [a,b] me n upodiasthmata. d = (b-a)/n; =linspace(a,b,n+); I=; for i=:n+ I = I + feval(f,(i))*d; Telos tou rightsum.m Θα χρησιμοποιήσουμε τα πιο πάνω m-files για να προσεγγίσουμε το ολοκλήρωμα d, 5 + το οποίου η ακριβής τιμή είναι arctan.3947997, χρησιμοποιώντας 5 5 n = 5 κομβικά σημεία. >> f = @()./(5+.^); >> format long >> leftsum(f,,,5).39486494453 >> rightsum(f,,,5).3947757544 Παράδειγμα.. Θεωρούμε τώρα το ολοκλήρωμα ( ) e d= e.6466476763387. Θα χρησιμοποιήσουμε τα πιο πάνω m-files για διάφορες τιμές του n για να διαπιστώσουμε ότι όταν το n αυξάνεται, η προσέγγιση που παίρνουμε τείνει στην ακριβή τιμή του ολοκληρώματος. Έχουμε >> f = @().^.*ep(-); >> n=5:5:; >> for i=:length(n) Ileft(i) = leftsum(f,,,n(i)); Iright(i) = rightsum(f,,,n(i)); 58
. Αριθμητική ολοκλήρωση >> Ileft'.64556448536575.6465865787.64686735454.6463764976739.6464363869.6464667589555.64649498738745.64658335637.646568696438.6465388994783.64654874973337.64655694475.6465638843865.646569833863.6465749888647.6465794999956.6465834844763.646587869.646598435673.64659333558 >> Iright'.64779849897536.647885876668.647867476.64697838338.646863748747.646876467886.646883659.64678597.64676746566346.6467554358646.6467455939448.64673739563.646734588598.6467458437.6467934645599.6467483575493.646785485986.6467736648645.64674598.6467374769 Πράγματι, οι προσεγγίσεις τείνουν προς την ακριβή τιμή, αλλά αυτό γίνεται με αρκετά αργό ρυθμό. Στη συνέχεια θα δούμε ένα άλλο τρόπο προσέγγισης ολοκληρωμάτων ο οποίος συγκλίνει ταχύτερα. Παράδειγμα.. Ένας πιο εύκολος τρόπος να υπολογίσουμε τα αθροίσματα Riemann είναι με την εντολή diff που βρίσκει τις διαφορές των στοιχείων ενός διανύσματος. Για παράδειγμα >> u=[ 3 4 4.5 8]; 59
Γ. Γεωργίου & Χρ. Ξενοφώντος >> diff(u)...5 3.5 Μπορούμε λοιπόν να τροποποιήσουμε το leftsum.m ως εξής: function [I] = leftsum(f,a,b,n) function [I] = leftsum(f,a,b,n) Ypologizei to Aristero Aroisma Reimann gia to oloklhrwma ths f() sto diasthma [a,b] me n upodiasthmata. =linspace(a,b,n+); Y=feval(f,); Yleft=Y(:n); I=sum(diff().*Yleft); Telos tou leftsum.m Παράδειγμα..3 Το m-file leftsum.m υπολογίζει το αριστερό άθροισμα Riemann και επιπλέον σχεδιάζει γραφικά το εμβαδόν που υπολογίζεται με τη χρήση της συνάρτησης fill: function [I] = leftsum(f,a,b,n) function [I] = leftsum(f,a,b,n) Ypologizei to Aristero Aroisma Reimann gia to oloklhrwma ths f() sto diasthma [a,b] me n upodiasthmata. ISedia;zei episis to embadon poy ypologizei. =linspace(a,b,n+); Y=feval(f,); Yleft=Y(:n); I=sum(diff().*Yleft); Draw area new=linspace(a,b,); ynew=feval(f,new); plot(new,ynew); label(''); ylabel('y'); hold on for i=:n ()=(i); yy()=; ()=(i+); yy()=; (3)=(i+); yy(3)=feval(f,()); (4)=(i); yy(4)=feval(f,()); fill(,yy,'m') plot(new,ynew); plot(,y,'ro') hold off Telos tou leftsum.m Θεωρούμε τώρα το ολοκλήρωμα π sin d 6
. Αριθμητική ολοκλήρωση Για n = 6 βρίσκουμε >> leftsum(@sin,,pi,6).95497333377 και παίρνουμε το γράφημα:.9.8.7.6 y.5.4.3.. Για n = βρίσκουμε.5.5.5 3 3.5 >> leftsum(@sin,,pi,).9835353759454 και παίρνουμε το γράφημα: y.9.8.7.6.5.4.3.. Για n = βρίσκουμε.5.5.5 3 3.5 >> leftsum(@sin,,pi,).995885977875 και παίρνουμε το γράφημα: 6
Γ. Γεωργίου & Χρ. Ξενοφώντος y.9.8.7.6.5.4.3.. Τέλος για n = βρίσκουμε.5.5.5 3 3.5 >> leftsum(@sin,,pi,).99983553887444 και παίρνουμε το γράφημα: y.9.8.7.6.5.4.3...5.5.5 3 3.5 Βλέπουμε πως με την αύξηση του n προσεγγίζεται το εμβαδόν που θέλουμε να υπολογίσουμε. 6
. Αριθμητική ολοκλήρωση. Η μέθοδος του τραπεζίου Στη μέθοδο του τραπεζίου, η προσέγγιση ολοκληρώματος επιτυγχάνεται ως εξής: b a Δ f ( d ) f( ) + f( ) + f( ) +... + f( ) + f( ) { [ n ] n } όπου, Δ = ( b a)/ n και = a, = a+δ, = a+ Δ,..., = a+ iδ,..., = a+ nδ = b. Το πιο κάτω m-file υλοποιεί τη μέθοδο του τραπεζίου. function [I] = trapezoid(f,a,b,n) function [I] = trapezoid(f,a,b,n) This function uses the (composite) Trapezoidal Rule to approimate the int(f(),=a..b) with n subintervals. The function f() is defined eternally (as an anonymous function or using, e.g. the "inline" command. if a==b I=; return d = (b-a)/n; =linspace(a,b,n+); I=; for i=:n I = I + *feval(f,(i))*d; I =.5*(d*feval(f,a)+d*feval(f,b)+I); End of trapezoid.m Θα τρέξουμε το πιο πάνω m-file για να προσεγγίσουμε το ολοκλήρωμα d, 5 + όπως κάναμε και στην προηγούμενη παράγραφο, χρησιμοποιώντας 5 κομβικά σημεία. >> f = @()./(5+.^); >> trapezoid(f,,,5).39479983783 Συγκρίνοντας την τιμή που πήραμε με την ακριβή τιμή (.3947997 ) και με αυτές που έδωσαν τα leftsum.m (.39486494453) και rightsum.m (.3947757544), βλέπουμε ότι το trapezoid.m δίνει καλύτερο αποτέλεσμα. i n Παράδειγμα... Θεωρούμε το ολοκλήρωμα 63
Γ. Γεωργίου & Χρ. Ξενοφώντος e d= e (.6466476763387). Θα χρησιμοποιήσουμε το m-file trapezoid.m για διάφορες τιμές του n για να διαπιστώσουμε ότι όταν το n αυξάνεται, η προσέγγιση που παίρνουμε τείνει στην ακριβή τιμή του ολοκληρώματος. Έχουμε >> f = @().^.*ep(-); >> n=::; >> for i=:length(n) Itrap(i) = trapezoid(f,,,n(i)); >> Itrap'.646633739948.6466469735553.646646995655494.6466473.646647453479.6466475688577.646647683465.646647643974.64664765563.64664766443.64664766689.6466476696876.6466476745984.64664767744.646647673586.64664767447.646647674673.6466476753.6466476756947.6466476754678 Πράγματι, οι προσεγγίσεις τείνουν προς την ακριβή τιμή, και με αρκετά γρήγορο ρυθμό (αφού οι τιμές του n που πήραμε δεν ήταν και τόσο μεγάλες). Για n παρόμοιο με αυτό που πήραμε για τα αθροίσματα Riemann, παίρνουμε >> trapezoid(f,,,5).6466476763643 >> trapezoid(f,,,).64664767633734 >> trapezoid(f,,,).64664767633874 64
. Αριθμητική ολοκλήρωση Υπάρχουν και άλλες παρόμοιες μέθοδοι, τις οποίες δεν θα δούμε εδώ. (Μια από αυτές όμως θα δοθεί σαν άσκηση.).. Η εντολή trapz Στην περίπτωση που αντί για την συνάρτηση f() μας έχει δοθούν διακριτές τιμές της f ( ), f( ),..., f( N ) που αντιστοιχούν στα σημεία,,..., N, τότε μπορούμε να βρούμε το ολοκλήρωμα της f() στο διάστημα [, N ] με την εντολή trapz(, y) η οποία παίρνει σαν δεδομένα εισόδου τα διανύσματα = [,,..., N ] και y = [ f( ), f( ),..., f( N )]. Βασικά, χρησιμοποιείται η μέθοδος του τραπεζίου (όπως φαίνεται και από το όνομα trapz) χωρίς καν να γνωρίζουμε την συνάρτηση (αφού μόνο οι τιμές της χρειάζονται στο υπολογισμό του ολοκληρώματος με τον κανόνα του τραπεζίου). Έστω για παράδειγμα τα δεδομένα: >> = [..5.33.46.59.64.78.99]; >> y = [.4 3.45 33.99 54.68 55.5 7. 76.3 8.9 9.7]; Η γραφική παράσταση των πιο πάνω δεδομένων είναι >> plot(,y,'o') 8 6 4...3.4.5.6.7.8.9 Τότε, το ολοκλήρωμα της συνάρτησης που περνά από τα πιο πάνω σημεία είναι >> trapz(,y) 57.878749999999997 Παράδειγμα.. Είναι εύκολο να δούμε ότι με τον κανόνα του τραπεζίου υπολογίζουμε το πιο κάτω άθροισμα εμβαδών ορθογωνίων: n ( i+ i)( i+ i) / i= A= y + y 65
Γ. Γεωργίου & Χρ. Ξενοφώντος Το πιο κάτω m-file υλοποιεί τον κανόνα του τραπεζίου και ταυτόχρονα σχεδιάζει το εμβαδόν που υπολογίζεται: function [I]=trapznew(,y) TRAPZNEW Ypologizei kai sediazei to embadon katw apo ta shmeia (,y) sumfvna me ton kanona toy trapeziou n=length(); ny=length(y); if n~=ny disp(' and y must be of the same length!') return else n=n; avg_y=y(:n-)+diff(y)/; I=sum(diff().*avg_y); Draw area plot(,y); label(''); ylabel('y'); hold on for i=:n- ()=(i); yy()=; ()=(i+); yy()=; (3)=(i+); yy(3)=avg_y(i); (4)=(i); yy(4)=avg_y(i); fill(,yy,'m') plot(,y); plot(,y,'ro') hold off Telos tou trapznew.m Για τα δεδομένα που είδαμε πιο πάνω παίρνουμε: >> = [..5.33.46.59.64.78.99]; >> y = [.4 3.45 33.99 54.68 55.5 7. 76.3 8.9 9.7]; >> trapznew(,y) 57.878749999999997 και το γράφημα 8 y 6 4...3.4.5.6.7.8.9 66
. Αριθμητική ολοκλήρωση Παράδειγμα..3 Θα χρησιμοποιήσουμε το trapznew για να υπολογίσουμε προσεγγιστικά το ολοκλήρωμα d= 3 Για n = παίρνουμε: >> =:.:; >> y=.^; >> trapznew(,y).335 και το γράφημα y Για n = παίρνουμε:.9.8.7.6.5.4.3.. >> =:.:; >> y=.^; >> trapznew(,y).33335 και το γράφημα...3.4.5.6.7.8.9 y.9.8.7.6.5.4.3.....3.4.5.6.7.8.9 67
Γ. Γεωργίου & Χρ. Ξενοφώντος.3 Οι εντολές quad και quadl Η MATLAB διαθέτει δύο συναρτήσεις/εντολές βιβλιοθήκης για τον υπολογισμό του ολοκληρώματος b f ( d ), a οι οποίες καλούνται quad και quadl (από τη λέξη quadrature που σημαίνει αριθμητική ολοκλήρωση) και έχουν την εξής δομή: quad(fun, a, b, tol) quadl(fun, a, b, tol) Τα δεδομένα εισόδου είναι η συνάρτηση fun που αντιστοιχεί στην f() (η οποία ορίζεται σαν ανώνυμη συνάρτηση ή μέσω ενός m-file), τα άκρα a, b του διαστήματος ολοκλήρωσης, και η επιθυμητή ανοχή tol. Σημειώνουμε ότι η quad χρησιμοποιεί την λεγόμενη προσαρμοστική μέθοδο του Simpson, ενώ η quadl χρησιμοποιεί την προσαρμοστική μέθοδο Lobatto. (Γράψτε help quad ή help quadl για περισσότερες πληροφορίες.) Ας δούμε τι τιμές μας δίνουν αυτές οι συναρτήσεις για τα ολοκληρώματα των προηγούμενων παραδειγμάτων: >> f = @()./(5+.^); >> quad(f,,,e-6).3947996693 >> quad(f,,,e-6).39479969976 >> quadl(f,,,e-6).39479969976 >> quadl(f,,,e-6).39479969976 Παρατηρούμε ότι, για αυτό το παράδειγμα, η quadl δίνει καλύτερα αποτελέσματα ακόμα και όταν η ζητούμενη ακρίβεια είναι χαμηλή. Για το άλλο παράδειγμα, έχουμε >> f = @().^.*ep(-); >> quad(f,,,e-6).646647966687 >> quad(f,,,e-6).64664767633873 68
. Αριθμητική ολοκλήρωση >> quadl(f,,,e-6).646647784436 >> quadl(f,,,e-6).64664767633873 Παράδειγμα.3. Θα υπολογίσουμε το ολοκλήρωμα διαφορετικές ανοχές. Με τη quad βρίσκουμε e d χρησιμοποιώντας τις quad και quadl για >> for i = :6 inte = quad( ep(.^),,,^(-i)); disp(sprintf( For i= 3.f the integral is 5.3g,i,inte)) For i= the integral is.4665857 For i= the integral is.4665857 For i= 3 the integral is.4665857 For i= 4 the integral is.4665857 For i= 5 the integral is.4665884484 For i= 6 the integral is.46657759 For i= 7 the integral is.466574696 For i= 8 the integral is.466574597 For i= 9 the integral is.466574594 For i= the integral is.466574597 For i= the integral is.466574597 For i= the integral is.466574597 For i= 3 the integral is.466574597 For i= 4 the integral is.466574597 For i= 5 the integral is.466574597 For i= 6 the integral is.466574597 Με τη quadl βρίσκουμε >> for i = :6 inte = quadl( ep(.^),,,^(-i)); disp(sprintf( For i= 3.f the integral is 5.3g,i,inte)) For i= the integral is.4665763478 For i= the integral is.4665763478 For i= 3 the integral is.4665763478 For i= 4 the integral is.4665763478 For i= 5 the integral is.4665763478 For i= 6 the integral is.4665763478 For i= 7 the integral is.4665763478 For i= 8 the integral is.466574597 For i= 9 the integral is.466574597 For i= the integral is.466574597 For i= the integral is.466574597 For i= the integral is.466574597 For i= 3 the integral is.466574597 For i= 4 the integral is.466574597 For i= 5 the integral is.466574597 For i= 6 the integral is.466574597 Παρατηρούμε ξανά ότι η quadl είναι πιο ακριβής. 69
Γ. Γεωργίου & Χρ. Ξενοφώντος.4 Ασκήσεις. Ο λεγόμενος (σύνθετος) κανόνας του Simpson, για την προσέγγιση ενός ολοκληρώματος, είναι b a h f ( ) d f( ) + 4 f( ) + f( ) + 4 f( 3) + f( 4) +... + f( n ) + 4 f( n ) + f( n ) 3 [ ] όπου h= ( b a) / n, i = a+ ih, i=,..., n με το n > άρτιο. Να γράψετε ένα m- file, που να καλείται csimpson.m, το οποίο να παίρνει σαν δεδομένα εισόδου την συνάρτηση f, τα άκρα a και b του διαστήματος [a, b], και το n, και να δίνει σαν δεδομένο εξόδου την προσέγγιση του ολοκληρώματος. Χρησιμοποιείστε το m-files σας για να υπολογίσετε τα πιο κάτω ολοκληρώματα με n = 5. + (α) d = arctan (.3947997) 5 5 5 (β) e d= e (.6466476763387) (γ) π cos d(.779893437683). Με τη βοήθεια σταθερού άνεμου, ένα χαρταετός πετά με δυτική κατεύθυνση. Το ύψος του χαρταετού από την (οριζόντια) αρχική θέση = μέχρι την τελική θέση = 8, δίνεται από συνάρτηση f( ) = 5 ( 5 ). Να βρείτε την 4 απόσταστη που ταξίδεψε ο χαρταετός. (ΥΠΟΔΕΙΞΗ: Για να απαντήσετε σε αυτή την ερώτηση πρέπει να υπολογίσετε το μήκος τόξου της καμπύλης y = f() από = μέχρι = 8.).3 Χρησιμοποιώντας τις εντολές quad και quadl, να υπολογίσετε τα πιο κάτω ολοκληρώματα με ακρίβεια 6. (α) cos( π)sin( π/ ) d = (.6597) 3π (β) + / 4d= 5 + ln() ln( 5 ) (.8457639) (γ) e d(.7468433).4 Δημιουργείστε ένα function m-file με όνομα rightsum.m που να υπολογίζει το δεξιό άθροισμα Riemann της συνάρτησης f στο διάστημα [a, b] για n ίσου μήκους υποδιαστήματα και να σχεδιάζει το υπολογιζόμενο εμβαδόν. 7
. Αριθμητική ολοκλήρωση Υπόδειξη: Τροποποιείστε το leftsum.m που δίνεται στο Παράδειγμα..3 και χρησιμοποιείστε τη συνάρτηση diff..5 Χρησιμοποιώντας τις εντολές quad και quadl, υπολογίστε το ολοκλήρωμα 3 5 d με τους δύο τρόπους που δίνει η βοήθεια help quad. 7
Γ. Γεωργίου & Χρ. Ξενοφώντος 7