ΜΑΣ 9. Μαθηματικά με Υπολογιστές Διδάσκων: Γιώργος Γεωργίου Ενδιάμεση εξέταση Θεωρία 6 Μαρτίου 7 ΟΝΟΜΑ: ΑΤ:. Πρόβλημα Να συμπληρωθούν οι δύο εντολές της MATLAB που λείπουν: >> A=[ +i; -i ]; >> Εντολή.. +.i -.i. >> Εντολή A =.. +.i -.i. >> μ. >> A=[ +i; -i ]; >> disp(a).. +.i -.i. >> A A =.. +.i -.i. Σημείωση: Αντί της >> A μπορούμε ισοδύναμα να χρησιμοποιήσουμε την >> display(a) A =.. +.i -.i. Στην πραγματικότητα, το m-file display.m καλεί την εντολή disp. Για περισσότερες πληροφορίες δοκιμάστε την help display.
Πρόβλημα Να συμπληρωθούν οι τρεις εντολές της MATLAB που λείπουν: >> Εντολή Your variables are: A A A3 AB Bas u >> Εντολή Name Size Bytes Class Attributes A x 8 double A x 8 double A3 x 8 double AB 3x3 7 double Bas x 8 double u x4 3 double >> Εντολή 3 Your variables are: A A A3 AB μ. >> who Your variables are: A A A3 AB Bas u >> whos Name Size Bytes Class Attributes A x 8 double A x 8 double A3 x 8 double AB 3x3 7 double Bas x 8 double u x4 3 double >> who A* Your variables are: A A A3 AB
Πρόβλημα 3 Με δεδομένο ότι η τιμή του x δεν αλλάζει, συμπληρώστε τις τέσσερις εντολές ΜΑΤLAB που λείπουν: >> x=exp(-).353 >> Εντολή >> x.35335833663 >> Εντολή >> x.35335833667e- >> Εντολή 3 >> x 39/43 >> Εντολή 4 >> x.4 μ. >> x=exp(-).353 >> format long >> x.35335833663 >> format long e >> x.35335833667e- >> format rat >> x 39/43 >> format bank >> x.4 3
Πρόβλημα 4 (α) Ορίστε στη MATLAB τα εξής: A = 4 3 3 4 και b = 3 μ. Γράψτε τις εντολές της MATLAB που υπολογίζουν τα ακόλουθα: (β) Την ορίζουσα και τον βαθμό του Α. μ. (γ) Τον ανάστροφο και τον αντίστροφο του Α. μ. (δ) Τις ιδιοτιμές και τα ιδιοδιανύσματα του Α. μ. (ε) Τη λύση του συστήματος Ax=b μ. (α) (β) (γ) (δ) >> A=[ ; - ; 4 3 ; 3 4] A = - 4 3 3 4 >> b=[; ; ; 3] b = 3 >> det(a) - >> rank(a) 4 >> A' - 4 3 3 4 >> inv(a).3 -.3. -. -.4.4. -. 3.9. -.7 -. -.8 -..4. >> [V,D]=eig(A) V = Columns through 3.88.85 -.4 +.76i.95.865 -.5 -.88i.3 -.888 -.5837 +.45i.876.46.7656 4
Column 4 -.4 -.76i -.5 +.88i -.5837 -.45i.7656 D = Columns through 3 5.978 -.59.49 +.637i Column 4.49 -.637i (ε) >> A\b...3.4 5
Πρόβλημα 5 (α) Κατασκευάστε με απλό τρόπο (και όχι με απευθείας εκχώρηση τιμών) τον πίνακα: A = μ. (β) Κατασκευάστε με απλό τρόπο (και όχι με απευθείας εκχώρηση τιμών) τον πίνακα: B = μ. (γ) Κατασκευάστε τους κάτωθι υποπίνακες ενός πίνακα Α: (i) το διάνυσμα που περιέχει το ο, το 4 ο, το 7 ο και το ο στοιχείο της τελευταίας γραμμής του Α (δεδομένου ότι ο Α έχει τουλάχιστον στήλες) μ. (ii) το διάνυσμα που περιέχει το 9 ο, το 7 ο, το 5 ο και το 3 ο στοιχείο της τελευταίας στήλης του Α (δεδομένου ότι ο Α έχει τουλάχιστον 9 γραμμές) μ. (iii) τον υποπίνακα που προκύπτει από την τομή των γραμμών, 4, 7 και και τον στηλών 3, 5, 7 και 9 του Α μ. (iv) τον υποπίνακα που περιέχει το ο, ο, 3 ο και 7 ο στοιχείο της τελευταίας γραμμής του Α. μ. (α) >> A=[ones(3) eye(3)] A = (β) >> A=ones(4,5); >> A(:4,:5)= A = (γ) (i) >> A(,:3:) (ii) >> A(9:-:3,) (iii) >> A(:3:,3::9) (iv) >> A(,[ 3 7]) ή >> A(,[:3 7]) 6
Πρόβλημα 6 Ορίστε τη συνάρτηση f( x) = ln + x x ( e ) όπου το x να μπορεί να είναι διάνυσμα με τους εξής τρόπους: (α) Με function m-file. μ. (β) Με ανώνυμη συνάρτηση. μ. (γ) Με την εντολή inline. μ. (δ) Σχεδιάστε το γράφημα της f στο [,5] με 3 διαφορετικές εντολές. 3 μ. (α) function y=f(x) % F y=log(+exp(x.^-*x)); % End of F (β) (γ) >> f=@(x) log(+exp(x.^-*x)) f = @(x) log(+exp(x.^-*x)) >> f=inline('log(+exp(x.^-*x))','x') f = Inline function: f(x) = log(+exp(x.^-*x)) (δ) ος τρόπος Εντολή plot Με τις εντολές x=:.:5; plot(x,f(x)) παίρνουμε το γράφημα: 6 4 8 6 4.5.5.5 3 3.5 4 4.5 5 ος τρόπος Εντολή fplot Εφόσον έχουμε ορίσει ανώνυμη συνάρτηση ή συνάρτηση inline, με την εντολή >> fplot(f,[,5]) παίρνουμε το γράφημα 7
6 4 8 6 4.5.5.5 3 3.5 4 4.5 5 3 ος τρόπος Εντολή ezplot Χρησιμοποιούμε τη συνάρτηση ezplot: >> ezplot(f,,5) 6 log(+exp(x - x)) 4 8 6 4.5.5.5 3 3.5 4 4.5 5 x 8
Πρόβλημα 7 (α) Πως κατασκευάζεται στη ΜΑΤLAB το πιο κάτω γράφημα; sin(x) - x cos(x) log(x)+x 5-5 4 3-5 5 x exp(x)-x 4 6 x 3 x 3 - x +x- 5 5 5-5 -5 5 x -5 5 x 4 μ. (β) Σχεδιάστε το γράφημα της καμπύλης x + ( y )( + x+ y) = μ. (α) Με τις εντολές >> subplot(,,), ezplot('sin(x) - x*cos(x)') >> subplot(,,), ezplot('log(x)+x^') >> subplot(,,3), ezplot('exp(x)-x') >> subplot(,,4), ezplot('3*x^3-*x^+x-') (β) Με την εντολή >> ezplot('x^+(y^-)*(+x+y)',[-3,3]) παίρνουμε το γράφημα 3 x +(y -) (+x+y) = y - - -3-3 - - 3 x 9
Πρόβλημα 8 (α) Γράψτε μια m-συνάρτηση με όνομα prodfun.m που υπολογίζει το γινόμενο δύο συναρτήσεων f(x) και g(x) στο x. Τα ονόματα των f και g πρέπει να είναι μεταβλητές εισόδου για την prodfun. 4 μ. (β) Πως μπορούμε να σχεδιάσουμε το γράφημα της sinx e x χρησιμοποιώντας το πιο πάνω m-file; μ. (α) Το ζητούμενο m-file έχει ως εξής: function y=prodfun(fname, gname, x) % PRODFUN % Calculates the product f(x)g(x) % y=feval(fname,x).*feval(gname,x); % End of PRODFUN Πιο κάτω βλέπουμε κάποια αποτελέσματα που πήραμε με την prodfun: >> prodfun(@exp,@cos,) >> prodfun(@exp,@cos,pi/4).559 Υπενθυμίζουμε ότι αντί του συμβόλου @, μπορούμε επίσης να δώσουμε τα ονόματα των συναρτήσεων μέσα σε εισαγωγικά: >> prodfun('sin','cos',pi/4).5 >> prodfun('cosh','tan',.) 4.6573 (β) Με τις εντολές >> x=linspace(-3,3); >> plot(x,prodfun(@sin,@exp,x)) παίρνουμε το γράφημα της sinx e x : 8 7 6 5 4 3 - -3 - - 3 Εναλλακτικά θα μπορούσαμε να χρησιμοποιήσουμε και την >> ezplot(@(x) prodfun(@sin, @exp, x))
η οποία παράγει το πιο κάτω γράφημα της sinx e x (μη βιαστείτε να σκεφθείτε ότι έχει γίνει λάθος!): - -4-6 -8 - - -4-6 prodfun(@sin, @exp, x) -8-3 - - 3 4 5 6 x
Πρόβλημα 9 Βρείτε το λάθος σε κάθε μια από τις πιο κάτω εντολές της MATLAB: (α) x=:.:pi; f(x)=+x.^ μ. (β) if m=n μ. (γ) f=*x^-3x+5 μ. και (δ) εξηγήστε τη διαφορά μεταξύ της +3 < + και της +(3<)+. μ. (α) Στο αριστερό μέρος μιας εντολής εκχώρησης δεν μπορούμε να έχουμε εκφράσεις της μορφής f(x) εκτός αν η f είναι διάνυσμα (και όχι συνάρτηση) και το x είναι ακέραιος. Η MATLAB μας δίνει μήνυμα λάθους: >> x=:.:pi; f(x)=+x.^??? Subscript indices must either be real positive integers or logicals. (β) Το if ακολουθείται από λογική πρόταση και όχι εντολή εκχώρησης. Μπορούμε να έχουμε if m==n ή if m <=n κλπ. Η MATLAB μας δίνει μήνυμα λάθους: >> if m=n??? if m=n Error: The expression to the left of the equals sign is not a valid target for an assignment. (γ) Λείπει το σύμβολο * του πολλαπλασιασμού στον όρο 3x. Η MATLAB μας δίνει μήνυμα λάθους: >> f=*x^-3x+5??? f=*x^-3x+5 Error: Unexpected MATLAB expression. (δ) Η +3 < + είναι μια λογική παράσταση με λογική τιμή. Η +(3<)+ είναι ένα άθροισμα που περιλαμβάνει και ένα λογικό (αυτή είναι η τιμή της πρότασης 3<). Η τιμή του είναι φυσικά 3. Πιο κάτω φαίνονται τα αποτελέσματα της MATLAB: >> +3 < + >> whos Name Size Bytes Class Attributes ans x logical >> >> +(3<)+ 3 >> whos Name Size Bytes Class Attributes ans x 8 double
Πρόβλημα Γράψτε με διαφορετικό τρόπο τις πιο κάτω παραστάσεις στη ΜΑΤLΑΒ: (α) + cos(pi) >= (β) eye(3) < ones(3) (γ) or(x>=y, x==round(x)) (δ) le(*rand(3),ones(3)) (ε) gt(delta, e-8) 3 μ. (α) >> ge(+cos(pi), ) (β) (γ) (δ) >> lt(eye(3),ones(3)) >> x>=y x==round(x) ή ge(x,y) eq(x, round(x)) >> *rand(3) <= ones(3) (ε) delta >= e-8 3
Πρόβλημα Γράψτε ένα function m-file με το όνομα series.m και δεδομένo εισόδου ένα φυσικό αριθμό n για τον υπολογισμό του αθροίσματος n k k = + k (α) με τη χρήση βρόχου for. μ. (β) χωρίς τη χρήση βρόχου for. 3 μ. (γ) Με δοσμένο το m-file series.m πως θα κατασκευάζατε το πιο κάτω γράφημα του αθροίσματος συναρτήσει του n στο διάστημα [,]; 3 μ. 3.5 Σ k/(+k ).5.5 4 6 8 4 6 8 n (α) function sum=series(n) % SERIES % Ypologizei to athroisma k/(=k^) % sum=; for k=:n sum=sum+k/(+k^); % End of SERIES (β) function sum=series(n) k=; sum=; while k <= n k=k+; sum=sum+k/(+k^); ή function sum=series(n) x=:n; sum=sum(x./(+x.^)); 4
ή ακόμα (γ) function sum=series(n) sum=sum( (:n)./(+(:n).^) ); >> x=:; >> for k=:, y(k)=series(k); >> plot(x,y,'o'), xlabel('n'), ylabel('σ k/(+k^)') 5
Πρόβλημα Γράψτε ένα function m-file με το όνομα issymmetric.m και δεδομένο εισόδου ένα πραγματικό πίνακα Α που θα ελέγχει αν ο Α είναι τετραγωνικός και αν όχι θα επιστρέφει σχετικό μήνυμα λάθους και θα σταματά. Στην περίπτωση που ο Α είναι τετραγωνικός θα επιστρέφει τη λογική τιμή αν ο Α είναι συμμετρικός και τη λογική τιμή διαφορετικά. 5 μ. Το ζητούμενο m-file έχει ως εξής: function yn=issymmetric(a) % ISSYMMETRIC % Checks whether a matrix A is symmetric % [m,n]=size(a); if m~=n disp('matrix A is not square!') else if A==A' yn=true; else yn=false; %End of ISSYMMETRIC Ακολουθούν μερικά αποτελέσματα που πήραμε με το πρόγραμμα issymmetric.m. >> issymmetric(ones(,3)) Matrix A is not square! >> issymmetric(ones(3,3)) >> issymmetric(eye(4)) >> issymmetric(rand(5)) >> >> whos Name Size Bytes Class Attributes ans x logical Παρατηρούμε λοιπόν ότι η έξοδος είναι λογική μεταβλητή. 6
Πρόβλημα 3 Γράψτε ένα function m-file με το όνομα lowsol.m που θα επιλύει το γραμμικό σύστημα Ax=b με εμπρός αντικατάσταση όταν ο Α είναι κάτω τριγωνικός πίνακας. b / a i xi = bi aikxk / aii, i=,, n k = To m-file πρέπει να ελέγχει τα εξής: αν ο Α είναι τετραγωνικός και αν όχι να επιστρέφει σχετικό μήνυμα λάθους. αν ο Α είναι κάτω τριγωνικός και αν όχι να επιστρέφει σχετικό μήνυμα λάθους. αν οι Α και b έχουν το ίδιο πλήθος στηλών και αν όχι να επιστρέφει σχετικό μήνυμα λάθους. αν ο Α είναι αντιστρέψιμος και αν όχι να επιστρέφει σχετικό μήνυμα λάθους. 5 μ To function m-file είναι το εξής: function [x]=lowsol(a,b) % LOWSOL % Solves AX=b where A is a lower % triangular matrix % % Checks [m,n]=size(a); [mb,nb]=size(b); if m~=n % Check if A is nxn disp('matrix A is not square!') return elseif mb ~= ^ nb ~= % Check if b is a vector disp('b is not a vector!') return elseif mb*nb~=n % Check if b is a nx vector fprintf('b is not a %3.fx vector! \n',n) return elseif det(a) == % Check if A is invertible disp('a is not invertible!') return else % Check if A is lower triangular if ~all(all(a==tril(a))) disp('a is not lower triangular!') return % Solution of the lower triangular system n=max(size(a)); x=zeros(n,); x()=b()/a(,); for j=:n x(j)=(b(j)-a(j,:j-)*x(:j-))/a(j,j); % End of LOWSOL 7
Ένας πιο δύσκολος τρόπος για να ελέγξουμε αν ο Α είναι συμμετρικός είναι ο πιο κάτω που χρησιμοποιεί λογική άλλων γλωσσών προγραμματισμού και όχι τη λογική της MATLAB: for k=:n- for j=k+:n if A(k,j) ~= disp('a is not lower triangular!') return Πιο κάτω φαίνονται μερικά ενδεικτικά αποτελέσματα που πήραμε με το lowsol.m: >> A=[ ; - ; - ; 4 3 -] A = - - 4 3 - >> b=[4 6 5 ]' b = 4 6 5 >> lowsol(a,b) 4-7 -5 >> lowsol(ones(4),b) A is not invertible! >> lowsol(eye(4),b) 4 6 5 >> lowsol(eye(3),b) b is not a 3x vector! >> >> A(,)= A = - - 4 3 - >> lowsol(a,b) A is not lower triangular! >> Θα λύσουμε επίσης ένα τυχαίο σύστημα, ως εξής: >> b=rand(5,) b =.683.3795.838.58.795 >> A=tril(rand(5)) A = 8
.489.346.547.897.59.5936.934.6979.4966.66.68.3784.8998.34.393 >> lowsol(a,b).5885 -.97.948 -.9-3.4856 9
Πρόβλημα 4 Γράψτε ένα function m-file με όνομα nnns.m, μεταβλητή εισόδου τον φυσικό αριθμό m και μεταβλητή εξόδου το διάνυσμα u που περιέχει τους αριθμούς της μορφής nn ( + )( n+ ) που είναι μικρότεροι ή ίσοι του m. Tο πρόγραμμα πρέπει να επιστρέφει μήνυμα λάθους αν ο m δεν είναι φυσικός αριθμός. 6 μ. Το ζητούμενο m-file είναι: function u=nnns(m) % NNNS % if m~=round(m) m<= disp('m is not a natural number!'), return % if m < 3, u()=; return else, u()=3; k=; while(k+)*(k+)*(k+3)/<=m k=k+; u(k)= k*(k+)*(k+)/; %End of NNNS Ακολουθούν κάποια αποτελέσματα που πήραμε με το nnns.m: >> nnns(.3) m is not a natural number! >> nnns(5) 3 3 6 5 68 5 36 495 Εναλλακτική λύση. Το πρόγραμμα που ακολουθεί φαίνεται πιο κομψό και σύντομο αλλά κάνει επιπλέον και αχρείαστους υπολογισμούς: function u=nnns(m) % NNNS % if m~=round(m) m<= disp('m is not a natural number!') return % if m < 3 u()=; else n=:m; w=n.*(n+).*(n+)/; v=find(w<=m); u=w(:length(v)); %End of NNNS Η εντολή find(w<=m) βρίσκει τους δείκτες που αντιστοιχούν σε μη μηδενικά στοιχεία του λογικού διανύσματος (w<=m). Για περισσότερες πληροφορίες δοκιμάστε την help find.
Πρόβλημα 5 Έστω το πιο κάτω πρόγραμμα: >> x=; >> while x+x>x x=*x pause(.) (α) Τι κάνει το πρόγραμμα; μ. (β) Πόσες γραμμές αποτελεσμάτων παράγονται; μ. (γ) Ποιες είναι οι τελευταίες δύο τιμές του x που τυπώνονται; μ. (α) Το πρόγραμμα διπλασιάζει την τιμή του x μέχρι που ο υπολογιστής δεν μπορεί να διακρίνει αν το x είναι μεγαλύτερο του x. Αυτό συμβαίνει όταν x+x> realmax. (β) (γ) Εφόσον realmax=^4 παράγονται 4 γραμμές αποτελεσμάτων. Οι δύο τελευταίες γραμμές που τυπώνονται είναι οι 8.988465674358e+37 Inf >> Σημειώνουμε ότι ο αριθμός 8.988465674358e+37 είναι (πρακτικά) ο realmax/. Πραγματικά >> realmax/ 8.9884656743579e+37 >> Άρα οι δύο τελευταίες τιμές του x που τυπώνονται είναι οι realmax/ και Inf.
Πρόβλημα 6 (α) Ένας αριθμός μηχανής γράφεται γενικά στη μορφή (. ) σ aa at β Εξηγήστε τι αντιπροσωπεύουν τα σ, t, β e. μ. (β) Τι καλούμε υπερχείλιση (overflow) και τι υπεκχείλιση (underflow). μ (γ) Αν μια δυαδική μηχανή αποθηκεύει μέχρι 5 σημαντικά ψηφία και χρησιμοποιεί στρογγύλευση, πως θα αποθηκεύσει το δυαδικό αριθμό.; μ (δ) Ποιος από τους πιο κάτω αριθμούς δεν είναι NaN στη MATLAB; /, inf-inf, realmax/realmin, *NaN μ (α) Το σ είναι το πρόσημο του αριθμού. Το β είναι η βάση του αριθμητικού συστήματος. Το t είναι το πλήθος των σημαντικών ψηφίων που αποθηκεύει το σύστημα. Το e είναι ο εκθέτης. (β) Υπερχείλιση (overflow) συμβαίνει όταν το αποτέλεσμα μιας πράξης στον υπολογιστή είναι κατ απόλυτη τιμή μεγαλύτερο από τον απόλυτα μέγιστο αριθμό μηχανής: x > xmax Στην περίπτωση αυτή η MATLAB θέτει τον x ίσο με Inf ή Inf.. Υπεχείλιση (underflow) συμβαίνει όταν το αποτέλεσμα μιας πράξης στον υπολογιστή είναι κατ απόλυτη τιμή μικρότερο από τον απόλυτα ελάχιστο αριθμό μηχανής: x < xmin Στην περίπτωση αυτή η MATLAB θέτει τον x ίσο με. Και στις δυο περιπτώσεις χάνεται κάθε πληροφορία για τον αριθμό x. e β (γ) Αν x=. και t=5, τότε με στρογγύλευση fl(x)=.. (δ) Ο realmax/realmin. Πράγματι >> realmax/realmin Inf Στις άλλες περιπτώσεις έχουμε ΝaΝ: >> / Warning: Divide by zero. NaN >> inf/inf NaN >> *NaN NaN
Πρόβλημα 7 (α) Αν >> x=rand().4447336435394.79937374735.654334895.989774483 τι θα μας δώσει η εντολή >> y=numstr(x) μ. (β) Πως θα σχεδιάσετε το πιο κάτω γράφημα στη MATLAB (με κόκκινο χρώμα);.9.8.7.6 y=sin(x).5.4.3...5.5.5 3 3.5 x 3 μ. (α) Θα μας δώσει τον πιο κάτω αλφαριθμητικό πίνακα: y =.4447.7994.6543.98 Πράγματι, αν χρησιμοποιήσουμε την εντολή whos y βλέπουμε ότι: (β) >> whos y Name Size Bytes Class Attributes y x9 76 char >> x=:.:pi; >> fill(x,sin(x),'r') >> xlabel('x'), ylabel('y=sin(x)') 3
Πρόβλημα 8 Ορίστε τη συνάρτηση x y gxy (, ) = xye + + έτσι ώστε το x να μπορεί να είναι διάνυσμα με τους εξής τρόπους: (α) Με function m-file. μ. (β) Με ανώνυμη συνάρτηση. μ. (γ) Με την εντολή inline. μ. (δ) Πως μπορούμε να σχεδιάσουμε το γράφημα της g στο [-,] [-,] με διαφορετικούς τρόπους; μ. (ε) Σχεδιάστε το γράφημα και τις ισοϋψείς της g όπως φαίνεται στο σχήμα. 3 μ. x y exp(+x +y ).8 x y exp(+x +y ) 3 - - -3 y - - x y.6.4. -. -.4 -.6 -.8 - - -.5.5 x (α) function z=g(x,y) % G z=x.*y.*exp(+x.^+y.^); % End of G (β) (γ) >> g=@(x,y) x.*y.*exp(+x.^+y.^) g = @(x,y) x.*y.*exp(+x.^+y.^) >> g=inline('x.*y.*exp(+x.^+y.^)','x','y') g = Inline function: g(x,y) = x.*y.*exp(+x.^+y.^) (δ) ος τρόπος Εντολή surf Με τις εντολές >> [x,y]=meshgrid(-:.:,-:.:); 4
>> surf(x,y,g(x,y)) παίρνουμε το γράφημα: 4 x 4 - -4 - - - - ος τρόπος Εντολή ezsurf Εφόσον έχουμε ορίσει ανώνυμη συνάρτηση ή συνάρτηση inline, με την εντολή >> ezsurf(g, [-,, -, ]) παίρνουμε το γράφημα x y exp(+x +y ) 4 x 4 - -4 y - - - - x (ε) Τα γραφήματα έγιναν στο χωρίο [-,] [-,] με τις εντολές >> subplot(,,), ezsurf(g,[-,,-,]) >> subplot(,,), ezcontourf(g,[-,,-,]) 5