ΑΡΙΘΜΗΤΙΚΕΣ ΜΕΘΟ ΟΙ, 2012-2013, 5 Ο ΕΞΑΜΗΝΟ Απαντήσεις ΕΡΓΑΣΙΑΣ #1: ΡΙΖΕΣ ΕΞΙΣΩΣΕΩΝ και ΕΠΙΛΥΣΗ ΣΥΣΤΗΜΑΤΩΝ ΕΞΙΣΩΣΕΩΝ Ηµεροµηνία παράδοσης 30-10-2012 Επιµέλεια απαντήσεων: Ιωάννης Λυχναρόπουλος ΑΣΚΗΣΗ 1 Να υπολογισθεί µε τις µεθόδους α) διχοτόµησης, β) απλών επαναλήψεων και γ) Newton ο ειδικός όγκος του n-βουτανίου σε δεδοµένη θερµοκρασία και πίεση µε την καταστατική εξίσωση πραγµατικών αερίων Beattie Bridgeman: PV = RT + β/v + γ/(v 2 ) + δ/(v 3 ) (1) όπου β = RTB A Rc/(T 2 ), γ = -RTBb + aa RBc/(T 2 ), δ = RBbc/(T 2 ) και A, B, a, b, c καθορίζονται πειραµατικά για κάθε αέριο. T = 425 K P = 1, 10, 20, 30, 40 atm A = 17.7940, B = 0.2462, a = 0.12161, b = 0.09423, c = 3.500.000 Οι µονάδες των σταθερών είναι P = atm, V = lt/mol, T = Kelvin και R = 0.08206 (lt.atm)/(mol.k) Να σχολιασθούν τα αποτελέσµατα σε σχέση µε τη σύγκλιση και την αποτελεσµατικότητα των τριών διαφορετικών µεθόδων. Λύση Με το Mathematica κάνουµε τις γραφικές παραστάσεις της εξίσωσης (1) για κάθε περίπτωση της πίεσης P µε σκοπό να προσδιορίσουµε περίπου το διάστηµα εντός του οποίου βρίσκονται οι ρίζες της (1): T=425; P=40; A=17.7940; B=0.2462; a=0.12161; b=0.09423; c=3500000; R=0.08206; beta=r T B - A -R c / T 2 ; gama=-r T B b + a A - R B c/t 2 ; delta=r B b c/t 2 ; Plot[ R T + beta/v+gama/v 2 +delta/v 3 -P V,{V,0.1,1},AxesOrigin {0,0}] Στα γραφήµατα που ακολουθούν ο οριζόντιος άξονας είναι το V και ο κάθετος το P. 1
60 50 40 30 20 10 10 20 30 40 P=1 atm: Βλέπουµε ότι η ρίζα βρίσκεται ανάµεσα στο 30 και 40. 60 40 20-20 2 4 6 8 10-40 -60 P=10 atm: Βλέπουµε ότι η ρίζα βρίσκεται ανάµεσα στο 2 και 4. 60 40 20-20 1 2 3 4 5-40 -60 P=20 atm: Βλέπουµε ότι η ρίζα βρίσκεται ανάµεσα στο 1 και 2. 2
40 20 0.5 1.0 1.5 2.0-20 P=30 atm: Βλέπουµε ότι η ρίζα βρίσκεται ανάµεσα στο 0.5 και 1. 10 5 0.2 0.4 0.6 0.8 1.0-5 -10-15 P=40 atm: Βλέπουµε ότι η ρίζα βρίσκεται ανάµεσα στο 0.2 και 0.4. Α. Μέθοδος ιχοτόµησης Πρόγραµµα FORTRAN που επιλύει µε την µέθοδο της διχοτόµησης το συγκεκριµένο πρόβληµα: program askhsh1_bisection implicit none real::t,p(5),aa,bb,a,b,c,beta,gama,delta,r,x,xl,xr integer::k T=425 P=(/1,10,20,30,40/) R=0.08206 AA=17.7940 BB=0.2462 a=0.12161 b=0.09423 c=3500000 beta=r*t*bb-aa-r*c/t**2 gama=-r*t*bb*b+a*aa-r*bb*c/t**2 delta=r*bb*b*c/t**2!print*,beta,gama,delta print*, 'Enter k=1-5 for item of the Pressure array' 3
read*,k print*, ' Enter xl:' read*, xl print*, ' Enter xr:' read*, xr x=bisection(xl,xr,1e-4) print*,'root Found: ', x contains real function bisection(xl,xr,err) real::xl,xr,err real::xm integer::i,maxi=10000 if (f(xl)*f(xr) > 0) then print*, 'Not valid values for xl and xr' stop else open(10,file='results.txt') i=0 do while (i<maxi) i=i+1 xm=(xl+xr)/2. write(10,'(i3,",",3(f9.6,","),3(e12.3,:,","))') i,xl,xm,xr,f(xl),f(xm),f(xr) write(*,'(i3,2x,3(f9.6,2x),3(e12.3,2x))') i,xl,xm,xr,f(xl),f(xm),f(xr) if (abs(f(xm))<err) then bisection=xm return else if (f(xl)*f(xm)<0) then xr=xm else xl=xm end if end if close(10) end if end function real function f(x) real::x f= R*T+beta/x+gama/x**2+delta/x**3-P(k)*x end function end program 4
Πίνακες αποτελεσµάτων µε τερµατισµό διχοτοµήσεων όταν το απόλυτο σφάλµα είναι µικρότερο του 10-4 P=1, 30< V<40: n xl xm xr f(xl) f(xm) f(xr) 1 30 35 40 4.52E+00-4.32E-01-5.39E+00 2 30 32.5 35 4.52E+00 2.04E+00-4.32E-01 3 32.5 33.75 35 2.04E+00 8.06E-01-4.32E-01 4 33.75 34.375 35 8.06E-01 1.87E-01-4.32E-01 5 34.375 34.6875 35 1.87E-01-1.22E-01-4.32E-01 6 34.375 34.53125 34.6875 1.87E-01 3.24E-02-1.22E-01 7 34.53125 34.60938 34.6875 3.24E-02-4.51E-02-1.22E-01 8 34.53125 34.57031 34.60938 3.24E-02-6.35E-03-4.51E-02 9 34.53125 34.55078 34.57031 3.24E-02 1.30E-02-6.35E-03 10 34.55078 34.56055 34.57031 1.30E-02 3.33E-03-6.35E-03 11 34.56055 34.56543 34.57031 3.33E-03-1.51E-03-6.35E-03 12 34.56055 34.56299 34.56543 3.33E-03 9.12E-04-1.51E-03 13 34.56299 34.56421 34.56543 9.12E-04-2.98E-04-1.51E-03 14 34.56299 34.5636 34.56421 9.12E-04 3.07E-04-2.98E-04 15 34.5636 34.5639 34.56421 3.07E-04 4.84E-06-2.98E-04 Μετά από 15 διχοτοµήσεις προκύπτει V =34.5639 lt/mol P=10, 2<V<4: n xl xm xr f(xl) f(xm) f(xr) 1 2 3 4 9.72E+00 1.38E+00-7.76E+00 2 3 3.5 4 1.38E+00-3.13E+00-7.76E+00 3 3 3.25 3.5 1.38E+00-8.55E-01-3.13E+00 4 3 3.125 3.25 1.38E+00 2.70E-01-8.55E-01 5 3.125 3.1875 3.25 2.70E-01-2.91E-01-8.55E-01 6 3.125 3.15625 3.1875 2.70E-01-1.02E-02-2.91E-01 7 3.125 3.140625 3.15625 2.70E-01 1.30E-01-1.02E-02 8 3.140625 3.148438 3.15625 1.30E-01 5.99E-02-1.02E-02 9 3.148438 3.152344 3.15625 5.99E-02 2.49E-02-1.02E-02 10 3.152344 3.154297 3.15625 2.49E-02 7.35E-03-1.02E-02 11 3.154297 3.155273 3.15625 7.35E-03-1.42E-03-1.02E-02 12 3.154297 3.154785 3.155273 7.35E-03 2.96E-03-1.42E-03 13 3.154785 3.155029 3.155273 2.96E-03 7.71E-04-1.42E-03 14 3.155029 3.155151 3.155273 7.71E-04-3.25E-04-1.42E-03 15 3.155029 3.15509 3.155151 7.71E-04 2.23E-04-3.25E-04 16 3.15509 3.155121 3.155151 2.23E-04-5.13E-05-3.25E-04 Μετά από 16 διχοτοµήσεις προκύπτει V =3.155121 lt/mol 5
P=20, 1<V<2: n xl xm xr f(xl) f(xm) f(xr) 1 1 1.5 2 5.08E+00-1.88E+00-1.03E+01 2 1 1.25 1.5 5.08E+00 1.87E+00-1.88E+00 3 1.25 1.375 1.5 1.87E+00 4.63E-02-1.88E+00 4 1.375 1.4375 1.5 4.63E-02-9.07E-01-1.88E+00 5 1.375 1.40625 1.4375 4.63E-02-4.27E-01-9.07E-01 6 1.375 1.390625 1.40625 4.63E-02-1.90E-01-4.27E-01 7 1.375 1.382813 1.390625 4.63E-02-7.15E-02-1.90E-01 8 1.375 1.378906 1.382813 4.63E-02-1.26E-02-7.15E-02 9 1.375 1.376953 1.378906 4.63E-02 1.69E-02-1.26E-02 10 1.376953 1.37793 1.378906 1.69E-02 2.18E-03-1.26E-02 11 1.37793 1.378418 1.378906 2.18E-03-5.19E-03-1.26E-02 12 1.37793 1.378174 1.378418 2.18E-03-1.50E-03-5.19E-03 13 1.37793 1.378052 1.378174 2.18E-03 3.38E-04-1.50E-03 14 1.378052 1.378113 1.378174 3.38E-04-5.82E-04-1.50E-03 15 1.378052 1.378082 1.378113 3.38E-04-1.22E-04-5.82E-04 16 1.378052 1.378067 1.378082 3.38E-04 1.08E-04-1.22E-04 17 1.378067 1.378075 1.378082 1.08E-04-6.75E-06-1.22E-04 Μετά από 17 διχοτοµήσεις προκύπτει V =1.378075 lt/mol P=30, 0.5<V<1: n xl xm xr f(xl) f(xm) f(xr) 1 0.5 0.75 1 2.43E+00-2.21E-01-4.92E+00 2 0.5 0.625 0.75 2.43E+00 1.47E+00-2.21E-01 3 0.625 0.6875 0.75 1.47E+00 6.96E-01-2.21E-01 4 0.6875 0.71875 0.75 6.96E-01 2.54E-01-2.21E-01 5 0.71875 0.734375 0.75 2.54E-01 2.04E-02-2.21E-01 6 0.734375 0.742188 0.75 2.04E-02-9.96E-02-2.21E-01 7 0.734375 0.738281 0.742188 2.04E-02-3.93E-02-9.96E-02 8 0.734375 0.736328 0.738281 2.04E-02-9.43E-03-3.93E-02 9 0.734375 0.735352 0.736328 2.04E-02 5.49E-03-9.43E-03 10 0.735352 0.73584 0.736328 5.49E-03-1.97E-03-9.43E-03 11 0.735352 0.735596 0.73584 5.49E-03 1.76E-03-1.97E-03 12 0.735596 0.735718 0.73584 1.76E-03-1.01E-04-1.97E-03 13 0.735596 0.735657 0.735718 1.76E-03 8.32E-04-1.01E-04 14 0.735657 0.735687 0.735718 8.32E-04 3.65E-04-1.01E-04 15 0.735687 0.735703 0.735718 3.65E-04 1.32E-04-1.01E-04 16 0.735703 0.73571 0.735718 1.32E-04 1.60E-05-1.01E-04 Μετά από 16 διχοτοµήσεις προκύπτει V =0.73571 lt/mol 6
P=40, 0.2<V<0.4: n xl xm xr f(xl) f(xm) f(xr) 1 0.2 0.3 0.4 1.58E+00-1.05E+00-1.52E+00 2 0.2 0.25 0.3 1.58E+00-5.41E-01-1.05E+00 3 0.2 0.225 0.25 1.58E+00 1.53E-01-5.41E-01 4 0.225 0.2375 0.25 1.53E-01-2.56E-01-5.41E-01 5 0.225 0.23125 0.2375 1.53E-01-6.99E-02-2.56E-01 6 0.225 0.228125 0.23125 1.53E-01 3.67E-02-6.99E-02 7 0.228125 0.229687 0.23125 3.67E-02-1.78E-02-6.99E-02 8 0.228125 0.228906 0.229687 3.67E-02 9.14E-03-1.78E-02 9 0.228906 0.229297 0.229687 9.14E-03-4.40E-03-1.78E-02 10 0.228906 0.229102 0.229297 9.14E-03 2.35E-03-4.40E-03 11 0.229102 0.229199 0.229297 2.35E-03-1.03E-03-4.40E-03 12 0.229102 0.22915 0.229199 2.35E-03 6.60E-04-1.03E-03 13 0.22915 0.229175 0.229199 6.60E-04-1.88E-04-1.03E-03 14 0.22915 0.229163 0.229175 6.60E-04 2.35E-04-1.88E-04 15 0.229163 0.229169 0.229175 2.35E-04 2.61E-05-1.88E-04 Μετά από 15 διχοτοµήσεις προκύπτει V =0.229169 lt/mol B. Μέθοδος Απλών Επαναλήψεων Γράφουµε την αρχική εξίσωση PV = RT + β/v + γ/(v 2 ) + δ/(v 3 ) στη µορφή ( β γ [ ] 2 δ [ ] 3 ) V = RT+ / V + / V + / V / P= f ( V ), ( β 2 γ 3 δ 4 ) f '( V ) = / V + 2 / V + 3 / V / P Επαναληπτικός αλγόριθµος: 2 3 ( β γ δ ) ( n 1) ( n) ( n) ( n) + V = RT+ / V + / V + / V / P= f ( V ), n= 1, 2,... Πρόγραµµα FORTRAN που επιλύει µε την µέθοδο των απλών επαναλήψεων το συγκεκριµένο πρόβληµα: program Askhsh1_2!Aplh epanaliptikh implicit none real::t,p(5),aa,bb,a,b,c,beta,gama,delta,r,x0 integer::k T=425 P=(/1,10,20,30,40/) R=0.08206 AA=17.7940 BB=0.2462 a=0.12161 b=0.09423 c=3500000 7
beta=r*t*bb-aa-r*c/t**2 gama=-r*t*bb*b+a*aa-r*bb*c/t**2 delta=r*bb*b*c/t**2!print*,beta,gama,delta print*, 'Enter k=1-5 for item of the Pressure array' read*,k print*, 'Enter initial guess x0:' read*, x0 call aplh_epanaliptikh(x0,1e-6) contains subroutine aplh_epanaliptikh(x0,err) real,intent(in)::x0,err real::x,abserr,xold integer:: i,maxi=10000 open(10,file='results2.txt') abserr = 100. i=0 x=x0 write(10,'(i3,",",f12.4,",",3(e15.4,:,","))') 0,x,F(x),DER(x),abserr print '(i3,2x,f12.4,2x,3(e15.4,2x))', 0,x,F(x),DER(x),abserr do while ((i<maxi).and.(abserr>=err)) i=i+1 xold=x if (DER(x)>=1.) then print*,'no convergence. Derivate of current x is >= 1' stop else x = F(xold) abserr = abs(x - xold) write(10,'(i3,",",f12.4,",",3(e15.4,:,","))') i,x,f(x),der(x),abserr print '(i3,2x,f12.4,2x,3(e15.4,2x))', i,x,f(x),der(x),abserr end if if (abserr<err) then print*, 'The root within the prescribed error limit is:',x print*, 'The percentage relative error =',err print*,'the number of iteration performed before achieving' print*,'acceptable error limit is:',i else print*, 'The root is not reached within the error limit after prescribed number of iteration.' print*, 'The approximate root =',xold print*, 'The percentage relative error =',err endif close(10) end subroutine real function f(v) real::v f= (R*T+beta/V+gama/V**2+delta/V**3)/P(k) end function 8
real function der(v) real::v der=((-3*delta)/v**4 - (2*gama)/V**3 - beta/v**2)/p(k) end function end program Πίνακες αποτελεσµάτων: ( 0) P=1 (αρχική εκτίµηση V =28) Αριθµός επανάληψης V f(v ) f'(v ) Απόλυτο σφάλµα 0 28 3.45E+01 1.37E-02 1.00E+02 1 34.4911 3.46E+01 9.03E-03 6.49E+00 2 34.5633 3.46E+01 8.99E-03 7.22E-02 3 34.5639 3.46E+01 8.99E-03 6.52E-04 4 34.5639 3.46E+01 8.99E-03 3.82E-06 5 34.5639 3.46E+01 8.99E-03 0.00E+00 ( 0) P=10 (αρχική εκτίµηση V =2) Αριθµός επανάληψης V f(v ) f'(v ) Απόλυτο σφάλµα 0 2 2.97E+00 2.45E-01 1.00E+02 1 2.9722 3.14E+00 1.15E-01 9.72E-01 2 3.1353 3.15E+00 1.04E-01 1.63E-01 3 3.1531 3.16E+00 1.02E-01 1.78E-02 4 3.1549 3.16E+00 1.02E-01 1.83E-03 5 3.1551 3.16E+00 1.02E-01 1.87E-04 6 3.1551 3.16E+00 1.02E-01 1.91E-05 7 3.1551 3.16E+00 1.02E-01 1.91E-06 8 3.1551 3.16E+00 1.02E-01 2.38E-07 ( 0) P=20 (αρχική εκτίµηση V =1) Αριθµός επανάληψης V f(v ) f'(v ) Απόλυτο σφάλµα 0 1 1.25E+00 4.38E-01 1.00E+02 1 1.2539 1.35E+00 2.92E-01 2.54E-01 2 1.3448 1.37E+00 2.57E-01 9.09E-02 3 1.3697 1.38E+00 2.49E-01 2.49E-02 4 1.376 1.38E+00 2.47E-01 6.30E-03 5 1.3776 1.38E+00 2.46E-01 1.56E-03 6 1.3779 1.38E+00 2.46E-01 3.85E-04 7 1.378 1.38E+00 2.46E-01 9.47E-05 8 1.3781 1.38E+00 2.46E-01 2.33E-05 9 1.3781 1.38E+00 2.46E-01 5.72E-06 10 1.3781 1.38E+00 2.46E-01 1.43E-06 11 1.3781 1.38E+00 2.46E-01 3.58E-07 9
( 0) P=30 (αρχική εκτίµηση V =1) Αριθµός επανάληψης V f(v ) f'(v ) Απόλυτο σφάλµα 0 1 8.36E-01 2.92E-01 1.00E+02 1 0.8359 7.80E-01 3.98E-01 1.64E-01 2 0.78 7.57E-01 4.46E-01 5.59E-02 3 0.7565 7.46E-01 4.69E-01 2.36E-02 4 0.7457 7.41E-01 4.81E-01 1.08E-02 5 0.7405 7.38E-01 4.86E-01 5.12E-03 6 0.7381 7.37E-01 4.89E-01 2.47E-03 7 0.7369 7.36E-01 4.90E-01 1.21E-03 8 0.7363 7.36E-01 4.91E-01 5.90E-04 9 0.736 7.36E-01 4.91E-01 2.89E-04 10 0.7358 7.36E-01 4.91E-01 1.42E-04 11 0.7358 7.36E-01 4.91E-01 6.96E-05 12 0.7357 7.36E-01 4.91E-01 3.42E-05 13 0.7357 7.36E-01 4.91E-01 1.68E-05 14 0.7357 7.36E-01 4.91E-01 8.23E-06 15 0.7357 7.36E-01 4.91E-01 4.05E-06 16 0.7357 7.36E-01 4.91E-01 2.03E-06 17 0.7357 7.36E-01 4.91E-01 9.54E-07 ( 0) P=40 (αρχική εκτίµηση V =0.5) Αριθµός επανάληψης V f(v ) f'(v ) Απόλυτο σφάλµα 0 0.5 4.36E-01 6.50E-01 1.00E+02 1 0.4357 3.90E-01 7.63E-01 6.43E-02 2 0.3904 3.54E-01 8.43E-01 4.54E-02 3 0.3539 3.22E-01 8.92E-01 3.64E-02 4 0.3222 2.94E-01 9.04E-01 3.17E-02 5 0.2937 2.68E-01 8.56E-01 2.86E-02 6 0.2684 2.48E-01 7.23E-01 2.53E-02 7 0.2481 2.36E-01 5.01E-01 2.02E-02 8 0.2355 2.31E-01 2.80E-01 1.26E-02 9 0.2305 2.29E-01 1.68E-01 5.01E-03 10 0.2294 2.29E-01 1.40E-01 1.13E-03 11 0.2292 2.29E-01 1.36E-01 1.73E-04 12 0.2292 2.29E-01 1.35E-01 2.39E-05 13 0.2292 2.29E-01 1.35E-01 3.29E-06 14 0.2292 2.29E-01 1.35E-01 3.73E-07 10
3. Μέθοδος Νewton Γράφουµε την αρχική εξίσωση PV = RT + β/v + γ/(v 2 ) + δ/(v 3 ) στη µορφή 2 3 f ( V ) = RT+ β / V + γ / V + δ / V PV = 0 µε 2 3 4 f '( V ) = β / V 2 γ / V 3 δ / V P ( n+ 1 ) ( n) f ( V ) Αλγόριθµος Newton: V = V ( ), n= n 0,1,... f '( V ) Πρόγραµµα FORTRAN που επιλύει την εξίσωση µε την µέθοδο Newton: program Askshsh1_3!Newton. implicit none real::t,p(5),aa,bb,a,b,c,beta,gama,delta,r real::x,x0,xnew,rel,err,xold integer i,maxi,k T=425 P=(/1,10,20,30,40/) R=0.08206 AA=17.7940 BB=0.2462 a=0.12161 b=0.09423 c=3500000 beta=r*t*bb-aa-r*c/t**2 gama=-r*t*bb*b+a*aa-r*bb*c/t**2 delta=r*bb*b*c/t**2 print*,beta,gama,delta print*, 'Enter k=1-5 for item of the Pressure array' read*,k ( n) print*, 'Enter initial guess x0:' read*, x0 rel=1e-6 maxi=10000 err = 100. i = 1 xold=x0 print*, 0,xold,F(xold),DER(xold),err do while ((i/=maxi).and.(err>=rel).and.(der(xold)/=0.)) xnew = xold - (F(xold)/DER(xold)) if (xnew/=0.) then err = abs((xnew - xold)/xnew) * 100. endif print*, i,xnew,f(xnew),der(xnew),err xold = xnew i = i + 1 11
if ((err<rel).and.(der(xold)/=0.)) then print*, 'The root within the prescribed error limit is:',xold print*, 'The percentage relative error =',err print*,'the number of iteration performed before achieving' print*,'acceptable error limit is:',i - 1 elseif((err>rel).and.(der(xold)/=0.)) then print*, 'The root is not reached within the error limit after prescribed number of iteration.' print*, 'The approximate root =',xold print*, 'The percentage relative error =',err elseif(der(xold)==0.) then print*, 'Newton''s method fails...derivative equal to zero.' endif contains real function f(v) real::v f= R*T+beta/V+gama/V**2+delta/V**3-P(k)*V end function real function der(v) real::v der=-p(k) - (3*delta)/V**4 - (2*gama)/V**3 - beta/v**2 end function end program Πίνακες αποτελεσµάτων (οι αρχικές εκτιµήσεις είναι οι ίδιες µε αυτές της µεθόδου των απλών επαναλήψεων): ( 0) P=1 (αρχική εκτίµηση V =28) Αριθµός x f(x) f'(x) επανάληψης Απόλυτο σφάλµα 0 28 6.49E+00-9.86E-01 1.00E+02 1 34.5812-1.71E-02-9.91E-01 6.58E+00 2 34.5639 1.06E-06-9.91E-01 1.73E-02 3 34.5639 1.06E-06-9.91E-01 0.00E+00 ( 0) P=10 (αρχική εκτίµηση V =2) Αριθµός x f(x) f'(x) επανάληψης Απόλυτο σφάλµα 0 2 9.72E+00-7.55E+00 1.00E+02 1 3.288-1.20E+00-9.06E+00 1.29E+00 2 3.1557-5.07E-03-8.98E+00 1.32E-01 3 3.1551 5.84E-08-8.98E+00 5.65E-04 4 3.1551 5.84E-08-8.98E+00 0.00E+00 ( 0) P=20 (αρχική εκτίµηση V =1) Αριθµός x f(x) f'(x) επανάληψης Απόλυτο σφάλµα 0 1 5.08E+00-1.12E+01 1.00E+02 1 1.4518-1.13E+00-1.55E+01 4.52E-01 12
2 1.3791-1.57E-02-1.51E+01 7.27E-02 3 1.3781-4.18E-06-1.51E+01 1.04E-03 4 1.3781 2.98E-07-1.51E+01 2.38E-07 ( 0) P=30 (αρχική εκτίµηση V =1) Αριθµός x f(x) f'(x) επανάληψης Απόλυτο σφάλµα 0 1-4.92E+00-2.12E+01 1.00E+02 1 0.7683-5.14E-01-1.63E+01 2.32E-01 2 0.7367-1.51E-02-1.53E+01 3.16E-02 3 0.7357-1.57E-05-1.53E+01 9.88E-04 4 0.7357 1.99E-07-1.53E+01 1.01E-06 5 0.7357 1.99E-07-1.53E+01 0.00E+00 ( 0) P=40 (αρχική εκτίµηση V =0.5) Αριθµός x f(x) f'(x) επανάληψης Απόλυτο σφάλµα 0 0.5-2.57E+00-1.40E+01 1.00E+02 1 0.3162-1.12E+00-4.02E+00 1.84E-01 2 0.0377 1.12E+03-8.35E+04 2.79E-01 3 0.051 4.69E+02-2.67E+04 1.34E-02 4 0.0686 1.94E+02-8.72E+03 1.76E-02 5 0.0908 7.84E+01-2.93E+03 2.22E-02 6 0.1176 3.07E+01-1.02E+03 2.68E-02 7 0.1476 1.15E+01-3.77E+02 3.00E-02 8 0.1782 4.02E+00-1.50E+02 3.06E-02 9 0.2049 1.22E+00-6.97E+01 2.67E-02 10 0.2224 2.61E-01-4.21E+01 1.75E-02 11 0.2285 2.19E-02-3.52E+01 6.19E-03 12 0.2292 1.97E-04-3.46E+01 6.22E-04 13 0.2292-7.23E-07-3.46E+01 5.68E-06 14 0.2292 1.78E-06-3.46E+01 1.49E-08 Συγκριτικά έχουµε για όλες τις µεθόδους: Αριθµός διχοτοµήσεων/επαναλήψεων P ιχοτόµησης Απλή Επαναληπτική Newton 1 15 5 3 10 16 8 4 20 17 11 4 30 16 17 5 40 15 14 14 Με εξαίρεση την περίπτωση P=40 η µέθοδος Newton είναι η πλέον υπολογιστικά αποδοτική. 13
ΑΣΚΗΣΗ 2 Να λυθεί µε τις µεθόδους απαλοιφή Gauss, παραγοντοποίηση LU, Jacobi, Gauss-Seidel και S.O.R. το σύστηµα Ax=b όπου: 5 1 2 0 0 3 1 1 A= 1 2 6 2 1 2 1 4 Λύση και 15 9 B= 21 3 Αρχικά παίρνουµε τη λύση µε Mathematica ώστε στη συνέχεια νε ελέγξουµε τα αποτελέσµατα: A={ {5, 1, 2, 0}, {0, 3, 1, 1}, {-1, 2, 6, -2}, {1, -2, 1, 4} }; B={15,9,21,-3}; LinearSolve[A,B]//N Αποτελέσµατα: Χ1= 1.43764, Χ2= 2.29759, Χ3= 2.75711, Χ4= -0.649891 Α) Απαλοιφή Gauss Επαυξηµένο πίνακας γραµµικού συστήµατος: 5 1 2 0 15 0 3 1 1 9-1 2 6-2 21 1-2 1 4-3 Για τον µηδενισµό των στοιχείων της πρώτης στήλης κάτω από την κύρια διαγώνιο χρησιµοποιούνται οι πολλαπλασιαστές m 21 =0.000, m 31 = -0.200, m 41 = 0.200: 5.000 1.000 2.000 0.000 15.000 0.000 3.000 1.000 1.000 9.000 0.000 2.200 6.400-2.000 24.000 0.000-2.200 0.600 4.000-6.000 Για τον µηδενισµό των στοιχείων της δεύτερης στήλης κάτω από την κύρια διαγώνιο χρησιµοποιούνται οι πολλαπλασιαστές m 32 =0.733, m 42 = -0.733: 5.000 1.000 2.000 0.000 15.000 0.000 3.000 1.000 1.000 9.000 0.000 0.000 5.667-2.733 17.400 0.000 0.000 1.333 4.733 0.600 Για τον µηδενισµό των στοιχείων της τρίτης στήλης κάτω από την κύρια διαγώνιο χρησιµοποιείται ο πολλαπλασιαστής m 43 =0.235: 5.000 1.000 2.000 0.000 15.000 0.000 3.000 1.000 1.000 9.000 14
0.000 0.000 5.667-2.733 17.400 0.000 0.000 0.000 5.376-3.494 Στη συνέχεια επιλύουµε µε οπισθοδρόµηση και παίρνουµε τις λύσεις Χ1= 1.43764, Χ2= 2.29759, Χ3= 2.75711, Χ4= -0.649890 Πρόγραµµα FORTRAN που επιλύει το σύστηµα µε απαλοιφή Gauss: program askhsh2_1! Naive Gauss Elimination implicit none real::a(4,5),x(4) integer::i A(1,:)=(/5,1,2,0,15/) A(2,:)=(/0,3,1,1,9/) A(3,:)=(/-1,2,6,-2,21/) A(4,:)=(/1,-2,1,4,-3/) call naive_gauss_elimination(a,4,x)!display Result Do i=1,4 print*,i, X(i) Enddo contains subroutine naive_gauss_elimination(a,n,x) integer,intent(in)::n real,intent(inout)::a(n,n+1) real,intent(out)::x(n) real::v(2:n) integer::i,k real::s Do k=1,n-1!find column multipliers v(k+1:n)=a(k+1:n,k)/a(k,k)!use multipliers to eliminate column values reducing each row Do i=k+1,n A(i,k:N+1)=A(i,k:N+1)-v(i)*A(k,k:N+1) Enddo!Display multipliers and Array after each reduction step print* print*,'--------- Multipliers ------------' print '(100F10.3)',v(k+1:N) print*,'---------',k,'------------' do i=1,n print '(100(F10.3,:,","))',a(i,:)!Backward Substitution Do k=n,1,-1 s=sum(a(k,k+1:n)*x(k+1:n)) X(k)=(A(k,N+1)-s)/A(k,k) 15
Enddo end subroutine End program askhsh2_1 Β) Παραγοντοποίηση LU Ο πίνακας U είναι ο τελικός πίνακας, όπως αυτός προκύπτει µε τη µέθοδο Gauss, χωρίς την τελευταία του στήλη: -----U----- 5.000 1.000 2.000 0.000 0.000 3.000 1.000 1.000 0.000 0.000 5.667-2.733 0.000 0.000 0.000 5.376 Τα στοιχεία του πίνακα L, που βρίσκονται κάτω από την κύρια διαγώνιο, είναι οι αντίστοιχοι πολλαπλασιαστές που χρησιµοποιήθηκαν στην µέθοδο Gauss: -----L----- 1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000-0.200 0.733 1.000 0.000 0.200-0.733 0.235 1.000 H επίλυση του αρχικού συστήµατος Ax= B ανάγεται στην επίλυση 2 γραµµικών συστηµάτων: α) Lz= B και β) Ux= z Το πρώτο σύστηµα επιλύεται µε προς τα πίσω αντικατάσταση και δίνει: Ζ1= 15.0000, Ζ2= 9.00000, Ζ3= 17.4000, Ζ4= -3.49412 Το δεύτερο σύστηµα επιλύεται µε προς τα εµπρός αντικατάσταση και δίνει την τελική λύση του αρχικού συστήµατος: Χ1= 1.43764, Χ2= 2.29759, Χ3= 2.75711, Χ4= -0.649890 Πρόγραµµα FORTRAN που επιλύει το σύστηµα µε παραγοντοποίηση LU: program askhsh2_2! LU Decomposition implicit none real,allocatable::a(:,:),x(:),z(:),l(:,:),u(:,:),b(:) real::s integer::i,k,n n=4 allocate(a(n,n),x(n),z(n),l(n,n),u(n,n),b(n)) A(1,:)=(/5,1,2,0/) A(2,:)=(/0,3,1,1/) A(3,:)=(/-1,2,6,-2/) A(4,:)=(/1,-2,1,4/) B=(/15,9,21,-3/) call LU_Decompose(A,N,L,U) print* print*, '-----A-----' 16
do i=1,n print*,a(i,:) print* print*, '-----L-----' do i=1,n print '(100(f10.3,:,","))',l(i,:) print* print*, '-----U-----' do i=1,n print '(100(f10.3,:,","))',u(i,:)!Solve L*Z=B!Forward Substitution Do k=1,n s=sum(l(k,1:k-1)*z(1:k-1)) Z(k)=B(k)-s Enddo Do i=1,4 print*,i, z(i) Enddo!Solve U*X=Z!Backward Substitution Do k=n,1,-1 s=sum(u(k,k+1:n)*x(k+1:n)) X(k)=(Z(k)-s)/U(k,k) Enddo!Display Result Do i=1,4 print*,i, X(i) Enddo contains subroutine LU_decompose(A,N,L,U) integer,intent(in)::n real,intent(in)::a(n,n) real,intent(out)::l(n,n),u(n,n) integer::i,j,k l=0;u=0 do i=1,n l(i,i)=1 do k=1,n do j=k,n u(k,j)=a(k,j)-sum(l(k,1:k-1)*u(1:k-1,j))!solve to the right down do i=k+1,n l(i,k)=(a(i,k)-sum(l(i,1:k-1)*u(1:k-1,k)))/u(k,k)!solve!repeat N times end subroutine 17
End program askhsh2_2 Γ) Επαναληπτική µέθοδος Jacobi N ( n+ 1) 1 ( n) xi = bi aij x j a ii j= 1 j i Πρόγραµµα FORTRAN που επιλύει το σύστηµα µε την µέθοδο Jacobi: program askhsh2_3 implicit none real,allocatable::a(:,:),x(:),b(:) integer::i,n n=4 allocate(a(n,n),x(n),b(n)) A(1,:)=(/5,1,2,0/) A(2,:)=(/0,3,1,1/) A(3,:)=(/-1,2,6,-2/) A(4,:)=(/1,-2,1,4/) B=(/15,9,21,-3/) x=0!initial guess call Jacobi(A,B,N,X) do i=1,n print*,x(i) contains subroutine Jacobi(A,B,N,X) integer,intent(in)::n real,intent(in)::a(n,n) real,intent(in)::b(n) real,intent(inout)::x(n) real::x_old(n) integer::i,k real::err open(10,file='results.txt') do k=1,10000 x_old=x do i=1,n x(i)=(b(i)-(sum(a(i,1:i-1)*x_old(1:i- 1))+sum(a(i,i+1:N)*x_old(i+1:N))))/a(i,i) err=maxval(abs(x_old(:)-x(:))) write(10,'(i2,",",e10.3,",",100(f10.3,:,","))') k,err,x print*,k,err,x if (err<1e-6) exit close(10) end subroutine end program 18
Πίνακας αποτελεσµάτων (αρχική εκτίµηση x1=x2=x3=x4=0). Απόλυτο σφάλµα: 10-6 Αριθμός επαναλήψης Σφάλμα x1 x2 x3 x4 0 100 0 0 0 0 1 3.50E+00 3 3 3.5-0.75 2 2.00E+00 1 2.083 2.75-0.875 3 4.83E-01 1.483 2.375 2.681-0.646 4 5.97E-02 1.453 2.322 2.74-0.603 5 3.40E-02 1.44 2.288 2.767-0.637 6 2.04E-02 1.436 2.29 2.765-0.658 7 8.24E-03 1.436 2.298 2.757-0.655 8 5.72E-03 1.438 2.299 2.755-0.649 9 1.59E-03 1.438 2.298 2.757-0.648 10 1.16E-03 1.438 2.297 2.757-0.65 11 5.17E-04 1.438 2.297 2.757-0.65 12 2.38E-04 1.438 2.298 2.757-0.65 13 1.63E-04 1.438 2.298 2.757-0.65 14 5.20E-05 1.438 2.298 2.757-0.65 15 3.72E-05 1.438 2.298 2.757-0.65 16 1.22E-05 1.438 2.298 2.757-0.65 17 6.68E-06 1.438 2.298 2.757-0.65 18 4.53E-06 1.438 2.298 2.757-0.65 19 1.67E-06 1.438 2.298 2.757-0.65 20 1.13E-06 1.438 2.298 2.757-0.65 21 2.98E-07 1.438 2.298 2.757-0.65 ) Επαναληπτική µέθοδο Gauss Seidel i 1 N ( n+ 1) 1 ( n+ 1) ( n) xi = bi aijx j aij x j aii j= 1 j= i+ 1 Πρόγραµµα FORTRAN που επιλύει το σύστηµα µε την µέθοδο Gauss-Seidel: program askhsh2_4 implicit none real,allocatable::a(:,:),x(:),b(:) integer::i,n n=4 allocate(a(n,n),x(n),b(n)) A(1,:)=(/5,1,2,0/) A(2,:)=(/0,3,1,1/) A(3,:)=(/-1,2,6,-2/) A(4,:)=(/1,-2,1,4/) 19
B=(/15,9,21,-3/) x=0!initial guess call Gauss_Seidel(A,B,N,X) do i=1,n print*,x(i) contains subroutine Gauss_Seidel(A,B,N,X) integer,intent(in)::n real,intent(in)::a(n,n) real,intent(in)::b(n) real,intent(inout)::x(n) real::x_old(n) integer::i,k real::err open(10,file='results2.txt') do k=1,10000 x_old=x do i=1,n x(i)=(b(i)-(sum(a(i,1:i-1)*x(1:i-1))+sum(a(i,i+1:n)*x_old(i+1:n))))/a(i,i) err=maxval(abs(x_old(:)-x(:))) write(10,'(i2,",",e10.3,",",100(f10.3,:,","))') k,err,x print*,k,err,x if (err<1e-6) exit close(10) end subroutine end program Πίνακας αποτελεσµάτων (αρχική εκτίµηση x1=x2=x3=x4=0). Απόλυτο σφάλµα: 10-6 N Error x1 x2 x3 x4 0 100 0 0 0 0 1 3.00E+00 3 3 3-0.75 2 1.80E+00 1.2 2.25 2.7-0.6 3 2.70E-01 1.47 2.3 2.778-0.662 4 4.13E-02 1.429 2.295 2.753-0.648 5 1.14E-02 1.44 2.298 2.758-0.65 6 2.90E-03 1.437 2.297 2.757-0.65 7 5.57E-04 1.438 2.298 2.757-0.65 8 1.05E-04 1.438 2.298 2.757-0.65 9 2.36E-05 1.438 2.298 2.757-0.65 10 5.48E-06 1.438 2.298 2.757-0.65 20
11 1.19E-06 1.438 2.298 2.757-0.65 12 2.38E-07 1.438 2.298 2.757-0.65 Ε) Επαναληπτική µέθοδος SOR i 1 N ( n+ 1) 1 ( n 1) ( n) ( 1 ) ( n x ) i bi aij x j aij x j xi a ω + = + ω ii j= 1 j= i+ 1 Πρόγραµµα FORTRAN που επιλύει το σύστηµα µε την µέθοδο SOR: program askhsh2_5 implicit none real,allocatable::a(:,:),x(:),b(:) integer::i,n real::w n=4 allocate(a(n,n),x(n),b(n)) A(1,:)=(/5,1,2,0/) A(2,:)=(/0,3,1,1/) A(3,:)=(/-1,2,6,-2/) A(4,:)=(/1,-2,1,4/) B=(/15,9,21,-3/) x=0!initial guess w=0.9 call SOR(A,B,N,X,w) do i=1,n print*,x(i) contains subroutine SOR(A,B,N,X,w) integer,intent(in)::n real,intent(in)::a(n,n) real,intent(in)::b(n) real,intent(inout)::x(n) real,intent(in)::w real::x_old(n) integer::i,k real::err open(10,file='results3.txt') do k=1,10000 x_old=x do i=1,n x(i)=w*(b(i)-(sum(a(i,1:i-1)*x(1:i- 1))+sum(a(i,i+1:N)*x_old(i+1:N))))/a(i,i)+ (1-w)*x_old(i) err=maxval(abs(x_old(:)-x(:))) write(10,'(i2,",",e10.3,",",100(f10.3,:,","))') k,err,x print*,k,err,x if (err<1e-6) exit close(10) end subroutine end program 21
Πίνακας αποτελεσµάτων µε αρχική εκτίµηση x1=x2=x3=x4=0. Απόλυτο σφάλµα: 10-6 Για ω= 0.9 N Error x1 x2 x3 x4 0 100 0 0 0 0 1 2.74E+00 2.7 2.7 2.745-0.685 2 1.20E+00 1.496 2.352 2.738-0.638 3 5.52E-02 1.441 2.305 2.757-0.646 4 8.00E-03 1.437 2.297 2.758-0.65 5 9.17E-04 1.437 2.297 2.757-0.65 6 3.95E-04 1.438 2.298 2.757-0.65 7 7.92E-05 1.438 2.298 2.757-0.65 8 8.34E-06 1.438 2.298 2.757-0.65 9 3.58E-06 1.438 2.298 2.757-0.65 10 7.15E-07 1.438 2.298 2.757-0.65 Για ω= 1.02 N Error x1 x2 x3 x4 1 3.06E+00 3.06 3.06 3.05-0.762 2 1.93E+00 1.13 2.221 2.687-0.59 3 3.58E-01 1.488 2.303 2.786-0.669 4 6.41E-02 1.424 2.294 2.749-0.646 5 1.80E-02 1.442 2.299 2.759-0.651 6 5.39E-03 1.437 2.297 2.757-0.65 7 1.38E-03 1.438 2.298 2.757-0.65 8 3.30E-04 1.438 2.298 2.757-0.65 9 8.21E-05 1.438 2.298 2.757-0.65 10 2.12E-05 1.438 2.298 2.757-0.65 11 5.48E-06 1.438 2.298 2.757-0.65 12 1.43E-06 1.438 2.298 2.757-0.65 13 3.58E-07 1.438 2.298 2.757-0.65 Για ω= 1.05 N Error x1 x2 x3 x4 1 3.15E+00 3.15 3.15 3.124-0.781 2 2.13E+00 1.019 2.172 2.664-0.575 3 5.05E-01 1.524 2.31 2.799-0.681 4 1.11E-01 1.413 2.293 2.742-0.64 5 3.32E-02 1.446 2.3 2.762-0.653 6 1.17E-02 1.435 2.297 2.756-0.649 7 3.92E-03 1.439 2.298 2.758-0.65 22
8 1.24E-03 1.437 2.298 2.757-0.65 9 3.84E-04 1.438 2.298 2.757-0.65 10 1.21E-04 1.438 2.298 2.757-0.65 11 3.81E-05 1.438 2.298 2.757-0.65 12 1.20E-05 1.438 2.298 2.757-0.65 13 3.81E-06 1.438 2.298 2.757-0.65 14 1.19E-06 1.438 2.298 2.757-0.65 15 3.58E-07 1.438 2.298 2.757-0.65 Για ω= 1.1 N Error x1 x2 x3 x4 1 3.30E+00 3.3 3.3 3.245-0.81 2 2.48E+00 0.816 2.077 2.617-0.546 3 7.94E-01 1.61 2.333 2.828-0.708 4 2.29E-01 1.381 2.289 2.722-0.623 5 7.94E-02 1.461 2.302 2.773-0.661 6 3.34E-02 1.427 2.295 2.75-0.645 7 1.47E-02 1.442 2.299 2.76-0.652 8 6.38E-03 1.436 2.297 2.756-0.649 9 2.70E-03 1.438 2.298 2.758-0.65 10 1.13E-03 1.437 2.298 2.757-0.65 11 4.75E-04 1.438 2.298 2.757-0.65 12 2.00E-04 1.438 2.298 2.757-0.65 13 8.39E-05 1.438 2.298 2.757-0.65 14 3.54E-05 1.438 2.298 2.757-0.65 15 1.49E-05 1.438 2.298 2.757-0.65 16 6.32E-06 1.438 2.298 2.757-0.65 17 2.74E-06 1.438 2.298 2.757-0.65 18 1.19E-06 1.438 2.298 2.757-0.65 19 5.96E-07 1.438 2.298 2.757-0.65 Για ω= 1.2 N Error x1 x2 x3 x4 1 3.60E+00 3.6 3.6 3.48-0.864 2 3.25E+00 0.346 1.834 2.494-0.479 3 1.55E+00 1.894 2.427 2.917-0.791 4 6.55E-01 1.238 2.264 2.642-0.547 5 3.02E-01 1.541 2.309 2.837-0.718 6 1.65E-01 1.376 2.291 2.704-0.606 7 1.01E-01 1.477 2.303 2.791-0.678 8 6.48E-02 1.412 2.294 2.735-0.632 9 4.17E-02 1.454 2.3 2.771-0.661 10 2.67E-02 1.427 2.296 2.748-0.643 11 1.70E-02 1.444 2.299 2.763-0.654 12 1.08E-02 1.433 2.297 2.754-0.647 23
13 6.84E-03 1.44 2.298 2.759-0.652 14 4.34E-03 1.436 2.297 2.756-0.649 15 2.75E-03 1.439 2.298 2.758-0.651 16 1.74E-03 1.437 2.297 2.757-0.649 17 1.11E-03 1.438 2.298 2.757-0.65 18 7.01E-04 1.437 2.298 2.757-0.65 19 4.45E-04 1.438 2.298 2.757-0.65 20 2.82E-04 1.438 2.298 2.757-0.65 21 1.79E-04 1.438 2.298 2.757-0.65 22 1.13E-04 1.438 2.298 2.757-0.65 23 7.20E-05 1.438 2.298 2.757-0.65 24 4.58E-05 1.438 2.298 2.757-0.65 25 2.91E-05 1.438 2.298 2.757-0.65 26 1.85E-05 1.438 2.298 2.757-0.65 27 1.18E-05 1.438 2.298 2.757-0.65 28 7.51E-06 1.438 2.298 2.757-0.65 29 4.77E-06 1.438 2.298 2.757-0.65 30 3.10E-06 1.438 2.298 2.757-0.65 31 2.03E-06 1.438 2.298 2.757-0.65 32 1.31E-06 1.438 2.298 2.757-0.65 33 8.34E-07 1.438 2.298 2.757-0.65 24
ΑΣΚΗΣΗ 3 Να λυθεί µε τη µέθοδο Newton το σύστηµα 1 x2 x1 sin ( x1 x2) = 0 2 4π 2 1 2 1 ( 1 ex2 e x e) + 2ex1 = 0. 4π π Να γίνουν 3 επαναλήψεις µε αρχική εκτίµηση x = 0 4 και x 2 = 3. Λύση Έστω 1 x2 x1 f1( x1, x2 ) = sin( x1x2) 2 4π 2 1 1 ( 2 x ex f ) 2 2( x1, x2) = 1 e e + 2ex1. 4π π 1. Η µέθοδος Newton σε συνδυασµό µε την επίλυση του γραµµικού συστήµατος που προκύπτει µε τη µέθοδο Cramer, γράφεται ως εξής: f f 2 2 ( k+ 1) ( k) x2 1 x1 x 1 f x 1 2 2 f 1 ( k) = + και x ( k) J ( f, f ) όπου J ο Ιακωβιανός πίνακας: (, ) J f f 1 2 ( k+ ) ( k) = x + f x 1 1 2 2 1 f x 1 2 f f 1 2 1 2 J ( f, f ) ( k) ( k) 1 1 1 1 + x2 cos( x1x 2) + x1 cos( x1x2 ) 2 2 4π 2 = 2x 1 e 1 2e+ 2e 1 4 π π. Λύση του συστήµατος µε Mathematica: a=1/2 Sin[x1 x2]-x2/(4pi)-x1/2; b=(1-1/(4pi))(exp[2x1]-exp[1])+(exp[1] x2)/pi-2exp[1] x1; FindRoot[{a 0,b 0},{{x1,0.4},{x2,3}}] Αποτελέσµατα: Χ1=0.299449, Χ2=2.83693 Πρόγραµµα Fortran που επιλύει το συγκεκριµένο σύστηµα µε τη µέθοδο Newton: program NumAnal_5 implicit none 25
real::x1,x2,x1_old,x2_old,jac,s1,s2,tol,pi integer::i,n,maxiter pi=4*atan(1.) open(10,file='results.txt') print*,'give initial x1 and x2' read*,x1,x2 n=0 tol=1.0e-6 maxiter=50 do i=1,maxiter n=n+1 x1_old=x1 x2_old=x2 jac=fx(x1_old,x2_old)*gy(x1_old,x2_old)- gx(x1_old,x2_old)*fy(x1_old,x2_old) s1=(f(x1_old,x2_old)*gy(x1_old,x2_old)- g(x1_old,x2_old)*fy(x1_old,x2_old))/jac s2=(g(x1_old,x2_old)*fx(x1_old,x2_old)- f(x1_old,x2_old)*gx(x1_old,x2_old))/jac x1=x1_old-s1 x2=x2_old-s2 write(10,'(i2,",",11(f10.3,:,","))') i,x1_old,x2_old,f(x1_old,x2_old),g(x1_old,x2_old), & fx(x1_old,x2_old),fy(x1_old,x2_old),gx(x1_old,x2_old),gy(x1_old,x2_ol d), & jac,s1,s2 print '(i2,",",11(f10.3,","))',i,x1_old,x2_old,f(x1_old,x2_old),g(x1_old,x2 _old), & fx(x1_old,x2_old),fy(x1_old,x2_old),gx(x1_old,x2_old),gy(x1_old,x2_ol d), & jac,s1,s2 if(abs(x1-x1_old)<=tol.and.abs(x2-x2_old)<= tol) exit enddo write(*,*)x1,x2,n close(10) contains real function f(x1,x2) real::x1,x2 f=0.5*sin(x1*x2)-x2/(4*pi)-x1/2. end function real function g(x1,x2) real::x1,x2 g=(1-1/(4*pi))*(exp(2*x1)-exp(1.))+exp(1.)*x2/pi - 2*exp(1.)*x1 end function real function fx(x1,x2) real::x1,x2 26
fx=-0.5+0.5*x2*cos(x1*x2) end function real function fy(x1,x2) real::x1,x2 fy=-1/(4*pi)+0.5*x1*cos(x1*x2) end function real function gx(x1,x2) real::x1,x2 gx=-2*exp(1.)+2*exp(2*x1)*(1-1/(4*pi)) end function real function gy(x1,x2) real::x1,x2 gy=exp(1.)/pi end function end program NumAnal_5 Πίνακας αποτελεσµάτων (αρχικές τιµές x1=0.4 και x2=3): n x1 x2 f(x1,x2) g(x1,x2) fx(x1,x2) fy(x1,x2) gx(x1,x2) gy(x1,x2) Jac Dx1 Dx2 1 0.4 3.0 2.70E-02-3.20E-02 0.044-0.007-1.34 0.865 0.028 0.831 1.249 2-0.431 1.75-2.66E-01 1.74E+00 0.138-0.236-4.658 0.865-0.982-0.185 1.018 3-0.245 0.733-2.50E-02 3.00E-02-0.139-0.2-4.31 0.865-0.984 0.016 0.114 4-0.261 0.619 1.00E-03 0.00E+00-0.195-0.209-4.345 0.865-1.075-0.001-0.004 5-0.261 0.623 0.00E+00 0.00E+00-0.193-0.208-4.343 0.865-1.071 0 0 ΑΣΚΗΣΗ 4 Εάν ο πίνακας Α ενός γραµµικού συστήµατος Ax=b αναλυθεί σε A = D+ L+ U, όπου D είναι ένας διαγώνιος πίνακας και L και U είναι κάτω και άνω τριγωνικοί πίνακες αντίστοιχα, να αποδειχθεί ότι και οι τρεις επαναληπτικές µέθοδοι Jacobi, GS και SOR µπορούν να γραφούν στη γενική µορφή x k+ 1 1 k 1 = M Nx + M b, όπου για τη µέθοδο Jacobi: Μ=D και N ( L+ U) και N = Uκαι για τη µέθοδο SOR: M = D+ ωl και N [( 1 ω) D ωu] Λύση =, για τη µέθοδο GS: M = L+ D =. Η άσκηση επιλύεται στην ιστοσελίδα του µαθήµατος (Αρχείο παραδειγµάτων: 5 - Συστήµατα Αλγεβρικών Εξισώσεων, Άσκηση 4) 27