Υπολογισμός αθροισμάτων Τα αθροίσματα θα τα δημιουργούμε σαν συναρτήσεις και θα τα αποθηκεύουμε σε αρχείο (m-file) με την ίδια ονομασία με τη συνάρτηση. Για να δημιουργήσουμε ένα άθροισμα ξεκινάμε μηδενίζοντας μια μεταβλητή την οποία ας ονομάσουμε sum και στη συνέχεια με μια εντολή επανάληψης προσθέτουμε σε αυτήν τους όρους του αθροίσματος. Θα χρειαστούμε την εντολή επανάληψης for η οποία συντάσσεται με τον ακόλουθο τρόπο for μεταβλητή = αρχική τιμή : βήμα : τελική τιμή εντολή 1 εντολή 2.. όταν δεν αναφέρεται το βήμα θεωρείται ίσο με τη μονάδα. Παράδειγμα 1. Για να βρούμε το άθροισμα των n πρώτων ακεραίων 1 23 n θα εργαστούμε ως εξής sum = 0 for i=1:n sum = sum + i ; Θα ονομάσουμε τη συνάρτηση sum1 και το αρχείο που θα αποθηκεύσουμε sum1.m. Θα πρέπει να δίνουμε (μεταβλητή εισόδου) το πλήθος των ακέραιων n και η συνάρτηση να επιστρέφει το άθροισμα s (μεταβλητή εξόδου). function s = sum1(n) sum = 0 ; sum = sum + i ; Για να βρούμε το άθροισμα των 10 πρώτων ακέραιων >> sum1(1000) >> 5050 1
μπορούμε επίσης να ζητήσουμε το άθροισμα των 1000 πρώτων ακέραιων και να το αναθέσουμε σε μια μεταβλητή (π.χ. y), την οποία κρατά στη μνήμη το MATLAB (όσο διαρκεί το session) >> y = sum1(1000) ; >> y y = >> 500500 Παράδειγμα 2. Για να βρούμε το άθροισμα των περιττών ακεραίων που είναι μικρότεροι του n 135 n για n περιττό ή 135 ( n 1) για n άρτιο Θα ονομάσουμε τη συνάρτηση sum2 και το αρχείο που θα αποθηκεύσουμε sum2.m. Θα πρέπει να δίνουμε n και η συνάρτηση να επιστρέφει το άθροισμα s. function s = sum2(n) sum = 0 ; for i = 1:2:n sum = sum + i ; Αλλάξαμε μόνο το βήμα που έγινε 2 έτσι το i παίρνει τις τιμές 1, 3, 5, κοκ. Παράδειγμα 3. Να γράψετε συνάρτηση sum3 και να την αποθηκεύσετε στο αρχείο sum3.m. Θα πρέπει να δίνουμε n και η συνάρτηση να επιστρέφει το άθροισμα των άρτιων ακέραιων που είναι μικρότεροι των n. Εφαρμόστε τις sum1, sum2 και sum3 για διαφορετικές τιμές του n. Θα πρέπει να ισχύει sum2(n) + sum3(n) = sum1(n). Παράδειγμα 4 Να γράψετε συνάρτηση MATLAB με την οποία υπολογίζεται το άθροισμα 1 1 1 1 1 Παρατηρήσετε ότι όσο αυξάνεται το n τόσο αυξάνεται το 2 3 4 n άθροισμα χωρίς να πηγαίνει προς κάποιο αριθμό. Πραγματικά η σειρά αυτή απειρίζεται. 2
function s = sum4(n) sum = 0 ; sum = sum + 1/i ; Επίσης οι σειρές 1 1 1 1 και 1 1 1 απειρίζονται. 3 5 7 2 4 8 Παράδειγμα 4 Να γράψετε συνάρτηση MATLAB με την οποία υπολογίζεται το άθροισμα 1 1 1 1 1 Παρατηρήσετε τι συμβαίνει στη σειρά αυτή καθώς αυξάνεται 2 4 8 16 το n. Υπόδειξη: Η σειρά μπορεί να γραφεί και σαν 1 1 1 1 1 1 2 2 2 2 3 2 4 2 n function s = sum5(n) sum = 0 ; for i = 0:n sum = sum + 1/2^i ; Ένας άλλος τρόπος να βρούμε το άθροισμα της σειράς είναι να χρησιμοποιήσουμε μια μεταβλητή για το τρέχοντα όρο του αθροίσματος εδώ ο πρώτος όρος είναι το 1, ο δεύτερος όρος είναι το ½, ο τρίτος το 1/2 2. Ξαναγράφουμε την παραπάνω συνάρτηση σαν 3
function s = sum5a(n) term = 1/2^i; Παρατηρούμε ότι ο κάθε όρος προκύπτει από τον προηγούμενο αν διαιρέσουμε με το ½. function s = sum5b(n) term = term/2; Ο τελευταίος τρόπος είναι και ο πιο οικονομικός αφού για κάθε επανάληψη (για κάθε i) εκτελείται μια διαίρεση και μια πρόσθεση. Ενώ στη συνάρτηση sum5a για κάθε επανάληψη εκτελείται μια ύψωση σε δύναμη και μια πρόσθεση. είτε τη διαφορά στο χρόνο υπολογισμού για n=1,000,000. 4
Αντίστοιχα για να υπολογίσουμε γινόμενα πρέπει να χρησιμοποιήσουμε μια μεταβλητή στην οποία αρχικά θα δώσουμε την τιμή 1. Ένα χαρακτηριστικό παράδειγμα είναι το παραγοντικό ενός φυσικού αριθμού. Αυτό ορίζεται μαθηματικά n! 123 n ή από τον αναδρομικό τύπο Για το 0 ορίζεται 0!=1. n! ( n1)! n function p = my_fact(n) p = 1 ; p = p*i; Το MATLAB έχει δική του συνάρτηση για τον υπολογισμό του παραγοντικού >> factorial(10) 3628800 >> my_fact(10) 3628800 Παράδειγμα 6 Η παρακάτω σειρά συγκλίνει στον αριθμό e = 2.71828. 1 1 1 1 1 1 1! 2! 3! 4! 5! Να γράψετε συνάρτηση MATLAB η οποία να υπολογίζει το άθροισμα 1 1 1 1 1 1 1 1! 2! 3! 4! 5! n! για δοσμένο n. 5
function y = my_exp1(n) sum = sum + 1/my_fact(i); y = sum ; Εδώ καλέσαμε την συνάρτηση my_fact(n). ιαφορετικά, μπορούμε να έχουμε οικονομία στις πράξεις γράφοντας function y = my_exp2(n) term = term/i ; sum = sum + term; y = sum ; Μπορούμε να πάρουμε τη τιμή για το e που μας δίνει το MATLAB από την εκθετική συνάρτηση exp(x) (e=exp(1)). Συγκρίνεται την τιμή που βρίσκετε για διαφορετικές τιμές το n (διαφορετικό πλήθος όρων) >> exp(1) 2.71828182845905 >> my_exp2(5) 2.71666666666667 >> my_exp2(10) 2.71828180114638 Για n=5 παίρνουμε 2 σωστά δεκαδικά ψηφία (2.71), για n=10 παίρνουμε 7 σωστά δεκαδικά ψηφία (2.7182818). 6
ιαφορετικά μπορούμε να καθορίσουμε εμείς την ακρίβεια και να πούμε ότι ζητάμε να προσθέτουμε όρους στο άθροισμα μέχρι ο όρος να είναι μην είναι μικρότερος από κάποια ανεκτικότητα tol την οποία προκαθορίζουμε. function y = my_exp3(tol) i = 1; while term>tol term = term/i ; i = i+1 ; y = sum ; >> my_exp3(0.001)-exp(1) -2.786020507716813e-005 >> my_exp3(0.00001)-exp(1) -3.028858532871936e-007 Παράδειγμα 7 Από τo θεώρημα Taylor μπορούμε να γράψουμε την εκθετική συνάρτηση ως εξής 2 3 n x x x x e 1 x R( x) 2! 3! n! Να γράψετε δική σας συνάρτηση συνάρτηση MATLAB y = my_exp(x,tol) η οποία να υπολογίζει την εκθετική συνάρτηση στη θέση x με συγκεκριμένη ακρίβεια tol. 7
Παράδειγμα 8 Από τo θεώρημα Taylor μπορούμε να γράψουμε τo ημίτονο ως εξής function y = my_sin(x,tol) term = x ; sum = term ; x2 = x*x ; 3 5 2n1 x x n x sin x x ( 1) R( x) 3! 5! 2n 1! k = 1; while abs(term)>tol term = -term*x2/(2*k)/(2*k+1) ; k = k+1 ; y = sum ; Για να κατανοήσετε πως δουλεύει η παραπάνω συνάρτηση παρατηρήστε ότι οι όροι είναι: x 3 5 7 x x x 3! 5! 7! 2 2 2 x x x 23 45 67 ο κάθε ένας προκύπτει από τον προηγούμενο Αν θεωρήσουμε έναν δείκτη k που για τον δεύτερο όρο είναι 1 για τον τρίτο όρο 2 για τον τέταρτο όρο 3 τότε οι παρονομαστές είναι (2*k)*(2*k+1). 8
Παράδειγμα 9 Να γράψετε αντίστοιχη συνάρτηση my_cos(x,tol) για τη συνάρτηση συνημίτονο 2 4 2n x x n x cos x 1 ( 1) Rx ( ) 2! 4! 2 n! Παράδειγμα 10 Να γράψετε συνάρτηση my_pi(tol) για τον υπολογισμό το 3.14 στο MATLAB pi >> pi 3.14159265358979 από τη σειρά 1 1 1 1 4 3 5 7 function y = my_pi(tol) sum = term ; p = 1; k = 1; while abs(term)>tol p = - p ; term = p/(2*k+1) ; k = k+1 ; y = 4*sum ; 9