ΜΗ-ΓΡΑΜΜΙΚΕΣ ΕΞΙΣΩΣΕΙΣ

Ι. ΜΕΘΟΔΟΙ ΔΥΟ ΑΡΧΙΚΩΝ ΣΗΜΕΙΩΝ

ΜΕΘΟΔΟΣ ΔΙΧΟΤΟΜΗΣΗΣ (BOLZANO)

Κατασκευάζω μια συνάρτηση και την δοκιμάζω.

      function f(x)

      real*8 f,x

      f=dexp(x)-x**2d0

      return

      end

     

      program BolzanoRF

      real*8 f,x1,x2,x3

      print *,’x1=’

      read  *, x1

      print *,’f1=’,f(x1)

      print *,’x2=’

      read  *, x2

      print *,’f2=’,f(x2)

      pause

      end

Βρείτε δυο τιμές x1 και x2 για τις οποίες η συνάρτηση είναι ετερόσημη, δηλ. f(x1)f(x2)<0.

Βρίσκω το πρόσημο της συνάρτησης στο μέσο του διαστήματος x1x2.

      program BolzanoRF

      real*8 f,x1,x2,x3

      print *,’x1=’

      read  *, x1

      print *,’f1=’,f(x1)

      print *,’x2=’

      read  *, x2

      print *,’f2=’,f(x2)

      pause

      x3=(x1+x2)/2d0

      print *,'(x1,x3,x2)=',  x1 ,  x3 ,  x2

      print *,'(f1,f3,f2)=',f(x1),f(x3),f(x2)

      pause

      end

Ελέγχω αν στα σημεία x1 και x3 η συνάρτηση είναι ετερόσημη.

Αν είναι, τότε το καινούριο μου διάστημα είναι το x1x3 και άρα θέτω x2=x3.

Αν δεν είναι, τότε σίγουρα το x2 είναι ετερόσημο του x3. Σ’ αυτήν την περίπτωση, το καινούριο μου διάστημα είναι το x2x3 και άρα θέτω x1=x3.

      print *,’x2=’

      read  *, x2

      print *,’f2=’,f(x2)

      pause

      x3=(x1+x2)/2d0

      print *,'(x1,x3,x2)=',  x1 ,  x3 ,  x2

      print *,'(f1,f3,f2)=',f(x1),f(x3),f(x2)

      if (f(x1)*f(x3).lt.0d0) then

         x2=x3

      else

         x1=x3

      end if

      pause

      print *,'(x1,x2)=',  x1 ,  x2

      print *,'(f1,f2)=',f(x1),f(x2)

      pause

      end

Στην αρχή ήξερα ότι η ρίζα της εξίσωσης βρίσκεται στο διάστημα x1x2 αλλά τώρα ξέρω ότι η ρίζα βρίσκεται π.χ. στο διάστημα x3x2, δηλαδή έχω περιορίσει τη ρίζα στο μισό από το αρχικό μου διάστημα (διχοτόμησα το αρχικό μου διάστημα)!

Επαναλαμβάνω τη διαδικασία διχοτόμησης αρκετές φορές.

      print *,’x2=’

      read *,x2

      print *,’f2=’,f(x2)

      pause

11    x3=(x1+x2)/2d0    σ’ αυτό το σημείο βάζω την «ετικέτα» 11

      print *,'(x1,x3,x2)=',x1,x3,x2

      print *,'(f1,f3,f2)=',f(x1),f(x3),f(x2)

      if (f(x1)*f(x3).lt.0d0) then

         x2=x3

      else

         x1=x3

      end if

      pause

      print *,'(x1,x2)=',x1,x2

      print *,'(f1,f2)=',f(x1),f(x2)

      pause

      if (dabs(f(x3)).gt.1d-5) goto 11    το if κατευθύνει τη ροή του

προγράμματος πίσω στο σημείο 11

δημιουργώντας έτσι ένα «λογικό βρόχο»

      print *,'Root: (x3,f3)=',x3,f(x3)

      pause

      end

 

Έχω βρει τη ρίζα! (‘Η, καλύτερα, έχω βρει ένα x3 που είναι πάρα πολύ κοντά στη ρίζα της δοθείσας εξίσωσης)

ΜΕΘΟΔΟΣ ΓΡΑΜΜΙΚΗΣ ΠΑΡΕΜΒΟΛΗΣ (REGULA FALSI)

Για τη μέθοδο της γραμμικής παρεμβολής χρησιμοποιώ τον τύπο

αντί του τύπου .

 

ΜΕΘΟΔΟΣ ΓΡΑΜΜΙΚΗΣ ΠΑΡΕΜΒΟΛΗΣ (τροποποιημένος αλγόριθμος)

Για γρηγορότερη σύγκλιση χρησιμοποιώ τη συνθήκη αντί της συνθήκης .