μαθηματικα με matlab

of 61 /61
ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΑΡΙΘΜΗΤΙΚΕΣ ΜΕΘΟ∆ΟΙ ΕΦΑΡΜΟΓΗ: MATLAB Ε.Ε. ΝΙΣΤΑΖΑΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΣΤΑΤΙΣΤΙΚΗΣ ΚΑΙ ΑΝΑΛΟΓΙΣΤΙΚΩΝ - ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΜΑΘΗΜΑΤΙΚΩΝ ΣΑΜΟΣ 2006

Embed Size (px)

Transcript of μαθηματικα με matlab

Page 1: μαθηματικα με matlab

ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΑΡΙΘΜΗΤΙΚΕΣ ΜΕΘΟ∆ΟΙ ΕΦΑΡΜΟΓΗ: MATLAB

Ε.Ε. ΝΙΣΤΑΖΑΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΣΤΑΤΙΣΤΙΚΗΣ ΚΑΙ ΑΝΑΛΟΓΙΣΤΙΚΩΝ - ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΜΑΘΗΜΑΤΙΚΩΝ

ΣΑΜΟΣ 2006

Page 2: μαθηματικα με matlab

Περιεχόµενα:

Πρόλογος 3

1. Υπολογιστικές Αριθµητικές Μέθοδοι 5

1.1. Γιατί χρησιµοποιούµε Υπολογιστικές Μεθοδους; 5

1.2. Τι είναι το Matlab και γιατί το χρησιµοποιούµε; 6

1.3. Τι είναι το Command Window και πως δουλεύει το Matlab 9

1.4. Πως γράφουµε προγράµµατα στο Matlab 10

1.5. Το πρώτο πρόγραµµα στο Matlab 11

1.6. Πως κατασκευάζονται οι βοηθητικές συναρτήσεις 19

2. Επίλυση συστηµάτων γραµµικών εξισώσεων 24

2.1. Μέθοδος Gauss 24

2.2. Μέθοδος Gauss_Jordan 27

2.3. Υπολογισµός ορίζουσας πίνακα 28

2.4. Υπολογισµός αντιστρόφου πίνακα 29

3. Υπολογισµός ριζών µη γραµµικών αλγεβρικών εξισώσεων 31

3.1. Μέθοδοι διαδοχικών δοκιµών 31

3.2. Μέθοδος διχοτόµησης 32

3.3. Επαναληπτικές µέθοδοι 34

3.4. Μέθοδος Newton-Raphson 35

4. Παρεµβολή 39

4.1. Πολυωνυµική παρεµβολή 39

5. Αριθµητική Παραγώγιση 43

5.1. Μέθοδοι Αριθµητικής Παραγώγισης 43

5.2. Υπολογισµός παραγώγου µε χρήση συνάρτησης πολυωνυµικής παρεµβολής 45

6. Αριθµητική ολοκλήρωση 50

6.1. Μέθοδοι Αριθµητικής Ολοκλήρωσης 50

6.2. Ολοκλήρωση µε τον κανόνα του Παραλληλογράµµου 51

6.3. Ολοκλήρωση µε τον κανόνα Τραπεζίου 53

6.4. Ολοκλήρωση Συνάρτησης Παρεµβολής 55

Βιβλιογραφία 61

2

Page 3: μαθηματικα με matlab

Πρόλογος

Οι σηµειώσεις αυτές αποτελούν ένα µέρος των σηµειώσεων του µαθήµατος

της αριθµητικής ανάλυσης που θα διδαχθεί στο µεταπτυχιακό πρόγραµµα σπουδων.

Στο τµήµα αυτό έχει γίνει µία προσπάθεια να εξοικειωθούν οι φοιτητές µε τα

εργαλεία αριθµητικής επίλυσης προβληµάτων. Πρέπει να τονιστεί εδώ πως δεν

έχουµε τη φιλοδοξία µέσα από αυτές τις σηµειώσεις να θεωρούµε ότι κάποιος µπορεί

να µάθει για όλες τις αριθµητικές µεθόδους επίλυσης. Ευελπιστούµε όµως ότι θα

δώσουµε µία ώθηση σε αυτούς που ενδιαφέρονται να ασχοληθούν και να

προσπαθήσουν να ανακαλύψουν τους τρόπους µε τους οποίους θα κάνουν την

δουλειά τους πιο εύκολη. Οι µέθοδοι αυτοί µπορούν να δώσουν αποτελέσµατα µε τη

χρήση ηλεκτρονικού υπολογιστή. Η γλώσσα η οποία χρησιµοποιούµε και θα γίνει

προσπάθεια κατανόησης της στις επόµενε σελίδες είναι η γλώσσα προγραµµατισµού-

εφαρµογή Matlab.

Οι σηµειώσεις αυτές έχουν στόχο να δώσουν στους φοιτητές την αρχική

ώθηση ώστε να αρχίσουν να ασχολούνται µε αυτή τη γλώσσα προγραµµατισµού.

Προσπαθεί να τους δείξει τον τρόπο µε τον οποίο θα µπορούν να λύνουν τα

προβλήµατα που θα τους παρουσιάζονται κατά τη διάρκεια του προγραµµατοσµού

χωρίς να χρειάζονται βοήθεια “από άλλους που ξέρουν το πρόγραµµα καλύτερα”.

Προσπαθεί να αποδείξει οτι δεν είναι απλά µία ακόµα γλώσσα προγραµµατισµού,

αλλά ένα πιο σύνθετο εργαλείο που µπορεί να φανεί πολύ χρήσιµο σε οποιον

ενδιαφέρεται για την επίλυση αριθµητικών προβληµάτων οποιασδήποτε

κατεύθυνσης.

Η προσπάθεια που έχει γίνει µε τη συγγραφή των σηµειώσεων αυτών και τις

παραδόσεις του µαθήµατος στην τάξη είναι προς την κατεύθυνση της απόδειξης ότι η

χρήση υπολογιστικών µεθόδων και γενικότερα όλη η επιστήµη που ονοµάζεται

“Computational Analysis” έχει δηµιουργηθεί για να βοηθήσει όσους πρέπει να

λύσουν κάποια προβλήµατα µαθηµατικής φύσεως και δεν µπορούν να το πετύχουν

µόνο µε τη χρήση αναλυτικών µεθόδων.

Στις σελίδες που ακολουθούν πιστεύουµε ότι δίνουµε το έναυσµα στους

φοιτητές να ασχοληθούν µε αυτόν τον νέο κόσµο που ανοίγεται µπροστά τους και

λέγεται “Υπολογιστικές Μέθοδοι”. Οµως για την πλήρη κατανόηση των εννοιών που

3

Page 4: μαθηματικα με matlab

υπάρχουν µέσα στο φυλλάδιο αυτό και την επίλυση όλων των πιθανών αποριών που

δηµιουργούνται διαβάζοντας το, είναι απαραίτητη η παρακολούθηση του µαθήµατος.

Κατα τη διάρκεια των µαθηµάτων θα γίνει προσπάθεια ώστε να επιλυθεί όσο το

δυνατόν µεγαλύτερος αριθµός αποριών και προβληµάτων που παρουσιάζονται στην

κατανόηση των παρουσιαζόµενων αριθµητικών µεθόδων καθώς και κατά τη διάρκεια

του προγραµµατισµού σε Matlab. Για το λόγο αυτό, εκτός από τις ερωτήσεις που

υπάρχουν ήδη µέσα στις σηµειώσεις αυτές, θα δίνονται από τον διδάσκοντα εργασίες

που θα πρέπει να παραδίδονται µέσα σε συγκεκριµένα χρονικά πλάισια. Οι εργασίες

αυτές θα βοηθούν στην καλυτερη κατανόηση των προβληµάτων που αναλύονται στο

µάθηµα και θα µετρούν και στον τελικό βαθµό του µαθήµατος.

Ο διδάσκοντας θα βρίσκεται στη διάθεση των φοιτητών τις µέρες που θα

γίνεται το µάθηµα, στην αίθουσα διδασκαλίας ή στο γραφείο του τις ώρες που δεν θα

γίνεται µάθηµα, ενώ τις υπόλοιπες µέρες οι ενδιαφερόµενοι φοιτητές θα µπορούν να

επικοινωνούν µαζί του µέσω e-mail.

Ε.Ε. Νισταζάκης

[email protected]

4

Page 5: μαθηματικα με matlab

1. Υπολογιστικές - Αριθµητικές Μέθοδοι

1.1. Γιατί χρησιµοποιούµε Υπολογιστικές Μεθόδους

Οποιοσδήποτε έχει ασχοληθεί µε την επιστήµη των µαθηµατικών

αντιλαµβάνεται ότι πολλά από τα προβλήµατα που χρειάζεται να επιλύσει δεν είναι

δυνατόν να επιλυθούν µε αµιγώς αναλυτικές µεθόδους. Πολλές φορές επίσης το

πρόβληµα είναι ότι οι αναλυτικές τεχνικές απαιτούν πολύ µεγάλο χρόνο επεξεργασίας

µέχρι να δώσουν αποτέλεσµα ενώ οι αριθµητικές-υπολογιστικές µέθοδοι µπορούν να

πετύχουν επίλυση σε πολύ µικρότερα χρονικά διαστήµατα.

Με βάση τα παραπάνω κάποιος θα µπορούσε να υποθέσει ότι οι αριθµητικές-

υπολογιστικές µέθοδοι ουσιαστικά δεν απαιτούν την ύπαρξη αναλυτικών τεχνικών

επίλυσης και ότι µπορούν να επιλύσουν οποιοδήποτε πρόβληµα σωστά και σε πολύ

µικρό χρονικό διάστηµα. Η λογική όµως αυτή είναι απολύτως εσφαλµένη. Για να

µπορούν οι αριθµητικές µέθοδοι να δώσουν σωστά αποτελέσµατα θα πρέπει να έχουν

επιλεγεί µε κατάλληλο τρόπο ώστε να µην παρουσιάζουν µεγάλα σφάλµατα. Πολλές

φορές τα σφάλµατα, ανάλογα µε τη µέθοδο που χρησιµοποιείται, είναι τόσο µεγάλα

που τα αποτελέσµατα τα οποία λαµβάνονται είναι τελείως λάθος. Για το λόγο αυτό,

πριν χρησιµοποιηθεί οποιαδήποτε υπολογιστική µέθοδος πρέπει να γίνεται η

καταλληλη αριθµητική ανάλυση, η οποία θα στηρίζεται πάνω σε αναλυτικές τεχνικές

επίλυσης, µέσω της οποίας θα επιλέγεται η µέθοδος επίλυσης η οποία θα δίνει

αποτελέσµατα µε το µικρότερο δυνατό σφάλµα.

Αρα λοιπόν η διαδικασία επίλυσης ενός µαθηµατικού προβλήµατος δεν

µπορεί απευθείας να φτάσει στο επίπεδο των υπολογιστικών µεθόδων. Πρέπει πρώτα

να αναλυθεί το πρόβληµα, να υπολογιστεί θεωρητικά και ποιοτικά το αναµενόµενο

αποτέλεσµα στη συνέχεια να επιλεγεί ο κατάλληλος τρόπος επίλυσης, να µετατραπεί

σε γλώσσα προγραµµατισµού και στη συνέχεια να εφαρµοστεί από τον ηλεκτρονικό

υπολογιστή και να δώσει αποτελέσµατα.

Η επιλογή όµως της κατάλληλης µεθόδου είναι µία αρκετά δύσκολη

διαδικασία. Πραγµατοποιείται στα πλαίσια της Αριθµητικής Ανάλυσης και

στηρίζεται στη µελέτη των αριθµητικών µεθόδων και τα σφάλµατα τα οποία

προσδίδουν στα αποτελέσµατα. Οταν επιλεγεί η κατάλληλη αριθµητική µέθοδος αυτή

5

Page 6: μαθηματικα με matlab

υλοποιείται αλγοριθµικά, στα πλαίσια της Υπολογιστικής Ανάλυσης και στη συνέχεια

φορτώνεται στον υπολογιστή ο οποίος θα δώσει τα αριθµητικά αποτελέσµατα.

Η διαδικασία επιλογής της κατάλληλης αριθµητικής µεθόδου καθώς και η

αλγοριθµική της υλοποίηση είναι ουσιαστικά ο σκοπός του µαθήµατος αυτού. Το

µέσο το οποίο θα µετατρέπει τον σχεδιασµένο αλγόριθµο σε κώδικα για τον

υπολογιστή είναι ένα εργαλείο το οποίο ονοµάζεται Matlab.

1.2. Τι είναι το Matlab και γιατι το χρησιµοποιούµε;

Το Matlab είναι ένα “υπολογιστικό εργαλείο” µέσω του οποίου µπορεί να

εκτελεστεί µεγάλος αριθµός υπολογισµών µε τη χρήση ελαχίστων εντολών. Η

εφαρµογή αυτή δεν αποτελεί άλλη µία γλώσσα προγραµµατισµού αλλά ένα

ολοκληρωµένο πρόγραµµα το οποίο µπορεί να χρησιµοποιεί ένα µεγάλο αριθµό

εντολών-συναρτήσεων οι οποίες είτε βρίσκονται ήδη αποθηκευµένες στη µνήµη του

υπολογιστή είτε κατασκευάζονται από τον ίδιο τον χρήστη ανάλογα µε το πρόβληµα

που τον ενδιαφέρει να επιλύσει.

Οι δυνατότητες που µας δίνει η εφαρµογή αυτή είναι τεράστιες. Μας

επιτρέπει να χρησιµοποιήσουµε τις έτοιµες ρουτίνες του και σε περιπτωση που καµία

από αυτές δεν επαρκούν για να επιλύσουµε το πρόβληµα που µας ενδιαφέρει µας

“βοηθάει” να κατασκευάσουµε τους δικούς µας αλγόριθµους-συναρτήσεις που

απαιτούνται.

Οι πιο χρήσιµες εντολές για τους αρχάριους, αλλά και πολύ συχνά για τους

έµπειρους, χρήστες του προγράµµατος είναι δύο:

(1) το help και

(2) το lookfor.

Οπως αναφέρθηκε παραπάνω το Matlab είναι ένα πρόγραµµα το οποίο

περιέχει έτοιµους αλγορίθµους του οποίους µπορεί να χρησιµοποιήσει άµεσα ο

χρήστης. Οµως πολύ συχνά είτε γνωρίζουµε την εντολή που θα χρησιµοποιήσουµε

αλλα δεν ξέρουµε πως συντάσσεται είτε, γνωρίζουµε περίπου τη χρήση της εντολής

6

Page 7: μαθηματικα με matlab

αλλά δεν ξέρουµε ακριβώς τη λειτουργία της. Η λύση στα προβλήµατα αυτά είναι η

εντολή help.

Η εντολή αυτή ακολουθείται πάντα από την εντολή που µας ενδιαφέρει να µάθουµε

τη λειτουργία της, ή τη σύνταξη της και δίνει ώς αποτέλεσµα τις πληροφορίες που

µας ενδιαφέρουν.

Ως παράδειγµα θα µπορούσαµε εδώ να αναφέρουµε την εντολή abs η οποία

είναι η εντολή η οποία µας δίνει στην έξοδο της την απόλυτη τιµή ενός πραγµατικού

αριθµού αλλά και το µέτρο ενός µιγαδικού και προέρχεται από την λέξη

absolute=απόλυτο. Στην περίπτωση αυτή γράφουµε στο Command Window του

Matlab:

» help abs

και λαµβάνουµε ως απάντηση:

ABS Absolute value.

ABS(X) is the absolute value of the elements of X. When X is complex, ABS(X) is

the complex modulus (magnitude) of the elements of X.

See also SIGN, ANGLE, UNWRAP.

Παρατηρούµε ότι:

(α) στην περίπτωση που χρησιµοποιούµε την εφαρµογή Matlab και όχι κάποια

βασική γλώσσα προγραµµατισµου (π.χ. C/C++) µπορούµε να υπολογίσουµε την

απόλυτη τιµή όλων των στοιχείων ενός πίνακα, έστω Χ, χωρίς να χρειάζεται να

κατασκευάσουµε ολόκληρο πρόγραµµα µε τους αντίστοιχους βρόχους κλπ.

(β) παρατηρούµε ότι για την περίπτωση µιγαδικών αριθµών (είτε πίνακα που περιέχει

µιγαδικούς αριθµούς), π.χ. Χ=α+iβ, αντιστοιχεί στο abs(X)=sqrt(α^2+β^2) χωρίς

να χρειάζεται να γράψουµε ούτε µία γραµµή προγράµµατος όπως θα κάναµε µε

κάποια άλλη γλώσσα προγραµµατισµού.

7

Page 8: μαθηματικα με matlab

(γ) στην τελευταια γραµµή της απάντησης του help το ίδιο το πρόγραµµα µας

προτείνει κάποιες άλλες εντολές που µπορούν να χρησιµοποιηθούν και έχουν

άµεση σχέση µε την εντολή που µας ενδιαφέρει (στην προκείµενη περίπτωση την

abs). Φυσικά για κάθε µία από τις εντολές αυτές µπορούµε να χρησιµοποιήσουµε

ξανά το help για να κατανοήσουµε καλύτερα τη λειτουργία τους.

Η δεύτερη πολύ σηµαντική εντολή που χρησιµοποιείται πολύ συχνά κατά τη

διάρκεια του προγραµµατισµού σε περιβάλλον Matlab είναι η lookfor. Η εντολή αυτή

ακολουθείται παντα από µία λέξη. Η λέξη αυτή δεν είναι υποχρεωτικά εντολή-

συνάρτηση που ήδη υπάρχει στο Matlab αλλά κάποια λέξη κλειδί. Για να

κατανοήσουµε καλύτερα τη χρήση της εντολής αυτής ας δούµε ένα ακόµα

παράδειγµα παρόµοιο µε το προηγούµενο.

Ας θεωρήσουµε ότι µας ενδιαφέρει να βρούµε την εντολή η οποία υπολογίζει

την απόλυτη τιµή ενός αριθµού και δεν γνωρίζουµε ότι είναι η abs. Στην περίπτωση

αυτή γράφουµε στο Command Window του Matlab:

» lookfor absolute

και το πρόγραµµα ψάχνει να βρει τις εντολές που στο help file τους υπάρχει η λέξη

absolute που αναζητούµε. Η απάντηση στο lookfor, στην προκείµενη περίπτωση

είναι:

MAUIFINDEXE Return the absolute pathname to a MAUI executable.

ABS Absolute value.

CIRCLEPICK Pick bad triangles using an absolute tolerance

MAD Mean absolute deviation.

∆ηλαδή µας λέει την εντολή που χρησιµοποιούµε και την περιγράφει µε έναν πολύ

σύντοµο τρόπο. Αν µας ενδιαφέρει κάποια από τις εντολές αυτές χρησιµοποιούµε την

εντολή help για να µάθουµε τον τρόπο που συντάσσεται.

8

Page 9: μαθηματικα με matlab

Το Matlab δηλαδή έχει έναν πολύ άµεσο τρόπο να βοηθάει τον χρήστη να

χρησιµοποιήσει τις εντολές-συναρτήσεις που απαιτούνται για την περάτωση του

προγράµµατος που κατασκευάζει. Επίσης, µε τρόπο που θα δούµε στη συνεχεια ο

κάθε χρήστης του προγράµµατος µπορεί να κατασκευάσει την δικιά του εντολή

συνάρτηση η οποία θα περιέχει το δικό της help-file.

Καταγράφοντας τις δύο εντολές του Matlab παραπάνω (help και lookfor) αναφέρθηκε

η φράση “Command Window”. Οµως τι ακριβώς είναι αυτό το “παράθυρο εντολών”;

1.3. Τι είναι το Command Window και πώς δουλεύει το Matlab;

Για µπορούµε να δουλέψουµε την εφαρµογή Matlab θα πρέπει να την έχουµε

εγκαταστήσει στον υπολογιστή µας. Ο τρόπος εγκατάστασης είναι απλός και απαιτεί

διαδικασία αντίστοιχη µε αυτή οποιασδήποτε εφαρµογής που θέλουµε να βάλουµε

βάλουµε στον υπολογιστή µας.

Αφού επιλέξουµε τα components που µας ενδιαφέρουν, αφήνουµε το

πρόγραµµα να κάνει εγκατάσταση. Μετά από αυτή τη διαδικασία µας ζητείται

επανεκίνηση του υπολογιστή και µόλις συµβεί αυτό στο desktop θα υπάρχει ενα

εικονίδιο που θα ονοµάζεται Matlab x,y όπου x,y το version number του

προγράµµατος. Επιλέγουµε το εικονίδιο αυτό και στη συνέχεια η εφαρµογή ξεκινάει

ανοίγοντας µία οθόνη η οποία ονοµάζεται Command Window.

Η οθόνη αυτή είναι η βασική του Matlab και σε αυτήν µπορούµε να

χρησιµοποιήσουµε οποιαδήποτε εντολή-συνάρτηση η οποία υπάρχει στο πρόγραµµα.

Οι εντολές που µπορούµε να χρησιµοποιήσουµε είναι είτε αυτές που είναι έτοιµες

από την αρχή της λειτουργίας του προγράµµατος είτε, αυτές που έχουµε

κατασκευάσει µόνοι µας αρκεί να βρίσκονται στο κατάλληλο directory του σκληρού

δίσκου του υπολογιστή. Επίσης µπορούµε να δηµιουργήσουµε ένα πρόγραµµα το

οποίο θα αποτελείται από µια σειρά εντολών και µπορεί να δίνει αποτελέσµατα, όµως

στην περίπτωση αυτή πρέπει να ακολουθήσουµε µία άλλη διαδικασία η οποία απαιτεί

τη χρήση του Editor.

9

Page 10: μαθηματικα με matlab

1.4. Πως γράφουµε προγράµµατα στο Matlab;

Από το Commad Window γράφουµε την εντολή edit. Η εντολή αυτή µας

µεταφέρει σε ένα παράθυρο, το οποίο δεν είναι τίποτα άλλο παρά ένας Editor ο

οποίος έχει κατασκευαστεί ειδικά για το Matlab. Στον Editor αυτόν οτιδήποτε

γραφτεί µπορεί να αποθηκευτεί σε ένα συγκεκριµένο σηµείο µέσα στο directory του

Matlab. Αν η ακολουθία των εντολών που έχουν χρησιµοποιηθεί βγάζει σωστό, από

πλευράς προγραµµατισµού, αποτέλεσµα τότε το πρόγραµµα θα τρέχει και θα δίνει

αποτελέσµατα. Ο τρόπος µε τον οποίο τρέχει ένα πρόγραµµα στο Μatlab είναι αυτός

που αναφέρθηκε στο προηγούµε νο κεφάλαιο. ∆ηλαδή, στο Command Window,

βρίσκουµε το directory µέσα στο οποίο βρίσκεται η εντολή ή το πρόγραµµα που µας

ενδιαφέρει και απλά γράφουµε το όνοµα του. Αν έχουµε ήδη αρχίσει να γράφουµε

κάποιο πρόγραµµα και είτε το έχουµε αφήσει στη µέση είτε θέλουµε να διορθώσουµε

κάτι, τότε απλά γράφουµε:

» edit ονοµα αρχείου

στην περίπτωση που πρέπει από το directory που βρισκόµαστε να πάµε σε κάποιο που

βρίσκεται µέσα σε αυτό τότε χρησιµοποιούµε την εντολή:

» cd ονοµα sub-directory

ενώ στην περίπτωση που θέλουµε να βγούµε από κάποιο sub-directory απλά

γράφουµε:

» cd ..

Αφού έχουµε κατανοήσει τον τρόπο µε τον οποίο δουλεύουµε µέσα στο

Command Window ας δούµε τη διαδικασία µε την οποία γράφουµε ένα πρόγραµµα

στον Editor.

10

Page 11: μαθηματικα με matlab

1.5. Το πρώτο πρόγραµµα στο Matlab;

Οπως αναφέρθηκε στο προηγούµενο κεφάλαιο, στο Matlab µπορούµε να

φτιάξουµε προγράµµατα τα οποία χρησιµοποιούν µία σειρά από εντολές-συναρτήσεις

και δίνουν τα αποτελέσµατα των υπολογισµών που θέλουµε. Ο τρόπος µε τον οποίο

γίνεται αυτό είναι µέσω του Editor. Ανοίγοντας τον Editor µε τον τρόπο που

περιγράψαµε, το πρώτο πράγµα που κάνουµε είναι να αποθηκεύσουµε το πρόγραµµα

µας µε κάποιο όνοµα, στο directory που µας ενδιαφέρει. Για το λόγο αυτό επιλέγουµε

πρώτα,

File

και στη συνέχεια,

Save as..

Μετα την επιλογή αυτή θα πρέπει να επιλέξουµε το directory µέσα στο οποίο θα

τοποθετήσουµε το πρόγραµµα µας καθώς και το όνοµα του. Συνήθως τα

προγράµµατα που κατασκευάζουµε τα αποθηκεύουµε µέσα σε ένα directory το οποίο

λέγεται work. Με το όνοµα αυτό πλέον θα το καλούµε κάθε φορά που θέλουµε να το

ενεργοποιήσουµε, ενώ βέβαια έχουµε βάλει το Command Window στο κατάλληλο

directory.

Αφού αποθηκεύσουµε το όνοµα του προγράµµατος µπορούµε να αρχίσουµε τη

συγγραφή του. Στη συνέχεια θα δούµε ένα απλό προγραµµατακι το οποίο υπολογίζει

τις ρίζες µίας δευτεροβάθµιας εξίσωσης. Θα το αποθηκεύσουµε µε την ονοµασία

“deyterobathmia.m” και θα έχει την ακόλουθη µορφή:

Πρόγραµµα 1:

1 % We solve the Equation ax^2+bx+c=0

2 clear;

11

Page 12: μαθηματικα με matlab

3 clc;

4 close all;

5

6 a = 1;

7 b = 1;

8 c = 1;

9

10 D = sqrt(b^2-4*a*c);

11

12 p1 = (-b+D)/(2*a);

13 p2 = (-b-D)/(2*a);

14

15 p1r = real(p1);

16 p1i = imag(p1);

17

18 p2r = real(p2);

19 p2i = imag(p2);

20

21 fprintf('p1=%.4f %.4fi\np2=%.4f %.4fi\n',p1r,p1i,p2r,p2i);

Επεξήγηση του προγράµµατος:

• Οι αριθµοί οι οποίοι εµφανίζονται αριστερά από την κάθε γραµµή εντολών δεν

περιλαµβάνονται στο πρόγραµµα (δεν τις γράφουµε στον Editor) αλλά υπάρχουν

για να µπορούµε πιο εύκολα να αναφερόµαστε σε συγκεκριµένες γραµµές και

εντολές του κάθε προγράµµατος.

• Οτιδήποτε υπάρχει µετά το σύµβολο % είναι σχόλιο και δεν λαµβάνεται υπόψη

από το πρόγραµµα. Οµως, ότι υπάρχει µετά το σύµβολο αυτό είναι το κείµενο το

οποίο εµφανίζεται κάθε φορά που χρησιµοποιούµε την εντολή help. Ετσι, αν στο

Command Window γράψουµε:

help deyterovathmia

12

Page 13: μαθηματικα με matlab

το αποτέλεσµα το οποίο θα πάρουµε στην οθόνη, θα είναι:

We solve the Equation ax^2+bx+c=0

• Η εντολή clear (και η clear all) καθαρίζει τη µνήµη του υπολογιστή από

οποιεσδήποτε εκχωρήσεις µεταβλητών έχουν γίνει σε προηγούµενα

προγράµµατα.

Η εντολή clc καθαρίζει την οθόνη για να τυπωθεί ό,τι αποτέλεσµα δώσει το

πρόγραµµα.

Η εντολή close all κλείνει όλα τα παράθυρα σχηµάτων που τυχόν υπάρχουν

ανοιχτά από προηγούµενα προγράµµατα.

Οι τρείς παραπάνω εντολές είναι καλό να χρησιµοποιούνται στην αρχή

οποιουδήποτε προγράµµατος για να αποφεύγονται λάθος αποτελέσµατα και

λανθασµένες εκχωρήσεις µεταβλητών.

• Στη συνέχεια εκχωρούνται οι τιµές των µεταβλητών. Ορίζεται η τιµή της

µεταβλητής a ίση µε το 1, η τιµή της b ίση µε το 1 και της c ίση µε το 1. Οι τιµές

αυτές µπορούν να αλλάξουν ανάλογα µε τη δευτεροβάθµια εξίσωση που θέλουµε

να λύσουµε. Στην προκείµενη περίπτωση, όπως φαίνεται και στην πρώτη γραµµή

του προγράµµατος, η εξίσωση που επιλύεται είναι η x2+x+1=0.

• Στη συνέχεια υπολογίζουµε τη διακρίνουσα στην οποία δίνουµε την ονοµασία D.

Η εντολή sqrt είναι η τετραγωνική ρίζα.

• Υπολογίζονται οι δυο ρίζες τις εξίσωσης, p1 και p2.

• Υπολογίζεται το πραγµατικο (p1r, p2r) και το φανταστικό (p1i, p2i) µέρος της

κάθε ρίζας.

• Τυπώνεται στην οθόνη το αποτέλεσµα. Οι εκφράση %.4f σηµαίνει ότι τυπώνονται

4 ψηφία µετά την υποδιαστολή και το f οτι αναφερόµαστε σε ρητο (float) αριθµό.

Το \n σηµαίνει αλλαγή γραµµής.

Το πρόγραµµα αυτό είναι ένα πολύ απλό πρόγραµµα το οποίο όµως µας δείχνει µε

τον καλύτερο τρόπο τις απεριόριστες δυνατότητες του Matlab. ∆ηλαδη,

συγκρινόµενο µε κάποια ευρέως διαδεδοµένη γλώσσα προγραµµατισµού (π.χ.

13

Page 14: μαθηματικα με matlab

C/C++) θα µπορούσαµε πολύ εύκολα να βρούµε πάρα πολλά σηµεία υπεροχής.

Αναφέρουµε µερικά:

o ∆εν χρειάζεται να ορίσουµε το είδος των µεταβλητών που θα χρησιµοποιήσουµε

(float, double, κλπ)

o ∆εν χρειάζεται να προσέξουµε µήπως το υπόριζο προκύψει αρνητικό (η C/C++,

θα έβγαζε µήνυµα λάθους)

o ∆εν χρειάζεται να κάνουµε compile το πρόγραµµα απλά το ενεργοποιούµε

γράφοντας το όνοµα του Command Window.

Τα παραπάνω είναι µερικά µόνο από τα πλεονεκτήµατα του Matlab σε σχέση µε

άλλες γλώσσες προγραµµατισµού.

Οπως αναφέρθηκε παραπάνω το µεγάλο πλεονέκτηµα της εφαρµογής Matlab

σε σχέση µε άλλες γλώσσες προγραµµατισµού είναι ότι µπορεί να χρησιµοποιεί

ρουτίνες οι οποίες είναι ήδη έτοιµες και να δίνει απευθείας τα ζητούµενα

αποτελέσµατα. Ετσι το παραπάνω πρόγραµµα θα µπορούσε να είχε γραφτεί µε την

ακόλουθη πολύ πιο εύκολη µορφή (ονοµάστε το πρόγραµµα αυτό

“deyterovathmia2.m”):

Πρόγραµµα 2:

1 % We solve the Equation a1x^2+a2x+a3=0 with the function roots

2 clear;

3 clc;

4 close all;

5

6 for(i=1:1:3)

7 fprintf('a%d =',i);

8 a(i)=input('');

9 fprintf('\n');

10 end

11 res = roots([a(1) a(2) a(3)])

14

Page 15: μαθηματικα με matlab

Παρατηρούµε δηλαδή ότι το Πρόγραµµα 2 που κάνει ακριβώς την ίδια δουλειά µε το

Πρόγραµµα 1, έχει αισθητά µικρότερο µέγεθος και πολύ πιο απλή υλοποίηση. Οι

λόγοι για τους οποίους συµβαίνει αυτό είναι ότι χρησιµοποιήθηκαν οι εντολές

εισόδου από το πληκτρολόγιο (π.χ. input) και πίνακες ώστε να αποθηκευτούν οι

συντελεστές (βλέπε a(i)). Επίσης δεν επιλύθηκε η δευτεροβάθµια εξίσωση µε τον

κλασσικό τρόπο επίλυσης αλλά µέσω της εντολής roots η οποία είναι µία εντολή που

υπάρχει έτοιµη και επιλύει οποιαδήποτε αλγεβρική εξίσωση (οποιουδήποτε βαθµού)

αρκεί να εισάγουµε τους συντελεστές των όρων της, ξεκινώντας από το συντελεστή

του µεγιστοβάθµιου όρου και καταλήγοντας στον σταθερό όρο της εξίσωσης.

Παρατηρούµε επίσης ότι οποιαδήποτε εντολή έχει τη δυνατότητα εκτύπωσης

αποτελέσµατος στην οθόνη, αρκεί να µην υπάρχει το ελληνικό ερωτηµατικό στο

τέλος της.

Στη συνέχεια, θα µελετήσουµε ένα ακόµα πρόγραµµα το οποίο αντιστοιχεί σε

µεθοδολογία επίλυσης και έχει γραφεί σε Matlab. Θεωρούµε ότι έχουµε ένα γραµµικό

σύστηµα 3Χ3 και θέλουµε να υπολογίσουµε τις τιµές των αγνώστων µε την µέθοδο

των οριζουσών. Το πρόγραµµα που κάνει τους υπολογισµούς αυτούς το ονοµάζουµε

“grammiko1.m” και είναι το ακόλουθο:

Πρόγραµµα 3:

1 % We solve the linear 3X3 system:

2 % a11x + a12y + a13z = a14

3 % a21x + a22y + a23z = a24

4 % a31x + a32y + a33z = a34

5

6 clear;

7 clc;

8 close all;

9

10 for(i=1:1:3)

11 for(j=1:1:4)

12 fprintf('a%d%d=',i,j);

15

Page 16: μαθηματικα με matlab

13 a(i,j)=input('');

14 fprintf('\n');

15 end

16 end

17

18 for(i=1:1:3)

19 for(j=1:1:3)

20 Dxyz1(i,j)=a(i,j);

21 end

22 end

23

24 for(i=1:1:3)

25 for(j=1:1:4)

26 if(j==4)

27 k=1;

28 else

29 k=j;

30 end

31 Dx1(i,k)=a(i,j);

32 end

33 end

34

35 for(i=1:1:3)

36 for(j=1:1:4)

37 if(j==4)

38 k=2;

39 else

40 k=j;

41 end

42 Dy1(i,k)=a(i,j);

16

Page 17: μαθηματικα με matlab

43 end

44 end

45

46 for(i=1:1:3)

47 for(j=1:1:4)

48 if(j==4)

49 k=3;

50 else

51 k=j;

52 end

53 Dz1(i,k)=a(i,j);

54 end

55 end

56

57 Dxyz = det(Dxyz1);

58 Dx = det(Dx1);

59 Dy = det(Dy1);

60 Dz = det(Dz1);

61

62 x = Dx/Dxyz;

63 y = Dy/Dxyz;

64 z = Dz/Dxyz;

65

66 fprintf('x=%.4f\ny=%.4f\nz=%.4f\n',x,y,z);

Το πρόγραµµα αυτό λειτουργεί ως εξής:

• Αρχικά αναγράφεται το τι κάνει το συγκεκριµένο πρόγραµµα µε τη µορφή

σχολίων και άρα και στο help file (γραµµές 1-4).

• Στη συνέχεια χρησιµοποιούνται οι γνωστές εντολές καθαρισµού µνήµης, οθόνης

και παραθύρων σχηµάτων (γραµµές 6-8).

17

Page 18: μαθηματικα με matlab

• Στη συνέχεια εισάγονται στον πίνακα a(i,j) οι τιµές των παραµέτρων µε τον τρόπο

που ορίζονται στις πρώτες 3 γραµµές του προγράµµατος (γραµµές 10-16).

• Κατασκευάζονται οι πίνακες 3Χ3 οι οποιοι θα δώσουν τις ορίζουσες µέσω των

οποίων θα υπολογίσουµε τις τιµές των x,y,z.

• Η εντολή det υπολογίζει την ορίζουσα ενός τετραγωνικού πίνακα ενώ γενικά η

σύνταξη a(i,j) ορίζει τις τιµές των γραµµών και των στηλών ενός πίνακα που τον

ονοµάζουµε a και µπορει να έχει i γραµµές και j στήλες.

Οπως και προηγουµένως, µπορούµε πολύ εύκολα να καταλάβουµε την πολύ

µεγάλη διαφορά στην ευκολία επίλυσης του συστήµατος όταν χρησιµοποιούµε το

Matlab σε σχέση µε κάποια άλλη γλώσσα προγραµµατισµού. Για παράδειγµα, δεν

χρειάζεται να βρούµε τρόπο υπολογισµού της ορίζουσας αφού ήδη αυτό γίνεται

αυτόµατα µε τη χρήση της εντολής det. Επίσης, στην εντολή input δεν χρειάζεται να

ορίσουµε τον τύπο της µεταβλητής (αν δηλαδή θα είναι ρητός, πραγµατικός ή

οποιασδήποτε άλλης µορφής αριθµός).

Είναι φανερό ότι το Πρόγραµµα 3 µπορεί εύκολα να γίνει πιο γενικό και να

µπορεί να επιλύει, µε τη µέθοδο των οριζουσών, οποιασδήποτε τάξης γραµµικά

συστήµατα. Να κατασκευαστεί ο αλγόριθµος και στη συνέχεια να γραφεί ο κώδικας ο

οποίος θα επιλύει γραµµικά συστήµατα ΝΧΝ µε το Ν να µπορεί να το επιλέγει ο

χρήστης του προγράµµατος. Ονοµάστε το πρόγραµµα αυτό grammiko1a.m.

Μέχρι τώρα δείξαµε περιπτώσεις όπου το πρόβληµα λυνόταν µε ένα µόνο

κώδικα χωρίς την αναγκη άλλων, κατασκευασµένων από το χρήστη, υπορουτινών και

συναρτήσεων. Το Matlab µας δίνει τη δυνατότητα, µε πολύ µεγάλη ευκολία να

κατασκευάσουµε συναρτήσεις οι οποίες να ανταλλάσσουν τιµές είτε µε το κυρίως

πρόγραµµα είτε µε άλλες συναρτήσεις.

Ας δούµε λοιπόν τον τρόπο µε τον οποίο λειτουργούν οι συναρτήσεις

(υπορουτίνες) και ποιο είναι το κέρδος για τον προγραµµατιστη στην περιπτωση που

τις χρησιµοποιεί.

18

Page 19: μαθηματικα με matlab

1.6. Πως κατασκευάζονται οι βοηθητικές συναρτήσεις;

Ο τρόπος µε το οποίο κατασκευάζονται οι συναρτήσεις είναι όµοιος µε αυτόν

για τον κανονικό κώδικα-πρόγραµµα. Ετσι κατασκευάζουµε το κανονικό πρόγραµµα

και µέσα από αυτό καλούµε την βοηθητική συνάρτηση. Αυτή, µπορεί είτε να

χρειάζεται κάποιες παραµέτρους εισόδου είτε όχι. Μπορεί επίσης να επιστρέφει

οσωδήποτε µεγάλο αριθµο παραµέτρων, πινάκων ή αποτελεσµάτων αρκεί να έχει

ρυθµιστεί να κάνει αυτή τη δουλεια. Η συνάρτηση αποθηκεύεται στο ίδιο directory

µε το κυρίως πρόγραµµα και µοιάζει µε αυτό, µε τη διαφορά ότι στην πρώτη γραµµή

του χρησιµοποιεί την εντολή function και ακολουθεί το όνοµα της συνάρτησης µε τις

παραµέτρους εισόδου και εξόδου.

Το πρόγραµµα που ακολουθεί είναι ουσιαστικά το ίδιο µε το Πρόγραµµα 3

που επιλύει ένα γραµµικο αλγεβρικό σύστηµα µε τη µέθοδο των οριζουσών. Η

διαφορά εδώ είναι ότι η υπορουτίνα που ζητάει το διάβασµα των τιµών των a11,

a12,… θα είναι µία ξεχωριστή συνάρτηση η οποία απλά θα επιστρέφει τον πίνακα

3Χ4 των συντελεστών του προβλήµατος οποίος θα χρησιµοποιηθεί για τον

υπολογισµό των x, y, z. Υπάρχει επίσης και µία δεύτερη συνάρτηση η οποία λαµβάνει

ως είσοδο τα αποτελέσµατα και τα τυπώνει στην οθόνη. Το κυρίως πρόγραµµα θα το

ονοµάσουµε grammiko2.m, ενω τις δύο συναρτήσεις που θα χρησιµοποιηθούν θα τις

ονοµάσουµε fun1.m και fun2.m. Επειδή, όπως ηδη έχουµε αναφέρει, η κάθε

συνάρτηση είναι σχεδόν ένα κανονικό πρόγραµµα το κυρίως πρόγραµµα είναι το

Πρόγραµµα 4 ενώ οι δύο συναρτήσεις τα Πρόγραµµα 5 και Πρόγραµµα 6 και έχουν

την ακόλουθη µορφή:

Πρόγραµµα 4:

1 %%% a11x + a12y + a13z = a14

2 %%% a21x + a22y + a23z = a24

3 %%% a31x + a32y + a33z = a34

4

5 clear;

6 clc;

7 close all;

19

Page 20: μαθηματικα με matlab

8 li = 3;

9 co = li+1;

10

11 [a]=fun1(li,co);

12

13 for(i=1:1:li)

14 for(j=1:1:co-1)

15 Dxyz1(i,j)=a(i,j);

16 end

17 end

18

19 for(i=1:1:li)

20 for(j=1:1:co)

21 if(j==4)

22 k=1;

23 else

24 k=j;

25 end

26 Dx1(i,k)=a(i,j);

27 end

28 end

29

30 for(i=1:1:li)

31 for(j=1:1:co)

32 if(j==4)

33 k=2;

34 else

35 k=j;

36 end

20

Page 21: μαθηματικα με matlab

37 Dy1(i,k)=a(i,j);

38 end

39 end

40

41 for(i=1:1:li)

42 for(j=1:1:co)

43 if(j==4)

44 k=3;

45 else

46 k=j;

47 end

48 Dz1(i,k)=a(i,j);

49 end

50 end

51

52 fun2(Dxyz1, Dx1, Dy1, Dz1);

Πρόγραµµα 5:

1 function [b]=fun1(lin,col);

2

3 for(i=1:1:lin)

4 for(j=1:1:col)

5 fprintf('a%d%d=',i,j);

6 b(i,j)=input('');

7 fprintf('\n');

8 end

9 end

21

Page 22: μαθηματικα με matlab

Πρόγραµµα 6:

1 function a=fun2(Dxyz2, Dx2, Dy2, Dz2);

2

3 Dxyz = det(Dxyz2);

4 Dx = det(Dx2);

5 Dy = det(Dy2);

6 Dz = det(Dz2);

7

8 x = Dx/Dxyz;

9 y = Dy/Dxyz;

10 z = Dz/Dxyz;

11

12 fprintf('x=%.4f\ny=%.4f\nz=%.4f\n',x,y,z);

Η χρήση των συναρτήσεων αυτών (Προγράµµατα 5 και 6) βοηθάει τον χρήστη

να επεξεργάζεται µικρούς κώδικες τους οποίους µπορεί εύκολα να τους τροποποιήσει

και διορθώσει κατά βούληση µε πολύ µικρές πιθανότητες σφάλµατος. Επίσης, µε τη

χρήση των βοηθητικών συναρτήσεων το κυρίως πρόγραµµα µπορεί να γίνει πολύ

µικρό σε µέγεθος και έτσι να µπορεί ο κάθε ένας, εύκολα να καταλάβει τη λειτουργία

του. Ενα άλλο πλεονέκτηµα της χρήσης των βοηθητικών συναρτήσεων είναι ότι

µπορούν να χρησιµοποιηθούν από άλλα προγράµµατα αρκεί να αντιγραφούν στο

directory που µας ενδιαφέρει. Ο τρόπος µε τον οποίο πραγµατοποιείται η δυνατότητα

χρήσης της βοηθητικής συνάρτησης και από άλλα κύρια προγράµµατα θα εξηγηθεί

παρακάτω.

Οπως ακριβώς ζητήθηκε παραπάνω έτσι και εδώ ζητείται να κατασκευαστεί

ένα πρόγραµµα το οποίο µε χρήση βοηθητικών συναρτήσεων να επιλύει γραµµικό

σύστηµα NXN µε τη µέθοδο των οριζουσών. Το πρόγραµµα αυτό να ονοµαστεί

grammiko2a.m και να κατασκευαστούν όσες βοηθητικές συναρτήσεις απαιτούνται

για τη λειτουργία του.

Αυτό που δείξαµε µέχρι τώρα είναι η µεγάλη ευχέρεια χρήσης που

παρουσιάζει το Matlab σε διάφορα απλά προβλήµατα. Αυτό που θα κάνουµε

22

Page 23: μαθηματικα με matlab

παρακάτω είναι να δείξουµε πώς ακριβώς µπορούµε να χρησιµοποιήσουµε την

υπολογιστική δύναµη της εφαρµογής αυτής για την επίλυση πιο σύνθετων

προβληµάτων που άπτονται του αντικειµένου της αριθµητικής ανάλυσης.

Ετσι, τα προβλήµατα που θα εξεταστούν στη συνέχεια στα πλαίσια των σηµειώσεων

αυτών, είναι:

(1) Επίλυση συστηµάτων γραµµικών εξισώσεων

(2) Αριθµητική εύρεση ριζών µη γραµµικών εξισώσεων

(3) Παρεµβολή

(4) Αριθµητική παραγώγιση

(5) Αριθµητική ολοκλήρωση

23

Page 24: μαθηματικα με matlab

2. Επίλυση Συστηµάτων Γραµµικών Εξισώσεων

2.1. Μέθοδος Gauss

Οπως ήδη γνωρίζουµε η µέθοδος Gauss βασίζεται στη δυνατότητα που έχουµε

στον επαυξηµένο πίνακα ενός γραµµικού αλγεβρικού συστήµατος να κάνουµε

γραµµοπράξεις χωρίς να επηρεάζεται η ζητούµενη λύση του συστήµατος. Η µέθοδος

αυτή, αποσκοπεί στο να µετατρέψει τον επαυξηµένο πίνακα του γραµµικού

αλγεβρικού συστήµατος σε τριγωνικό άνω, ώστε στη συνέχεια µε πίσω

αντικατάσταση να υπολογιστεί η λύση του συστήµατος.

Ο τρόπος µε τον οποίο επιτυγχάνεται η τριγωνοποιηση του επαυξηµένου πίνακα είναι

ο εξής:

έχοντας ως οδηγό στοιχείο το πρώτο της διαγωνίου πολλαπλασιάζουµε µε τον

κατάλληλο συντελεστή έτσι ώστε όταν προστεθεί η πρώτη, πολλαπλασιασµένη µε

τον συντελεστή, γραµµή στην δεύτερη το στοιχείο κάτω από το πρώτο στοιχείο της

διαγωνίου να γίνει µηδενικό. Στη συνέχεια πολλαπλασιάζουµε την πρώτη γραµµή

µε κάποιον άλλο συντελεστή ώστε προστιθέµενη στην τρίτη γραµµή να γίνει

µηδενικό το στοιχείο της πρώτης στήλης. Η διαδικασία αυτή συνεχίζεται µέχρι τη

στιγµή που όλα τα στοιχεία της πρώτης γραµµής κάτω από το πρώτο στοιχείο της

διαγωνίου γίνουν µηδενικά. Ακριβώς όµοια διαδικασία ακολουθείται για το δεύτερο

οδηγό στοιχείο, δηλαδή το δεύτερο στοιχείο της διαγωνίου και ό,τι βρίσκεται κάτω

από αυτό. Η διαδικασία αυτή συνεχίζεται µέχρι το τελευταίο οδηγό στοιχείο,

δηλαδή το προτελευταίο στοιχείο της διαγωνίου αφού κάτω από το τελευταίο

στοιχείο της διαγωνίου δεν υπάρχει κάποιο άλλο.

Ο τρόπος µε τον οποίο θα κατασκευάσουµε το πρόγραµµα αυτό είναι ο εξής:

Αρχικά θα χρησιµοποιήσουµε την fun1.m που κατασκευάσαµε στο

Πρόγραµµα 5. Στη συνέχεια, αφού θα έχουµε στη διάθεση µας τον επαυξηµένο

πίνακα a θα κάνουµε τις κατάλληλες γραµµοπράξεις ώστε να µετατρέψουµε τον

πίνακα σε τριγωνικό άνω. Ο τρόπος µε τον οποίο επιτυγχάνεται η επίλυση γραµµικών

αλγεβρικών συστηµάτων µε τη µέθοδο Gauss παρουσιάζεται στο Πρόγραµµα 7 που

ακολουθεί και θα αποθηκευτεί µε το όνοµα gauss1.m.

24

Page 25: μαθηματικα με matlab

Πρόγραµµα 7:

%%% a11x + a12y + a13z = a14

%%% a21x + a22y + a23z = a24

%%% a31x + a32y + a33z = a34

clear;

clc;

close all;

li = 3;

co = li+1;

[a]=fun1(li,co);

[a]=fun3(li,co,a);

[r]=fun4(li,co,a);

for(j=1:1:li)

fprintf('x%d=%.4f\n',j,r(j));

end

Παρατηρούµε ότι το πρόγραµµα αυτό εκτός από τη συνάρτηση fun1.m

χρησιµοποιεί και τις συναρτήσεις fun3.m και fun4.m οι οποίες κάνουν την

τριγωνοποίηση και την πίσω αντικατάσταση αντίστοιχα. Ο τρόπος µε τον οποίο

λειτουργούν θα εξηγηθεί και θα µελετηθεί στην τάξη. Στα Προγράµµατα 8 και 9 που

ακολουθούν, φαίνονται οι συναρτήσεις fun3.m και fun4.m:

25

Page 26: μαθηματικα με matlab

Πρόγραµµα 8:

function [a]=fun3(lin,col,a);

for(diag=1:1:lin-1)

for(i=diag+1:1:lin)

a_temp=-a(i,diag)/a(diag,diag);

for(k=1:1:col)

a(i,k)=a(i,k)+a(diag,k)*a_temp;

end

end

end

Πρόγραµµα 9:

function [re]=fun4(lin,col,a);

for(i1=lin:-1:1)

sum = 0;

for(c1=i1+1:1:col-1)

sum = sum + a(i1,c1)*re(c1);

end

re(i1)=(a(i1,col)-sum)/a(i1,i1);

end

Προφανώς το πρόγραµµα αυτό θα µπορούσε να γραφτεί και χωρίς τη χρήση

συναρτήσεων. Οµως, στην περίπτωση αυτή θα είχε πολύ µεγαλύτερο µέγεθος και δεν

θα ήταν πολύ εύκολες οι αλλαγές στη δοµη του. Για να αποδειχθεί του λόγου το

αληθές θα επιχειρήσουµε να γράψουµε ένα πρόγραµµα το οποίο θα επιλύει ένα

γραµµικό σύστηµα εξισώσεων µε τη µέθοδο Gauss-Jordan.

26

Page 27: μαθηματικα με matlab

2.2. Μέθοδος Gauss-Jordan

Η µέθοδος αυτή µοιάζει πολύ µε τη µέθοδο Gauss µε τη διαφορά ότι ο στόχος

της είναι να µηδενιστούν όλοι οι όροι του επαυξηµένου πίνακα εκτός από αυτούς της

διαγωνίου. Το κέδρος που έχουµε µε τον τρόπο αυτό είναι ότι απαιτείται ελάχιστη

δουλειά κατά τη διάρκεια της διαδικασίας της πίσω αντικαταστασης για τον

υπολογισµό των τιµών των αγνώστων. Το µειονέκτηµα της µεθόδου είναι ότι

απαιτείται αρκετά µεγαλύτερος αριθµός πράξεων (σχεδόν διπλάσιος) σε σχέση µε τη

µέθοδο Gauss, για να φτάσουµε τον επαυξηµένο πίνακα στη µορφή που πρέπει. Ετσι,

η διαδικασία κατασκευής του προγράµµατος αυτού είναι να χρησιµοποιήσουµε το

κυρίως κοµµάτι του ως έχει (όπως ακριβώς στο πρόγραµµα gauss1.m) και να

αλλάξουµε κάποια κοµµάτια των συναρτήσεων fun3.m και fun4.m που

χρησιµοποιούνται.

Για λόγους οµογενοποιησης των δύο προγραµµατων θα αλλάξουµε τα

ονόµατα των συναρτήσεων fun3.m και fun4.m σε fun3_b.m και fun4_b.m οπότε

πρέπει να γίνουν και οι κατάλληλες αλλαγές στο κυρίως πρόγραµµα το οποίο θα

ονοµάζεται πλέον gauss2.m.

Οι fun3_b.m και fun4_b.m θα έχουν τη µορφή που φαίνεται στα Προγράµµατα 10 και

11 που ακολουθούν

Πρόγραµµα 10:

function [a]=fun3_b(lin,col,a);

for(diag=1:1:lin)

for(i=1:1:lin)

if(i~=diag)

a_temp=-a(i,diag)/a(diag,diag);

for(k=1:1:col)

a(i,k)=a(i,k)+a(diag,k)*a_temp;

end

27

Page 28: μαθηματικα με matlab

end

end

end

Πρόγραµµα 11:

function [re]=fun4_b(lin,col,a);

for(i1=1:1:lin)

re(i1) = a(i1,col)/a(i1,i1);

end

Παρατηρούµε ότι η µετάβαση από τη µία µέθοδο (Gauss) στην άλλη (Gauss-

Jordan) µπορεί να γίνει µε πολύ οµαλό και εύκολο τρόπο στην περίπτωση που έχουµε

χρησιµοποιήσει συναρτήσεις για την περάτωση του προγράµµατος µας. Σε αντίθετη

περίπτωση θα έπρεπε να κάνουµε πολλές αλλαγές στο πρόγραµµα µε πολύ µεγάλο

πάντα κίνδυνο να κάνουµε καποιο λάθος.

2.3. Υπολογισµός οριζουσας πίνακα

Με τη χρήση των µεθόδων Gauss και Gauss-Jordan που µόλις περιγράψαµε

µπορούµε µε απλό τρόπο να υπολογίσουµε την ορίζουσα του πίνακα των

συντελεστών του επαυξηµένου πίνακα. Ο υπολογισµός αυτός βασίζεται στην ιδιότητα

που έχει ένας τετραγωνικός τριγωνικός άνω ή κάτω πίνακας, η ορίζουσα του να

υπολογίζεται ως το γινόµενο των στοιχείων της διαγωνίου του.

Αυτό σηµαίνει ότι από τη στιγµή που έχουµε χρησιµοποιήσει µία από τις δύο

µεθόδους που ήδη έχουµε περιγράψει και ο πίνακας που έχει προκύψει είναι είτε

τριγωνικός κάτω είτε έχει µη µηδενικά µόνο τα στοιχεία της διαγωνίου µπορούµε να

χρησιµοποιήσουµε τα αποτελέσµατα της ώστε να υπολογίσουµε την ορίζουσα.

28

Page 29: μαθηματικα με matlab

Θα πρέπει λοιπόν να κατασκευαστεί µία συνάρτηση η οποία θα κάνει τον

υπολογισµό αυτό και στη συνεχεία θα πρέπει να ενσωµατωθεί µε τον κατάλληλο

τρόπο στο πρόγραµµα. Η διαδικασία αυτή θα εξηγηθεί και θα πραγµατοποιηθεί µε τη

µορφή άσκησης των φοιτητών κατά τη διάρκεια των παραδόσεων του µαθήµατος.

2.4. Υπολογισµός αντίστοφου πίνακα

Ο αντίστροφος ενός πίνακα Α είναι ένα πίνακας Β για τον οποίο θα πρέπει να

ισχύει:

ΑΒ = ΒΑ = Ι

όπου Ι µοναδιαίος πίνακας µε διάσταση όµοια µε αυτή των πινάκων Α και Β. Ας

θεωρήσουµε την περίπτωση που όλοι οι πίνακες που µελετάµε είναι τετραγωνικοί

3Χ3. Τα αποτελέσµατα που θα προκύψουν γενικεύονται πολύ εύκολα και για

οποιασδήποτε µορφής τετραγωνικό πίνακα. Εστω λοιπόν τετραγωνικός πίνακας Α

3Χ3 της µορφής:

⎥⎥⎥

⎢⎢⎢

⎡=

333231

232221

131211

aaaaaaaaa

A

τότε ο πίνακας Β θα πρέπει να είναι της µορφής:

⎥⎥⎥

⎢⎢⎢

⎡=

333231

232221

131211

bbbbbbbbb

B

και θα ισχύει:

29

Page 30: μαθηματικα με matlab

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

100010001

333231

232221

131211

333231

232221

131211

333231

232221

131211

333231

232221

131211

aaaaaaaaa

bbbbbbbbb

bbbbbbbbb

aaaaaaaaa

.

και από το πρώτο κοµµάτι της ισότητας προκύπτει ότι:

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

100010001

333231

232221

131211

333231

232221

131211

bbbbbbbbb

aaaaaaaaa

∆ηλαδή θα µπορούµε να το σπάσουµε στα ακόλουθα τρία γραµµικά συστήµατα µε

τρείς αγνώστους το κάθε ένα:

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

001

31

21

11

333231

232221

131211

bbb

aaaaaaaaa

. ⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

010

32

22

12

333231

232221

131211

bbb

aaaaaaaaa

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

100

33

23

13

333231

232221

131211

bbb

aaaaaaaaa

και επιλύοντας κάθε ένα από τα συστήµατα αυτά υπολογίζουµε τους συντελεστές bij

µε i,j=1..3 και τελικά κατασκευάζουµε τον αντίστροφο πίνακα B.

Γνωρίζοντας τον τρόπο µε τον οποίο επιλύονται τα γραµµικά συστήµατα µε

τις µεθόδους είτε Gauss είτε Gauss-Jordan να κατασκευαστεί ένας αλγόριθµος και να

δηµιουργηθεί ο κατάλληλος κώδικας σε Matlab ο οποίος θα την τιµή του αντιστόφου

πίνακα µε τη µεθοδολογία που περιγράφηκε παραπάνω. Τα προγράµµατα που θα

προκύψουν να ονοµαστούν είτε gauss1a.m είτε gauss2a.m ανάλογα µε τη

µεθοδολογία επίλυσης που θα χρησιµοποιηθεί. Η διαδικασία επίλυσης καθώς και

όποια προβλήµατα παρουσιαστούν κατά τη προσπάθεια δηµιουργίας του αλγορίθµου

θα εξηγηθούν στην τάξη.

30

Page 31: μαθηματικα με matlab

3. Υπολογισµός Ριζών Μη Γραµµικών Αλγεβρικών Εξισώσεων

3.1. Μέθοδοι διαδοχικών δοκιµών

Οι µέθοδοι των διαδοχικών δοκιµών για την εύρεση των λύσεων µη

γραµµικών αλγεβρικών εξισώσεων, βασίζονται στο θεώρηµα του Boltzano. Το οποίο

αναφέρει ότι:

Θεώρηµα Boltzano:

Αν µία συνάρτηση f είναι συνεχής σε ένα κλειστό διάστηµα [a,b] και ισχύει ότι

f(a)f(b)<0 τότε υπάρχει τουλάχιστον ένας πραγµατικός αριθµός ρ µέσα στο

ανοιχτό διάστηµα (a,b) ο οποίος θα είναι ρίζα της εξίσωσης f(x)=0.

Σύµφωνα λοιπόν µε το παραπάνω θεώρηµα, αν θεωρήσουµε µία µη γραµµική

εξίσωση της µορφής:

1)( 5 ++= xxxf

και υπολογίσουµε τα f(-1)=-1 και f(1)=3 διαπιστώνουµε ότι ισχύει f(-1)f(1)<0 το

οποίο µας οδηγεί στο συµπέρασµα ότι η παραπάνω µη γραµµική εξίσωση έχει µία

τουλάχιστον ρίζα στο διάστηµα (-1,1).

Οι µέθοδοι των διαδοχικών δοκιµών λειτουργούν µε τη λογική ότι αφού

υπάρχει µία ρίζα εξίσωσης σε ένα διάστηµα (a,b) τότε πρέπει να µε κάποιο τρόπο να

µειώνεται συνεχώς το εύρος του διαστήµατος γύρω από τη ρίζα έως ότου να γίνει

αρκετά µικρό ώστε να µπορούµε να θεωρούµε ότι έχουµε εντοπίσει τη ρίζα σε ένα

οσοδήποτε µικρό διάστηµα.

Μία από τις πιο συνηθισµένες µεθόδους που χρησιµοποιούµε είναι η µέθοδος

της διχοτόµησης. Η µέθοδος αυτή θα παρουσιαστεί στη συνέχεια, θα κατασκευαστεί

ο αντίστοιχος αλγόριθµος και στη συνέχεια θα γραφεί και ο κώδικας επίλυσης σε

Matlab.

31

Page 32: μαθηματικα με matlab

3.2. Μέθοδος της διχοτόµισης

Οπως γνωρίζουµε, η µέθοδος της διχοτόµισης είναι µία µέθοδος διαδοχικών

δοκιµών για την εύρεση των ριζών µη γραµµικών αλγεβρικών εξισώσεων. Από τη

στιγµη που θα βρεθούν τα δύο σηµεία του διαστήµατος ώστε να ισχύει το θεώρηµα

Boltzano τότε µε τη µέθοδο αυτή, οπωσδήποτε θα προσεγγίσουµε την περιοχή που

βρίσκεται η συγκεκριµένη ρίζα της εξίσωσης.

Ο τρόπος µε τον οποίο εργαζόµαστε για να πραγµατοποιήσουµε τη µέθοδο

της διχοτόµησης είναι ο εξής:

Ελέγχουµε αν η µη γραµµική αλγεβρική εξίσωση τη οποίας θέλουµε να

προσδιορίσουµε τη ρίζα είναι συνεχής στην περιοχή του πεδίου ορισµού που µας

ενδιαφέρει. Στη συνέχεια βρίσκουµε δύο σηµεία, έστω a και b, από το πεδίο

ορισµού της συνεχούς µη γραµµικής συνάρτησης για τα οποία οι τιµές που παίρνει

η f να είναι ετερόσηµες µεταξύ τους (f(a)f(b)<0). Στην περίπτωση αυτή ισχύει το

θεώρηµα Boltzano και άρα µέσα στο συγκεκριµένο διάστηµα θα βρίσκεται η ρίζα

της εξίσωσης.

Στη συνέχεια υπολογίζουµε το µέσο του διαστήµατος (a,b) το οποίο θα είναι

το c=(a+b)/2. Υπολογίζουµε το f(c) και αναλογα µε το πρόσηµο του το νέο

διαστηµα µέσα στο οποίο θα βρίσκεται η ρίζα θα είναι είτε το (a,c) αν f(a)f(c)<0,

είτε το (c,b) αν f(c)f(b)<0. Αφού υπολογιστεί το νέο διάστηµα µέσα στο οποίο θα

ισχύει το θεώρηµα Boltzano η διαδικασία συνεχίζεται για την παγίδευση της ρίζας

σε όλο και µικρότερο διάστηµα. Οταν το διαστηµα παγίδευσης γίνει τόσο µικρό

όσο απαιτείται από το πρόβληµα που λύνουµε τότε θεωρούµε ότι έχουµε

προσεγίσει τη λύση ικανοποιητικά και άρα σταµατάει η διαδικασία.

Ο τρόπος µε τον οποίο κατασκευάζουµε τον αλγόριθµο για τη µέθοδο της

διχοτόµησης είναι ακριβώς η διδικασία που περιγράφηκε παραπάνω. ∆ηλαδή:

(α) σε µία µη γραµµική συνεχή αλγεβρική συνάρτηση υπολογίζουµε τα δύο άκρα

του διαστήµατος για το οποίο ισχύει το θεώρηµα Boltzano.

(β) υπολογίζουµε το κέντρο του διαστήµατος αυτού

(γ) υπολογίζουµε µε ποίο από τα δύο προηγούµενα άκρα η συνάρτηση

παρουσιάζει αντίθετο πρόσηµο και µε το άκρο αυτό δηµιουργείται το νέο

διάστηµα Boltzano.

32

Page 33: μαθηματικα με matlab

(δ) η παραπάνω διαδικασία επαναλαµβάνεται µέχρι τη στιγµη που το

διχοτοµηµένο διάστηµα γίνει τόσο µικρό όσο απαιτείται από το πρόβληµα που

λύνουµε.

Το πρόγραµµα σε Matlab που πραγµατοποιεί τον αλγόριθµο αυτό θα το ονοµάσουµε

dixotomish1.m και είναι το ακόλουθο και είναι αυτό που φαίνεται στο Πρόγραµµα 12

που ακολουθεί:

Πρόγραµµα 12:

clear;

clc;

close all;

epsilon = 1e-6;

a = -1;

b = 1;

while(abs(b-a)>epsilon)

fa = fx(a);

fb = fx(b);

c=(a+b)/2;

fc = fx(c);

if(fa*fc<0)

b=c;

else

a=c;

end

end

fprintf('a=%.7f\nb=%.7f\nf(a)=%.7f\nf(b)=%.7f\n',a,b,fa,fb);

33

Page 34: μαθηματικα με matlab

Όπως παρατηρούµε το πρόγραµµα αυτό χρησιµοποιεί και µία βοηθητική

συνάρτηση την fx. Η συνάρτηση αυτή υπολογίζει την τιµή της f(x) στο συγκεκριµένο

σηµείο που µας ενδιαφέρει. Η συνάρτηση αυτή έχει τη µορφή που φαίνεται στο

ακόλουθο πρόγραµµα και µας δίνει τη δυνατότητα να µπορούµε να µεταβάλλουµε τη

συνάρτηση ανάλογα µε το πρόβληµα που έχουµε να αντιµετωπίσουµε:

Πρόγραµµα 13:

function [f]=fx(x);

f = x^5+x+1;

Οπως ήδη έχει αναφερθεί η χρήση συναρτήσεων στο Matlab είναι µία

συνηθισµένη όσο και επιβεβληµένη τεχνική για την καλύτερη και σωστότερη

λειτουργία των προγραµµάτων που κατασκευάζουµε. Προφανώς το πρόγραµµα αυτο

θα µπορούσε να αποτελείται από τουλάχιστον µία ακόµα συνάρτηση αλλά ο τρόπος

µε τον οποίο µπορεί να επιτευχθεί αυτό θα συζητηθεί στην τάξη.

3.3. Επαναληπτικές µέθοδοι

Οπως γνωρίζουµε εκτός από τις µεθόδους διαδοχικών δοκιµών, για την

εύρεση των ριζών µη γραµµικών αλγεβρικών εξισώσεων χρησιµοποιούµε και µια

άλλη οµάδα µεθόδων, τις επαναληπτικές. Οι µέθοδοι αυτοί ξεκινούν από ένα

συγκεκριµένο σηµείο a του πεδίου ορισµού και κινούνται προς την ρίζα χωρις να

χρησιµοποιούν το θεώρηµα Boltzano αλλά, κάποιες άλλες τεχνικές σύγκλισης. Το

µεγάλο πλεονέκτηµα των µεθόδων αυτών είναι ότι συγκλίνουν στη ρίζα µε πολύ

ταχύτερους ρυθµούς απ’ότι οι µέθοδοι διαδοχικών δοκιµών αλλά το µεγάλο τους

µειονέκτηµα είναι ότι δεν “καταφέρνουν” να συγκλίνουν πάντα. Για το λόγο αυτό, η

συνηθέστερη χρήση τους είναι µετά τη χρήση των µεθόδων διαδοχικών δοκιµών

ώστε και σίγουρη σύγκλιση να µπορούµε να πετύχουµε (Μέθοδοι ∆ιαδοχικών

∆οκιµών) αλλά και ταχύτερη διαδικασία (Επαναληπτικές Μέθοδοι). Ένας σηµαντικός

34

Page 35: μαθηματικα με matlab

εκπρόσωπος των µεθόδων διαδοχικών δοκιµών είναι η µέθοδος Newton-Raphson η

οποία περιγράφεται στη συνέχεια.

3.4. Μέθοδος Newton Raphson

Μια από τις πιο συχνά χρησιµοποιούµενες επαναληπτικές µεθόδους είναι η

µέθοδος Newton - Raphson η οποία βασίζεται στο ότι αν µία προσέγγιση x είναι

αρκετά κοντά στη ρίζα ρ µιας συνάρτησης f(x) (µε f(ρ)=0), τότε η συνάρτηση f

µπορεί να αναπτυχθεί σε σειρά Taylor γύρω από την τιµή ρ. Οπότε, µέχρι τους όρους

πρώτης τάξης του αναπτύγµατος θα ισχύει

...))(()()( +−′+= xxfxff ρρ

∆εδοµένου ότι το ανάπτυγµα αυτό έχει επιλεγεί ώστε f(ρ) = 0 και θεωρώντας

ότι οι όροι ανώτερης τάξης δεν παίζουν σηµαντικό ρόλο στην τιµή της f, µπορούµε να

υπολογίσουµε τη ρίζα ρ, επιλύοντας την προηγούµενη εξίσωση. Ετσι, προκύπτει ότι η

τιµή της ρίζας ρ, θα δίνεται από τη σχέση,

...)()(

+′

−=xfxfxρ

Η ιδέα της µεθόδου είναι να χρησιµοποιηθεί η εξίσωση αυτή,

αντικαθιστώντας στη θέση του τυχαίου x τη n-οστή προσέγγιση xn, και στη θέση της

ρίζας ρ (που υπολογίζεται προσεγγιστικά) την επόµενη προσέγγιση xn+1,

παραλείποντας τους όρους ανώτερης τάξης. Ετσι, προκύπτει η αναδροµική σχέση της

µεθόδου Newton-Raphson η οποία έχει τη µορφή:

)()(

1n

nnn xf

xfxx′

−=+

35

Page 36: μαθηματικα με matlab

Με τη χρήση της αναδροµικής αυτής εξίσωσης λειτουργεί η µέθοδος Newton-

Raphson.

Γνωρίζοντας την εξίσωση που επιλύει το πρόβληµα µας µπορούµε να

προχωρήσουµε στο επόµενο βήµα που είναι η δηµιουργία του αλγορίθµου. Εδώ

πρέπει να θυµηθούµε ότι η χρήση επαναληπτικών µεθόδων δεν οδηγεί οπωσδήποτε

σε σύγκλιση οπότε πρέπει οπωσδήποτε µέσα στο πρόγραµµα µας να συµπεριλάβουµε

και κάποιες γραµµές οι οποίες δεν θα αφήνουν τον αλγόριθµο να επαναλαµβάνεται

επ’άπειρο στην περίπτωση δεν έχει καταφέρει να επιτευχθεί η σύγκλιση. Το

πρόγραµµα σε Matlab το οποίο πραγµατοποιεί τον αλγόριθµο Newton-Raphson, θα

ονοµάσουµε nr1.m και είναι το ακόλουθο:

Πρόγραµµα 14:

clear;

clc;

close all;

diaf=1;

dx=1e-2;

epsilon=1e-4;

a=1;

while(diaf>epsilon)

fa = fx(a);

dfa = dfx(a,dx);

anew = a - fa/dfa;

diaf = abs(anew-a);

a = anew;

end

fprintf('a=%.7f\nf(a)=%.7f\n',a,fa);

36

Page 37: μαθηματικα με matlab

Παρατηρούµε ότι το πρόγραµµα αυτό χρησιµοποιεί δύο εξωτερικές

συναρτήσεις: την fx και την dfx. Η µία (η fx) είναι αυτή που υπολογίσαµε στο

προηγούµενο πρόγραµµα. Η δεύτερη (η dfx) υπολογίζει την παράγωγο της fx στη

θέση x. Να θυµίσουµε εδώ ότι η παράγωγος µίας συνάρτησης f(x) σε ένα σηµείο x

δίνεται από την εξίσωση:

dxxfdxxfxf )()()( −+

=′

µε το dx να τείνει στο µηδέν.

Αρα, αυτό που έπρεπε να κατασκευαστεί είναι µία συνάρτηση η οποία να

υπολογίζει την παράγωγο στο συγκεκριµένο σηµείο. Η συνάρτηση σε Matlab που

υπολογίζει την παράγωγο έχει τη µορφή που περιγράφεται από το ακόλουθο

πρόγραµµα:

Πρόγραµµα 15:

function [dfun]=dfx(x,dx);

f1 = fx(x+dx);

f2 = fx(x);

dfun = (f1-f2)/dx;

Παρατηρούµε ότι η συνάρτηση αυτή που υπολογίζει την παράγωγο

χρησιµοποιεί τη συνάρτηση που είχαµε φτιάξει προηγουµένως την fx. ∆ηλαδή και το

κυρίως πρόγραµµα (nr1.m) και η συνάρτηση του (dfx) χρησιµοποιούν την ίδια

συνάρτηση (fx).

Στη συνάρτηση dfx που έχει κατασκευαστεί για τη διαφόριση παρατηρούµε

ότι εκτός από το σηµείο που µας ενδιαφέρει να διαφορίσουµε µας ενδιαφέρει και το

dx. Αυτό ουσιαστικά προκύπτει από τον ορισµό της παραγώγου ότι στον

παρανοµαστή πρέπει να έχουµε µία µικρή παράµετρο ώστε να θεωρούµε ότι, χωρίς

µεγάλο σφάλµα, ο ορισµός αυτός αποτελεί την παράγωγο της f σε ένα συγκεκριµένο

37

Page 38: μαθηματικα με matlab

σηµείο x. Θα µπορούσε κάποιος να ισχυρισθεί ότι αφού µας ενδιαφέρει να έχουµε το

dx->0 θα έπρεπε να του δώσουµε µία πάρα πολύ µικρή τιµή ώστε να µην

δηµιουργηθεί κανένα πρόβληµα. Στην περίπτωση των υπολογιστικών µεθόδων όµως

η κατάλληλη επιλογή της “πολύ µικρής τιµής” δεν είναι πάντα εύκολη υπόθεση. Ο

αριθµός που θα χρησιµοποιήσουµε πρέπει να είναι µικρός αλλά σε σχέση µε τις

υπόλοιπες παραµέτρους του συστήµατος. Ενας αριθµός πολύ µικρότερος από τις

υπόλοιπες παραµέτρους του συστήµατος ουσιαστικά δηµιουργεί δυσλειτουργίες στο

σύστηµα µας και είναι πιθανόν, κάποιες φορές να προκύψουν λανθασµένα

αποτελέσµατα. Περισσότερα στοιχεία σχετικά µε το πως επιλέγουµε τις µικρές ή τις

µεγάλες παραµέτρους σε ένα πρόβληµα θα αναφερθούν στην τάξη κατά τη διάρκεια

των µαθηµάτων.

Σχετικά µε τον τρόπο που δηµιουργήθηκε το συγκεκριµένο πρόγραµµα πρέπει

να υπενθυµίσουµε κάτι που έχει αναφερθεί αρκετές φορές µέχρι τώρα, ότι, το Matlab

δεν είναι απλώς άλλη µία γλώσσα αλλά ένα σύστηµα προγραµµατισµού. ∆ηλαδή, δεν

αποτελείται µόνο από εντολές που εκτελούν κάποιες συγκεκριµένες βασικές

διαδικασίες, αλλά περιέχει και έτοιµες συναρτήσεις που εκτελούν πιο σύνθετες

πράξεις. Μία από αυτές είναι η διαφόριση. Το Matlab έχει έτοιµη την εντολή-

συνάρτηση η οποία χρησιµοποιείται στη διαφόριση. Ο τρόπος µε τον οποίο θα

χρησιµοποιηθεί θα εξεταστεί και θα µελετηθεί κατά τη διάρκεια των παραδόσεων του

µαθήµατος.

38

Page 39: μαθηματικα με matlab

4. Παρεµβολή

4.1. Πολυωνυµική Παρεµβολή

Η παρεµβολή είναι µια διαδικασία κατά την οποία γνωρίζουµε έναν αριθµό

γνωστών πειραµατικών δεδοµένων και θέλουµε να κατασκευάσουµε µία συνάρτηση

y(x) η οποία να διέρχεται ακριβώς από όλα τα ζεύγη σηµείων (xi,yi). Πρέπει δηλαδή

να ικανοποιείται η συνθήκη:

0)( =−=∆ iii xyyy

χωρίς να µας ενδιαφέρει η συµπεριφορά της συνάρτησης y(x) σε κάθε ενδιάµεσο

σηµείο µεταξύ δύο διαδοχικών σηµείων (xi,yi) και (xi+1,yi+1).

Υπάρχουν αρκετές µέθοδοι παρεµβολής και ένας από αυτούς είναι η

πολυωνυµική. Ο λόγος για τον οποίο ονοµάζεται έτσι η µέθοδος είναι ότι οι

συναρτήσεις µε τις οποίες πραγµατοποιείται η παρεµβολή είναι πολυωνυµικές

συναρτήσεις y(x). Η απλούστερη πολυωνυµική παρεµβολή είναι η γραµµική

παρεµβολή και βασίζεται στη γνωστή πρόταση της γεωµετρίας ότι από δύο

διαφορετικά σηµεία του επιπέδου διέρχεται µία και µόνο µία ευθεία.

Ετσι, αν έχουµε δοσµένα δύο σηµεία του επιπέδου (x1,y1) και (x2,y2), µε

τότε η ευθεία που διέρχεται από αυτά έχει κλίση 21 xx ≠

12

12

xxyy

−−=λ

και εξίσωση

)()()( 112

12111 xx

xxyy

yxxyxy −−−

+=−+= λ

39

Page 40: μαθηματικα με matlab

Η αµέσως επόµενη γενίκευση αφορά ένα πολυώνυµο δεύτερου βαθµού

(παραβολή), το οποίο διέρχεται από 3 σηµεία για το οποίο φυσικά ισχύει ότι:

Από τρία δεδοµένα σηµεία του επιπέδου (xi,yi), i=1,2,3, µε 321 xxx ≠≠ διέρχεται η

γραφική παράσταση ενός και µόνο ενός πολυωνύµου y(x) 2ου βαθµού.

Η απόδειξη της παραπάνω πρότασης έχει αποδειχθεί στα πλάισια προπτυχιακών

µαθηµάτων και για το λόγο αυτό δεν αποτελεί αντικείµενο του παρόντος

µεταπτυχιακού µαθήµατος.

Η παραπάνω πρόταση µπορεί να γενικευτεί. Ετσι, για περισσότερα από 3

σηµεία θα ισχύει:

Από Ν δεδοµένα σηµεία του επιπέδου (xi,yi), i=1,2,...,Ν, µε Nxxx ≠≠≠ ...21 διέρχεται η

γραφική παράσταση ενός και µόνο ενός πολυωνύµου y(x) (Ν-1)-οστού βαθµού.

Αρα, αυτό που µας ενδιαφέρει στην περίπτωση πολυωνυµικής παρεµβολής είναι να

κατασκευάσουµε ένα πολυώνυµο το οποίο θα έχει βαθµό κατά ένα µικρότερο από τον

αριθµό των σηµείων απο τα οποία πρέπει να περάσει η γραφική του παράσταση.

Η διαδικασία υπολογισµού του κατάλληλου πολυωνύµου είναι η εξής:

(α) έστω οτι µας ενδιαφέρει το πολυώνυµο να περνάει από 3 σηµεία τα οποία

είναι τα (x1,y1), (x2,y2) και (x3,y3).

(β) προφανώς το πολυώνυµο που µας ενδιαφέρει, σύµφωνα µε ό,τι αναφέρθηκε

προηγουµένως, θα είναι δευτέρου βαθµού. Αρα θα έχει τη µορφή:

f(x)=ax2+bx+c. Το κάθε σηµείο (xi,yi) θα πρέπει να ικανοποιεί την εξίσωση

αυτή.

(γ) άρα δηµιουργείται το ακόλουθο σύστηµα εξισώσεων:

40

Page 41: μαθηματικα με matlab

y1=ax12+bx1+c

y2=ax22+bx2+c

y3=ax32+bx3+c

το σύστηµα αυτό είναι ένα γραµµικό σύστηµα 3Χ3 ως προς τους συντελεστές a, b, c

και µέσω των γνωστών µεθόδων επίλυσης γραµµικών συστηµάτων υπολογίζουµε

τους αγνώστους.

Το πρόγραµµα λοιπόν που πρέπει να κατασκευαστεί θα πρέπει αρχικά να

ρωτάει τον χρήστη για τον αριθµό των πειραµατικών δεδοµένων που θα εισαχθούν.

Στη συνέχεια, να διαβάζει από το πληκτρολόγιο τον κατάλληλο αριθµό σηµείων και

να κατασκευάζει τους αντίστοιχους επαυξηµένους πίνακες. Από τη στιγµή που έχουν

κατασκευαστεί οι επαυξηµένοι πίνακες το πρόβληµα έγκειται στην επίλυση του

γραµµικού συστήµατος, το οποίο είναι µία διαδικασία η οποία έχει ήδη συζητηθεί και

διδαχθεί.

Ετσι λοιπόν το πρόγραµµα που θα φτιάχνει τον επαυξηµένο πίνακα για τον

υπολογισµό των συντελεστών του πολυωνύµου θα το ονοµάσουµε parembolh1.m και

θα έχει την ακόλουθη µορφή:

Πρόγραµµα 16: clear;

clc;

close all;

fprintf('arithmos shmeiwn=');

numb1 = input('');

for(n1=1:1:numb1)

fprintf('x%d=',n1);

x(n1) = input('');

fprintf('y%d=',n1);

y(n1) = input('');

end

for(m=1:1:numb1+1)

41

Page 42: μαθηματικα με matlab

for(k=1:1:numb1)

if(m<=numb1)

matr(k,m) = x(k)^(numb1-m);

else

matr(k,m) = y(k);

end

end

end

Παρατηρούµε ότι, το πρόγραµµα αυτό χωρίζεται σε δύο τµήµατα. Στο πρώτο

ο χρήστης εισάγει µέσω του πληκτρολογίου τις τιµές των ζευγών που τον

ενδιαφέρουν και στο δεύτερο ο υπολογιστής φτιάχνει τον επαυξηµένο πίνακα µέσω

του οποίου θα υπολογιστούν οι συντελεστές του πολυωνύµου παρεµβολής.

Οταν κατασκευαστεί ο επαυξηµένος πίνακας, πρέπει να επιλύθεί το σύστηµα.

Μέχρι στιγµής έχουµε δείξει προγράµµατα και µεθόδους που επιλύουν γραµµικά

αλγεβρικά συστήµατα. Οπότε θα πρέπει οι φοιτητές να µετατρέψουν ένα τέτοιο

πρόγραµµα, σε συνάρτηση του Matlab και να το ενσωµατώσουν στο παραπάνω

πρόγραµµα. Ζητείται λοιπόν η κατασκευή ενός προγράµµατος σε Matlab το οποίο θα

έχει ως είσοδο τα σηµεία από τα οποία πρέπει να περάσει η πολυωνυµική

παρεµβολική συνάρτηση και ως έξοδο τους συντελεστές του ζητούµενου

πολυωνύµου.

Επίσης, όπως έχουµε ήδη αναφέρει, η λειτουργία του Matlab γίνεται πολύ πιο

απλή και κατά τον προγραµµατισµό του υπάρχει µικρότερη περίπτωση εµφάνισης

λαθών, στην περίπτωση που χρησιµοποιούµε συναρτήσεις. Ετσι, κατά τη διάρκεια

του µαθήµατος οι φοιτητές θα πρέπει να µετατρέψουν το παραπάνω πρόγραµµα ώστε

να κάνει την ίδια δουλειά αλλά µε τη χρήση συναρτήσεων.

42

Page 43: μαθηματικα με matlab

5. Αριθµητική Παραγώγιση

5.1. Μέθοδοι Αριθµητικής Παραγώγισης

Όταν θέλουµε να παραγωγίσουµε µία συνάρτηση µπορούµε να

χρησιµοποιήσουµε τον τύπο ορισµού της παραγώγου που έχει τη µορφή:

dxxfdxxfxf )()()( −+

=′

µε το dx να τείνει στο µηδέν.

Οπως όµως έχει αναφερθεί και παραπάνω η επιλογή του dx και γενικά των

διαµερίσεων, είναι µία διαδικασία η οποία απαιτεί αρκετή προσοχή λόγω των

αριθµητικών σφαλµάτων που µπορεί να δηµιουργήσει κατά τη διάρκεια των

υπολογισµών.

Για του λόγου το αληθές θα θεωρήσουµε µία απλή πολυωνυµική συνάρτηση

την οποία θα την παραγωγίσουµε σε ένα σηµείο χρησιµοποιώντας διαφορετικές τιµές

του dx. Στη συνέχεια το αποτέλεσµα που θα παρουσιάσουµε θα είναι µία γραφική

παράσταση η οποία θα δείχνει το σχετικό σφάλµα υπολογισµού της παραγώγου ως

συνάρτηση του dx. Οπως θα δούµε τα σφάλµατα τα οποία θα προκύπτουν δεν

µειώνονται µε τη µείωση της τιµής του dx.

Το πρόγραµµα αυτό θα το ονοµάσουµε parag1.m και θα έχει τη µορφή του

Προγράµµατος 17 που ακολουθεί:

Πρόγραµµα 17: %% function f(x)=6x^10

%% first derivative f'(x)=60x^9

clc;

clear all;

close all;

i=1;

43

Page 44: μαθηματικα με matlab

x=8;

for(dxn=0:-0.1:-15)

dx = 10^dxn;

dxplot(i) = dx;

fx = 6*x^10;

fxdx= 6*(x+dx)^10;

dfx=60*x^9;

df = (fxdx-fx)/dx;

sf(i) = abs(df-dfx)/dfx;

i=i+1;

end

loglog(dxplot,sf);

xlabel('dx');

pause(0);

Η γραφική παράσταση που προκύπτει από το Πρόγραµµα 17 είναι ίσως µη

αναµενόµενη για κάποιον που δεν σκέφτεται µε τη λογική του ηλεκτρονικού

υπολογιστή και των υπολογιστικών µεθόδων και έχει τη µορφή που φαίνεται στο

σχήµα που ακολουθεί.

Παρατηρούµε δηλαδή ότι η τιµή του dx που δίνει τα πιο σωστά αποτελέσµατα

είναι µεταξύ του 10-8 και του 10-7. Παρατηρούµε δηλαδή ότι αν µειώσουµε περαιτέρω

την τιµή του dx τα αποτελέσµατα που θα προκύψουν δεν θα είναι περισσότερο

αξιόπιστα. Ο λόγος που για τιµές µικρότερες από 10-8 δεν παρατηρούµε βελτίωση του

αποτελέσµατος αλλά αντίθετα σηµαντικά µεγαλύτερο σφάλµα είναι ότι κάνοντας

πράξεις µε τόσο µικρούς αριθµούς παίζει πολύ σηµαντικό ρόλο η ακρίβεια την οποία

µπορεί να επιτύχει ο υπολογιστής αλλά και η εφαρµογή που χρησιµοποιούµε. Άρα για

την επιλογή του βήµατος διαµέρισης είναι πολύ σηµαντικό να γνωρίζουµε ότι δεν

µπορούµε να αυξάνουµε την ακρίβεια επ΄άπειρο µειώνοντας το εύρος των

διαµερίσεων αλλά ότι υπάρχει, σε κάθε εφαρµογή αριθµητικής επίλυσης ένα κάτω

όριο. Επίσης πρέπει να γνωρίζουµε ότι η επίδραση του σφάλµατος εξαρτάται και από

την εφαρµογή που µας ενδιαφέρει. ∆ηλαδή ένα σφάλµα της τάξης του 2-5% για

44

Page 45: μαθηματικα με matlab

πολλές εφαρµογές είναι αµελητέο οπότε δεν χρειάζεται να χρησιµοποιήσουµε πολύ

µικρά dx και να κάνουµε πιο χρονοβόρα την εφαρµογή µας. Σε άλλες όµως

περιπτώσεις το σφάλµα υπολογισµού της παραγώγου παίζει πολύ σηµαντικό ρόλο

οπότε πρέπει να υπολογιστεί µε τη µικρότερη δυνατή ακρίβεια. Πολλές φορές

µάλιστα ακόµα και η µέγιστη ακρίβεια, όπως φαίνεται από το παραπάνω σχήµα,

υπολογισµού της παραγώγου µε τη χρήση του ορισµού δεν είναι αρκετή. Οπότε

χρησιµοποιούµε άλλες µεθόδους υπολογισµού. Μία από αυτές είναι ο υπολογισµός

µε πολυωνυµική παρεµβολή που θα δούµε στη συνέχεια.

5.2. Υπολογισµός Παραγώγου µε χρήση Συνάρτησης Πολυωνυµικής

Παρεµβολής

Οπως δείξαµε και προηγουµένως η επιλογή του κατάλληλου dx είναι µία πολύ

σηµαντική παράµετρος κατά την επίλυση ενός προβλήµατος που περιλαµβάνει και

45

Page 46: μαθηματικα με matlab

την εύρεση της τιµής µιας παραγώγου. ∆εν είναι όµως πάντα εύκολο να επιλέξουµε

το dx να έχει ακριβώς την τιµή που επιθυµούµε. Ο λόγος είναι ότι πολλές φορές δεν

γνωρίζουµε τον µαθηµατικό τύπο της συνάρτησης που πρέπει να παραγωγίσουµε

αλλά κάποια σηµεία της. Από τα σηµεία αυτά θα πρέπει να ανακατασκευάσουµε τη

συνάρτηση και να βρούµε τη µορφή της. Πρέπει δηλαδή να χρησιµοποιήσουµε

κάποια από τις µεθόδους παρεµβολής για να υπολογίσουµε την µαθηµατική έκφραση

της συνάρτησης. Ενας από τους τρόπους αυτούς είναι η πολυονυµική παρεµβολή την

οποία µελετήσαµε στο προηγούµενο κεφάλαιο.

Αυτό που θα επιχηρήσουµε να κάνουµε στο παρόν κεφάλαιο είναι να βρούµε

µία µεθοδολογία, την οποία στη συνέχεια θα µετατρέψουµε σε αλγόριθµο, η οποία να

µας επιτρέπει να υπολογίζουµε µε την µεγαλύτερη δυνατή ακρίβεια την παράγωγο

µίας συνάρτησης σε κάποιο καθορισµένο σηµείο, όταν απο τη συνάρτηση

γνωρίζουµε µόνο κάποια σηµεία της.

Ο τρόπος µε τον οποίο θα δουλέψουµε είναι ο εξής:

(α) από τα σηµεία της συνάρτησης τα οποία µας είναι γνωστά χρησιµοποιούµε

την πολυωνυµική µέθοδο παρεµβολής για να υπολογίσουµε τη συνάρτηση

που θα χρησιµοποιήσουµε.

(β) υπολογίζουµε την παράγωγο µε βάση τον ορισµό µε το dx το οποίο µας δίνει

µεγαλύτερη ακρίβεια.

Ο κώδικας που διεκπεραιώνει προγραµµατιστικά τη διαδικασία που αναφέρθηκε

παραπάνω θα ονοµάστεί diff1.m και θα έχει τη µορφή του Προγράµµατος 18 που

ακολουθεί:

Πρόγραµµα 18: clc;

clear;

close all;

fprintf('Paragwgos sto x=');

sdiff = input('');

fprintf('dx=');

dx = input('');

46

Page 47: μαθηματικα με matlab

fprintf('Arithmos shmeiwn ths f(x)=');

numb1 = input('');

for(i=1:1:numb1)

fprintf('x%d=',i);

xy(i,1)=input('');

fprintf('y%d=',i);

xy(i,2)=input('');

end

for(m=1:1:numb1+1)

for(k=1:1:numb1)

if(m<=numb1)

matr(k,m) = xy(k,1)^(numb1-m);

else

matr(k,m) = xy(k,2);

end

end

end

[xyz]=grammiko3(numb1,matr);

[res] = diff2(xyz,sdiff,dx);

fprintf('x=%.10f\ndx=%.15f\nf(%.10f)=%.8f\nf`(%.10f)=%.8f\n',...

sdiff,dx,sdiff,fun5(xyz,sdiff),sdiff,res);

Παρατηρούµε ότι το πρόγραµµα αυτό χρησιµοποιεί δύο συναρτήσεις

κατασκευασµένες από τον προγραµµατιστή. Οι συναρτήσεις αυτές είναι η

grammiko3.m και diff2.m οι οποίες φαίνονται στα Προγράµµατα 19 και 20 αντίστοιχα.

Πρόγραµµα 19: function [xyz]=grammiko3(numb,a)

for(i=1:1:numb)

for(j=1:1:numb)

Dxyz(i,j,numb+1)=a(i,j);

47

Page 48: μαθηματικα με matlab

end

end

for(det_number=1:1:numb)

for(i=1:1:numb)

for(j=1:1:numb+1)

if(j==numb+1)

k=det_number;

else

k=j;

end

Dxyz(i,k,det_number)=a(i,j);

end

end

end

for(root_number_1=1:1:numb+1)

Detxyz(root_number_1) = det(Dxyz(:,:,root_number_1));

end

for(root_number_2=1:1:numb)

xyz(root_number_2) = Detxyz(root_number_2)/Detxyz(numb+1);

end

Πρόγραµµα 20: function [dres] = diff2(xyz,x,dx);

dres = (fun5(xyz,x+dx) - fun5(xyz,x))/dx;

Οµως το Πρόγραµµα 20 (diff2.m) καλεί µία ακόµα συνάρτηση, την fun5.m η οποία

φαίνεται στο Πρόγραµµα 21 που ακολουθεί.

48

Page 49: μαθηματικα με matlab

Πρόγραµµα 21: function [fx] = fun5(xyz,x);

len1 = length(xyz);

fx = 0;

for(i=1:1:len1)

fx = fx + xyz(i)*x^(len1-i);

end

Παρατηρούµε ότι το πρόγραµµα αυτό χωρίστηκε σε 3 µέρη:

(α) στο πρώτο µέρος το πρόγραµµα ζητάει από το χρήστη να του πει τα σηµεία τα

οποία πρέπει να κάνει την παραγώγιση και µε ποιά ακρίβεια. Επίσης ζητάει

από το χρήστη να εισάγει τα σηµεία της συνάρτησης που έχει στη διάθεση

του.

(β) στο δεύτερο µέρος κατασκευάζει τον επαυξηµένο πίνακα που απαιτείται ώστε

να προσδιορίσει το πολυωνυµο παρεµβολής που θα απεικονίζει τη συνάρτηση

που µας ενδιαφέρει.

(γ) στο τρίτο µερος, αφού έχει προσδιοριστεί το πολυώνυµο, υπολογίζεται η

παράγωγος του στο σηµείο που θέλει ο χρήστης µε την ακρίβεια (dx) που έχει

ζητήσει.

Είναι φανερό ότι για την επίλυση του προβλήµατος έχουµε υποθέσει ότι τα

σηµεία αυτά είναι κοµµάτια ενός πολυωνύµου το οποίο και υπολογίζεται. Στην πράξη

όµως δεν είναι σίγουρο οτι ψάχνουµε για ένα πολυώνυµο. Οπότε το πρόγραµµα αυτό

µπορεί να τροποποιηθεί µε τέτοιο τρόπο ώστε να µην ψάχνει µόνο το πολυώνυµο

παρεµβολής αλλά ότι απαιτείται από το πρόβληµα που θέλουµε να λύσουµε.

Το πρόγραµµα αυτό επειδή αποτελείται από αρκετές συναρτήσεις

κατασκευασµένες από τον προγραµµατιστή µπορεί να δεχθεί πολλές

τροποποποιήσεις µε αρκετά απλό τρόπο. ∆ιάφορες τέτοιες περιπτώσεις θα

συζητηθούν και στην τάξη κατά τη διάρκεια των µαθηµάτων.

49

Page 50: μαθηματικα με matlab

6. Αριθµητική Ολοκλήρωση

6.1. Μέθοδοι Αριθµητικής Ολοκλήρωσης

Είναι γνωστό ότι η αναλυτική παραγώγιση µιας συνάρτησης είναι µία

διαδικασία, αρκετές φορές, επίπονη, η οποία όµως πάντα θα δώσει αποτέλεσµα. ∆εν

συµβαίνει όµως το ίδιο και στην περίπτωση της ολοκλήρωσης. Πολύ συχνά η

ολοκλήρωση µίας συνάρτησης είναι µία διαδικασία η οποία δεν είνα δυνατόν να

δώσει αναλυτικό αποτέλεσµα. Για το λόγο αυτό έχουν αναπτυχθεί αρκετές

αριθµητικές µέθοδοι υπολογισµού των ολοκληρωµάτων. Οι ανάλυση των τρόπων

αυτών δεν εµπίπτει στο αντικείµενο του παρόντος µαθήµατος όµως µπορύµε να

µελετήσουµε τον τρόπο λειτουργίας κάποιων εξ αυτών. Ας θεωρήσουµε το ακόλουθο

ορισµένο ολοκλήρωµα:

∫=b

adxxfI )(

Η τιµή του ολοκληρώµατος ισούται µε το εµβαδό που περικλείεται από την

καµπύλη της συνάρτησης f(x) θεωρώντας ως θετικές τιµές αυτές που βρίσκονται

πάνω από τον άξονα x’x και αρνητικές αυτές που βρίσκονται από κάτω.

Υπάρχουν αρκετές µέθοδοι για τον αριθµητικό υπολογισµό των

ολοκληρωµάτων η πιο απλή µεθοδολογία είναι αυτή του παραλληλόγραµµου, η οποία

απαιτεί και τον λιγότερο χρόνο για υπολογισµούς, αλλά δίνει αρκετά µεγάλο σφάλµα.

Πολύ συχνά, για τη βελτίωση της ακρίβειας των αποτελεσµάτων χρησιµοποιείται είετ

η µέθοδος του τραπεζίου, είτε η µέθοδος Simpson. Οι δύο τελευταίες µέθοδοι δίνουν

αποτελέσµατα µε πολύ µικρότερο σφάλµα αλλά απαιτούν και αρκετά περισσότερο

χρόνο επεξεργασίας. Η πρώτη µέθοδος που θα εξετάσουµε είναι η ολοκλήρωση µε τη

µέθοδο του παραλληλογράµµου η οποία αναλύεται στη συνέχεια.

50

Page 51: μαθηματικα με matlab

6.2. Ολοκλήρωση µε τον Κανόνα του Παραλληλογράµµου

Σύµφωνα µε τον κανόνα αυτό θεωρούµε ότι κάτω από τη συνάρτηση f(x)

υπάρχει ένα ορθογώνιο παραλληλόγραµµο το οποίο έχει βάση που ξεκινάει από το a

και καταλήγει στο b (όρια ολοκλήρωσης) και ύψος ίσο µε το f(a). Το αποτέλεσµα του

ολοκληρώµατος θεωρούµε ότι προσεγγίζεται ικανοποιητικά από το εµβαδό του

παραλληλογράµµου.

Καταλαβαίνουµε εύκολα ότι η επάνω πλευρά του παραλληλογράµου, αντί να

ακολουθεί την συνάρτηση είναι απλά παράλληλη στον οριζόντιο άξονα. Οπότε το

σφάλµα που προκύπτει, σε αρκετές περιπτώσεις, είναι τεράστιο. Για να µειώσουµε το

σφάλµα κατά το δυνατόν περισσότερο µπορύµε να µη θεωρήσουµε ως βάση του

παραλληλογράµου το διάστηµα από a έως b αλλά να το χωρίσουµε σε µικρότερα

παραλληλόγραµµα να υπολογίζουµε τα εµβαδά τους και στο τέλος να τα

προσθέτουµε. Αν προχωρήσουµε βήµα-βήµα τη διαδικασία αυτή θα αντιληφθούµε

ότι ο καλύτερος τρόπος για τον αριθµητικό υπολογισµό των ολοκληρωµάτων είναι

προσθέτουµε εµβαδά παραλληλογράµων που έχουν το ελάχιστο δυνατό πλάτος

βάσης. Αυτό το ονοµάζουµε dx.

Στο σηµείο αυτό προκύπτει το ερώτηµα: πότε µπορούµε να έχουµε

οσωδήποτε µικρό dx; Μόνο όταν γνωρίζουµε τη συνάρτηση που θέλουµε να

ολοκληρώσουµε και υπάρχει αυτή η δυνατότητα από τον υπολογιστή και την

εφαρµογή που χρησιµοποιούµε.

Άρα λοιπόν, ο υπολογισµός του ολοκληρώµατος µπορεί να χωριστεί σε δύο

µεγάλες κατηγορίες συναρτήσεων, αυτές που γνωρίζουµε ακριβώς τη µορφή της

συνάρτησης που θέλουµε να ολοκληρώσουµε και αυτές που γνωρίζουµε κάποια

σηµεία και πρέπει να δηµιουργήσουµε τις κατάλληλες συναρτήσεις παρεµβολής ώστε

να τις ολοκληρώσουµε. Και οι δύο διαδικασίες καταλήγουν στην ολοκλήρωση

συνάρτησης που γνωρίζουµε την µορφή της, είτε απευθείας είτε µέσω κάποια

συνάρτησης παρεµβολής.

Στη συνέχεια, θα θεωρήσουµε ότι η συνάρτηση είναι γνωστή και απλά πρέπει

να την ολοκληρώσουµε µε τη µέθοδο του παραλληλογράµµου.

Εστω ότι µας ενδιαφέρει ο υπολογισµός του ολοκληρώµατος:

51

Page 52: μαθηματικα με matlab

∫=b

adxxfI )(

Χωρίζουµε την απόσταση [a,b] σε µικρά διαστήµατα dx. Σε κάθε ένα από τα

διαστήµατα αυτά θεωρούµε ότι το πλάτος της f(x) παραµένει σταθερό (ισχύει;).

Εποµένως θεωρούµε ότι f(a)≅f(a+dx) και άρα το εµβαδό που περικλείει η γραφική

παράσταση είναι dxf(a) στο αµέσως επόµενο βήµα θα είναι dxf(a+dx) στη συνέχεια

dxf(a+2dx) κ.ο.κ. Αθροίζοντας τα εµβαδά αυτά σε όλο το διάστηµα [a,b], ουσιαστικά

υπολογίζεται το εµβαδό που περικλύει η γραφική παράσταση της f(x) στο

συγκεκριµένο διάστηµα. Το Πρόγραµµα 22 που ακολουθεί υπολογίζει µε τη µέθοδο

του παραλληλογράµµου την τιµή του ζητούµενου ολοκληρώµατος:

Πρόγραµµα 22:

% Integral Numerical Quadrature

% int(f(x))[a,b]

close all;

clear all;

clc;

fprintf('a=');

a = input('');

fprintf('\nb=');

b = input('');

fprintf('\ndx=');

dx = input('');

sum = 0;

for(x=a:dx:b)

sum = sum + fx(x)*dx;

52

Page 53: μαθηματικα με matlab

end

fprintf('\nsum=%.4f\n',sum);

Παρατηρούµε ότι στο πρόγραµµα αυτό περιέχεται η συνάρτηση fx την οποία είχαµε

κατασκευάσει για να περιέχει την συνάρτηση που θα ολοκληρώσουµε. Οταν

ενεργοποιήσουµε το πρόγραµµα ανάλογα µε την τιµή του dx θα δίνει και διαφορετική

ακρίβεια. Οπως θα δούµε παρακάτω η ακρίβεια αυτή δεν είναι δυνατόν να αυξάνει

συνέχεια και όπως και στην περίπτωση της παραγώγου υπάρχει ένα σηµείο

κορεσµού.

Η διαδικασία υπολογισµού του ολοκληρώµατος µε τη µέθοδο του

παραλληλογράµµου περιέχει ένα σφάλµα ήδη από τη στιγµή του ορισµού της

µεθόδου. Θεωρήσαµε δηλαδή ότι η τιµή του f(x) δεν µεταβάλλεται καθόλου µε το x

στο κάθε µικρό χωρικό διάστηµα dx που έχουµε ορίσει για τον συνολικό υπολογισµό

του ολοκληρώµατος. Το γεγονός αυτό από µόνο του δηµιουργεί ένα σφάλµα στον

υπολογισµό. Για να µειώσουµε το σφάλµα αυτό χρησιµοποιούµε τη µέθοδο του

τραπεζίου.

6.3. Ολοκλήρωση µε τον Κανόνα του Τραπεζίου

Οπως έχει αναφερθεί και παραπάνω ο κανόνας του τραπεζίου για τον

υπολογισµό των ολοκληρωµάτων δίνει αρκετά καλύτερα αποτελέσµατα από αυτά

που υπολογίζονται µε τον κανόνα του παραλληλογράµµου αλλά απαιτεί περισσότερο

χρόνο επεξεργασίας. Η µέθοδος στηρίζεται στην προσέγγιση ότι η µεταβολή της f(x)

από το σηµείο a στο a+dx είναι γραµµική. Προφανώς και η προσέγγιση αυτή

δηµιουργεί κάποιο σφάλµα αλλά, αποδεικνύεται ότι είναι πολύ µικρότερο από αυτό

της µεθόδου του παραλληλογράµµου (σχεδόν µία τάξη µεγέθους) και έχει πολύ

µεγαλύτερα περιθώρια βελτίωσης σε σχέση µε την προηγούµενη µέθοδο µε τη

µείωση του dx.

Στην περίπτωση που µας ενδιαφέρει η επίλυση του ολοκληρώµατος που

αναφέρθηκε στην προηγούµενη σελίδα θεωρούµε ότι το πλάτος f(a)≠f(a+dx),

53

Page 54: μαθηματικα με matlab

f(a+dx)≠f(a+2dx), f(a+dx)≠f(a+3dx) κ.ο.κ. για όλα τα dx του διαστήµατος [a,b] που

ολοκληρώνουµε τη συνάρτηση. Ετσι λοιπόν ο υπολογισµός του κάθε στοιχειώδους

εµβαδού θα υπολογιστεί από την τιµή του εµβαδού του κάθε ενός στοιχειώδους

τραπεζίου που θα δηµιουργείται. Ετσι για το διάστηµα από a έως a+dx το

στοιχειώδες εµβαδό που θα υπολογίζεται θα είναι (f(a)+f(a+dx))dx/2 στο αµέσως

επόµενο διάστηµα θα είναι (f(a+dx)+f(a+2dx))dx/2 κ.ο.κ. Η διαδικασία αυτή

προσοµοιώνεται αριθµητικά µέσω του Προγράµµατος 23 που ακολουθεί:

Πρόγραµµα 23:

% Integral Trapezoidal Rule

% int(f(x))[a,b]

close all;

clear all;

clc;

fprintf('a=');

a = input('');

fprintf('\nb=');

b = input('');

fprintf('\ndx=');

dx = input('');

sum = 0;

for(x=a:dx:b)

sum = sum + (fx(x)+fx(x+dx))*dx/2;

end

fprintf('\nsum=%.4f\n',sum);

54

Page 55: μαθηματικα με matlab

Παρατηρούµε ότι το Πρόγραµµα 23 διαφέρει ελάχιστα από το Πρόγραµµα 22

το οποίο µοντελοποιούσε τον κανόνα του παραλληλογράµµου για τον υπολογισµό

ολοκληρωµάτων. Η µοναδική διαφορά είναι στον τρόπο που υπολογίζονται τα

στοιχειώδη εµβαδά. Γενικά ο υπολογισµός και η επιλογή µεθόδου ολοκλήρωσης

γίνεται πάντα και µε βάση τη συνάρτηση που πρέπει να ολοκληρώσουµε. Αν δεν

παρουσιάζει µεγάλες και απότοµες αυξοµειώσεις τότε δεν υπάρχει λόγος να µην

χρησιµοποιηθεί η µέθοδος του παραλληλογράµµου η οποία είναι και αρκετά

ταχύτερη. Αντίθετα όταν η συνάρτηση προς ολοκλήρωση είναι πιο σύνθετη τότε είναι

επιβεβληµένο να χρησιµοποιηθεί µία πιο ακριβής µέθοδος υπολογισµού όπως είναι η

µέθοδος του τραπεζίου.

Όλη η µελέτη που έγινε µέχρι αυτό το σηµείο, αφορούσε περιπτώσεις στις

οποίες η µαθηµατική έκφραση της προς ολοκλήρωση συνάρτησης ήταν γνωστή. Τι

γίνεται όµως στην περίπτωση που δεν γνωρίζουµε τον τύπο της συνάρτησης αλλά

απλά κάποια σηµεία της; Στην περίπτωση αυτή πρέπει να χρησιµοποιήσουµε κάποια

µέθοδο παρεµβολής, να υπολογίσουµε προσεγγιστικά τη συνάρτηση και στη συνέχεια

να την ολοκληρώσουµε µε κάποια από τις γνωστές µεθόδους.

6.4. Ολοκλήρωση Συνάρτησης Παρεµβολής

Στην περίπτωση λοιπόν, που γνωρίζουµε µόνο µερικά σηµεία της συνάρτησης

πρέπει να χρησιµοποιήσουµε κάποια µέθοδο παρεµβολής ώστε να υπολογίσουµε τον

µαθηµατικό τύπο της. Στη συνέχεια θα αθροίσουµε όλα τα παραλληλόγραµµα ή τα

τραπέζια που προκύπτουν µε το dx που µας ενδιαφέρει και θα έχουµε υπολογίσει την

τιµή του ολοκληρώµατος. Το Πρόγραµµα 24 που ακολουθεί κάνει τη διαδικασία αυτή

και υπολογίζει την τιµή ενός ολοκληρώµατος µε τη µέθοδο του ορθογωνίου

παραλληλογράµµου. Θα το ονοµάσουµε int1.m και θα έχει την ακόλουθη µορφή:

Πρόγραµµα 24: clc;

clear;

close all;

55

Page 56: μαθηματικα με matlab

fprintf('a=');

aint = input('');

fprintf('b=');

bint = input('');

fprintf('dx=');

dx = input('');

fprintf('Arithmos shmeiwn ths f(x)=');

numb1 = input('');

for(i=1:1:numb1)

fprintf('x%d=',i);

xy(i,1)=input('');

fprintf('y%d=',i);

xy(i,2)=input('');

end

for(m=1:1:numb1+1)

for(k=1:1:numb1)

if(m<=numb1)

matr(k,m) = xy(k,1)^(numb1-m);

else

matr(k,m) = xy(k,2);

end

end

end

[xyz]=grammiko3(numb1,matr);

[res] = int2(xyz,aint,bint,dx);

fprintf('a=%.3f\nb=%.3f\ndx=%.15f\nsum(%.3f,%.3f)=%.8f\n',...

aint,bint,dx,aint,bint,res);

Οι συναρτήσεις που χρησιµοποιεί για να λειτουργήσει το πρόγραµµα είναι η

grammiko3.m και η int2.m. Η πρώτη από αυτές έχει ήδη αναλυθεί και εξηγηθεί

56

Page 57: μαθηματικα με matlab

(Πρόγραµµα 19) ενώ η δεύτερη έχει τη µορφή που φαίνεται στο Πρόγραµµα 25 που

ακολουθεί:

Πρόγραµµα 25: function [res] = int2(xyz,aint,bint,dx);

numb_dx = ceil(bint-aint)/dx;

dx = ceil(bint-aint)/numb_dx;

res = 0;

for(x=aint:dx:bint)

res = res + fun5(xyz,x)*dx;

end

Παρατηρούµε ότι και αυτή η συνάρτηση “ζητάει” την fun5.m η οποία έχει εξηγηθεί

και αναλυθεί σε προηγούµενο κεφάλαιο.

Σύµφωνα µε τα όσα είπαµε µέχρι στιγµής όσο µικρότερο είναι το dx τόσο

καλύτερη είναι η ακρίβεια µε την οποία προσεγγίζεται το ολοκλήρωµα. Η απάντηση

είναι ναι θεωρητικά αλλά οχι πρακτικά. Ο λόγος είναι απλός και συµπίπτει µε ότι

εξηγήσαµε όταν αναφερόµασταν στην παραγώγιση. Οτι δηλαδή θεωρητικά όταν το

dx τείνει στο µηδεν το αποτελέσµα θα έχει και τη µεγαλύτερη ακρίβεια αλλά επειδή

οι υπολογιστές έχουν κάποια πεπερασµένη ακρίβεια υπολογισµών από κάποια τιµή

του dx και κάτω τα αποτελέσµατα τα οποία δίνουν είναι λανθασµένα, η καλύτερα

περιέχουν µεγάλο σφάλµα.

Πρέπει λοιπόν να υπολογίζουµε το dx ούτως ώστε να παίρνουµε το

σωστότερο αποτέλεσµα αλλά έχοντας πλέον στο µυαλό µας ότι το dx ορίζει µία

επαναληπτική διαδικασία. Οσο µικρότερο είναι το βήµα που χρησιµοποιούµε τόσο

περισσότερος χρόνος χρειάζεται. Ο ελεγχος του χρόνου που απαιτείται είναι, σε

µερικές εφαρµογές πολύ σηµαντική παράµετρος του προβλήµατος που θέλουµε να

επιλύσουµε. Αν δηλαδή κάποιο πρόβληµα απαιτεί την επίλυση πολλών

ολοκληρωµάτων τότε µπορεί ο χρονός που θα απαιτείται να είναι τεράστιος. Στις

περιπτώσεις αυτές κάνουµε µία µελέτη σχετικά µε το ποιό είναι το µέγιστο σφάλµα

που µπορούµε να εισάγουµε στους υπολογισµούς µας ως συνάρτηση του χρόνου που

απαιτεί ο υπολογιστής για τους αντίστοιχους υπολογισµούς.

57

Page 58: μαθηματικα με matlab

Ο τρόπος µε τον οποίο υπολογίζουµε το σφάλµα το οποίο προκύπτει στον

υπολογισµό του ολοκληρώµατος είναι αντίστοιχος µε τη διαδικασία που

ακολουθήσαµε και στην περίπτωση της παραγώγου. ∆ηλαδή, θα επιλέξουµε µία

συνάρτηση της οποίας το ολοκλήρωµα µπορεί εύκολα να προσδιοριστεί και στη

συνέχεια θα το υπολογίσουµε µε αριθµητική µέθοδο. Το αποτέλεσµα που θα

προκύψει θα πρέπει να µπορέι να µας δώσει το σχετικό σφάλµα. Το πρόγραµµα αυτό

θα ονοµάζεται int3.m και θα έχει τη µορφή του Προγράµµατος 26 που ακολουθεί:

Πρόγραµµα 26: clc;

clear;

close all;

icount=1;

aint = 0;

bint = 2;

for(dxn=0:-0.5:-7)

dx = 10^dxn

dxpl(icount) = dx;

res = 0;

for(x=aint:dx:bint)

res = res + (x^6)*dx;

end

result1(icount) = res;

result2(icount) = (bint^7-aint^7)/7;

result3(icount) = abs(result1(icount)-

result2(icount))/result2(icount);

icount = icount + 1;

end

loglog(dxpl,result3);

Η εκτέλεση του Προγράµµατος 26 απαιτεί αρκετό χρόνο υπολογισµού. Ο

λόγος είναι ότι, όπως είπαµε παραπάνω, για να υπολογιστεί το ολοκλήρωµα

ακολουθείται προσθετική διαδικασία (προστίθενται µεταξύ τους τα εµβαδά των

ορθογώνιων παραλληλογράµων που υπολογίζονται) οπότε, όσο µικρότερο είναι το

58

Page 59: μαθηματικα με matlab

βήµα (dx) τόσο πιο πολύς χρόνος απαιτείται. Βέβαια όσο πιο µικρή είναι η διαµέριση

του χωρίου που µας ενδιαφέρει να υπολογίσουµε το εµβαδό του τόσο πιο µεγάλη

ακρίβεια υπολογισµών θα έχουµε. Αυτό ισχύει συνέχεια όσο µειώνουµε το dx;

Η απάντηση στο ερώτηµα αυτό είναι αντίστοιχη µε αυτή που δόθηκε στην

περίπτωση της παραγώγου. Οτι δηλαδή θεωρητικά, όσο το dx τείνει στο µηδέν τόσο

το αποτέλεσµα µας είναι πιο αξιόπιστο. Στην πράξη όµως κάτι τέτοιο δεν ισχύει λόγω

του ότι τα σφάλµατα στρογγυλοποίησης τα οποία κάνει είτε ο υπολογιστής είτε η

εφαρµογή που χρησιµοποιείται προσδίδουν στον υπολογισµό σφάλµα πολύ

µεγαλύτερο από αυτό που προκαλείται από την τιµή του dx.

Στο γράφηµα που ακολουθεί έχει σχεδιαστεί το σχετικό σφάλµα υπολογισµού

ως συνάρτηση του dx όπως προκύπτει από το Πρόγραµµα 26.

Όπως µπορούµε να δούµε το σχετικό σφάλµα (κατακόρυφος άξονας)

µειώνεται συνέχεια µε τη µείωση του dx (οριζόντιος άξονας) αλλά πλησιάζοντας στην

τιµή 10-7 παρουσιάζει κορεσµό. Αν συνεχίζαµε την καµπύλη και για τιµές µικρότερες

59

Page 60: μαθηματικα με matlab

του 10-7 θα βλέπαµε µία συµπεριφορά ανάλογη µε αυτή που είχαµε δεί στην

περίπτωση της παραγώγου.

Στην περίπτωση του ολοκληρώµατος παίζει πολύ σπουδαίο ρόλο η σωστή

επιλογή ακρίβειας. Ο λόγος είναι ότι ο υπολογισµός ενός ολοκληρώµατος µε τον

υπολογιστή µπορεί να διαρκέσει από ένα δευτερόλεπτο έως µία µέρα. Οπότε η

ακρίβεια η οποία απαιτείται για την επίλυση του κάθε προβλήµατος είναι µία πολύ

σηµαντική παράµετρος για την επιλογή του dx.

60

Page 61: μαθηματικα με matlab

Βιβλιογραφία

1. “Αριθµητική Ανάλυση”, Γ.Σ. Παπαγεωργίου και Χ.Γ. Τσίτουρας, Εκδόσεις

Συµεών, Αθήνα 2000.

2. “Numerical Methods Using Matlab”, G. Lindfield and J. Penny, Prentice Hall,

2000.

3. “Mathematical Explorations with Matlab”, K. Chen, P. Giblin and A. Irving,

Cambridge University Press, 1999.

4. “Εισαγωγή στην Αριθµητική Ανάλυση”, Γ.∆. Ακρίβης και Β.Α. ∆ουγαλής,

Πανεπιστηµιακές Εκδόσεις Κρήτης, Ηράκλειο 1997.

5. “Αριθµητικές Μέθοδοι και Προγράµµατα για Μαθηµατικούς Υπολογισµούς”,

G.E. Forsythe, M.A. Malcolm and C.B. Moler, µετάφραση Γ.∆. Ακρίβης και

Β.Α. ∆ουγαλής, Πανεπιστηµιακές Εκδόσεις Κρήτης, Ηράκλειο 2000.

6. “Numerical Mathematics”, A. Quarteroni, R. Sacco and F. Saleri, Springer,

1991.

7. “Numerical Mathematics and Computing”, W. Cheney and D. Kincaid,

Thomson Brooks/Cole, 2004.

8. “Αριθµητική Ανάλυση”, Μ.Ν. Βραχάτης, Ελληνικά Γράµµατα, Αθήνα 2002.

9. “Numerical Analysis”, R.L. Burden and J.D. Faires, Thomson Brooks/Cole,

U.S.A. ISBN 0-534-38216-9, 2001

61