ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ - ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ, 3 Ο ΕΞΑΜΗΝΟ, 2011-2012 ΔΙΔΑΣΚΩΝ: Δρ Ιωάννης Αθ. Σταυράκης 1 η Σειρά Ασκήσεων 26.10.2011 Άσκηση 1. Να μετατραπεί ο αριθμός (6,28125) στο δυαδικό σύστημα. Να επαληθευτεί το αποτέλεσμα, που προέκυψε. Απάντηση: Για την μετατροπή του αριθμού (6,28125) στο δυαδικό σύστημα εργαζόμαστε ξεχωριστά για το ακέραιο και ξεχωριστά για το δεκαδικό μέρος. Ακέραιο μέρος: Η μετατροπή από το δεκαδικό σύστημα στο δυαδικό σύστημα βασίζεται στον αλγόριθμο της διαίρεσης. Πιο συγκεκριμένα: d = 6mod2 = 0 d = 6 0 mod2 = 3mod2 = 1 2 d = 3 1 2 mod2 = 1mod2 1 < 2 d = 1 Επομένως, (6) = (110) Τα παραπάνω συνοψίζονται στον πίνακα που ακολουθεί: i y b y d -1 6 : 2 = 3 + 0 0 3 : 2 = 1 + 1 1 1 : 2 = 0 + 1 Δεκαδικό μέρος: Η μετατροπή από το δεκαδικό σύστημα στο δυαδικό βασίζεται σε διαδοχικούς πολλαπλασιασμούς. Πιο συγκεκριμένα, 1
d = 0,28125 2 = 0,5625 = 0 d = (0,5625 0) 2 = 1,125 = 1 d = (1,125 1) 2 = 0,25 = 0 d = (0,25 0) 2 = 0,5 = 0 d = (0,5 0) 2 = 1,0 = 1 Επομένως, (0,28125) (0,01001) Τα παραπάνω συνοψίζονται στον πίνακα που ακολουθεί: i y b y d 0 0,28125 2 = 0,5625 + 0 1 0,5625 2 = 0,125 + 1 2 0,125 2 = 0,25 + 0 3 0,25 2 = 0,5 + 0 4 0,5 2 = 0 + 1 Τελικά προκύπτει, (6,28125) (110,01001). Μετατρέποντας τον αριθμό στο δεκαδικό σύστημα προκύπτει: (110,01001) = 1 2 + 1 2 + 0 2 + 0 2 + 1 2 + 0 2 + 0 2 + 0 2 = = (6,28125) κι επομένως επαληθεύεται το αποτέλεσμα. Η μετατροπή του αριθμού (6,28125) από το δεκαδικό σύστημα στο δυαδικό γίνεται στο Mathematica δίνοντας: BaseForm[6.28125,2] και προκύπτει: 110.01001 2 Ανάλογη έκφραση είναι και η: RealDigits[6.28125,2] Άσκηση 2. Να βρεθούν οι αριθμοί, που βρίσκονται «κοντά» στον αριθμό 0,004 με ακρίβεια τριών (3) σημαντικών ψηφίων. Απάντηση: Σύμφωνα με τον ορισμό, δύο αριθμοί συμφωνούν σε k σημαντικά ψηφία αν για το απόλυτο σχετικό σφάλμα ισχύει: 2
δ = 5 10 x 0. Στην περίπτωσή μας x = 0,004 και k = 3. Επομένως: x 0,004 0,004 5 10 x 0,004 1 5 10 5 10 x 0,004 1 5 10 0,995 x 1,005 0,00398 x 0,00402 0,004 Άσκηση 3. Αν δύο αριθμοί x και y έχουν μέγιστα απόλυτα σχετικά σφάλματα δ = 0,2 και δ = 0,3, αντίστοιχα, να υπολογιστεί το μέγιστο απόλυτο σχετικό σφάλμα του αριθμού z = x y. Απάντηση: Σύμφωνα με τα θεωρήματα 2.3 και 2.4 του βιβλίου «Αριθμητική Ανάλυση» του Μ. Βραχάτη (σελ. 50 και 51), για το απόλυτο σχετικό σφάλμα του αριθμού z = x y ισχύει: δ = 3δ + δ 3 δ + δ = = 3 0,2 + 0,3 = 0,9 Άσκηση 4. Στο παρακάτω σχήμα απεικονίζεται ταλαντωτής ενός βαθμού ελευθερίας. F x k(x) Μελετώντας τον μονοβάθμιο ταλαντωτή υπό στατική φόρτιση προκύπτει η εξίσωση: k(x) x = F, όπου: x η μετατόπιση, k(x) η μη γραμμική στιβαρότητα του ελατηρίου συναρτήσει της μετατόπισης και ίση με k(x) = 1 + x και F η στατική φόρτιση. Αν F = 0,3: Α. Να γίνει η γραφική παράσταση της παραπάνω εξίσωσης στο διάστημα [ 1,5, 1,5]. Πόσες λύσεις υπάρχουν στο δοθέν διάστημα; Β. Να υπολογιστούν οι ρίζες της εξίσωσης με τη χρήση του Mathematica και να επιβεβαιωθεί ότι όλες οι ρίζες βρίσκονται στο διάστημα [ 1,5, 1,5] (υπόδειξη: να γίνει η χρήση της εντολής NSolve). Γ. Για τα διαστήματα [ 1,0, 0,5], [ 0,5, 0,0] και [1,0, 1,5], να αποδειχθεί ότι υπάρχει μία και μοναδική λύση της παραπάνω εξίσωσης για το κάθε διάστημα ξεχωριστά και να γραφτούν αλγόριθμοι σε Fortran για τον υπολογισμό της ρίζας με ακρίβεια 7 σημαντικών ψηφίων, εφαρμόζοντας τις μεθόδους: 3
1. Διχοτόμησης, 2. Γραμμικής παρεμβολής, 3. Newton-Raphson (αφού αποδειχτεί ότι συγκλίνει) για το κάθε διάστημα, αντίστοιχα. (Τα παραδοτέα θα είναι το πρόγραμμα για κάθε μέθοδο και τα αποτελέσματα των επαναλήψεων) Απάντηση: Αντικαθιστώντας την σχέση της μη γραμμικής στιβαρότητας συναρτήσει της μετατόπισης, καθώς και την τιμή της στατικής φόρτισης, η εξίσωση παίρνει την μορφή: f(x) = x x 0,3 = 0 Α. Χρησιμοποιώντας το Mathematica και δίνοντας την εντολή: Plot[x x 0.3,{x,-1.5, 1.5}] προκύπτει η γραφική παράσταση: 1.5 1.0 0.5 1.5 1.0 0.5 0.5 1.0 1.5 0.5 1.0 1.5 2.0 Με τη βοήθεια της παραπάνω γραφικής παράστασης, παρατηρείται ότι η εξίσωση στο διάστημα [ 1,5, 1,5] έχει τρεις (3) λύσεις. Β. Η επίλυση στο Mathematica γίνεται δίνοντας: NSolve[x 3 x == 0.3,x] και προκύπτουν: {x 0.786483} {x 0.338936} {x.12542} Επομένως, και οι τρεις λύσεις βρίσκονται στο διάστημα [ 1,5, 1,5]. Γ. Η προς επίλυση συνάρτηση είναι η: f(x) = x x 0,3 = 0 4
Η συνάρτηση είναι συνεχής και η πρώτη παράγωγός της είναι η: f (x) = 3x 1 Ελέγχεται το κριτήριο Bolzano για κάθε διάστημα ξεχωριστά: Για το διάστημα [ 1,0, 0,5] ισχύει ότι: f( 1,0) = 0,3 και f( 0,5) = 0,075 Ισχύει ότι: f( 1,0) f( 0,5) < 0 Επομένως, στο διάστημα [ 1,0, 0,5] θα υπάρχει τουλάχιστον μία λύση. Η πρώτη παράγωγος στο διάστημα [ 1,0, 0,5] είναι γνησίως φθίνουσα. Επομένως, η εξίσωση θα έχει μία και μοναδική λύση στο διάστημα [ 1,0, 0,5]. Για το διάστημα [ 0,5, 0,0] ισχύει ότι: και f( 0,5) = 0,075 f(0,0) = 0,3 Ισχύει ότι: f( 0,5) f(0,0) < 0 Επομένως, στο διάστημα [ 0,5, 0,0] θα υπάρχει τουλάχιστον μία λύση. Η πρώτη παράγωγος στο διάστημα [ 0,5, 0,0] είναι γνησίως φθίνουσα. Επομένως, η εξίσωση θα έχει μία και μοναδική λύση στο διάστημα [ 0,5, 0,0]. Για το διάστημα [1,0, 1,5] ισχύει ότι: και f(1,0) = 0,3 f(1,5) = 1,575 Ισχύει ότι: f(1,0) f(1,5) < 0 Επομένως, στο διάστημα [1,0, 1,5] θα υπάρχει τουλάχιστον μία λύση. Η πρώτη παράγωγος στο διάστημα [1,0, 1,5] είναι γνησίως αύξουσα. Επομένως, η εξίσωση θα έχει μία και μοναδική λύση στο διάστημα [1,0, 1,5]. Στη συνέχεια φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για τις διάφορες μεθόδους. Για κάθε μέθοδο, ο κώδικας γράφτηκε σε περιβάλλον linux (Ubuntu 10.4 LTS) και μεταγλωττίστηκε με τον compiler gfortran έκδοση 4.4.3. Με βάση τα δεδομένα της άσκησης, σαν κριτήριο τερματισμού της επαναληπτικής διαδικασίας για κάθε μέθοδο επιλέγεται: 5
x x 5 10 x 1. Μέθοδος Διχοτόμησης Ο πηγαίος κώδικας είναι: program dixotomisi implicit none double precision xl,xr,xm,xold,err,f,tol integer i,maxiter tol=5.0d0*1.0d-7 maxiter=100 xl=-1.0d0 xr=-0.5d0 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 6
double precision function f(x) double precision x f=x*x*x-x-0.3d0 return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Dixotomisi i x error ---------------------------------- 1-0.7500000E+00 0.3333333E+00 2-0.8750000E+00 0.1428571E+00 3-0.8125000E+00 0.7692308E-01 4-0.7812500E+00 0.4000000E-01 5-0.7968750E+00 0.1960784E-01 6-0.7890625E+00 0.9900990E-02 7-0.7851562E+00 0.4975124E-02 8-0.7871094E+00 0.2481390E-02 9-0.7861328E+00 0.1242236E-02 10-0.7866211E+00 0.6207325E-03 11-0.7863770E+00 0.3104626E-03 12-0.7864990E+00 0.1552072E-03 13-0.7864380E+00 0.7760962E-04 14-0.7864685E+00 0.3880331E-04 15-0.7864838E+00 0.1940128E-04 16-0.7864761E+00 0.9700732E-05 17-0.7864799E+00 0.4850343E-05 18-0.7864819E+00 0.2425165E-05 19-0.7864828E+00 0.1212581E-05 20-0.7864823E+00 0.6062910E-06 21-0.7864826E+00 0.3031454E-06 Επομένως, στην 21 η επανάληψη προκύπτει η ρίζα της εξίσωσης 0,7864826. 2. Μέθοδος Γραμμικής Παρεμβολής Ο πηγαίος κώδικας είναι: program paremvoli implicit none double precision xl,xr,xm,xold,err,f,tol integer i,maxiter tol=5.0d0*1.0d-7 maxiter=100 xl=-0.5d0 xr=0.0d0 xold=xl 7
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=x*x*x-x-0.3d0 return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Paremvoli i x error ---------------------------------- 1-0.4000000E+00 0.2500000E+00 2-0.3571429E+00 0.1200000E+00 3-0.3438596E+00 0.3862974E-01 4-0.3402284E+00 0.1067290E-01 5-0.3392726E+00 0.2817179E-02 6-0.3390236E+00 0.7344817E-03 7-0.3389589E+00 0.1908706E-03 8-0.3389421E+00 0.4955991E-04 9-0.3389378E+00 0.1286550E-04 10-0.3389366E+00 0.3339628E-05 11-0.3389363E+00 0.8668883E-06 8
12-0.3389363E+00 0.2250228E-06 Επομένως, στην 12 η επανάληψη προκύπτει η ρίζα της εξίσωσης 0,3389363. 3. Μέθοδος Newton-Raphson Θα εξεταστεί αν ισχύει το θεώρημα σύγκλισης της μεθόδου. Πιο συγκεκριμένα: Η συνάρτηση f(x) = x x 0,3 είναι ορισμένη και δύο φορές συνεχώς παραγωγίσιμη στο διάστημα [1, 1,5]. Ικανοποιείται το κριτήριο Bolzano (βλ. σελ. 5). Η f (x) = 3x 1 είναι διάφορη του μηδενός για κάθε x [1, 1,5]. H f (x) = 6x διατηρεί σταθερό πρόσημο στο [1, 1,5]. Για x = 1 η f (x) ελαχιστοποιείται στο [1, 1,5] και ισχύει: f(1) f = 0,3 = 0,15 < 1,5 1 = 0,5 (1) 2 Επομένως, μιας και ισχύουν όλα τα παραπάνω, το επαναληπτικό σχήμα της μεθόδου Newton- Raphson θα συγκλίνει στη λύση, που υπάρχει στο διάστημα [1, 1,5]. Ο πηγαίος κώδικας είναι: program newton_rapshon implicit none double precision xl,xr,xnew,xold,err,f,df,tol integer i,maxiter tol= 5.0d0*1.0d-7 maxiter=100 xl=1.0d0 xr=1.5d0 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') 9
100 format(i3,2x,e14.7,2x,e14.7) close(15) stop double precision function f(x) double precision x f=x*x*x-x-0.3d0 return double precision function df(x) double precision x df=3.0d0*x*x-1.0d0 return Τα αποτελέσματα της επαναληπτικής διαδικασίας είναι: Newton-Raphson i x error ---------------------------------- 1 0.1140678E+01 0.9583952E-01 2 0.1125692E+01 0.1331268E-01 3 0.1125419E+01 0.2426812E-03 4 0.1125419E+01 0.7994296E-07 Επομένως, στην 4 η επανάληψη προκύπτει η ρίζα της εξίσωσης 1,125419. 10