Efarmosmena Mathimatka Kai Arithmitikes Methodoi

39
ΕΦΑΡΜΟΣΜΕΝΑ ΜΑΘΗΜΑΤΙΚΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΕΣ ΜΕΘΟ∆ΟΙ ΜΕ ΧΡΗΣΗ ΤΟΥ MATLAB Ε.Ε. ΝΙΣΤΑΖΑΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΣΤΑΤΙΣΤΙΚΗΣ ΚΑΙ ΑΝΑΛΟΓΙΣΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ ΣΑΜΟΣ 2005 1

description

maths

Transcript of Efarmosmena Mathimatka Kai Arithmitikes Methodoi

ΕΦΑΡΜΟΣΜΕΝΑ ΜΑΘΗΜΑΤΙΚΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΕΣ ΜΕΘΟ∆ΟΙ ΜΕ ΧΡΗΣΗ

ΤΟΥ MATLAB

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΣΤΑΤΙΣΤΙΚΗΣ ΚΑΙ ΑΝΑΛΟΓΙΣΤΙΚΗΣ

ΕΠΙΣΤΗΜΗΣ

ΣΑΜΟΣ 2005

1

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

Πρόλογος 3

1. Γιατί χρησιµοποιούµε το Matlab; 4

1.1. Τι είναι το Matlab; 4

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

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

1.4. Το πρώτο πρόγραµµα στο Matlab 7

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

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

2.1. Μέθοδος Gauss 15

2.2. Μέθοδος Gauss_Jordan 17

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

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

3. Αριθµητική εύρεση ριζών µη γραµµικών αλγεβρικών εξισώσεων 20

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

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

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

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

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

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

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

5.1. Παραγώγιση µε τη χρήση του ορισµού 29

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

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

6.1. Ολοκλήρωση µε χρήση του ορισµού 34

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

2

Πρόλογος

Οι σηµειώσεις αυτές αποτελούν ένα µέρος των σηµειώσεων του µαθήµατος της αριθµητικής ανάλυσης που θα διδαχθεί στο µεταπτυχιακό αυτό τµήµα. Στο µέρος αυτό έχει γίνει µία προσπάθεια να εξοικιωθούν οι φοιτητές µε το µαθηµατικό εργαλείο το οποίο ονοµάζεται Matlab. Πρέπει να τονιστεί εδώ πως δεν έχουµε τη φιλοδοξία µέσα από αυτές τις σηµειώσεις να θεωρούµε ότι κάποιος µπορεί να µάθει το πρόγραµµα αυτό. Ευελπιστούµε όµως ότι θα δώσουµε µία ώθηση σε αυτούς που ενδιαφέρονται να ασχοληθούν και να προσπαθήσουν να ανακαλύψουν τους τρόπους µε τους οποίους θα κάνουν την δουλειά τους πιο εύκολη.

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

Η προσπάθεια που έχει γίνει µε τη συγγραφή του φυλλαδίου αυτού και τις παραδόσεις του µαθήµατος στην τάξη είναι προς την κατεύθυνση της απόδειξης οτι η χρήση υπολογιστικών µεθόδων και γενικότερα όλη η επιστήµη που ονοµάζεται “Computational Analysis” έχει δηµιουργηθεί για να βοηθήσει όσους πρέπει να λύσουν κάποια προβλήµατα µαθηµατικής φύσεως και δεν µπορούν να το κανουν µε χρήση αναλυτικών µεθόδων.

Στις σελίδες που ακολουθούν πιστεύουµε ότι δίνουµε το έναυσµα στους φοιτητές να ασχοληθούν µε αυτόν τον νέο κόσµο που ανοίγεται µπροστά τους και λέγεται Matlab. Οµως για την πλήρη κατανόηση των εννοιών που υπάρχουν µέσα στο φυλλάδιο αυτό και την επίλυση όλων των πιθανών αποριών που δηµιουργούνται διαβάζοντας το, είναι απαραίτητη η παρακολούθηση του µαθήµατος. Κατα τη διάρκεια των µαθηµάτων θα γίνει προσπάθεια ώστε να επιλυθεί όσο το δυνατόν µεγαλύτερος αριθµός αποριών και προβληµάτων που παρουσιάζονται κατά τη διάρκεια του προγραµµατισµού σε γλώσσα Matlab. Για το λόγο αυτό, εκτός από τις ερωτήσεις που υπάρχουν ήδη µέσα στο φυλλάδιο αυτό των σηµειώσεων, θα δίνονται από τον διδάσκοντα εργασίες που θα πρέπει να παραδίδονται µέσα σε συγκεκριµένα χρονικά πλάισια. Οι εργασίες αυτές θα βοηθούν στην καλυτερη κατανόηση των προβληµάτων που µελετόνται στις σηµειώσεις αυτές και θα µετρούν και στον τελικό βαθµό του µαθήµατος.

Ο διδάσκοντας θα βρίσκεται στη διάθεση των φοιτητών τις µέρες που θα γίνεται το µάθηµα, στην αίθουσα διδασκαλίας ή στο γραφείο του τις ώρες που δεν θα γίνεται µάθηµα, ενώ τις υπόλοιπες µέρες οι ενδιαφερόµενοι φοιτητές θα µπορούν να επικοινωνούν µαζί του µέσω e-mail.

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

[email protected]

3

1. Γιατί χρησιµοποιούµε το Matlab; 1.1 Τι είναι το Matlab; Το Matlab είναι ένα «υπολογιστικό εργαλείο» µέσω του οποίου µπορεί να εκτελεστεί µεγάλος αριθµός υπολογισµών µε τη χρήση ελαχίστων εντολών. Αυτό επιτυγχάνεται µε τη χρήση εντολών-συναρτήσεων οι οποίες είτε βρίσκονται ήδη αποθηκευµένες στη µνήµη του υπολογιστή είτε κατασκευάζονται από τον ίδιο τον χρήστη ανάλογα µε το πρόβληµα που τον ενδιαφέρει να επιλύσει.

Οι δυνατότητες που µας δίνει η εφαρµογή αυτή είναι τεράστιες. Μας επιτρέπει να χρησιµοποιήσουµε τις έτοιµες ρουτίνες του και σε περιπτωση που καµία από αυτές δεν επαρκούν για να επιλύσουµε το πρόβληµα που µας ενδιαφέρει µας «βοηθάει» να κατασκευάσουµε τους δικούς µας αλγόριθµους-συναρτήσεις που απαιτούνται.

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

(1) το help και

(2) το lookfor.

Οπως αναφέρθηκε παραπάνω το 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.

4

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

(α) στην περίπτωση που χρησιµοποιούµε την εφαρµογή Matlab και όχι κάποια βασική γλώσσα προγραµµατισµου (π.χ. C/C++) µπορούµε να υπολογίσουµε την απόλυτη τιµή όλων των στοιχείων ενός πίνακα, έστω Χ, χωρίς να χρειάζεται να κατασκευάσουµε ολόκληρο πρόγραµµα µε τους αντίστοιχους βρόχους κλπ.

(β) παρατηρούµε ότι για την περίπτωση µιγαδικών αριθµών, π.χ. Χ=α+iβ, αντιστοιχεί στο abs(X)=sqrt(α^2+β^2) χωρίς να χρειάζεται να γράψουµε ούτε µία γραµµή προγράµµατος όπως θα κάναµε µε κάποια άλλη γλώσσα προγραµµατισµού.

(γ) στην τελευταια γραµµή της απάντησης του 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 για να µάθουµε τον τρόπο που συντάσσεται.

Το Matlab δηλαδή έχει έναν πολύ άµεσο τρόπο να βοηθάει τον χρήστη να χρησιµοποιήσει τις εντολές-συναρτήσεις που απαιτούνται για την περάτωση του προγράµµατος που κατασκευάζει.

Καταγράφοντας τις δύο εντολές του Matlab παραπάνω (help και lookfor) αναφέρθηκε η φράση “Command Window”. Οµως τι ακριβώς είναι αυτό το “παράθυρο εντολών”;

5

1.2 Τι είναι το Command Window και πώς δουλεύει το Matlab; Για µπορούµε να δουλέψουµε την εφαρµογή Matlab θα πρέπει να την έχουµε εγκαταστήσει στον υπολογιστή µας. Ο τρόπος εγκατάστασης είναι απλός και απαιτεί διαδικασία αντίστοιχη µε αυτή οποιασδήποτε εφαρµογής που θέλουµε να βάλουµε βάλουµε στον υπολογιστή µας.

Αφού επιλέξουµε τα components που µας ενδιαφέρουν, αφήνουµε το πρόγραµµα να κάνει εγκατάσταση. Μετά από αυτή τη διαδικασία µας ζητείται επανεκίνηση του υπολογιστή και µόλις συµβεί αυτό στο desktop θα υπάρχει ενα εικονίδιο που θα ονοµάζεται Matlab x,y όπου x,y το version number του προγράµµατος. Επιλέγουµε το εικονίδιο αυτό και στη συνέχεια η εφαρµογή ξεκινάει ανοίγοντας µία οθόνη η οποία ονοµάζεται Command Window.

Η οθόνη αυτή είναι η βασική του Matlab και σε αυτήν µπορούµε να χρησιµοποιήσουµε οποιαδήποτε εντολή-συνάρτηση η οποία υπάρχει στο πρόγραµµα. Οι εντολές που µπορούµε να χρησιµοποιήσουµε είναι είτε αυτές που είναι έτοιµες από την αρχή της λειτουργίας του προγράµµατος είτε, αυτές που έχουµε κατασκευάσει µόνοι µας. Επίσης µπορούµε να δηµιουργήσουµε ένα πρόγραµµα το οποίο θα αποτελείται από µια σειρά από εντολές και µπορεί να δίνει αποτελέσµατα όµως σε αυτή την περίπτωση πρέπει να ακολουθήσουµε µία άλλη διδικασία η οποία απαιτεί τη χρήση του Editor.

1.3 Πως γράφουµε προγράµµατα στο Matlab; Από το Commad Window γράφουµε την εντολή edit. Η εντολή αυτή µας µεταφέρει σε ένα παράθυρο, το οποίο δεν είναι τίποτα άλλο παρά ένας Editor ο οποίος έχει κατασκευαστεί ειδικά για το Matlab. Στον Editor αυτόν οτιδήποτε γραφτεί µπορεί να αποθηκευτεί σε ένα συγκεκριµένο σηµείο µέσα στο directory του Matlab. Αν η ακολουθία των εντολών που έχουν χρησιµοποιηθεί βγάζει σωστό, από πλευράς προγραµµατισµού, αποτέλεσµα τότε το πρόγραµµα θα τρέχει και θα δίνει αποτελέσµατα. Ο τρόπος µε τον οποίο τρέχει ένα πρόγραµµα στο Μatlab είναι αυτός που αναφέρθηκε στο προηγούµε νο κεφάλαιο. ∆ηλαδή, στο Command Window, βρίσκουµε το directory µέσα στο οποίο βρίσκεται η εντολή ή το πρόγραµµα που µας ενδιαφέρει και απλά γράφουµε το όνοµα του. Αν έχουµε ήδη αρχίσει να γράφουµε κάποιο πρόγραµµα και είτε το έχουµε αφήσει στη µέση είτε θέλουµε να διορθώσουµε κάτι, τότε απλά γράφουµε:

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

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

» cd «ονοµα sub-directory»

6

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

» cd ..

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

1.4 Το πρώτο πρόγραµµα στο Matlab; Οπως αναφέρθηκε στο προηγούµενο κεφάλαιο, στο Matlab µπορούµε να φτιάξουµε προγράµµατα τα οποία χρησιµοποιούν µία σειρά από εντολές-συναρτήσεις και δίνουν τα αποτελέµατα που θέλουµε να υπολογίσουµε. Ο τρόπος µε τον οποίο γίνεται αυτό είναι µέσω του Editor. Ανοίγοντας τον Editor µε τον τρόπο που περιγράψαµε, το πρώτο πράγµα που κάνουµε είναι να αποθηκεύσουµε το πρόγραµµα µας µε κάποιο όνοµα, στο directory που µας ενδιαφέρει. Για το λόγο αυτό επιλέγουµε πρώτα,

File

και µετά

Save as..

Μετα την επιλογή αυτή θα πρέπει να επιλέξουµε το directory µέσα στο οποίο θα τοποθετήσουµε το πρόγραµµα µας καθώς και το όνοµα του. Με το όνοµα αυτό πλέον θα το καλούµε κάθε φορά που θέλουµε να το θέσουµε σε λειτουργία, ενώ βέβαια έχουµε βάλει το Command Window στο κατάλληλο directory.

Αφού αποθηκεύσουµε το όνοµα του προγράµµατος µποορύµε να αρχίσουµε τη συγγραφή του. Στη συνέχεια θα δούµε ένα απλό προγραµµατακι το οποίο υπολογίζει τις ρίζες µίας δευτεροβάθµιας εξίσωσης. Θα το αποθηκεύσουµε µε την ονοµασία “deyterobathmia.m” και θα έχει την ακόλουθη µορφή:

Πρόγραµµα 1: %%% We solve the Equation ax^2+bx+c=0

clear;

clc;

close all;

7

a = 1;

b = 1;

c = 1;

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

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

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

p1r = real(p1);

p1i = imag(p1);

p2r = real(p2);

p2i = imag(p2);

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

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

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

• Η εντολή clear καθαρίζει τη µνήµη του υπολογιστή από οποιεσδήποτε εκχωρήσεις µεταβλητών έχουν γίνει σε προηγούµενα προγράµµατα.

• Η εντολή 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 σηµαίνει αλλαγή γραµµής.

8

Το πρόγραµµα αυτό είναι ένα πολύ απλό πρόγραµµα το οποίο όµως µας δείχνει µε τον καλύτερο τρόπο τις απεριόριστες δυνατότητες του Matlab. ∆ηλαδη, συγκρινόµενο µε κάποια ευρέως διαδεδοµένη γλώσσα προγραµµατισµού (π.χ. C/C++) θα µπορούσαµε πολύ εύκολα να βρούµε πάρα πολλά σηµεία υπεροχής. Αναφέρουµε µερικά:

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

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

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

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

Ενα ακόµα πρόγραµµα το οποίο καταδυκνύει την υπεροχή του Matlab έναντι άλλων προγραµµάτων είναι το πρόγραµµα που ακολουθεί. Εστω δηλαδή ότι έχουµε ένα γραµµικό σύστηµα 3Χ3 και θέλουµε να υπολογίσουµε τις τιµές των αγνώστων µε την µέθοδο των οριζουσών. Το πρόγραµµα που κάνει τους υπολογισµούς αυτούς το ονοµάζουµε “grammiko1.m” και είναι το ακόλουθο:

Πρόγραµµα 2: %%% a11x + a12y + a13z = a14

%%% a21x + a22y + a23z = a24

%%% a31x + a32y + a33z = a34

clear;

clc;

close all;

for(i=1:1:3)

for(j=1:1:4)

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

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

fprintf('\n');

end

end

for(i=1:1:3)

for(j=1:1:3)

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

end

end

for(i=1:1:3)

9

for(j=1:1:4)

if(j==4)

k=1;

else

k=j;

end

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

end

end

for(i=1:1:3)

for(j=1:1:4)

if(j==4)

k=2;

else

k=j;

end

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

end

end

for(i=1:1:3)

for(j=1:1:4)

if(j==4)

k=3;

else

k=j;

end

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

end

end

Dxyz = det(Dxyz1);

Dx = det(Dx1);

Dy = det(Dy1);

Dz = det(Dz1);

x = Dx/Dxyz;

y = Dy/Dxyz;

z = Dz/Dxyz;

10

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

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

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

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

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

• Κατασκευάζονται οι πίνακες 3Χ3 οι οποιοι θα δώσουν τις ορίζουσες µέσω των οποίων θα υπολογίσουµε τις τιµές των x,y,z.

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

Οπως και προηγουµένως, µπορούµε πολύ ευκολα να καταλάβουµε την πολύ µεγάλη διαφορά στην ευκολία επίλυσης του συστήµατος όταν χρησιµοποιούµε το Matlab σε σχέση µε κάποια άλλη γλώσσα προγραµµατισµού. Για παράδειγµα, δεν χρειάζεται να βρούµε τρόπο υπολογισµού της ορίζουσας αφού ήδη αυτό γίνεται αυτόµατα µε τη χρήση της εντολής det. Επίσης, στην εντολή input δεν χρειάζεται να ορίσουµε τον τύπο της µεταβλητής (αν δηλαδή θα είναι ρητός, πραγµατικός ή οποιασδήποτε άλλης µορφής αριθµός).

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

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

1.5 Πως κατασκευάζουµε βοηθητικές συναρτήσεις; Ο τρόπος µε το οποίο κατασκευάζονται οι συναρτήσεις είναι όµοιος µε αυτόν για τον κανονικό κώδικα-πρόγραµµα. Ετσι κατασκευάζουµε το κανονικό πρόγραµµα και µέσα από αυτό καλούµε την βοηθητική συνάρτηση. Αυτή, µπορεί είτε να χρειάζεται κάποιες παραµέτρους εισόδου είτε όχι. Μπορεί επίσης να επιστρέφει οσωδήποτε µεγάλο αριθµο παραµέτρων πινάκων η αποτελεσµάτων αρκεί να έχει ρυθµιστεί να κάνει αυτή τη δουλεια. Η συνάρτηση αποθυκεύεται στο ίδιο directory µε το κυρίως πρόγραµµα και µοιάζει µε αυτο, µε τη διαφορά ότι στην πρώτη γραµµη του χρησιµοποιεί την εντολή function και ακολουθεί το όνοµα της συνάρτησης µε τις παραµέτρους εισόδου και εξόδου.

11

Το πρόγραµµα που ακολουθεί είναι ουσιαστικά το ίδιο µε το πρόγραµµα 2 που επιλύει ένα γραµµικο αλγεβρικό σύστηµα µε τη µέθοδο των οριζουσών. Η διαφορά εδώ είναι ότι η υπορουτίνα που ζητάει το διάβασµα των τιµών των a11, a12,… θα είναι µία ξεχωριστή συνάρτηση η οποία απλά θα επιστρέφει τον πίνακα 3Χ4 των συντελεστών του προβλήµατος οποίος θα χρησιµοποιείθεί για τον υπολογισµό των x, y, z. Υπάρχει επίσης και µία δευτερη συναρτηση η οποία λαµβάνει ώς είσοδο τα αποτελέσµατα και τα τυπώνει στην οθόνη. Το κυρίως πρόγραµµα θα το ονοµάσουµε grammiko2.m, ενω τις δύο συναρτήσεις που θα χρησιµοποιηθούν θα τις ονοµάσουµε fun1.m και fun2.m. Επειδή, όπως ηδη έχουµε αναφέρει, η κάθε συνάρτηση είναι σχεδόν ένα κανονικό πρόγραµµα το κυρίως πρόγραµµα είναι το Πρόγραµµα 3 ενω οι δύο συναρτήσεις είναι το Πρόγραµµα 4 και το Πρόγραµµα 5. Τα προγράµµατα αυτά έχουν την ακόλουθη µορφή:

Πρόγραµµα 3: %%% 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);

for(i=1:1:li)

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

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

end

end

for(i=1:1:li)

for(j=1:1:co)

if(j==4)

k=1;

else

k=j;

end

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

end

12

end

for(i=1:1:li)

for(j=1:1:co)

if(j==4)

k=2;

else

k=j;

end

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

end

end

for(i=1:1:li)

for(j=1:1:co)

if(j==4)

k=3;

else

k=j;

end

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

end

end

fun2(Dxyz1, Dx1, Dy1, Dz1);

Πρόγραµµα 4: function [b]=fun1(lin,col);

for(i=1:1:lin)

for(j=1:1:col)

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

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

fprintf('\n');

end

end

13

Πρόγραµµα 5: function a=fun2(Dxyz2, Dx2, Dy2, Dz2);

Dxyz = det(Dxyz2);

Dx = det(Dx2);

Dy = det(Dy2);

Dz = det(Dz2);

x = Dx/Dxyz;

y = Dy/Dxyz;

z = Dz/Dxyz;

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

Η χρήση των βοηθητικών συναρτήσεων βοηθάει τον χρήστη να επεξεργάζεται µικρά προγράµµατα τα οποία µπορεί µε ευκολία να τα τροποποιήσει και να τα διορθώσει κατά βούληση µε πολύ µικρές πιθανότητες σφάλµατος. Επίσης, µε τη χρήση των βοηθητικών συναρτήσεων το κυρίως πρόγραµµα µπορεί να γίνει πολύ µικρό σε µέγεθος και έτσι να µπορεί ο κάθε χρήστης µε ευκολία να καταλάβει τη λειτουργία του. Ενα άλλο πλεονέκτηµα της χρήσης των βοηθητικών συναρτήσεων είναι ότι µπορούν να χρησιµοποιηθούν από άλλα προγράµµατα αρκεί να αντιγραφούν στο directory που µας ενδιαφέρει. Ο τρόπος µε τον τον οποίο πραγµατοποιείται η δυνατότητα χρήσης της βοηθητικής συνάρτησης και από άλλα κύρια προγράµµατα θα εξηγηθεί παρακάτω.

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

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

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

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

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

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

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

14

2. Επίλυση Συστηµάτων Γραµµικών Εξισώσεων 2.1 Μέθοδος Gauss Οπως ήδη γνωρίζουµε η µέθοδος Gauss βασίζεται στη δυνατότητα που έχουµε στον επαυξηµένο πίνακα ενός γραµµικού αλγεβρικού συστήµατος να κάνουµε γραµµοπράξεις χωρίς να επηρεάζεται η ζητούµενη λύση του συστήµατος. Η µέθοδος αυτή, αποσκοπεί στο να µετατρέψει τον επαυξηµένο πίνακα του γραµµικού αλγεβρικού συστήµατος σε τριγωνικό άνω, ώστε στη συνέχεια µε πίσω αντικατάσταση να υπολογιστεί η λύση του συστήµατος.

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

(1) έχοντας ως οδηγό στοιχείο το πρώτο της διαγωνίου πολλαπλασιάζουµε µε τον κατάλληλο συντελεστή έτσι ώστε όταν προστεθεί η πρώτη, πολλαπλασιασµένη µε τον συντελεστή, γραµµή στην δεύτερη το στοιχείο κάτω από το πρώτο στοιχείο της διαγωνίου να γίνει µηδενικό. Στη συνέχεια πολλαπλασιάζουµε την πρώτη γραµµή µε κάποιον άλλο συντελεστή ώστε προστιθέµενη στην τρίτη γραµµή να γίνει µηδενικό το στοιχείο της πρώτης στήλης. Η διαδικασία αυτή συνεχίζεται µέχρι τη στιγµή που όλα τα στοιχεία της πρώτης γραµµής κάτω από το πρώτο στοιχείο της διαγωνίου γίνουν µηδενικά. Ακριβώς όµοια διαδικασία ακολουθείται για το δεύτερο οδηγό στοιχείο, δηλαδή το δεύτερο στοιχείο της διαγωνίου και ό,τι βρίσκεται κάτω από αυτό. Η διαδικασία αυτή συνεχίζεται µέχρι το τελευταίο οδηγό στοιχείο, δηλαδή το προτελευταίο στοιχείο της διαγωνίου.

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

Αρχικά θα χρησιµοποιήσουµε την fun1.m που κατασκευάσαµε στο Πρόγραµµα 4. Στη συνέχεια, αφού θα έχουµε στη διάθεση µας τον επαυξηµένο πίνακα a θα κάνουµε τις κατάλληλες γραµµοπράξεις ώστε να µετατρέψουµε τον πίνακα σε τριγωνικό άνω. Ο τρόπος µε τον οποίο επιτυγχάνεται η επίλυση γραµµικών αλγεβρικών συστηµάτων µε τη µέθοδο Gauss παρουσιάζεται στο Πρόγραµµα 6 που ακολουθεί και θα αποθηκευτεί µε το όνοµα gauss1.m.

Πρόγραµµα 6: %%% 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);

15

[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 οι οποίες κάνουν την τριγωνοποίηση και την πίσς αντικατάσταση αντίστοιχα. Ο τρόπος µε τον οποίο λειτουργούν θα εξηγηθεί και θα µελετηθεί στην τάξη. Στα Προγράµµατα 7 και 8 που ακολουθούν, φαίνονται οι συναρτήσεις fun3.m και fun4.m:

Πρόγραµµα 7: 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

Πρόγραµµα 8: 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

16

Προφανώς το πρόγραµµα αυτό θα µπορούσε να γραφτεί και χωρίς τη χρήση συναρτήσεων. Οµως, στην περίπτωση αυτή θα είχε πολύ µεγαλύτερο µέγεθος και δεν θα ήταν πολύ εύκολες οι αλλαγές στη δοµη του. Για να αποδειχθεί του λόγου το αληθές θα επιχειρήσουµε να γράψουµε ένα πρόγραµµα το οποίο θα επιλύει ένα γραµµικό σύστηµα εξισώσεων µε τη µέθοδο Gauss-Jordan.

2.2 Μέθοδος Gauss-Jordan Η µέθοδος αυτή µοιάζει πολύ µε τη µέθοδο Gauss µε τη διαφορά ότι ο στόχος της είναι να µηδενιστούν όλοι οι όροι του επαυξηµένου πίνακα εκτός από αυτούς της διαγωνίου. Το κέδρος που έχουµε µε τον τρόπο αυτό είναι ότι απαιτείται ελάχιστη δουλειά κατά τη διάρκεια της διαδικασίας της πίσω αντικαταστασης για τον υπολογισµό των τιµών των αγνώστων. Το µειονέκτηµα της µεθόδου είναι ότι απαιτείται αρκετά µεγαλύτερος αριθµός πράξεων (σχεδόν διπλάσιος) σε σχέση µε τη µέθοδο Gauss, για να φτάσουµε τον επαυξηµένο πίνακα στη µορφή που πρέπει. Ετσι, η διαδικασία κατασκευής του προγράµµατος αυτού είναι να χρησιµοποιήσουµε το κυρίως κοµµάτι του ως έχει (όπως ακριβώς στο πρόγραµµα gauss1.m) και να αλλάξουµε κάποια κοµµάτια των συναρτήσεων fun3.m και fun4.m που χρησιµοποιεί.

Για λόγους ευκολίας θα αλλάξουµε τα ονόµατα των συναρτήσεων αυτών σε fun3_b.m και fun4_b.m οπότε πρέπει να γίνουν και οι κατάλληλες αλλαγές στο κυρίως πρόγραµµα το οποίο θα ονοµάζεται πλέον gauss2.m.

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

Πρόγραµµα 9: 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

end

end

end

17

Πρόγραµµα 10: 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 που µόλις περιγράψαµε µπορούµε µε απλό τρόπο να υπολογίσουµε την ορίζουσα του πίνακα των συντελεστών του επαυξηµένου πίνακα. Ο υπολογισµός αυτός βασίζεται στην ιδιότητα που έχει ένας τετραγωνικός τριγωνικός άνω ή κάτω πίνακας, η ορίζουσα του να υπολογίζεται ως το γινόµενο των στοιχείων της διαγωνίου του.

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

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

2.4 Υπολογισµός αντίστοφου πίνακα Γνωρίζουµε ότι ο αντίστροφος ενός πίνακα Α είναι ένα πίνακας Β για τον οποίο θα ισχύει:

ΑΒ = ΒΑ = Ι

όπου Ι µοναδιαίος πίνακας µε διάσταση όµοια µε αυτή των πινάκων Α και Β. Ας θεωρήσουµε την περίπτωση που όλοι οι πίνακες που µελετάµε είναι τετραγωνικοί 3Χ3. Τα αποτελέσµατα που θα προκύψουν γενικεύονται πολύ εύκολα και για

18

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

⎥⎥⎥

⎢⎢⎢

⎡=

333231

232221

131211

aaaaaaaaa

A

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

⎥⎥⎥

⎢⎢⎢

⎡=

333231

232221

131211

bbbbbbbbb

B

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

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

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.

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

19

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.

3.2 Μέθοδος της διχοτόµισης Οπως γνωρίζουµε, η µέθοδος της διχοτόµισης είναι µία µέθοδος διαδοχικών δοκιµών για την εύρεση των ριζών µη γραµµικών αλγεβρικών εξισώσεων. Από τη στιγµη που θα βρεθούν τα δύο σηµεία του διαστήµατος ώστε να ισχύει το θεώρηµα Boltzano τότε µε τη µέθοδο αυτή, οπωσδήποτε θα προσεγγίσουµε τη την περιοχή που βρίσκεται η συγκεκριµένη ρίζα της εξίσωσης.

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

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

20

ενδιαφέρει. Στη συνέχεια βρίσκουµε δύο σηµεία, έστω 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.

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

Το πρόγραµµα σε matlab που πραγµατοποιεί τον αλγόριθµο αυτό θα το ονοµάσουµε dixotomish1.m και είναι το ακόλουθο:

Πρόγραµµα 11: 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);

21

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);

όπως παρατηρούµε το πρόγραµµα αυτό χρησιµοποιεί και µία βοηθητική συνάρτηση την fx. Η συνάρτηση αυτή υπολογίζει την τιµή της f(x) στο συγκεκριµένο σηµείο που µας ενδιαφέρει. Η συνάρτηση αυτή έχει τη µορφή που φαίνεται στο ακόλουθο πρόγραµµα:

Πρόγραµµα 12: function [f]=fx(x);

f = x^5+x+1;

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

3.3 Επαναληπτικές µέθοδοι Οπως γνωρίζουµε εκτός από τις µεθόδους διαδοχικών δοκιµών, για την εύρεση των ριζών µη γραµµικών αλγεβρικών εξισώσεων χρησιµοποιούµε και µια άλλη οµάδα µεθόδων τις επαναληπτικές. Οι µέθοδοι αυτοί ξεκινούν από ένα συγκεκριµένο σηµείο a του πεδίου ορισµού και κινούνται προς την ρίζα χωρις να χρησιµοποιούν το θεώρηµα Boltzano αλλά, άλλες τεχνικές σύγκλισης. Το µεγάλο πλεονέκτηµα των µεθόδων αυτών είναι ότι συγκλίνουν στη ρίζα µε πολύ ταχύτερους ρυθµούς απ’ότι οι µέθοδοι διαδοχικών δοκιµών αλλά το µεγάλο τους µειονέκτηµα είναι ότι δεν “καταφέρνουν” να συγκλίνουν πάντα. Για το λόγο αυτό, η συνηθέστερη χρήση τους είναι µετά τη χρήση των µεθόδων διαδοχικών δοκιµών ώστε και σίγουρη σύγκλιση να µπορούµε να πετύχουµε (µέθοδοι διαδοχικών δοκιµών) αλλά και ταχύτερη διαδικασία (Επαναληπτικές µέθοδοι). Ενας σηµαντικός εκπρόσωπος των µεθόδων διδοχικών δοκιµών είναι η µέθοδος Newton-Raphson η οποία περιγράφεται στη συνέχεια.

22

3.4. Μέθοδος Newton Raphson Μια από τις πιο συχνά χρησιµοποιούµενες επαναληπτικές µεθόδους είναι η µέθοδος Newton - Raphson η οποία βασίζεται στο ότι αν µία προσέγγιση x είναι αρκετά κοντά στη ρίζα ρ µιας συνάρτησης f(x) (µε f(ρ)=0), τότε η συνάρτηση f µπορεί να αναπτυχθεί σε σειρά Taylor γύρω από την τιµή ρ. Οπότε, µέχρι τους όρους πρώτης τάξης του αναπτύγµατος θα ισχύει

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

και δεδοµένου ότι το αναπτυγµα αυτό έχει επιλεγεί ώστε f(ρ) = 0, και θεωρώντας ότι οι όροι ανώτερης τάξης δεν παίζουν σηµαντικό ρόλο στην τιµή της f, µπορούµε να υπολογίσουµε τη ρίζα ρ, επιλύοντας την προηγούµενη εξίσωση. Ετσι, προκύπτει ότι η τιµή της ρίζας ρ, θα δίνεται από τη σχέση,

...)()(+

′−=

xfxfxρ

Η ιδέα της µεθόδου είναι να χρησιµοποιηθεί η εξίσωση αυτή, αντικαθιστώντας στη θέση του τυχαίου x τη ν-οστή προσέγγιση xn, και στη θέση της ρίζας ρ (που υπολογίζεται προσεγγιστικά) την επόµενη προσέγγιση xn+1, παραλείποντας τους όρους ανώτερης τάξης. Ετσι, προκύπτει η αναδροµική σχέση της µεθόδου Newton-Raphson η οποία έχει τη µορφή:

)()(

1n

nnn xf

xfxx′

−=+

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

Γνωρίζοντας την εξίσωση που επιλύει το πρόβληµα µας µπορούµε να προχωρήσουµε στο επόµενο βήµα που είναι η δηµιουργία του αλγορίθµου. Εδώ πρέπει να θυµηθούµε ότι η χρήση επαναληπτικών µεθόδων δεν οδηγεί οπωσδήποτε σε σύγκλιση οπότε πρέπει οπωσδήποτε µέσα στο πρόγραµµα µας να συµπεριλάβουµε και κάποιες γραµµές οι οποίες δεν θα αφήνουν τον αλγόριθµο να επαναλαµβάνεται επ’άπειρο στην περίπτωση δεν έχει καταφέρει να επιτευχθεί η σύγκλιση. Το πρόγραµµα σε matlab το οποίο πραγµατοποιεί τον αλγόριθµο Newton-Raphson, θα ονοµάσουµε nr1.m και είναι το ακόλουθο:

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

clc;

close all;

23

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);

Παρατηρούµε ότι το πρόγραµµα αυτό χρησιµοποιεί δύο συναρτήσεις: την fx και την dfx. Η µία (η fx) είναι αυτή που υπολογίσαµε στο προηγούµενο πρόγραµµα. Η δεύτερη (η dfx) υπολογίζει την παράγωγο της fx στη θέση x. Να θυµίσουµε εδώ οτι η ξίσωση η οποία δίνει την παράγωγο µίας συνάρτησης σε ένα σηµείο x είναι η:

dxxfdxxfxf )()()( −+

=′

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

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

Πρόγραµµα 14: function [dfun]=dfx(x,dx);

f1 = fx(x+dx);

f2 = fx(x);

dfun = (f1-f2)/dx;

Παρατηρούµε ότι η συνάρτηση αυτή που υπολογίζει την παράγωγο χρησιµοποιεί τη συνάρτηση που είχαµε φτιάξει προηγουµένως την fx. ∆ηλαδή και το κυρίως πρόγραµµα (nr1.m) και η συνάρτηση του (dfx) χρησιµοποιούν την ίδια συνάρτηση (fx).

24

Στη συνάρτηση dfx που έχει κατασκευαστεί για τη διαφόριση παρατηρούµε ότι εκτός από το σηµείο που µας ενδιαφέρει να διαφορίσουµε µας ενδιαφέριει και το dx. Αυτό ουσιαστικά προκύπτει από τον ορισµό της παραγώγου όπου µας ενδιαφέρει στον παρανοµαστή να έχουµε µία µικρή παράµετρο ώστε πραγµατι να θεωρούµε τον ορισµό αυτό ως την παράγωγο της f σε ένα συγκεκριµένο σηµείο x. Θα µπορούσε καποιος να ισχυρισθεί οτι αφου µας ενδιαφέρει ανα έχουµε το dx->0 θα έπρεπε να βάλουµε στο δχ µία τροµερα µικρή τιµή ώστε να µην δηµιουργηθεί κανένα πρόβληµα. Στην περίπτωση των υπολογιστών το να χρησιµοποιήσουµε µία πολυ µικρή τιµη δεν είναι πάντα ευκολη δουλεια. Ο αριθµός που θα χρησιµοποιήσουµε πρέπει να είναι µικρός αλλά σε σχέση µε τις υπόλοιπες παραµέτρους του συστήµατος. Ενας αριθµός πολύ µικρότερος από τις υπόλοιπες παραµέτρους του συστήµατος ουσιαστικά δηµιουργεί δυσλειτουργίες στο σύστηµα µας και είναι πιθανόν, κάποιες φορές να προκύψουν λανθασµένα αποτελέσµατα. Περισσότερα στοιχεία σχετικά µε το πως επιλέγουµε τις µικρές ή τις µεγάλες παραµέτρους σε ένα πρόβληµα θα αναφερθούν στην τάξη κατά τη διάρκεια των µαθηµάτων.

Σχετικά µε τον τρόπο που δηµιουτγήθηκε το συγκεκριµένο πρόγραµµα πρέπει να υπενθυµίσουµε κάτι που έχει αναφερθεί αρκετες φορές µέχρι τώρα, ότι, το Matlab δεν είναι απλώς άλλη µία γλωσσα αλλά ένα σύστηµα προγραµµατισµού. ∆ηλαδή, δεν αποτελείται µόνο από εντολές που εκτελούν κάποιες συγκεκριµένες βασικές διαδικασίες, αλλά περιέχει και έτοιµες συναρτήσεις που εκτελούν πιο σύνθετες πράξεις. Μία από αυτές είναι η διαφόριση. Το Matlab έχει έτοιµη την εντολή-συνάρτηση η οποία χρησιµοποιείται στη διαφόριση. Ο τρόπος µε τον οποίο θα χρησιµοποιηθεί θα εξεταστεί και θα µελετηθεί κατά τη διάρκεια των παραδόσεων του µαθήµατος.

25

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 −−−

+=−+= λ

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

Από τρία δεδοµένα σηµεία του επιπέδου (xi,yi), i=1,2,3, µε 321 xxx ≠≠ διέρχεται η γραφική παράσταση ενός και µόνο ενός πολυωνύµου y(x) 2ου βαθµού. Η απόδειξη της παραπάνω πρότασεις έχει αποδειχθεί στα πλάισια προπτυχιακών µαθηµάτων και για το λόγο αυτό δεν αποτελεί αντικέιµενο του παρόντος µαταπτυχιακού µαθήµατος.

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

Από Ν δεδοµένα σηµεία του επιπέδου (xi,yi), i=1,2,...,Ν, µε Nxxx ≠≠≠ ...21 διέρχεται η γραφική παράσταση ενός και µόνο ενός πολυωνύµου y(x) (Ν-1)-οστού βαθµού.

26

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

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

(α) έστω οτι µας ενδιαφέρει το πολυώνυµο να περνάει από 3 σηµεία τα οποία είναι τα (x1,y1), (x2,y2) και (x3,y3).

(β) προφανώς το πολυώνυµο που µας ενδιαφέρει θα είναι 2ου βαθµού. Αρα θα έχει τη µορφή: f(x)=ax2+bx+c. Το κάθε σηµείο (xi,yi) θα πρέπει να ικανοποιεί την εξίσωση αυτή.

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

y1=ax12+bx1+c

y2=ax22+bx2+c

y3=ax32+bx3+c

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

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

Ετσι λοιπόν το πρόγραµµα που θα φτιάχνει τον επαυξηµένο πίνακα για τον υπολογισµό των συντελεστών του πολυωνύµου θα το ονοµάσουµε parembolh1.m και θα έχει την ακόλουθη µορφή:

Πρόγραµµα 15: 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) for(k=1:1:numb1) if(m<=numb1) matr(k,m) = x(k)^(numb1-m);

27

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

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

Οταν κατασκευαστεί ο επαυξηµένος πίνακας, πρέπει να επιλύθεί το σύστηµα. Μέχρι στιγµής έχουµε δείξει προγράµµατα και µεθόδους που επιλύουν γραµµικά αλγεβρικά συστήµατα. Οπότε θα πρέπει οι φοιτητές να µετατρέψουν ένα τέτοιο πρόγραµµα, σε συνάρτηση του Matlab και να το ενσωµατώσουν στο παραπάνω πρόγραµµα. Η διαδικασία αυτή θα γίνει µε την καθοδήγηση του διδάσκοντα στην τάξη στα πλαίσια του µαθήµατος.

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

28

5. Αριθµητική Παραγώγιση 5.1 Παραγώγιση µε τη χρήση του ορισµού Γνωρίζουµε ότι όταν θέλουµε να παραγωγίσουµε µία συνάρτηση µπορύµε να χρησιµοποιήσουµε τον τύπο ορισµού της παραγώγου που έχει τη µορφή:

dxxfdxxfxf )()()( −+

=′

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

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

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

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

Πρόγραµµα 16: %% function f(x)=6x^10 %% first derivative f'(x)=60x^9 clc; clear; close all; i=1; 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);

29

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

Παρατηρούµε δηλαδή οτι η τιµή του dx που δίνει τα πιο σωστά αποτελέσµατα είναι µεταξύ του 10-8 και του 10-7. Οµως, όπως είναι φανερό, η επίδραση του σφάλµατος εξαρτάται και από την εφαρµογή που µας ενδιαφέρει. ∆ηλαδή ένα σφάλµα της τάξης του 2-5% για πολλές εφαρµογές είναι αµελητέο οπότε δεν χρειάζεται να χρησιµοποιήσουµε πολύ µικρά dx και να κάνουµε πιο χρονοβόρα την εφρµογή µας. Σε άλλες όµως περιπτώσεις το σφάλµα υπολογισµού της παραγώγου παίζει πολύ σηµαντικό ρόλο οπότε πρέπει να υπολογιστεί µε τη µικρότερη δυνατή ακρίβεια. Πολλές φορές µάλιστα ακόµα και η µέγιστη ακρίβεια, όπως φαίνεται από το παραπάνω σχήµα, υπολογισµού της παραγώγου µε τη χρήση του ορισµού δεν είναι αρκετή. Οπότε χρησιµοποιούµε άλλες µεθόδους υπολογισµού. Μία από αυτές είναι ο υπολογισµός µε πολυωνυµική παρεµβολή που θα δούµε στη συνέχεια.

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

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

30

την εύρεση της τιµής µιάς παραγώγου. ∆εν είναι όµως πάντα εύκολο να επιλέξουµε το dx να έχει ακριβώς την τιµή που επιθυµούµε. Ο λόγος είναι ότι πολλές φορές δεν γνωρίζουµε τον µαθηµατικό τύπο της συνάρτησης που πρέπει να παραγωγίσουµε αλλά κάποια σηµεία της. Από τα σηµεία αυτά θα πρέπει να ανακατασκευάσουµε τη συνάρτηση και να βρούµε τη µορφή της. Πρέπει δηλαδή να χρησιµοποιήσουµε κάποια από τις µεθόδους παρεµβολής για να υπολογίσουµε την µαθηµατική έκφραση της συνάρτησης. Ενας από τους τρόπους αυτούς είναι η πολυονυµική παρεµβολή την οποία µελετήσαµε στο προηγούµενο κεφάλαιο.

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

Ο τρόπος µε τον οποίο θα δουλέψουµε είναι ο εξής:

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

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

Ο κώδικας που διεκπεραιώνει προγραµµατιστικά τη διαδικασία που αναφέρθηκε παραπάνω θα ονοµάστεί diff1.m και θα έχει τη µορφή του προγράµµατος 17 που ακολουθεί:

Πρόγραµµα 17: clc; clear; close all; fprintf('Paragwgos sto x='); sdiff = 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

31

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 οι οποίες φαίνονται στα προγράµµατα 18 και 19 αντίστοιχα.

Πρόγραµµα 18: function [xyz]=grammiko3(numb,a) for(i=1:1:numb) for(j=1:1:numb) Dxyz(i,j,numb+1)=a(i,j); 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

Πρόγραµµα 19: function [dres] = diff2(xyz,x,dx); dres = (fun5(xyz,x+dx) - fun5(xyz,x))/dx;

Οµως το πρόγραµµα 19 (diff2.m) καλεί µία ακόµα συνάρτηση, την fun5.m η οποία φαίνεται στο πρόγραµµα 20 που ακολουθεί.

32

Πρόγραµµα 20: 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) που έχει ζητήσει.

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

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

33

6. Αριθµητική Ολοκλήρωση 6.1 Ολοκλήρωση µε χρήση του ορισµού Είναι γνωστό ότι η παραγώγιση µιας συνάρτησης είναι µία διαδικασία, αρκετές φορές, επίπονη, πάντα θα δώσει αποτέλεσµα. ∆εν συµβαίνει όµως το ίδιο και στην περίπτωση της ολοκλήρωσης. Πολύ συχνά η ολοκλήρωση µίας συνάρτησης είναι µία διαδικασία η οποία δεν είνα δυνατόν να δώσει αναλυτικό αποτέλεσµα. Για το λόγο αυτό έχουν αναπτυχθεί αρκετές αριθµητικές µέθοδοι υπολογισµού των ολοκληροµάτων. Οι ανάλυση των τρόπων αυτών δεν εµπίπτει στο αντικέιµενο του παρόντος µαθήµατος όµως µπορύµε να µελετήσουµε τον τρόπο λειτουργίας κάποιων εξ αυτών. Ας θεωρήσουµε το ακόλουθο ορισµένο ολοκλήρωµα:

∫=b

adxxfI )(

Το ολοκλήρωµα αυτό έχει ώς τιµή το εµβαδό που περικλύεται από την καµπύλη της συνάρτησης f(x) θεωρώντας ώς θετικές τιµές αυτές που βρίσκονται πάνω από τον άξονα x’x και αρνητικές αυτές που βρίσκονται από κάτω.

Υπάρχουν αρκετές µέθοδοι για τον υπολογισµό του ολοκληρώµατος (µερικές από αυτές: κανόνας ορθογωνίου παραλληλογράµου, κανόνας τραπεζίου, κανόνας Simpson κλπ) όµως εµείς θα επικεντρωθούµε σε έναν από αυτούς και συγκεκριµένα στον κανόνα του παραλληλογράµου.

Σύµφωνα µε τον κανόνα αυτό θεωρούµε ότι κάτω από τη συνάρτηση f(x) υπάρχει ένα ορθογώνιο παραλληλόγραµο το οποίο έχει βάση που ξεκινάει από το a και καταλήγει στο b (όρια ολοκλήρωσης) και ύψος ίσο µε το f(a). Το αποτέλεσµα του ολοκληρώµατος θεωρούµε ότι προσεγγίζεται ικανοποιητικά από το εµβαδό του ολοκληρώµατος.

Καταλαβαίνουµε εύκολα ότι η επάνω πλευρά του παραλληλογράµου, αντί να ακολουθεί την συνάρτηση είναι απλά παράλληλη στον οριζόντιο άξονα. Οπότε το σφάλµα που προκύπτει, σε αρκετές περιπτώσεις, είναι τεράστιο. Για να µειώσουµε το σφάλµα κατά το δυνατόν περισσότερο µπορύµε να µη θεωρήσουµε ως βάση του παραλληλογράµου το διάστηµα από a έως b αλλά να το χωρίσουµε σε µικρότερα παραλληλόγραµµα να υπολογίζουµε τα εµβαδά τους και στο τέλος να τα προσθέτουµε. Αν προχωρήσουµε βήµα βήµα τη διαδικασία αυτή θα αντιληφθούµε ότι ο καλλύτερος τρόπος για τον αριθµητικό υπολογισµό των ολοκληρωµάτων είναι προσθέτουµε εµβαδά παραλληλογράµων που έχουν το ελάχιστο δυνατό πλάτος βάσης. Αυτό το ονοµάζουµε dx.

Στο σηµείο αυτό προκύπτει το ερώτηµα: πότε µπορούµε να έχουµε οσωδήποτε µικρό dx; Μόνο όταν γνωρίζουµε τη συνάρτηση που θέλουµε να ολοκληρώσουµε. Αρα, στην περίπτωση που έχουµε µόνο µερικά σηµεία της συνάρτησης πρέπει να χρησιµοποιήσουµε κάποια µέθοδο παρεµβολής ώστε να υπολογίσουµε τον µαθηµατικό τύπο της. Στη συνέχεια θα αθροίσουµε όλα τα παραλληλόγραµµα που προκύπτουν µε το dx που µας ενδιαφέρει και θα έχουµε υπολογίσει την τιµή του ολοκληρώµατος. Το πρόγραµµα που που κάνει τη διαδικασία αυτή και υπολογίζει την τιµή ενός ολοκληρώµατος µε τη µέθοδο του ορθογωνίου παραλληλογράµου θα το

34

ονοµάσουµε int1.m και θα έχει τη µορφή που φαίνεται στο πρόγραµµα 21 που ακολουθεί:

Πρόγραµµα 21: clc; clear; close all; 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. Η πρώτη από αυτές έχει ήδη αναλυθεί και εξηγηθεί (πρόγραµµα 18) ενώ η δεύτερη έχει τη µορφή που φαίνεται στο πρόγραµµα 22 που ακολουθεί:

Πρόγραµµα 22: function [res] = int2(xyz,aint,bint,dx); numb_dx = ceil(bint-aint)/dx; dx = ceil(bint-aint)/numb_dx; res = 0;

35

for(x=aint:dx:bint) res = res + fun5(xyz,x)*dx; end

Παρατηρούµε ότι και αυτή η συνάρτηση “ζητάει” την fun5.m η οποία έχει εξηγηθεί και αναλυθεί σε προηγούµενο κεφάλαιο.

Σύµφωνα µε τα όσα είπαµε µέχρι στιγµής όσο µικρότερο είναι το dx τόσο καλύτερη είναι η ακρίβεια µε την οποία προσεγγίζεται το ολοκλήρωµα. Η απάντηση είναι ναι θεωρητικά αλλά οχι πρακτικά. Ο λόγος είναι απλός και συµπίπτει µε ότι εξηγήσαµε όταν αναφερόµασταν στην παραγώγιση. Οτι δηλαδή θεωρητικά όταν το dx τείνει στο µηδεν το αποτελέσµα θα έχει και τη µεγαλύτερη ακρίβεια αλλά επειδή οι υπολογιστές έχουν κάποια πεπερασµένη ακρίβεια υπολογισµών από κάποια τιµή του dx και κάτω τα αποτελέσµατα τα οποία δίνουν είναι λανθασµένα, η καλύτερα περιέχουν µεγάλο σφάλµα.

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

Ο τρόπος µε τον οποίο υπολογίζουµε το σφάλµα το οποίο προκύπτει στον υπολογισµό του ολοκληρώµατος είναι αντίστοιχος µε τη διαδικασία που ακολουθήσαµε και στην περίπτωση της παραγώγου. ∆ηλαδή, θα επιλέξουµε µία συνάρτηση της οποίας το ολοκλήρωµα µπορεί εύκολα να προσδιοριστεί και στη συνέχεια θα το υπολογίσουµε µε αριθµητική µέθοδο. Το αποτέλεσµα που θα προκύψει θα πρέπει να µπορέι να µας δώσει το σχετικό σφάλµα. Το πρόγραµµα αυτό θα ονοµάζεται int3.m και θα έχει τη µορφή του προγράµµατος 23 που ακολουθεί:

Πρόγραµµα 23: 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);

36

icount = icount + 1; end loglog(dxpl,result3);

Οταν εκτελείται το πρόγραµµα αυτό χρειάζεται αρκετό χρόνο. Ο λόγος είναι ότι, όπως είπαµε παραπάνω, για να υπολογιστεί το ολοκλήρωµα ακολουθείται προσθετική διαδικασία (προστίθενται µεταξύ τους τα εµβαδά των ορθογώνιων παραλληλογράµων που υπολογίζονται) οπότε, όσο µικρότερο είναι το βήµα (dx) τόσο πιο πολύς χρόνος απαιτείται. Βέβαια όσο πιο µικρή είναι η διαµέριση του χωρίου που µας ενδιαφέρει να υπολογίσουµε το εµβαδό του τόσο πιο µεγάλη ακρίβεια υπολογισµών θα έχουµε. Αυτό ισχύει συνέχεια όσο µειώνουµε το dx;

Η απαντηση είναι η ίδια µε αυτή που δώσαµε στην περίπτωση της παραγώγου. Οτι δηλαδή θεωρητικά, όσο το dx τείνει στο µηδέν τόσο το αποτέλεσµα µας είναι πιο αξιόπιστο. Στην πράξη όµως, στην πραγµατικότητα των υπολογιστών, κάτι τέτοιο δεν ισχύει.

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

Οπως µπορύµε να δούµε το σχετικό σφάλµα (κατακόρυφος άξονας) µειώνεται συνέχεια µε τη µείωση του dx (οριζόντιος άξονας) αλλά πλησιάζοντας στην τιµή 10-7 παρουσιάζει κορεσµό. Αν συνεχίζαµε την καµπύλη και για τιµές µικρότερες του 10-7 θα βλέπαµε µία συµπεριφορά ανάλογη µε αυτή που είχαµε δεί στην περίπτωση της παραγώγου.

37

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

38

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

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.

39