Μαρία Λουκά Εργαστήριο Matlab Αριθμητικός υπολογισμός ιδιοτιμών και ιδιοδιανυσμάτων Τμήμα Πληροφορικής και Τηλεπικοινωνιών.
Βασικές Συναρτήσεις της Matlab Γραμμικοί δείκτες (Linear indices) Ένας γραμμικός δείκτης επιτρέπει τη μετατροπή του απλού δείκτη (subscript) Α(i,j) σε δείκτη A(k). Αυτό συμβαίνει γιατί η MATLAB μπορεί να χειριστεί έναν πίνακα σαν ένα απλό διάνυσμα στήλη αφού κάθε στήλη μπορεί να εκχωρηθεί στο τέλος της προηγούμενης στήλης. Λέγοντας, linear indexing numbers εννοούμε την αρίθμηση των στοιχείων σε κάθε στήλη του πίνακα από πάνω προς τα κάτω και από αριστερά προς τα δεξιά. Για παράδειγμα, θεωρούμε ένα 3x3 πίνακα. Μπορούμε λοιπόν αντί να αναφερθούμε στο στοιχείο A(2,2) να αναφερθούμε στο A(5), και αντί του A(2,3) στοιχείου να αναφερθούμε στο A(8). Ο γραμμικός δείκτης αλλάζει και εξαρτάται από το μέγεθος του πίνακα. Για παράδειγμα το A(5) θα επιστρέψει διαφορετικό στοιχείο σε έναν 3x3 πίνακα σε σχέση με αυτό που θα επιστρέψει σε έναν 4x4 πίνακα. Οι συναρτήσεις sub2ind και ind2sub είναι χρήσιμες για τις μετατροπές μεταξύ subscripts και linear indices.
Βασικές Συναρτήσεις της Matlab find: Βρίσκει τους δείκτες και τις τιμές των μη μηδενικών στοιχείων. k = find(x) επιστρέφει ένα διάνυσμα το οποίο περιέχει τους γραμμικούς δείκτες κάθε μη μηδενικού στοιχείου του πίνακα X. Παράδειγμα 1: Να βρεθούν οι θέσεις των μη μηδενικών 1 2 στοιχείων του διπλανού πίνακα Χ = 1 1 Απάντηση: 4 k1 = find(x)= [1 5 7 8 9] Παράδειγμα 2: Να χρησιμοποιηθεί ο λογικός τελεστής not στον X ώστε η συνάρτηση να μας επιστρέψει τις θέσεις των μηδενικών στοιχείων Απάντηση: k2 = find(~x)=[2 3 4 6]
Βασικές Συναρτήσεις της Matlab Αν το X είναι ένα διάνυσμα, τότε η find επιστρέφει ένα διάνυσμα ίδιου προσανατολισμού όπως το X. Αν το X είναι ένας πολυδιάστατος πίνακας, τότε η find επιστρέφει ένα διάνυσμα στήλη με τις θέσεις του αποτελέσματος. Αν το X περιέχει μόνο μη μηδενικά στοιχεία ή είναι κενό, τότε η find επιστρέφει έναν κενό πίνακα. Στοιχεία που ικανοποιούν μια συνθήκη Παράδειγμα: Να βρεθούν τα 5 πρώτα στοιχεία τα οποία είναι μικρότερα του 1 στον διπλανό πίνακα Απάντηση: k = find(x<1,5)=[2 3 4 5 7] και X(k)=[5 9 4 2 7] Χ = 16 5 9 4 2 11 7 14 3 1 6 15 13 8 12 1
Βασικές Συναρτήσεις της Matlab Στοιχεία ίσα με συγκεκριμένες τιμές Προκειμένου να βρούμε μια συγκεκριμένη ακέραια τιμή χρησιμοποιούμε τον τελεστή == Παράδειγμα: Να βρεθεί η θέση του στοιχείου 13 στο ακόλουθο 1x1 διάνυσμα περιττών ακεραίων x = 1:2:2=[1 3 5 7 9 11 13 15 17 19] Απάντηση: k = find(x==13)=7 Προκειμένου όμως να βρεθεί μια μη ακέραια τιμή, θα πρέπει να χρησιμοποιηθεί μια τιμή ανεκτικότητας βασισμένη στα δεδομένα μας. Διαφορετικά το αποτέλεσμα μπορεί να είναι ένας κενός πίνακας λόγω των σφαλμάτων στρογγύλευσης. Παράδειγμα: y = :.1:1=[..1.2.3.4.5.6.7.8.9 1.] Απάντηση: Αν γράψουμε k = find(y==.3) θα πάρουμε έναν κενό πίνακα, ενώ αν γράψουμε k = find(abs(y-.3) <.1) το αποτέλεσμα θα είναι 4.
Βασικές Συναρτήσεις της Matlab Εύρεση κάποιων τελευταίων μη μηδενικών στοιχείων Παράδειγμα: Να δημιουργηθεί ένας 6x6 μαγικός τετραγωνικός πίνακας με όλα τα στοιχεία του, που βρίσκονται σε περιττές γραμμές, μηδενικά. Άρα, για X = magic(6); και X(1:2:end) = έχουμε το διπλανό πίνακα: Να βρεθεί η θέση των τελευταίων 4 μη μηδενικών στοιχείων. Απάντηση: k = find(x,4,'last')=[3 32 34 36] 3 Χ = 8 4 32 28 36 7 33 29 21 17 13 23 1 18 25 15 11
Βασικές Συναρτήσεις της Matlab Εύρεση στοιχείων που ικανοποιούν πολλαπλές συνθήκες Παράδειγμα: Να βρεθούν τα πρώτα τρία στοιχεία ενός 4x4 πίνακα τα οποία είναι μεγαλύτερα του και μικρότερα του 1. Να οριστούν δύο έξοδοι για την επιστροφή των κατά γραμμές και κατά στήλες δεικτών στα στοιχεία, δηλ. των i,j. Έστω Χ = 18 8 9 4 3 1 14 3 1 11 6 15 11 3 1 21 Απάντηση: Γράφοντας [row,col] = find(x> & X<1,3), το αποτέλεσμα είναι: row =[2 3 4] και col=[1 1 1] Το πρώτο στοιχείο είναι το X(2,1), δηλαδή το 8.
Βασικές Συναρτήσεις της Matlab Η C = dot(a,b) επιστρέφει το εσωτερικό γινόμενο των Α και B. Αν A και B είναι διανύσματα, τότε αυτά θα πρέπει να έχουν το ίδιο μήκος. Αν A και B είναι πίνακες τότε αυτοί θα πρέπει να έχουν το ίδιο μέγεθος. Σε αυτή τη περίπτωση, η συνάρτηση dot χειρίζεται τους A και B σαν συλλογές διανυσμάτων. Η συνάρτηση υπολογίζει το εσωτερικό γινόμενο των αντίστοιχων διανυσμάτων κατά μήκος της πρώτης διάστασης του πίνακα του οποίου το μέγεθος δεν είναι ίσο με 1. Παράδειγμα 1: Αν A = [4-1 2]; B = [2-2 -1]; τότε C = dot(a,b)=8=a(1)*b(1) + A(2)*B(2) + A(3)*B(3)
Βασικές Συναρτήσεις της Matlab Παράδειγμα 2: A = [1 2 3;4 5 6;7 8 9]; B = [9 8 7;6 5 4;3 2 1]; C = dot(a,b)= 54 57 54 Το αποτέλεσμα, C, περιέχει τρία διαφορετικά εσωτερικά γινόμενα. Η συνάρτηση dot χειρίζεται τις στήλες των A και B σαν διανύσματα και υπολογίζει το εσωτερικό γινόμενο των αντίστοιχων στηλών. Έτσι, για παράδειγμα, C(1) = 54 είναι το εσωτερικό γινόμενο της A(:,1) με την B(:,1).
Βασικές Συναρτήσεις της Matlab Η C = dot(a,b,dim) εκτιμά το εσωτερικό γινόμενο των A και B κατά μήκος της διάστασης dim. Η dim είσοδος είναι ένας θετικός βαθμωτός ακέραιος. Θεωρούμε δύο πίνακας A και B διάστασης 2: Η dot(a,b,1) χειρίζεται τις στήλες των A και B σαν διανύσματα και επιστρέφει το εσωτερικό γινόμενο των αντίστοιχων στηλών. Η dot(a,b,2) χειρίζεται τις στήλες των A και B σαν διανύσματα και επιστρέφει το εσωτερικό γινόμενο των αντίστοιχων γραμμών.
Βασικές Συναρτήσεις της Matlab Παράδειγμα: A = [1 2 3;4 5 6;7 8 9]; B = [9 8 7;6 5 4;3 2 1]; D = dot(a,b,2)= 46 73 46 Σε αυτή την περίπτωση, D(1) = 46 είναι το εσωτερικό γινόμενο του A(1,:) με το B(1,:).
Η τροποποιημένη μέθοδος των δυνάμεων Η μέθοδος αυτή υπολογίζει τη μεγαλύτερη κατά μέτρο ιδιοτιμή nxn ενός τετραγωνικού πίνακα Α C και το αντίστοιχο ιδιοδιάνυσμα. Στη συνέχεια δίνεται η συνάρτηση eig_power.m που υλοποιεί τη μέθοδο των δυνάμεων για την προσέγγιση της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος ενός πίνακα Α.
Η τροποποιημένη μέθοδος των δυνάμεων function [lambda,znew] = eig_power(a,y,tol,maxiter) % Συνάρτηση για την προσέγγιση της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος ενός πίνακα Α. lambda=; % Εύρεση ακέραιου p τέτοιου ώστε yp =max yi, i=1,...,n p=min(find (abs(y)==max(abs(y)))); % Βρίσκει τη θέση ji disp('p'); disp(p); pp=norm(y, Inf);% Βρίσκει τη norm του άπειρον. disp('pp'); disp(pp); z=y/y(p); % Το ιδιοδιάνυσμα disp('z'); disp(z); znew=z;
Η τροποποιημένη μέθοδος των δυνάμεων for i=1:maxiter disp( Επανάληψη:'); disp(i); ynew=a*znew; disp('ynew'); disp(ynew); %Βήμα 5.1 pp=norm(ynew, Inf); disp('pp'); disp(pp); % Εύρεση norm του άπειρον lambda=ynew(p); disp('lambda'); disp(lambda); % Βήμα 5.2 p=min(find (abs(ynew)==max(abs(ynew)))); disp('p'); disp(p); % Βήμα 5.4 znew=ynew/ynew(p); disp('znew');disp(znew); %Βήμα 5.5 disp(' lambda-lambda '); disp(abs(lambda-lambda)); if abs(lambda-lambda)<tol disp('lambda');disp(lambda); disp('z(znew)');disp(znew); return; end; lambda=lambda; disp('lambda'); disp(lambda); end;%for if abs(lambda-lambda)>=tol s=sprintf( Όχι σύγκλιση μετά από %d, επαναλήψεις', maxiter); disp(s); end;
Η τροποποιημένη μέθοδος των δυνάμεων Στη συνέχεια δίνεται το script σε MATLAB που καλεί τη συνάρτηση που υλοποιεί τη μέθοδο των δυνάμεων για την εύρεση της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος του πίνακα Α (main_power_method.m): A=[-2-2 3; -1-1 6; 1-2 -9]; disp('a'); disp(a); n=3;nn=3; [n nn]=size(a); y=[1 ]'; disp('y'); disp(y); nz=1;n1=3; [n1 nz]=size(y); maxiter=1; tol=.13; %1e-8;
Η τροποποιημένη μέθοδος των δυνάμεων if (n~=nn) disp( Λάθος της μεθόδου δυνάμεων: Ο πίνακας Α πρέπει να είναι τετραγωνικός');return; elseif (n~=n1) disp( Λάθος της μεθόδου δυνάμεων: Οι διαστάσεις του πίνακα Α και του διανύσματος y δεν είναι συμβατές');return; end; %Εύρεση ιδιοτιμών του Α με χρήση της eig idiotimes=eig(a); disp('idiotimes tou A'); disp(idiotimes); % προσέγγιση της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος. [lambda_max,zmax] = eig_power(a,y,tol,maxiter)
Η τροποποιημένη μέθοδος των δυνάμεων Αποτελέσματα από την εκτέλεση του προγράμματος. A -2-2 3-1 -1 6 Επανάληψη: 1 1-2 -9 p=1 %Εύρεση ακέραιου p pp=1=max{ 1,, } y 1 lambda= tol=.13 Ιδιοτιμές του A 3. -12. -3. z=[1 ] =z () ynew=[-2 1 1] =y (1) pp=1=max{ -2, -1, 1 } lambda=-2=λ 1 lambda-lambda =2>tol znew=[.2 1-1] =z (1)
Η τροποποιημένη μέθοδος των δυνάμεων Επανάληψη: 2 p=2 %Εύρεση ακέραιου p ynew=[-5.4-9 9] =y (2) pp=9=max{ -5.4, -9, 9 } lambda=-9=λ 2 lambda-lambda =7>tol znew=[.6 1-1] =z (2) Επανάληψη: 3 p=2 %Εύρεση ακέραιου p ynew=[-6.2-13 13] =y (3) pp=13=max{ -6.2, -13, 13 } lambda=-13=λ 3 lambda-lambda =4>tol znew=[.4769 1-1] =z (3)
Η τροποποιημένη μέθοδος των δυνάμεων Επανάληψη: 4 p=2 %Εύρεση ακέραιου p ynew=[-5.9538-11.7632 11.7632] =y (4) pp=11.7692 =max{ -5.9538, -11.763213, 11.7632 } lambda=-11.7692=λ 4 lambda-lambda =1.238>tol znew=[.559 1-1] =z (4) Επανάληψη:5 p=2 %Εύρεση ακέραιου p ynew=[-6.118-12.588 12.588] =y (5) pp=12.588 =max{ -6.118, -12.588, 12.588 } lambda=-12.588=λ 4 lambda-lambda =.2896>tol znew=[.4985 1-1] =z (5)
Η τροποποιημένη μέθοδος των δυνάμεων Επανάληψη: 6 p=2 %Εύρεση ακέραιου p ynew=[-5.9971-11.9854 11.9854] =y (6) pp=11.9854 =max{ -5.9971, -11.9854, 11.9854 } lambda=-11.9854=λ 5 lambda-lambda =.735<tol znew=[.54 1-1] =z (6) Συμπέρασμα Η προσέγγιση της μεγαλύτερης ιδιοτιμής είναι η: lambda=-11.9854 Και το αντίστοιχο ιδιοδιάνυσμα είναι το: znew=[.54 1-1]
Η μέθοδος των πηλίκων του Rayleigh Στην περίπτωση που ο πίνακας Α είναι πραγματικός και συμμετρικός, τότε είναι δυνατόν να επιταχυνθεί η σύγκλιση προς τη μεγαλύτερη κατά απόλυτη τιμή ιδιοτιμή χρησιμοποιώντας τη μέθοδο των πηλίκων του Rayleigh. Στη συνέχεια δίνεται η συνάρτηση rayleigh.m που υλοποιεί τη μέθοδο των πηλίκων του Rayleigh για την προσέγγιση της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος ενός πίνακα Α.
Η μέθοδος των πηλίκων του Rayleigh function [lambda,znew] = rayleigh(a,y,tol,maxiter) % Συνάρτηση για τον υπολογισμό της μεγαλύτερης κατά % μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος με % τη μέθοδο των πηλίκων του Rayleigh lambda=; z=y/norm(y); disp('z'); disp(z); znew=z; for i=1:maxiter disp( Επανάληψη');disp(i); ynew=a*znew; disp('ynew');disp(ynew); lambda=dot(znew, ynew); disp('lambda'); disp(lambda);
Η μέθοδος των πηλίκων του Rayleigh if (norm(ynew)==) disp( Ο A έχει ιδιοτιμή, επίλεξε νέο αρχικό διάνυσμα και άρχισε πάλι τη διαδικασία); return; end; znew=ynew/norm(ynew); disp('znew'); disp(znew); disp(' lambda-lambda '); disp(abs(lambda-lambda)); if abs(lambda-lambda)<tol disp('lambda');disp(lambda); disp('z(znew)');disp(znew); return; end; lambda=lambda; disp('lambda'); disp(lambda); end; %for if abs(lambda-lambda)>=tol s=sprintf( Όχι σύγκλιση μετά από %d, επαναλήψεις', maxiter); disp(s); end;
Η μέθοδος των πηλίκων του Rayleigh Στη συνέχεια δίνεται το script σε MATLAB που καλεί τη συνάρτηση που υλοποιεί τη μέθοδο των πηλίκων του Rayleigh για την εύρεση της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος του πίνακα Α (main_rayleigh.m): A=[3-1 ; -1 2-1; -1 3]; disp('a'); disp(a); n=3; nn=3; [n nn]=size(a); y=[1 1 1]'; disp('y');disp(y); nz=1; n1=3; [n1 nz]=size(y); maxiter=2;% 1; tol=.13;
Η μέθοδος των πηλίκων του Rayleigh if (n~=nn) disp( Λάθος της μεθόδου των πηλίκων Rayleigh. Ο πίνακας πρέπει να είναι τετραγωνικός');return; elseif (n~=n1) disp( Λάθος της μεθόδου των πηλίκων Rayleigh. Οι διαστάσεις του πίνακα Α και του διανύσματος y δεν είναι συμβατές');return; end; % Εύρεση ιδιοτιμών του Α με χρήση της eig idiotimes=eig(a); disp('idiotimes'); disp(idiotimes); % Υπολογισμός της μεγαλύτερης κατά μέτρο ιδιοτιμής και του αντίστοιχου ιδιοδιανύσματος. [lambda_max,zmax] = rayleigh(a,y,tol,maxiter)
Η μέθοδος των πηλίκων του Rayleigh Αποτελέσματα από την εκτέλεση του προγράμματος A y 3-1 -1 2-1 -1 3 1 1 1 Ιδιοτιμές με χρήση της eig. 1. 3. 4. maxiter=1; tol=.13; lambda= Επανάληψη: 1 z=[.5774.5774.5774] =z () ynew=[1.1547 1.1547] =y (1) lambda=1.3333=λ 1 lambda-lambda =1.3333>tol znew=[.771.771] =z (1) Επανάληψη: 2 ynew=[2.1213-1.4142 2.1213] =y (2) lambda=3=λ 2 lambda-lambda =1.6667>tol znew=[.6396 -.4264.6396] =z (2)
Η μέθοδος των πηλίκων του Rayleigh Επανάληψη: 3 ynew=[2.3452-2.132 2.3452] =y (3) lambda=3.991=λ 3 lambda-lambda =.991>tol znew=[.5948 -.547.5948] =z (3) Επανάληψη: 4 ynew=[2.3252-2.2711 2.3252] =y (4) lambda=3.9942=λ 4 lambda-lambda =.851<tol znew=[.5848 -.5683.5818] =z (4) Συμπέρασμα Η προσέγγιση της μεγαλύτερης ιδιοτιμής είναι η: lambda=3.9942 Και το αντίστοιχο ιδιοδιάνυσμα είναι το: znew=[.5848 -.5683.5848]