Neljännen viikon tehtävät
Tehtäväpohja on seuraavanlainen:
def main():
t = np.arange(3) + 1 # Älä koske
ydot = np.arange(3) + 4 # Älä koske
f = 1.41 # Älä koske
tau = aliohjelma1(t,f) # Älä koske
z1,z2 = aliohjelma2(t,ydot,f,tau) # Älä koske
print(tau,z1,z2) # Älä koske
#Kirjoita aliohjelma1 ja aliohjelma2 tähän
Tulet tarvitsemaan tämän tehtävän koodia myöhemmin tällä kurssilla, pidä se siis tallessa! Sinun tehtäväsi on luoda funktio, joka laskee datan periodisuuden. Funktio laskee taun arvon ja palauttaa.
Tau lasketaan seuraavasti:

Saadaksesi arvot Z1 ja Z2 tarvitset taun arvoa.
Z1 lasketaan seuraavasti:

Z2 lasketaan seuraavasti:

Aloita tehtävä tekemällä aliohjelma1(t,f), joka laskee taun arvon. Luo seuraavaksi aliohjelma2(t, ydot, f, tau), joka laskee Z1 ja Z2 arvot. Tulosta lopuksi saadut arvot:
0.049645390070921835 1.148441416869862 11.856172028052134
Python3:n float-tyypillä on monia ominaisuuksia. Datan käsittelyssä tahdomme usein vähentää desimaaleja. Tutustu laajaan formatointiohjeeseen täällä.
Seuraavaksi todella yksinkertainen harjoitus Pythonin float numeroiden formatista. Tehtäväpohja on seuraavanlainen:
def main():
a = 2/3
b = np.pi
c = 11.123123123123
Tehtävä on tehty oikein, kun tulostat:
0.67 3.1416 11.123 0.67 3.1416 11.123
Mittauksista ja muista tutkimuksista saadaan usein isoja, jopa tuhansien rivien datatiedostoja. Näiden käsittelyyn Python3 on tehokas työkalu.
Datan käsittely tapahtuu Python3:ssa helpoiten file-tyyppisillä muuttujilla. Ensin määritellään, mitä tiedostoa käsitellään, kuinka sitä käsitellään ja miten käsittely jatkuu. Lopuksi tiedosto suljetaan, jottei se korruptoidu.
def main():
file = open('input.dat', 'r')
Ylläoleva komento avaa tiedoston input.dat ja asettaa sen lukutilaan. Lukutilassa voimme kätevästi siirtää datatiedoston arvoja muuttujiin.
def main():
file = open('input.dat', 'r')
tiedot = file.readlines()
x = []
y = []
for rivi in tiedot:
osarivi = rivi.split()
x.append(float(osarivi[0]))
y.append(float(osarivi[1]))
Ylläoleva koodi siis avaa input.dat-tiedoston ja lukee siitä kaksi saraketta muuttujiin x ja y.
NumPy sisältää myös kätevän tiedoston luku ominaisuuden.
def main():
infile = 'input.dat'
x = np.loadtxt(infile, usecols=(0,))
y = np.loadtxt(infile, usecols=(1,))
Ylläolevalla komennolla käyttäjän ei tarvitse käydä dataa uudelleen for-loopilla läpi vaan se saadaan suoraan muuttujille.
Vastaavasti tiedostoon kirjoittaminen toimii lähes samalla tavalla.
def main():
file = open('output.dat', 'w')
Nyt olemme alustaneet output.dat-tiedoston ja määrittäneet että siihen tallennetaan tietoa. Seuraava vaihe riippuu täysin siitä mitä tiedostoon halutaan laittaa, mutta esimerkiksi lukujen kirjoitus tapahtuisi seuraavasti:
file = open('output.dat', 'w')
i = 0
while (i < len(x)):
file.write("%6.2f\n"%(x[i]))
i++
file.close()
Tämä koodi kirjoittaa kuvitellun muuttujan x listan kokonaisuudessaan output.dat-tiedostoon, siten että luvut ovat allekkain.
Tehtäväpohja on seuraavanlainen:
def main():
lista=[]
#Tee tehtävä tähän
###################################
print(lista)
Tehtävän mukana tulee tiedosto model.dat. Tehtävänäsi löytää datasta rivi, missä on D-sarakkeessa luku 25 (25. päivä) ja siirtää se annettuun lista muuttujaan. Tehtävä on oikein, kun listassa on seuraava rivi:
['2454399.48 2007 10 25 23 35']
Tehtäväpohjassa tulee mukana input.dat-tiedosto. Tehtävänäsi on lukea input.dat-tiedosto ja luoda output.dat-tiedosto, joka on valmiiksi LaTeX-taulukko muotoa. Output.dat-tiedostossa pitää olla yhdellä rivillä 8 lukua ja rivejä pitäisi olla 25. Tehtävä on oikein, kun output.dat-tiedosto näyttää seuraavalta:
0.01 & 7.73 & 1.20 & 7.69 & 2.05 & 7.72 & 3.13 & 7.69 \\ 4.16 & 7.69 & 5.03 & 7.70 & 5.14 & 7.71 & 5.17 & 7.73 \\ ...
Huomaa, että testien läpäisemiseksi rivien tulee olla tarkalleen esimerkin mukaisessa formaatissa (jokaiselle luvulle on varattu kahdeksan merkin tila, luvun jälkeen kaksi välilyöntiä ennen &-merkkiä).
Tehtäväpohjassa tulee mukana input.dat-tiedosto. Tehtävänäsi on lukea tämä tiedosto, jossa on 528 riviä, ja luoda output.dat-tiedosto, joka on valmiiksi LaTeX-taulukon muodossa. Output.dat-tiedostossa on 50 riviä. Ensimmäisessä sarakkeessa ovat 50 ensimmäistä ajanhetken arvoa t kahden desimaalin tarkkuudella. Toisessa sarakkeessa on taas seuraavat 50 arvoa jne. Viimeisessä 11. sarakkeessa on 28 arvoa, sillä data loppuu kesken. Tehtävä on oikein, kun output.dat-tiedosto näyttää seuraavalta:
Kolme ensimmäistä riviä
1.08 & 31.26 & 65.09 & 97.47 & 128.28 & 156.09 & 190.26 & 239.08 & 274.36 & 314.07 & 346.38 \\ 1.24 & 31.43 & 65.27 & 98.09 & 128.47 & 156.27 & 190.43 & 239.23 & 277.07 & 314.22 & 347.38 \\ 1.40 & 32.09 & 65.46 & 98.28 & 132.09 & 156.46 & 191.09 & 239.38 & 277.22 & 314.36 & 348.08 \\
Kolme viimeistä riviä
29.25 & 62.09 & 94.47 & 127.28 & 154.09 & 188.26 & 238.08 & 272.36 & 308.07 & 345.38 & \\ 29.43 & 62.27 & 97.09 & 127.47 & 154.28 & 188.43 & 238.23 & 274.07 & 308.22 & 346.08 & \\ 31.09 & 62.45 & 97.28 & 128.09 & 154.46 & 190.09 & 238.38 & 274.22 & 308.36 & 346.23 & \\Kiinnitä tässäkin tehtävässä erityistä huomiota tulosteen formaattiin. Nyt jokaiselle luvulle varattu tila on yhteensä yhdeksän merkkiä.