Vektorit Opettajan ohjeet

Samankaltaiset tiedostot
Vektorit Opiskelijan ohjeet

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla (Opettajan ohje)

Vektoreita GeoGebrassa.

Luento 2: Viivan toteutus

Smart Board lukion lyhyen matematiikan opetuksessa

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Yleistä vektoreista GeoGebralla

Racket ohjelmointia II. Tiina Partanen 2015

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

4.1 Kaksi pistettä määrää suoran

Tekijä Pitkä matematiikka

Tasogeometriaa GeoGebran piirtoalue ja työvälineet

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A)

Ohjelmoinnin perusteet Y Python

Jypelin käyttöohjeet» Ruutukentän luominen

Ohjelmoinnin perusteet Y Python

Matematiikan peruskurssi 2

Ohjelmoinnin perusteet Y Python

x + 1 πx + 2y = 6 2y = 6 x 1 2 πx y = x 1 4 πx Ikkunan pinta-ala on suorakulmion ja puoliympyrän pinta-alojen summa, eli

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin perusteet Y Python

3. Harjoitusjakso I. Vinkkejä ja ohjeita

Ohjelmoinnin peruskurssi Y1

GeoGebra-harjoituksia malu-opettajille

Nopeus, kiihtyvyys ja liikemäärä Vektorit

Ohjelmoinnin perusteet Y Python

Harjoitus 3 -- Ratkaisut

Ohjelmoinnin perusteet Y Python

Vektorilla on suunta ja suuruus. Suunta kertoo minne päin ja suuruus kuinka paljon. Se on siinä.

Tiina Partanen. Koodaamassa Matikantunnilla

Scratch ohjeita. Perusteet

Python-ohjelmointi Harjoitus 5

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Geogebra -koulutus. Ohjelmistojen pedagoginen hyödyntäminen

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

Trigonometriaa ja solve-komento GeoGebralla

Ohjelmoinnin perusteet Y Python

MAB3 - Harjoitustehtävien ratkaisut:

Ohjelmoinnin peruskurssi Y1

BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016

Ohjelmoinnin perusteet Y Python

OHJELMOINTIA MONIPUOLISESTI MATEMATIIKAN OPETUKSESSA LUMA-PÄIVÄT, TAMPERE

2 Pistejoukko koordinaatistossa

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

6. Harjoitusjakso II. Vinkkejä ja ohjeita

Oppimateriaali oppilaalle ja opettajalle : GeoGebra oppilaan työkaluna ylioppilaskirjoituksissa 2016 versio 0.8

= 6, Nm 2 /kg kg 71kg (1, m) N. = 6, Nm 2 /kg 2 7, kg 71kg (3, m) N

811120P Diskreetit rakenteet

TYÖPAJA 1: Tasogeometriaa GeoGebran piirtoalue ja työvälineet

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Octave-opas. Mikä on Octave ja miksi? Asennus


Sen jälkeen Microsoft Office ja sen alta löytyy ohjelmat. Ensin käynnistä-valikosta kaikki ohjelmat

811120P Diskreetit rakenteet

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

a) Sievennä lauseke 1+x , kun x 0jax 1. b) Aseta luvut 2, 5 suuruusjärjestykseen ja perustele vastauksesi. 3 3 ja

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

1. Olkoot vektorit a, b ja c seuraavasti määritelty: a) Määritä vektori. sekä laske sen pituus.

POHDIN - projekti. Funktio. Vektoriarvoinen funktio

Ensikosketus ohjelmointiin

Tekijä MAA2 Polynomifunktiot ja -yhtälöt = Vastaus a)

LUMA Suomi kehittämisohjelma :53 Joustava yhtälönratkaisu Matemaattinen Ohjelmointi ja Yhtälönratkaisu

Derivaatan sovellukset (ääriarvotehtävät ym.)

Tekijä Pitkä matematiikka Pisteen (x, y) etäisyys pisteestä (0, 2) on ( x 0) Pisteen (x, y) etäisyys x-akselista, eli suorasta y = 0 on y.

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Matikkaa KA1-kurssilaisille, osa 3: suoran piirtäminen koordinaatistoon

Ratkaisut vuosien tehtäviin

Vanhoja koetehtäviä. Analyyttinen geometria 2016

Ohjelmoinnin perusteet Y Python

Tutoriaaliläsnäoloista

MATEMATIIKAN KOE PITKÄ OPPIMÄÄRÄ Merkitään f(x) =x 3 x. Laske a) f( 2), b) f (3) ja c) YLIOPPILASTUTKINTO- LAUTAKUNTA

ELM GROUP 04. Teemu Laakso Henrik Talarmo

MS-A0202 Differentiaali- ja integraalilaskenta 2 (SCI) Luento 1: Parametrisoidut käyrät ja kaarenpituus

KJR-C1001 Statiikka ja dynamiikka. Luento Susanna Hurme

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Talousmatematiikan perusteet: Luento 9

A B = (1, q, q 2 ) (2, 0, 2) = 2 2q q 2 = 0 q 2 = 1 q = ±1 A(±1) = (1, ±1, 1) A(1) A( 1) = (1, 1, 1) (1, 1, 1) = A( 1) A(1) A( 1) = 1

Matematiikan tukikurssi

763306A JOHDATUS SUHTEELLISUUSTEORIAAN 2 Ratkaisut 2 Kevät 2017

3 TOISEN ASTEEN POLYNOMIFUNKTIO

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

MAB3 - Harjoitustehtävien ratkaisut:

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

YH1b: Office365 II, verkko-opiskelu

9. Harjoitusjakso III

Ryhmäharjoitus III: Mitä on koodaaminen? A. TIEY4 Tietotekniikkataidot, kevät 2017 Tehdään ryhmäharjoitustunnilla 20.3.

Paraabeli suuntaisia suoria.

Transkriptio:

Vektorit Opettajan 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 Paketin esittely 3 1.1 Ohjelmointipaketin tarkoitus......................... 3 1.2 Linkit lukion opetussuunnitelmaan...................... 4 1.3 Arviointi..................................... 4 1.4 Miten tehdään?................................. 5 1.5 Esitietovaatimukset............................... 5 2 Tunti 1 7 2.1 Ohjeita opiskelijalle............................... 7 2.1.1 Turtle-kertaus / Python-kertaus................... 7 2.1.2 Tehtävänannot............................. 7 2.1.3 Kotitehtävät.............................. 7 2.2 Ohjeita opettajalle............................... 8 2.2.1 Tehtävänannoista............................ 8 2.2.2 Vinkkejä opiskelijan ohjaamiseen................... 9 2.2.2.1 Tehtävä 1........................... 9 2.2.2.2 Tehtävä 2........................... 9 2.2.2.3 Tehtävä 3........................... 9 2.2.2.4 Kotitehtävä 1........................ 9 2.2.2.5 Kotitehtävät 2 ja 3..................... 9 2.3 Malliratkaisut.................................. 9 3 Tunti 2 11 3.1 Ohjeita opiskelijalle............................... 11 3.1.1 Tehtävänannot............................. 11 3.1.2 Kotitehtävät.............................. 12 3.2 Ohjeita opettajalle............................... 12 3.2.1 Tehtävänannoista............................ 12 3.2.2 Vinkkejä opiskelijan ohjaamiseen................... 13 3.2.2.1 Tehtävä 1........................... 13 3.2.2.2 Tehtävä 2........................... 13 3.2.2.3 Tehtävä 3........................... 13 3.2.2.4 Kotitehtävä 1........................ 13 3.2.2.5 Kotitehtävä 2........................ 13 3.2.2.6 Kotitehtävä 3........................ 14 3.3 Malliratkaisut.................................. 14 4 Tunti 3 16 4.1 Ohjeita opiskelijalle............................... 16 4.1.1 Tehtävänannot............................. 16 4.1.2 Kotitehtävät.............................. 17 4.2 Ohjeita opettajalle............................... 17 1

4.2.1 Tehtävänannoista............................ 17 4.2.2 Vinkkejä opiskelijan ohjaamiseen................... 18 4.2.2.1 Tehtävä 1........................... 18 4.2.2.2 Tehtävä 2........................... 18 4.2.2.3 Tehtävä 3........................... 18 4.2.2.4 Kotitehtävä 1........................ 18 Viitteet 20 A Käyttöönotto ja asentaminen 21 A.1 PYTHON 3.x.................................. 21 A.2 Visual Studio Code (VS Code)........................ 21 A.3 Python VS Code:lle.............................. 21 A.4 Käyttö...................................... 21 B Vectors -kirjasto 23 C Tunti 1 - esitiedot 29 D Tunti 1 - malliratkaisut 32 D.1 Tehtävä 1.................................... 32 D.2 Tehtävä 2.................................... 32 D.3 Tehtävä 3.................................... 33 D.3.1 Tehtävä 3c............................... 34 D.4 Kotitehtävä 1.................................. 36 D.5 Kotitehtävä 2.................................. 37 D.6 Kotitehtävä 3.................................. 38 E Tunti 2 - esitiedot 40 F Tunti 2 - malliratkaisut 42 F.1 Tehtävä 1.................................... 42 F.2 Tehtävä 2.................................... 43 F.3 Tehtävä 3.................................... 44 F.4 Kotitehtävä 1.................................. 45 F.5 Kotitehtävä 2.................................. 46 F.6 Kotitehtävä 3.................................. 46 G Tunti 3 - esitiedot 48 H Tunti 3 - malliratkaisut 50 H.1 Tehtävä 1.................................... 50 H.2 Tehtävä 2.................................... 50 H.3 Tehtävä 3.................................... 51 H.4 Kotitehtävä 1.................................. 52 2

1 Paketin esittely Tämä paketti on tehty osana Helsingin yliopiston kurssia Ohjelmointi matematiikan opetuksessa. Tähän pakettiin kuuluu myös kaikki tarvittavat tiedostot, joiden avulla kaikki ohjelmointitehtävät voidaan tehdä, malliratkaisut sekä opiskelijan ohjeet. Tässä tiedostossa esittelemme paketin taustalla olevia asioita sekä tämän jälkeen itse tehtävät ja vinkit opettajille. Liitteistä löytyy paketin käyttämiseen liittyviä ohjeita sekä malliratkaisujen koodit. Pakettia saa käyttää ja muokata vapaasti. Tämä paketti on tehty lukion vektorit -kurssille (MAA4). Tausta-ajatuksena on, että opiskelijat ovat jo aiemmin käyttäneet ohjelmointia apuna esimerkiksi peruskoulussa. Lisäksi ajatellaan, että muillakin lukion kursseilla olisi kurssien aiheisiin liittyvät vastaavanlaiset ohjelmointipaketit, jotta opiskelijat olisivat jo tätä pakettia käyttäessään tietoisia siitä miten paketteja käytetään. Koska näitä muita paketteja ei ole vielä olemassa, tämän paketin yhteyteen on liittetty myös ohjeet ohjelmointikielen (Python 3.x) asentamisesta sekä suositeltavasta editorista (liite A). Kurssin aikarajoissa pakettia ei valitettavasti päästy testaamaan opiskelijoiden kanssa, mutta paketin tehtäviä testattiin muiden kurssilaisten kanssa. 1.1 Ohjelmointipaketin tarkoitus Ohjelmointi on tärkeä työkalu digitalisoituvassa yhteiskunnassa. Tutkimuksen mukaan ohjelmointiosaaminen on tärkeä palkkaamisperuste matemaattiselle aloille uusille työntekijöille [1]. Ohjelmointi on tärkeä osa tiedettä, teknologiaa, tekniikkaa ja matematiikkaa [2]. Se harjaannuttaa opiskelijan algoritmista ajattelua sekä parantaa matemaattista ajattelua, varsinkin geometriassa. Lisäksi ohjelmointi auttaa visualisoimaan abstrakteja käsitteitä, kuten esimerkiksi fysiikan vektorit tai geometriassa vaikeammin hahmotettavat kappaleet. Ohjelmoitaessa opiskelijan on helpompi testata ja syventyä matematiikan aihepiiriin, koska ohjelmointi kehittää myös opiskelijan ongelmanratkaisukykyä [3]. Ohjelmoinnin avulla opiskelija kykenee yhdistämään laajempia kokonaisuuksia ja oppii eri esitystapoja sekä oppii yhtälöiden ja lausekkeiden kirjoittamisen täsmällisesti. Kun opiskelija ymmärtää algoritmeja, tietorakenteita ja koodin optimointia, hän voi myös oppia käyttämään valmiita ohjelmia paremmin [4]. Lisäksi kyky kirjoittaa ohjelma ratkaisemaan tehtävää on hyödyllinen taito. Ohjelmointi voi olla myös sosiaalista, jos se toteutetaan pari- tai ryhmätyönä [1]. Ohjelmoinnin ja matematiikan opetuksen yhdistämisessä aikavaatimukset ovat haastavia [1] ja ne pitää ottaa huomioon tätäkin kokonaisuutta suunniteltaessa. Tarkoitus on että ohjelmointiin liittyviä oppitunteja pidetään kolme kappaletta 1-2 viikon aikana kurssin puolivälissä, jolloin riski unohtaa asioita on pienempi. Opiskelijan oma aktiivisuus on erityisen tärkeää, olisi suotavaa että opiskelija syventyisi ohjelmointikokonaisuuteen myös kotona. Parhaassa tapauksessa koulutunnit voisivat toimia enemmän ohjaustunteina ja varsinainen harjoittelu tapahtuisi kotona. Ohjelmakoodin debuggaus saattaa tuottaa ongelmia, kun siihen yleensäkin menee paljon aikaa. Debuggaus prosessina on tuntematon käsite uusille ohjelmoijille. Opiskelijoiden tekemä koodi saattaa olla myös huonolaatuista, mutta se harvemmin haittaa koska ohjelmat ovat lyhyitä eikä useinkaan 3

ole tarvetta algoritmien optimointiin. Tämän ohjelmointikokonaisuuden yksi tarkoitus on auttaa opiskelijoita hahmottamaan vektoreita paremmin, koska vektorit saattavat olla opiskelijoille etenkin aluksi vaikeasti hahmotettavia. 1.2 Linkit lukion opetussuunnitelmaan Lukion vuoden 2015 opetussuunnitelman perusteista [5] vektorit -kurssin (MAA4) tavoitteista valittiin seuraavat tavoitteet Ymmärtää vektorikäsitteen ja perehtyy vektorilaskennan perusteisiin Osaa tutkia kuvioiden ominaisuuksia vektoreiden avulla Osaa tutkia kaksiulotteisen koordinaatiston pisteitä, etäisyyksiä ja kulmia vektoreiden avulla Osaa käyttää teknisiä apuvälineitä vektoreiden tutkimisessa sekä keskeisistä sisällöistä Vektoreiden perusominaisuudet Vektoreiden yhteen- ja vähennyslasku ja vektorin kertominen luvulla Koordinaatiston vektoreiden skalaaritulo paketin tehtävien pohjaksi. Tehtävät eivät siis kata koko kurssia, vaan sijoittuvat noin puoleen väliin kurssia, kun vektoreilla osataan jo hiukan laskea ja niitä osataan piirtää. Erityisesti vektoreiden piirron havainnollistaminen sekä vektoreiden soveltaminen fysiikan ongelmissa ohjasi paljon tehtävien suunnittelua. Tietokoneella piirrettäessä saadaan nopeasti piirretty summavektori useammastakin vektorista. Vaikka nykyiset opetussuunnitelman perusteet eivät mainitse ohjelmointia ollenkaan, on luultavaa, että muutaman vuoden kuluttua myös lukion matematiikan opetukseen kuuluu ohjelmointi. Peruskoulun opetussunnitelmassa on jo maininta ohjelmoinnista osana matematiikan opetusta. Paketti on siis suunniteltu hieman eteenpäin tilanteeseen, jossa suurella osalla lukiolaisista on jo jonkinlaista kokemusta ohjelmoinnista peruskoulun ajalta. 1.3 Arviointi Koska lukion opetussuunnitelma ei vielä tunnista ohjelmointia osakseen, niin tällä hetkellä vektori-kurssin ohjelmointiosuuden arviointi voisi vaikuttaa lähinnä osana kurssin tuntiaktiivisuutta. Lisäksi kurssin kokeeseen voisi ottaa yhden tehtävän ohjelmointiin liittyen. Esimerksi kokeessa voisi kysyä, että miten vektoreita piirretään ohjelmoinnin avulla ja vastauksena voisi odottaa jonkin näköistä pseudokoodia sekä selitystä siitä, mitä asioita pitää ottaa huomioon, kun piirretään nuoli Pythonin turtle-paketin avulla. 4

Tehtävä voisi olla myös vain vapaaehtoinen, jolloin kurssin arvosanan saisi myös ilman ohjelmointiosuutta. Jos ohjelmointi tulee mukaan matematiikan opetukseen lukiossakin, niin tehtävien tekemistä voisi arvioida tarkemmin esimerkiksi tutkimalla niiden toimivuutta tai ohjelman tehokkuutta [6]. 1.4 Miten tehdään? Kokonaisuuden on suunniteltu kestävän kolme 45 minuutin oppituntia, joissa opettaja aina alustaa hieman päivän tehtäviä. Tämän jälkeen opiskelijat lähtevät tekemään itse koodia esimerkiksi tunnin esitieto-koodin avulla. Piirtämisen helpottamiseksi opiskelijoille annetaan valmis kirjasto, joka osaa muunmuassa piirtää nopeasti koordinaatiston sekä vektoreita. Jokaiselle tunnille liittyy myös kotitehtäviä, joita opettaja voi antaa tarpeen mukaan. Opettajan ohjeisiin on myös kirjoitettu, mitkä tehtävistä on ajateltu pakolliseksi, että voi siirtyä eteenpäin. Kaikille tunneille on ainakin kolme tehtävää, joiden vaikeusaste kasvaa tehtävä tehtävältä. Pakettia tehdessä ei ole oletettu, että kaikki saisivat kaikki kolme tehtävää tehtyä, mutta ainakin ensimmäinen tehtävä pitäisi saada tehtyä, että voi siirtyä seuraavaan vaiheeseen. Ensimmäisen tunnin teemana on vektoreiden piirtäminen ja tavoitteena on havaita, että se voi olla hyvin monimutkaista. Toisella tunnilla käyttöön otetaan valmis komento vektoreiden piirtämistä varten, jolloin pystytään keskittymään tunnin pääasioihin, eli vektoreiden summaamiseen sekä skalaarilla kertomiseen. Tunnin viimeinen tehtävä taas yhdistää fysiikkaa sekä matematiikkaa suuntavektoreiden kanssa. Kolmannella tunnilla siirrytään havainnollistamaan lentoratoja, eli piirretään paraabeleja sekä näiden tangenttivektoreita. Koska derivaattaa ei ole vielä käsitelty ennen tätä tuntia, kirjasto hoitaa tangentin kulmakertoimen laskemisen automaattisesti. Opiskelijalle on myös annettu kaikki tarvittavat kaavat fysiikan puolelta, joten opiskelija voi keskittyä olennaiseen, eli vektoreiden piirtämiseen käyrälle haluttuihin pisteisiin. Kolmen kerran jälkeen, muutaman päivän päästä, voi olla vielä hyvä käydä yhdessä läpi millaisia toteutuksia opiskelijat saivat aikaan. Paketin mukana jaetaan siis kirjasto, joka helpoittaa esimerksi vektoreiden piirtoa. Koska kirjasto pidetään samana kaikkien tuntien aikana, voisi vektorit piirtää jo helposti ensimmäisellä tunnilla, mutta opettajan ohjauksella saadaan opiskelijat piirtämään vektoreita ensin itse ja sitten vasta toisella tunnilla käyttäen valmiita metodeja. 1.5 Esitietovaatimukset Opiskelijalta edellytetään seuraavia taitoja ennen paketin aloittamista: Python 3.x -taitoja, ainakin: Toistorakenteet (for, while) Ehtolauseet (if, elif, else) Funktiot ja niiden kutsuminen ja määrittely 5

Turtle-grafiikasta esimerkiksi seuraavat: Suoran piirtäminen Kynän nosto ja lasku, värin vaihtaminen, paksuuden vaihtaminen Ympyrän piirtäminen Eteenpäin, taaksepäin -komennot Siirtyminen koordinaatistossa, osoitussuunnan muuttaminen Kirjastojen tuominen (esimerkiksi math ja random) sekä näiden käyttö Vektoreiden ymmärrystä: (kaikki vektorit ovat vain kaksiulotteisia) Vektorin piirtäminen koordinaatistoon Vektoreiden komponentit Vektoreiden yhteenlasku ja erotus Skalaarilla kertominen Vektorin pituuden laskeminen Visual Studio Coden käyttökokemusta Ohjelmakoodin ajo: CTRL+F5 Debuggaus F5 Tuntien esitieto-tiedostoissa on kerrottu juuri sillä tunnilla tarvittavista taidoista sekä kerrataan myös ylläolevia asioita. Pääpaino on kuitenkin nimenomaan vektoreiden käsittelyssä sekä niiden havainnollistamisessa. 6

2 Tunti 1 2.1 Ohjeita opiskelijalle 2.1.1 Turtle-kertaus / Python-kertaus Kertaukseen liittyvä tiedosto löytyy tekstimuodosta liitteestä C 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. 2.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] 2.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? 7

Kuva 1: Esimerkkikuva piirrettävästä vektorista tehtävään 1. Kuva 2: Esimerkkikuva piirrettävästä vektorista tehtävään 2. Kuva 3: Esimerkkikuva piirrettävistä vektorista tehtävään 3. Kuva 4: Esimerkkikuva piirrettävistä vektorista tehtävään 3. 2.2 Ohjeita opettajalle 2.2.1 Tehtävänannoista Opiskelijoiden tehtävänannoissa on kolmen tasoisia tehtäviä. Numerolla 1 merkityt tehtävät on oletettu helpoiksi tehtäviksi, ja kaikkien pitäisi saada tämä tehtävä tehtyä tunnin aikana. Numerolla 2 merkityt tehtävät ovat keskivaikeita ja näihin pitäisi suurimman osan päästä tunnin aikana. Numeron 3 tehtävät on tarkoitettu koodaamisessa jo edistyneille, haastavampina tehtävinä. Kaikkien ei oleteta saavan näitä tehtyä tunnin aikana. Tähtitehtävän tekeminen vaatii jo huomattavasti enemmän, joten se on lähinnä hyvin nopeille koodareille. Seuraavalle tunnille edellytetään ainakin tehtävän 1 suorittaminen sekä kotitehtävästä tehtävän 1a tekeminen. Kotitehtävä 1b on hyödyllinen, mutta ei pakollinen. Kotitehtävät 2 ja 3 haastavat käyttämään vektoreita geometristen kuvioiden piirtämisessä ja hahmottamaan tilanteita, joissa summavektorista tulee nollavektori. 8

2.2.2 Vinkkejä opiskelijan ohjaamiseen Jaa paikka, josta opiskelijat voivat noutaa tässä työssä käytettävän koordinaatistopohjan. Esittele sen käyttö ja varmista, että kaikki saavat pohjan käyttöönsä. Sama kirjasto on mukana kaikilla tunneilla ja löytyy liitteestä B sekä kaikkien tuntien opiskelijakansiosta. 2.2.2.1 Tehtävä 1 Tavoitteena on saada aikaan hyvin yksinkertainen vektori, joka on akselin suuntainen. Haasteena on nuolen kärjen piirtäminen, johon voi ohjata käyttämällä trigonometrisia funktioita ja palauttamalla mieleen miten niillä lasketaan. Esimerkiksi 30 asteen kulmassa olevista voi aloittaa. Malliratkaisu liitteessä D.1. 2.2.2.2 Tehtävä 2 Tässä pitää osata laskea kulmat oikein, jotta vektorin pää näyttää siltä miltä pitääkin. Malliratkaisu liitteessä D.2. 2.2.2.3 Tehtävä 3 Tässä tehtävässä vinkkinä voi antaa, että tee funktio, joka piirtää vektorit, ja sitten käytä for-looppia siihen, että saat kaikki 10 vektoria piirrettyä. Värien lisääminen ja paksuudet ovat vain lisäominaisuuksia. C-kohta vaatii tietoa trigonometriasta ja esimerkiksi math.atan2(y,x) voi auttaa tehtävän tekemisessä. Lisäksi tämä kohta voi soveltua trigonometrian kurssille (MAA7), kun käsitellään yksikköympyrää, ja siitä kulmien määrittämistä. Malliratkaisu liitteissä D.3 ja D.3.1. 2.2.2.4 Kotitehtävä 1 Tehtävän tarkoituksena on näyttää miten piirretään summavektoreita. Jos tunnilla onnistui vain ensimmäinen tehtävä, kotiin kannattaa ottaa vain 1a. Jos haastavammatkin onnistuivat, niin silloin myös 1b on helppo tehtävä. Kuva 5 ja malliratkaisu liite D.4. 2.2.2.5 Kotitehtävät 2 ja 3 Opiskelija harjoittelee for-loopin käyttöä vektori-funktiolleen ja huomaa, että summavektori on nollavektori. Kuvat 6 ja 7 ja malliratkaisut liitteissä D.5 ja D.6. 2.3 Malliratkaisut Malliratkaisut löytyvät erillisistä tiedostoista sekä tekstinä liitteestä D. 9

Kuva 5: Esimerkkikuva piirrettävistä vektoreista kotitehtävään 1. Kuva 6: Esimerkkikuva piirrettävistä vektoreista kotitehtävään 2. Kaksi eri vaihtoehtoa, muutkin käyvät. Kuva 7: Esimerkkikuva piirrettävistä vektoreista kotitehtävään 3. Kaksi eri vaihtoehtoa, muutkin käyvät. 10

3 Tunti 2 3.1 Ohjeita opiskelijalle Esimerkki kirjaston käytöstä löytyy liitteestä E. 3.1.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 8] 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ää? 11

Kuva 8: Kuva alueen reunaan osumisesta ja siitä jatkamisesta. 3.1.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. 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ä. 3.2 Ohjeita opettajalle 3.2.1 Tehtävänannoista Tällä tunnilla jatketaan vektoreiden käyttöä ja visualisoidaan vektoreiden summaa, erotusta sekä skalaarilla kertomista. Koska vektoreiden piirtäminen alusta saakka vie aikaa, 12

tällä tunnilla on valmiin koordinaatistopohjan lisäksi vektoreiden piirtämiseen tarkoitettu kirjasto. Kirjasto osaa piirtää vektorit sekä laskea niitä yhteen tai kertoa skalaarilla. Tarkoituksena on kuitenkin, että opiskelija toteuttaa laskut itse ja käyttää kirjastoa vain nopeampaan piirtämiseen. 3.2.2 Vinkkejä opiskelijan ohjaamiseen Tällä tunnilla tehtävien tarkoituksena on tukea vektoreiden yhteenlaskun, erotuksen ja skalaarilla kertomisen vaikutuksia. Koska ensimmäisessä kokonaisuudessa jo saatiin aikaan täysin itse piirretyt vektorit ja se saattoi olla ainakin hieman työlästä, tässä kokonaisuudessa ei enää käytetä aikaa vektoreiden nuolten aikaansaamiseen vaan vektoreiden määrittäminen ja piirtäminen onnistuu komennolla vektori.draw(). Muuten kirjasto toimii kuten turtle, eli opiskelijan pitää itse muistaa siirtyä oikeaan kohtaan esimerkiksi piirrettäessä summavektoreita. Myös kotitehtävän läpikäyntiin voi käyttää hetken tunnista, niin saadaan johdatus vektoreilla laskuun. 3.2.2.1 Tehtävä 1 Hahmotetaan miten vektoreiden yhteenlasku sujuu. Metodit vektori.i() ja vektori.j() palauttavat komponenttivektoreiden arvot. Tavoitteena huomata käytännössä, että miten vektoreita voidaan summata kumminpäin vain, mutta erotuksella on merkitystä, kummasta vähennetään toinen. Kuva 9 ja malliratkaisu liitteessä F.1. 3.2.2.2 Tehtävä 2 Havainnollistetaan skalaarilla kertomista ensin käytännössä, eli piirretään viisi kappaletta samaa vektoria ja vasta tämän jälkeen summavektori. Mietitään mitä skalaarin etumerkki tekee vektorille. Katsotaan mitä skalaareilla kertominen tekee eri vektoreille tai niiden erotukselle. Kuva 10 ja malliratkaisu liitteessä F.2. 3.2.2.3 Tehtävä 3 Tehtävän voi ajatella simuloivan esimerkiksi biljardipalloa pöydällä [vaikka ihan reunoihin asti ei nyt osuta helpottamisen vuoksi], eli näyttää vektorin ominaisuuden suuntavektorina. Harjoittaa ehtolauseiden ja for-loopin kirjoitusta sekä ymmärrystä kuljetun polun mallinnuksesta. Myös helpohko tapa ottaa huomioon kitka, eli pienennetään vain vektorin pituutta tarpeen tietyn verran jokaisen piirron jälkeen kunnes vektorin pituus on pienentynyt tarpeeksi. Kuva 11 ja malliratkaisu liitteessä F.3. 3.2.2.4 Kotitehtävä 1 Tämä tehtävä on pohjana seuraavalle tunnille, jolla katsellaan paljon enemmän komponenttivektoreita. Kuva 12 ja malliratkaisu liitteessä F.4. 3.2.2.5 Kotitehtävä 2 Havainnollistaa eri parametrien vaikutusta yhteenlaskuun ja/tai vähennyslaskuun. Kuva 13 ja malliratkaisu liitteessä F.5. 13

Kuva 9: Esimerkkikuva vektoreiden yhteenlaskusta. Kuva 10: Esimerkkikuva skalaarilla kertomisesta. Kuva 11: Esimerkkikuva biljardipallosta, kun kitka otetaan huomioon. 3.2.2.6 Kotitehtävä 3 Harjoittaa for-loopin käyttötaitoja. Sisäkkäiset for-loopit. Kuva 14 ja malliratkaisu liitteessä F.6. 3.3 Malliratkaisut Malliratkaisut löytyvät erillisistä tiedostoista sekä tekstimuotoisena liitteestä F. 14

Kuva 12: Esimerkkikuva piirrettävistä vektoreista kotitehtävään 1. Kuva 13: Esimerkkikuva piirrettävistä vektoreista kotitehtävään 2. Kuva 14: Esimerkkikuva piirrettävistä vektoreista kotitehtävään 3. 15

4 Tunti 3 4.1 Ohjeita opiskelijalle 4.1.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 15] 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 16

y(t) = v0y*t - 0.5*g*t*t Lisäksi seuraavasta voi olla hyötyä: t = x(t) / v0x (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 15: Esimerkkikuva paraabelista ja piirretyistä tangenttivektoreista komponentteineen. 4.1.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. 4.2 Ohjeita opettajalle 4.2.1 Tehtävänannoista Tällä tunnilla otetaan käyttöön sovelluskohde fysiikasta, eli pallonheitto. Pallonheitossa pallon lentorata muodostaa paraabelin, eli lähdemme liikkeelle paraabelin piirtämisestä yksinkertaisesti sen huippuarvon kannalta. Toisessa tehtävässä on tavoitteena piirtää paraabeli yhtälönsä avulla ja kolmannessa tehtävässä paraabeli muodostetaan kulman ja alkunopeuden avulla. Esitiedot opiskelijoille löytyvät liitteestä G. 17

4.2.2 Vinkkejä opiskelijan ohjaamiseen Tunnin aluksi varmista, että kaikki saivat edelliset tehtävät tehtyä ja osaavat nyt piirtää vektoreita kirjaston avulla. Lisäksi varmista, että kaikki saavat paraabelin piirrettyä ainakin sen huippupisteen avulla. Tehtävissä 1-3 kuvat ovat käytännössä samat, eli tehtävässä 3 ykköstehtävän kuvalla voi tarkistaa paraabelin muodon. 4.2.2.1 Tehtävä 1 Ensimmäisessä tehtävässä paraabelin piirtäminen on helppoa, se onnistuu nopealla komennolla. Tehtävän tavoitteena on havainnollistaa kulmakerrointa, ja sen eri komponenttivektoreita. Helpompaa piirtämistä varten suosittelemme tekemään vektoreiden piirtämistä varten funktion, jota voi sitten vain kutsua tarvittaessa. Kuva 15 ja malliratkaisu liitteessä H.1. 4.2.2.2 Tehtävä 2 Tässä tehtävässä itse paraabeli on oikeasti sama kuin ensimmäisessä tehtävässä, mutta paraabelin piirtämistä on vaikeutettu, eli tarkoituksena on piirtää paraabeli itse paraabelin yhtälön avulla ja laskea sitten annetun derivaatan avulla kulmakerroin. Näissä tehtävissä x-suuntaisen komponenttivektorin pituus on asetettu ykkökseksi, jolloin y- suuntaan olevan komponentin pituus on k. Paraabelin piirtäminen kannattaa lopettaa, kun y-koordinaatti muuttuu negatiiviseksi. Kuva 16 ja malliratkaisu liitteessä H.2. 4.2.2.3 Tehtävä 3 Vaikein tehtävä, joka tarvitsee avukseen fysiikan kaavoja (annettu tehtävänannossa). Paraabelin huipulla y-suuntainen vektori on tietysti nollavektori, mutta koska kirjastolle ei ole kerrottu miten nollavektori pitäisi piirtää, niin kirjasto piirtää pelkän nuolen kärjen, suunta saattaa hieman vaihtua, riippuen siitä kuinka tarkasti huippuun osutaan (laskentatarkkuus). Nyt voidaan soveltaa vektoreiden piirtämistä tiettyihin pisteisiin ja kokeilla vaikka mitä tapahtuu, jos putoamiskiihtyvyyden arvo onkin jotain muuta, kuin 9.81 m/s 2. Kuva 17 ja malliratkaisu liitteessä H.3. 4.2.2.4 Kotitehtävä 1 Tehtävää voi käyttää alustavana esimerkiksi yksikköympyrää varten tai yksikkövektorin kanssa. Kuva 18 ja malliratkaisu liitteessä H.4. 18

Kuva 16: Esimerkkikuva paraabelista tehtävään 2. Kuva 17: Esimerkkikuva paraabelista tehtävään 3. Kuva 18: Esimerkkikuva kotitehtävään. 19

Viitteet [1] R. Chabay and B. Sherwood, Computational physics in the introductory calculusbased course, American Journal of Physics, vol. 76, no. 4, pp. 307 313, 2008. [2] L. Broley, F. Caron, and Y. Saint-Aubin, Levels of programming in mathematical research and university mathematics education, International Journal of Research in Undergraduate Mathematics Education, vol. 4, no. 1, pp. 38 55, Apr 2018. [3] D. H. Clements, From exercises and tasks to problems and projects: Unique contributions of computers to innovative mathematics education, The Journal of Mathematical Behavior, vol. 19, no. 1, pp. 9 47, 2000. [4] J. T. Fey, Technology and mathematics education: A survey of recent developments and important problems, Educational Studies in Mathematics, vol. 20, no. 3, pp. 237 272, 1989. [5] Lops 2015. lukion opetussuunnitelman perusteet 2015, Helsinki, 2015. [Online]. Available: http://www.oph.fi/download/172124 lukion opetussuunnitelman perusteet 2015.pdf [6] K. M. Ala-Mutka, A survey of automated assessment approaches for programming assignments, Computer Science Education, vol. 15, no. 2, pp. 83 102, 2005. 20

A Käyttöönotto ja asentaminen Ohjelmointikieleksi on valittu Python 3 ja editoriksi Visual Studio Code. Tarkoitus on, että opiskelijat asentavat tarvittavat ohjelmat omille tietokoneille. Kun editori ja Python kieli on omalla tietokoneella, ohjelmointi ja koodin suorittaminen on helpompaa ja nopeampaa. Myöskin paikallisesti asennettu editori antaa huomattavia etuja verrattuna ns. online-editoreihin. A.1 PYTHON 3.x Lataa ja asenna uusin versio Pythonista tietokoneelle osoitteessa http://www.python. org. A.2 Visual Studio Code (VS Code) Lataa ja asenna uusin versio Visual Studio Codesta osoitteessa https://code.visualstudio. com. VS Code on Microsoftin tekemä avoimen lähdekoodin editori, joka toimii seuraavilla käyttöjärjestelmillä: macos, Linux ja Windows. VS Code on hyvin monipuolinen editori, joka soveltuu Pythonin lisäksi melkein kaikille mahdollisille ohjelmointikielelle. VS Code on modulaarisesti rakennettu, joten siihen on helppo asentaa lisäosia, kuten tuki uudelle ohjelmointikielelle. Muita syitä tämän editorin käyttöön: toimii melkein kaikissa käyttöjärjestelmissä kevyt ja nopea paikallisesti asennettuna tietokoneelle toimii aina, myös ilman internettiä tuki laajennusten kautta todella monelle kielelle debuggaus sisäänrakennettu A.3 Python VS Code:lle VS Codessa ei ole sisäänrakennettua tukea Pythonille, vaan se pitää ladata lisäosana. Etsi lisäosa/laajennus nimellä Python ja jonka tekijä on Microsoft. Lataa ja asenna se. Jos haluat saada lisää infoa mahdollisista virheistä ja varoituksista Python koodissa, niin kannattaa asentaa myös samassa paketissa oleva linter -osio. A.4 Käyttö Tallenna Python tiedostot nimipäätteellä.py, jolloin niitä voi suorittaa myös kaksoisklikkaamalla tiedoston kuvaketta. VS Codessa voit suorittaa Python koodin painamalla CTRL + F5, pelkkä F5 aloittaa suorituksen debug-tilassa. Debug-tila on erittäin tehokas tapa löytää virheitä koodin logiikassa, kun koodin on mahdollista luoda ns. 21

pysäytyspisteitä (breakpoint), jolloin on mahdollista tutkia muuttujien arvoja ja sitä, miten koodin suoritus etenee. VS Codea voi käyttää myös käytännössä täysin ilman hiirtä, painamalla CTRL + SHIFT + P saadaan auki komentorivi johon voi syöttää komentoja Codelle. Esimerkiksi kirjoittamalla color theme voidaan vaihtaa käytettyä väriteemaa. 22

B Vectors -kirjasto vectors.py Today 12:37 am Tom Olander edited an item Text vectors.py Yesterday Wed. 2:01 pm Tom Olander edited an item Text vectors.py Earlier this week 30 Apr. Tom Olander uploaded an item Text vectors.py import turtle import math GLOBAL variables!!! pen = turtle.turtle() window = pen.getscreen() some stupid window.screensize(950,800) class ParabelOrigo(): _x0, _y0 = 0, 0 _a = None def top(self, x0=0, y0=0): self._x0, self._y0 = x0, y0 self._calca() def equation(self, a=0, b=0, c=0): self._x0 = -b / (2 * a) self._y0 = -b * b / (4 * a) self._calca() def _calca(self): self._a = (-self._y0) / (self._x0 * self._x0) def gety(self, x): return self._a * ((x - self._x0) * (x - self._x0)) + self._y0 def getk(self, x): 23

return 2 * self._a * (x - self._x0) def draw(self, color="black", width=2): down = pen.isdown() oldwidth = pen.width() oldcolor = pen.pencolor() pos = pen.position() pen.pencolor(color) pen.width(width) lenx = abs(2 * self._x0) steps = 5*int(lenx) if lenx > 40: steps = 5*40 if lenx < 20: steps = 5*20 dx = (2 * self._x0) / (steps - 1) x = 0 y = self.gety(x) pen.goto(x, y) pen.pendown() for i in range(0, steps): x = i * dx y = self.gety(x) if y < 0: x, y = 2 * self._x0, 0 pen.goto(x, y) pen.up() pen.goto(pos) if down: pen.down() else: pen.up() pen.width(oldwidth) pen.pencolor(oldcolor) class CoordinateSystem(): _swidth = window.canvwidth _sheight = window.canvheight x0,x1,y0,y1 = 0,0,0,0 gridcolor, axiscolor = "AAAAAA", "444444" def init (self): self.setaxes(-10,10,-10,10) def _newscreen(self): window.setworldcoordinates(self.x0,self.y0,self.x1,self.y1) window.clearscreen() 24

pen = turtle.turtle() pen.hideturtle() pen.speed(0) self._drawgrid() self._drawaxis() window.tracer(1,0) end newscreen def def setaxes(self,vasen,oikea,ala,yla): if(vasen>oikea): vasen, oikea = oikea, vasen if(ala>yla): ala, yla = yla, ala dx, dy = oikea-vasen, yla-ala px, py = self._swidth/dx, self._sheight/dy if px > py: ndx2 = (dx*px/py-dx)/2 vasen, oikea = vasen-ndx2, oikea+ndx2 else : ndy2 = (dy*py/px-dy)/2 ala, yla = ala-ndy2, yla+ndy2 self.x0, self.x1 = vasen, oikea self.y0, self.y1 = ala, yla self._newscreen() end yaxis def def _drawaxis(self): down = pen.isdown() oldwidth = pen.width() oldcolor = pen.pencolor() pos = pen.position() pen.pencolor(self.axiscolor) pen.width(2) pen.up() pen.goto(self.x0,0) pen.down() pen.goto(self.x1,0) pen.up() pen.goto(0,self.y0) pen.down() pen.goto(0,self.y1) pen.up() pen.goto(pos) if down: pen.down() else: pen.up() 25

pen.width(oldwidth) pen.pencolor(oldcolor) end drawaxis def def _drawgrid(self): window.tracer(0,0) down = pen.isdown() oldwidth = pen.width() oldcolor = pen.pencolor() oldpos = pen.position() pen.pencolor(self.gridcolor) pen.up() for x in range(int(self.x0)-1, int(self.x1)+1): pen.up() pen.goto(x,self.y0) pen.down() pen.goto(x,self.y1) next x for y in range(int(self.y0)-1, int(self.y1)+1): pen.up() pen.goto(self.x0,y) pen.down() pen.goto(self.x1,y) next y pen.up() pen.goto(oldpos) if down: pen.down() else: pen.up() pen.width(oldwidth) pen.pencolor(oldcolor) window.tracer(1,0) end drawgrid def def waitforclick(self,show=true): if show: pen.up() pen.goto((self.x1+self.x0)/2,self.y0+0.1*self.y1) pen.pencolor("ff0000") text = "Press any key (or click mouse)." font = ("Sans-serif", 12, "bold") pen.write(text, True, align="center", font=font) window.onkey(self._die,"") window.onclick(self._die) 26

window.listen() window.mainloop() end waitforclick def def _die(self,x=0,y=0): window.bye() end die def end Coordsys class class Vector(): i,j = 0, 0 def init (self,i,j): self.i, self.j = i, j def add (self,other): return self.add(other) def sub (self,other): return self.sub(other) def mul (self,scalar): return self.mul(scalar) def add(self,other): return Vector(self.i+other.i,self.j+other.j) def sub(self,other): return Vector(self.i-other.i,self.j-other.j) def mul(self,scalar): return Vector(self.i*scalar,self.j*scalar) def dot(self,other): return self.i*other.i+self.j*other.j def normalize(self): scalar = 1/self.getLength() self.i, self.j = self.i*scalar, self.j*scalar def rotate(self,angle): angle = math.radians(angle + self.getangle()) length = self.getlength() self.i, self.j = math.cos(angle)*length, math.sin(angle)*length def getangle(self): return math.degrees(math.atan2(self.j,self.i)) def getlength(self): return math.sqrt(self.i*self.i+self.j*self.j) def getanglebetween(self,other): dot = self.dot(other) l1 = self.getlength() l2 = other.getlength() return math.degrees(math.acos(dot)/(l1*l2)) 27

def draw(self,color="000000", width=4): down = pen.isdown() oldwidth = pen.width() oldcolor = pen.pencolor() pen.pencolor(color) pen.width(width) pen.down() angle = self.getangle() length = self.getlength() pen.setheading(angle) pen.forward(length) pen.setheading(angle+30) pen.backward(0.5) pen.forward(+.5) pen.setheading(angle-30) pen.backward(0.5) pen.forward(0.5) if down: pen.down() else: pen.up() pen.width(oldwidth) pen.pencolor(oldcolor) end draw def end Vector class 28

C 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.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.pencolor("black") 29

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) 30

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() 31

D Tunti 1 - malliratkaisut D.1 Tehtävä 1 from vectors import * alusta koordinaatisto koord = CoordinateSystem() vektori 2i vektorin piirtäminen on suht yksinkertaista, tosin työlästä saada menemään oikein pen.pencolor("red") pen.width(3) pen.pendown() pen.goto(2,0) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) odota klikkausta koord.waitforclick() D.2 Tehtävä 2 from vectors import * alusta koordinaatisto koord = CoordinateSystem() vektori 7i + 2j lasketaan kulma vektorin ja x-akselin välille kulma = math.degrees(math.atan2(2,7)) 32

lasketaan vektorin pituus pituus = math.sqrt(7*7 + 2*2) piirretään vektori pen.pencolor("green") pen.width(3) pen.pendown() nyt käytetään vektorin kulmaa ja pituutta hyväksi piirtämisessä pen.setheading(kulma) pen.forward(pituus) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) odota klikkausta koord.waitforclick() D.3 Tehtävä 3 from vectors import * alusta koordinaatisto koord = CoordinateSystem() 10 satunnaista vektoria tarvitaan satunnaislukugeneraattoria, joten tuodaan kirjasto import random määritellään funktio piirtämään vektoreita def piirravektori(i, j, vari,paksuus): sama piirtoalgoritmi kuin edellisessä esimerkissä, paitsi värien osalta kulma = math.degrees(math.atan2(j,i)) pituus = math.sqrt(i*i + j*j) pen.pencolor(vari) 33

pen.width(paksuus) pen.pendown() pen.setheading(kulma) pen.forward(pituus) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) varit=["blue","brown","black"] for i in range(0,10): luodaan satunnaiset x ja y komponentit vektorille random() palauttaa arvon välillä [0,1[ joten komponentien arvot ovat 10 - [0,1[*20 = 10 - [0,20[ = ]-10,10] x = 10 - random.random()*20 y = 10 - random.random()*20 v = random.randrange(0,len(varit)) vari = varit[v] paksuus = random.randrange(1,5) piirravektori(x, y, vari, paksuus) odota klikkausta koord.waitforclick() D.3.1 Tehtävä 3c from vectors import * alusta koordinaatisto koord = CoordinateSystem() 10 satunnaista vektoria 10-säteisellä ympyrällä tarvitaan satunnaislukugeneraattoria, joten tuodaan kirjasto import random määritellään funktio piirtämään vektoreita def piirravektori(i, j, vari,paksuus): sama piirtoalgoritmi kuin edellisessä esimerkissä, 34

paitsi värien osalta kulma = math.degrees(math.atan2(j,i)) pituus = math.sqrt(i*i + j*j) pen.pencolor(vari) pen.width(paksuus) pen.pendown() pen.setheading(kulma) pen.forward(pituus) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) varit=["blue","brown","black"] for i in range(0,10): luodaan satunnaiset x ja y komponentit vektorille random() palauttaa arvon välillä [0,1[ joten komponentien arvot ovat 10 - [0,1[*20 = 10 - [0,20[ = ]-10,10] x = 10 - random.random()*20 y = 10 - random.random()*20 v = random.randrange(0,len(varit)) vari = varit[v] paksuus = random.randrange(1,5) pit=math.sqrt(x*x+y*y) pit=pit piirravektori(10*x/pit, 10*y/pit, vari, paksuus) pen.goto(10,0) pen.setheading(90) pen.pencolor("pink") pen.pendown() pen.circle(10,steps=50) odota klikkausta koord.waitforclick() 35

D.4 Kotitehtävä 1 from vectors import * alusta koordinaatisto koord = CoordinateSystem() määritellään funktio piirtämään vektoreita def piirravektori(i, j): sama piirtoalgoritmi kuin edellisessä esimerkissä, paitsi värien osalta kulma = math.degrees(math.atan2(j,i)) pituus = math.sqrt(i*i + j*j) pen.pendown() pen.width(4) pen.pencolor("red") pen.setheading(kulma) pen.forward(pituus) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) a-tehtävä piirravektori(-4, 0) piirravektori(0, 3) b-tehtävä piirravektori(2, -4) piirravektori(3, 5) odota klikkausta koord.waitforclick() 36

D.5 Kotitehtävä 2 from vectors import * alusta koordinaatisto koord = CoordinateSystem() määritellään funktio piirtämään vektoreita def piirravektori(i, j): sama piirtoalgoritmi kuin edellisessä esimerkissä, paitsi värien osalta kulma = math.degrees(math.atan2(j,i)) pituus = math.sqrt(i*i + j*j) tässä emme halua aloittaa origosta joka kerta! pen.pendown() pen.width(4) pen.pencolor("red") pen.setheading(kulma) pen.forward(pituus) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) pen.pencolor("red") piirravektori(5,0) piirravektori(0,5) piirravektori(-5,0) piirravektori(0,-5) vino neliö i = 7 j = 2 pen.pencolor("blue") piirravektori(i,j) piirravektori(-j,i) piirravektori(-i,-j) piirravektori(j,-i) 37

odota klikkausta koord.waitforclick() D.6 Kotitehtävä 3 from vectors import * alusta koordinaatisto koord = CoordinateSystem() määritellään funktio piirtämään vektoreita def piirravektori(pituus, kulma): sama piirtoalgoritmi kuin edellisessä esimerkissä, mutta emme laske kulmaa ja pituutta, ne annetaan kutsuttaessa funktiota tässä emme halua aloittaa origosta joka kerta! pen.pendown() pen.width(4) pen.pencolor("red") pen.setheading(kulma) pen.forward(pituus) pen.left(30) pen.forward(-.5) pen.left(60) pen.forward(.5) pen.pendown() pen.left(60) pen.forward(-.5) kulmien määrä n = 6 sivun pituus pituus = 3 iteroidaan läpi kaikki kulmat ja piirretään vektorit pen.pencolor("red") for kulma in range(0, 360, int(360/n)): piirravektori(pituus, kulma) jos halutaan pirtää vino säännöllinen monikulmio, niin aloitetaan muusta kulmasta kuin 0 astetta 38

aloituskulma = 15 pituus = 5 pen.pencolor("blue") for kulma in range(0+aloituskulma, 360+aloituskulma, int(360/n)): piirravektori(pituus, kulma) odota klikkausta koord.waitforclick() 39

E 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] 40

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ä: 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() 41

F Tunti 2 - malliratkaisut F.1 Tehtävä 1 from vectors import * alusta koordinaatisto koord = CoordinateSystem() koord.setaxes(-20, 20,-20, 20) Piirretään vektorit a, b, c a = Vector(5,0) b = Vector(2,2) c = Vector(-3,-8) d = Vector(-5, 4) a.draw() b.draw() c.draw() d.draw() a + b Vector(5 + 2, 0 + 2).draw("red", 8) b + a Vector(2 + 5, 2 + 0).draw("blue", 2) c + d Vector(-3 + (-5), -8 + 4).draw() c - d Vector(-3 - (-5), -8-4).draw("ff8888") 42

d - c Vector(-5 - (-3), 4 - (-8)).draw("8888ff") a + b + c - d i = a.i + b.i + c.i - d.i j = a.j + b.j + c.j - d.j i = 5 + 2 + (-3) - (-5) j = 0 + 2 + (-8) - 4 Vector(i, j).draw("88ff88") odota klikkausta koord.waitforclick() F.2 Tehtävä 2 from vectors import * alusta koordinaatisto koord = CoordinateSystem() koord.setaxes(-20, 20,-30, 20) a = Vector(5,0) b = Vector(2,2) c = Vector(-3,-8) d = Vector(-5, 4) Piirretään b 5 kertaa for i in range(5): b.draw("red", 10) e = 5b i = 5*b.i j = 5*b.j e = Vector(i, j) e.draw("blue", 2) 43

-5b e = Vector(-5*b.i, -5*b.j) e.draw("2266aa") 2c + 3d Vector(2*c.i + 3*d.i, 2*c.j + 3*d.j).draw("red") 2(c - d) i = 2*(c.i - d.i) j = 2*(c.j - d.j) Vector(i, j).draw("green") odota klikkausta koord.waitforclick() F.3 Tehtävä 3 from vectors import * alusta koordinaatisto koord = CoordinateSystem() koord.setaxes(-20, 20,-20, 20) Vektori "peli" import random luodaan nollavektori jonka komponentteja muunnellaan myöhemmin v = Vector(0,0) x, y = 0, 0 44

running = True countdown = 1000 usefriction = True kitkakerroin = 0.005 kulma = random.random() * math.pi * 2 v.i = math.cos(kulma) v.j = math.sin(kulma) while running: x = x + v.i y = y + v.j if x<koord.x0 or x>koord.x1: v.i = -v.i x = x + 2*v.i if y<koord.y0 or y>koord.y1: v.j = -v.j y = y + 2*v.j v.draw() countdown = countdown - 1 if countdown < 0 or (v.i*v.i+v.j*v.j)<.01: running = False if usefriction: v.i = v.i * (1 - kitkakerroin) v.j = v.j * (1 - kitkakerroin) odota klikkausta koord.waitforclick() F.4 Kotitehtävä 1 from vectors import * alusta koordinaatisto koord = CoordinateSystem() a = Vector(3, -5) ai = Vector(3, 0) aj = Vector(0,-5) a.draw() ai.draw("red") aj.draw("blue") 45