Παράδειγμα # EΠΙΛΥΣΗ ΜΗ ΓΡΑΜΜΙΚΩΝ ΑΛΓΕΒΡΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΜΕ ΜΕΘΟΔΟ NEWTON ΕΠΙΜΕΛΕΙΑ: Ν. Βασιλειάδης Άσκηση Να επιλυθεί το παρακάτω μη γραμμικό σύστημα με την μέθοδο Newton: ( ) ( ) f, = + = 0 f, = + 8= 0 ( ) N ( k ) ( k) Να χρησιμοποιηθεί κριτήριο τερματισμού: ε = i i < 0 N i= Απάντηση: + Επειδή το μη-γραμμικό σύστημα είναι απλό μπορεί να λυθεί αναλυτικά με Mathematica ως: f = + - ; f = ^ + ^ - 8; Solve[{f== 0, f == 0}, {, }] Προκύπτουν αναλυτικές λύσεις: {{ -> 0, -> }, { ->, -> 0}} Ο κώδικας που επιλύει το παραπάνω μη γραμμικό σύστημα σε Fortran είναι: program Newton_ implicit none integer,parameter::n= integer::i,j,iter,maiter real*8:: Det,Det,Det,rel,err,tstart,tend real*8::old(n),new(n)!find program start time call cpu_time(tstart)!open output file open (00,file="Newton_results.dat")!Definition of Newton parameters maiter=0000 rel=d- old()=0 ; old()=0. err=. iter=0!write initial guess to output file write(00,"(a)") "----------------------------------" write(00,"(a,)") "--------- Initial guess ----------" write(00,"(a)") "----------------------------------"
do i=,n write(00,"((a,i0),a,es0.0)") "",iter,"(",i,")=",old(i) end do!computations for the Jacobi method do while (iter<=maiter.and. err>=rel)!find new Det=f(old(),old())*df(old(),old())- f(old(),old())*df(old(),old()) Det=f(old(),old())*df(old(),old())- f(old(),old())*df(old(),old()) Det=df(old(),old())*df(old(),old())- df(old(),old())*df(old(),old()) new()=old()-det/det new()=old()-det/det!find error err = sqrt(sum((new-old)**))/n old = new iter=iter+!write results to output file write(00,"(a)") "----------------------------------" write(00,"(a,i,a)") "--------- Iteration ",iter," ---------" write(00,"(a)") "----------------------------------" write(00,"(a,es.)") "The error is : ",err do i=,n write(00,"((a,i0),a,es0.0)") "",iter,"(",i,")=",new(i) end do end do!write results to screen If (iter>maiter) then write(*,"(a)") "For in each iteration open file Newton_results.dat..." write(*,*) write(*,"(a,i0,a)") "Solution didn't converge after: ",iter," iterations." else write(*,"(a)") "For in each iteration open file Newton.dat..." write(*,*) write(*,"(a,i0,a,es.4)") "Solution converged after: ",iter," iterations with error: ",err write(*,"(a)") "Solution of non-linear system given below:" do i=,n write(*,"(a,i0,,a,es0.0)")"(",i,")=",new(i) end do endif!find program end time call cpu_time(tend) write(*,"(a,es4.4,x,a)") "Program has used", tend-tstart,"seconds of CPU time." write(00,"(a)") "----------------------------------------------------" write(00,"(a,es4.4,x,a)") "Program has used", tend-tstart,"seconds of CPU time."
!Close output file close(00) Contains real*8 function f(,) real*8::, f=+-. end function f real*8 function f(,) real*8::, f=**.+**.-8. end function f real*8 function df(,) real*8::, df=. end function df real*8 function df(,) real*8::, df=. end function df real*8 function df(,) real*8::, df=.***. end function df real*8 function df(,) real*8::, df=.***. end function df end Από την μορφή του μη γραμμικού συστήματος προκύπτει ότι f f f f = +. Για να αποφθεχθεί διαίρεση με μηδέν θα πρέπει στην αρχική εκτίμηση να ισχύει ±. (0) (0) (0) Ο παραπάνω κώδικας για αρχική εκτίμηση = (0,) συγκλίνει μετά από 6 επαναλήψεις στη -7 πρώτη λύση με σφάλμα 6.074 0. Τα αποτελέσματα του κώδικα παρουσιάζονται στον παρακάτω πίνακα. Αριθμός επαναλήψεων 0 4 6 0.000000 -. -0.809-0.04-0.00-0.00000 0.000000.000000..809.04.00.00000.000000
(0) Για την δεύτερη λύση ο παραπάνω κώδικας για αρχική εκτίμηση = (, 0) συγκλίνει μετά από -7 6 επαναλήψεις με σφάλμα 6.074 0. Τα αποτελέσματα του κώδικα παρουσιάζονται στον παρακάτω πίνακα. Αριθμός επαναλήψεων 0 4 6.000000..809.04.00.00000.000000 0.000000 -. -0.809-0.04-0.00-0.00000 0.000000 Άσκηση Να επιλυθεί το παρακάτω μη γραμμικό σύστημα με την μέθοδο Newton: + 4 = + = 7 9 9 + = ( ) N ( k+ ) ( ) Να χρησιμοποιηθεί κριτήριο τερματισμού: k ε = 0 6 i i < N i= Απάντηση: Επιλύοντας το παραπάνω σύστημα με Mathematica προκύπτουν 0 λύσεις εκ των οποίων οι είναι πραγματικές ενώ οι υπόλοιπες 8 μιγαδικές. Στην παρούσα εργασία θα εξεταστούν μόνο πραγματικές λύσεις. Η εύρεση μόνο πραγματικών λύσεων με Mathematica γίνεται ως: NSolve[{*^ + *^ - 4* ==, * - *^ + == -7, 9* + *^ == 9}, {,, }, Reals] Με τον παραπάνω κώδικα προκύπτουν οι πραγματικές λύσεις: {{ -> 40.994, -> -0.46, ->.848}, { -> -.4670, -> 0.70, -> 0.977}} Ο κώδικας που επιλύει το παραπάνω πρόβλημα σε Mathematica δίνεται παρακάτω. f = {*^ + *^ - 4* -, * - *^ + + 7, 9* + *^ - 9}; par = {,, }; spar = {s, s, s}; 0 = {0, -, }; maiter = 00; err =.*0^-6; J = Table[D[f[[i]], par[[j]]], {i, Length[f]}, {j, Length[f]}]; k = 0; error =.; While[error > err, k = k + ; If[k > maiter, Break[]]; roule = Table[par[[i]] -> 0[[i]], {i, Length[f]}]; 4
J0 = J /. roule // N; F0 = f /. roule; s = LinearSolve[J0, F0] // N; 0 = 0 - s; error = Sqrt[Sum[s[[i]]^., {i, Length[s]}]]/Length[s] // N; Print["---------------------------------"]; Print["Iteration:", k]; Print["LinearSystem:", MatriForm[J0], "*", MatriForm[spar], "=", MatriForm[F0]]; Print["\[Sigma]=", MatriForm[s]]; Print["=", MatriForm[0]]; Print["Error=", error];] (0) Για την εύρεση της πρώτης λύσης επιλέγεται αρχική εκτίμηση = (0,,). Η μέθοδος Newton συγκλίνει μετά από 9 επαναλήψεις με σφάλμα 6.789 0 9. Τα αποτελέσματα του κώδικα σε κάθε επανάληψη παρουσιάζονται παρακάτω: η επανάληψη (0) (0) () 80 4 σ 404 σ.70.70 (0) (0) () 0 σ 6 σ.9804 0.9804 (0) (0) () 0 9 6σ 7σ 0.99099 4.0069 η επανάληψη () () () 6.88 08. 4 σ 976.8 σ.748 87.464 () () () 4.96 σ 7.04 σ 4.699. 6799 () () () 0 9 6444.8σ 06.49σ 0.77808.88 η επανάληψη () () () 49.86.74 4 σ 70.8 σ 0.7 6.89 () () () 6.797 σ 44.7 σ.096.9 () () () 0 9 77.σ 604.σ 0.6009.6786 4 η επανάληψη () () (4) 7.7 4.78 4 σ 6.98 σ. 4.78 () () (4) 0.9 σ 9.87 σ.70 0.89 () () (4) 0 9 9.σ 04.8σ 0.4674.949 η επανάληψη (4) (4) () 7.6 0.86 4 σ 8.0044 σ.8 40.446 (4) (4) () 4.67 σ.869 σ 0.777 0. 887 (4) (4) () 0 9 76.6σ 46.9σ 0.60.999
6 η επανάληψη () () (6) 6.78 9.7 4 σ 4.647 σ 0.9977 40.06 () () (6) 4. σ 0.8 σ 0.04494 0.48 () () (6) 0 9 46.4σ.08σ 0.09778.86 7 η επανάληψη (6) (6) (7) 60.8 944.49 4 σ 7.6E 0 σ 6.78E 0 40.99 (6) (6) (7) 40.97 σ 4.09E 0 σ.86e 0 0.46 (6) (6) (7) 0 9 8.8σ.0079σ.064E 0.8498 8 η επανάληψη (7) (7) (8) 60.798 944. 4 σ.76e 0 σ 7.6E 0 40.994 (7) (7) (8) 40.970 σ.8e 06 σ.e 0 0.46 (7) (7) (8) 0 9 77.4σ.478E 0σ.8E 04.848 9 η επανάληψη (8) (8) (9) 60.798 944.98 4 σ.67e 09 σ.04e 08 40.994 (8) (8) (9) 40.9704 σ.08e 0 σ.704e 09 0.46 (8) (8) (9) 0 9 77.7σ 4.809E 06σ.740E 08.848 (0) Για την εύρεση της δεύτερης λύσης επιλέγεται αρχική εκτίμηση = (,,). Η μέθοδος Newton συγκλίνει μετά από 9 επαναλήψεις με σφάλμα 4. 0 7. Τα αποτελέσματα του κώδικα σε κάθε επανάληψη παρουσιάζονται παρακάτω: η επανάληψη (0) (0) () 4 9 4 σ 0 σ.6696 0.6696 (0) (0) () 4 σ σ 0.689.689 (0) (0) () 0 9 σ σ 0.4064 0.978 η επανάληψη () () ().6766.988 4 σ 8.9888 σ 0.46004.96 () () () 6.8 σ 0.670 σ 0.64.0 () () () 0 9.8σ.4467σ 0.6469 0.989 η επανάληψη () () () 4.704 9.9464 4 σ.7079 σ 0.40.708 () () () 4.0 σ 0.6 σ 0.08496 0.96774 () () () 0 9 0.0769σ 0.487σ 0.87786.07 6
4 η επανάληψη () () (4).084 8.489 4 σ 0.099 σ 0.078996.4888 () () (4).870 σ 0.094 σ 0.97 0.8088 () () (4) 0 9.696σ.709σ 0.0999.0008 η επανάληψη (4) (4) ().94.88 4 σ 0.48 σ 0.0784.474 (4) (4) (). σ 0.008 σ 0.9866 0.648 (4) (4) () 0 9.08σ.8994σ 0.078744 0.9670 6 η επανάληψη () () (6).7094.784 4 σ 0.899 σ 0.0476.46076 () () (6).9406 σ 0.04 σ 0.07786 0.76 () () (6) 0 9 8.477σ 0.899σ 0.097 0.94968 7 η επανάληψη (6) (6) (7).840.974 4 σ 0.0400 σ 0.0060087.46678 (6) (6) (7).99 σ 0.04 σ 0.0 0.770 (6) (6) (7) 0 9 0.σ 0.07σ 0.008674 0.9497 8 η επανάληψη (7) (7) (8).8674.7998 4 σ.06e 0 σ.46e 04.4670 (7) (7) (8).08 σ 4.87E 04 σ 6.687E 04 0.70 (7) (7) (8) 0 9 0.88σ.48E 0σ.88E 04 0.976 9 η επανάληψη (8) (8) (9).868.797 4 σ.64e 06 σ 4.09E 07.4670 (8) (8) (9).8 σ 8.94E 07 σ.4e 06 0.70 (8) (8) (9) 0 9 0.87σ.089E 06σ.9E 07 0.977 7
Άσκηση Θεωρήστε το δίκτυο σωληνώσεων του παρακάτω σχήματος. Σε κάθε κόμβο όπου δεν είναι γνωστή η πίεση ισχύει η σχέση = = 0 C P P Qij ( Pi Pj ) i i ij i j 4 όπου Cij = CLij / Dij και C = 6 0. Να βρεθούν με την μέθοδο Newton οι πιέσεις των κόμβων, 4 και. Με βάση τις πιέσεις του δικτύου να βρεθούν οι παροχές Q, Q 4, Q, Q, Q 4. ( ) N ( k ) ( k) Να χρησιμοποιηθεί κριτήριο τερματισμού: ε = i i < 0 N i= + 6 Απάντηση: Αρχικά γράφονται οι εξισώσεις για τους κόμβους, 4 και ως: D D D + + = 0 CL P P CL P P CL P P ( P P) ( P P ) ( P P ) D + D = 0 4 4 4 CL4 P4 P CL4 P4 P 4 ( P P) ( P P ) D + D = 0 4 4 CL P P CL4 P P4 ( P P ) ( P P ) 8
Αντικαθιστώντας τα δεδομένα του παραπάνω δικτύου προκύπτει το μη-γραμμικό σύστημα: ( P ).96P ( P P ).96 0 0.69 + + = 0 P 0 P P P ( P 0) ( P P ) 4 4 + = 0 P 0 P P 4 4 ( P 0) ( P P ) 4 4 + = 0 P 0 P P 4 4 Ο κώδικας που επιλύει το παραπάνω πρόβλημα σε Mathematica δίνεται παρακάτω. f=.96*(p-0)/sqrt[sqrt[(p-0)^]]+.96*(p)/sqrt[sqrt[(p)^]]+0.69*(p-p)/sqrt[sqrt[(p-p)^]]//n; f=(p4-0)/sqrt[sqrt[(p4-0)^]]+ (P4-P)/Sqrt[Sqrt[(P4-P)^]]//N; f=(p-p)/sqrt[sqrt[(p-p)^]]+ (P-P4)/Sqrt[Sqrt[(P-P4)^]]//N; f={f,f,f}; par={p,p4,p}; spar={s,s4,s}; 0={0,0,0}; maiter=00; err=.*0^-6; J=Table[D[f[[i]],par[[j]]],{i,Length[f]},{j,Length[f]}]; k=0; error=.; While[error>err, k=k+; If[k>maiter,Break[]]; roule=table[par[[i]]->0[[i]],{i,length[f]}]; J0=J/.roule//N; F0=f/.roule; s=linearsolve[j0,f0]//n; 0=0-s; error=sqrt[sum[s[[i]]^.,{i,length[s]}]]/length[s]//n; Print["---------------------------------"]; Print["Iteration:",k]; Print["LinearSystem:",MatriForm[J0],"*",MatriForm[spar],"=",MatriForm[F0 ]]; Print["σ=",MatriForm[s]]; Print["=",MatriForm[0]]; Print["Error=",error];] Παρατηρείται πως για να μην προκύψει διαίρεση με μηδέν στις εξισώσεις του δικτύου θα πρέπει να ισχύει Pi Pj για κάθε ζευγάρι κόμβων i, j που συνδέονται με αγωγό. Σύμφωνα με τα παραπάνω για το δοσμένο δίκτυο θα πρέπει P P, P P4, P P, P P, P4 P. 9
(0) Ο παραπάνω κώδικας με αρχική εκτίμηση ( 0, 0,0) P = συγκλίνει μετά από επαναλήψεις με σφάλμα 6.67 0. Παρακάτω δίνονται τα αποτελέσματα των πιέσεων στους κόμβους, και 4 σε ενδεικτικές επαναλήψεις. Αριθμός επαναλήψεων 0 4 7 0 P [ ] Pa 0.000 4. 7.74 8.79 40.0 9.48 40.640 4.47 4.867 P [ ] 4 Pa 0.000 60.68.87 7.9.8..696 47.97 47.6 P [ ] Pa 0.000 8.78 4.47 7.0 44. 9.68 4.67 4.740 4.4 Έχοντας πλέον υπολογίσει τις πιέσεις του δικτύου οι παροχές μπορούν να υπολογιστούν ως: Οπότε προκύπτει: ij ij = ( i j) = ( i j) Cij Pi Pj CLij Pi Pj Q P P P P Q = 8.8 gal / min Q, = 40. gal / min D Q, 4 = Q4 = Q = 0.4 gal / min Παρατηρείται πως ισχύει η εξίσωση συνέχειας στου κόμβους μη γνωστής πίεσης, 4,. Επίσης, παρατηρείται πώς το μεγαλύτερο κομμάτι της ροής περνάει από τους αγωγούς -4, 4-, - παρόλο που το συνολικό μήκος σωλήνωσης είναι διπλάσιο από το αντίστοιχο μήκος του αγωγού -. Το παραπάνω δικαιολογείται λόγω της μεγαλύτερης διαμέτρου των αγωγών -4, 4-, -. 0. και λόγω του ότι η παροχή είναι ανάλογη του D / L. 0
Άσκηση 4 Δίνεται το παρακάτω μη γραμμικό σύστημα όπου P μια αυθαίρετη σταθερά: 6 = + + 7 4 = ( + + 4 ) 4 7 = ( + + ) 7 49 + + + = 6 887 9009 78 897 4 847 0690 0 7 7 + + + 4 + = P =.787 0 4 = 4.608 Να επιλυθεί το παραπάνω μη γραμμικό σύστημα με την μέθοδο Newton για μια τιμή της αυθαίρετης σταθεράς πίεσης P της επιλογής σας. N ( k+ ) ( ) Να χρησιμοποιηθεί κριτήριο τερματισμού: ( k ) ε = 0 6 i i < N Σημειώνεται ότι το σύστημα των 7 εξισώσεων μοντελοποιεί την χημικές αντιδράσεις παραγωγής συνθετικού αερίου καύσης και οι άγνωστοι έως και είναι οι συγκεντρώσεις των αερίων CO, CO, HO, H και CH4 αντίστοιχα, ενώ οι άγνωστοι 6 και 7 είναι επίσης συγκεντρώσεις άλλων αερίων στη διαδικασία καύσης. Απάντηση: Αρχικά οι παραπάνω εξισώσεις πρέπει να αναδιαταχθούν ώστε να έρθουν στην μορφή f (,,, 4,, 6, 7) = 0. Το ισοδύναμο σύστημα γράφεται ως: 6 0 7 = + 4 + = 0 7 + + = 0 7 49 6 887 9009 78 + 897 + 4 847 + 0690 0 7 = 7 + + + 4 + = 0 P i=.787 0 = 0 4.608 = 0 4
Ο κώδικας που επιλύει το παραπάνω πρόβλημα σε Mathematica δίνεται παρακάτω. P=0. f={6/7-0.--0., +4+*-/7, ++-/7, -887*-9009*-78*+897*4+847*+49/7-0690*6/7, +++4+-, P^**4^-.787*0^**, *-.608**4}; par={,,,4,,6,7}; spar={s,s,s,s4,s,s6,s7}; 0={0.,0.,0.,0.,0.,0.,.}; MatriForm[0] maiter=00; err=.*0^-6; J=Table[D[f[[i]],par[[j]]],{i,Length[f]},{j,Length[f]}]; k=0; error=.; While[error>err, k=k+; If[k>maiter,Break[]]; roule=table[par[[i]]->0[[i]],{i,length[f]}]; J0=J/.roule//N; F0=f/.roule; s=linearsolve[j0,f0]//n; 0=0-s; error=sqrt[sum[s[[i]]^.,{i,length[s]}]]/length[s]//n; Print["---------------------------------"]; Print["Iteration:",k]; Print["LinearSystem:",MatriForm[J0],"*",MatriForm[spar],"=",MatriForm[F0 ]]; Print["σ=",MatriForm[s]]; Print["=",MatriForm[0]]; Print["Error=",error];] 0 Ο παραπάνω κώδικας για P = 0 και αρχική εκτίμηση = 0., 0, 0, 0., 0, 0., συγκλίνει σε 6 επαναλήψεις με σφάλμα 7.07 0 7. Η τιμή του σε κάθε επανάληψη δίνεται παρακάτω: ( ) ( ) Αριθμός επαναλήψεων 0 4 6 0.00000 0.07 0.048 0.08 0.88 0.87 0.87 0.000000 0.098 0.0074 0.009 0.009 0.0094 0.0094 0.000000 0.0676 0.08 0.0467 0.0460 0.04607 0.04607 4 0.00000 0.468 0.7998 0.6966 0.6809 0.687 0.687 0.000000 0.96 0.0489 0.0048 0.008 0.0077 0.0077 6 0.00000 0.4 0.46846 0. 0.784 0.7674 0.767.000000.9760.490.8800.97440.977860.977860 7