ΜΑΣ 191. Μαθηματικά με Υπολογιστές Διδάσκων Γιώργος...
Transcript of ΜΑΣ 191. Μαθηματικά με Υπολογιστές Διδάσκων Γιώργος...
ΜΑΣ 191. Μαθηματικά με Υπολογιστές Διδάσκων: Γιώργος Γεωργίου Ενδιάμεση εξέταση – Θεωρία
26 Μαρτίου 2007 ΟΝΟΜΑ: ………………………………………………………………………… ΑΤ: ………………………………. Πρόβλημα 1 Να συμπληρωθούν οι δύο εντολές της MATLAB που λείπουν:
>> A=[1 1+i; -i 2]; >> Εντολή 1 1.0000 1.0000 + 1.0000i 0 - 1.0000i 2.0000 >> Εντολή 2 A = 1.0000 1.0000 + 1.0000i 0 - 1.0000i 2.0000 >>
2 μ. ------------------------------------------------------------------------------------------------------- Λύση
>> A=[1 1+i; -i 2]; >> disp(A) 1.0000 1.0000 + 1.0000i 0 - 1.0000i 2.0000 >> A A = 1.0000 1.0000 + 1.0000i 0 - 1.0000i 2.0000
Σημείωση: Αντί της
>> A μπορούμε ισοδύναμα να χρησιμοποιήσουμε την
>> display(A) A = 1.0000 1.0000 + 1.0000i 0 - 1.0000i 2.0000
Στην πραγματικότητα, το m-file display.m καλεί την εντολή disp. Για περισσότερες πληροφορίες δοκιμάστε την help display.
1
Πρόβλημα 2 Να συμπληρωθούν οι τρεις εντολές της MATLAB που λείπουν:
>> Εντολή 1 Your variables are: A1 A2 A3 AB Bas u >> Εντολή 2 Name Size Bytes Class Attributes A1 1x1 8 double A2 1x1 8 double A3 1x1 8 double AB 3x3 72 double Bas 1x1 8 double u 1x4 32 double >> Εντολή 3 Your variables are: A1 A2 A3 AB
2 μ. ------------------------------------------------------------------------------------------------------- Λύση
>> who Your variables are: A1 A2 A3 AB Bas u >> whos Name Size Bytes Class Attributes A1 1x1 8 double A2 1x1 8 double A3 1x1 8 double AB 3x3 72 double Bas 1x1 8 double u 1x4 32 double >> who A* Your variables are: A1 A2 A3 AB
2
Πρόβλημα 3 Με δεδομένο ότι η τιμή του x δεν αλλάζει, συμπληρώστε τις τέσσερις εντολές ΜΑΤLAB που λείπουν:
>> x=exp(-2) x = 0.1353 >> Εντολή 1 >> x x = 0.135335283236613 >> Εντολή 2 >> x x = 1.353352832366127e-001 >> Εντολή 3 >> x x = 329/2431 >> Εντολή 4 >> x x = 0.14
2 μ. ------------------------------------------------------------------------------------------------------- Λύση
>> x=exp(-2) x = 0.1353 >> format long >> x x = 0.135335283236613 >> format long e >> x x = 1.353352832366127e-001 >> format rat >> x x = 329/2431 >> format bank >> x x = 0.14
3
Πρόβλημα 4 (α) Ορίστε στη MATLAB τα εξής:
1 1 1 11 2 1 1
4 3 0 01 2 3 4
A
⎡ ⎤⎢ ⎥−⎢ ⎥=⎢ ⎥⎢ ⎥⎣ ⎦
και
1113
b
⎡ ⎤⎢ ⎥⎢ ⎥=⎢ ⎥⎢ ⎥⎣ ⎦
1 μ. Γράψτε τις εντολές της MATLAB που υπολογίζουν τα ακόλουθα: (β) Την ορίζουσα και τον βαθμό του Α. 1 μ. (γ) Τον ανάστροφο και τον αντίστροφο του Α. 1 μ. (δ) Τις ιδιοτιμές και τα ιδιοδιανύσματα του Α. 2 μ. (ε) Τη λύση του συστήματος Ax=b 1 μ. ------------------------------------------------------------------------------------------------------- Λύση (α)
>> A=[1 1 1 1; -1 2 1 1; 4 3 0 0; 1 2 3 4] A = 1 1 1 1 -1 2 1 1 4 3 0 0 1 2 3 4 >> b=[1; 1; 1; 3] b = 1 1 1 3
(β)
>> det(A) ans = -10 >> rank(A) ans = 4
(γ)
>> A' ans = 1 -1 4 1 1 2 3 2 1 1 0 3 1 1 0 4 >> inv(A) ans = 0.3000 -0.3000 0.1000 -0.0000 -0.4000 0.4000 0.2000 -0.0000 3.9000 0.1000 -0.7000 -1.0000 -2.8000 -0.2000 0.4000 1.0000
(δ)
>> [V,D]=eig(A) V = Columns 1 through 3 0.2881 0.1285 -0.0214 + 0.0760i 0.2295 0.1865 -0.2051 - 0.1088i 0.3111 -0.8828 -0.5837 + 0.1145i 0.8761 0.4116 0.7656
4
Column 4 -0.0214 - 0.0760i -0.2051 + 0.1088i -0.5837 - 0.1145i 0.7656 D = Columns 1 through 3 5.9178 0 0 0 -1.2159 0 0 0 1.1490 + 0.2637i 0 0 0 Column 4 0 0 0 1.1490 - 0.2637i
(ε)
>> A\b ans = 0.1000 0.2000 0.3000 0.4000
5
Πρόβλημα 5 (α) Κατασκευάστε με απλό τρόπο (και όχι με απευθείας εκχώρηση τιμών) τον πίνακα:
1 1 1 1 0 01 1 1 0 1 01 1 1 0 0 1
A⎡ ⎤⎢ ⎥= ⎢ ⎥⎢ ⎥⎣ ⎦
1 μ. (β) Κατασκευάστε με απλό τρόπο (και όχι με απευθείας εκχώρηση τιμών) τον πίνακα:
1 1 1 1 11 2 2 2 21 2 2 2 21 2 2 2 2
B
⎡ ⎤⎢ ⎥⎢ ⎥=⎢ ⎥⎢ ⎥⎣ ⎦
2 μ. (γ) Κατασκευάστε τους κάτωθι υποπίνακες ενός πίνακα Α: (i) το διάνυσμα που περιέχει το 1ο, το 4ο, το 7ο και το 10ο στοιχείο της τελευταίας γραμμής του Α (δεδομένου ότι ο Α έχει τουλάχιστον 10 στήλες) 1 μ. (ii) το διάνυσμα που περιέχει το 9ο, το 7ο, το 5ο και το 3ο στοιχείο της τελευταίας στήλης του Α (δεδομένου ότι ο Α έχει τουλάχιστον 9 γραμμές) 1 μ. (iii) τον υποπίνακα που προκύπτει από την τομή των γραμμών 1, 4, 7 και 10 και τον στηλών 3, 5, 7 και 9 του Α 1 μ. (iv) τον υποπίνακα που περιέχει το 1ο, 2ο, 3ο και 7ο στοιχείο της τελευταίας γραμμής του Α. 1 μ. ------------------------------------------------------------------------------------------------------- Λύση (α)
>> A=[ones(3) eye(3)] A = 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1
(β)
>> A=ones(4,5); >> A(2:4,2:5)=2 A = 1 1 1 1 1 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2
(γ) (i) >> A(end,1:3:10) (ii) >> A(9:-2:3,end) (iii) >> A(1:3:10,3:2:9) (iv) >> A(end,[1 2 3 7]) ή >> A(end,[1:3 7])
6
Πρόβλημα 6 Ορίστε τη συνάρτηση
( )2 2( ) ln 1 x xf x e −= + όπου το x να μπορεί να είναι διάνυσμα με τους εξής τρόπους: (α) Με function m-file. 1 μ. (β) Με ανώνυμη συνάρτηση. 1 μ. (γ) Με την εντολή inline. 1 μ. (δ) Σχεδιάστε το γράφημα της f στο [0,5] με 3 διαφορετικές εντολές. 3 μ. ------------------------------------------------------------------------------------------------------- Λύση (α)
function y=f(x) % F y=log(1+exp(x.^2-2*x)); % End of F
(β)
>> f=@(x) log(1+exp(x.^2-2*x)) f = @(x) log(1+exp(x.^2-2*x))
(γ)
>> f=inline('log(1+exp(x.^2-2*x))','x') f = Inline function: f(x) = log(1+exp(x.^2-2*x))
(δ) 1ος τρόπος – Εντολή plot Με τις εντολές
x=0:0.1:5; plot(x,f(x))
παίρνουμε το γράφημα:
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 50
2
4
6
8
10
12
14
16
2ος τρόπος – Εντολή fplot Εφόσον έχουμε ορίσει ανώνυμη συνάρτηση ή συνάρτηση inline, με την εντολή
>> fplot(f,[0,5])
παίρνουμε το γράφημα
7
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 50
2
4
6
8
10
12
14
16
3ος τρόπος– Εντολή ezplot Χρησιμοποιούμε τη συνάρτηση ezplot:
>> ezplot(f,0,5)
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
0
2
4
6
8
10
12
14
16
x
log(1+exp(x2-2 x))
8
Πρόβλημα 7 (α) Πως κατασκευάζεται στη ΜΑΤLAB το πιο κάτω γράφημα;
-5 0 5
-5
0
5
x
sin(x) - x cos(x)
0 2 4 6
0
10
20
30
40
x
log(x)+x2
-5 0 50
50
100
150
x
exp(x)-x
-5 0 5
-500
0
500
x
3 x3-2 x2+x-1
4 μ. (β) Σχεδιάστε το γράφημα της καμπύλης 2 2( 1) (1 )x y x y 0+ − + + = 2 μ. ------------------------------------------------------------------------------------------------------- Λύση (α) Με τις εντολές
>> subplot(2,2,1), ezplot('sin(x) - x*cos(x)') >> subplot(2,2,2), ezplot('log(x)+x^2') >> subplot(2,2,3), ezplot('exp(x)-x') >> subplot(2,2,4), ezplot('3*x^3-2*x^2+x-1')
(β) Με την εντολή
>> ezplot('x^2+(y^2-1)*(1+x+y)',[-3,3]) παίρνουμε το γράφημα
-3 -2 -1 0 1 2 3-3
-2
-1
0
1
2
3
x
y
x2+(y2-1) (1+x+y) = 0
9
Πρόβλημα 8 (α) Γράψτε μια m-συνάρτηση με όνομα prodfun.m που υπολογίζει το γινόμενο δύο συναρτήσεων f(x) και g(x) στο x. Τα ονόματα των f και g πρέπει να είναι μεταβλητές εισόδου για την prodfun. 4 μ. (β) Πως μπορούμε να σχεδιάσουμε το γράφημα της sinx ex χρησιμοποιώντας το πιο πάνω m-file; 2 μ. ------------------------------------------------------------------------------------------------------- Λύση (α) Το ζητούμενο 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,0) ans = 1 >> prodfun(@exp,@cos,pi/4) ans = 1.5509
Υπενθυμίζουμε ότι αντί του συμβόλου @, μπορούμε επίσης να δώσουμε τα ονόματα των συναρτήσεων μέσα σε εισαγωγικά:
>> prodfun('sin','cos',pi/4) ans = 0.5000 >> prodfun('cosh','tan',1.2) ans = 4.6573
(β) Με τις εντολές
>> x=linspace(-3,3); >> plot(x,prodfun(@sin,@exp,x))
παίρνουμε το γράφημα της sinx ex:
-3 -2 -1 0 1 2 3-1
0
1
2
3
4
5
6
7
8
Εναλλακτικά θα μπορούσαμε να χρησιμοποιήσουμε και την
>> ezplot(@(x) prodfun(@sin, @exp, x))
10
η οποία παράγει το πιο κάτω γράφημα της sinx ex (μη βιαστείτε να σκεφθείτε ότι έχει γίνει λάθος!):
-3 -2 -1 0 1 2 3 4 5 6
-180
-160
-140
-120
-100
-80
-60
-40
-20
0
20
x
prodfun(@sin, @exp, x)
11
Πρόβλημα 9 Βρείτε το λάθος σε κάθε μια από τις πιο κάτω εντολές της MATLAB: (α) x=0:0.1:pi; f(x)=1+x.^2 1 μ. (β) if m=n 1 μ. (γ) f=2*x^2-3x+5 1 μ. και (δ) εξηγήστε τη διαφορά μεταξύ της 2+3 < 1+1 και της 2 +(3<1)+1. 1 μ. ------------------------------------------------------------------------------------------------------- Λύση (α) Στο αριστερό μέρος μιας εντολής εκχώρησης δεν μπορούμε να έχουμε εκφράσεις της μορφής f(x) εκτός αν η f είναι διάνυσμα (και όχι συνάρτηση) και το x είναι ακέραιος. Η MATLAB μας δίνει μήνυμα λάθους:
>> x=0:0.1:pi; f(x)=1+x.^2 ??? 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=2*x^2-3x+5 ??? f=2*x^2-3x+5 | Error: Unexpected MATLAB expression.
(δ) Η 2+3 < 1+1 είναι μια λογική παράσταση με λογική τιμή 0. Η 2 +(3<1)+1 είναι ένα άθροισμα που περιλαμβάνει και ένα λογικό 0 (αυτή είναι η τιμή της πρότασης 3<1). Η τιμή του είναι φυσικά 3. Πιο κάτω φαίνονται τα αποτελέσματα της MATLAB:
>> 2+3 < 1+1 ans = 0 >> whos Name Size Bytes Class Attributes ans 1x1 1 logical >> >> 2 +(3<1)+1 ans = 3 >> whos Name Size Bytes Class Attributes ans 1x1 8 double
12
Πρόβλημα 10 Γράψτε με διαφορετικό τρόπο τις πιο κάτω παραστάσεις στη ΜΑΤLΑΒ: (α) 1+ cos(pi) >= 2 (β) eye(3) < ones(3) (γ) or(x>=y, x==round(x)) (δ) le(2*rand(3),ones(3)) (ε) gt(delta, 1e-8)
3 μ. ------------------------------------------------------------------------------------------------------- Λύση (α)
>> ge(1+cos(pi), 2) ans = 0
(β)
>> lt(eye(3),ones(3)) ans = 0 1 1 1 0 1 1 1 0 >>
(γ)
x>=y | x==round(x) ή ge(x,y) | eq(x, round(x)) (δ)
>> 2*rand(3) <= ones(3) ans = 1 0 0 0 1 0 0 0 0
(ε) delta >= 1e-08
13
Πρόβλημα 11 Γράψτε ένα function m-file με το όνομα series1.m και δεδομένo εισόδου ένα φυσικό αριθμό n για τον υπολογισμό του αθροίσματος
21 1
n
k
kk= +∑
(α) με τη χρήση βρόχου for. 2 μ. (β) χωρίς τη χρήση βρόχου for. 3 μ. (γ) Με δοσμένο το m-file series1.m πως θα κατασκευάζατε το πιο κάτω γράφημα του αθροίσματος συναρτήσει του n στο διάστημα [0,20]; 3 μ.
0 2 4 6 8 10 12 14 16 18 200.5
1
1.5
2
2.5
3
n
Σ k/
(1+k
2 )
------------------------------------------------------------------------------------------------------- Λύση (α)
function sum1=series1(n) % SERIES1 % Ypologizei to athroisma k/(1=k^2) % sum1=0; for k=1:n sum1=sum1+k/(1+k^2); end % End of SERIES1
(β)
function sum1=series1(n) k=0; sum1=0; while k <= n k=k+1; sum1=sum1+k/(1+k^2); end
ή
function sum1=series1(n) x=1:n; sum1=sum(x./(1+x.^2));
14
ή ακόμα
function sum1=series1(n) sum1=sum( (1:n)./(1+(1:n).^2) );
(γ)
>> x=1:20; >> for k=1:20, y(k)=series1(k); end >> plot(x,y,'o'), xlabel('n'), ylabel('Σ k/(1+k^2)')
15
Πρόβλημα 12 Γράψτε ένα function m-file με το όνομα issymmetric.m και δεδομένο εισόδου ένα πραγματικό πίνακα Α που • θα ελέγχει αν ο Α είναι τετραγωνικός και αν όχι θα επιστρέφει σχετικό μήνυμα λάθους και θα σταματά. • Στην περίπτωση που ο Α είναι τετραγωνικός θα επιστρέφει τη λογική τιμή 1 αν ο Α είναι συμμετρικός και τη λογική τιμή 0 διαφορετικά.
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 end %End of ISSYMMETRIC
Ακολουθούν μερικά αποτελέσματα που πήραμε με το πρόγραμμα issymmetric.m.
>> issymmetric(ones(2,3)) Matrix A is not square! >> issymmetric(ones(3,3)) ans = 1 >> issymmetric(eye(4)) ans = 1 >> issymmetric(rand(5)) ans = 0 >> >> whos Name Size Bytes Class Attributes ans 1x1 1 logical
Παρατηρούμε λοιπόν ότι η έξοδος είναι λογική μεταβλητή.
16
Πρόβλημα 13 Γράψτε ένα function m-file με το όνομα lowsol.m που θα επιλύει το γραμμικό σύστημα Ax=b με εμπρός αντικατάσταση όταν ο Α είναι κάτω τριγωνικός πίνακας.
1 1 11/x b a=
1
1
/ , 2, ,i
i i ik k iik
x b a x a i−
=
⎛ ⎞= − =⎜ ⎟⎝ ⎠
∑ n
To m-file πρέπει να ελέγχει τα εξής: • αν ο Α είναι τετραγωνικός και αν όχι να επιστρέφει σχετικό μήνυμα λάθους. • αν ο Α είναι κάτω τριγωνικός και αν όχι να επιστρέφει σχετικό μήνυμα λάθους. • αν οι Α και b έχουν το ίδιο πλήθος στηλών και αν όχι να επιστρέφει σχετικό
μήνυμα λάθους. • αν ο Α είναι αντιστρέψιμος και αν όχι να επιστρέφει σχετικό μήνυμα λάθους.
15 μ ------------------------------------------------------------------------------------------------------- Λύση 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 ~= 1 ^ nb ~=1 % Check if b is a vector disp('b is not a vector!') return elseif mb*nb~=n % Check if b is a nx1 vector fprintf('b is not a %3.0fx1 vector! \n',n) return elseif det(A) == 0 % 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 end end % Solution of the lower triangular system n=max(size(A)); x=zeros(n,1); x(1)=b(1)/A(1,1); for j=2:n x(j)=(b(j)-A(j,1:j-1)*x(1:j-1))/A(j,j); end % End of LOWSOL
17
Ένας πιο δύσκολος τρόπος για να ελέγξουμε αν ο Α είναι συμμετρικός είναι ο πιο κάτω που χρησιμοποιεί λογική άλλων γλωσσών προγραμματισμού και όχι τη λογική της MATLAB:
for k=1:n-1 for j=k+1:n if A(k,j) ~= 0 disp('A is not lower triangular!') return end end end
Πιο κάτω φαίνονται μερικά ενδεικτικά αποτελέσματα που πήραμε με το lowsol.m:
>> A=[1 0 0 0; 2 -1 0 0; 1 2 -1 0; 1 4 3 -2] A = 1 0 0 0 2 -1 0 0 1 2 -1 0 1 4 3 -2 >> b=[4 6 15 1]' b = 4 6 15 1 >> lowsol(A,b) ans = 4 2 -7 -5 >> lowsol(ones(4),b) A is not invertible! >> lowsol(eye(4),b) ans = 4 6 15 1 >> lowsol(eye(3),b) b is not a 3x1 vector! >> >> A(1,2)=2 A = 1 2 0 0 2 -1 0 0 1 2 -1 0 1 4 3 -2 >> lowsol(A,b) A is not lower triangular! >>
Θα λύσουμε επίσης ένα τυχαίο σύστημα, ως εξής:
>> b=rand(5,1) b = 0.6813 0.3795 0.8318 0.5028 0.7095 >> A=tril(rand(5)) A =
18
0.4289 0 0 0 0 0.3046 0.5417 0 0 0 0.1897 0.1509 0.5936 0 0 0.1934 0.6979 0.4966 0.6602 0 0.6822 0.3784 0.8998 0.3420 0.3093 >> lowsol(A,b) ans = 1.5885 -0.1927 0.9428 -0.2092 -3.4856
19
Πρόβλημα 14 Γράψτε ένα function m-file με όνομα nnns.m, μεταβλητή εισόδου τον φυσικό αριθμό m και μεταβλητή εξόδου το διάνυσμα u που περιέχει τους αριθμούς της μορφής
( 1) ( 2)2
n n n+ + που είναι μικρότεροι ή ίσοι του m. Tο πρόγραμμα πρέπει να επιστρέφει μήνυμα λάθους αν ο m δεν είναι φυσικός αριθμός. 6 μ. ------------------------------------------------------------------------------------------------------- Λύση Το ζητούμενο m-file είναι:
function u=nnns(m) % NNNS % if m~=round(m) | m<=0 disp('m is not a natural number!'), return end % if m < 3, u(1)=0; return else, u(1)=3; end k=1; while(k+1)*(k+2)*(k+3)/2<=m k=k+1; u(k)= k*(k+1)*(k+2)/2; end %End of NNNS
Ακολουθούν κάποια αποτελέσματα που πήραμε με το nnns.m:
>> nnns(10.123) m is not a natural number! >> nnns(500) ans = 3 12 30 60 105 168 252 360 495
Εναλλακτική λύση. Το πρόγραμμα που ακολουθεί φαίνεται πιο κομψό και σύντομο αλλά κάνει επιπλέον και αχρείαστους υπολογισμούς:
function u=nnns1(m) % NNNS1 % if m~=round(m) | m<=0 disp('m is not a natural number!') return end % if m < 3 u(1)=0; else n=1:m; w=n.*(n+1).*(n+2)/2; v=find(w<=m); u=w(1:length(v)); end %End of NNNS1
Η εντολή find(w<=m) βρίσκει τους δείκτες που αντιστοιχούν σε μη μηδενικά στοιχεία του λογικού διανύσματος (w<=m). Για περισσότερες πληροφορίες δοκιμάστε την help find.
20
Πρόβλημα 15 Έστω το πιο κάτω πρόγραμμα:
>> x=1; >> while x+x>x x=2*x pause(.02) end
(α) Τι κάνει το πρόγραμμα; 1 μ. (β) Πόσες γραμμές αποτελεσμάτων παράγονται; 1 μ. (γ) Ποιες είναι οι τελευταίες δύο τιμές του x που τυπώνονται; 1 μ. ------------------------------------------------------------------------------------------------------- Λύση (α) Το πρόγραμμα διπλασιάζει την τιμή του x μέχρι που ο υπολογιστής δεν μπορεί να διακρίνει αν το 2x είναι μεγαλύτερο του x. Αυτό συμβαίνει όταν
x+x> realmax. (β) Εφόσον realmax=2^1024 παράγονται 1024 γραμμές αποτελεσμάτων. (γ) Οι δύο τελευταίες γραμμές που τυπώνονται είναι οι
x = 8.988465674311580e+307 x = Inf >>
Σημειώνουμε ότι ο αριθμός 8.988465674311580e+307 είναι (πρακτικά) ο realmax/2. Πραγματικά
>> realmax/2 ans = 8.988465674311579e+307 >>
Άρα οι δύο τελευταίες τιμές του x που τυπώνονται είναι οι realmax/2 και Inf.
21
Πρόβλημα 16 (α) Ένας αριθμός μηχανής γράφεται γενικά στη μορφή
( )1 2. etx a a a
βσ β=
Εξηγήστε τι αντιπροσωπεύουν τα σ, t, β e. 2 μ. (β) Τι καλούμε υπερχείλιση (overflow) και τι υπεκχείλιση (underflow). 1 μ (γ) Αν μια δυαδική μηχανή αποθηκεύει μέχρι 5 σημαντικά ψηφία και χρησιμοποιεί στρογγύλευση, πως θα αποθηκεύσει το δυαδικό αριθμό 11.01110101; 2 μ (δ) Ποιος από τους πιο κάτω αριθμούς δεν είναι NaN στη MATLAB;
0/0, inf-inf, realmax/realmin, 0*NaN 1 μ ------------------------------------------------------------------------------------------------------- Λύση (α) Το σ είναι το πρόσημο του αριθμού. Το β είναι η βάση του αριθμητικού συστήματος. Το t είναι το πλήθος των σημαντικών ψηφίων που αποθηκεύει το σύστημα. Το e είναι ο εκθέτης. (β) Υπερχείλιση (overflow) συμβαίνει όταν το αποτέλεσμα μιας πράξης στον υπολογιστή είναι κατ’απόλυτη τιμή μεγαλύτερο από τον απόλυτα μέγιστο αριθμό μηχανής:
max| |x x> Στην περίπτωση αυτή η MATLAB θέτει τον x ίσο με Inf ή –Inf..
Υπεχείλιση (underflow) συμβαίνει όταν το αποτέλεσμα μιας πράξης στον υπολογιστή είναι κατ’απόλυτη τιμή μικρότερο από τον απόλυτα ελάχιστο αριθμό μηχανής:
min| |x x< Στην περίπτωση αυτή η MATLAB θέτει τον x ίσο με 0.
Και στις δυο περιπτώσεις χάνεται κάθε πληροφορία για τον αριθμό x. (γ) Αν x=11.01110101 και t=5, τότε με στρογγύλευση
fl(x)=0.11100 22. (δ) Ο realmax/realmin. Πράγματι
>> realmax/realmin ans = Inf
Στις άλλες περιπτώσεις έχουμε ΝaΝ:
>> 0/0 Warning: Divide by zero. ans = NaN >> inf/inf ans = NaN >> 0*NaN ans = NaN
22
Πρόβλημα 17 (α) Αν
>> x=rand(2) x = 0.444703364353194 0.791937037427035 0.615432348100095 0.921812970744803
τι θα μας δώσει η εντολή
>> y=num2str(x) 2 μ.
(β) Πως θα σχεδιάσετε το πιο κάτω γράφημα στη MATLAB (με κόκκινο χρώμα);
0 0.5 1 1.5 2 2.5 3 3.50
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
x
y=si
n(x)
3 μ.
------------------------------------------------------------------------------------------------------- Λύση (α) Θα μας δώσει τον πιο κάτω αλφαριθμητικό πίνακα:
y = 0.4447 0.79194 0.61543 0.92181
Πράγματι, αν χρησιμοποιήσουμε την εντολή whos y βλέπουμε ότι:
>> whos y Name Size Bytes Class Attributes y 2x19 76 char
(β)
>> x=0:0.01:pi; >> fill(x,sin(x),'r') >> xlabel('x'), ylabel('y=sin(x)')
23
Πρόβλημα 18 Ορίστε τη συνάρτηση
2 21( , ) x yg x y xy e + += έτσι ώστε το x να μπορεί να είναι διάνυσμα με τους εξής τρόπους: (α) Με function m-file. 1 μ. (β) Με ανώνυμη συνάρτηση. 1 μ. (γ) Με την εντολή inline. 1 μ. (δ) Πως μπορούμε να σχεδιάσουμε το γράφημα της g στο [-2,2]×[-2,2] με 2 διαφορετικούς τρόπους; 2 μ. (ε) Σχεδιάστε το γράφημα και τις ισοϋψείς της g όπως φαίνεται στο σχήμα. 3 μ.
-1
0
1
-1
0
1-30
-20
-10
0
10
20
30
x
x y exp(1+x2+y2)
yx
y
x y exp(1+x2+y2)
-1 -0.5 0 0.5 1-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
------------------------------------------------------------------------------------------------------- Λύση (α)
function z=g1(x,y) % G z=x.*y.*exp(1+x.^2+y.^2); % End of G
(β)
>> g=@(x,y) x.*y.*exp(1+x.^2+y.^2) g = @(x,y) x.*y.*exp(1+x.^2+y.^2)
(γ)
>> g=inline('x.*y.*exp(1+x.^2+y.^2)','x','y') g = Inline function: g(x,y) = x.*y.*exp(1+x.^2+y.^2)
(δ) 1ος τρόπος – Εντολή surf Με τις εντολές
>> [x,y]=meshgrid(-2:0.1:2,-2:0.1:2);
24
>> surf(x,y,g(x,y))
παίρνουμε το γράφημα:
-2-1
01
2
-2-1
0
12
-4
-2
0
2
4
x 104
2ος τρόπος– Εντολή ezsurf Εφόσον έχουμε ορίσει ανώνυμη συνάρτηση ή συνάρτηση inline, με την εντολή
>> ezsurf(g, [-2, 2, -2, 2])
παίρνουμε το γράφημα
-2-1
01
2
-2-1
0
12
-4
-2
0
2
4
x 104
x
x y exp(1+x2+y2)
y
(ε) Τα γραφήματα έγιναν στο χωρίο [-1,1]×[-1,1] με τις εντολές
>> subplot(1,2,1), ezsurf(g,[-1,1,-1,1]) >> subplot(1,2,2), ezcontourf(g,[-1,1,-1,1])
25