Μαρία Λουκά Εργαστήριο Matlab Επαναληπτικές Μέθοδοι Τμήμα Πληροφορικής και Τηλεπικοινωνιών.
Βασικές συναρτήσεις του Matlab diag: Χρησιμοποιείται για τη δημιουργία ενός διαγώνιου πίνακα ή για την λήψη των διαγώνιων στοιχείων ενός πίνακα. D = diag(v) : Επιστρέφει έναν τετραγωνικό διαγώνιο πίνακα με τα στοιχεία του διανύσματος v στην κύρια διαγώνιο. Παράδειγμα: Έστω v = [2 - -2-5]; D = diag(v) = 2 2 5
Βασικές συναρτήσεις του Matlab D = diag(v,k) : Τοποθετεί τα στοιχεία του διανύσματος v στην k διαγώνιο. Με k= συμβολίζουμε τα στοιχεία στην κύρια διαγώνιο Με k> συμβολίζουμε τα στοιχεία πάνω από την κύρια διαγώνιο Με k< συμβολίζουμε τα στοιχεία κάτω από την κύρια διαγώνιο. Παράδειγμα: Έστω v = [2 - -2-5]; D = diag(v,) = 5 2 2
Βασικές συναρτήσεις του Matlab x = diag(a) : επιστρέφει ένα διάνυσμα στήλη με τα στοιχεία της κύριας διαγωνίου του Α. Παράδειγμα: Αν A = Τότε x = diag(a) = 2 5 2 4 6 3 7 5 2 7 3 8 7 2 8 5 6 8 7 8 3 2 6
Βασικές συναρτήσεις του Matlab x = diag(a,k) : επιστρέφει ένα διάνυσμα στήλη με τα στοιχεία της k-διαγωνίου του Α. Παράδειγμα: Αν A = Τότε x = diag(a,-)= 5 2 Δηλαδή επιστρέφει το διάνυσμα με τα στοιχεία της ης διαγωνίου κάτω από την κύρια διαγώνιο. 2 7 3 3 6 2 6 5 5 4 8 7 7 8 8 7 2 2 8 3 5
Βασικές συναρτήσεις του Matlab Προσοχή: Για τη δημιουργία του διαγώνιου πίνακα θα πρέπει να καλέσουμε τη συνάρτηση diag 2 φορές. Παράδειγμα : Αν Α= Τότε D=diag(diag(A))= 2 5 2 4 6 3 7 5 2 7 3 8 7 2 8 5 6 8 7 8 3 2 6
Βασικές συναρτήσεις του Matlab tril: Επιστρέφει το κάτω τριγωνικό μέρος ενός πίνακα. Ειδικότερα: L = tril(x) : επιστρέφει το κάτω τριγωνικό μέρος του X. Παράδειγμα: tril(ones(4,4))=
Βασικές συναρτήσεις του Matlab L = tril(x,k) : επιστρέφει τα στοιχεία επί και κάτω από την k διαγώνιο του X. Με k= συμβολίζουμε τα στοιχεία στην κύρια διαγώνιο Με k> συμβολίζουμε τα στοιχεία πάνω από την κύρια διαγώνιο Με k< συμβολίζουμε τα στοιχεία κάτω από την κύρια διαγώνιο. Παράδειγμα: tril(ones(4,4),-)=
Βασικές συναρτήσεις του Matlab triu: Επιστρέφει το πάνω τριγωνικό μέρος ενός πίνακα. Ειδικότερα: U = triu(x) : επιστρέφει το πάνω τριγωνικό μέρος του X. Παράδειγμα: triu(ones(4,4))=
Βασικές συναρτήσεις του Matlab U = triu(x,k) : επιστρέφει τα στοιχεία επί και πάνω από την k διαγώνιο του X. Με k= συμβολίζουμε τα στοιχεία στην κύρια διαγώνιο Με k> συμβολίζουμε τα στοιχεία πάνω από την κύρια διαγώνιο Με k< συμβολίζουμε τα στοιχεία κάτω από την κύρια διαγώνιο. Παράδειγμα : triu(ones(4,4),-)=
Βασικές συναρτήσεις του Matlab Παράδειγμα 2: triu(ones(4,4), )= norm: Μέτρο διανύσματος ή πίνακα n = norm(v) : επιστρέφει την 2-norm ή Ευκλείδεια norm του διανύσματος v. Παράδειγμα: Αν X = [-2 3 -]; Τότε n = norm(x)=3.747
Βασικές συναρτήσεις του Matlab n = norm(v,p) : επιστρέφει το διάνυσμα που ορίζεται από το sum(abs(v)^p)^(/p), όπου p είναι οποιαδήποτε θετική πραγματική τιμή, Inf, ή -Inf. Αν το p είναι Inf, τότε n = max(abs(v)). Αν το p είναι -Inf, τότε n = min(abs(v)). Παράδειγμα: Αν X = [-2 3 -]; τότε n=norm(x,inf)=3 και n2=norm(x,-inf)=
Βασικές συναρτήσεις του Matlab cputime : Επιστρέφει το συνολικό CPU χρόνο (σε δευτερόλεπτα) από τη στιγμή έναρξης της MATLAB εφαρμογή μας μέχρι τη λήξη της. Παράδειγμα: Ο ακόλουθος κώδικας επιστρέφει τον cpu χρόνο που χρειάζεται για να «τρέξει» την surf(peaks(4)); t = cputime; surf(peaks(4)); e = cputime-t Απάντηση: e =.4667
Βασικές συναρτήσεις του Matlab Με την εντολή continue μπορούμε να αγνοήσουμε την εκτέλεση του κώδικα για κάποια τιμή στην επανάληψη. Παράδειγμα for i = :5 if ( i == 3 ) continue end; fprintf( i = %2.f\n', i); end; Το διπλανό τμήμα κώδικα θα έχει το παρακάτω αποτέλεσμα : i = i = 2 i = 4 i = 5
Βασικές συναρτήσεις του Matlab Η διακοπή από ένα βρόχο for ή while μπορεί να γίνει με την εντολή break. Παράδειγμα sum = ; for i = : if ( sum > 2 ) break end; sum = sum + i; end; fprintf( i = %2.f sum = %2.f\n', i, sum); Το παραπάνω τμήμα κώδικα θα έχει το ακόλουθο αποτέλεσμα : i = 5 sum = 5
Βασικές συναρτήσεις του Matlab Η εντολή error Η εντολή error( message ) τοποθετείται εντός μιας επαναληπτικής δομής είτε σε ένα αρχείο κειμένου (script file), είτε σε ένα αρχείο συνάρτησης (function file). Με τη χρήση της δομής αυτής σταματά αυτόματα η εκτέλεση του αρχείου, εμφανίζεται στην οθόνη ένα μήνυμα λάθους και το σύστημα επιστρέφει τον έλεγχο στο πληκτρολόγιο και το παράθυρο εντολών.
Βασικές συναρτήσεις του Matlab Συναρτήσεις επεξεργασίας πινάκων length(v) size(a) ndims(a) numel(a) max(a) εμφανίζει το πλήθος των στοιχείων ενός διανύσματος εμφανίζει το πλήθος των σειρών και των στηλών ενός πίνακα εμφανίζει τον αριθμό των διαστάσεων ενός πίνακα εμφανίζει τον αριθμό των στοιχείων ενός πίνακα εμφανίζει τη μέγιστη τιμή από κάθε μια στήλη του πίνακα
Βασικές συναρτήσεις του Matlab min(a) mean(a) std(a) rot(a) fliplr(a) flipud(a) εμφανίζει την ελάχιστη τιμή από κάθε μια στήλη του πίνακα εμφανίζει το μέσο όρο των τιμών των στοιχείων κάθε στήλης του πίνακα εμφανίζει την τυπική απόκλιση των τιμών των στοιχείων κάθε στήλης ενός πίνακα στρέφει κατά ο ένα πίνακα μεταθέτει τα στοιχεία ενός πίνακα από αριστερά προς δεξιά μεταθέτει τα στοιχεία ενός πίνακα από πάνω προς τα κάτω
Μέθοδος SOR Υπολογισμός επαναλήψεων για τη σύγκλιση της μεθόδου. n=3; A=[2 - ; - 2 -; - 2]; b=[ ]'; tol=.; %Ανεκτικότητα maxits=3; %Μέγιστος αριθμός επαναλήψεων itcount=; %Αρχικοποίηση μετρητή CL=-tril(A, -); % Υπολογισμός κάτω τριγωνικού μέρους του πίνακα Α CU=-triu(A, ); % Υπολογισμός άνω τριγωνικού μέρους του πίνακα Α I=eye(n); % Υπολογισμός μοναδιαίου πίνακα D=diag(diag(A)); % Υπολογισμός διαγώνιου πίνακα D=inv(D); % Υπολογισμός αντίστροφου του διαγώνιου πίνακα L=D*CL; U=D*CU; B=L+U; %disp('b'); disp(b); % Πίνακας Jacobi x=eig(b); % disp(x); % Ιδιοτιμές του πίνακα B (Jacobi) rb=max(abs(x)); % disp(' rb'); disp( rb); % Υπολογισμός Φασματικής ακτίνας του Β omega=2./(.+sqrt(-rb*rb)); % disp('omega'); disp(omega); % Θεωρητική τιμή του ω x=[ ]'; x=x;
Αποτελέσματα SOR μεθόδου CL CU D.5.5.5 L.5.5 D 2 2 2 U.5.5
Μέθοδος SOR t=tic; while itcount<=maxits x=x; x=inv(i-omega*l)*((-omega)*i+omega*u)*x+omega*inv(i-omega*l)*d*b; nm=norm(x-x, Inf); if nm<tol disp('siglisi se'); disp(itcount); disp('epanalipseis'); break; end itcount=itcount+; end % while if nm>tol disp( όχι σύγκλιση μετά από'); disp(maxits); disp( επαναλήψεις'); end disp('x'); disp(x); e=toc(t); disp('e=cputime');disp(e); %συνολικός χρόνος εκτέλεσης της SOR μεθόδου
Αποτελέσματα SOR μεθόδου %Φασματική ακτίνα του Β rb.77 %Θεωρητική τιμή του ω omega.76 x.442.8284.85 nm.8284>. % η επανάληψη x
Αποτελέσματα SOR μεθόδου 2η επανάληψη x.442.8284.85 x..76. nm.5858>. 3η επανάληψη x..76. x.828.4.7 nm.244>.
Αποτελέσματα SOR μεθόδου 4η επανάληψη x.828.4.7 x... nm.72>. 5η επανάληψη x... x.5.. nm 7.787e-4<.
Αποτελέσματα SOR μεθόδου Σύγκλιση σε 4 επαναλήψεις. Η λύση του συστήματος είναι η ακόλουθη: x.5.. Συνολικός χρόνος εκτέλεσης της SOR μεθόδου. e=cputime.255
Μέθοδος SOR Στη συνέχεια θα προσδιορίσουμε πειραματικά την ελάχιστη τιμή της φασματικής ακτίνας για την SOR μέθοδο. Έστω το γραμμικό σύστημα Αx=b με πίνακα Α= 6/5 2 /5 /5 /5 7. /5.3 O επαναληπτικός πίνακας της SOR μεθόδου είναι ο: L ( D ωc ) [( ω)d + ωc ] = ( I ωl) [( ω) I ωu] ω = L U +
Μέθοδος SOR Ο κώδικας: disp('methodos SOR'); n=4; A=[ /5 /5; -7..3; 6/5 /5 ; 2 /5 ] CL=-tril(A, -); CU=-triu(A, ); I=eye(n); D=diag(diag(A));
Μέθοδος SOR % Δημιουργία των L και U D=inv(D); L=D*CL; U=D*CU; % Πίνακας Jacobi B=L+U; % Εύρεση ιδιοτιμών του πίνακα Β (Jacobi) x=eig(b); disp(x);.78.52 -.78 -.52
Μέθοδος SOR % Υπολογισμός φασματικής ακτίνας του Β και θεωρητικής τιμής του ω rb=max(abs(x)); % disp(' rb'); disp( rb); omega=2./(.+sqrt(-rb*rb)); %disp('omega'); disp(omega); rb=.78 omega=.6667 % Αρχικοποίηση μεταβλητών col=; mm=; % Άνοιγμα αρχείου για αποθήκευση τιμών fid6=fopen('sor.txt','a+'); fprintf(fid6, 'w r \n\n'); Εντολές fclose(fid6); %Κλείσιμο αρχείου
Μέθοδος SOR Εντολές for omega=.:.:2. L=I-omega*L; La=inv(L); % Δημιουργία επαναληπτικού πίνακα Lw=La*((-omega)*I+omega*U); lambda=eig(lw); s_sor=max(abs(lambda)); fprintf(fid6, '%f %f \n\n',omega, s_sor);..
Μέθοδος SOR %Αποθήκευση αποτελεσμάτων σε πίνακες για τη δημιουργία γραφικής %παράστασης col=col+; % καταχώριση των πειραματικών τιμών του ω και της φασματικής ακτίνας % σε πίνακες finw(col,)=omega; fins(col,)=s_sor; %disp(finw); disp(fins); % σχεδίαση της γραφικής παράστασης plot(finw,fins,'r-'); % plot(finw,fins,'r-',finw,finss,'go'); %Σχεδίαση 2 γραφικών παραστάσεων % αν είχαμε % Τίτλοι xlabel('\omega'); ylabel( \rho(l_{\omega_})'); title('behavior of \rho(l_{\omega_} with respect to \omega'); Παρατήρηση: Πλήρης συνεργασία Matlab και Latex
Μέθοδος SOR disp('ypologismos elaxistou apo peiramatiko prosdiorismo'); [elaxs, thesi]=min(fins); wopt=finw(thesi,); disp('wopt'); disp(wopt); disp('elaxs');disp(elaxs); disp('thesi');disp(thesi); mm=mm+; end %for
Μέθοδος SOR Αποτελέσματα εκτέλεσης του προγράμματος A =..2.2. -7..3 3.2.2. 2..2. CU= -.2 -.2 7. -.3 CL= -3.2 -.2-2. -.2 D= Αφού D=I -> inv(d)=i, άρα L=CL και U=CU
Μέθοδος SOR Ypologismos elaxistou apo peiramatiko prosdiorismo wopt elaxs thesi Wopt. elaxs.7 thesi 2 wopt.2 elaxs.55 thesi 3 wopt.3 elaxs.2 thesi 4 wopt.4 elaxs.8 thesi 5 wopt.5 elaxs.866 thesi 6 wopt.6 elaxs.828 thesi 7 wopt.7 elaxs.784 thesi 8 wopt.8 elaxs.733 thesi
Μέθοδος SOR wopt. elaxs.673 thesi wopt.5 elaxs.873 thesi 6 wopt elaxs.6 thesi Wopt.6 elaxs.86 thesi 7 wopt. elaxs.5 thesi 2 wopt.7 elaxs.7 thesi 8 Wopt.2 elaxs.38 thesi 3 wopt.7 elaxs.7 thesi 8 wopt.3 elaxs.25 thesi 4 wopt.7 elaxs.7 thesi 8 wopt.4 elaxs.48 thesi 5 wopt.7 elaxs.7 thesi 8
Μέθοδος SOR SOR.txt... 2...7875 3..2.552 4..3.282 5..4.843 6..5.8666 7..6.828 8..7.7844..8.7333...67262...6 2...586 3..2.384 4..3.255 5..4.4757 6..5.8733 7..6.862 8..7.7..8.8 2... 2. 2.. Παρατήρηση: ω_th=ω_exp
Μέθοδος SOR
Μέθοδος SOR
Ρυθμίσεις γραφικής παράστασης
Συναρτήσεις του Matlab Η συνάρτηση fliplr Η συνάρτηση fliplr(a) επιστρέφει έναν πίνακα Α με τις στήλες του να έχουν περιστραφεί με κατεύθυνση από αριστερά προς τα δεξιά γύρω από ένα κάθετο άξονα. Αν ο A είναι ένα διάνυσμα γραμμή τότε η fliplr(a) επιστρέφει ένα διάνυσμα ίδιου μήκους αλλά με αντεστραμμένη τη διάταξη των στοιχείων του. Αν ο A είναι ένα διάνυσμα στήλη τότε η fliplr(a) απλά επιστρέφει τον Α. Παράδειγμα : Έστω A = :, δηλαδή A = 2 3 4 5 6 7 8. Τότε B = fliplr(a)= 8 7 6 5 4 3 2 Παράδειγμα 2: A = {'a' 'b' 'c'; 'd' 'e' 'f'; 'g' 'h' 'i'}= 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' B = fliplr(a)= 'c' 'b' 'a' 'f' 'e' 'd' 'i' 'h' 'g'
Συναρτήσεις του Matlab Η συνάρτηση flipud Η συνάρτηση B = flipud(a) επιστρέφει τον πίνακα A με τις γραμμές του αντεστραμμένες πάνω κάτω δηλ. γύρω από ένα οριζόντιο άξονα. Αν ο A είναι ένα διάνυσμα στήλη τότε η flipud(a) επιστρέφει ένα διάνυσμα ίδιου μήκους με αντεστραμμένη τη διάταξη των στοιχείων του. Αν ο A είναι ένα διάνυσμα γραμμή, τότε η flipud(a) απλά επιστρέφει τον Α. Παράδειγμα : Αν A=(:) = 2 3 4 5 6 7 8 τότε B = flipud(a)= 8 7 6 5 4 3 2
Συναρτήσεις του Matlab Παράδειγμα 2: Αν A = {'a' 'b' 'c'; 'd' 'e' 'f'; 'g' 'h' 'i'}, δηλ. 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i τότε B = flipud(a)= 'g' 'h' 'i' 'd' 'e' 'f' 'a' 'b' 'c'
Συναρτήσεις του Matlab Η συνάρτηση get Η συνάρτηση get θέτει ερωτήματα επί των γραφικών παραστάσεων. Η v = get(h) επιστρέφει όλες τις ιδιότητες και τις τιμές για τα αντικείμενα που ορίζονται από το h. Παράδειγμα: Αν p = plot(:); get(p), τότε εμφανίζεται η ακόλουθη λίστα AlignVertexCenters: 'off' Annotation: [x matlab.graphics.eventdata.annotation] BeingDeleted: 'off' BusyAction: 'queue' ButtonDownFcn: '' Children: [] Clipping: 'on' Color: [.2.64.25] CreateFcn: '' DeleteFcn: '' DisplayName: '' HandleVisibility: 'on' HitTest: 'on' Interruptible: 'on LineStyle: '-' LineWidth:.5 Marker: 'none' MarkerEdgeColor: 'auto' MarkerFaceColor: 'none' MarkerSize: 6 Parent: [x Axes] PickableParts: 'visible' Selected: 'off' SelectionHighlight: 'on' Tag: '' Type: 'line' UIContextMenu: [] UserData: [] Visible: 'on' XData: [ 2 3 4 5 6 7 8 ] XDataMode: 'auto' XDataSource: '' YData: [ 2 3 4 5 6 7 8 ] YDataSource: '' ZData: [x double] ZDataSource: ''
Συναρτήσεις του Matlab Η v = get(h, propertyname ) επιστρέφει την τιμή μόνο της συγκεκριμένης ιδιότητας. Παράδειγμα : p = plot(:);get(p,'linewidth') Απάντηση:.5 Παράδειγμα 2: p = plot(:,'ro-'); props = {'LineWidth','Marker','MarkerSize'}; get(p,props) Απάντηση: [.5] 'o' [6]
Κώδικας 2 clf; mmax=.;col=; for t=.:.:. hw2=((2.-t)/(t*mmax))+t/2.; %disp('hw2');disp(hw2);% τιμή εισόδου lw2=t-(/mmax);%disp('lw2');disp(lw2);% τιμή εισόδου col=col+; %προσαύξηση μετρητή % Δημιουργία πινάκων για τη γραφική παράσταση tt(col,)=t; w_up(col,)=hw2; w_low(col,)=lw2; % Υπολογισμός των ανάστροφων πινάκων ttt=transpose(tt); w_up=transpose(w_up); w_low=transpose(w_low); T=[ttt,fliplr(ttt)]; % Δημιουργία πίνακα Τ W=[w_up, fliplr(w_low)]; % Δημιουργία πίνακα W fill(t,w,[.,.,.]); box off; end; %for t
Κώδικας 2 h = xlabel('\tau'); % Create label pos = get(h,'pos'); % Read position [x y z] set(h,'pos',pos+[. ]) % Move label to right h = ylabel('{\omega_2}','rot',); % Create label and rotate pos = get(h,'pos'); % Read position [x y z] set(h,'pos',pos+[-..5 ]) % Move label to up text('interpreter','latex',... 'string','$\bar\omega_2(\tau)=\frac{2- \tau}{\tau\mu_{max}}+\frac{\tau}{2}$',...'fontsize',2,'position',[.27,7.5]); text('interpreter','latex',... 'string','$\underline\omega_2(\tau)=\tau- \frac{}{\mu_{max}}$',... 'FontSize',2,'position',[.55,-.5]); text('interpreter','latex',... 'string','convergence',...'fontsize', 2, 'position', [.2,.5]);
Convergence area of the x method for μmax =..