ΑΡΙΘΜΗΤΙΚΕΣ ΜΕΘΟΔΟΙ, 04-05, 5 Ο ΕΞΑΜΗΝΟ ΕΡΓΑΣΙΑ #4: ΣΥΝΗΘΕΙΣ ΔΙΑΦΟΡΙΚΣ ΕΞΙΣΩΣΕΙΣ: Α) ΠΡΟΒΛΗΜΑΤΑ ΑΡΧΙΚΩΝ ΤΙΜΩΝ Β) ΠΡΟΒΛΗΜΑΤΑ ΔΥΟ ΟΡΙΑΚΩΝ ΤΙΜΩΝ Ημερομηνία ανάρτησης εργασίας στην ιστοσελίδα του μαθήματος: --04 Ημερομηνία παράδοσης εργασίας: 8--05 Επιμέλεια απαντήσεων: Ι. Λυχναρόπουλος Οι παρακάτω ασκήσεις είναι από το βιβλίο των S. C. Chapra και R. P. Canale με τίτλο Numerical Methods for Engineers, 6 th edition. Α) ΠΡΟΒΛΗΜΑΤΑ ΑΡΧΙΚΩΝ ΤΙΜΩΝ ΑΣΚΗΣΗ : Σελ. 750. Πρόβλημα 5.7, έχουμε να λύσουμε το σύστημα: dy( x) x y4 e f(x, y, z), y0 dx dz( x) yz f(x, y, z), z04 dx Επίλυση συστήματος με Μathematica: DSolve[{y'[x] == - y[x] + 4 Exp[-x], z'[x] == -((y[x] z[x]^)/), y[0]==, z[0]==4}, {y[x], z[x]}, x], z Μέθοδος Euler (h=0.) Από αρχικές συνθήκες έχουμε για x0 0, x x0 h 0. : x xh0. 0. 0.4 : y e y0 y( x0) y(0) z z( x ) z(0) 4 0 0 0 0. () 4 (4 ) z 4 0..8667 x 0. y y h y 4e 0. () 4e.855 yz (.8667 ) z z h.8667 0..40 Συνεχίζουμε με τον ίδιο τρόπο μέχρι το x
Μέθοδος RK4 (h=0.) () k f ( x, y, z ) y 4e i i i i () yz i k f( xi, yi, zi) i xi h () h h () h () h xi () ( i, i, i ) i 4 k f x y k z k y k e h () h () yi k zi k () h h () h () k f( xi, yi k, zi k ) k h () h h () h () h xi () f( xi, yi k, zi k ) yi k 4e h () h () yi k zi k () h h () h () k f( xi, yi k, zi k ) () () () () 4 i i i i () () () 4 i i i ( xi h) () () yi hk zi hk k f ( x h, y hk, z hk ) y hk 4e k f ( x h, y hk, z hk ) h () () () () yi yi k k k k4 6 h () () () () zi zi k k k k4 6 x x0 h 0. : () x0 0 k y 4e () 4e 0 k 0 () 0 0 h 0. 0 0 () h x () 0. 0 () yz (4 ) 0.667 k y k 4e 04e 0.8 k h () h () 0. 0. y0 k z0 k 04 ( 0.667) 5.76 h 0. 0 0 () h x () 0. 0 k y k 4e ( 0.8) 4e 0.045 k () h () h () 0. 0. y0 k z0 k ( 0.8) 4 ( 5.76) 7.678 ( x0 h ) () () y0 hk z0 hk 0.( 0.045) 4 0.7.678 k y hk 4e 0.( 0.045) 4e 0.60 () () (0 0.) 4 0 () k4.96 h () () () () 0. y y0 k k k k4 0 ( 0.8) ( 0.045) 0.60.94 6 6 h () () () () 0. z z0 k k k k4 4 0.667 ( 5.76) ( 7.678).96.69 6 6 Συνεχίζουμε με τον ίδιο τρόπο μέχρι x=.
Πρόγραμμα Fortran: program initial_value_problems_system implicit none real::h real,allocatable,dimension(:)::z,z,x integer::i,method,n=5! number of iterations allocate(x(n),z(n),z(n)) do method=,!=euler, =rk, =rk, 4=rk4 x()=0!starting point z()=!initial value z()=4!initial value h=0. select case (method) case () call euler(x,z,z,h,n) case () call rk(x,z,z,h,n) case () call rk(x,z,z,h,n) case (4) call rk4(x,z,z,h,n) end select print*, '--------------------',method,'------------------ ----' do i=,n print*,i-,x(i),z(i),f_an(x(i)),abs(f_an(x(i))- z(i)),z(i),g_an(x(i)),abs(g_an(x(i))-z(i)) end do contains subroutine euler(x,z,z,h,n) real::x(:),z(:),z(:),h integer::i,n do i=,n- z(i+)=z(i)+h*f(x(i),z(i),z(i)) z(i+)=z(i)+h*g(x(i),z(i),z(i)) x(i+)=x(i)+h end subroutine euler subroutine rk(x,z,z,h,n) real::x(:),z(:),z(:),h,k,k,k,k integer::i,n do i=,n- k=f(x(i),z(i),z(i)) k=g(x(i),z(i),z(i))
k=f(x(i)+h,z(i)+h*k,z(i)+h*k) k=g(x(i)+h,z(i)+h*k,z(i)+h*k) x(i+)=x(i)+h z(i+)=z(i)+(h/)*(k+k) z(i+)=z(i)+(h/)*(k+k) end subroutine rk subroutine rk(x,z,z,h,n) real::x(:),z(:),z(:),h,k,k,k,k,k,k integer::i,n do i=,n- k=f(x(i),z(i),z(i)) k=g(x(i),z(i),z(i)) k=f(x(i)+0.5*h,z(i)+0.5*h*k,z(i)+0.5*h*k) k=g(x(i)+0.5*h,z(i)+0.5*h*k,z(i)+0.5*h*k) k=f(x(i)+h,z(i)+h*k,z(i)+h*k) k=g(x(i)+h,z(i)+h*k,z(i)+h*k) x(i+)=x(i)+h z(i+)=z(i)+(h/6)*(k+4*k+k) z(i+)=z(i)+(h/6)*(k+4*k+k) end subroutine rk subroutine rk4(x,z,z,h,n),k4 real::x(:),z(:),z(:),h,k,k,k,k4,k,k,k integer::i,n do i=,n- k=f(x(i),z(i),z(i)) k=g(x(i),z(i),z(i)) k=f(x(i)+0.5*h,z(i)+0.5*h*k,z(i)+0.5*h*k) k=g(x(i)+0.5*h,z(i)+0.5*h*k,z(i)+0.5*h*k) k=f(x(i)+0.5*h,z(i)+0.5*h*k,z(i)+0.5*h*k) k=g(x(i)+0.5*h,z(i)+0.5*h*k,z(i)+0.5*h*k) k4=f(x(i)+h,z(i)+h*k,z(i)+h*k) k4=g(x(i)+h,z(i)+h*k,z(i)+h*k) x(i+)=x(i)+h z(i+)=z(i)+(h/6)*(k+*k+*k+k4) z(i+)=z(i)+(h/6)*(k+*k+*k+k4) end subroutine rk4 real function f(x,x,x) result(z) real,intent(in)::x,x,x z=-*x+4*exp(-x) end function f
real function g(x,x,x) result(z) real,intent(in)::x,x,x z=-x*x**/ end function g real function f_an(t) result(y)!analytic solution real,intent(in)::t y=*(- + *Exp(t))/Exp(*t) end function f_an real function g_an(t) result(y)!analytic solution real,intent(in)::t y=(*exp(*t))/(4-6*exp(t) + 5*Exp(*t)) end function g_an end program initial_value_problems_system Παίρνουμε τα ακόλουθα αποτελέσματα (Aν. = Αναλυτική λύση, Abs Err = Απόλυτο σφάλμα): Εuler Βήμα x y(x) y(x) Aν. Abs Err z(x) z(x) Αν. Abs Err 0 0.0000.0000.0000 0.00E+00 4.0000 4.0000 0.00E+00 0.000.0000.94 0.66E-0.8667.69 0.75E+00 0.4000.8550.786 0.7E-0.40.976 0.57E+00 0.6000.649.599 0.56E-0.590.664 0.46E+00 4 0.8000.486.95 0.5E-0.0.94 0.8E+00 5.0000.66.008 0.6E-0 0.99.48 0.E+00 RK4 Βήμα x y(x) y(x) Aν. Abs Err z(x) z(x) Αν. Abs Err 0 0.0000.0000.0000 0.00E+00 4.0000 4.0000 0.00E+00 0.000.94.94 0.70E-04.69.69 0.4E-0 0.4000.785.786 0.80E-04.976.976 0.E-0 0.6000.598.599 0.65E-04.665.664 0.86E-04 4 0.8000.95.95 0.4E-04.94.94 0.66E-04 5.0000.008.008 0.0E-04.49.48 0.54E-04 Παρατηρούμε ότι η μέθοδος RK4 δίνει πολύ καλύτερα αποτελέσματα (μικρότερο απόλυτο σφάλμα). ΑΣΚΗΣΗ : Σελ. 750. Πρόβλημα 5.6. Επίσης εξετάστε το κριτήριο ευστάθειας και εάν οι μέθοδοι που θα εφαρμόστε συγκλίνουν. Έχουμε να λύσουμε την ακόλουθη διαφορική εξίσωση ης τάξης: d x() t dx() t dx c x t x dt dt dt t0 0 0 ( ) 0, (0), 0 () με c 5, 40, 00 Θα πρέπει αρχικά να δημιουργήσουμε ένα σύστημα δύο διαφορικών εξισώσεων ης τάξης θέτοντας dx dg g x και g dt dt
Έτσι παίρνουμε το σύστημα: dg g, g0 dt dg c g g 0, g 00 dt 0 το οποίο φέρνουμε στη μορφή: dg g ft, g, g dt dg c g g ft, g, g dt 0 Αναλυτική λύση της () και γραφική παράσταση με Mathematica: c = 5; s = DSolve[{0 x''[t] + c x'[t] + 0 x[t] == 0, x[0] ==, x'[0] == 0}, x[t], t]; s= x[t] /. s //Expand Plot[s, {t, 0, 5}, PlotRange -> All, AxesOrigin -> {0, 0}] c=5: Cos.0 0.5 4 6 8 0 4-0.5 c=40:.0 0.8 0.6 0.4 0. 4 6 8 0 4
c=00:.0 0.8 0.6 0.4 0. 4 6 8 0 4 Ο κώδικας Fortran που επιλύει το πρόβλημα δόθηκε στην προηγούμενη άσκηση. Οι μόνες αλλαγές είναι στη δήλωση των αρχικών τιμών: cc=5!dumping constant Values:5,40,00 x()=0!starting point z()=!initial value z()=0!initial value h=!step καθώς και στον ορισμό των συναρτήσεων: real function f(x,x,x) result(z) real,intent(in)::x,x,x z=x end function f real function g(x,x,x) result(z) real,intent(in)::x,x,x z=-x-cc/0.*x end function g real function f_an(t) result(y)!analytic solution real,intent(in)::t select case (cc) case (5): y=cos((*sqrt(7.)*t)/8.)/exp(t/8.) + & Sin((*Sqrt(7.)*t)/8.)/(.*Sqrt(7.)*Exp(t/8.)) case (40): y=exp(-t) + t/exp(t) case (00): y=exp((-5 - *Sqrt(6.))*t)/. - (5*Exp((-5- *Sqrt(6.))*t))/(4.*Sqrt(6.)) + & Exp((-5 + *Sqrt(6.))*t)/. + (5*Exp((- 5+*Sqrt(6.))*t))/(4.*Sqrt(6.)) end select c=5: Euler (h=)
Euler, h= (c=5) Βήμα t x(t) x(t)αν. AbsErr 0 0.0000.0000.0000 0.00E+00.0000.0000 0.5757 0.4E+00.0000 0.0000-0. 0.E+00.0000 -.7500-0.667 0.E+0 4 4.0000 -.065-0.4669 0.6E+0 5 5.0000 -.969 0.066 0.4E+0 6 6.0000.98 0.475 0.9E+00 7 7.0000 6.64 0.6 0.60E+0 8 8.0000 8.797 0.056 0.88E+0 9 9.0000 4.498-0.66 0.45E+0 0 0.0000-7.950-0.69 0.77E+0.0000 -.498-0.054 0.E+0.0000 -.4496 0.590 0.4E+0.0000 -.6745 0.94 0.9E+0 4 4.0000 4.606 0.067 0.5E+0 5 5.0000 66.995-0.0898 0.67E+0 Η αριθμητική λύση χάνει σε ακρίβεια καθώς το x αυξάνει. Αυτό οφείλεται στο μεγάλο βήμα h. Η γραφική παράσταση της αναλυτικής (συμπαγής γραμμή) και της αριθμητικής λύσης (κόκκινες κουκκίδες) δίνονται στο επόμενο γράφημα (μέχρι x=6.5). 4 0 4 5 6 - -4 Δοκιμάζουμε ένα μικρότερο βήμα με τη μέθοδο Euler, έστω h=0., και παίρνουμε Euler, h=0. (c=5) Βήμα t x(t) x(t)αν. AbsErr 0 0.0000.0000.0000 0.00E+00 0.000.0000 0.9950 0.50E-0 0.000 0.9900 0.9804 0.96E-0 0.000 0.970 0.9564 0.4E-0 4 0.4000 0.94 0.96 0.7E-0 5 0.5000 0.900 0.885 0.0E-0 6 0.6000 0.8564 0.87 0.E-0 7 0.7000 0.809 0.7779 0.4E-0 8 0.8000 0.740 0.757 0.5E-0 9 0.9000 0.67 0.648 0.4E-0
0.0000 0.598 0.5757 0.E-0 0.0000-0.65-0. 0.8E-0 0.0000-0.7759-0.667 0.E+00 40 4.0000-0.5509-0.4669 0.84E-0 50 5.0000 0.6 0.066 0.50E-0 60 6.0000 0.5898 0.475 0.6E+00 70 7.0000 0.4898 0.6 0.E+00 80 8.0000-0.074 0.056 0.E-0 90 9.0000-0.485-0.66 0.7E+00 00 0.0000-0.45-0.69 0.5E+00 0.0000-0.0464-0.054 0.60E-0 0.0000 0.76 0.590 0.6E+00 0.0000 0.575 0.94 0.6E+00 40 4.0000 0.0844 0.067 0.E-0 50 5.0000-0.0-0.0898 0.E+00.0 0.5 5 0 5-0.5 Παρατηρούμε σαφή βελτίωση των αποτελεσμάτων. Παρόλα αυτά όσο το x αυξάνει οι αποκλίσεις από τα αναλυτικά αποτελέσματα είναι σημαντικές. Μέθοδος RK4 (h=): RK4, h= (c=5) Βήμα t x(t) x(t)αν. AbsErr 0 0.0000.0000.0000 0.00E+00.0000 0.5807 0.5757 0.50E-0.0000-0.088-0. 0.4E-0.0000-0.6546-0.667 0.9E-0 4 4.0000-0.477-0.4669 0.0E-0 5 5.0000 0.047 0.066 0.5E-0 6 6.0000 0.4 0.475 0.6E-0 7 7.0000 0.69 0.6 0.8E-0 8 8.0000 0.046 0.056 0.6E-0 9 9.0000-0.459-0.66 0.0E-0 0 0.0000-0.74-0.69 0.E-0.0000-0.075-0.054 0.E-0.0000 0.79 0.590 0.E-0.0000 0.9 0.94 0.E-0 4 4.0000 0.086 0.067 0.8E-0 5 5.0000-0.070-0.0898 0.0E-0
Παρατηρούμε ότι η μέθοδος RK4 δίνει αρκετά ακριβή λύση παρόλο το μεγάλο βήμα που χρησιμοποιήθηκε, όπως φαίνεται και στο ακόλουθο γράφημα:.0 0.5 4 6 8 0 4-0.5 Για τις άλλες δύο περιπτώσεις του c (δηλ. 40 και 00), παρουσιάζουμε στη συνέχεια την λύση, που παίρνουμε με τη μέθοδο RK4 και βήμα h= για c=40 και βήμα h=0. για c=00. RK4, h= (c=40) Βήμα t x(t) x(t)αν. AbsErr 0 0.0000.0000.0000 0.00E+00.0000 0.708 0.758 0.7E-0.0000 0.906 0.4060 0.5E-0.0000 0.94 0.99 0.58E-0 4 4.0000 0.090 0.096 0.5E-0 5 5.0000 0.0404 0.0404 0.5E-04 6 6.0000 0.076 0.074 0.6E-0 7 7.0000 0.0075 0.007 0.4E-0 8 8.0000 0.00 0.000 0.5E-0 9 9.0000 0.00 0.00 0.86E-04 0 0.0000 0.0005 0.0005 0.44E-04.0000 0.000 0.000 0.E-04.0000 0.00009 0.000 0.0E-04.0000 0.00006 0.0000 0.48E-05 4 4.0000 0.00005 0.0000 0.E-05 5 5.0000 0.000006 0.000005 0.95E-06.0 0.8 0.6 0.4 0. 4 6 8 0 4
RK4, h=0. (c=00) Βήμα t x(t) x(t)αν. AbsErr 0 0.000000.000000.000000 0.00E+00 0.00000 0.99654 0.9964 0.70E-04 0.00000 0.98866 0.988679 0.5E-04 0.00000 0.97959 0.9796 0.0E-04 4 0.400000 0.970088 0.9700 0.5E-04 5 0.500000 0.960467 0.960474 0.70E-05 6 0.600000 0.95086 0.950865 0.E-05 7 0.700000 0.94 0.944 0.5E-05 8 0.800000 0.9869 0.9869 0.7E-06 9 0.900000 0.9505 0.9505 0.4E-06 0.000000 0.94 0.94 0.0E-06 0.000000 0.85486 0.85486 0.0E-06 0.999999 0.74668 0.74669 0.48E-06 40.999998 0.67447 0.67447 0.60E-06 50 4.999998 0.609665 0.609666 0.66E-06 60 5.999997 0.55085 0.55086 0.89E-06 70 6.999996 0.4984 0.4985 0.9E-06 80 7.999995 0.4507 0.4507 0.95E-06 90 8.999998 0.407006 0.407007 0.75E-06 00 0.00000 0.67899 0.67899 0.6E-06 0.000006 0.549 0.549 0.48E-06 0.00000 0.00596 0.00596 0.9E-06 0.0000 0.77 0.77 0.E-06 40 4.00007 0.45605 0.45605 0.9E-06 50 5.0000 0.006 0.006 0.5E-06.0 0.8 0.6 0.4 0. 4 6 8 0 4 Κριτήριο Ευστάθειας μεθόδου Euler dg () () () () () () g g i gi hg i gi gi hgi dt c c dg c g g h g g g hg h g 0 0 dt 0 () () () () () () () i i i i i i i g g
() h () g i g i () c () gi h h gi 0 G Θέλουμε η φασματική ακτίνα του πίνακα G να είναι <. Αυτή υπολογίζεται στο Mathematica με τις ακόλουθες εντολές:, Re,Re, Re Eigenvalues ReduceMaxAbs, Τα αποτελέσματα συνοψίζονται στον ακόλουθο πίνακα: c h 5 0 h 0.5 40 0 h 00 0 h 0.0 ΑΣΚΗΣΗ : Σελ. 75. Πρόβλημα 5. dp Θέλουμε να επιλύσουμε τη διαφορική εξίσωση: 0.06( p/000) p, p(950) 555 dt Αναλυτική λύση με Mathematica: 0.06;pmx 000; DSolve mx,950 555,, 000..8596 0. Μέθοδος RK4 (h=5) k f( ti, pi) 0.06( pi /000) pi h h h h k f( ti, pi k) 0.06 /000 pi k i p k h h h h k f( ti, pi k) 0.06 pi k /000 pi k k4 f( ti h, pi hk) 0.06 pi hk/000pi hk h pi pi kk kk4 6 Κώδικας Fortran: program initial_value_problems_system implicit none real::h real,allocatable,dimension(:)::z,x integer::i,method,n=! number of iterations allocate(x(n),z(n))
do method=4,4!=euler, =rk, =rk, 4=rk4 if (method==.or. method==) cycle x()=950!starting point z()=555!initial value h=5 select case (method) case () call euler(x,z,h,n) case () call rk(x,z,h,n) case () call rk(x,z,h,n) case (4) call rk4(x,z,h,n) end select print*, '--------------------',method,'------------------ ----' do i=,n print '(i,",",(f8.0,","),e5.4)',i,x(i),z(i),f_an(x(i)),abs(f _an(x(i))-z(i)) end do read* contains subroutine euler(x,z,h,n) real::x(:),z(:),h integer::i,n do i=,n- z(i+)=z(i)+h*f(x(i),z(i)) x(i+)=x(i)+h end subroutine euler subroutine rk(x,z,h,n) real::x(:),z(:),h,k,k integer::i,n do i=,n- k=f(x(i),z(i)) k=f(x(i)+h,z(i)+h*k) z(i+)=z(i)+(h/.)*(k+k) x(i+)=x(i)+h end subroutine rk subroutine rk(x,z,h,n) real::x(:),z(:),h,k,k,k
integer::i,n do i=,n- k=f(x(i),z(i)) k=f(x(i)+0.5*h,z(i)+0.5*h*k) k=f(x(i)+h,z(i)+h*k) z(i+)=z(i)+(h/6.)*(k+4*k+k) x(i+)=x(i)+h end subroutine rk subroutine rk4(x,z,h,n) real::x(:),z(:),h,k,k,k,k4 integer::i,n do i=,n- k=f(x(i),z(i)) k=f(x(i)+0.5*h,z(i)+0.5*h*k) k=f(x(i)+0.5*h,z(i)+0.5*h*k) k4=f(x(i)+h,z(i)+h*k) z(i+)=z(i)+(h/6.)*(k+*k+*k+k4) x(i+)=x(i)+h end subroutine rk4 real function f(x,x) result(z) real,intent(in)::x,x z=0.06*(-x/000.)*x end function f real function f_an(x) result(y)!analytic solution real,intent(in)::x y=(000.*exp(0.06*x))/(.8595e+ +Εxp(0.06*x)) end function f_an end program initial_value_problems_system Αποτέλεσμα: Βήμα t p(t) p(t) Αν Abs Err 950. 555. 555. 0.488E-0 955. 86. 86. 0.549E-0 960. 7. 7. 0.65E-0 4 965. 46. 46. 0.58E-0 5 970. 75. 75. 0.6445E-0 6 975. 4096. 4096. 0.70E-0 7 980. 445. 445. 0.654E-0 8 985. 48. 48. 0.70E-0 9 990. 50. 50. 0.750E-0 0 995. 5588. 5588. 0.790E-0 000. 5978. 5978. 0.79E-0 Η σύγκριση της αριθμητικής λύσης με τα δεδομένα του προβλήματος δίνεται στη συνέχεια (στην τελευταία στήλη εμφανίζεται το σχετικό σφάλμα)
Βήμα t p(t) p(t) από πίνακα Rel Err 950. 555. 555 0% 960. 7. 040.5% 5 970. 75. 708.% 7 980. 445. 4454 0.0% 9 990. 50. 576.4% 000. 5978. 6079.6% Το μοντέλο κρίνεται επαρκές. Β) ΠΡΟΒΛΗΜΑΤΑ ΔΥΟ ΟΡΙΑΚΩΝ ΤΙΜΩΝ ΑΣΚΗΣΗ 4: Σελ. 806. Πρόβλημα 5.4 Έχουμε να επιλύσουμε την εξίσωση: dt dt T S S, S,0,0 dr r dr () dt με οριακές συνθήκες τις T () και 0 (συνθήκη συμμετρίας). dr r Αναλυτική λύση με Mathematica: a=dsolve[{t''[r]+/r T'[r]==-S,T[]==,T'[0]==0},T[r],r]; a=t[r]/.flatten[a] Δακριτοποιούμε το πεδίο ορισμού: Χωρίζουμε την ακτίνα σε Ν ίσα διαστήματα (Ν+ κόμβους) μήκους r / N 0 0 r N N+ r=0 i- i i+ r= Προσεγγίζουμε τη διαφορική εξίσωση () στον τυχαίο κόμβο i : T T T T T S i i i i i r ri r Ti T i T i S r ri r r, () r rir για τους εσωτερικούς κόμβους i,..., N όπου r ( i) r Για i N έχουμε: u 0 N i
Για i θα χρησιμοποιήσουμε την οριακή συνθήκη μαζί με την διαφορική εξίσωση: dt d T dt d T Παρατηρούμε ότι το limr 0 lim dr r 0 lim dr r0 rdr r dr dt T TT Έτσι η () γράφεται: S o S () dr r dt T T0 Η οριακή συνθήκη: 0 0To T (4) dr r0 r Ό κόμβος i 0 είναι φανταστικός. Οι () και (4) συνδυάζονται: 4T 4T S r (5) Το σύστημα που προκύπτει είναι τριδιαγώνιο και θα επιλυθεί με την μέθοδο Τhomas. Έστω ένα αραιό πλέγμα με Ν= (Δr = 0.). Τότε έχουμε να λύσουμε το σύστημα: 4 4 0 T S /9 4.5 8.5 T S 0 6.75 8 T S.5 T.046 0.074S T.048 0.074S T.0056 0.S T (από οριακή συνθήκη) 4 Πρόγραμμα Fortran: Program Poisson implicit none real,allocatable::a(:),b(:),c(:),d(:),x(:),r(:) real:: dr,pi,xor integer::n,i,status,ss SS=!source term Xor=! Oriakh synthikh (sto n+ kombo) n=!arithmos diasthmatwn -> n+ komboi allocate(a(n),b(n),c(n-),x(n+),d(n),r(n+)) dr=./n do i=,n+ r(i)=(i-)*dr end do x(n+)=0 b()=4.
c()=-4. do i=,n a(i)=./dr**-./(.*r(i)*dr) b(i)=-./dr** if (i<n) then c(i)=./dr**+./(.*r(i)*dr) end if end do d()=ss*dr** do i=,n- d(i)=-ss end do d(n)=-ss-xor*(./dr**+./(.*r(i)*dr)) print*, '-------------' call Thomas(n,a,b,c,d,x) x(n+)=xor!arxikh synthiki do i=,n+ print '(I,F.,F.4,F.4)',i,r(i),x(i),+SS*(- r(i)**)/4. end do contains subroutine Thomas(n,a,b,c,d,x) integer,intent(in) :: n real, INTENT(INOUT) ::a(n),b(n),c(n-),d(n) real, INTENT(OUT) ::x(n) integer::i real ::t(n),u(n) 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) end do x(n)=u(n) do i=n-,,- x(i)=u(i)-c(i)/t(i)*x(i+) end do end subroutine Thomas end program Δίνουμε στη συνέχεια ενδεικτικά το αποτέλεσμα του αλγορίθμου για Ν=0 και για τις τρεις τιμές του S. Δίπλα στην αριθμητική τιμή παρουσιάζεται η αναλυτική τιμή. Παρατηρούμε ότι υπάρχει απόλυτη ταύτιση. Επίσης παρουσιάζονται οι σχετικές γραφικές παραστάσεις.
S= Κόμβος r T(r) T(r) Αν. 0.00.500.500 0.0.475.475 0.0.400.400 4 0.0.75.75 5 0.40.00.00 6 0.50.875.875 7 0.60.600.600 8 0.70.75.75 9 0.80.0900.0900 0 0.90.0475.0475.00.0000.0000.5.0.5.0.05 0. 0.4 0.6 0.8.0 S=0 Κόμβος r T(r) T(r) Αν. 0.00.5000.5000 0.0.4750.4750 0.0.4000.4000 4 0.0.750.750 5 0.40.000.000 6 0.50.8750.8750 7 0.60.6000.6000 8 0.70.750.750 9 0.80.9000.9000 0 0.90.4750.4750.00.0000.0000
.5.0.5.0.5 0. 0.4 0.6 0.8.0 S=0 Κόμβος r T(r) T(r) Αν. 0.00 6.0000 6.0000 0.0 5.9500 5.9500 0.0 5.8000 5.8000 4 0.0 5.5500 5.5500 5 0.40 5.000 5.000 6 0.50 4.7500 4.7500 7 0.60 4.000 4.000 8 0.70.5500.5500 9 0.80.8000.8000 0 0.90.9500.9500.00.0000.0000 6 5 4 0. 0.4 0.6 0.8.0 ΑΣΚΗΣΗ 5: Σελ. 789-794. Να επιλυθεί αριθμητικά το πρόβλημα που διατυπώνεται στη παράγραφο 7.. (επιλέξτε δικές σας τιμές για τις παραμέτρους E, I και L. Σχολιάστε τα αποτελέσματά σας. Βλέπε παράγραφο 7..