Εργαστήρια Αριθμητικής Ανάλυσης Ι 4 ο Εργαστήριο Διανύσματα-Πίνακες 1 ο Μέρος 2017
Εισαγωγή Όπως έχουμε προαναφέρει σε προηγούμενα εργαστήρια. Ο βασικός τύπος δεδομένων στο Matlab είναι οι πίνακες. Ένα βαθμωτό αναπαρίσταται σαν ένας 1x1 πίνακας. Τα διανύσματα είναι μονοδιάστατοι πίνακες. Τα στοιχεία ενός πίνακα μπορούν να είναι αριθμοί, χαρακτήρες, συμβολοσειρές άλλοι πίνακες και δομές, όμως τα στοιχεία κάθε πίνακα πρέπει να είναι του ιδίου τύπου. Υπάρχει βέβαια μια ειδική κατηγορία που δεν είναι απαραίτητη η ομοιομορφία αυτή, αλλά δεν θα ασχοληθούμε με αυτήν στο εργαστήριο του μαθήματος. Οι πίνακες του Matlab έχουν την δυνατότητα να προσαρμόζουν τις διαστάσεις τους, από μόνοι τους και να υπολογίζουν το απαραίτητο χώρο. Έτσι αν προσθέσεις ένα έξτρα στοιχείο, αυτόματα το μέγεθος αλλάζει κατάλληλα, έτσι ώστε να συμπεριλαμβάνει χωρίς πρόβλημα το καινούριο στοιχείο. Αυτό είναι ένα διαφορετικό στοιχείο σε σχέση με πολλές γλώσσες προγραμματισμού, το οποίο μειώνει το προγραμματιστικό φόρτο. Εισαγωγή Πινάκων Από την στιγμή που ο πίνακας είναι βασικό στοιχείο στο Matlab, είναι αυτονόητο ότι θα έχει προβλεφθεί η ύπαρξη πολλών διαφορετικών τρόπων για να εισάγουμε κάποιον πίνακα (είτε μονοδιάστατο είτε πολυδιάστατο). Για τους σκοπούς του μαθήματος θα περιοριστούμε μόνο στην απλή εισαγωγή και σε κάποιες έτοιμες συναρτήσεις που παράγουν συγκεκριμένους τύπους πινάκων. 1. Για να δημιουργήσω τον πίνακα ΑΑ = 1 2 αρκεί να πληκτρολογήσω στο 3 4 command line την παρακάτω έκφραση A = [1 2;3 4] ή A = [1,2;3,4] Όπως είναι εύκολο να αντιληφθούμε, το ; χρησιμοποιείται όχι όπως έχουμε συνηθίσει ως τώρα, αλλά υποδηλώνει την αλλαγή γραμμής σε έναν πίνακα, ενώ τα στοιχεία της ίδιας γραμμής μπορώ να τα διαχωρίζω είτε αφήνοντας κενό αναμεσά τους είτε με την χρήση του,. Έτσι αν θέλω για παράδειγμα να εισάγω το διάνυσμα vv = [4 1 7] αρκεί να πληκτρολογήσω : v = [4 1 7] 5 Ενώ αν θέλω να εισάγω το διάνυσμα uu = 3 θα πρέπει να το γράψω : 8 u = [5;3;8]
2. Οι έτοιμες συναρτήσεις που έχει το Matlab μπορούν να μας φανούν πολύ χρήσιμες όταν δουλεύουμε με πίνακες, αφού μπορούμε να δημιουργήσουμε κάποιες συγκεκριμένες μορφές πινάκων πολύ εύκολα. Παράδειγμα Αν θέλουμε να δημιουργήσουμε τον μηδενικό πίνακα με 3 γραμμές και 2 στήλες αρκεί να χρησιμοποιήσουμε την συνάρτηση zeros A= zeros(3,2) Ακολουθεί μια λίστα από έτοιμες συναρτήσεις που έχουμε για την δημιουργία πινάκων zeros(m,n) Δημιουργεί έναν mxn πίνακα με όλα τα στοιχεία να είναι 0 ones(m,n) Δημιουργεί έναν mxn πίνακα με όλα τα στοιχεία να είναι 1 eye(m,n) Φτιάχνει τον ταυτοτικό πίνακα διάστασης min(m,n) και στις υπόλοιπες θέσεις μπαίνουν μηδενικα rand(m,n) mxn πίνακας όπου κάθε στοιχείο είναι τυχαία επιλεγμένο από το [0,1] triu(a) Άνω τριγωνικός πίνακας που προκύπτει από τον πίνακα Α tril(a) Κάτω τριγωνικός πίνακας που προκύπτει από τον πίνακα Α diag(a) Επιστρέφει την διαγώνιο του Α σε μορφή διανύσματος diag(v) Φτιάχνει διαγώνιο πίνακα με τα στοιχεία του v στην κύρια διαγώνιο Στις 4 πρώτες αν βάλουμε ένα όρισμα αντί για 2, τότε φτιάνει τον αντίστοιχο τετραγωνικό πίνακα Διαχείριση Στοιχείων Πίνακα o Ανάκτηση στοιχείων πίνακα Αν θέλουμε να δούμε την τιμή που έχει ένα συγκεκριμένο στοιχείο ενός διανύσματος ή ενός πίνακα αρκεί να γράψουμε το όνομα της μεταβλητής μας και μέσα σε παρένθεση την θέση του στοιχείου που μας ενδιαφέρει. Στο Matlab σε αντίθεση με τις περισσότερες γλώσσες προγραμματισμού που ξεκινάνε την αρίθμηση των θέσεων από την θέση 0. Η αρίθμηση γίνεται όπως γνωρίζουμε από τα μαθηματικά και ξεκινάει από την θέση 1. Παράδειγμα 1: Έστω ότι έχουμε εισάγει τον παρακάτω πίνακα Α= [1 2 3 4;5 6 7 8]; Και θέλουμε να τυπώσουμε το στοιχείο που βρίσκεται στην θέση (2,3) αρκεί να γράψουμε την ακόλουθη εντολή στο command line disp(a(2,3))
Παράδειγμα 2: Αντίστοιχα αν έχουμε το διάνυσμα v = [5 9 2 7] και θέλουμε να φτιάξουμε να υπολογίσουμε το άθροισμα των στοιχείων του, θα χρειαστεί να τα πάρουμε ένα ένα και να τα προσθέσουμε. Αυτό θα γινόταν με το παρακάτω πρόγραμμα v = [5 9 2 7]; s = 0; for i = 1:4 s = s + v(i); disp(s) o Αλλαγή τιμή στοιχείου πίνακα ή διανύσματος Αν θέλουμε είτε να δώσουμε τιμές σε ένα διάνυσμα στοιχείο στοιχείο είτε να αλλάξουμε συγκεκριμένη τιμή σε μια θέση ενός πίνακα, μπορούμε να το κάνουμε χωρίς να χρειάζεται να δώσουμε όλες τις τιμές από την αρχή. Αρκεί να γράψουμε τη μεταβλητή και μέσα σε παρένθεση την συντεταγμένη του στοιχείου που θέλουμε. Ύστερα = και μετά την τιμή που θέλουμε να πάρει. Παράδειγμα 1: Να γραφεί πρόγραμμα που θα ζητάει από τον χρήστη να δώσει το επιθυμητό μήκος ενός διανύσματος και στην συνέχεια να εισάγει κάθε στοιχείο του n = input('give vector s length '); v = zeros(1,n); for i = 1 : n v(i)= input('give vector s Element '); disp(v) Παράδειγμα 2: Να γράψετε πρόγραμμα που θα φτιάχνει τυχαίο πίνακα 3χ3 με την χρήση της rand και στη συνέχεια θα αλλάξετε τα στοιχεία της κύριας διαγωνίου με το τετράγωνο της τιμής που έχει ήδη A = rand(3); for i = 1:3 A(i,i) = A(i,i)^; disp(a) o Δημιουργία κενού πίνακα Το Matlab μας δίνει την δυνατότητα να αρχικοποιήσουμε μια μεταβλητή χωρίς να έχει καμία τιμή. Να είναι ένας κενός πίνακας διαστάσεων 0x0. Αυτό γίνεται πολύ εύκολα όπως μπορούμε να δούμε στο παράδειγμα που ακολουθεί v = [ ]
o Εισαγωγή ή διαγραφή επιπλέων στοιχείων σε διάνυσμα Με το πως μπορώ να εισάγω έξτρα γραμμές ή στήλες σε έναν πίνακα, θα ασχοληθούμε σε επόμενο εργαστήριο. Αλλά σε ένα διάνυσμα είναι αρκετά απλό όπως και το να διαγράψω στοιχεία που δεν με ενδιαφέρουν. Πριν από αυτό όμως θα αναφερθούμε σε μια πολύ βασική και χρήσιμη εντολή όταν δουλεύουμε με διανύσματα (μονοδιάστατοι πίνακες). Και αυτή δεν είναι άλλη από την εντολή length. H length δέχεται σαν όρισμα το διάνυσμα και μας επιστρέφει το μήκος του. s = 0; v = [1 5 2 7 3 8]; n = length(v); for i = 1:n s = s + v(i); disp(s) Παράδειγμα 1: Να γραφεί συνάρτηση που να υλοποιεί την μέθοδο της διχοτόμησης και να επιστρέφει όλες τις τιμές που υπολογίζει η μέθοδο μέχρι να φτάσει στην ρίζα. function x = dixo(dias, tol, f,nmax) iters = 0; xmed = dias(1) + (dias(2)-dias(1))/2; x = []; while (abs(dias(1)-dias(2))>tol )&&(f(xmed)~=0)&& iters <= Nmax xmed = dias(1) + (dias(2)-dias(1))/2; x = [x xmed]; if sign(f(dias(1))) ~= sign(f(xmed)) dias(2) = xmed; else dias(1) = xmed; iters = iters+1; Παράδειγμα 2: Να γραφεί πρόγραμμα που θα ζητάει από τον χρήστη να εισάγει διάνυσμα και θα επιστρέφει διάνυσμα με μόνο τα άρτια στοιχεία του. ΠΡΟΣΟΧΗ: Κάθε φορά που διαγράφουμε ένα στοιχείο από ένα διάνυσμα, το μήκος του μειώνεται κατά 1. Για να κάνουμε τον έλεγχο αν είναι άρτιος ένας αριθμός θα χρησιμοποιήσουμε την εντολή rem(a,b) που επιστρέφει το ακέραιο υπόλοιπο της διαίρεσης a/b.
v = input('give vector:'); n = length(v); i = 1; while i <= n if rem(v(i),2) ~= 0 v(i)=[]; n = n - 1; else i = i + 1; disp(v)