ΑΣΚΗΣΗ ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΜΕΘΟΔΟΙ, -, 5 Ο ΕΞΑΜΗΝΟ ΕΠΙΛΥΣΗ ΕΡΓΑΣΙΑΣ #: ΣΥΝΗΘΕΙΣ ΔΙΑΦΟΡΙΚΕΣ ΕΞΙΣΩΣΕΙΣ ΚΑΙ ΣΥΣΤΗΜΑΤΑ ΠΡΟΒΛΗΜΑΤΑ ΔΥΟ ΟΡΙΑΚΩΝ ΤΙΜΩΝ ΕΠΙΜΕΛΕΙΑ: Ιωάννης Λυχναρόπουλος Επιλύστε αριθμητικά με τη μέθοδο των πεπερασμένων διαφορών το παρακάτω πρόβλημα δύο οριακών τιμών: T r =, R r R r r r, T( R ) = T, T( R ) = T Συγκρίνετε τα αριθμητικά αποτελέσματα με τα αντίστοιχα αναλυτικά. Τέλος, περιγράψτε ένα φυσικό πρόβλημα που θα μπορούσε να μοντελοποιείται με το παραπάνω πρόβλημα οριακών τιμών. ΛΥΣΗ H δοσμένη διαφορική εξίσωση γράφεται και ως Αναλυτική λύση (από Mathematica): dt dr dt + = () r dr s = DSolveB: r T'@rD + T''@rD, T@RD T, T@RD T>, T@rD, rf Tr () = = ( ) ( ) ( ) T ln r T ln r+ T ln R T ln R Tln r/ R Tln r/ R ln R ln R ln R / R Έστω: R =, R = 3, T =, T = 3 Αριθμητικό πλέγμα: 3 N N+ r= i- i i+ r=3
Διακριτοποιούμε το πεδίο ορισμού διαιρώντας την απόσταση R r R σε N ίσα διαστήματα πλάτους Δ r = / N. Ορίζονται N + κόμβοι. Προσεγγίζουμε τη διαφορική εξίσωση () στον τυχαίο κόμβο i : T T + T T T + = i+ i i i+ i Δr ri Δr ή Ti + Ti T i+ = r ri r r + +, i=,..., N () Δ Δ Δ Δr riδr όπου r = ( i ) Δr. i Από τις οριακές συνθήκες για i = : T = και για i = N + : T + = 3. Το σύστημα που προκύπτει είναι τριδιαγώνιο και επιλύεται με την μέθοδο Τhomas. Έστω ένα αραιό πλέγμα με N = 4 ( Δ r = 5. ). Τότε προκύπτει το εξής σύστημα 3 εξισώσεων με 3 αγνώστους: 8 4.667 T 666.667 3.5 8 4.5 T3 = 3.6 8 T 4 3 N Η αριθμητική λύση είναι: T = 36.7, T 3 = 6.9, T 4 = 83.3 Η αντίστοιχη αναλυτική λύση είναι: T = 36. 9, T 3 = 63.9, T 4 = 83.4 Πρόγραμμα σε Fortran: Program Poisson implicit none doubleprecision,allocatable::a(:),b(:),c(:),d(:),x(:),r(:),xx(:) doubleprecision:: dr,q,s integer::n,i,status= doubleprecision,parameter::r=.,r=3.,t=.,t=3. n=3!arithmos diasthmatwn -> n+ komboi allocate(a(n-),b(n-),c(n-),x(n+),d(n-),r(n+),xx(n-)) if (status/=) Stop 'Not enough memory' dr=(r-r)/n do i=,n+ r(i)=(i-)*dr+r x()=t x(n+)=t
! Ypologismos syntelestwn algorithmou Thomas gia tous n- eswterikous kombous! px gia n=7 (6 eswterikoi komboi):! b() c() d()! a() b() c() d()! a(3) b(3) c(3) d(3)! a(4) b(4) c(4) d(4)! a(5) b(5) c(5) d(5)! a(6) b(6) d(6) do i=,n- if (i>) then a(i)=./dr**-./(.*r(i+)*dr) end if b(i)=-./dr** if (i<n-) then c(i)=./dr**+./(.*r(i+)*dr) end if d()=-(./dr**-./(.*r()*dr))*t do i=,n- d(i)= d(n-)=-(./dr**+./(.*r(n)*dr))*t print*, '-------------'!print*, 'a= ',a(:),'b= ',b(:),'c= ',c(:),'d= ',d(:) call Thomas(n-,a,b,c,d,xx)! Zhtame apo ton algorithmo Thomas na epilysei ena systhme n- agnwstwn! To apotelesma einai to dianysma xx to opoio ari8mhtai apo ews n-! Epomenws prepei na metatopistei stis ews n theseis tou telikou apotelesmatos x! (afou afora tous eswterikous kombous) x(:n)=xx(:n-) do i=,n+ print '(I3,4H u(,d.5,4h) =,D.5,D.5)',i,r(i),x(i),f(r(i)) contains! Analytikh lysh doubleprecision function f(r) doubleprecision::r f=(t*log(r) - T*Log(r) + T*Log(R) - T*Log(R))/(Log(R) - Log(R)) end function! Algorithmos Thomas 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) 3
t()=b() u()=d()/t() do i=,n 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 Ενδεικτικά το αποτέλεσμα για Ν=. i r i Αριθμητική Αναλυτική Απόλυτο Σφάλμα..... 6.595384 6.59563.397E-3.4 3.66693 3.673.33E-3 3.6 4.786 4.78574.3475E-3 4.8 53.53 53.5648.373E-3 5. 63.9688 63.9975.8696E-3 6. 7.76846 7.76848.358E-3 7.4 79.6884 79.688599.797E-3 8.6 86.9748 86.9744.978E-3 9.8 93.79938 93.79998.5974E-4 3. 3. 3.. 3 5 5 5.5..5..5 3. Γράφημα κατανομής θερμοκρασίας 4
ΑΣΚΗΣΗ Επιλύστε αριθμητικά με τη μέθοδο των πεπερασμένων διαφορών το παρακάτω πρόβλημα ιδιοτιμών: ψ r r r r + k ψ =, r, ψ =, ( ) dψ dr r= = Συγκρίνετε τα αριθμητικά αποτελέσματα με τα αντίστοιχα αναλυτικά. ΛΥΣΗ Διαφορική εξίσωση: d ψ dr dψ r dr + + k ψ = () Οριακές συνθήκες: ψ () = () και dψ dr r= = (3). Αναλυτικές Ιδιοτιμές Αρχικά θα υπολογίσουμε αναλυτικά τις ιδιοτιμές λ = k. Παρατηρούμε πως αν εφαρμόσουμε τον μετασχηματισμό t = kr στην (), θα προκύψει η εξίσωση Bessel μηδενικής τάξης. Έχουμε διαδοχικά: dψ dψ dt dψ = = k dr dt dr dt και d ψ d d ψ dt d d ψ d = k k k = = ψ dr dt dr dr dt dt dt Αντικαθιστώντας παραγώγους στην () παίρνουμε: d ψ dψ d ψ dψ k + k+ k ψ = k r + kr + k r ψ = dt r dt dt dt d ψ dψ t + t + t ψ = dt dt Η παραπάνω εξίσωση είναι γνωστή ως εξίσωση Bessel μηδενικής τάξης και έχει γενική λύση ψ r = c J kr + cυ kr ( ) ( ) ( ) όπου και Υ οι συναρτήσεις Bessel. Σημειώνεται ότι J d p y p( ax) = ay p+ ( ax) + y p( ax), y = J, Y dx x Από την οριακή συνθήκη (3) παίρνουμε: ψ '() = ckj () cky() = c = Η λύση συνεπώς παίρνει την μορφή: ψ () r = cj( kr) Από την οριακή συνθήκη (3) παίρνουμε: ψ () = J( k) = Επομένως οι αναλυτικές ιδιοτιμές είναι λ = k, n =,,3,... n n = = όπου kn οι ρίζες της εξίσωσης J ( ) k =, τις οποίες μπορούμε να πάρουμε με το Mathematica χρησιμοποιώντας την εντολή: 5
Table[N[BesselJZero[,k]],{k,,n}] Για παράδειγμα για n= βρίσκουμε:.4483, 5.58, 8.65373,.795, 4.939, 8.7,.6, 4.355, 7.4935, 3.6346 Άρα οι πρώτες αναλυτικές ιδιοτιμές : 5.7839, 3.473, 74.887, 39.4,.93, 36.563, 449.934, 593.43, 755.89, 938.479 Αριθμητικές Ιδιοτιμές Στη συνέχεια θα υπολογίσουμε αριθμητικά τις ιδιοτιμές λ = k. Διακριτοποιούμε το πεδίο ορισμού διαιρώντας την απόσταση r σε N ίσα διαστήματα πλάτους Δ r = / N. Ορίζονται N + κόμβοι. Προσεγγίζουμε τη διαφορική εξίσωση () στον τυχαίο κόμβο i : ψ ψ + ψ ψ ψ + + λψ = i+ i i i+ i Δr ri Δr i ψ i + ψi λ ψ i+ = r ri r + r + +, i=,..., N () Δ Δ Δ Δr riδr Για i = θα χρησιμοποιήσουμε την οριακή συνθήκη μαζί με την διαφορική εξίσωση: dψ dψ d Παρατηρούμε ότι το limr lim dr ψ = r = r dr r dr d ψ ψ ψ+ ψ Έτσι η () γράφεται: + o λψ = + λψ = (3) dr Δr dψ ψ ψ Η οριακή συνθήκη: = = ψ o = ψ (4) dr r= Δr Ό κόμβος i = είναι φανταστικός. Οι (3) και (4) δίνουν: 4 4 + λ ψ+ ψ = Δr Δr (5) Για i = N + έχουμε: T + = (6) N Η μέθοδος υπολογισμού των ιδιοτιμών είναι η ακόλουθη: Οι σχέσεις () και (5) δημιουργούν ένα γραμμικό ομογενές σύστημα N εξισώσεων με N αγνώστους της μορφής A ψ = το οποίο φέρνουμε στην μορφή: ( B λi) ψ = και στη συνέχεια βρίσκουμε τις ιδιοτιμές του πίνακα B. Ο πίνακας B για μορφή: N =5, έχει την ακόλουθη 6
Για N =, N =5, N = και N = παίρνουμε τα ακόλουθα αποτελέσματα: Ν= n Αριθμητική Τιμή Αναλυτική Τιμή Απόλυτο Σχετικό Σφάλμα % 5.78 5.7839.3 8.98 3.473 37.888 Ν=5 n Αριθμητική Τιμή Αναλυτική Τιμή Απόλυτο Σχετικό Σφάλμα % 5.65539 5.7839.97 7.4994 3.473 9.759 3 58.477 74.887.93 4 87.334 39.4 37.89 5.36.93 45.774 Ν= n Αριθμητική Τιμή Αναλυτική Τιμή Απόλυτο Σχετικό Σφάλμα % 5.7568 5.7839.56 9.6868 3.473.5748 3 7.365 74.887 6.8987 4 3.83 39.4.959 5 85.5.93 6.997 6 48.77 36.563 3.977 7 37.39 449.934 3.68 8 356.343 593.43 39.97 9 389.76 755.89 48.543 484.94 938.479 48.465 Ν= n Αριθμητική Τιμή Αναλυτική Τιμή Απόλυτο Σχετικό Σφάλμα % 5.7753 5.7839.4 3.74 3.473.65596 3 73.743 74.887.566 4 35.48 39.4.874 5.779.93 4.5544 6 35.6 36.563 6.5983 7 49.5 449.934 8.9888 8 53.76 593.43.684 9 644.97 755.89 4.6739 77. 938.479 7.988 896.47 4.8.479.64 36.87 5.8 3 39.69 64.68 8.9769 4 5.64 866. 3.9854 7
5 35.65 47.5 37.6 6 437.3 448.53 4.36 7 57.9 769.9 45.574 8 559.5 39.79 49.8633 9 59.59 347.3 54.6 936.78 385. 49.6943 Παρατηρούμε ότι όσο πυκνώνουμε το πλέγμα μας τόσο καλύτερα προσεγγίζουμε τις πρώτες, σε σειρά διάταξης, αναλυτικές ιδιοτιμές του προβλήματος. Για παράδειγμα με το πλέγμα των κόμβων υπολογίζουμε την πρώτη ιδιοτιμή με ακρίβεια 3 σημαντικών ψηφίων και τη δεύτερη με ακρίβεια σημαντικών ψηφίων. Αντίθετα για την δέκατη ιδιοτιμή η ακρίβεια είναι περίπου 8% και απαιτούνται πολύ περισσότεροι κόμβοι για να πάρουμε την ιδιοτιμή αυτή με ακρίβεια. Ο κώδικας σε Mathematica που χρησιμοποιήθηκε για την παραγωγή των αποτελεσμάτων είναι ο ακόλουθος: n=; h=/n a=table[,{n},{n}]; Do[a[[i,i+]]=-(/h )-/((i-) h ),{i,,n-}] Do[a[[i,i]]=/h,{i,,n}] Do[a[[i,i-]]=-(/h )+/((i-) h ),{i,,n}] a[[,]]=4/h ;a[[,]]=-4/h ; anal=table[n[besseljzero[,k]],{k,,n}] real=anal^ sol=sort[n[eigenvalues[a]]] error=(real-sol) /real 8
ΑΣΚΗΣΗ 3 Επιλύστε αριθμητικά το με τη μέθοδο των πεπερασμένων διαφορών το παρακάτω πρόβλημα δύο οριακών τιμών: db d u du d b + =, dy dy dy dy y = : u =, b = y y = : u =, b = y ΛΥΣΗ Έχουμε du db + = () και dy dy με οριακές συνθήκες b u ( ± ) = (3) και y y =± db + =, y [, ] du + = () dy dy = (4) Αρχικά παρατηρούμε ότι οι λύσεις ως προς b είναι άπειρες, επειδή οι εξισώσεις του συστήματος επαληθεύονται από την b+ c όπου c αυθαίρετη σταθερά. Διακριτοποιούμε το πεδίο ορισμού: Χρησιμοποιούμε N ίσα διαστήματα (N + κόμβους) πλάτους h= / N Εφαρμόζοντας εκφράσεις κεντρώων πεπερασμένων διαφορών για την προσέγγιση των παραγώγων παίρνουμε τις εξισώσεις πεπερασμένων διαφορών: ui ui + ui+ bi+ bi + =, i =,..., N (5) h h και bi bi + bi+ ui+ ui + =, i =,..., N (6) h h Για τους ακριανούς κόμβους έχουμε για το u u = και u N + = (7) Για το b επιλέγουμε να χρησιμοποιήσουμε ένα σχήμα πρώτης τάξης για την b προσέγγιση της παραγώγου, το οποίο με ανάντη πεπερασμένες διαφορές στον y κόμβο και κατάντη πεπερασμένες διαφορές στον κόμβο N + θα δώσει: b = b, b b (8) = N+ N Έστω για παράδειγμα ότι έχουμε ένα πλέγμα με N = 4 (5 κόμβοι), Το σύστημα γράφεται στη μορφή Ax = γ, όπου x και γ είναι τα διανύσματα x = και [ u, u, u, u, u, b, b, b, b, b ] 3 4 5 3 4 5 T 9
γ = [,,,,,,,,,] T και A είναι ο (N + ) (N + ) πίνακας Παρατήρηση: Οι εξισώσεις για τους κόμβους u και u5 θα μπορούσαν να παραλειφθούν χωρίς να επηρεάζουν τη λύση του συστήματος, αφού οι τιμές τους είναι γνωστές από τις οριακές συνθήκες. Επιλύοντας το σύστημα με Fortran για N = παίρνουμε τα ακόλουθα αποτελέσματα: n y u b -...346375 -.9.4783895.346375 3 -.8.8654334.59836 4 -.7.767698.34499 5 -.6.44978.8937 6 -.5.6865.6344458 7 -.4.7699786.343778 8 -.3.8876.6473 9 -..9567564.6939 -..886.3488..586 -.6779..886 -.3655387 3..9567564 -.734948 4.3.8875 -.4943 5.4.7699786 -.3666334 6.5.6865 -.65783 7.6.449779 -.94469 8.7.767698 -.685 9.8.8654334 -.83867.9.4783895 -.36973.. -.36973
Κώδικας σε Fortran: Program Hartmann implicit none doubleprecision,allocatable::u(:),uold(:),b(:),bold(:) integer::n,i,j,k,kk,status=,maxi,done,method,l,ha= doubleprecision::s,rel,err,max,s,s,q doubleprecision::w,h n= allocate(u(n+),uold(n+),b(n+),bold(n+)) if (status/=) Stop 'Not enough memory' maxi=5 rel=. h=./n u(:)=. b(:)=. k= done= do while (k<=maxi.and. done==) uold(:)=u(:) bold(:)=b(:) do i=,n b()=b() b(n+)=b(n) u(i)=.5*(h**-h*b(i-)+h*b(i+)+u(i-)+u(i+)) b(i)=.5*(-h*u(i-)+h*u(i+)+b(i-)+b(i+))! elenxos gia termatismo max=- do i=,n err = abs(u(i) - uold(i)) if (err>max) then max=err end if do i=,n+ err = abs(b(i) - bold(i)) if (err>max) then max=err end if if (max<rel) then done= end if
k=k+ open(,file='res_gauss.txt',recl=) write(,*) '-------u--------' do i=,n+ write(,'((f.8,","))') -+(i-)*h,u(i) write(,*) '-------b--------' do i=,n+ write(,'((f.8,","))') -+(i-)*h,b(i) print*, 'Gauss Seidel' print*, k-,max print*, '-------------------------------' end..5 u Γραφικές παραστάσεις των u και b :.. b. -. -.5.5. y.5 -. -. -.5.5. y -. Η λύση του συστήματος επιτεύχθηκε, παρόλα αυτά θα επιχειρήσουμε να το λύσουμε εκ νέου με τη βοήθεια του Mathematica. Θα κατασκευάσουμε αρχικά τον πίνακα Α και στη συνέχεια θα καλέσουμε την LinearSolve: n=; h=/n; a=table[,{n+},{n+}]; Do[{a[[i,i-]]=/h,a[[i,i]]=-/h,a[[i,i+]]=/h },{i,,n}] Do[{a[[i,i-]]=/h,a[[i,i]]=-/h,a[[i,i+]]=/h },{i,n+3,n+}] Do[{a[[i,n+i]]=-/h,a[[i,n+i+]]=/h},{i,,n}] Do[{a[[i,i--n]]=-/h,a[[i,i-n]]=/h},{i,n+3,n+}] a[[,]]=; a[[n+,n+]]=; a[[n+,n+]]=; a[[n+,n+3]]=-; a[[n+,n+]]=-; a[[n+,n+]]=; d=table[,{n+}]; Do[d[[i]]=-,{i,,n}] x=linearsolve[a,d]//n ; u=table[x[[i]],{i,,n+}] {.,.47839,.865434,.7677,.4498,.69,.76998,.887,.95676,.9,.58,.9,.95676,.887,.76998,.69,.4498,.7677,.865434,.47839,.} b=table[x[[i]],{i,n+,n+}]
{.476,.476,.46956,.44738,.4684,.447,.373,.339578,.35987,.79,.3 585,.49,.6563,.333,.3,.799,.4556,.495,.865434,.,.} uu=table[{-+(i-)*h,u[[i]]},{i,,n+}] bb=table[{-+(i-)*h,b[[i]]},{i,,n+}] ListPlot[uu,Joined True,AxesLabel {"y","u"}] ListPlot[bb,Joined True,AxesLabel {"y","b"}] Παρατηρούμε ότι οι λύσεις του u που δίνει το Mathematica και η Fortran ταυτίζονται, ενώ η λύση του b σε Mathematica είναι απλώς μετατοπισμένη σε σχέση με τη λύση σε Fortran κατά.346375. Αυτό οφείλεται στο γεγονός ότι το σύστημα έχει άπειρες λύσεις ως προς b και σε αυτή την περίπτωση η LinearSolve δίνει μόνον μία από αυτές. Βεβαίως η λύση σε Fortran είναι η σωστή λύση σε σχέση με τη φυσική του προβλήματος. 3