Harjoitus -- Ratkaisut Listat a Table-komento Huom. (*-merkki aloittaa kommentin ja *)-merkki päättää sen. In[5]:= Table x, x,. x:n arvo, viimeinen x:n arvo, askelpituus Out[5]=, 4, 9,, 5, 3, 49, 4, 8,,, 44, 9, 9, 5, 5, 89, 34, 3, 4, 44, 484, 59, 57, 5, 7, 79, 784, 84, 9, 9, 4, 89, 5, 5, 9, 39, 444, 5,, 8, 74, 849, 93, 5,, 9, 34, 4, 5,, 74, 89, 9, 35, 33, 349, 334, 348, 3, 37, 3844, 399, 49, 45, 435, 4489, 44, 47, 49, 54, 584, 539, 547, 55, 577, 599, 84, 4, 4, 5, 74, 889, 75, 75, 739, 759, 7744, 79, 8, 88, 844, 849, 883, 95, 9, 949, 94, 98, tai lyhyemmin (oletusarvoisesti ensimmäinen arvo ja askelpituus ovat ): In[]:= Table x, x, Out[]=, 4, 9,, 5, 3, 49, 4, 8,,, 44, 9, 9, 5, 5, 89, 34, 3, 4, 44, 484, 59, 57, 5, 7, 79, 784, 84, 9, 9, 4, 89, 5, 5, 9, 39, 444, 5,, 8, 74, 849, 93, 5,, 9, 34, 4, 5,, 74, 89, 9, 35, 33, 349, 334, 348, 3, 37, 3844, 399, 49, 45, 435, 4489, 44, 47, 49, 54, 584, 539, 547, 55, 577, 599, 84, 4, 4, 5, 74, 889, 75, 75, 739, 759, 7744, 79, 8, 88, 844, 849, 883, 95, 9, 949, 94, 98, Summa lasketaan Sum-funktiolla, Length antaa listan alkioiden lukumäärän. In[7]:= Sum i, i, Length Out[7]= 338 35 Toinen, kätevä tapa laskea taulukon alkioiden summa on Total-funktiolla, argumentiksi annetaan summattava lista. In[8]:= Total Out[8]= 338 35 b Pistetulo Vektoreita ja matriiseja kuvataan Mathematicassa listoilla: In[9]:= a, 3 ; b, ; Vektorien välinen kulma on cos Α a b a b vektorin pituus Norm-funktiolla. Α-kirjain kirjoitetaan esc-a-esc.. Pistetulo lasketaan Dot-funktiolla (tai kirjoittamalla piste vektorien väliin) ja
hratk.nb In[3]:= a.b Α ArcCos N Norm a Norm b Out[3]=.944 Yo. kulma on radiaaneja. Sama asteina on In[3]:= Α Degree Out[3]= 8.9 c Ristitulo Kahden vektorin ristitulo on kohtisuorassa kumpaakin vektoria vastaan, ts. kohtisuorassa niiden määrämää tasoa vastaan. Huom. ristitulo on määritelty vaan kolmiulotteisille vektoreille. Ristitulovektorista saa yksikkövektorin jakamalla pituudella. In[3]:= a,, 3 ; b,, ; n Cross a, b ; n n Norm n Out[34]= 3,, d Matriisit Matriisi määritellään Mathematicassa listana, jonka alkiot ovat listoja. Nämä osalistat vastaavat matriisin vaakarivejä. Eigenvectors-komento antaa listan, jonka alkiot ovat matriisin ominaisvektoreita. In[35]:= M m,, 3, ; mi Inverse m ; evec Eigenvectors m ; eval Eigenvalues m ; x evec ; x evec ; Λ eval ; Λ eval ; Print "M ", MatrixForm m Print "det M ", Det m Print "M:n käänteismatriisi: M ", MatrixForm mi Print "M:n ominaisvektorit: X ", MatrixForm x, " ja X ", MatrixForm x Print "M:n ominaisarvot: Λ ", Λ, " ja Λ ", Λ 3 det M 5 M:n käänteismatriisi: M 5 3 5 5 5 M:n ominaisvektorit: X 3 3 ja X 3 3 M:n ominaisarvot: Λ 3 ja Λ 3 Tarkistetaan tulokset. Nyt täytyisi olla M M M M I, ja M X i Λ i X i, i,.
hratk.nb 3 In[48]:= m.mi MatrixForm mi.m MatrixForm m.x Λ m.x Λ Out[48]//MatrixForm= Out[49]//MatrixForm= Out[5]//MatrixForm= Out[5]//MatrixForm= MatrixForm MatrixForm 3 3 3 3 3 3 3 3 3 3 3 3 3 3 Nyt ominaisvektorit on vain esitetty eri muodossa. FullSimplify paljastaa yhtäsuuruuden (Voit kokeilla myös Simplifyfunktiota. Se ei osaa sieventää kompleksilukuja): In[5]:= Print MatrixForm FullSimplify x, " ", MatrixForm FullSimplify m.x Λ Print MatrixForm FullSimplify x, " ", MatrixForm FullSimplify m.x Λ e Indeksöinti Muuttujien indeksöinti on kätevä tapa käsitellä useampaa kuin yhtä muuttujaa jonkin kollektiivisen nimen ja numeron avulla. Tämä eroaa listoista siinä mielessä, että "listan" kokoa ei tarvitse määritellä -- indeksöinti vastaa ikään kuin tietokannan luomista. Huom. seuraava komento asettaa A:n arvoksi MatrixForm-muodossa olevan olion. Sen jälkeen A:ta käsiteltäessä olisi aina kirjoitettava A[[]] jos haluttaisiin viitata koko listaan. FullForm-komento näyttää kaikki olion rakenneosat (sitä ei yleensä tarvitse missään). Esim. aaltosulkeilla muodostettu lista on Mathematican sisällä muodossa List[...]. In[54]:= A Table Random, 3, 3 MatrixForm Out[54]//MatrixForm=.485.579.374.487975.438475.55944.7754.339788.477
4 hratk.nb In[55]:= FullForm A A Mathematica ei osaa laskea kertolaskua A Out[55]//FullForm= MatrixForm List List.485339737`,.579354493`,.3743787788`, List.487974858745`,.4384745543977`,.55943535435`, List.7754555774`,.339788359557`,.4774555` Out[5]=.485.579.374.487975.438475.55944.7754.339788.477 Out[57]=.485,.579,.374,.487975,.438475,.55944,.7754,.339788,.477 Kannattaa siis erottaa MatrixForm-komento matriisin luomiskäskystä. In[58]:= A Table Random, 3, 3 ; MatrixForm A Out[59]//MatrixForm=.7394.4735.5399.877.543359.5435.475.85.973 Eigenvectors-funktio antaa taulukon, jonka alkiot ovat matriisin ominaisvektorit. Huomaa pistetuloista, että Eigenvectorskomento automaattisesti normittaa ominaisvektorit (pituus on ). In[]:= a. evec Eigenvectors A ; a evec ; a evec ; a 3 evec 3 ; Table a i.a j, i, 3, j, 3 MatrixForm Out[5]//MatrixForm=..73.739.73..54799.739.54799. Indeksöinnin etuja on se, että ominaisvektorit voidaan merkitä vaikka ominaisarvojen avulla. Toisaalta tämä merkintä saattaa vaikeuttaa niihin viittaamista, ja ominaisvektorien oletusarvoinen järjestys on melko hyvä (suurinta ominaisarvoa vastaava vektori on ensimmäinen ja pienintä vastaava viimeinen). Toisaalta taas, jos ominaisarvoja on paljon (suuri matriisi) ja halutaan jotain tiettyä ominaisarvoa vastaava ominaisvektori, niin tällä merkinnällä on etunsa. In[]:=? a Global`a a.44839,.487,.75743 a.89745,.8793,.3498 a 3.5773,.544,.9373 Seuraavassa Do[lauseke,{i,imax}] suorittaa lausekkeen, joka riippuu i:stä, imax kertaa. Lisää tästä seuraavissa harjoituksissa. Huom. indeksöityä muuttujaa ei saa tyhjennettyä komennolla a=., vaan tarvitaan Remove-käsky. In[7]:= Remove a ; eval Eigenvalues A ; Do a eval i evec i, i, 3
hratk.nb 5 In[7]:=? a Global`a a.5448.5773,.544,.9373 a.5334.89745,.8793,.3498 a.478.44839,.487,.75743 Indeksöintiä tullaan käyttämään myöhemmin lisää. Kuvaajien piirtäminen a) Perus-plottaus In[7]:= Plot Sin x, Cos x, x,, Π.5 Out[7]= 3 4 5.5. b) Pisteiden plottaus Prime[n] antaa n:nnen alkuluvun (ts. Prime[]=, Prime[]=3, jne) In[7]:= Out[7]= alkuluvut Table n, Prime n, n, ListPlot,,, 3, 3, 5, 4, 7, 5,,, 3, 7, 7, 8, 9, 9, 3,, 9,, 3,, 37, 3, 4, 4, 43, 5, 47,, 53, 7, 59, 8,, 9, 7,, 7 7 5 Out[73]= 4 3
hratk.nb c Parametrinen käyrä ParametricPlot-funktio sotkee jostain syystä kuvan mittasuhteet. Mittasuhteita voi säätää asetuksella AspectRatio. GoldenRatio on matemaattinen vakio, "kultaisen leikkauksen" suhdeluku. In[74]:= x t : t 3 t ; y t : Sin t ; ParametricPlot x t, y t, t,,, AspectRatio GoldenRatio.8.7. Out[75]=.5.4.3 d Manipulate-komennolla mitä tahansa lausekkeita voidaan kätevästi muokata jonkin parametrin suhteen -- erinomainen työkalu havainnollistamiseen. Syntaksi on Manipulate[lauseke,{p,pmin,pmax}], missä lauseke riippuu parametrista p. Plotkomennon asetus PlotRange määrää y-akselin rajat. In[7]:= a.; x.; Sin a x Manipulate Plot, x,,, PlotRange,, a,, x a 8 Out[77]= 4 Manipulate toimii minkä tahansa lausekkeiden kanssa. Esim.
hratk.nb 7 In[78]:= Manipulate x, x,, x Out[78]= 5. In[79]:= Manipulate Sum xi, i,, n, n,, i n Out[79]= x x x3 x4 x5 x x7 x8 x9 x 4 7 54 4 3 3 88 3 8 8 Myös useamman parametrin suhteen voidaan manipuloida. In[8]:= Manipulate Plot3D Sin a x Cos b y, x, Π, Π, y, Π, Π, a,.5,, b,.5, a b Out[8]=..5..5.
8 hratk.nb In[85]:= i.; n.; Manipulate ListPlot Table i, Prime i, i,, n, n,, n 35 3 5 Out[8]= 5 5 3 Tiedostonkäsittely Tiedostoja luotaessa on hyvä tietää, mihin ne luodaan. Directory[] antaa senhetkisen työhakemiston. Jos haluat muuttaa oletusarvoa, käytä SetDirectory["hakemistopolku"]-funktiota. In[87]:= Out[87]= Directory C:\Documents and Settings\mattas\My Documents Jos tiedostoon kirjoitetaan >>-komennolla, taulukot kirjoittuvat aaltosulkeineen päivineen, ts. tiedostoon tulee Mathematicakoodia. Tiedostoa, johon kirjoitetaan, ei tarvitse erikseen luoda. In[88]:= alkuluvut harjt3a.m Tiedoston sisältämä Mathematica-koodi ajetaan <<-komennolla. Tiedoston viimeisen käskyn tulos tulostetaan näytölle, ja sen voi vaikka sijoittaa muuttujaan. Tämä mahdollistaa funktioiden kirjoittamisen tiedostoon. In[89]:= alkuluvut. alkuluvut harjt3a.m Out[9]=,,, 3, 3, 5, 4, 7, 5,,, 3, 7, 7, 8, 9, 9, 3,, 9,, 3,, 37, 3, 4, 4, 43, 5, 47,, 53, 7, 59, 8,, 9, 7,, 7 Komennolla <<< lisätään jo olemassa olevan tiedoston loppuun (<< tyhjentäisi tiedoston). In[9]:= alkuluvut Table n, Prime n, n,, 4 ; alkuluvut harjt3a.m Nyt jos yllä luodun tiedoston sisältö ajetaan Mathematicassa, se tulostaa vain viimeksi lisätyn taulukon sisällön. In[93]:= Out[93]= harjt3a.m, 73,, 79, 3, 83, 4, 89, 5, 97,,, 7, 3, 8, 7, 9, 9, 3, 3, 3, 7, 3, 3, 33, 37, 34, 39, 35, 49, 3, 5, 37, 57, 38, 3, 39, 7, 4, 73
hratk.nb 9 Jos taulukko halutaan kirjoittaa tiedostoon nättiin taulukkomuotoon, voidaan käyttää esim. Export-funktiota (argumentti "Table" kertoo, että taulukko kirjoitetaan tiedostoon kaksisarakkeisessa muodossa: In[94]:= Out[94]= Export "harjt3a.txt", alkuluvut, "Table" harjt3a.txt Tällöin tosin tiedoston loppuun lisääminen ei onnistu. Listat voi vaikka yhdistää ennen tiedostoon kirjoittamista, Joinfunktiolla: In[95]:= Out[95]= In[9]:= Out[9]= Join alkuluvut, alkuluvut,,, 3, 3, 5, 4, 7, 5,,, 3, 7, 7, 8, 9, 9, 3,, 9,, 3,, 37, 3, 4, 4, 43, 5, 47,, 53, 7, 59, 8,, 9, 7,, 7,, 73,, 79, 3, 83, 4, 89, 5, 97,,, 7, 3, 8, 7, 9, 9, 3, 3, 3, 7, 3, 3, 33, 37, 34, 39, 35, 49, 3, 5, 37, 57, 38, 3, 39, 7, 4, 73 Export "harjt3a.txt",, "Table" harjt3a.txt Kahteen sarakkeeseen kirjoitettuja taulukoita luetaan tiedostoista Import-komennolla. Se siis lukee raakaa dataa ja muuttaa sen Mathematicassa käytettävään muotoon. In[97]:= Out[97]= Import "harjt3a.txt", "Table",,, 3, 3, 5, 4, 7, 5,,, 3, 7, 7, 8, 9, 9, 3,, 9,, 3,, 37, 3, 4, 4, 43, 5, 47,, 53, 7, 59, 8,, 9, 7,, 7,, 73,, 79, 3, 83, 4, 89, 5, 97,,, 7, 3, 8, 7, 9, 9, 3, 3, 3, 7, 3, 3, 33, 37, 34, 39, 35, 49, 3, 5, 37, 57, 38, 3, 39, 7, 4, 73 b Tämä tehtävää varten ladataan Units-paketista yksiköiden määrittelyt. Kun nämä käskyt kirjoitetaan erilliseen tiedostoon (ks. harjt3b.m), yläindeksejä sun muita ei voi käyttää. In[98]:= Units` Nopeusfunktiossa t on aika sekunteina, joten aina kun t esiintyy kaavassa, lisätään perään yksikkö Second. In[99]:= a. Second ; b 4 Second ; t.; v t :,, Meter Second ; v t : a t Second,, b t Second Meter Second ; Kappaleen paikka ajan funktiona on r t r t v t' t', tai vakionopeuden tapauksessa r t r v t. Integraali lasketaan Mathematicassa komennolla Integrate[f,{x,xmin,xmax}], missä f on jokin x:n funktio, ja integroimisrajat ovat xmin:stä xmax:iin. Määrittelen seuraavassa kappaleen paikan t:n funktioksi, joten integroimismuuttujalle on annettava jokin toinen nimi, esim. 'ti'. In[]:= r,, Meter; r t : r v t t Second r t : r Integrate v ti, ti,, t Second Funktioiden r ja r lausekkeilla pitäisi olla yksikkönä Meter.
hratk.nb In[]:= Out[]= r t r t Meter Meter t, Meter t, Meter Meter t Out[]= Meter. Meter t, Meter t, Meter Meter t3 Integroimis- ja piirtämisrajojen (PlotRange) hakeminen tapahtuu yrityksen ja erehdyksen kautta. Ei tästä lentoradasta kovin hienoa kuvaa saa. Huom. r[t]:llä on yksikkö Meter. Piirtofunktio ei osaa käsitellä sitä, joten se pitää jakaa pois. In[5]:= ParametricPlot3D r t Meter, t,,, PlotRange,,,,, Out[5]=
hratk.nb In[]:= ParametricPlot3D r t Meter, t,,, PlotRange,,,,, Out[]= Samat käskyt, ei-vakioisen nopeuden tapauksessa, on kirjoitettu tiedostoon harjt3b.m. Tallenna se Directory[]-funktion näyttämään hakemistoon ja aja se. In[3]:= harjt3b.m Out[3]=
hratk.nb c) Käytetään taas indeksöityjä muuttujia. In[4]:= a. A,,,,,,,, ; Do a i Eigenvectors A i, i, 3 Seuraavassa r:n on oltava vektori (ts. jokin olio, jolle pistetulo a[i]:n kanssa on määritelty). In[7]:= In[8]:= Out[8]= f r : Sum a i.r, i, 3 f,, Voitaisiin myös määritellä In[9]:= In[]:= Out[]= a i. x, y, z g x, y, z : Sum, i, 3 g,, Huomaa ero funktioiden f ja g käytössä! f ottaa vain yhden argumentin, joka on vektori (3-alkioinen lista). g ottaa kolme argumenttia. Piirretään f:n kuvaaja: In[]:= Manipulate Plot3D f x, y, z, x,,, y,,, PlotRange, 5, z, 3, 3 z.98 Out[]= 4..5..5..5..5..