Ratkaisuja (valikolituihin) tehtäviin 1
25.5.2010
Contents
Teht 1
clear % Puhdistetaan työtila vanhoista muuttujista. x = [1 2 3 4 5]; % Puolipisteisiin on hyvä tottua. y = [0 2 4 6]; z = [-4 -2 0 2 4 ]; who % Katsotaan työtilan muuttujat. format compact % Tiivistetty tulostusmuoto x % Kirjoittamalla muttujan nimen, näet sen sisällön. x,y,z % Komentoja voidaan antaa samalla rivillä pilkulla tai % puolipisteellä erotettuna. why % Leikitään vähän (Moler-huumoria) % Jos haluat tutustua jo nyt Matlab-ohjelmointiin, sano: type why
Your variables are:
x y z
x =
1 2 3 4 5
x =
1 2 3 4 5
y =
0 2 4 6
z =
-4 -2 0 2 4
Can you rephrase that?
length(x),length(y),length(z) x.*z % Pisteittäinen kertolasku, onneksi x ja z samanpituiset. x'*z % Ulkotulo: Matriisi: (x(i)*z(j)). Ei tarvitse olla samanpituiset. % Parempi olisi ollut tässä pyytää x'*y % ja/tai y'*x % x*x' on x:n sisätulo itsensä kanssa, eli koordinaattien neliösumma. % norm(x,2) laskee saman (Euklidinen normi). Norm-funktion oletusarvona % on 2-normi. Kts. help norm x.^2 % Pisteittäinen potenssi; koordinaatit korotetaan toiseen. 'x^2' % Matriisipotenssi, tässä x*x, mahdollinen vain neliömatriisille.
ans =
5
ans =
4
ans =
5
ans =
-4 -4 0 8 20
ans =
-4 -2 0 2 4
-8 -4 0 4 8
-12 -6 0 6 12
-16 -8 0 8 16
-20 -10 0 10 20
ans =
0 2 4 6
0 4 8 12
0 6 12 18
0 8 16 24
0 10 20 30
ans =
0 0 0 0 0
2 4 6 8 10
4 8 12 16 20
6 12 18 24 30
ans =
1 4 9 16 25
ans =
x^2
Teht 2.
clear % Tyhjennetään vanhoista muuttujista (selkeyttää). u=[3;4;5;6]; v=[0;2;4;6]; u,v % Tai: u=(3:6)', v=(0:2:6)' % c,b,a voidaan rakentaa monilla tavoilla, tietysti ihan kirjoittamalla % alkio kerrallaan tyyliin: c=[1 2 3;1 3 6;1 4 9] % Muita tapoja: c=[ones(3,1) (2:4)' (3:3:9)'] % tai c=[(1:3);1 3 6;1 4 9] a=[1:4;5:8;9:12] % tai a=reshape(1:12,3,4) b=[3:6;2:-1:-1;5 4 2 0;1 2 1 1]
u =
3
4
5
6
v =
0
2
4
6
u =
3
4
5
6
v =
0
2
4
6
c =
1 2 3
1 3 6
1 4 9
c =
1 2 3
1 3 6
1 4 9
c =
1 2 3
1 3 6
1 4 9
a =
1 2 3 4
5 6 7 8
9 10 11 12
a =
1 4 7 10
2 5 8 11
3 6 9 12
b =
3 4 5 6
2 1 0 -1
5 4 2 0
1 2 1 1
Teht 3
n=4;k=3; In=eye(n,n); Ynk=ones(n,k); Nnk=zeros(n,k); Ik=eye(k,k);Nn=zeros(n,n); A=[In Ynk;Nnk' Ik] B=[Nn In;-In Nn]
A =
1 0 0 0 1 1 1
0 1 0 0 1 1 1
0 0 1 0 1 1 1
0 0 0 1 1 1 1
0 0 0 0 1 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 1
B =
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
-1 0 0 0 0 0 0 0
0 -1 0 0 0 0 0 0
0 0 -1 0 0 0 0 0
0 0 0 -1 0 0 0 0
Teht 3.5
% a) % v(end:-1:1) % Vektori % A(:,end:-1:1) % Matriisin sarakkeet % A(end:-1:1,:) % Matriisin rivit type fliplr %type flipud % b) u=1:7 v=-u N=length(u); u_alle_v = [u;v] limitetty=u_alle_v(:)'
function y = fliplr(x)
%FLIPLR Flip matrix in left/right direction.
% FLIPLR(X) returns X with row preserved and columns flipped
% in the left/right direction.
%
% X = 1 2 3 becomes 3 2 1
% 4 5 6 6 5 4
%
% Class support for input X:
% float: double, single
%
% See also FLIPUD, ROT90, FLIPDIM.
% Copyright 1984-2004 The MathWorks, Inc.
% $Revision: 5.9.4.3 $ $Date: 2004/07/05 17:01:14 $
if ndims(x)~=2
error('MATLAB:fliplr:SizeX', 'X must be a 2-D matrix.');
end
y = x(:,end:-1:1);
u =
1 2 3 4 5 6 7
v =
-1 -2 -3 -4 -5 -6 -7
u_alle_v =
1 2 3 4 5 6 7
-1 -2 -3 -4 -5 -6 -7
limitetty =
1 -1 2 -2 3 -3 4 -4 5 -5 6 -6 7 -7
Teht. 4 ja 6
A=magic(5) sarakesummat=sum(A) % tai: sum(A,[1]) rivisummat=sum(A') % tai sum(A,[2]) lavistajasumma=sum(diag(A)) sivulavistajasumma=sum(diag(fliplr(A))) [ov,oa]=eig(A) V=ov;D=oa; IV=inv(V); A,V*D*IV A-V*D*IV % A:n diagonalisointi A=V*D*inv(V) %{ Koska rivisummat = vakio = 65, niin yksi ominaisvektori on v=[1 1 1 1 1]', sillä A*v = [65;65;65;65;65] = 65*[1;1;1;1;1] = 65*v. Laskemalla nähdään, että muut ovat pienempiä. Normeerataan luvulla 65 näin: A = 65*V*D/65*inv(V) Merkitään D1=D/65 D1 on diagonaalimatriisi, jonka (itseisarvoltaan) suurin alkio = 1, muut ovat aidosti pienempiä. Nyt A^k = 65^k * V * D1^k * inv(V). Jos diagonaalimatriisilla kerrotaan vasemmalta jokin matriisi C, niin C:n rivit tulevat kerrotuiksi diagonaalialkioilla. Mieti kynää ja paperia käyttäen, voithan kokeilla myös Matlabilla vaikka tyyliin: C=reshape(1:9,3,3)',Dm=diag(-1:1), Dm*C, C*Dm Oikelta kerrottaessa kerrotaan vastaavasti sarakkeet, kuten laskukin vahvistaa. No, muodostetaan D1:n potensseja: %} format long D1=D/65; k=1,Dk=D1 k=k+1, Dk=Dk*Dk % toista nuolinäppäimellä k=k+1, Dk=Dk*Dk k=k+1, Dk=Dk*Dk k=k+1, Dk=Dk*Dk %{ Arvolla k=6 tulee Matlabin laskentatarkkuudella diagonaalimatriisi: diag([1 0 0 0 0]), joten D1^k*inv(V) on matriisi, jossa 1. vaakarivi on inv(V):n eka vaakarivi, loput ovat nollarivejä. Matriisin rangi on siten 1, ja se ei siitänsä kasva kerrottaessa vasemmalta millä tahansa matriisilla. (Jos tässä oli vieraita lineaarialgebran käsitteitä, niin älä huoli, muistetele näitä laskuja lämmöllä sitten, kun noihin törmäät.) %}
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
sarakesummat =
65 65 65 65 65
ans =
65 65 65 65 65
rivisummat =
65 65 65 65 65
ans =
65
65
65
65
65
lavistajasumma =
65
sivulavistajasumma =
65
ov =
-0.447213595499958 0.097640070932979 -0.632976910516003 0.678009723956060 -0.261860649935008
-0.447213595499958 0.352538557500108 0.589480807113999 0.322279530272055 -0.173165093661345
-0.447213595499958 0.550110625795028 -0.391529640194349 -0.550110625795028 0.391529640194349
-0.447213595499958 -0.322279530272056 0.173165093661345 -0.352538557500107 -0.589480807113999
-0.447213595499958 -0.678009723956059 0.261860649935008 -0.097640070932980 0.632976910516004
oa =
65.000000000000043 0 0 0 0
0 -21.276765471473812 0 0 0
0 0 -13.126280930709234 0 0
0 0 0 21.276765471473780 0
0 0 0 0 13.126280930709219
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
ans =
17.000000000000025 24.000000000000021 1.000000000000018 8.000000000000014 15.000000000000018
23.000000000000028 4.999999999999996 7.000000000000024 14.000000000000025 16.000000000000021
4.000000000000025 6.000000000000012 12.999999999999991 20.000000000000000 22.000000000000011
10.000000000000021 12.000000000000012 18.999999999999996 20.999999999999993 3.000000000000002
11.000000000000016 18.000000000000018 24.999999999999996 1.999999999999985 8.999999999999998
ans =
1.0e-13 *
-0.248689957516035 -0.213162820728030 -0.182076576038526 -0.142108547152020 -0.177635683940025
-0.284217094304040 0.044408920985006 -0.239808173319034 -0.248689957516035 -0.213162820728030
-0.248689957516035 -0.115463194561016 0.088817841970013 0 -0.106581410364015
-0.213162820728030 -0.124344978758018 0.035527136788005 0.071054273576010 -0.017763568394003
-0.159872115546023 -0.177635683940025 0.035527136788005 0.150990331349021 0.017763568394003
k =
1
Dk =
1.000000000000001 0 0 0 0
0 -0.327334853407289 0 0 0
0 0 -0.201942783549373 0 0
0 0 0 0.327334853407289 0
0 0 0 0 0.201942783549373
k =
2
Dk =
1.000000000000001 0 0 0 0
0 0.107148106255172 0 0 0
0 0 0.040780887827669 0 0
0 0 0 0.107148106255171 0
0 0 0 0 0.040780887827669
k =
3
Dk =
1.000000000000003 0 0 0 0
0 0.011480716674070 0 0 0
0 0 0.001663080812013 0 0
0 0 0 0.011480716674069 0
0 0 0 0 0.001663080812013
k =
4
Dk =
1.000000000000005 0 0 0 0
0 0.000131806855350 0 0 0
0 0 0.000002765837787 0 0
0 0 0 0.000131806855350 0
0 0 0 0 0.000002765837787
k =
5
Dk =
1.000000000000011 0 0 0 0
0 0.000000017373047 0 0 0
0 0 0.000000000007650 0 0
0 0 0 0.000000017373047 0
0 0 0 0 0.000000000007650
Tehtävä 5.
t=linspace(0,2*pi);x=cos(t);y=sin(t);plot(x,y) axis equal; axis square hold on;t=linspace(0,2*pi,10);x=cos(t);y=sin(t);plot(x,y,'r')