11 ΣΥΝΗΘΕΙΣ ΔΙΑΦΟΡΙΚΕΣ ΕΞΙΣΩΣΕΙΣ 11.1 Γενικά περί συνήθων διαφορικών εξισώσεων Μια συνήθης διαφορική εξίσωση (ΣΔΕ) 1 ης τάξης έχει τη μορφή dy d = f (, y()) όπου f(, y) γνωστή και y() άγνωστη συνάρτηση. Η πιο πάνω εξίσωση καλείται διαφορική γιατί περιέχει την παράγωγο μιας συνάρτησης. Καλείται συνήθης γιατί η παράγωγος είναι συνήθης (και όχι για μερική), και τέλος είναι 1 ης τάξης γιατί περιλαμβάνει μόνο την 1 η παράγωγο της άγνωστης συνάρτησης. Αν και μπορούμε να μιλήσουμε για ΣΔΕ 2 ης, 3 ης, τάξης, θα περιοριστούμε μόνο σε αυτές που είναι 1 ης τάξης γιατί οι υπόλοιπες μπορούν να εκφραστούν σαν ένα σύστημα ΣΔΕ 1 ης τάξης. Άρα είναι αρκετό να ξέρουμε πώς να λύνουμε συστήματα ΣΔΕ 1 ης τάξης στη MATLAB. Σημειώνουμε ότι στη ειδική περίπτωση που η συνάρτηση f εξαρτάται μόνο από το, τότε έχουμε dy f () y f() d d = = + C όπου C μια αυθαίρετη σταθερά, και έτσι παίρνουμε τη λύση αναλυτικά. (Για την ακρίβεια, παίρνουμε άπειρες λύσεις, μια για κάθε σταθερά.) Αν εκτός από την διαφορική εξίσωση μας δοθεί και μια αρχική συνθήκη, π.χ. y( 0) = y0, με τα 0, y0 δοσμένα, τότε η λύση της Σ.Δ.Ε. είναι μοναδική, με την προϋπόθεση ότι η συνάρτηση f(, y) ικανοποιεί κάποιες συνθήκες ομαλότητας. Σε αυτή την περίπτωση έχουμε ένα πρόβλημα αρχικών τιμών (ΠΑΤ): y () = f(, y()) y ( 0) = y0 Στο παρόν κεφάλαιο θα ασχοληθούμε με μεθόδους (αριθμητικής) επίλυσης ΠΑΤ χρησιμοποιώντας την MATLAB.
Γ. Γεωργίου & Χρ, Ξενοφώντος Παράδειγμα 11.1.1 Η μέθοδος του Euler Η πιο παλιά μέθοδος αριθμητικής επίλυσης του ΠΑΤ y () = f(, y()) y ( 0) = y0 είναι η λεγόμενη μέθοδος του Euler, με την οποία βρίσκουμε (διακριτές) προσεγγίσεις yi y( i), i = 0,1,2,... για κάποια i, i = 0,1,2,... που μας ενδιαφέρουν. Αν επιλέξουμε κάποιο h > 0 (το λεγόμενο βήμα) και ορίσουμε = i 1 + i h, i = 0,1,2,..., N + για κάποιο Ν, τότε μια και τα f, 0 και y 0 είναι γνωστά, μπορούμε να βρούμε τα yi y ( i), i= 0,1,2,..., T μέσω της λεγόμενης επανάληψης του Euler: y = i 1 y + + i hf( i, yi), i = 0,1,2,..., N Το πιο κάτω m-file υλοποιεί την πιο πάνω διαδικασία, παίρνοντας σαν δεδομένα εισόδου την συνάρτηση f, τις αρχικές τιμές y 0, 0, το Τ έτσι ώστε [ 0, T] και το βήμα h, και δίνει σαν δεδομένα εξόδου τα διανύσματα = [,,..., ], y = [ y, y,..., y ] έτσι ώστε y y ( ), i= 0,1,2,..., N. 0 1 N 0 1 funcion [y,] = euler(fun,y0,0,t,h) N [y,] = euler(fun,y0,0,t,h) - This funcion compues he soluion o he IVP y'() = fun(y,), y(0)= y0, for a given funcion "fun(,y)" using Euler's mehod. The funcion can be defined via he m-file fun.m, or as an anonymous funcion (or even using he "inline" command). y0 is he iniial value, T is he maximum value for, h is he sepsize and 0=iniial value for. The oupu is a vecor conaining he approximae soluion y_euler. y(1) = y0; (1) = 0; for i=1:ceil((t-0)/h) y(i+1) = y(i) + h*feval(fun,(i),y(i)); (i+1) = (i) + h; end; ='; y=y'; End of m-file euler.m Ας χρησιμοποιήσουμε το πιο πάνω m-file για το εξής ΠΑΤ: y () = y, y(1) = 4 i i 274
11. Συνήθεις διαφορικές εξισώσεις όπου το ανήκει στο διάστημα [1, 2], και ας επιλέξουμε αρχικά h = 0.1. >> f = @(,y) *sqr(y); >> [y,]=euler(f,4,1,2,0.1) y = = 4.0000 4.2000 4.4254 4.6779 4.9590 5.2708 5.6152 5.9943 6.4105 6.8663 7.3642 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000 Παίρνουμε τη γραφική παράσταση της λύσης που πήραμε, ως >> plo(,y,'o-') >> xlabel('') >> ylabel('y') >> ile('soluion o y''()= sqr(y), in [1, 2], y(1)=4, via Eulers Mehod wih h=0.1') 7.5 Soluion o y'()= sqr(y), in [1, 2], y(1)=4, via Eulers Mehod wih h=0.1 7 6.5 6 y 5.5 5 4.5 4 1 1.2 1.4 1.6 1.8 2 2.2 2.4 275
Γ. Γεωργίου & Χρ, Ξενοφώντος 1 2 2 Η ακριβής λύση του πιο πάνω Π.Α.Τ. είναι yex () = ( + 7), και το πιο κάτω 16 γράφημα μα δείχνει ότι η λύση που πήραμε με την μέθοδο του Euler δεν είναι παρά μια προσέγγιση. >> yex=@() (1/16)*(.^2+7).^2; >> plo(,y,'o-',,yex()) >> xlabel('') >> ylabel('y') >> legend('y_{euler}()','y_{exac}()') 8 7.5 y Euler () y exac () 7 6.5 y 6 5.5 5 4.5 4 1 1.2 1.4 1.6 1.8 2 2.2 2.4 Αν χρησιμοποιήσουμε πιο μικρό βήμα h, τότε η προσέγγιση θα είναι καλύτερη. Αυτό φαίνεται πιο κάτω, όπου πήραμε h = 0.05. >> [y,]=euler(f,4,1,2,0.05); >> plo(,y,'o-',,yex()) >> xlabel('') >> ylabel('y') >> legend('y_{euler}()','y_{exac}()') 8 7.5 y Euler () y exac () 7 6.5 y 6 5.5 5 4.5 4 1 1.2 1.4 1.6 1.8 2 2.2 2.4 276
11. Συνήθεις διαφορικές εξισώσεις 11.2 Η εντολή ode 45 Η MATLAB διαθέτει αρκετές συναρτήσεις/εντολές βιβλιοθήκης για την επίλυση Π.Α.Τ., όπως οι ode23, ode45, ode113, ode15s, ode23s, ode23, ode23b. (Γράψτε doc ode23 για περισσότερες πληροφορίες.) Εμείς θα ασχοληθούμε μόνο με την ode45, η οποία λύνει το Π.Α.Τ. y () = f(, y()) y ( 0) = y0 και έχει την εξής δομή: [_ou,y_ou] = ode45(odefun, _span, y0) Τα δεδομένα εισόδου και εξόδου έχουν ως εξής: οdefun: η συνάρτηση f (, y ) (σαν m-file ή ανώνυμη συνάρτηση) _span: το διάνυσμα [, T] όπου ανήκει το αυτό πρέπει να δοθεί με αγκύλες 0 y0: η αρχική τιμή y0( = y ( 0)) _ou: το διάνυσμα με τα σημεία 0, 1, 2... y_ou: το διάνυσμα με τις προσεγγιστικές τιμές y0, y1, y 2... της λύσης Όπως βλέπετε, τα δεδομένα εισόδου και εξόδου είναι παρόμοια με αυτά που είχαμε στο m-file που γράψαμε για την μέθοδο του Euler. Η διαφορά έγκειται στο ότι για το m-file που γράψαμε, δίναμε και το βήμα h, ενώ στην ode45 δεν το δίνουμε. Η MATLAB επιλέγει της το βήμα με τέτοιο τρόπο ώστε η λύση που παίρνουμε να έχει (απόλυτη) ακρίβεια 10 6. Αυτό σημαίνει ότι το μέγεθος των διανυσμάτων και y δεν εξαρτάται από εμάς αλλά από τη MATLAB και ότι το διάνυσμα μπορεί να μην είναι ομοιόμορφα κατανεμημένο. Μπορούμε, αν θέλουμε, να αυξομειώσουμε την ακρίβεια στην εντολή ode45 με το να δώσουμε περισσότερα δεδομένα εξόδου. Για να δείτε πως γράψτε help ode45 στη MATLAB. Παράδειγμα 11.2.1 Θα βρούμε μια προσέγγιση για τη λύση του Π.Α.Τ. χρησιμοποιώντας την εντολή ode45. >> f = @(,y) y.*(2-y); >> [,y]=ode45(f,[0,1],3); y () = y(2 y), 0 1 y(0) = 3 Βάλαμε ; στο τέλος της εντολής για να μην δούμε τις τιμές που παίρνουμε μια και τα διανύσματα μπορεί να είναι αρκετά μεγάλα: >> lengh(y) ans = 41 Η γραφική παράσταση της λύσης που πήραμε δίνεται πιο κάτω: 277
Γ. Γεωργίου & Χρ, Ξενοφώντος >> plo(,y,'-rx') >> xlabel('') >> ylabel('y') >> ile('soluion o y''()=y(2-y), in [0, 1], y(0)=3') 3 Soluion o y'()=y(2-y), in [0, 1], y(0)=3 y 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 6 Η ακριβής λύση του πιο πάνω Π.ΑΤ είναι yex () =, και πιο κάτω δείχνουμε τη 2 3 e γραφική παράσταση του σφάλματος y () y () : >> yex=@() 6./(3-exp(-2*)); >> plo(,abs(y-yex()),'*r') >> plo(,abs(y-yex()),'*-r') >> xlabel('') >> ylabel(' y_{exac}-y ') >> ile('absolue Error') ex 5 x 10-6 Absolue Error 4.5 4 3.5 3 y exac -y 2.5 2 1.5 1 0.5 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Πράγματι, έχουμε ακρίβεια της τάξης του 10 6. 278
11. Συνήθεις διαφορικές εξισώσεις 11.3 Συστήματα ΣΔΕ Εκτός από Π.Α.Τ., η εντολή ode45 μπορεί να χρησιμοποιηθεί και για συστήματα Σ.Δ.Ε., όπως για παράδειγμα το πιο κάτω 3 3 σύστημα αρχικών τιμών (Σ.ΑΤ): x 1() = f1(, x1, x2, x3) x2 () = f2(, x1, x2, x3) x3 () = f3(, x1, x2, x3) x ( ) = a, x ( ) = a, x ( ) = a 1 0 1 2 0 2 3 0 3 όπου οι συναρτήσεις fi (, x1, x2, x3), i= 1,2,3, το σημείο 0 και οι τιμές a i, i = 1, 2, 3 είναι δεδομένα, και θέλουμε να προσδιορίσουμε τις συναρτήσεις x1(), x2(), x3(). Αν γράψουμε το πιο πάνω σύστημα σε διανυσματική μορφή, τότε έχουμε d ( x () ) = [ F ] x () d x ( 0) = [ a1, a2, a3] που μοιάζει με το ΠΑΤ που μελετήσαμε προηγουμένως. Ας δούμε ένα παράδειγμα: 8 x1 () = x1() + x2() x3() 3 x2 () = 10 x2() + 10 x3() x 3() = x2() x1() + 28 x2() x3() x1(0) = 20, x2(0) = 5, x3(0) = 5 το οποίο γράφουμε σε διανυσματική μορφή ως εξής: 8 8 0 x2( ) 0 x2( ) x 1() 3 x1() 3 d x2( ) 0 10 10 x2( ) = ( x( ) ) = 0 10 10 x( ) d x 3() x2() 28 1 x3() x2() 28 1 [ F ] και x (0) = [20,5, 5]. Τώρα, για να χρησιμοποιήσουμε την εντολή ode45, θα πρέπει να ορίσουμε τον πίνακα [F], που ορίζει τις συναρτήσεις του δεξιού μέλους του συστήματος, σε ένα m- file (μια και δεν μπορούμε να τον ορίσουμε σαν μια ανώνυμη συνάρτηση). Για το παράδειγμα μας τον ορίζουμε στο m-file odefun.m, που φαίνεται πιο κάτω: funcion [xprime] = odefun(,x) [xprime] = odefun(,x) - This funcion corresponds o he RHS of he sysem of ODEs, in which x=[x(1), x(3), x(3)] represens he (vecor) of unknown funcions. xprime = [-8/3,0,x(2);0,-10,10;-x(2),28,-1]*x; End of m-file odefun.m 279
Γ. Γεωργίου & Χρ, Ξενοφώντος Η εντολή ode45 χρησιμοποιείται όπως και πριν [, x] = ode45(@odefun, _span, a) αλλά, τώρα, τα δεδομένα εισόδου και εξόδου έχουν ως εξής: οdefun: το όνομα του m-file που ορίζει τον πίνακα [F]. Παρατηρούμε ότι μια και δίνουμε ένα m-file σαν δεδομένο εισόδου, χρειάζεται να βάλουμε το @ πριν από το όνομα του m-file όταν καλούμε την ode45. _span: το διάνυσμα [, T] όπου ανήκει το αυτό πρέπει να δοθεί με αγκύλες a: το διάνυσμα [a 1, a 2, a 3 ] με τις αρχικές τιμές : το διάνυσμα με τα σημεία 0, 1, 2... 0 x: ένας πίνακας του οποίου η κάθε στήλη αντιστοιχεί στις προσεγγιστικές τιμές των λύσεων [ x1, x2, x 3] Για το παράδειγμα μας έχουμε 0 = 0, [a 1, a 2, a 3 ] = [20, 5, 5], και ας υποθέσουμε ότι το ανήκει στο διάστημα [0, 12]. Γράφουμε >> [,x] = ode45(@odefun,[0,12],[20,5,-5]); με ; στο τέλος για να μην τυπωθούν οι απαντήσεις στην οθόνη. Για να δούμε τις γραφικές παραστάσεις όλων των λύσεων (στους ίδιους άξονες) γράφουμε: >> plo(,x) >> xlabel('') >> ylabel('soluion funcions') >> legend('x_1()','x_2()','x_3()') 50 40 x 1 () x 2 () x 3 () 30 20 Soluion funcions 10 0-10 -20-30 0 2 4 6 8 10 12 Για να πάρουμε τη γραφική παράσταση μιας από τις λύσεις, π.χ. της x 2 (), γράφουμε >> plo(,x(:,2)) 280
11. Συνήθεις διαφορικές εξισώσεις Παράδειγμα 11.3.1 Θεωρούμε το εξής Σ.ΑΤ: x () = 2 x () 2 x () x () x () 2 2 x () x () = x x x x 1 1 1 2 1 1 1 2() = 1() 2() 2() x 2() x2() 1 x2() με αρχικές συνθήκες x1(0) = 1, x2(0) = 3, και [0,20]. Το m-file που ορίζει τον πίνακα του δεξιού μέλους έχει ως εξής: funcion [xprime] = odefun(,x) [xprime] = odefun(,x) - This funcion corresponds o he RHS of he sysem of ODEs, in which x=[x(1),x(2)] represens he (vecor) of unknown funcions. The funcion will be passed as inpu ino he ODE solver. xprime = [2, -2*x(1); x(2), -1]*x; End of m-file odefun.m Γράφουμε >> [,x] = ode45(@odefun,[0,12],[1,3]); >> plo(,x) >> legend('x_1()','x_2()') >> xlabel('') >> ylabel('soluion funcions') και παίρνουμε το γράφημα: 4.5 4 x 1 () x 2 () Soluion funcions 3.5 3 2.5 2 1.5 1 0.5 0 0 2 4 6 8 10 12 281
Γ. Γεωργίου & Χρ, Ξενοφώντος 11.4 Ασκήσεις 11.1 Θεωρούμε το εξής ΠΑΤ. y () = cos( + y), [0,3] y(0) = 0 του οποίου η ακριβής λύση είναι y () = + 2arcan(). Χρησιμοποιείστε το m-file euler.m που γράψαμε, με βήμα h = 0.1, για να βρείτε μια προσέγγιση της λύσης. Να κάνετε τη γραφική παράσταση της λύσης που πήρατε μαζί με την ακριβή λύση στους ίδιους άξονες οι οποίοι πρέπει να έχουν ετικέτες, τίτλο και λεζάντα. Επαναλάβετε με βήμα h = 0.05 και 0.01. 11.2 Για το ΠΑΤ της προηγούμενης άσκησης, χρησιμοποιείστε την εντολή βιβλιοθήκης ode45 για να βρείτε μια προσέγγιση της λύσης. Να κάνετε τη γραφική παράσταση της λύσης που πήρατε μαζί με την ακριβή λύση στους ίδιους άξονες οι οποίοι πρέπει να έχουν ετικέτες, τίτλο και λεζάντα. 11.3 Θεωρούμε το ΠΑΤ y ( x) = x y, y(0) = 0, x [0,1], του οποίου η ακριβής λύση είναι y(x) = e x + x 1. Ορίστε το δεξιό μέλος της ΣΔΕ σαν μια ανώνυμη συνάρτηση f, όπως επίσης και το διάνυσμα με τα εξής βήματα >> h=[0.2,0.1,0.05,0.01,0.005]; και τρέξτε το m-file euler.m που γράψαμε, μέσω του βρόχου >> for i=1:lengh(h) [y,x] = euler(f,0,0,1,h(i)); yex=exp(-x)+x-1; E(i) = max(abs(yex-y)); end για να υπολογίσετε την προσέγγιση της λύσης (y), την ακριβή λύση (yex) και το μέγιστο σφάλμα (E) μεταξύ της προσέγγισης και της ακριβής λύσης στα σημεία που δίνονται από το διάνυσμα x. Στη συνέχεια, κάντε τη γραφική παράσταση του σφάλματος έναντι του βήματος, σε λογαριθμική κλίμακα: >> loglog(h,e,'o-') Τι είναι η κλίση της ευθείας που παίρνετε; Σημείωση: Η πιο πάνω άσκηση μας δίνει την απάντηση στο ερώτημα Πόσο γρήγορα τείνει το σφάλμα στο μηδέν όταν το βήμα τείνει στο μηδέν; Η εξήγηση έχει ως εξής: Εύκολα μπορούμε να παρατηρήσουμε ότι όταν το h 0, έχουμε max Error 0. Έστω ότι E(h) := max Error ~ h p, για κάποιο p > 0 το οποίο 0 x 1 0 x 1 καθορίζει την ταχύτητα σύγκλισης της μεθόδου, δηλ. μας λέει πόσο γρήγορα τείνει το σφάλμα στο μηδέν όταν το βήμα τείνει στο μηδέν. Τότε, έχουμε p p Eh ( )~ h Eh ( ) Ch για κάποια σταθερά C (όταν το h είναι αρκετά μικρό). Παίρνοντας τον λογάριθμο, βρίσκουμε ln( Eh ( )) ln( Ch p ) ln( Eh ( )) ln( C) + pln( h) Αν θέσουμε Y = ln( E( h )), X = ln( h) και B = ln( C), τότε έχουμε την σχέση Y = px + B 282
11. Συνήθεις διαφορικές εξισώσεις άρα η γραφική παράσταση του X έναντι στο Y θα είναι ευθεία της οποίας η κλίση θα είναι το p. 11.4 Χρησιμοποιήστε την εντολή ode45 για να λύσετε τα πιο κάτω ΣΑΤ: (α) (β) (γ) dx1 d dx2 d dx1 d dx2 d = 3x 4 x ; x (0) = 1 1 2 1 = 2x 3 x ; x (0) = 1 1 2 2 = ( 0.1) xx ; x(0) = 10 1 2 1 = x ; x (0) = 15 1 2 dx = xz ; x(0) = 0 d dy = xz ; y(0) = 1 d dz = xy /2; z(0) = 1 d 283
Γ. Γεωργίου & Χρ, Ξενοφώντος 284