ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ, 2006-2007, 3 Ο ΕΞΑΜΗΝΟ ΑΠΑΝΤΗΣΕΙΣ ΕΡΓΑΣΙΑΣ #1: ΑΡΙΘΜΗΤΙΚΗ ΚΙΝΗΤΗΣ ΥΠΟ ΙΑΣΤΟΛΗΣ και ΡΙΖΕΣ ΕΞΙΣΩΣΕΩΝ ΕΠΙΜΕΛΕΙΑ: Σ. Μισδανίτης 2. Πως ορίζεται και τι σημαίνει ο όρος flop στους επιστημονικούς υπολογισμούς. Βρείτε τον χρόνο που απαιτείται στον υπολογιστή σας για να εκτελέσετε 1ΚFlop, 1ΜFlop, 1Gflop και 1Tflop. Απάντηση: Ο όρος flop σημαίνει floating point operation (πράξη μεταξύ αριθμών κινητής υποδιαστολής) και ορίζεται ως ο χρόνος που χρειάζεται ένας υπολογιστής για να υπολογίσει έναν πολλαπλασιασμό και µία πρόσθεση μαζί, δηλαδή y a+x*y, συν τον χρόνο που απαιτείται για την ανάκτηση από την μνήμη RAM των δεδομένων που εμπλέκονται στις δύο αυτές πράξεις. Οι ποσότητες a και x είναι σταθερές και γνωστές όπως επίσης γνωστή και η αρχική τιμή της ποσότητας y. To «flop» αποτελεί μονάδα μέτρησης της ταχύτητας του επεξεργαστή και σημείο αναφοράς όταν συγκρίνεται η ταχύτητα υπολογισμών ανάμεσα σε Η/Υ. Σε Visual Fortran 6.6 (Fortran 90) το αντίστοιχο πρόγραμμα είναι: Program Flop implicit none real(8)::a,x,y,ts,tf integer(8)::i,lim print*,'give max number of flops' read*,lim a=1. x=1. y=0. i=1
Call Cpu_time(ts) do i=1,lim y=a+x*y enddo Call Cpu_time(tf) print*, 'the time needed for the evaluation of',lim,' flops is' print*, tf-ts,'sec' end Για το 1ΚFlop 0.000000000000000E+000 sec 1ΜFlop 0.000000000000000E+000 sec 1Gflop 8.82812500000000 sec και 1Tflop 8.736,609375 sec 3. Βρείτε τις δύο ρίζες της εξίσωσης εφαρμόζοντας τις μεθόδους: i. ιχοτόµηση ii. Γραµμική παρεµβολή iii. Απλή αντικατάσταση xe x 3 e = 0 µε ακρίβεια έξι σημαντικών ψηφίων ( 1) ( ) ( ) iv. n + x = (1 ω) x n + ωf( x n ) v. Newton-Raphson vi. Τέµνουσα vii. Aitken Να σχολιασθούν τα χαρακτηριστικά (πλεονεκτήματα και μειονεκτήματα) της κάθε μεθόδου. Επίσης, να γίνει συστηματική σύγκριση της αποτελεσματικότητας των μεθόδων που να περιλαμβάνει σε κάθε περίπτωση την θεωρητική και πειραματική σύγκλιση και τον απαιτούμενο χρόνο υπολογισμών.
Απάντηση: Χρησιμοποιώντας Mathematica μπορούμε να πάρουμε τη γραφική παράσταση της εξίσωσης της οποίας καλούμαστε να υπολογίσουμε τις ρίζες της. 0.3 0.25 0.2 0.15 0.1 0.05-0.05 1 2 3 4 5 Σχήμα 1: Γραφική παράσταση της xe x 3 e = 0 0.1 0.02-0.2-0.1 0.1 0.2-0.1 0.01-0.2 4.2 4.4 4.6 4.8 5-0.3-0.01 Σχήμα 2: Εστίαση της γραφικής στο -0,25<x<0.25 Σχήμα 3: Εστίαση της γραφικής στο 4<x<5 Επίσης, το Mathematica περιλαμβάνει υπορουτίνες οι οποίες μπορούν να υπολογίσουν ρίζες εξισώσεων. Εισάγοντας την εξίσωση της άσκησης παίρνουμε σαν αποτέλεσμα x 1 =0.524691 10-1, x 2 =0.450524 10 1. 3
i. Μέθοδος Διχοτόμησης Το Πρόγραμμα 1 που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω Πρόγραμμα 1: Μέθοδος Διχοτόμησης!*****************************************!* Program to demonstrate Bisection subroutine *!* --------------------------------------------------------- *!* Find a real root of f(x)=x*e^(-x)-e^(-3) *!***************************************** PROGRAM Bisection real*8 e,x,x0,x1,y,ts,tf integer m open(1,file='results.txt') print *,' ' print *,'What is the initial range (X0,X1):' print *,' ' write(*,"(' X0 = ')",advance='no'); read *, x0 write(*,"(' X1 = ')",advance='no'); read *, x1 write(*,"(/' Convergence criterion: ')",advance='no'); read *, e call Cpu_time(ts) call Bisect(e,m,x,x0,x1)! Call bisection routine call Cpu_time(tf) write(*,50) x write(*,60) Y(x) write(*,70) m print*, tf-ts stop 50 format(//' The calculated zero is X = ',E14.7) 60 format(/' The associated Y value is Y = ',E14.7) 70 format(/' The number of steps was: ',i2//) end real*8 Function Y(x) real*8 x Y =x*exp(-x)-exp(-3d0) end Subroutine Bisect(e,m,x,x0,x1) integer m real*8 e,x,x0,x1,y0,yy,y m=0 100 y0=y(x0) 4
x=(x0+x1)/2.d0 yy=y(x) m=m+1 write(1,5) m,x0,x,x1,y0,yy,x1-x0 if (dabs(yy*y0).eq.0) return if ((yy*y0)<0.d0) x1=x if ((yy*y0)>0.d0) x0=x if (dabs(x1-x0)>e) goto 100 return 5 format (i3,2x,e14.7,2x,e14.7,2x,e14.7,2x,e14.7,2x,e14.7,2x,e14.7) end! End of file Bisect.f90 Εφαρμόζουμε τη μέθοδο της διχοτόμησης στο διάστημα [0,0.1] και για σφάλμα x new old 7 x < 10, όπου new x και old x διαδοχικές εκτιμήσεις της ρίζας, παίρνουμε N x0 x x1 y(x) y(x1) Σφάλμα 1 0.00000000 0.05000000 0.10000000-0.04978707-0.00222560 0.1000000 2 0.05000000 0.07500000 0.10000000-0.00222560 0.01979369 0.0500000 3 0.05000000 0.06250000 0.07500000-0.00222560 0.00892625 0.0250000 4 0.05000000 0.05625000 0.06250000-0.00222560 0.00338621 0.0125000 5 0.05000000 0.05312500 0.05625000-0.00222560 0.00058932 0.0062500 6 0.05000000 0.05156250 0.05312500-0.00222560-0.00081588 0.0031250 7 0.05156250 0.05234375 0.05312500-0.00081588-0.00011271 0.0015625 8 0.05234375 0.05273438 0.05312500-0.00011271 0.00023845 0.0007813 9 0.05234375 0.05253906 0.05273438-0.00011271 0.00006290 0.0003906 10 0.05234375 0.05244141 0.05253906-0.00011271-0.00002490 0.0001953 11 0.05244141 0.05249023 0.05253906-0.00002490 0.00001900 0.0000977 12 0.05244141 0.05246582 0.05249023-0.00002490-0.00000295 0.0000488 13 0.05246582 0.05247803 0.05249023-0.00000295 0.00000803 0.0000244 14 0.05246582 0.05247192 0.05247803-0.00000295 0.00000254 0.0000122 15 0.05246582 0.05246887 0.05247192-0.00000295-0.00000020 0.0000061 16 0.05246887 0.05247040 0.05247192-0.00000020 0.00000117 0.0000031 17 0.05246887 0.05246964 0.05247040-0.00000020 0.00000048 0.0000015 18 0.05246887 0.05246925 0.05246964-0.00000020 0.00000014 0.0000008 19 0.05246887 0.05246906 0.05246925-0.00000020-0.00000003 0.0000004 20 0.05246906 0.05246916 0.05246925-0.00000003 0.00000005 0.0000002 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλμα 0.5x10-7 μετά από 20 διχοτομήσεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. 5
Ομοίως για το διάστημα [4.4,4.6] και για σφάλμα 7 10 παίρνουμε N x0 x x1 y(x0) y(x) Σφάλμα 1 4.40000000 4.50000000 4.60000000 0.00423323 0.00020342 0.20000000 2 4.50000000 4.55000000 4.60000000 0.00020342-0.00170629 0.10000000 3 4.50000000 4.52500000 4.55000000 0.00020342-0.00075999 0.05000000 4 4.50000000 4.51250000 4.52500000 0.00020342-0.00028044 0.02500000 5 4.50000000 4.50625000 4.51250000 0.00020342-0.00003905 0.01250000 6 4.50000000 4.50312500 4.50625000 0.00020342 0.00008205 0.00625000 7 4.50312500 4.50468700 4.50625000 0.00008205 0.00002146 0.00312500 8 4.50468700 4.50546900 4.50625000 0.00002146-0.00000880 0.00156250 9 4.50468700 4.50507800 4.50546900 0.00002146 0.00000633 0.00078125 10 4.50507800 4.50527300 4.50546900 0.00000633-0.00000124 0.00039063 11 4.50507800 4.50517600 4.50527300 0.00000633 0.00000255 0.00019531 12 4.50517600 4.50522500 4.50527300 0.00000255 0.00000065 0.00009766 13 4.50522500 4.50524900 4.50527300 0.00000065-0.00000029 0.00004883 14 4.50522500 4.50523700 4.50524900 0.00000065 0.00000018 0.00002441 15 4.50523700 4.50524300 4.50524900 0.00000018-0.00000006 0.00001221 16 4.50523700 4.50524000 4.50524300 0.00000018 0.00000006 0.00000610 17 4.50524000 4.50524100 4.50524300 0.00000006 0.00000000 0.00000305 18 4.50524100 4.50524200 4.50524300 0.00000000-0.00000003 0.00000153 19 4.50524100 4.50524200 4.50524200 0.00000000-0.00000001 0.00000076 20 4.50524100 4.50524200 4.50524200 0.00000000 0.00000000 0.00000038 21 4.50524100 4.50524100 4.50524200 0.00000000 0.00000000 0.00000019 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλμα 0.19x10-7 μετά από 18 διχοτομήσεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. ii. Μέθοδος Γραμμικής Παρεμβολής Το Πρόγραμμα που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω Πρόγραμμα 2: Μέθοδος Γραμμικής Παρεμβολής!*******************************************!* Program to demonstrate Grammiki Paremvoli *!* ------------------------------------------------------------ *!* Find a real root of f(x)=x*e^(-x)-e^(-3) *!******************************************* Program GrammikiParemboli implicit none 6
real(8)::x,x0,x1,a,b,e,sfalma,ts,tf integer::m e=1.e-07 open(12,file='grammikiparemboli.txt') print*,'dose x0' read*, x0 print*,'dose x1' read*, x1 write(12,16) 'N','x0','x','x1','y(x0)','y(x)','y(x1)','Sfalma' Call Cpu_time(ts) do while (abs(y(x))>e) m=m+1 x=x0-((y(x0)*(x1-x0))/(y(x1)-y(x0))) Sfalma=abs((x-x1)/x) write(12,15)m,x0,x,x1,y(x0),y(x),y(x1),sfalma if (y(x0)*y(x)<0) then x1=x else if (y(x0)*y(x)>0) then write(12,15)m,x0,x,x1,y(x0),y(x),y(x1),sfalma x0=x else print*,x exit end if if (abs(1.-x0/x)<=e.and.abs(1.-x0/x1)<=e) then exit endif end do Call Cpu_time(tf) write(12,*) ' ' write(12,*)'stin EPANALIPSI:',m write(12,*),'h RIZA BRETHIKE ISH ME:',x print*, 'o xronos pou apaitithike einai',tf-ts 15 format (i3,2x,f11.8,2x,f11.8,2x,f11.8,2x,f11.8,2x,f11.8,2x,f11.8,2x,f11.8) 16 format (2x,a1,8X,a2,10X,a1,12X,a2,10X,a5,8X,a4,9X,a5,7X,a6) contains real function y(x) real(8)::x y=x*exp(-x)-exp(-3.) end function end program GrammikiParemboli 7
Εφαρμόζουμε τη μέθοδο της γραμμικής παρεμβολής στο διάστημα [0,0.1] και για σφάλμα 10 7 παίρνουμε N x0 x x1 y(x0) y(x) y(x1) Σφάλμα 1 0.00000000 0.05502322 0.10000000-0.0497870 0.00229038 0.04069667 0.81741460 2 0.00000000 0.05260328 0.05502322-0.0497870 0.00012063 0.00229038 0.04600359 3 0.00000000 0.05247614 0.05260328-0.0497870 0.00000633 0.00012063 0.00242287 4 0.00000000 0.05246947 0.05247614-0.0497870 0.00000033 0.00000633 0.00012715 5 0.00000000 0.05246912 0.05246947-0.0497870 0.00000002 0.00000033 0.00000667 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλμα 0.667x10-5 μετά από 5 γραμμικές παρεμβολές και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. Ομοίως για το διάστημα [4.4,4.6] και για σφάλμα 7 10 παίρνουμε N x0 x x1 y(x0) y(x) y(x1) Σφάλμα 1 4.40000000 4.50879747 4.60000000 0.00423323-0.0001375-0.0035486 0.02022768 2 4.40000000 4.50537313 4.50879747 0.00423323-0.0000051-0.0001375 0.00076006 3 4.40000000 4.50524640 4.50537313 0.00423323-0.0000001-0.0000051 0.00002813 4 4.40000000 4.50524171 4.50524640 0.00423323-0.0000000-0.0000001 0.00000104 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλμα 0.1x10-5 μετά από 4 γραμμικές παρεμβολές και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. iii. Μέθοδος Απλής Αντικατάστασης Υπολογίζουμε τις ρίζες της εξίσωσης x 3 f( x) = xe e = 0κάνοντας χρήση της μεθόδου της απλής αντικατάστασης. Για το λόγο αυτό, μετασχηματίζουμε την αρχική σχέση σε μια ισοδύναμη της μορφής x = F( x) και επομένως έχουμε e xe e xe e x x e e 3 x 3 x 3 x 3 = 0 = = = x και F'( x) = e Για τον έλεγχο σύγκλισης θα πρέπει να ισχύει F'( x ) < 1. Εφαρμόζουμε τον παραπάνω x 3 αναδρομικό τύπο στο διάστημα [0,0.1] και υπολογίζουμε την F'(0.05) 0.05 3 = e 8
F '(0.05) = 0.05234 < 1 και επομένως αναμένουμε σύγκλιση. Το Πρόγραμμα 3 που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω Πρόγραμμα 3: Μέθοδος Απλής Αντικατάστασης!*********************************************!* Program to demonstrate Diadoxikes Epanalipseis *!* ----------------------------------------------------------------*!* Find a real root of f(x)=x*e^(-x)-e^(-3) *!********************************************* Program DiadoxikesEpanalipseis implicit none real(8)::x,x0,e,sfalma,ts,tf integer::iter,m,n e=1.e-07 sfalma=1.e+06 print*,'dose x0' read*,x0 open(14,file='diadoxikes Epanalipseis.txt') write(14,16) ' N', 'x', 'x0', 'G(x) ', 'dg(x)', 'Sfalma' Call Cpu_time(ts) do while (sfalma>e) m=m+1 x=g(x0) Sfalma=abs((x-x0)/x) if (Sfalma+0.00001<e) goto 100 write(14,15) m,x,x0,g(x0),dg(x0),sfalma x0=x enddo Call Cpu_time(tf) 100 write(14,*) ' ' write(14,*)'stin EPANALIPSI:',m write(14,*),'h RIZA BRETHIKE ISH ME:',x0 print*,tf-ts 15 format (I3,2X,F13.11,2X,F13.11,2X,F13.11,2X,F15.11,2X,F15.11) 16 format (2x,a1,10X,a1,10X,a2,13X,a4,12X,a5,,9X,a6) contains real function g(x) real(8)::x g=exp(x-3.) end function real function dg(x) real(8)::x dg=exp(x-3.) end function end program DiadoxikesEpanalipseis 9
Εφαρμόζουμε τη μέθοδο της απλής αντικατάστασης με αρχική εκτίμηση x0=0 και για σφάλμα 10 7 παίρνουμε N x x0 G(x) dg(x) Σφάλμα 1 0.04978707 0.00000000 0.04978707 0.04978707 1.00000000 2 0.05232856 0.04978707 0.05232856 0.05232856 0.04856800 3 0.05246172 0.05232856 0.05246172 0.05246172 0.00253831 4 0.05246871 0.05246172 0.05246871 0.05246871 0.00013313 5 0.05246908 0.05246871 0.05246908 0.05246908 0.00000703 6 0.05246910 0.05246908 0.05246910 0.05246910 0.00000036 7 0.05246910 0.05246910 0.05246910 0.05246910 0.00000000 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλμα 0.000000 μετά από 6 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. Για την περίπτωση της 2 ης ρίζας, ο αντίστοιχος έλεγχος σύγκλισης στο διάστημα [0,0.1] μας επιστρέφει F'(4.5) e 4.5 3 = F '(4.5) 4.481689 1 = > και επομένως δεν αναμένουμε σύγκλιση. Επομένως, για την εύρεση της 2 ης ρίζας εφαρμόζουμε ένα διαφορετικό αναδρομικό τύπο του οποίου η παράγωγος στο 4.5 θα είναι μικρότερη της μονάδας και επομένως έχουμε 3 x 3 x 3 e x 3 xe e = 0 xe = e x= x= e lnx= x 3 x= lnx+ 3 και x e F'( x ) Για τον έλεγχο σύγκλισης θα πρέπει να ισχύει F'( x ) < 1. Εφαρμόζουμε τον παραπάνω αναδρομικό τύπο στο διάστημα [4.4,4.6] και υπολογίζουμε την 1 = x 1 F '(4.5) = 4.5 F '(4.5) = 0.2222 < 1 και επομένως αναμένουμε σύγκλιση. Χρησιμοποιούμε το Πρόγραμμα 3 με το νέο αναδρομικό τύπο g=log(x)+3. και dg=1./x στις παραμέτρους των function. Εφαρμόζουμε τη μέθοδο της απλής αντικατάστασης με αρχική εκτίμηση x0=4 και για σφάλμα 10 7 παίρνουμε 10
N x x0 G(x) dg(x) Σφάλμα 1 4.38629436 4.00000000 4.38629436 0.25000000 0.08806850 2 4.47848463 4.38629436 4.47848463 0.22798288 0.02058515 3 4.49928474 4.47848463 4.49928474 0.22328982 0.00462298 4 4.50391865 4.49928474 4.50391865 0.22225755 0.00102886 5 4.50494766 4.50391865 4.50494766 0.22202888 0.00022842 6 4.50517607 4.50494766 4.50517607 0.22197816 0.00005070 7 4.50522709 4.50517607 4.50522709 0.22196691 0.00001132 8 4.50523853 4.50522709 4.50523853 0.22196439 0.00000254 9 4.50524092 4.50523853 4.50524092 0.22196382 0.00000053 10 4.50524139 4.50524092 4.50524139 0.22196372 0.00000011 11 4.50524139 4.50524139 4.50524139 0.22196369 0.00000000 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλμα 0.1x10-5 μετά από 10 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. iv. Μέθοδος Απλής Αντικατάστασης με παράμετρο χαλάρωσης Ο αλγόριθμος με παράμετρο χαλάρωσης ω βελτιώνει τη σύγκλιση και έχουμε ( n + 1) ( ) ( ) x = (1 ω) x n + ωf( x n ) =G(ω, x (n) ) (*) dg Στη συγκεκριμένη περίπτωση σύγκλιση επιτυγχάνεται για < 1 dx dg Θεωρητικά το σφάλμα εξαφανίζεται για = 0 αφού dx σ (n+1) =σ (n) dg dg (για = 0 σ (n+1) =0) dx dx Στην περίπτωση αυτή μπορούμε να υπολογίσουμε το βέλτιστο δυνατό ω dg dx = 0 dg 1 (*) 1 ω + ω = 0 ωopt. =, ω>1 ή ω<1 dx 1 F ' Χρησιμοποιούμε τους αντίστοιχους αναδρομικούς τύπους του υποπροβλήματος iii και συγκεκριμένα για την πρώτη ρίζα x x 3 = e ενώ για τη δεύτερη x ln x 3 = +. Το Πρόγραμμα 4 που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω 11
Πρόγραμμα 4: Μέθοδος Απλής Αντικατάστασης με παράμετρο χαλάρωσης!*********************************************!* Program to demonstrate Diadoxikes Epanalipseis *!* me parametro xalarwsis *!* --------------------------------------------------------------- *!* Find a real root of f(x)=x*(e^-x)-(e^-3) *!********************************************* Program Wmega implicit none real(8)::x,x0,w,e,sfalma,ts,tf integer::m,i print*,'dose x0' read*,x0 w=1/(1-dy(x0)) print*, w e=1.e-07 open(12,file='wmega.txt') sfalma=1.e+06 write(12,16) 'N','x','x0', 'Y(x)','dY(x)','Sfalma' call cpu_time(ts) do while(sfalma>e) m=m+1 x=(1-w)*x0+w*y(x0) Sfalma=abs((x-x0)/x) write(12,15) m,x,x0,y(x0),dy(x0),sfalma x0=x enddo call cpu_time(tf) write(12,*) 'H epithimiti siglisi epitygxanetai se',tf-ts,'sec' print*, tf-ts 15 format (I3,2X,F11.8,2X,F14.8,2X,F12.8,2X,F11.8,2X,F11.8) 16 format (2x,a1,10X,a1,10X,a2,13X,a4,12X,a5,7X,a6) contains real function y(x) real(8)::x y=exp(x-3.) end function real function dy(x) real(8)::x dy=exp(x-3.) end function end program Wmega 12
Εφαρμόζουμε τη μέθοδο της απλής αντικατάστασης. Με αρχική εκτίμηση x0=0 βρίσκουμε ω=1.052396. Για σφάλμα 7 10 παίρνουμε N x x0 Υ(x) dυ(x) Σφάλμα 1 0.05239569 0.00000000 0.04978707 0.04978707 1.00000000 2 0.05246889 0.05239569 0.05246525 0.05246525 0.00139501 3 0.05246910 0.05246889 0.05246909 0.05246909 0.00000398 4 0.05246910 0.05246910 0.05246910 0.05246910 0.00000000 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλμα 0.398x10-5 μετά από 3 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. Ομοίως και για τη δεύτερη ρίζα με τις αλλαγές που αναφέραμε παραπάνω. Με αρχική εκτίμηση x0=4 βρίσκουμε ω=1.333333. Για σφάλμα 7 10 παίρνουμε N x x0 Υ(x) dυ(x) Σφάλμα 1 4.51505915 4.00000000 4.38629436 0.25000000 0.11407584 2 4.50487116 4.51505915 4.50741816 0.22148104 0.00226155 3 4.50525545 4.50487116 4.50515938 0.22198193 0.00008530 4 4.50524116 4.50525545 4.50524473 0.22196300 0.00000317 5 4.50524147 4.50524116 4.50524139 0.22196370 0.00000007 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλμα 0.317x10-5 μετά από 4 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. v. Μέθοδος Newton - Raphson Εξετάζουμε την σύγκλιση του σχήματος και υπολογίζουμε το λόγο f ''( x) 2 f '( x) σε ένα τυχαίο σημείο του διαστήματος [0,0.1] π.χ. για x=0. τότε θα παρατηρήσουμε ότι f ''( x) 2 f '( x ) = 1. Αυτό σημαίνει ότι η μέθοδος Newton συγκλίνει οριακά στο διάστημα [0,0.1]. Το Πρόγραμμα 5 που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω 13
Πρόγραμμα 5: Μέθοδος Newton - Raphson!*************************************!* Program to demonstrate Newton *!* --------------------------------------------------- *!* Find a real root of f(x)=x*e^(-x)-e^(-3) *!************************************* program Newton implicit none real::x,x0,error,sfalma,tf,ts integer::iter,i print*,'dose x0' read*,x0 Error=1.E-07 open(12,file='newton.txt') write(12,16) 'N','x','x0','y(x)','dy(x)','Sfalma' call cpu_time(ts) sfalma=100 do while (sfalma>error) ITER=ITER+1 x=x0-(y(x0)/dy(x0)) Sfalma=abs((x-x0)/x) write(12,15) ITER,x,x0,y(x0),dy(x0),Sfalma x0=x enddo call cpu_time(tf) write(12,*) ' ' write(12,*)'stin EPANALIPSI:',ITER write(12,*),'h RIZA BRETHIKE ISH ME:',x print*,tf-ts 15 format (I3,2X,F15.11,2X,F15.11,2X,F15.11,2X,F17.11,2X,F13.11) 16 format (2x,a1,10X,a1,15X,a2,15X,a4,15X,a5,8X,a6) contains real function y(x) real::x y=x*exp(-x)-exp(-3.) end function real function dy(x) real::x dy=exp(-x)*(1.-x) end function end program Newton 14
Εφαρμόζουμε τη μέθοδο της Newton με αρχική εκτίμηση x0=0 και για σφάλμα 10 7 παίρνουμε N x x0 Υ(x) dυ(x) Σφάλμα 1 0.04978707 0.00000000-0.0497870 1.00000000 1.00000000 2 0.05246172 0.04978707-0.0024180 0.90406299 0.05098303 3 0.05246910 0.05246172-0.0000066 0.89911020 0.00014051 4 0.05246910 0.05246910 0.00000000 0.89909661 0.00000000 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλμα 0.1405x10-3 μετά από 3 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. Ομοίως και για τη δεύτερη ρίζα. Εξετάζουμε την σύγκλιση του σχήματος και υπολογίζουμε το λόγο f ''( x) 2 f '( x) σε ένα τυχαίο σημείο του διαστήματος [4.4,4.6] π.χ. για x=4.4 τότε θα παρατηρήσουμε ότι f ''( x) 2 f '( x ) =0.352941. Αυτό σημαίνει ότι η μέθοδος Newton αναμένεται να συγκλίνει στο διάστημα [4.4,4.6]. Εφαρμόζουμε τη μέθοδο της Newton με αρχική εκτίμηση x0=0 και για σφάλμα 7 10 παίρνουμε N x x0 Υ(x) dυ(x) Σφάλμα 1 4.42723942 4.00000000 0.02347549-0.0549469 0.09650245 2 4.50311995 4.42723942 0.00310705-0.0409466 0.01685066 3 4.50523996 4.50311995 0.00008224-0.0387949 0.00047057 4 4.50524139 4.50523996 0.00000006-0.0387369 0.00000032 5 4.50524139 4.50524139 0.00000000-0.0387361 0.00000000 Ο αλγόριθμος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλμα 0.32x10-6 μετά από 4 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. vi. Μέθοδος Τέμνουσας Το Πρόγραμμα 6 που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω 15
Πρόγραμμα 6: Μέθοδος Τέμνουσας!*************************************!* Program to demonstrate Temnousa *!* --------------------------------------------------- *!* Find a real root of f(x)=x*e^(-x)-e^(-3) *!************************************* program Temnousa implicit none real(8)::x,x0,x1,error,sfalma,tf,ts integer::iter,i print*,'dose x0' read*,x0 print*,'dose x1' read*,x1 Error=1.E-07 open(12,file='temnousa.txt') write(12,16) 'N','x','x0','x1','y(x)','Sfalma' call cpu_time(ts) sfalma=100. do while (sfalma>error) ITER=ITER+1 x=x0-y(x0)/((y(x0)-y(x1))/(x0-x1)) Sfalma=abs((x-x0)/x) write(12,15) ITER,x,x0,x1,y(x0),Sfalma x0=x1 x1=x enddo call cpu_time(tf) write(12,*) ' ' write(12,*)'stin EPANALIPSI:',ITER write(12,*),'h RIZA BRETHIKE ISH ME:',x print*,tf-ts 15 format (I3,2X,F15.11,2X,F15.11,2X,F15.11,2X,F15.11,2X,F17.11) 16 format (2x,a1,10X,a1,15X,a2,15X,a2,15X,a4,14X,a6) contains real function y(x) real(8)::x y=x*exp(-x)-exp(-3d0) end function end program Temnousa 16
Εφαρμόζουμε τη μέθοδο της τέμνουσας στο διάστημα [0,0.1] και για σφάλμα 10 7 παίρνουμε N x x0 x1 y(x) Σφάλμα 1 0.05502322 0.00000000 0.10000000-0.0497870 1.00000000 2 0.05234100 0.10000000 0.05502322 0.04069667 0.91054807 3 0.05246943 0.05502322 0.05234100 0.00229038 0.04867187 4 0.05246910 0.05234100 0.05246943-0.0001151 0.00244135 5 0.05246910 0.05246943 0.05246910 0.00000030 0.00000642 6 0.05246910 0.05246910 0.05246910 0.00000000 0.00000000 Ο αλγόριθµος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλµα 0.244135x10-2 µετά από 4 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. Ομοίως για το διάστημα [4.4,4.6] και για σφάλμα 7 10 παίρνουμε N x x0 x1 y(x) Σφάλμα 1 4.50879743 4.40000000 4.60000000 0.00423323 0.02413003 2 4.50511922 4.60000000 4.50879743-0.0035486 0.02106066 3 4.50524165 4.50879743 4.50511922-0.0001375 0.00078925 4 4.50524150 4.50511922 4.50524165 0.00000474 0.00002714 5 4.50524150 4.50524165 4.50524150-0.0000001 0.00000003 Ο αλγόριθµος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλµα 0.78925x10-3 µετά από 3 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. vi. Μέθοδος Aitken Υπολογίσουμε τις ρίζες της εξίσωσης xe x 3 e = 0 κάνοντας χρήση της μεθόδου Aitken. Μετασχηματίζουμε την αρχική σχέση σε μια ισοδύναμη της μορφής x = f( x), όπως κάναμε και στην περίπτωση των απλών αντικαταστάσεων και επομένως έχουμε e xe e xe e x x e e 3 x 3 x 3 x 3 = 0 = = = x Το Πρόγραμμα 7 που χρησιμοποιήθηκε για τον εντοπισμό των ριζών παρουσιάζεται παρακάτω 17
Πρόγραμμα 7: Μέθοδος Aitken!***************************************!* Program to demonstrate Aitken-Steffensen *!* ------------------------------------------------------ *!* Find a real root of f(x)=x*e^(-x)-e^(-3) *!*************************************** program Aitken implicit none real(8)::x,x0,x1,x2,error,sfalma,tf,ts integer::iter,i print*,'dose x0' read*,x0 Error=1.E-07 open(12,file='aitken.txt') write(12,16) 'N','x','x0','y(x)','Sfalma' call cpu_time(ts) sfalma=100. do while (sfalma>error) ITER=ITER+1 x1=y(x0) x2=y(x1) x=x0-(x1-x0)**2/(x2-2*x1+x0) Sfalma=abs((x-x0)/x) write(12,15) ITER,x,x0,y(x0),Sfalma x0=x enddo call cpu_time(tf) write(12,*) ' ' write(12,*)'stin EPANALIPSI:',ITER write(12,*),'h RIZA BRETHIKE ISH ME:',x print*,tf-ts 15 format (I3,2X,F15.11,2X,F15.11,2X,F15.11,2X,F17.11) 16 format (2x,a1,10X,a1,15X,a2,15X,a4,14X,a6) contains real function y(x) real(8)::x y=exp(x-3.) end function end program Aitken 18
Εφαρμόζουμε τη μέθοδο Aitken με αρχική εκτίμηση x0=0 και για σφάλμα παίρνουμε 10 7 N x x0 y(x) Σφάλμα 1 0.05246528 0.00000000 0.04978707 1.00000000 2 0.05246910 0.05246528 0.05246890 0.00007282 3 0.05246910 0.05246910 0.05246910 0.00000001 Ο αλγόριθµος συγκλίνει στη ρίζα: 0.5246916x10-1 µε σφάλµα 0.7282x10-4 µετά από 2 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. Για την εύρεση της 2 ης ρίζας καλούμαστε να αναπτύξουμε ένα διαφορετικό αναδρομικό x 3 τύπο, αφού ο x = e δεν παρουσιάζει σύγκλιση. Δουλεύουμε με τον ίδιο ακριβώς τρόπο που παρουσιάσαμε στη μέθοδο των απλών αντικαταστάσεων και επομένως 3 x 3 x 3 e x 3 xe e = 0 xe = e x= x= e lnx= x 3 x= lnx+ 3 x e Εφαρμόζουμε τη μέθοδο Aitken με αρχική εκτίμηση x0=4 και για σφάλμα παίρνουμε 10 7 N x x0 y(x) Σφάλμα 1 4.50738271 4.00000000 4.38629436 0.11256704 2 4.50524112 4.50738271 4.50571680 0.00047536 3 4.50524139 4.50524112 4.50524139 0.00000006 Ο αλγόριθµος συγκλίνει στη ρίζα: 0.4505241x10 1 µε σφάλµα 0.47536x10-3 µετά από 2 επαναλήψεις και ο απαιτούμενος χρόνος είναι μικρότερος από 10-6 sec. 19
22 20 18 16 14 12 10 8 6 4 2 0 N - R Aitken 1η ρίζα 2η ρίζα Το παραπάνω γράφημα παρουσιάζει μια συγκεντρωτική εικόνα των διαφόρων μεθόδων που χρησιμοποιήθηκαν για τον υπολογισμό των ριζών της εξίσωσης 3 e = 0. Τα αποτελέσματα παρουσιάζουν τον αριθμό διχοτομήσεων, γραμμικών παρεμβολών και επαναλήψεων ο οποίος κυμαίνεται από 20 μέχρι 2. Σημειώνεται ότι το κριτήριο σύγκλισης ικανοποιείται σε όλες τις εφαρμοζόμενες επαναληπτικές μεθόδους, ενώ η επαναληπτική διαδικασία ολοκληρώνεται όταν ικανοποιείται το κριτήριο τερματισμού. Αντίστοιχα, στη μέθοδο της διχοτόμησης ο αριθμός των διχοτομήσεων που απαιτείται για το προσδοκόμενο αποτέλεσμα είναι από την αρχή γνωστός. xe x 20