Υπολογιστικές Μέθοδοι 006-7 Άσκηση. (Επιμέλεια: Ιωάννης Λυχναρόπουλος) Θα επιλύσουμε την εξίσωση: urr ur u t, t t 0 και R i /Rout r r Έστω Ri 0.4 και Rout δηλαδή: Ri / Rout 0.4 με αρχική συνθήκη: ur (,0) 0 και οριακές τιμές τις:, u(0.4, t) 0 και u(, t) 00 Έστω επίσης ότι διαιρούμε την απόσταση μεταξύ R i και 0.6 r τότε ri 0.4 ir, i 0,,..., I I Επίσης από οριακές τιμές θα έχουμε: u0 0 και u 0 I R out σε I ίσα διαστήματα: Ρητό σχήμα ui ui ui ui ui ui ui r ri r t t t t t t ui ui u i u i r r rir r rir, i,..., I Ακολουθεί η ανάλυση ευστάθειας vo Newma (Δεν βλάπτει την γενικότητα να χρησιμοποιήσουμε τη σχέση: r i r αντί της r 0.4 i r. Επίσης το ir το γράφουμε σαν urt (, ) ( trr ) ( ) ( te ) i r για να μην υπάρξει σύγχυση με το μιγαδικό i ) ikr ik( rr) ikr ik( rr) ik( rr) ik( rr) ikr e e e e e e () t ( t t) () t r r r t ikr ikr ikr ikr e e e e ( t t) ( t) () t r r r t t ( tt) Θα χρησιμοποιήσουμε τους συμβολισμούς,. r () t ikr ikr ikr ikr e e e e cos isi όπου k r si i si 4si i si 4si si 4 si si Το σχήμα συγκλίνει όταν. i
Υπολογιστικές Μέθοδοι 006-7 Πεπλεγμένο σχήμα u u u u u u u r r r t i i i i i i i, i, ui u i u i u i r t r rir r rir t t t t i i i r ri r r u u u Η ανάλυση ευστάθειας δίνει τα εξής: urt (, ) ( trr ) ( ) ( te ) ikrr t r t ui ri r ik( rr) ikr ik( rr) ik( rr) ik( rr) ikr e e e e e e ( tt) ( t t) ( t r r r ) t ikr ikr ikr ikr e e e e ( tt) ( t) ( tt) r r r t t ( tt) Θα χρησιμοποιήσουμε τους συμβολισμούς,. r () t ikr ikr ikr ikr e e e e cosr isi όπου k r και r si isi 4 si isi 4 si i si 4 si i si 4si si 4 si si 4 si si Η παραπάνω ανισότητα ισχύει πάντα και επομένως το πεπλεγμένο σχήμα είναι ευσταθές ανεξάρτητα από την επιλογή των διαστημάτων στο χώρο και το χρόνο.
Υπολογιστικές Μέθοδοι 006-7 Πρόγραμμα Fortra: Program rhto_peplegmeo_c implicit oe doubleprecisio,allocatable::r(:),u(:),uold(:),temp(:) iteger::,i,,k,m,status,tmax,doe,method doubleprecisio::err,max,dr,dz,dt,l doubleprecisio::a,b,c,d,e,f =00 dt=0.00 dr=0.6/() err=0.000 allocate(r(0:),u(0:),uold(0:),temp(0:)) tmax=000000 do i=0, r(i)=0.4+i*dr ed do read*,method!method=3!=rhto, =peplegmeo, 3=crak icolso if (method==) the!=rhto u(0:)=0. m= doe=0 do while (m<=tmax.ad. doe==0) uold=u u(0)=0 u()=00 do i=,- a=dt/dr**-dt/(*r(i)*dr) b=-(.*dt)/dr** c=dt/dr**+dt/(*r(i)*dr) ed do! elexos gia termatismo u(i)= a*uold(i-)+b*uold(i)+c*uold(i+) temp(0:) = abs(u(0:) - uold(0:)) if (maxval(temp)<err) the doe= ed if m=m+ ed do ope(0,file='res_rhto.txt',recl=0000) Write(0,'(<>(f6.,x))') u prit*, 'Rhto' prit*, m-,max elseif (method==) the!=peplegmeo u(0:)=0. m= doe=0 do while (m<=tmax.ad. doe==0) 3
Υπολογιστικές Μέθοδοι 006-7 uold=u u(0)=0 u()=00 do i=,- ed do!sytelestes! elexos gia termatismo a= +.*dt/dr** b=dt/dr** - dt/(.*r(i)*dr) c=dt/dr** + dt/(.*r(i)*dr) u(i)= (b*u(i-)+c*u(i+)+uold(i))/a temp(:) = abs(u(:) - uold(:)) if (maxval(temp)<err) the doe= ed if m=m+ ed do ope(,file='res_pepleg.txt',recl=0000)!do i=,+! ta typwoyme aapoda gia a ta deiksei o array visualizer swsta! Write(,'(<>(f6.,x))') u(:)! ed do prit*, 'Peplegmeo' prit*, m-,max elseif (method==3) the!3=crank NICOLSON u(:)=0. m= doe=0 do while (m<=tmax.ad. doe==0) uold=u u(0)=0 u()=00 do i=,-!sytelestes a=./dr** +./dt b=./(.*dr**) -./(4.*r(i)*dr) c=./(.*dr**) +./(4.*r(i)*dr) d= -./dr** +./dt e=-./(.*dr**) - /(4.*r(i)*dr) f=-./(.*dr**) + /(4.*r(i)*dr) u(i)= (-f*u(i-)-e*u(i+)+d*uold(i)+b*uold(i-)+c*uold(i+))/a!u(i,)=(0.5*uold(i-,)*(./(dr**)-./(r(i)*.*dr))+0.5*u(i-,)*(./(dr**)-./(r(i)*.*dr))+uold(i+,)*(./(dr**)+./(r(i)*.*dr))+uold(i,+)*(./dz**)+0.5*u (i,-)*(./dz**)+0.5*uold(i,-)*(./dz**)+uold(i,)*(./dt-./dr**-./dz**))/(./dr**+./dz**+./dt) ed do! elexos gia termatismo temp(:) = abs(u(:) - uold(:)) if (maxval(temp)<err) the doe= ed if m=m+ ed do 4
Υπολογιστικές Μέθοδοι 006-7 ope(,file='res_crak.txt',recl=0000)! do i=,+ Write(,'(<>(f6.,x))') u(:)! ed do prit*, 'Crak-Nicolso' prit*, m-,max ed if ed program 5
Υπολογιστικές Μέθοδοι 006-7 Άσκηση. (Επιμέλεια: Κωνσταντίνος Ρήτος) Θα λύσουμε την εξίσωση: uxx uyy u t t t 0 και 0 x W/H, 0 y Αρχικές και συνοριακές συνθήκες: u x,y,t, u 0,y,t u x, 0,t 0, u,y,t u x,,t 0 0 Θεωρούμε επίσης ότι t 0 =0, W/H= και Δx=Δy=h Ρητό σχήμα 0 u u u u u u u u i, i, i, i, i, i, i, i, O t x y t x y u u u u u (4 ) u i, i, i, i, i, i, i 0,,..., I 0,,..., J 0,,..., N [,, ] όπου λ=δt/h Η παραπάνω σχέση αξιοποιείται στον κώδικα του παραρτήματος για τους εσωτερικούς κόμβους. ak y akxix y Ακολουθεί ανάλυση ευστάθειας vo Newma. Θεωρούμε: ui, e e, όπου a και αντικαθιστούμε στην εξίσωση πεπερασμένων διαφορών ak ak xix y y ak ak xix y y e e e e t akx( i) x ak y y ak ak xix y y akx( i) x aky y e e e e e e x ak ak y( ) y aky y ak y( ) y xix akxix akxix e e e e e e y akxx akxx ( e e ) t x ak y ak y ( y y e e ) y Συνδυάζοντας τέλος κατάλληλα τους όρους εντός των παρενθέσεων προκύπτει kxx k yy 4xsi 4ysi 6
Υπολογιστικές Μέθοδοι 006-7 όπου λ x =Δt/Δχ και λ y = Δt/Δy. Επομένως το παραπάνω ρητό σχήμα είναι ευσταθές μόνο όταν kxx k yy 4xsi 4ysi που οδηγεί στο κριτήριο ευστάθειας x y t( ) x y Σημειώνεται ότι στη δική μας περίπτωση όπου Δx=Δy=h το κριτήριο ευστάθειας t είναι. h 4 Πεπλεγμένο σχήμα u u u u u u u u i, i, i, i, i, i, i, i, O t x y t x y [,, ] Επειδή έχουμε Δx=Δy=h η παραπάνω εξίσωση γράφεται στη μορφή u, u, u, u, u, (4 ) u i i i i i i, i 0,,..., I 0,,..., J 0,,..., N Η ανάλυση ευστάθειας δίνει τα εξής: ak ak xix yy ak ak xix yy e e e e t akx( i) x akyy ak ak xix yy akx( i) x akyy e e e e e e x ak aky( ) y ak y y aky( ) y xix akxix akxix e e e e e e y t x ( e akxx akxx akxx akxx akyy akyy [ ( e e ) y( e e )] akyy ak yy e ) ( e e ) y kxx k yy 4xsi 4ysi Η παραπάνω ανισότητα ισχύει πάντα αφού ο παρονομαστής είναι πάντα μεγαλύτερος της μονάδας. Επομένως το πεπλεγμένο σχήμα είναι ευσταθές ανεξάρτητα από την επιλογή των διαστημάτων στο χώρο και το χρόνο. 7
Υπολογιστικές Μέθοδοι 006-7 Σχήμα Crak-Nicolso Εφαρμόζοντας κεντρώες εκφράσεις πεπερασμένων διαφορών στο χρόνο και το χώρο προκύπτει η εξίσωση πεπερασμένων διαφορών: ui, ui, ui, ui, ui, ui, ui, ui, x ( ) x t x x ui, ui, ui, ui, ui, ui, y ( ) [,, ] y O t x y y y i 0,,..., I 0,,..., J 0,,..., N Στην περίπτωση μας που ισχύει Δx=Δy=h και θ Χ =θ y =/ προκύπτει το σχήμα Crak- Nicolso u u u u ( ) u u u u u ( ) u i, i, i, i, i, i, i, i, i, i, όπου λ=δt/h. Η ανάλυση ευστάθειας δίνει τα εξής: ak ( ) y y( ) x i x ak y ak ak y xix akx( i) x aky y e e e e e e aky( ) y ak ak xix y y akxix e e ( ) e e ak ( ) aky y aky( ) y x i x akxix akx( i) x aky y e e e e e e ak ak xix y( ) y akxix aky y e e ( ) e e ak ak ( ) xx akxx yy akyy e e e e ak ak ( ) xx akxx yy ak yy e e e e Η παραπάνω ανισότητα ισχύει πάντα αφού ο αριθμητής είναι πάντα μικρότερος από τον παρονομαστή. Επομένως το σχήμα Crak-Nicolso είναι ευσταθές ανεξάρτητα από την επιλογή των διαστημάτων στο χώρο και το χρόνο. Το πρόγραμμα που χρησιμοποιεί τα αντίστοιχα σχήματα παρουσιάζεται στο παράρτημα. Ο παρακάτω πίνακας περιέχει τα αποτελέσματα για 0 x 0 διαστήματα ( x κόμβοι), h=/0 και Δt=0.00 και μέγιστο απόλυτο σφάλμα 0-4 0 0 0 0 0 0 0 0 0 0 0 0.44 4.87 7.35 9.98 3.0 6.95.84 33. 55.00 0 0 4.87 9.7 4.54 9.55 5. 3.93 4.9 55.00 76.79 0 0 7.35 4.54.55 8.57 35.99 44.48 55.00 68.80 87.6 0 0 9.98 9.55 8.57 37.8 45.79 55.00 65.5 78.06 93.05 0 8
Υπολογιστικές Μέθοδοι 006-7 0 3.0 5. 35.99 45.79 55.00 64.0 74.00 84.87 96.99 0 0 6.95 3.93 44.48 55.00 64.0 7.8 8.4 90.44 00.0 0 0.84 4.9 55.00 65.5 74.00 8.4 88.44 95.46 0.65 0 0 33. 55.00 68.80 78.06 84.87 90.44 95.46 00.9 05.3 0 0 55.00 76.79 87.6 93.05 96.99 00.0 0.65 05.3 07.56 0 0 0 0 0 0 0 0 0 0 0 0 Οι παρακάτω πίνακες δείχνουν τον αριθμό των χρονικών βημάτων ώστε να επιτευχθεί η μόνιμη λύση όπως αυτή προκύπτει από το απόλυτο σφάλμα: Για x κόμβους με Δt=0.00 και σφάλμα 0-4 Μέθοδος Χρονικά βήματα Ρητό Σχήμα 496 Πεπλεγμένο 589 Crak-Nicolso 543 Για x κόμβους με Δt=0.00 και σφάλμα 0-6 Μέθοδος Χρονικά βήματα Ρητό Σχήμα 79 Πεπλεγμένο 87 Crak-Nicolso 800 Για x κόμβους με Δt=0.000 και σφάλμα 0-4 Μέθοδος Χρονικά βήματα Ρητό Σχήμα 3789 Πεπλεγμένο 4057 Crak-Nicolso 394 Για x κόμβους με Δt=0.000 και σφάλμα 0-6 Μέθοδος Χρονικά βήματα Ρητό Σχήμα 65 Πεπλεγμένο 658 Crak-Nicolso 6354 Παρατηρούμε ότι τα αποτελέσματα ανεξάρτητα από τη μέθοδο έχουν ακριβώς την ίδια ακρίβεια. Αυτό που διαφέρει είναι τα χρονικά βήματα που απαιτούνται και η ευστάθεια κάθε μεθόδου. Συγκεκριμένα το ρητό σχήμα είναι το πιο γρήγορο αλλά ταυτόχρονα και αυτό στο οποίο απαιτείται προσοχή στην επιλογή των διαστημάτων στο χώρο και το χρόνο ώστε να είναι ευσταθές. Το πεπλεγμένο σχήμα και το σχήμα Crak-Nicolso είναι πάντα ευσταθή με το σχήμα Crak- Nicolso να υπερτερεί σε αριθμό βημάτων. Σαν βέλτιστο σχήμα θα μπορούσαμε να θεωρήσουμε το σχήμα Crak-Nicolso. 9
Υπολογιστικές Μέθοδοι 006-7 program rito_peplegmeo_c implicit oe! Variables doubleprecisio,allocatable::u(:,:),uold(:,:),temp(:,:) doubleprecisio::err,max,dx,dy,dt,h doubleprecisio::a,b,c,d,e iteger::,i,,k,m,status,tmax,doe,method! Body of rito_peplegmeo_c =0!αριθμός διαστημάτων dt=0.000 dx=./() dy=./()!dx=dy=h h=dx err=0.000 allocate(u(+,+),uold(+,+),temp(+,+)) tmax=00000 read*, method!method=3!=rito, =peplegmeo, 3=crak icolso if (method==) the!=rito u(:,:)=0. m= doe=0 do while (m<=tmax.ad. doe==0) uold=u u(+,:)=0 u(:,+)=0 u(,:)=0. u(:,)=0. do i=, do =,!συντελεστές a=dt/(h**) b=a c=a d=a e=-4*a u(i,)=a*uold(i-,)+b*uold(i+,)+c*uold(i,+)+d*uold(i,- )+e*uold(i,)!έλεγχος για τερματισμό temp(:,:)=abs(u(:,:)-uold(:,:)) 0
Υπολογιστικές Μέθοδοι 006-7 if(maxval(temp)<err) the doe= edif m=m+ ope(0,file='res_rhto.txt',recl=0000) do i=,+ write(0,'((f6.,x))') u(i,:) prit*, 'Rito' prit*, m-,'max' elseif (method==) the!=peplegmeo u(:,:)=0. m= doe=0 do while (m<=tmax.ad. doe==0) uold=u u(+,:)=0 u(:,+)=0 u(,:)=0. u(:,)=0. do i=, do =,!συντελεστές a=+4*(dt/(h**)) b=dt/(h**) c=b d=b e=b u(i,)=(b*u(i-,)+c*u(i,-)+d*u(i+,)+e*u(i,+)+uold(i,))/a!έλεγχος για τερματισμό temp(:,:)=abs(u(:,:)-uold(:,:)) if(maxval(temp)<err) the doe= edif m=m+ ope(,file='res_pepleg.txt',recl=0000) do i=,+ write(,'((f6.,x))') u(i,:) prit*, 'Peplegmeo' prit*, m-,'max'
Υπολογιστικές Μέθοδοι 006-7 elseif (method==3) the!3=crak icolso u(:,:)=0. m= doe=0 do while (m<=tmax.ad. doe==0) uold=u u(+,:)=0 u(:,+)=0 u(,:)=0. u(:,)=0. do i=, do =,!συντελεστές a=*(+*(dt/(h**))) b=dt/(h**) e=*(-*(dt/(h**))) u(i,)=(b*(u(i-,)+u(i+,)+u(i,-)+u(i,+)+uold(i-,)+uold(i+,)+uold(i,-)+uold(i,+))+e*uold(i,))/a!έλεγχος για τερματισμό temp(:,:)=abs(u(:,:)-uold(:,:)) if(maxval(temp)<err) the doe= edif m=m+ ope(,file='res_crak.txt',recl=0000) do i=,+ write(,'((f6.,x))') u(i,:) prit*, 'Crak-Nicolso' prit*, m-,'max' edif ed program rito_peplegmeo_c