ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ, 3 Ο ΕΞΑΜΗΝΟ, 2008-2009 ΔΙΔΑΣΚΩΝ: Δρ Ιωάννης Αθ. Σταυράκης 14.10.2008 Να μετατραπεί ο αριθμός στο δυαδικό σύστημα.! " Ο αριθμός μετατρέπεται αρχικά στο δεκαδικό σύστημα: Στη συνέχεια γίνεται η μετατροπή του αριθμού στο δυαδικό σύστημα. Εργαζόμαστε ξεχωριστά για το ακέραιο και ξεχωριστά για το δεκαδικό μέρος. Ακέραιο μέρος: Η μετατροπή από το δεκαδικό σύστημα στο δυαδικό σύστημα βασίζεται στον αλγόριθμο της διαίρεσης. Πιο συγκεκριμένα: Επομένως, Τα παραπάνω συνοψίζονται στον πίνακα που ακολουθεί:
-1 369 2 184 1 0 184 2 92 0 1 92 2 46 0 2 46 2 23 0 3 23 2 11 1 4 11 2 5 1 5 5 2 2 1 6 2 2 1 0 7 1 2 0 1 Δεκαδικό μέρος: Η μετατροπή από το δεκαδικό σύστημα στο δυαδικό βασίζεται σε διαδοχικούς πολλαπλασιασμούς. Πιο συγκεκριμένα, Επομένως, Τα παραπάνω συνοψίζονται στον πίνακα που ακολουθεί: 0 0,75 2 0,5 1 1 0,5 2 0,0 1 Τελικά προκύπτει,. Η μετατροπή του αριθμού Mathematica δίνοντας: και προκύπτει: Ανάλογη έκφραση είναι και η: από το δεκαδικό σύστημα στο δυαδικό γίνεται στο BaseForm[369.75,2] 1.0111000111 2 2 8 RealDigits[369.75,2]
Να στρογγυλοποιηθούν οι παρακάτω αριθμοί: σε τέσσερα σημαντικά ψηφία.! " Στο Mathematica η στρογγυλοποίηση σε συγκεκριμένο αριθμό σημαντικών ψηφίων γίνεται δίνοντας: NumberForm[-17.0045,4] Να στρογγυλοποιηθούν οι παρακάτω αριθμοί: σε τρία σημαντικά ψηφία και σε τρία δεκαδικά ψηφία.! " Όπως και στην προηγούμενη άσκηση, στο Mathematica η στρογγυλοποίηση σε συγκεκριμένο αριθμό σημαντικών ψηφίων γίνεται δίνοντας: NumberForm[-93917.0045,3]
Στο Mathematica η στρογγυλοποίηση σε συγκεκριμένο αριθμό δεκαδικών ψηφίων γίνεται δίνοντας: NumberForm[-93917.0045,{8,3}] όπου ο αριθμός 8 δηλώνει τον αριθμό των σημαντικών ψηφίων, ενώ ο αριθμός 3 δηλώνει τον αριθμό των δεκαδικών ψηφίων. Παρατήρηση: Στο βιβλίο «Αριθμητική Ανάλυση» του Βραχάτη στις σελίδες 41 και 42 αναφέρει για τη διαδικασία στρογγυλοποίησης σε k δεκαδικά ψηφία Σύμφωνα με το παραπάνω, η στρογγυλοποίηση του αριθμού σε 3 δεκαδικά ψηφία θα είναι ίση με. Όμως, στο Mathematica δίνοντας NumberForm[-93917.0045,{8,3}]προκύπτει -93917.005. Οι ακριβείς ρίζες της δευτεροβάθμιας εξίσωσης: είναι και. Έστω ότι οι υπολογισμοί γίνονται σε υποθετικό υπολογιστή με ακρίβεια πέντε σημαντικών ψηφίων, ο οποίος έχει τη δυνατότητα να αποθηκεύει αριθμούς και με στρογγυλοποίηση και με αποκοπή: Να προσδιοριστούν οι ρίζες της εξίσωσης χρησιμοποιώντας τον τύπο της διακρίνουσας και να υπολογισθούν τα απόλυτα σχετικά σφάλματα. Να προταθεί εναλλακτικός τρόπος προσδιορισμού των ριζών και να υπολογιστούν επίσης τα απόλυτα σχετικά σφάλματα. Σε κάθε περίπτωση να σχολιαστούν τα αποτελέσματα.! " Οι ρίζες μιας δευτεροβάθμιας εξίσωσης με βάση τον τύπο της διακρίνουσας προκύπτουν: Με βάση την υπόθεση ότι οι υπολογισμοί γίνονται με ακρίβεια πέντε σημαντικών ψηφίων θα έχουμε:.
Ανάλογα με τον τρόπο αποθήκευσης αριθμών στον υποθετικό υπολογιστή διακρίνουμε δύο περιπτώσεις: Στρογγυλοποίηση: Επομένως προκύπτουν οι ρίζες και Τα απόλυτα σχετικά σφάλματα προκύπτουν ίσα με: και Αποκοπή: Επομένως προκύπτουν οι ρίζες και Τα απόλυτα σχετικά σφάλματα προκύπτουν ίσα με: και
Παρατηρούμε πως και για τη στρογγυλοποίηση και για την αποκοπή το απόλυτο σχετικό σφάλμα για την 1 η ρίζα είναι σημαντικά μεγάλο, ενώ για τη 2 η ρίζα είναι αντίστοιχο με την ακρίβεια του υποθετικού υπολογιστή. Αυτό συμβαίνει γιατί ο όρος είναι κατά πολύ μεγαλύτερος από τον όρο 4, με αποτέλεσμα στην εύρεση της 1 ης ρίζας να οδηγούμαστε στην περίπτωση της αφαίρεσης δύο περίπου ίσων αριθμών, του και του. Για να αποφευχθεί η αφαίρεση δύο περίπου ίσων αριθμών στον υπολογισμό της 1 ης ρίζας εργαζόμαστε ως εξής: Επομένως για την 1 η ρίζα, ανάλογα με τον τρόπο αποθήκευσης των αριθμών, προκύπτει: Στρογγυλοποίηση: Το απόλυτο σχετικό σφάλμα είναι ίσο με: Αποκοπή: Το απόλυτο σχετικό σφάλμα είναι ίσο με: Και για τις δύο περιπτώσεις ο εναλλακτικός τρόπος υπολογισμού της 1 ης ρίζας δίνει τη σωστή τιμή της ρίζας της δευτεροβάθμιας εξίσωσης, όπως εξάλλου αναμενόταν.
Αν εφαρμοζόταν ο εναλλακτικός τρόπος για τον υπολογισμό και της 2 ης ρίζας θα προέκυπτε: Οπότε, ανάλογα με τον τρόπο αποθήκευσης των αριθμών, προκύπτει: Στρογγυλοποίηση: Το απόλυτο σχετικό σφάλμα σε αυτήν την περίπτωση δεν υπολογίζεται. Αποκοπή: Το απόλυτο σχετικό σφάλμα είναι ίσο με: Ο εναλλακτικός τρόπος υπολογισμού δεν ενδείκνυται για τη 2 η ρίζα, γιατί για αυτή την περίπτωση στον παρανομαστή γίνεται αφαίρεση δύο περίπου ίσων αριθμών.
Δίνεται η εξίσωση: Να αποδειχτεί ότι στο διάστημα η εξίσωση έχει ρίζα και ότι είναι μοναδική. Να γραφτεί πρόγραμμα υπολογισμού της ρίζας εφαρμόζοντας τις μεθόδους: Διχοτόμησης Γραμμικής Παρεμβολής Αντικατάστασης με αναγωγικούς τύπους Newton-Raphson Τέμνουσας. Η στάθμη ακρίβειας στο κριτήριο τερματισμού για κάθε μέθοδο να είναι τουλάχιστον ίση με. (Τα παραδοτέα θα είναι το πρόγραμμα για κάθε μέθοδο και τα αποτελέσματα των επαναλήψεων.)! " Θα εξεταστεί αν ισχύει το κριτήριο Bolzano στο διάστημα για τη συνάρτηση Πιο συγκεκριμένα: και Ισχύει ότι: Επομένως, θα υπάρχει τουλάχιστον μία ρίζα στο διάστημα. Παραγωγίζοντας τη συνάρτηση προκύπτει: Η πρώτη παράγωγος στο διάστημα έχει αρνητικό πρόσημο, δηλαδή είναι γνησίως φθίνουσα. Επομένως, η συνάρτηση θα έχει μία και μοναδική ρίζα στο διάστημα. Προτού γίνει η αριθμητική επίλυση της εξίσωσης μέσω προγράμματος σε Fortran για τις διάφορες μεθόδους, θα επιλύσουμε την εξίσωση στο Mathematica. Η επίλυση για ακρίβεια 7 σημαντικών ψηφίων γίνεται δίνοντας: FindRoot[2-x-Log[x],{x,1},WorkingPrecision 7] και προκύπτει: {x 1.557146}. Επομένως, η ρίζα που αναζητάμε στο διάστημα είναι η.
Στη συνέχεια φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για τις διάφορες μεθόδους. Για κάθε μέθοδο, ο κώδικας γράφτηκε σε περιβάλλον Mandrake Linux 10.1 και μεταγλωττίστηκε με τον compiler g77 έκδοση 3.4.1. Επίσης, σαν κριτήριο τερματισμού της επαναληπτικής διαδικασίας για κάθε μέθοδο επιλέχτηκε: Μέθοδος Διχοτόμησης Ο πηγαίος κώδικας είναι: program dixotomisi implicit none double precision xl,xr,xm,xold,err,f,tol integer i,maxiter tol=1.0d-7 maxiter=100 xl=1.0d0 xr=2.0d0 xold=xl open(unit=15,file="dixotomisi.txt") write(15,*) ' Dixotomisi' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xm=(xl+xr)/2.0d0 err=dabs((xm-xold)/xm) if ( err.le.tol) then write(15,100) i,xm,err exit else if ( f(xl)*f(xm).lt.0.0d0 ) then xr=xm else xl=xm if xold=xm write(15,100) i,xm,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=2.0d0-x-dlog(x) return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Dixotomisi i x error ---------------------------------- 1 0.1500000E+01 0.3333333E+00 2 0.1750000E+01 0.1428571E+00 3 0.1625000E+01 0.7692308E-01 4 0.1562500E+01 0.4000000E-01 5 0.1531250E+01 0.2040816E-01 6 0.1546875E+01 0.1010101E-01 7 0.1554688E+01 0.5025126E-02 8 0.1558594E+01 0.2506266E-02 9 0.1556641E+01 0.1254705E-02 10 0.1557617E+01 0.6269592E-03 11 0.1557129E+01 0.3135779E-03 12 0.1557373E+01 0.1567644E-03 13 0.1557251E+01 0.7838834E-04 14 0.1557190E+01 0.3919570E-04 15 0.1557159E+01 0.1959824E-04 16 0.1557144E+01 0.9799214E-05 17 0.1557152E+01 0.4899583E-05 18 0.1557148E+01 0.2449798E-05 19 0.1557146E+01 0.1224900E-05 20 0.1557145E+01 0.6124505E-06 21 0.1557146E+01 0.3062252E-06 22 0.1557146E+01 0.1531126E-06 23 0.1557146E+01 0.7655628E-07 Επομένως, στην 23 η επανάληψη προκύπτει η ρίζα της εξίσωσης.
Μέθοδος Γραμμικής Παρεμβολής Ο πηγαίος κώδικας είναι: program paremvoli implicit none double precision xl,xr,xm,xold,err,f,tol integer i,maxiter tol=1.0d-7 maxiter=100 xl=1.0d0 xr=2.0d0 xold=xl open(unit=15,file="paremvoli.txt") write(15,*) ' Paremvoli' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xm=xr-f(xr)*(xr-xl)/(f(xr)-f(xl)) err=dabs((xm-xold)/xm) if ( err.le.tol) then write(15,100) i,xm,err exit else if ( f(xl)*f(xm).lt.0.0d0 ) then xr=xm else xl=xm if xold=xm write(15,100) i,xm,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=2.0d0-x-dlog(x) return
Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Paremvoli i x error ---------------------------------- 1 0.1590616E+01 0.3713128E+00 2 0.1559965E+01 0.1964859E-01 3 0.1557385E+01 0.1656492E-02 4 0.1557166E+01 0.1407874E-03 5 0.1557147E+01 0.1197392E-04 6 0.1557146E+01 0.1018438E-05 7 0.1557146E+01 0.8662329E-07 Επομένως, στην 7 η επανάληψη προκύπτει η ρίζα της εξίσωσης. Μέθοδος Αντικατάστασης με Αναγωγικούς Τύπους Για καθένα από τους αναγωγικούς τύπους θα εξεταστεί η σύγκλισή του στο διάστημα αν ικανοποιείται η συνθήκη., δηλαδή 1 ος Αναγωγικός Τύπος: Ελέγχοντας στο μέσο του διαστήματος προκύπτει: Συνεπώς, ο 1 ος αναγωγικός τύπος θα συγκλίνει στο διάστημα. 2 ος Αναγωγικός Τύπος: Ελέγχοντας στο μέσο του διαστήματος προκύπτει: Συνεπώς, ο 2 ος αναγωγικός τύπος θα αποκλίνει στο διάστημα. Παρατήρηση: Εύκολα αποδεικνύεται για τους δύο παραπάνω αναγωγικούς τύπους για ποιες τιμές του θα επιτευχθεί σύγκλιση. Πιο συγκεκριμένα, για τον 1 ο αναγωγικό τύπο ισχύει: Επομένως, στο διάστημα η επαναληπτική διαδικασία θα συγκλίνει στη ρίζα. Τέλος, για τον 2 ο αναγωγικό τύπο ισχύει: Επομένως, στο διάστημα θα υπάρχει απόκλιση. 3 ος Αναγωγικός Τύπος: Ελέγχοντας στο μέσο του διαστήματος προκύπτει:
Συνεπώς, ο 3 ος αναγωγικός τύπος θα συγκλίνει στο διάστημα. Ο πηγαίος κώδικας για τον 1 ο αναγωγικό τύπο είναι: program anagogikos_1 implicit none double precision xl,xr,xnew,xold,err,g1,tol integer i,maxiter tol=1.0d-7 maxiter=100 xl=1.0d0 xr=2.0d0 xold=(xl+xr)/2.0d0 open(unit=15,file="anag01.txt") write(15,*) ' Anagogikos 1' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xnew=g1(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 g1(x) double precision x
g1=-dlog(x)+2 return Τα αποτελέσματα της επαναληπτικής διαδικασίας για τον 1 ο αναγωγικό τύπο είναι: Anagogikos 1 i x error ---------------------------------- 1 0.1594535E+01 0.5928681E-01 2 0.1533418E+01 0.3985670E-01 3 0.1572501E+01 0.2485399E-01 4 0.1547333E+01 0.1626545E-01 5 0.1563467E+01 0.1031975E-01 6 0.1553094E+01 0.6679160E-02 7 0.1559751E+01 0.4267959E-02 8 0.1555474E+01 0.2749704E-02 9 0.1558220E+01 0.1762223E-02 10 0.1556456E+01 0.1133201E-02 11 0.1557589E+01 0.7271236E-03 12 0.1556861E+01 0.4672145E-03 13 0.1557328E+01 0.2999402E-03 14 0.1557028E+01 0.1926652E-03 15 0.1557221E+01 0.1237118E-03 16 0.1557097E+01 0.7945521E-04 17 0.1557177E+01 0.5102315E-04 18 0.1557126E+01 0.3276836E-04 19 0.1557158E+01 0.2104334E-04 20 0.1557137E+01 0.1351426E-04 21 0.1557151E+01 0.8678782E-05 22 0.1557142E+01 0.5573556E-05 23 0.1557148E+01 0.3579327E-05 24 0.1557144E+01 0.2298652E-05 25 0.1557146E+01 0.1476194E-05 26 0.1557145E+01 0.9480136E-06 27 0.1557146E+01 0.6088146E-06 28 0.1557145E+01 0.3909813E-06 29 0.1557146E+01 0.2510884E-06 30 0.1557146E+01 0.1612492E-06 31 0.1557146E+01 0.1035543E-06 32 0.1557146E+01 0.6650267E-07 Επομένως, στην 32 η επανάληψη προκύπτει η ρίζα της εξίσωσης. Ομοίως, ο πηγαίος κώδικας για τον 3 ο αναγωγικό τύπο είναι: program anagogikos_3 implicit none double precision xl,xr,xnew,xold,err,g3,tol integer i,maxiter tol=1.0d-7 maxiter=100 xl=1.0d0
xr=2.0d0 xold=(xl+xr)/2.0d0 open(unit=15,file="anag01.txt") write(15,*) ' Anagogikos 1' write(15,50) write(15,*) '----------------------------------' do i=1,maxiter xnew=g3(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 g3(x) double precision x g3= x-(2.0d0-x-dlog(x))/(-1.0d0-1.0d0/x) return Τα αποτελέσματα της επαναληπτικής διαδικασίας για τον 3 ο αναγωγικό τύπο είναι: Anagogikos 3 i x error ---------------------------------- 1 0.1556721E+01 0.3643616E-01 2 0.1557146E+01 0.2727049E-03 3 0.1557146E+01 0.1454649E-07 Επομένως, στην 3 η επανάληψη προκύπτει η ρίζα της εξίσωσης.
Μέθοδος Newton-Raphson Θα εξεταστεί αν ισχύει το θεώρημα σύγκλισης της μεθόδου. Πιο συγκεκριμένα: Η συνάρτηση είναι ορισμένη και δύο φορές συνεχώς παραγωγίσιμη στο διάστημα. Ικανοποιείται το κριτήριο Bolzano. Η είναι διάφορη του μηδενός για κάθε. H διατηρεί σταθερό πρόσημο στο. Για η ελαχιστοποιείται στο και ισχύει: Επομένως, μιας και ισχύουν όλα τα παραπάνω, το επαναληπτικό σχήμα της μεθόδου Newton- Raphson θα συγκλίνει στη λύση που υπάρχει στο διάστημα. Ο πηγαίος κώδικας είναι: program newton_rapshon implicit none double precision xl,xr,xnew,xold,err,f,df,tol integer i,maxiter tol=1.0d-7 maxiter=100 xl=1.0d0 xr=2.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=2.0d0-x-dlog(x) return double precision function df(x) double precision x df=-1.0d0-1.0d0/x return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Newton-Raphson i x error ---------------------------------- 1 0.1556721E+01 0.3643616E-01 2 0.1557146E+01 0.2727049E-03 3 0.1557146E+01 0.1454649E-07 Επομένως, στην 3 η επανάληψη προκύπτει η ρίζα της εξίσωσης. Μέθοδος της Τέμνουσας Ο πηγαίος κώδικας είναι: program temnousa implicit none double precision xl,xr,xnew,xold0,xold1,err,f,tol integer i,maxiter tol=1.0d-7 maxiter=100 xl=1.0d0 xr=2.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=2.0d0-x-dlog(x) return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Temnousa i x error ---------------------------------- 1 0.1552202E+01 0.3363118E-01 2 0.1557109E+01 0.3151386E-02 3 0.1557146E+01 0.2320247E-04 4 0.1557146E+01 0.1443283E-07 Επομένως, στην 4 η επανάληψη προκύπτει η ρίζα της εξίσωσης.