16.3.2019

Ohjelmointia pitkässä matematiikassa – miten käytännössä?

OPH on julkaissut pe 15.3.2019 kommentoitavaksi luonnoksen lukion opetussuunnitelman perusteista 2019.

while True:
    print(”Vihdoin ohjelmointia lukiossa!”)

Tartun näin julkaisupäivän iltana yhteen yksityiskohtaan: Valinnaisiin opintoihin kuuluva moduuli ”Maa11 Algoritmit matematiikassa” sisältää ohjelmointia! Pidän uudistusta erittäin tervetulleena, onhan matematiikan soveltamisessa ohjelmoinnista suuri apu. (Paljon suurempi kuin esimerkiksi CAS-laskennasta, jota lukiossa harjoitellaan paljon.) Uudistus sopii myös hyvin yhteen peruskoulun vuoden 2014 opetussuunnitelman perusteiden kanssa, joiden myötä ohjelmointia tuotiin hieman peruskoulun matematiikan opetukseen.

Sisältö

LOPS-luonnosta lainaten moduulin MAA11 keskeiset sisällöt ovat

  • konnektiivit ja totuusarvot
  • kokonaislukujen jaollisuus ja jakoyhtälö
  • Eukleideen algoritmi
  • aritmetiikan peruslause
  • algoritmisen ajattelun peruskäsitteet: sekvenssi, ehto ja toisto
  • matemaattisten ongelmien ratkaiseminen ohjelmoimalla

Rupesin miettimään, millaisen kurssin näistä aineksista voisi kasata. Syksyllä 2021 peruskoulusta tulevat ikäluokat ovat jo tutustuneet ohjelmointiin, mutta mahdollisesti varsin kevyesti. Ohjelmointiosion tulee siis lähteä alkeista ja sallia osaavammille nopeampi eteneminen kurssin ylittävään osioon.

Jos käytettävissä on esimerkiksi 17 kappaletta 75 min oppitunteja, kurssi voisi näyttää tältä.

  1. Logiikka (4 oppituntia)
    – Luonnollisen kielen ja formaalin kielen ero, looginen päättely
    – Loogiset konnektiivit ”ja”, ”tai”, ”ei”, totuusarvotaulut
    – Implikaatio ja ekvivalenssi
    – Loogiset portit ja tietokoneen toiminnan perustuminen logiikalle
  2. Lukuteoria (4 oppituntia)
    – Jaollisuus ja jakoyhtälö
    – jaollisuussäännöt luvuille 2 – 11
    – suurin yhteinen tekijä ja Eukleideen algoritmi
    – Alkuluvun käsite, Eratostheneen seula, aritmetiikan peruslause
  3. Ohjelmoinnin alkeet (5 oppituntia, esimerkit lukuteoriasta)
    – Ohjelmoinnin perusidea, ensimmäinen ohjelma ”Hello World”
    – Käyttäjältä syötteen kysyminen, ehtolauseet (if-else-rakenne)
    – Edellisen harjoittelua, katsaus tietotyyppeihin (teksti, kokonaisluku, liukuluku, lista)
    – silmukat: while-komento
    – harjoittelua
  4. Muiden matemaattisten ongelmien ratkaisua ohjelmoimalla (4 oppituntia, käsitelty laajuus opiskelijoiden oman etenemistahdin mukaan, osalle jo kaksi ensimmäistä ovat kylliksi)
    – Yhtälön ratkaisu puolitushaulla
    – tapoja laskea likiarvo luvulle π
    – Numeerisen integroinnin toteuttaminen ohjelmoimalla
    – Newtonin menetelmä yhtälön numeerisessa ratkaisussa
    –  …

Käytännössä osiot 2 ja 3 voitaisiin opettaa limittäin niin, että ohjelmointia päästäisiin käyttämään mahdollisimman varhain ja esimerkit liittyisivät käsiteltyyn lukuteoriaan.

Millä kielellä?

Kurssiin mahtuvat asiat ovat varsin alkeellisia, joten kielen valinta ei ole kovin oleellinen kysymys. Tärkeintä on, että tulee kokeilleeksi jotakin tekstipohjaista ohjelmointikieltä, joka on oikeasti laajassa käytössä. Tällä hetkellä valitsisin kurssin kieleksi Pythonin, koska sillä on lähestyttävä syntaksi ja hyvät matematiikkakirjastot. Käytännössä kielivalintaa tulee rajoittamaan se, mitä Abitti-ympäristössä on tarjolla.

Mistä materiaalit?

Kustantamot laativat varmasti materiaalia osaksi pitkän matematiikan kirjasarjoja. Tällä hetkellä olemassa olevista materiaaleista paras (ja ilmainen) lienee tie.koodariksi -sivuston laadukas Ohjelmoinnin alkeet -kurssi, jossa on itse tarkistuvat Python-tehtävät. Materiaalia riittää runsaasti tämän kurssin tarpeiden yli.

Kuka opettaa?

Peruskoulun matematiikan opettajat
ovat saaneet opiskella/kerrata ohjelmointia vuoden 2014 OPS-muutoksen
tullessa voimaan. Nyt on lukion opettajien täydennyskoulutuksen vuoro.
Onneksi työmäärä ei ole mahdoton ja aikaa hyvin, opetetaanhan
ensimmäiset uuden LOPSin mukaiset MAA11-kurssit aikaisintaan vuonna
2022.

Millaisia tehtäviä?

Tässä joitakin vanhoja ohjelmointikurssini harjoitustehtäviä, jotka sopisivat MAA11-kurssille aihepiirinsä ja tasonsa puolesta.

Tehtävä. Laadi ohjelma, joka tekee seuraavaa:
– aloitetaan positiivisesta kokonaisluvusta n
– jos n on parillinen, se jaetaan kahdella
– jos n on pariton, se kerrotaan kolmella ja tuloon lisätään yksi
– näin jatketaan, kunnes tulos on 1. Laita ohjelmasi tulostamaan välivaiheet.
Collatzin konjektuurin mukaan tämä prosessi päättyy aina riippumatta siitä, mistä luvusta lähdettiin liikkeelle. Konjektuuria ei ole vielä onnistuttu todistamaan oikeaksi tai vääräksi.

Ratkaisu.
n = 7
print(n) 

while n > 1:
if n % 2 == 0:
n = n//2
else:
n = 3*n + 1
print(n)

Tehtävä. Laadi ohjelma, joka tarkistaa, onko käyttäjän antava
vuosi karkausvuosi. Karkausvuosia ovat vuodet, jotka ovat neljällä
jaollisia, mutta eivät sadalla jaollisia. Poikkeuksena edelliseen luvulla
400 jaolliset vuodet ovat karkausvuosia.

Ratkaisu.

vuosi = int(input(”Anna vuosi: ”))
if vuosi % 400 == 0 or (vuosi % 4 == 0 and vuosi % 100 != 0) :
print(”Vuosi on karkausvuosi.”)
else:
print(”Vuosi ei ole karkauvuosi.”)



Tehtävä. Laadi ohjelma, joka tarkistaa, onko käyttäjän antama luku alkuluku. Kuinka suurista luvuista se selviää? Miten ohjelmaa voisi nopeuttaa?

Ratkaisu.
import math
luku = int(input(”Anna lukua 1 suurempi kokonaisluku: ”))
ylaraja = int(math.sqrt(luku))
jakaja = 2
on_alkuluku = True
while jakaja <= ylaraja:
if luku % jakaja == 0:
on_alkuluku = False
break
jakaja += 1

if (on_alkuluku):
print(”Luku on alkuluku.”)
else:
print(”Luku ei ole alkuluku.”)

Tehtävä. Laadi ohjelma, joka ratkaisee funktion nollakohdan likimain puolitushaulla. Tarkkuuden tulee olla säädettävä. 

Ratkaisu.
# Ratkaistaan funktion f välillä ]a,b[ sijaitseva nollakohta puolitushaulla.

def f(x):
return x**2 – 5

a = 1
b = 3
tarkkuus = 10**(-6)

while b-a > tarkkuus:
c = (a+b)/2
if f(a)*f(c)< 0:
b = c
else:
a = c

print(”Nollakohta on likimain ”,(a+b)/2 )