Οµάδα Α: Άσκηση Έχουµε να επιλύσουµε την εξίσωση: du du u = dr + r dr = (Α) du µε οριακές συνθήκες u () = 0 και u(0) πεπερασµένη ή = 0 (συνθήκη dr r = 0 συµµετρίας). Η αναλυτική λύση της διαφορική ς εξίσωσης δ ίνεται µε τη βοήθεια του Mathematica: DSolveA9u''@rD+ u'@rd, u@d 0, u'@0d 0=,u@rD,rE r και είναι: ur () = ( r) 4 Αρχικά διακριτοποιούµε το πεδίο ορισµού: Χωρίζουµε την ακτίνα σε Ν ίσα διαστήµατα (Ν+ κόµβους) πλάτους r = N 0 r N N+ r=0 i- i i+ r= Έτσι για τη ζητούµενη παροχή θα έχουµε: Q = uda Q = π ru( r) dr 0 π Η αναλυτική τιµή της Q είναι ίση µε = 0.39699 8 Προσεγγίζουµε τη διαφορική εξίσωση (Α) στον τυχαίο κόµβο i : u u + u u u + = i+ i i i+ i r ri r ui + ui u i+ r ri r r + + =, r ri r (Α) για τους εσωτερικούς κόµβους i =,..., N όπου r = ( i ) r Για i= N + έχουµε: u = + N 0 i
Για i = θα χρησιµοποιήσουµε την οριακή συνθήκη µαζί µε την διαφορική εξίσωση: du d u du d u Παρατηρούµε ότι το limr 0 lim dr r 0 lim dr = = r 0 = rdr r dr du uo u+ u Έτσι η () γράφεται: = = (Α3) dr r du u u0 Η οριακή συνθήκη: = 0 = 0 uo = u (Α4) dr r= 0 r Ό κόµβος i = 0 είναι φανταστικός. Οι (Α3) και (Α4) δίνουν τελικά: 4u 4u r = (Α5) Το σύστηµα που προκύπτει είναι τριδιαγώνιο και θα επιλυθεί µε την µέθοδο Τhomas. Για το ολοκλήρωµα της παροχής Q χρησιµοποιούµε κανόνα τραπεζίου: R r Q = π ru( r) dr = π [ ru + ru... + rnun + rn+ un+ ] 0 Έστω ένα αραιό πλέγµα µε Ν=3 ( r =/3). Τότε έχουµε να λύσουµε το σύστηµα: 4 4 0 u /9 4.5 8 3.5 u = 0 6.75 8 u 3 To οποίο δίνει: u = 0.5 u u 3 = 0. = 0.38889 u = (από οριακή συνθήκη) 4 0 Οι τιµές ταυτίζονται µε αυτές της αναλυτικής λύσης στα σηµεία 0, /3, /3,. Q = π [0(0.5) + (/ 3)(0.) + ( / 3)(0.38889) + (0)] = 0.348734 3 Το πρόγραµµα σε Fortran είναι το ακόλουθο: Program Poisson (σε διάσταση) implicit none doubleprecision,allocatable::a(:),b(:),c(:),d(:),x(:),r(:) doubleprecision:: dr,q,s integer::n,i,status n=3!arithmos diasthmatwn -> n+ komboi allocate(a(n),b(n),c(n-),x(n+),d(n),r(n+))
if (status/=0) Stop 'Not enough memory' dr=./n do i=,n+ r(i)=(i-)*dr x(n+)=0 b()=4. c()=-4. a(i)=./dr**-./(.*r(i)*dr) b(i)=-./dr** if (i<n) then c(i)=./dr**+./(.*r(i)*dr) d()=dr** d(i)=- print*, '-------------' call Thomas(n,a,b,c,d,x) do i=,n print '(I3,4H u(,f0.5,4h) =,D0.5,D0.5)',i,r(i),x(i),(-r(i)**)/4 print '(I3,4H u(,f0.5,4h) =,D0.5,D0.5)',n+,r(n+),0,0 s=0 s=s+*r(i)*x(i) s=s+r()*x()+r(n+)*x(n+) q= 3.4 * dr * s print*, 'q=',s,q contains subroutine Thomas(n,a,b,c,d,x) integer,intent(in) :: n doubleprecision, INTENT(INOUT) ::a(n),b(n),c(n),d(n) doubleprecision, INTENT(OUT) ::x(n) integer::i doubleprecision ::t(n),u(n) end t()=b() u()=d()/t() t(i)=b(i)-a(i)*c(i-)/t(i-) u(i)=(d(i)-a(i)*u(i-))/t(i) x(n)=u(n) do i=n-,,- x(i)=u(i)-c(i)/t(i)*x(i+) end subroutine Thomas
ίνουµε ενδεικτικά αποτέλεσµατα για Ν=00. ίπλα στις αριθµητικές τιµές παρουσιάζονται οι αντίστοιχες αναλυτικές οι οποίες ταυτίζονται!!! u(0.00000) = 0.5000D+00 0.5000D+00 u(0.0000) = 0.4997D+00 0.4998D+00 3 u(0.0000) = 0.4990D+00 0.4990D+00 4 u(0.03000) = 0.4977D+00 0.4977D+00 5 u(0.04000) = 0.4960D+00 0.4960D+00 6 u(0.05000) = 0.4937D+00 0.4938D+00 7 u(0.06000) = 0.490D+00 0.490D+00 8 u(0.07000) = 0.4877D+00 0.4877D+00 9 u(0.08000) = 0.4840D+00 0.4840D+00 0 u(0.09000) = 0.4797D+00 0.4798D+00 u(0.0000) = 0.4750D+00 0.4750D+00 u(0.000) = 0.4697D+00 0.4698D+00 3 u(0.000) = 0.4640D+00 0.4640D+00 4 u(0.3000) = 0.4577D+00 0.4577D+00 5 u(0.4000) = 0.450D+00 0.450D+00 6 u(0.5000) = 0.4437D+00 0.4438D+00 7 u(0.6000) = 0.4360D+00 0.4360D+00 8 u(0.7000) = 0.477D+00 0.477D+00 9 u(0.8000) = 0.490D+00 0.490D+00 0 u(0.9000) = 0.4097D+00 0.4097D+00 u(0.0000) = 0.4000D+00 0.4000D+00 u(0.000) = 0.3897D+00 0.3897D+00 3 u(0.000) = 0.3790D+00 0.3790D+00 4 u(0.3000) = 0.3677D+00 0.3678D+00 5 u(0.4000) = 0.3560D+00 0.3560D+00 6 u(0.5000) = 0.3437D+00 0.3438D+00 7 u(0.6000) = 0.330D+00 0.330D+00 8 u(0.7000) = 0.377D+00 0.378D+00 9 u(0.8000) = 0.3040D+00 0.3040D+00 30 u(0.9000) = 0.897D+00 0.898D+00 3 u(0.30000) = 0.750D+00 0.750D+00 3 u(0.3000) = 0.597D+00 0.598D+00 33 u(0.3000) = 0.440D+00 0.440D+00 34 u(0.33000) = 0.77D+00 0.78D+00 35 u(0.34000) = 0.0D+00 0.0D+00 36 u(0.35000) = 0.937D+00 0.937D+00 37 u(0.36000) = 0.760D+00 0.760D+00 38 u(0.37000) = 0.577D+00 0.577D+00 39 u(0.38000) = 0.390D+00 0.390D+00 40 u(0.39000) = 0.97D+00 0.97D+00 4 u(0.40000) = 0.000D+00 0.000D+00 4 u(0.4000) = 0.0797D+00 0.0797D+00 43 u(0.4000) = 0.0590D+00 0.0590D+00 44 u(0.43000) = 0.0377D+00 0.0378D+00 45 u(0.44000) = 0.060D+00 0.060D+00 46 u(0.45000) = 0.9937D+00 0.9937D+00 47 u(0.46000) = 0.970D+00 0.970D+00 48 u(0.47000) = 0.9477D+00 0.9477D+00 49 u(0.48000) = 0.940D+00 0.940D+00 50 u(0.49000) = 0.8997D+00 0.8998D+00 5 u(0.50000) = 0.8750D+00 0.8750D+00 5 u(0.5000) = 0.8497D+00 0.8498D+00 53 u(0.5000) = 0.840D+00 0.840D+00 54 u(0.53000) = 0.7977D+00 0.7977D+00 55 u(0.54000) = 0.770D+00 0.770D+00 56 u(0.55000) = 0.7437D+00 0.7438D+00 57 u(0.56000) = 0.760D+00 0.760D+00 58 u(0.57000) = 0.6877D+00 0.6877D+00 59 u(0.58000) = 0.6590D+00 0.6590D+00 60 u(0.59000) = 0.697D+00 0.698D+00 6 u(0.60000) = 0.6000D+00 0.6000D+00 6 u(0.6000) = 0.5697D+00 0.5698D+00 63 u(0.6000) = 0.5390D+00 0.5390D+00 64 u(0.63000) = 0.5077D+00 0.5077D+00 65 u(0.64000) = 0.4760D+00 0.4760D+00 66 u(0.65000) = 0.4437D+00 0.4437D+00 67 u(0.66000) = 0.40D+00 0.40D+00 68 u(0.67000) = 0.3777D+00 0.3777D+00 69 u(0.68000) = 0.3440D+00 0.3440D+00 70 u(0.69000) = 0.3097D+00 0.3097D+00 7 u(0.70000) = 0.750D+00 0.750D+00 7 u(0.7000) = 0.397D+00 0.398D+00
73 u(0.7000) = 0.040D+00 0.040D+00 74 u(0.73000) = 0.677D+00 0.678D+00 75 u(0.74000) = 0.30D+00 0.30D+00 76 u(0.75000) = 0.0937D+00 0.0938D+00 77 u(0.76000) = 0.0560D+00 0.0560D+00 78 u(0.77000) = 0.077D+00 0.078D+00 79 u(0.78000) = 0.97900D-0 0.97900D-0 80 u(0.79000) = 0.93975D-0 0.93975D-0 8 u(0.80000) = 0.90000D-0 0.90000D-0 8 u(0.8000) = 0.85975D-0 0.85975D-0 83 u(0.8000) = 0.8900D-0 0.8900D-0 84 u(0.83000) = 0.77775D-0 0.77775D-0 85 u(0.84000) = 0.73600D-0 0.73600D-0 86 u(0.85000) = 0.69375D-0 0.69375D-0 87 u(0.86000) = 0.6500D-0 0.6500D-0 88 u(0.87000) = 0.60775D-0 0.60775D-0 89 u(0.88000) = 0.56400D-0 0.56400D-0 90 u(0.89000) = 0.5975D-0 0.5975D-0 9 u(0.90000) = 0.47500D-0 0.47500D-0 9 u(0.9000) = 0.4975D-0 0.4975D-0 93 u(0.9000) = 0.38400D-0 0.38400D-0 94 u(0.93000) = 0.33775D-0 0.33775D-0 95 u(0.94000) = 0.900D-0 0.900D-0 96 u(0.95000) = 0.4375D-0 0.4375D-0 97 u(0.96000) = 0.9600D-0 0.9600D-0 98 u(0.97000) = 0.4775D-0 0.4775D-0 99 u(0.98000) = 0.99000D-0 0.99000D-0 00 u(0.99000) = 0.49750D-0 0.49750D-0 0 u(.00000) = 0.00000D+00 0.00000D+00 ΠΑΡΟΧΗ: q = 0.3946076370 Οµάδα Β Θεωρούµε ότι η τετραγωνική πλάκα έχει πλευρά ίση µε m. Επίσης h=5 W/m C, k=300 W/m C και T = 5 C. Έχουµε να επιλύσουµε τη διαφορική εξίσωση Laplace: T T T = 0 + = 0 (Β) x y µε οριακές συνθήκες: T T( x,0) = 50, T( x,) = 00, T(, y ) = 50 και για x = 0 : k = h( T T ). x ιακριτοποιούµε το πεδίο ορισµού 0 x, y : xωρίζουµε την κάθε πλευρά σε Ν ίσα διαστήµατα (N+ κόµβους) πλάτους H = N Έτσι για τις οριακές συνθήκες έχουµε: T( x,) = 00 T(, j) = 00 T( x,0) = 50 T( n+, j) = 50 T(, y) = 50 T( i, n+ ) = 50 T Για x = 0 διακριτοποιούµε την k = h( T T ) µε πεπερασµένες διαφορές στον x κόµβο (, j) και παίρνουµε: T, j T, j hh hh k = h( T, j T ) T, j + T, j = T, j T H k k hh hh T, j = ( T, j T )/( ) για j=,,n (Β) k k
Επίσης διακριτοποιούµε την (Β) στον τυχαίο κόµβο (, i j) και παίρνουµε τον τύπο των 5 σηµείων: Ti, j= ( Ti, j+ Ti+, j+ Ti, j + Ti, j+ ) 4 για i =,..., N και j =,..., N (Β3) Έτσι θα έχουµε για τις διάφορες µεθόδους επίλυσης συστηµάτων: Μέθοδος Jacobi ( n+ ) ( n) hh hh T, j = ( T, j T )/( ) για j =,..., N (i = ) k k ( n+ ) ( ) ( ) ( ) (, ( n n n n) Ti j = Ti, j + Ti+, j + Ti, j + Ti, j+ ) για i,..., 4 Μέθοδος Gauss-Seidel ( n+ ) ( n) hh hh T, j = ( T, j T )/( ) για j =,..., N (i = ) k k ( n+ ) ( ) ( ) ( ) ( ), ( n n+ n n+ Ti j = Ti, j + Ti+, j + Ti, j + Ti, j+ ) i,..., 4 j =,..., N = N και j =,..., N για = N και (Ο υπολογισµός γίνεται από το πάνω µέρος της τετραγωνικής πλάκας προς τα κάτω και από αριστερά προς τα δεξιά) Μέθοδος SOR ( n+ ) ( n) hh hh ( n) T, j = ω( T, j T )/( ) + ( ω) T, j για j =,..., N ( i =) k k T = ω ( T + T + T + T ) + ( ω) T, 4 ( n+ ) ( n) ( n+ ) ( n) ( n+ ) ( n) i, j i, j i+, j i, j i, j+ i j για i =,..., N και j =,..., N Το πρόγραµµα σε Fortran είναι: Μέθοδοι Jacobi, Gauss-Seidel, SOR Program Jacobi_GaussSeidel_SOR implicit none doubleprecision,allocatable::t(:,:),told(:,:) integer::n,i,j,k,kk,h,status,maxi,done,method doubleprecision::s,rel,err,max doubleprecision::t0,hh,w n=50 allocate(t(n+,n+),told(n+,n+)) if (status/=0) Stop 'Not enough memory' maxi=50000 rel=0.0000000 print*, 'n=',n,'rel=',rel hh=./n h=5
kk=300 t0=5 do method=,3!=jacobi, =gauss-seidel, 3=SOR if (method==) then t(:,:)=0. t(,:)=00. t(n+,:)=50. t(:,n+)=50. told(:,:)=t(:,:)! print*,x0(:)!read* k= done=0 do while (k<=maxi.and. done==0) do j=,n if (j==) then t(i,)=(told(i,)-(h*hh/kk)*t0)/(-(h*hh/kk)) else t(i,j)= 0.5*(told(i,j+)+told(i,j-)+told(i+,j)+told (i-,j))! elenxos gia termatismo max=- do j=,n err = abs((t(i,j) - told(i,j))/t(i,j)) if (err>max) then max=err if (max<rel) then done= told(:,:)=t(:,:) k=k+ open(,file='res_jacobi.txt',recl=0000)!xwris to RECL=000 to megisto platos xwraei monon 5 sthles toy pinaka do i=n+,,-! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! write(,*) t(i,:) print*, 'Jacobi' print*, k-,max print*,'------------------------' elseif (method==) then!gauss-seidel t(:,:)=0. t(,:)=00. t(n+,:)=50. t(:,n+)=50. k= done=0 do while (k<=maxi.and. done==0)
told(:,:)=t(:,:) do j=,n if (j==) then t(i,)=(t(i,)-(h*hh/kk)*t0)/(-(h*hh/kk)) else t(i,j)= 0.5*(t(i,j+)+t(i,j-)+t(i+,j)+t(i-,j))! elenxos gia termatismo max=- do j=,n err = abs((t(i,j) - told(i,j))/t(i,j)) if (err>max) then max=err if (max<rel) then done= k=k+ open(,file='res_gauss.txt',recl=000) do i=n+,,- write(,*) t(i,:) print*, 'Gauss Seidel' print*, k-,max print*, '-------------------------------' elseif (method==3) then!sor do w=.88,.99,0.0 k= done=0 t(:,:)=0. t(,:)=00. t(n+,:)=50. t(:,n+)=50. do while (k<=maxi.and. done==0) told(:,:)=t(:,:) do j=,n if (j==) then t(i,)=w*(t(i,)-(h*hh/kk)*t0)/(-(h*hh/kk))+(-w)*t(i,) else t(i,j)= 0.5*w*(t(i,j+)+t(i,j-)+t(i+,j)+t(i-,j))+(-w)*t(i,j)! elenxos gia termatismo max=- do j=,n err = abs((t(i,j) - told(i,j))/t(i,j)) if (err>max) then max=err if (max<rel) then
done= k=k+ open(3,file='res_sor.txt',recl=000) do i=n+,,- write(3,*) t(i,:) print*, 'SOR' print*, k-,w end Ο έλεγχος σύγκλισης γίνεται µε κριτήριο το µέγιστο σχετικό σφάλµα από όλα τα στοιχεία του πίνακα να είναι µικρότερο από µία δεδοµένη τιµή. Ανοίγοντας το αρχείο res_jacobi.txt µέσα από το πρόγραµµα Compaq Array Visualizer και επιλέγοντας τύπο γραφήµατος Image Map παίρνουµε τα ακόλουθα γραφήµατα: N=5
Ν=0 Ν=0 Αντίστοιχα γραφήµατα παίρνουµε για όλες τις µεθόδους.
Στον επόµενο πίνακα φαίνεται συγκεντρωτικά ο αριθµός επαναλήψεων µέχρι την σύγκλιση ανά µέθοδο και πλήθος κόµβων: Κριτήριο τερµατισµού: Σχετικό σφάλµα < 0-4 Πλέγµα Jacobi Gauss-Seidel SOR 5x5 537 54 46 (ω =.89) 9 (ω =.90) (ω =.9) 7 (ω =.9) 39 (ω =.93) 0x0 6099 4009 374 (ω =.9) 330 (ω =.93) 8 (ω =.94) 8 (ω =.95) 37 (ω =.96) 0x0 90 8794 650 (ω =.96) 499 (ω =.97) 485 (ω =.98) 98 (ω =.99) Κριτήριο τερµατισµού: Σχετικό σφάλµα < 0-6 Πλέγµα Jacobi Gauss-Seidel SOR 5x5 685 3430 3 (ω =.89) 97 (ω =.90) 76 (ω =.9) 0 (ω =.9) 0x0 0469 376 569 (ω =.93) 47 (ω =.94) 36 (ω =.95) 40 (ω =.96) 0x0 63556 36303 05 (ω =.96) 865 (ω =.97) 80 (ω =.98) 53 (ω =.99) Κριτήριο τερµατισµού: Σχετικό σφάλµα < 0-8 Πλέγµα Jacobi Gauss-Seidel SOR 5x5 0093 5335 36 (ω =.89) 65 (ω =.90) 08 (ω =.9) 35 (ω =.9) 0x0 35645 8967 659 (ω =.94) 476 (ω =.95) 475 (ω =.96) 65 (ω =.97) 0x0 404 66588 76 (ω =.96) 3 (ω =.97) 97 (ω =.98) 00 (ω =.99)
Μέθοδος ADI Για απλούστευση θα µελετήσουµε την περίπτωση που έχουµε αριστερά την απλή οριακή συνθήκη τύπου Dirichlet T(0,y) = 50. ( n+ ) ( n) i, j ( + ρ) i, j+ i+, j = i, j + ( ρ) i, j i, j T T T T T T για και i =,..., N j =,..., N ( n+ ) ( n+ ) i, j ( + ρ) i, j+ i, j+ = i, j+ ( ρ) i, j i, j T T T T T T + για και i =,..., N j =,..., N Στον παρακάτω αλγόριθµο σε κάθε βήµα αντί να λύσουµε δύο τριδιαγώνια συστήµατα n-xn- αγνώστων (ένα για την κατεύθυνση x και ένα για την κατεύθυνση y), λύνουµε n- τριδιαγώνια συστήµατα n- αγνώστων στην κατεύθυνση x και n- τριδιαγώνια συστήµατα n- αγνώστων στην κατεύθυνση y. + Program ADI implicit none doubleprecision,allocatable::a(:),b(:),c(:),d(:),x(:),t(:,:),tnew(:,:),told(:,:) integer::nn=0,n,m,i,j,k,l,status=0,maxl,done doubleprecision::s,max,rel,err,rr n=nn- allocate(a(n),b(n),c(n-),x(n),d(n),t(nn,nn),tnew(nn,nn),told(nn,nn)) if (status/=0) Stop 'Not enough memory' T(:,:)=50. T(,:)=00. T(nn,:)=00. T(:,)=50. T(:,nn)=50. Tnew(:,:)=T(:,:) rr=0. A(:)=. B(:)=-(.+rr) C(:)=. maxl=30000 rel=0.0 l= done=0 do while (l<=maxl.and. done==0 ) Told(:,:)= T(:,:) do k=,nn- do j=,nn- s=-(t(k-,j)-(.-rr)*t(k,j)+t(k+,j)) if (j==) then D(j-)=s-T(k,j-) elseif (j==nn-) then D(j-)=s-T(k,j+) else D(j-)=s
call Thomas(n,a,b,c,d,x) Tnew(k,:nn-)=x! print*, 'd=', d(:)! print*, 'x=',x(:)!read* T(:,:)=Tnew(:,:) do k=,nn- n- s=-(t(i,k-)-(.-rr)*t(i,k)+t(i,k+)) if (i==) then D(i-)=s-T(i-,k) elseif (i==nn-) then D(i-)=s-T(i+,k) else D(i-)=s call Thomas(n,a,b,c,d,x) Tnew(:nn-,k)=x T(:,:)=Tnew(:,:)! elenxos gia termatismo max=- do i=,nn do j=,nn err = abs((t(i,j) - told(i,j))/t(i,j)) * 00. if (err>max) then max=err if (max<rel) then done= l=l+ print*, '-------------'!do i=,nn! print*, T(i,:)! open(4,file='res_adi.txt',recl=0000) do i=nn,,- write(4,*) t(i,:) print*, l-,max contains subroutine Thomas(n,a,b,c,d,x) integer,intent(in) :: n
doubleprecision, INTENT(IN) ::a(n),b(n),c(n),d(n) doubleprecision, INTENT(OUT) ::x(n) doubleprecision ::t(n),u(n) integer :: i t()=b() u()=d()/t() t(i)=b(i)-a(i)*c(i-)/t(i-) u(i)=(d(i)-a(i)*u(i-))/t(i) x(n)=u(n) do i=n-,,- x(i)=u(i)-c(i)/t(i)*x(i+) end subroutine Thomas end H ADI συγκλίνει σε 5 επαναλήψεις και για Ν=50 δίνει το παρακάτω γράφηµα:
Οµάδα Γ: Άσκηση Επιλύουµε τη διαφορική εξίσωση Poisson: u u u = + = x y µε οριακές συνθήκες ux (,0) = ux (,) = u(0, y) = u(, y) = 0. (Γ) Αρχικά διακριτοποιούµε το πεδίο ορισµού 0 x, y : xωρίζουµε την κάθε πλευρά σε Ν ίσα διαστήµατα (N+ κόµβους) πλάτους h = N Στη συνέχεια διακριτοποιούµε την (Γ) στον τυχαίο κόµβο (, i j) και παίρνουµε τον τύπο των 5 σηµείων: u ( u u u u 4 i, j= i, j+ i+, j+ i, j + i, j+ + ) h για i =,..., N και j =,..., N (Γ) Για την επίλυση του συστήµατος θα χρησιµοποιήσουµε τις µεθόδους Jacobi, Gauss- Seidel και SOR Jacobi ( n+ ) ( ) ( ) ( ) ( ), ( n n n n ui j = ui, j + ui+, j + ui, j + ui, j+ + ) 4 j =,..., N Gauss-Seidel h για i =,..., N και ( n+ ) ( ) ( ) ( ) ( ), ( n n+ n n+ ui j = ui, j + ui+, j + ui, j + ui, j+ + h ) για i,..., 4 = N και j =,..., N (Ο υπολογισµός γίνεται από πάνω προς τα κάτω και από αριστερά προς τα δεξιά) SOR u = ω ( u + u + u + u + h ) + ( ω) u, 4 ( n+ ) ( n) ( n+ ) ( n) ( n+ ) ( n) i, j i, j i+, j i, j i, j+ i j για i =,..., N και j =,..., N Για τον υπολογισµό της ζητούµενης παροχής θα έχουµε: Q = uda Q = u( x, y) dxdy 0 0 και βάσει του κανόνα του τραπεζίου θα είναι: h Q= [ u,+ u, N+ + un+,+ un+, N+ + 4 N N N N N N ] + u + u + u + u + 4 u, j N+, j i, i, N+ i, j j= j= i= i= i= j=
Program Jacobi_GaussSeidel_SOR implicit none doubleprecision,allocatable::u(:,:),uold(:,:) integer::n,i,j,k,kk,h,status,maxi,done,method,l doubleprecision::s,rel,err,max,s,s,q doubleprecision::hh,w n=50 allocate(u(n+,n+),uold(n+,n+)) if (status/=0) Stop 'Not enough memory' maxi=50000 rel=0.0000000 hh=./n do method=,3!=jacobi, =gauss-seidel, 3=SOR u(:,:)=0. if (method==) then uold(:,:)=u(:,:)! print*,x0(:)!read* k= done=0 do while (k<=maxi.and. done==0) do j=,n u(i,j)= 0.5*(uold(i,j+)+uold(i,j-)+uold(i+,j)+uold (i-,j)+hh**)! elenxos gia termatismo max=- do j=,n err = abs((u(i,j) - uold(i,j))/u(i,j)) if (err>max) then max=err if (max<rel) then done= uold(:,:)=u(:,:) k=k+ open(,file='res_jacobi.txt',recl=0000)!xwris to RECL=000 to megisto platos xwraei monon 5 sthles toy pinaka do i=n+,,-! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! write(,*) u(i,:) print*, 'Jacobi' print*, k-,max print*,'------------------------' elseif (method==) then!gauss-seidel k= done=0
do while (k<=maxi.and. done==0) uold(:,:)=u(:,:) do j=,n u(i,j)= 0.5*(u(i,j+)+u(i,j-)+u(i+,j)+u(i-,j)+hh**)! elenxos gia termatismo max=- do j=,n err = abs((u(i,j) - uold(i,j))/u(i,j)) if (err>max) then max=err if (max<rel) then done= k=k+ open(,file='res_gauss.txt',recl=000)!xwris to RECL=000 to megisto platos xwraei monon 5 sthles toy pinaka do i=n+,,-! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! write(,*) u(i,:) print*, 'Gauss Seidel' print*, k-,max print*, '-------------------------------' elseif (method==3) then!sor do w=.8,.99,0.0 k= done=0 u(:,:)=0.!w=.90 do while (k<=maxi.and. done==0) uold(:,:)=u(:,:) do j=,n u(i,j)= 0.5*w*(u(i,j+)+u(i,j-)+u(i+,j)+u(i-,j)+hh**)+(-w)*u(i,j)! elenxos gia termatismo max=- do j=,n err = abs((u(i,j) - uold(i,j))/u(i,j)) if (err>max) then max=err if (max<rel) then done=
k=k+ open(3,file='res_sor.txt',recl=000)!xwris to RECL=000 to megisto platos xwraei monon 5 sthles toy pinaka do i=n+,,-! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! write(3,*) u(i,:) print*, 'SOR' print*, k-,w!ypologismos ths paroxhs q s=0 do l=,n s=s+u(l,)+u(l,n+)+u(,l)+u(n+,l) s=0 do i=,n do j=,n s=s+u(i,j) q=(u(,)+u(,n+)+u(n+,)+u(n+,n+)+*s+4*s)*hh**/4 print*,q end Ενδεικτικά για N=4 (πλέγµα 5x5) θα έχουµε µε τη Jacobi τα εξής αποτελέσµατα: Ταχύτητες (u ) 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 4.96074E-0 5.4677963E-0 4.96074E-0 0.0000000E+00 0.0000000E+00 5.4677963E-0 7.09949E-0 5.4677963E-0 0.0000000E+00 0.0000000E+00 4.96074E-0 5.4677963E-0 4.96074E-0 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 Παροχή: Q=0.088037
Στον επόµενο πίνακα φαίνεται συγκεντρωτικά ο αριθµός επαναλήψεων µέχρι την σύγκλιση ανά µέθοδο και πλήθος κόµβων: Σχετικό σφάλµα< 0-4 Πλέγµα Jacobi Gauss-Seidel SOR 5x5 59 967 7 (ω =.86) 08 (ω =.87) 0 (ω =.88) 04 (ω =.89) 0x0 389 59 34 (ω =.9) 05 (ω =.93) 04 (ω =.94) 08 (ω =.95) 0x0 730 547 4 (ω =.96) 404 (ω =.97) 450 (ω =.98) 908 (ω =.99) Σχετικό σφάλµα< 0-6 Πλέγµα Jacobi Gauss-Seidel SOR 5x5 3898 6 65(ω =.87) 4(ω =.88) 3 (ω =.89) 44 (ω =.90) 0x0 790 7098 395 (ω =.9) 33 (ω =.93) 43 (ω =.94) 80 (ω =.95) 0x0 39976 783 93 (ω =.95) 73 (ω =.96) 456 (ω =.97) 804 (ω =.98) Σχετικό σφάλµα< 0-8 Πλέγµα Jacobi Gauss-Seidel SOR 5x5 69 39 53 (ω =.86) 3 (ω =.87) 86 (ω =.88) 0 (ω =.89) 0x0 7 76 556 (ω =.95) 459 (ω =.96) 38 (ω =.97) 407 (ω =.98) 0x0 7738 4430 35 (ω =.95) 035 (ω =.96) 653 (ω =.97) 894 (ω =.98)
Οµάδα Γ: Άσκηση 7 Επιλέγουµε l= l= l3= δηλαδή έναν κύβο µε ακµές από 0 έως, µε f( x, y ) = 00. Επιλύουµε τη διαφορική εξίσωση Laplace: T T T x y z T = 0 + + = 0 (Γ3) µε οριακές συνθήκες: T( x, y,) = 00, T( x, y,0) = T( x,0, z) = T( x,, z) = T(0, y, z) = T(, y, z) = 0 ιακριτοποιούµε το πεδίο ορισµού 0 x, yz, : χωρίζουµε την κάθε πλευρά σε Ν ίσα διαστήµατα (N+ κόµβους) πλάτους h =. N ιακριτοποιούµε την (Γ3) στον τυχαίο κόµβο (, i j, k) και παίρνουµε τον τύπο των 7 σηµείων: Ti, j, k = ( Ti, j, k + Ti+, j, k + Ti, j, k + Ti, j+, k + Ti, j, k + Ti, j, k+ ), 6 για i =,..., N, j =,..., N και k =,..., N (Γ4) Επιλύουµε το σύστηµα µε τις µεθόδους Jacobi, Gauss-Seidel και SOR. Jacobi ( n+ ) ( ) ( ) ( ) ( ) ( ),, ( n n n n n ( n) ui jk = ui, jk, + ui+, jk, + ui, j, k + ui, j+, k + ui, jk, + + ui, jk, ) 6 για, και i =,..., N j =,..., N k =,..., N. Gauss-Seidel ( n ) ( ) ( ) ( ) ( ) ( ) ( ),, ( n n n n n u + i j k ui, j, k u + i, j, k ui, j, k u + i, j, k u + n = + + + + + + i, j, k+ + ui, j, k ) 6 για i =,..., N, j =,..., N και k =,..., N SOR u = ω ( u 6 + u + u + u + u + u ) + ( ω) u για i =,..., N, j =,..., N και k =,..., N ( n+ ) ( n) ( n+ ) ( n) ( n+ ) ( n+ ) ( n) ( n) ijk,, i,, jk i+,, jk ij,, k ij, +, k ijk,, + ijk,, ijk,, Program Jacobi_GaussSeidel_SOR implicit none doubleprecision,allocatable::t(:,:,:),told(:,:,:) integer::n,i,j,k,kk,h,status,maxi,done,method,l,m,z doubleprecision::s,rel,err,max,s,s,q doubleprecision::t0,hh,w n=0 allocate(t(n+,n+,n+),told(n+,n+,n+))
if (status/=0) Stop 'Not enough memory' hh=./n maxi=30000 rel=0.0000000 do method=,3!=jacobi, =gauss-seidel, 3=SOR t(:,:,:)=0. t(:,,:)=00. if (method==) then told(:,:,:)=t(:,:,:)! print*,x0(:)!read* m= done=0 do while (m<=maxi.and. done==0) do j=,n do k=,n t(i,j,k)= (./6.)*(told(i,j+,k)+told(i,j-,k)+told(i+,j,k)+told (i-,j,k)+told (i,j,k-)+told (i,j,k+))! elenxos gia termatismo max=- do j=,n do k=,n err = abs((t(i,j,k) - told(i,j,k))/t(i,j,k)) if (err>max) then max=err if (max<rel) then done= told(:,:,:)=t(:,:,:) m=m+ open(,file='res_jacobi.txt',recl=0000)!xwris to RECL=000 to megisto platos xwraei monon 5 sthles toy pinaka do i=n+,,-! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! write(,*) t(i,:,:) do i=,n+, do j=,n+,! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! do k=,n+, write(,*) t(i,j,k)!write(,*) z,'--------------------------------' print*, 'Jacobi' print*, m-,max print*,'------------------------'
elseif (method==) then!gauss-seidel m= done=0 do while (m<=maxi.and. done==0) told(:,:,:)=t(:,:,:) do j=,n do k=,n t(i,j,k)= (./6.)*(t(i,j+,k)+t(i,j-,k)+t(i+,j,k)+t(i-,j,k)+t(i,j,k- )+t(i,j,k+))! elenxos gia termatismo max=- do j=,n do k=,n err = abs((t(i,j,k) - told(i,j,k))/t(i,j,k)) if (err>max) then max=err if (max<rel) then done= m=m+ open(,file='res_gauss.txt',recl=000)!xwris to RECL=000 to megisto platos xwraei monon 5 sthles toy pinaka do i=n+,,-! ta typwnoyme anapoda gia na ta deiksei o array visualizer swsta! write(,*) t(i,:,:) print*, 'Gauss Seidel' print*, m-,max print*,'------------------------' elseif (method==3) then!sor do w=.,.9,0. t(:,:,:)=0. t(:,,:)=00. m= done=0 do while (m<=maxi.and. done==0) told(:,:,:)=t(:,:,:) do j=,n do k=,n t(i,j,k)= (./6.)*(t(i,j+,k)+t(i,j-,k)+t(i+,j,k)+t(i-,j,k)+t(i,j,k- )+t(i,j,k+))+(-w)*t(i,j,k)! elenxos gia termatismo max=-
do j=,n do k=,n err = abs((t(i,j,k) - told(i,j,k))/t(i,j,k)) if (err>max) then max=err if (max<rel) then done= m=m+ open(3,file='res_sor.txt',recl=000) do k=,n+ do i=,n+ do j=,n+ write(3,*) i,'/',j,'/',k,'/',t(i,j,k) print*, 'SOR' print*, w, m- print*,'------------------------' end
Σχετικό σφάλµα< 0-4 Πλέγµα Jacobi Gauss-Seidel SOR xx 60 87 35 (ω =.0) 9 (ω =.0) 3 (ω =.30) 9 (ω =.40) 35 (ω =.50) 5x5x5 460 397 56 (ω =.0) 39 (ω =.30) 65 (ω =.35) Σχετικό σφάλµα< 0-6 Πλέγµα Jacobi Gauss-Seidel SOR xx 54 33 47 (ω =.0) 4 (ω =.0) 6 (ω =.30) 36 (ω =.40) 5x5x5 4848 58 4 (ω =.0) 68 (ω =.0) 5 (ω =.30) >500 (ω =.40) Σχετικό σφάλµα< 0-8 Πλέγµα Jacobi Gauss-Seidel SOR xx 344 79 60 (ω =.0) 9 (ω =.0) 9 (ω =.30) 35 (ω =.40) 5x5x5 74 377 67 (ω =.0) 79 (ω =.0) 64 (ω =.30) 3 (ω =.40)
Ενδεικτικά αποτελέσµατα για N=50 µε Gauss-Seidel και σχετικό σφάλµα 0 κόµβους): 0 (ανά i j k T i, j, k 00.0000 0 0 3 0 4 0 5 0 00.0000 0 0 3 0 4 0 5 0 00.0000 0 0 3 0 4 0 5 0 3 00.0000 3 0 3 0 3 3 0 3 4 0 3 5 0 4 00.0000 4 0 4 0 4 3 0 4 4 0 4 5 0 5 00.0000 5 0 5 0 5 3 0 5 4 0 5 5 0 00.0000 0 0 3 0 4 0 5 0 00.0000 3.95000 0.6038 3 3.905077 4.36879 5 0 00.0000 40.487 5.7056 3 6.308 4.3003 5 0 3 00.0000 3 40.488 3 5.70705 3 3 6.35 3 4.384 3 5 0 4 00.0000 4 3.9569 4 0.60647 4 3 3.907665 4 4.38435 4 5 0
5 00.0000 5 0 5 0 5 3 0 5 4 0 5 5 0 00.0000 0 0 3 0 4 0 5 0 00.0000 40.487 5.7056 3 6.308 4.3003 5 0 00.0000 5.49630 3.45880 3 9.6445 4 3.39837 5 0 3 00.0000 3 5.49775 3 3.4607 3 3 9.646464 3 4 3.399648 3 5 0 4 00.0000 4 40.48989 4 5.70985 4 3 6.3498 4 4.5473 4 5 0 5 00.0000 5 0 5 0 5 3 0 5 4 0 5 5 0 3 00.0000 3 0 3 0 3 3 0 4 3 0 5 3 0 3 00.0000 3 40.488 3 5.70705 3 3 6.35 4 3.384 5 3 0 3 00.0000 3 5.49775 3 3.4607 3 3 9.646464 4 3 3.399648 5 3 0 3 3 00.0000 3 3 5.4997 3 3 3.4633 3 3 3 9.648635 3 4 3 3.400954 3 5 3 0 4 3 00.0000 4 3 40.49075 4 3 5.70 4 3 3 6.3643 4 4 3.665 4 5 3 0
5 3 00.0000 5 3 0 5 3 0 5 3 3 0 5 4 3 0 5 5 3 0 4 00.0000 4 0 4 0 3 4 0 4 4 0 5 4 0 4 00.0000 4 3.9569 4 0.60647 3 4 3.907665 4 4.38435 5 4 0 4 00.0000 4 40.48989 4 5.70985 3 4 6.3498 4 4.5473 5 4 0 3 4 00.0000 3 4 40.49075 3 4 5.70 3 3 4 6.3643 3 4 4.665 3 5 4 0 4 4 00.0000 4 4 3.9539 4 4 0.60898 4 3 4 3.9007 4 4 4.39905 4 5 4 0 5 4 00.0000 5 4 0 5 4 0 5 3 4 0 5 4 4 0 5 5 4 0 5 00.0000 5 0 5 0 3 5 0 4 5 0 5 5 0 5 00.0000 5 0 5 0 3 5 0 4 5 0 5 5 0 5 00.0000 5 0 5 0 3 5 0 4 5 0 5 5 0 3 5 00.0000 3 5 0 3 5 0 3 3 5 0 3 4 5 0 3 5 5 0 4 5 00.0000 4 5 0 4 5 0 4 3 5 0 4 4 5 0 4 5 5 0
5 5 00.0000 5 5 0 5 5 0 5 3 5 0 5 4 5 0 5 5 5 0 Γράφηµα µε το πρόγραµµα MayaVi και την εντολή IsoSurface: Γράφηµα µε το πρόγραµµα MayaVi και την εντολή ScalarCutPlane:
Η µορφή του αρχείου δεδοµένων (επέκταση.vtk) για τα προηγούµενα γραφήµατα είναι η ακόλουθη (για Ν=0): # vtk DataFile Version.0 3D Periodic Array ASCII DATASET STRUCTURED_POINTS DIMENSIONS ORIGIN 0.000 0.000 0.000 SPACING.00.00.00 POINT_DATA 33 SCALARS temperature float LOOKUP_TABLE default 00.0000 00.0000 00.0000 00.0000 00.0000 00.0000 00.0000 00.0000 00.0000 00.0000 00.0000 0.0000000E+00 0.0000000E+00 0.0000000E+00 κ.ο.κ. Όπου 33=** και τις τιµές (00.000 κοκ) τις παίρνουµε µε τον ακόλουθο κώδικα Fortran: do i=,n+ do j=,n+ do k=,n+ write(3,*) t(i,j,k)