ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ - ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ, 3 Ο ΕΞΑΜΗΝΟ, 2010-2011 ΔΙΔΑΣΚΩΝ: Δρ Ιωάννης Αθ. Σταυράκης 1 η Σειρά Ασκήσεων 12.10.2010 Άσκηση 1. Να μετατρέψετε τον αριθμό μητρώου σας, αφού τον διαιρέσετε με το 100, στο δυαδικό σύστημα. Να επαληθεύει το αποτέλεσμα που προέκυψε με το Mathematica. Απάντηση: Ο αριθμός μητρώου είναι ο 3063. Διαιρώντας με το 100 προκύπτει ο αριθμός 30,63 ή (30,63), οποίος θα μετατραπεί στο δυαδικό σύστημα. Εργαζόμαστε ξεχωριστά για το ακέραιο και ξεχωριστά για το δεκαδικό μέρος. Ακέραιο μέρος: Η μετατροπή από το δεκαδικό σύστημα στο δυαδικό σύστημα βασίζεται στον αλγόριθμο της διαίρεσης. Πιο συγκεκριμένα: d = 30mod2 = 0 d = 30 0 mod2 = 15mod2 = 1 2 d = 15 1 mod2 = 7mod2 = 1 2 d = 7 1 mod2 = 3mod2 = 1 2 d = 3 1 2 mod2 = 1mod2 1 < 2 d = 1 Επομένως, (30) = (11110) Τα παραπάνω συνοψίζονται στον πίνακα που ακολουθεί: i y b y d -1 30 : 2 = 15 + 0 0 15 : 2 = 7 + 1 1 7 : 2 = 3 + 1 2 3 : 2 = 1 + 1 3 1 : 2 = 0 + 1 Δεκαδικό μέρος: Η μετατροπή από το δεκαδικό σύστημα στο δυαδικό βασίζεται σε διαδοχικούς πολλαπλασιασμούς. Πιο συγκεκριμένα, 1
d = 0,63 2 = 1,26 = 1 d = (1,26 1) 2 = 0,52 = 0 d = (0,52 0) 2 = 1,04 = 1 d = (1,04 1) 2 = 0,08 = 0 d = (0,08 0) 2 = 0,16 = 0 d = (0,16 0) 2 = 0,32 = 0 d = (0,32 0) 2 = 0,64 = 0 d = (0,64 0) 2 = 1,28 = 1 d = (1,28 1) 2 = 0,56 = 0 d = (0,56 0) 2 = 1,12 = 1 d = (1,12 1) 2 = 0,24 = 0 d = (0,24 0) 2 = 0,48 = 0 d = (0,48 0) 2 = 0,96 = 0 d = (0,96 0) 2 = 1,92 = 1 d = (1,92 1) 2 = 1,84 = 1 d = (1,84 1) 2 = 1,68 = 1 Οι πράξεις συνεχίζονται και επιλέγουμε να σταματήσουμε στα 16 ψηφία. Επομένως, (0,63) (0,1010000101000111) Τα παραπάνω συνοψίζονται στον πίνακα που ακολουθεί: 2
i y b y d 0 0,63 2 = 0,26 + 1 1 0,26 2 = 0,52 + 0 2 0,52 2 = 0,04 + 1 3 0,04 2 = 0,08 + 0 4 0,08 2 = 0,16 + 0 5 0,16 2 = 0,32 + 0 6 0,32 2 = 0,64 + 0 7 0,64 2 = 0,28 + 1 8 0,28 2 = 0,56 + 0 9 0,56 2 = 0,12 + 1 10 0,12 2 = 0,24 + 0 11 0,24 2 = 0,48 + 0 12 0,48 2 = 0,96 + 0 13 0,96 2 = 0,92 + 1 14 0,92 2 = 0,84 + 1 15 0,84 2 = 0,68 + 1 Τελικά προκύπτει, (30,63) (11110,1010000101000111). Η μετατροπή του αριθμού (30,63) από το δεκαδικό σύστημα στο δυαδικό γίνεται στο Mathematica δίνοντας: BaseForm[30.63,2] και προκύπτει: 11110.1010000101001 2 Ανάλογη έκφραση είναι και η: RealDigits[30.63,2] Άσκηση 2. Δίνεται ο αριθμός 3,14159265. Να βρεθεί το σφάλμα: Α. αποκοπής, όταν κρατάμε 5 σημαντικά ψηφία, Β. στρογγυλοποίησης, όταν κρατάμε 5 σημαντικά ψηφία. Απάντηση: Α. Με 5 σημαντικά ψηφία και μετά την αποκοπή ο αριθμός γίνεται 3,1415 και το σφάλμα είναι: ε = 3,1415 3,14159265 = 0,9625 10. Α. Με 5 σημαντικά ψηφία και μετά την στρογγυλοποίηση ο αριθμός γίνεται 3,1416 και το σφάλμα είναι: ε = 3,1416 3,14159265 = 0,0735 10. 3
Άσκηση 3. Δίνεται η εξίσωση: x + 2x 1 = 0. Α. Δοκιμάζοντας τις τιμές 0,1,2, να βρεθεί ένα αρχικό διάστημα [a, b] μήκους 1, μέσα στο οποίο υπάρχει λύση και να αποδειχθεί ότι η λύση είναι μοναδική. Β. Να υπολογιστεί η ρίζα της εξίσωσης με τη χρήση του Mathematica. Γ. Να γραφτεί πρόγραμμα σε Fortran για τον υπολογισμό της ρίζας με ακρίβεια 6 σημαντικών ψηφίων, εφαρμόζοντας τις μεθόδους: 1. Μεταβαλλόμενης Χορδής, 2. Newton-Raphson, αφού αποδειχτεί ότι συγκλίνει, 3. Τέμνουσας. (Τα παραδοτέα θα είναι το πρόγραμμα για κάθε μέθοδο και τα αποτελέσματα των επαναλήψεων) Απάντηση: Α. Αρχικά, θα εξεταστεί αν ισχύει το κριτήριο Bolzano στο διάστημα [0,1] για τη συνάρτηση f(x) = x + 2x 1 Πιο συγκεκριμένα: f(0) = 1 και f(1) = 2 Ισχύει ότι: f(0) f(1) < 0 Επομένως, στο διάστημα [0,1] θα υπάρχει τουλάχιστον μία λύση. Παραγωγίζοντας τη συνάρτηση προκύπτει: f (x) = 3x + 2 Η πρώτη παράγωγος στο διάστημα [0,1] είναι γνησίως αύξουσα. Επομένως, η συνάρτηση θα έχει μία και μοναδική λύση στο διάστημα [0,1]. Β. Η επίλυση στο Mathematica βρίσκεται δίνοντας: FindRoot[x + 2x 1,{x,0}] και προκύπτει: {x 0.4533977}. Επομένως, η ρίζα που αναζητάμε στο διάστημα [0,1] είναι η 0,4533977. Γ. Στη συνέχεια φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για τις διάφορες μεθόδους. Για κάθε μέθοδο, ο κώδικας γράφτηκε σε περιβάλλον linux (Ubuntu 10.4 LTS) και μεταγλωττίστηκε με τον compiler gfortran έκδοση 4.4.3. Με βάση τα δεδομένα της άσκησης, σαν κριτήριο τερματισμού της επαναληπτικής διαδικασίας για κάθε μέθοδο επιλέγεται: x x 5 10 x 4
1. Μέθοδος Μεταβαλλόμενης Χορδής Ο πηγαίος κώδικας είναι: program metavxordi implicit none double precision an,bn,l,r,xn1,xn,err,f,tol integer i,maxiter tol=5.0d0*1.0d-6 maxiter=100 an=0.0d0 bn=1.0d0 l=f(an) r=f(bn) xn=an open(unit=15,file="xordi.txt") write(15,*) ' Metavalomenh Xordh' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xn1=bn-r*(bn-an)/(r-l) err=dabs((xn1-xn)/xn1) if ( err.le.tol) then write(15,100) i,xn1,err stop else if ( f(an)*f(xn1).lt.0.0d0 ) then bn=xn1 r=f(xn1) if ( f(xn)*f(xn1).gt.0.0d0 ) then l=l/2.0d0 if else an=xn1 l=f(xn1) if ( f(xn)*f(xn1).gt.0.0d0 ) then r=r/2.0d0 if if xn=xn1 write(15,100) i,xn1,err do 50 format(2x,'i',9x,'x',13x,'error') 5
100 format(i3,2x,e14.7,2x,e14.7) close(15) stop double precision function f(x) double precision x f=x*x*x+2.0d0*x-1.0d0 return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Metavalomenh Xordh i x error ---------------------------------- 1.3333333E+00.1000000E+01 2.4857143E+00.3137255E+00 3.4514298E+00.7594641E-01 4.4533644E+00.4267171E-02 5.4534297E+00.1440662E-03 6.4533977E+00.7072648E-04 7.4533977E+00.1222640E-08 Επομένως, στην 7 η επανάληψη προκύπτει η ρίζα της εξίσωσης 0,4533977. 2. Μέθοδος Newton-Raphson Θα εξεταστεί αν ισχύει το θεώρημα σύγκλισης της μεθόδου. Πιο συγκεκριμένα: Η συνάρτηση f(x) = x + 2x 1 είναι ορισμένη και δύο φορές συνεχώς παραγωγίσιμη στο διάστημα [0,1]. Ικανοποιείται το κριτήριο Bolzano (βλ. σελ. 4). Η f (x) = 3x + 2 είναι διάφορη του μηδενός για κάθε x [0,1]. H f (x) = 6x διατηρεί σταθερό πρόσημο στο [0,1]. Για x = 0 η f (x) ελαχιστοποιείται στο [0,1] και ισχύει: f(0) f = 1 = 0,5 < 1 0 = 1 (0) 2 Επομένως, μιας και ισχύουν όλα τα παραπάνω, το επαναληπτικό σχήμα της μεθόδου Newton- Raphson θα συγκλίνει στη λύση, που υπάρχει στο διάστημα [0,1]. Ο πηγαίος κώδικας είναι: program newton_rapshon implicit none 6
double precision xl,xr,xnew,xold,err,f,df,tol integer i,maxiter tol= 5.0d0*1.0d-6 maxiter=100 xl=0.0d0 xr=1.0d0 xold=(xl+xr)/2.0d0 open(unit=15,file="newton.txt") write(15,*) ' Newton-Raphson' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xnew=xold-f(xold)/df(xold) err=dabs((xnew-xold)/xnew) if ( err.le.tol) then write(15,100) i,xnew,err exit if xold=xnew write(15,100) i,xnew,err do 50 format(2x,'i',9x,'x',13x,'error') 100 format(i3,2x,e14.7,2x,e14.7) close(15) stop double precision function f(x) double precision x f=x*x*x+2.0d0*x-1.0d0 return double precision function df(x) double precision x df=3.0d0*x*x+2.0d0 return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Newton-Raphson i x error ---------------------------------- 1.4545455E+00.1000000E+00 7
2.4533983E+00.2530044E-02 3.4533977E+00.1511173E-05 Επομένως, στην 3 η επανάληψη προκύπτει η ρίζα της εξίσωσης 0,4533977. 3. Μέθοδος της Τέμνουσας Ο πηγαίος κώδικας είναι: program temnousa implicit none double precision xl,xr,xnew,xold0,xold1,err,f,tol integer i,maxiter tol=5.0d0*1.0d-6 maxiter=100 xl=0.0d0 xr=1.0d0 xold1=xl xold0=(xl+xr)/2.0d0 open(unit=15,file="temnousa.txt") write(15,*) ' Temnousa' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xnew=xold0-f(xold0)/((f(xold0)-f(xold1))/(xold0-xold1)) err=dabs((xnew-xold0)/xnew) if ( err.le.tol) then write(15,100) i,xnew,err exit if xold1=xold0 xold0=xnew write(15,100) i,xnew,err do 50 format(2x,'i',9x,'x',13x,'error') 100 format(i3,2x,e14.7,2x,e14.7) close(15) stop double precision function f(x) double precision x f=x*x*x+2.0d0*x-1.0d0 return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: 8
Temnousa i x error ---------------------------------- 1.4444444E+00.1250000E+00 2.4531792E+00.1927438E-01 3.4533987E+00.4840672E-03 4.4533977E+00.2238158E-05 Επομένως, στην 4 η επανάληψη προκύπτει η ρίζα της εξίσωσης 0,4533977. 9