Τετάρτη, 24 Σεπτεμβρίου 2014

Επίλυση μη γραμμικών εξισώσεων με την μέθοδο των συναρτησιακών επαναλήψεων

Αρκετές φορές στην επίλυση φυσικών προβλημάτων προκύπτουν εξισώσεις που είναι μη γραμμικές και δεν επιλύονται με κάποια αναλυτική μέθοδο. Σε αυτές τις περιπτώσεις για την επίλυση τους καταφεύγουμε σε αριθμητικές μεθόδους. Μία από αυτές τις μεθόδους είναι η μέθοδος των συναρτησιακών επαναλήψεων.

Χρησιμοποιούμε την μέθοδο των συναρτησιακών επαναλήψεων όταν θέλουμε να επιλύσουμε μία μη γραμμική εξίσωση της μορφής
Η παραπάνω εξίσωση μπορεί να γραφεί ως εξής
Για να υπολογίσουμε την ρίζα της f(x) ακολουθούμε της εξής επαναληπτική διαδικασία
όπου i=0, 1, 2, 3,... . Η τιμή x0 ονομάζεται αρχική τιμή και επιλέγεται πριν ξεκινήσει η επαναληπτική διαδικασία (κοντά στην ρίζα που ψάχνουμε).

Μία εφαρμογή της παρακάτω μεθόδου είναι η ακόλουθη. Θέλουμε να επιλύσουμε την εξίσωση
με την μέθοδο των συνατησιακών επαναλήψεων. Έπειτα, θα επαληθεύσουμε την λύση καθώς γνωρίζουμε πως οι λύσεις της εξίσωσης είναι το 1 και το -4.

Αρχικά, φέρνουμε την παραπάνω εξίσωση στην μορφή 
δηλαδή
Έπειτα γράφουμε έναν κώδικα στην visual basic ο οποίος θα πραγματοποιήσει την διαδικασία αυτή. Αυτός ο κώδικας είναι ο παρακάτω

Private Sub Command1_Click()

Dim x0 As Double, n As Integer, i As Integer, flag As Boolean, x1 As Double

Open "results.txt" For Output As #1

x0 = InputBox("δώσε την αρχική τιμή")
n = InputBox("δώσε τον αριθμό των επαναλήψεων")
i = 1
flag = False

Print #1, "αρχική τιμή", x0

Do Until i > n Or flag = True

x1 = (4 - x0 ^ 2) / 3

Print #1, i, x1

If Abs(x1 - x0) < 0.0001 Then
flag = True
End If

x0 = x1

i = i + 1
Loop

Close #1
End Sub

Για να λειτουργήσει χρειάζεται ως είσοδο την αρχική τιμή και τον μέγιστο αριθμό των επαναλήψεων που θα πραγματοποιήσει. Όταν υπάρχει σύγκλιση σταματάει από μόνος του. Δοκιμάζουμε ως αρχική τιμή το 1.5 και 20 επαναλήψεις. Όταν τρέξουμε τον κώδικα παίρνουμε ένα αρχείο txt (η πρώτη στήλη είναι ο αριθμός της επανάληψης και η δεύτερη η τιμή του x) με το εξής περιεχόμενο:

 1             0.583333333333333 
 2             1.21990740740741 
 3             0.837275305784179 
 4             1.09965668744134 
 5             0.930251723255182 
 6             1.04487724379359 
 7             0.969410515134105 
 8             1.02008108438248 
 9             0.98647819376169 
 10            1.00895359107756 
 11            0.994004217017233 
 12            1.00398520551732 
 13            0.997337902367449 
 14            1.00177236950043 
 15            0.998817373235163 
 16            1.0007879516412 
 17            0.999474491949935 
 18            1.00035024664714 
 19            0.999766461344336 
 20            1.00015567425701 

Παρατηρούμε ότι η λύση συγκλίνει στο 1 μετά από 20 επαναλήψεις. Είναι αποδεκτή, λοιπόν, καθώς πράγματι γνωρίζουμε πως η μία λύση είναι το 1. Όμως ακόμη γνωρίζουμε πως η συνάρτηση έχει και ως λύση το -4. Πώς θα την βρούμε με την μέθοδο των συναρτησιακών επαναλήψεων; Ας δοκιμάσουμε μία διαφορετική αρχική τιμή, την -3 και 20 επαναλήψεις. Τότε έχουμε

 1            -1.66666666666667 
 2             0.407407407407407 
 3             1.27800640146319 
 4             0.788899879273035 
 5             1.12587899349433 
 6             0.910798830669398 
 7             1.05681516335042 
 8             0.961047236837542 
 9             1.02546273618897 
 10            0.982808725562607 
 11            1.01136233631933 
 12            0.992382074891565 
 13            1.00505927247797 
 14            0.996618619602018 
 15            1.00225044235419 
 16            0.99849801693361 
 17            1.00100057005988 
 18            0.99933261957993 
 19            1.0004447718145 
 20            0.999703419516341 

Αυτό που συμβαίνει είναι ότι ενώ επιλέξαμε αρχική τιμή κοντά στην ρίζα -4 έχουμε σύγκλιση στην ρίζα 1. Επομένως η αλλαγή της αρχικής τιμής δεν βοηθάει στην συγκεκριμένη περίπτωση. Θα δοκιμάσουμε να αλλάξουμε την μορφή της συνάρτησης g που επιλέξαμε για να δούμε μήπως θα έχουμε σύγκλιση στην ρίζα -4. Έτσι η νέα σχέση που έχουμε είναι
και αντικαθιστούμε την γραμμή του κώδικα

x1 = (4 - x0 ^ 2) / 3

με την

x1 = 4 / x0 - 3

Δοκιμάζουμε ξανά ως αρχική τιμή το -3 και για 20 επαναλήψεις παίρνουμε το εξής αρχείο

αρχική τιμή   -3
 1            -4.33333333333333
 2            -3.92307692307692
 3            -4.01960784313725
 4            -3.99512195121951
 5            -4.001221001221
 6            -3.99969484284406
 7            -4.00007629510948
 8            -3.99998092658643 

Έτσι έχουμε σύγκλιση στο -4 με 8 επαναλήψεις.

Τέλος, καταλήγουμε πως γενικά το που θα έχει σύγκλιση μία επαναληπτική μέθοδος εξαρτάται από την αρχική τιμή που θα επιλέξουμε και από την μορφή της σχέσης x=g(x).

Πηγή: Αριθμητική ανάλυση με χρήση Η/Υ, Ε.Σιδηρόπουλος, Χ.Φωτιάδης

2 σχόλια:

  1. Πολύ ωραία παρουσίαση . Παρόμοια μέθοδο είχα χρησιμοποιήσει για τον υπολογισμό ομοιόμορφου βάθους ροής σε ορθογωνικές , τραπεζοειδείς ή τριγωνικές διώρυγες .

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Ευχαριστώ πολύ. Ναι γενικά αυτή η μέθοδος χρησιμοποιείται πολύ συχνά σε μη γραμμικές εξισώσεις όπως στις εξισώσεις που διέπουν προβλήματα ανοικτών αγωγών.

      Διαγραφή