Vektorit Opiskelijan ohjeet Ohjelmointipaketti lukioon Työ on tehty osana Helsingin yliopiston kurssia Ohjelmointi matematiikan opetuksessa. Työtä saa vapaasti jakaa eteenpäin, muokata sekä käyttää. Tekijät: Antti Jylhä-Ollila Tom Olander Heli Virtanen 3.5.2018
Sisältö 1 Tunti 1 2 1.1 Turtle-kertaus / Python-kertaus....................... 2 1.2 Tehtävänannot................................. 2 1.3 Kotitehtävät.................................. 3 2 Tunti 2 4 2.1 Tehtävänannot................................. 4 2.2 Kotitehtävät.................................. 4 3 Tunti 3 6 3.1 Tehtävänannot................................. 6 3.2 Kotitehtävät.................................. 7 A Tunti 1 - esitiedot 8 B Tunti 2 - esitiedot 11 C Tunti 3 - esitiedot 13 1
1 Tunti 1 1.1 Turtle-kertaus / Python-kertaus Kertaukseen liittyvä tiedosto löytyy tekstimuodosta liitteestä A sekä tiedostona opiskelijan ohjeiden kansiosta. Lue tämä läpi. Ota kaikissa tiedostoissasi käyttöön vectorskirjasto ja lisää koodisi loppuun waitforclick(), jotta ehdit nähdä koodisi tulokset. 1.2 Tehtävänannot Lataa [opettajan antamasta paikasta] tausta, jolla jolla saat valmiin koordinaatistoakselin. Koordinaatistossa kilpikonnaasi edustaa sana pen. Tee seuraavat tehtävät laittaen kilpikonnasi (pen) piirtämään ne. Koordinaatistossa oletuksena on, että x-akselin maksimiarvo on 10 ja minimiarvo on -10, samoin y-akselille. 1. Piirrä vektori 5 i. Vektorin päässä on nuoli. [Kuva 1] 2. Piirrä vektori 7 i + 2 j. Vektorin päässä on nuoli. Käytä hyväksesi trigonometriaa. [Kuva 2] 3. Muunna koordinaatiston kokoa niin, että x ja y vaihtelevat välillä -15 ja 15. Piirrä 10 erikokoista vektoria v = a i + b j, joiden komponentit a ja b arvotaan molemmat yksitellen väliltä -10...10. Kaikki vektorit lähtevät origosta. [Kuva 3] Lisäksi muuta tehtävän vektoreiden ominaisuuksia: a) Lisää värejä. b) Muuta vektorin paksuutta. c) Muunna tehtävää niin, että kaikki 10 vektoria osuvat ympyrän kehälle (säde = 10). [Kuva 4] Kuva 1: Esimerkkikuva piirrettävästä vektorista tehtävään 1. Kuva 2: Esimerkkikuva piirrettävästä vektorista tehtävään 2. 2
Kuva 3: Esimerkkikuva piirrettävistä vektorista tehtävään 3. Kuva 4: Esimerkkikuva piirrettävistä vektorista tehtävään 3. 1.3 Kotitehtävät Valitse ainakin toinen tehtävistä 1a tai 1b. 1. Piirrä vektorit sekä niiden summa a + b sekä erotus a b, kun a) a = 4 i, b = 3 j b) a = 2 i 4 j, b = 3 i + 5 j. 2. Piirrä neliö vektoreilla. Mikä on näiden vektoreiden summavektori? 3. Piirrä vektoreilla säännöllinen kuusikulmio. Mikä on näiden vektoreiden summavektori? 3
2 Tunti 2 Esimerkki kirjaston käytöstä löytyy liitteestä B. 2.1 Tehtävänannot Lataa vektori-kirjasto [opettajan antamasta paikasta]. Muista myös koordinaatiston skaalaaminen tarvittaessa. Testaa kirjaston toiminta piirtämällä seuraavat vektorit: a = 5 i, b = 2 i + 2 j, c = 3 i 8 j ja d = 5 i + 4 j. 1. Laske ja piirrä seuraavat vektorit: a) a + b ja b + a b) c + d c) c d ja d c d) a + b + c d. 2. Piirrä vektori b viisi kertaa peräkkäin. Vaihda väriä, laske vektori e = 5 b ja piirrä se. a) Miltä näyttää vektori 5 b? b) Piirrä vektorit 2 c + 3 d ja 2( c b). 3. Palauta koordinaatiston kooksi (-10,10). Aloituspiste on (0,0). Valitse vektorille suunta (eli kulma) ja piirrä yksikkövektoreita tähän suuntaan, kunnes seuraava vektori ei enää mahdu koordinaatistoon. [Kuva 5] a) Laske kulma, jossa vektori osui reunaan ja lähetä se samassa kulmassa eteenpäin kääntyen oikealle. b) Automatisoi vektoreiden piirto niin, että aina kun seuraava vektori ei mahdu enää ruudulle, kimpoaa reunasta niin, että tulokulma on sama kuin lähtökulma. Vektoreita piirtyy niin kauan kunnes ohjelma lopetetaan tai kunnes on piirretty haluttu määrä (esim. 50) vektoreita. c) Mallinna kitkaa, eli joka kerta kun vektori on piirretty edellisen perään, seuraavan vektorin pituus on 99.5% edellisen vektorin pituudesta. Lopeta ajo, kun vektorin pituus on alle 0,01. d) Mitä tämä vektoreiden joukko voisi esittää? 2.2 Kotitehtävät Tee ainakin ensimmäinen tehtävä. 1. Käytössäsi on vektori a = 3 i 5 j. Piirrä se. Vaihda väriä ja piirrä vektorin komponenttivektorit. 4
Kuva 5: Kuva alueen reunaan osumisesta ja siitä jatkamisesta. 2. Käytössä on kaksi vektoria, b = 4, 5 i + 2, 3 j ja c = 3, 2 i + 5, 7 j. Laske ja piirrä seuraavat vektorit t b + s c, a) Kun t = 3 ja s = 4. b) Kun t = 3 ja s = 4. c) Kun t = 3 ja s = 4. d) Kun t = 3 ja s = 4. 3. Jatka edellistä tehtävää, ja automatisoi se käyttäen esimerkiksi for-looppia, kun s = { 1, 0, 1} ja t = { 2, 1, 0, 1, 2}. 4. Jatka kotona tuntitehtäviä. 5
3 Tunti 3 3.1 Tehtävänannot Lataa vektori-kirjasto [opettajan antamasta paikasta]. Muista myös koordinaatiston skaalaaminen tarvittaessa. Tutustu myös esitietoihin! Testaa kirjaston toiminta piirtämällä seuraavat alaspäin aukeavat paraabelit, jotka kulkevat kaikki origon kautta ja joiden huippupisteet ovat (4,4), (3,7) ja (8,3). 1. Piirrä alaspäin aukeava paraabeli, jonka huippu on pisteessä (5,3). [Kuva 6] a) Piirrä paraabelin tangentin suuntainen vektori pisteeseen, missä x-koordinaatti on 0. b) Piirrä toisella värillä edellisen vektorin i-komponentti, jonka pituus on 1. Piirrä vielä kolmannella värillä a-kohdan vektorin j-komponentti (pituus k). Kulmakertoimen k saat kirjaston komennolla getk(x0), tämä kertoo tangentin kulmakertoimen kohdassa x = x0. c) Tee funktio, joka piirtää nämä kaikki kolme vektoria, kun funktiolle annetaan x-koordinaatin arvo. Testaa toiminta piirtämällä vektorit, kun x-koordinaatti on 0, 5 ja 8. 2. Paraabelin yhtälö on muotoa y = a x x + b x + c. Piirrä paraabeli käyttämällä apuna paraabelin yhtälöä, kun a = 3 25, b = 6 5 ja c = 0.Tangentin kulmakertoimen pisteessä x0 saat yhtälöstä k = 2 a x0 + b. a) Piirrä paraabelin pisteelle, jossa x=0 tangentin suuntainen vektori ja sen ikomponentti (pituus 1) sekä j-komponentti (pituus k). b) Tee funktio, joka piirtää tangentin suuntaisen vektorin sekä sen komponenttivektorit halutussa x-koordinaatissa eri väreillä. c) Testaa toiminta, kun x-koordinaatti on 0, 5 ja 8. 3. Heität palloa lähtökulmassa α = 50 astetta ja pallo saa alkunopeuden v 0 = 10 m s. Putoamiskiihtyvyys g = 9.81 m s 2. (a) Tallenna muuttujaan a kulman arvo radiaanena, eli a=math.radians(50). Tallenna muuttujaan v0 alkunopeus, eli v0=10 ja muuttujaan g putoamiskiihtyvyyden arvo, g=9.81. (b) Laske alkunopeuden x- ja y-komponentit, v0x = v0*math.cos(a) ja v0y = v0*math.sin(a). (c) Tee funktiot, jotka laskevat nopeuden sekä paikan seuraavien kaavojen avulla: vx(t) = v0x vy(t) = v0y - g*t x(t) = v0x*t y(t) = v0y*t - 0.5*g*t*t Lisäksi seuraavasta voi olla hyötyä: t = x(t) / v0x 6
(d) Piirrä lentoradan kuva, kunnes y-koordinaatti muuttuu negatiiviseksi. (e) Piirrä tangenttivektori ja sen komponentit, kun x-arvo on 0, 5 ja 8. Vihje: Laske t tietyllä x, saat y:n. vx(t) ja vy(t):stä ovat komponenttivektoreiden kertoimet. Kuva 6: Esimerkkikuva paraabelista ja piirretyistä tangenttivektoreista komponentteineen. 3.2 Kotitehtävät 1. Sovitaan vektoreiden aloituskohdaksi origo. Piirrä vektori a = 4.5 i 2.8 j. Laske vektorin pituus. Luo uusi vektori, missä a:n komponentit jaetaan a:n pituudella ja piirrä se. Piirrä kuvaan lisäksi ympyrä, jonka keskipiste on origo ja säde on 1 (turtle circle, yksikköympyrä). Mitä huomaat uuden vektorin pituudesta ja suunnasta? 2. Jatka tuntitehtäviä valmiiksi kotona. 7
A Tunti 1 - esitiedot # # Miten käyttää vectors-kirjastoa # # Jos vectors.py kirjasto on samassa hakemistossa kuin koodisi, # niin voit tuoda kirjaston näin: from vectors import * # Kirjasto mahdollistaa koordinaatiston käytön: koord = CoordinateSystem() # Koordinaatiston oletusarvot ovat sekä x että = [-10,10], # mutta voidaan tarvittaessa muuttaa: koord.setaxes(-20,10,-10,20) # Huomaa, että piirtoikkuna on aina saman kokoinen, # joten todellinen koordinaatiston koko # ei välttämättä ole sama kuin määrittelemämme. # Kirjasto pyrkii pitämään i ja j yksikkövektorit # samanpituisina näytöllä, # jolloin voidaan käyttää perinteisiä laskukaavoja koskien kulmia. # Määritelty alue on joka tapauksessa aina näkyvillä, # mutta ikkuna voi olla myös suurempi. # Kirjasto käyttää Turtle-grafiikkaa, # joten kaikki perinteiset Turtle-ominaisuudet ovat käytettävissä. # Turtle-kynä on muutujassa "pen". # piirrä jana pisteestä (4,4) pisteeseen (-4,4) # sinisellä värillä ja kynäpaksuudella 3 pen.penup() pen.goto(4,4) pen.pencolor("blue") pen.width(3) pen.pendown() pen.goto(-4,4) # piirrä ympyrä alkaen pisteestä (0,-4), # muodostaen säännöllisen 50-kulmion # jonka keskipiste on (0,0) kun säde on 4 pen.penup() pen.pencolor("black") 8
pen.width(1) pen.goto(0,-4) pen.pendown() pen.circle(4,steps=50) # Näin kopioit muuttujan pen arvoa toiseen muuttujaan. # Kyseessä on viittaus olioon, # joten kaikki ominaisuudetkin periytyvät. # Huomaa, että tämänkin jälkeen # pen toimii viittauksena turtleen. kilppari = pen kilppari.pencolor("pink") kilppari.width(5) kilppari.goto(4,-4) ### TRIGONOMETRIA ### # Trigonomtriset funktiot Pythonissa (tarvitaan kun lasketaan kulmilla) # Pythonissa kaikki trigonometriset funktiot # saadaan käyttöön math-kirjastolla # import math # Matematiikassa ja ohjelmointikielissä käytetään # useimmiten radiaaneja yksikkönä, # joten meidän pitää osata tehdä # muunnoksia asteiden ja radiaanien välillä # asteista radiaaneihin: # kulma_radiaaneina = math.radians(kulma_asteina) # radiaaneista asteisiin: # kulma_asteina = math.degrees(kulma_radiaaneina) # tavalliset trigonometriset funktiot (käyttävät radiaaneja!): # s = math.sin(kulma) # c = math.cos(kulma) # t = math.tan(kulma) # Jos haluamme laskea esim sin(50astetta), # niin se tehdään esim näin: # s = math.sin(math.radians(50)) # tämän lisäksi tarvitsemme myöskin # "käänteisfunktiot" näille, eli arcus-funktiot # Arcustrigonometrisia funktioita käytetään, # kun halutaan laskea kulman koko. # kulma = math.asin(vastainen_kateetti / hypotenuusa) # kulma = math.acos(viereinen_kateetti / hypotenuusa) 9
# kulma = math.atan(vastainen_kateetti / viereinen_kateetti) # tämän lisäksi on hyödyllistä käyttää # seuraavaa versiota atan-funktiosta: # kulma = math.atan2(vastainen_kateetti, viereinen_kateetti) # atan2-funktio pystyy käsittelemään # kaikkia kulmia välillä [0,2pi] = [0,360] astetta # HUOM! arcus-funktiot palauttavat kulman radiaaneissa!!!!! # Jos haluamme laskea atan2(5,3) # ja saada vastauksen asteina, niin voimme tehdä esimerkiksi: # k = math.degrees(math.atan2(5,3)) # satunnaislukugeneraattori Pythonissa # lue sisään random kirjasto import random # asetetaan satunnaisukuja x- ja y-muuttujallie x = random.random() #.random() ei ota attribuutteja y = random.randrange(1,5) # x saa satunnaisen arvon välillä [0,1[, # eli kaikki mahdolliset arvot 0 ja 1 välillä, # mukaanlukien 0 ja poislukien 1. # y saa satunnaisen kokonaisarvon välillä [1,5[, # eli joukosta {1, 2, 3, 4}, # huomaa että 5 ei kuulu joukkoon! # Pyhtonissa on myös olemassa random.randint(1,5), # mutta tässä tapauksessa 5 kuuluu maalijoukkoon, # ja tätä halutaan harvoin ohjelmoinnissa. # Python sulkee ikkunan heti kun ohjelma päättyy, # ja emme kerkeä näkemään aikaansannostamme. # Kirjastossa on olemassa metodi jolla ohjelma pysähtyy # ja jää odottamaan, # että käyttäjä klikkaa ikkunaa ennen sammuttamista. koord.waitforclick() 10
B Tunti 2 - esitiedot # # Miten käyttää vectors-kirjastoa # # Jos vectors.py kirjasto on samassa hakemistossa kuin koodisi, # niin voit tuoda kirjaston näin: from vectors import * # Kirjasto mahdollistaa koordinaatiston käytön: koord = CoordinateSystem() # Koordinaatiston oletusarvot ovat sekä x että y = [-10,10], # mutta voidaan tarvittaessa muuttaa: #koord.setaxes(-20,10,-10,20) # Kirjasto käyttää Turtle-grafiikkaa, # joten kaikki perinteiset Turtle-ominaisuudet ovat käytettävissä. # Turtle-kynä on muuttujassa "pen". # Määritellään vektoreita käyttämällä kirjastoa a = Vector(1,1) b = Vector(-2,2) # Määritellään vektori käyttämällä apumuuttujia # komponenttienkertoimille c_i = 5.5 c_j = 3.1 c = Vector(c_i, c_j) # Piirretään vektorit, oletusvärisenä (musta) # ja käyttämällä värimääritystä # (ns. Web-väri nimet toimivat ja HEX-värikoodit) a.draw() b.draw("red") c.draw("#0000ff") # HEX-värikoodi (#RRGGBB): # - alkaa aina #-merkillä ja sen perään 6 merkkiä RrGgBb # - Rr punaisen värikomponentin määrä hexalukuna # - Gg vihreän värikomponentin määrä hexalukuna # - Bb sinisen värikomponentin määrä hexalukuna # Hexaluvut: [00,FF] vastaa 10-järjestelmässä [0,255] 11
# hexa Rr => 10-järjestelmässä R*16 + r # hexanumerot: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, # missä A ~ 10, B ~ 11, C ~ 12, D ~ 13, E ~ 14, F ~ 15) # Huomaa, että vektorit piirretään niin, # että seuraavan vektori on aina edellisen päätepiste # (ihan niinkuin turtle-grafiikassa muutenkin) # Jos halutaan aloittaa pirtäminen toisesta piseestä: pen.penup() # kynä on oletusarvoisesti alhaalla, joten nostetaan se pen.goto(-1,1) Vector(-4,5).draw("#FF88AA", 2) # vektorit piirretään vaikka Turtle-kynä olisikin ylhäällä! pen.goto(-1,1) Vector(-7,-8).draw("#44AA66", 8) # Huomaa miten nuolen paksuutta muutettiin # Python sulkee ikkunan heti kun ohjelma päättyy, # ja emme kerkeä näkemään aikaansannostamme. # Kirjastossa on olemassa metodi jolla ohjelma pysähtyy # ja jää odottamaan, # että käyttäjä klikkaa ikkunaa ennen sammuttamista. koord.waitforclick() 12
C Tunti 3 - esitiedot # # Miten käyttää vekctors-kirjastoa # # Jos vectors.py kirjasto on samassa hakemistossa kuin koodisi, # niin voit tuoda kirjaston näin: from vectors import * # Kirjasto mahdollistaa koordinaatiston käytön: koord = CoordinateSystem() # Koordinaatiston oletusarvot ovat sekä x että = [-10,10], # mutta voidaan tarvittaessa muuttaa: koord.setaxes(-2,20,-2,20) # Kirjasto käyttää Turtle-grafiikkaa, # joten kaikki perinteiset Turtle-ominaisuudet ovat käytettävissä. # Turtle-kynä on muutujassa "pen". # Kirjastossa on valmiina metodi jolla voi piirtää paraabelin, # joka menee origon kautta # alustetaan paraabeli p p = ParabelOrigo() # määritellään paraabelin huippu p.top(10, 10) # piirretään paraabeli, voidaan valita väri ja paksuus p.draw("red", 2) # Kirjastossa voidaan myös käyttää paraabelin yhtälöä hyväksi # alustetaan paraabeli q q = ParabelOrigo() # annetaan paraabelin yhtälöstä y = ax^2 + bx + c parametreina a ja b, # koska kyseessä on paraabeli origon läpi, niin c on aina 0. q.equation(-.15, 3) # piirretään paraabeli q.draw("blue", 4) # kun paraabeli o määritelty sadaan paraabelin # y-arvo syötteellä x funktiolla.gety(x): # haetaan paraabeli p:n y-arvo, kun x on 10 y = p.gety(10) 13
# kun paraabeli on määritelty saadaan # paraabelin tangentin kulmakerroin tietyssä pisteessä # funktiolla.getk(x): # haetaan paraabelin p:n tangentin kulmakerroin kun x on 5 k = p.getk(5) # miten tämä lasketaan ja mikä hyöty tästä on # tulee myöhemmällä matematiikan kurssilla! # Funktiot toimivat Pythonissa melkein # samoin kuin matematiikassakin # matematiikan fuktio f(x) = 10x - 5 # tehdään Pythonissa seuraavasti: def f(x): return 10*x -5 # Funktion käyttö sen jälkeen kun se on määritelty on helppoa: y = f(10) # y saa arvon 10*10-5 = 95 # HUOM! Pythonissa funktio on pakko määritellä # ohjelmakoodissa ennenkuin sitä voidaan käyttää!!! # Python sulkee ikkunan heti kun ohjelma päättyy, # ja emme kerkeä näkemään aikaansannostamme. # Kirjastossa on olemassa metodi jolla ohjelma pysähtyy # ja jää odottamaan, että käyttäjä klikkaa # ikkunaa ennen sammuttamista. koord.waitforclick() 14