Tehtävät

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:

Taun lauseke

Saadaksesi arvot Z1 ja Z2 tarvitset taun arvoa.

Z1 lasketaan seuraavasti:

Z1 lauseke

Z2 lasketaan seuraavasti:

Z2 lauseke

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ä.

Sisällysluettelo