sunnuntai 24. toukokuuta 2015

Buffon, laskimet ja koulu

Johduin jokin aika sitten palauttamaan mieleeni probleeman, jonka Buffonin kreivi, Georges-Louis Leclerc de Buffon esitti vuonna 1733. Tämä on todennäköisyyteen liittyvä koe, joka tunnetaan Buffonin neulaprobleeman nimellä:

Paperille piirretään tasavälisiä yhdentaisia viivoja. Kuvion päälle pudotetaan satunnaisesti neula, jonka pituus on sama kuin viivojen etäisyys toisistaan. Millä todennäköisyydellä neula putoaa siten, että se leikkaa jonkin viivan?

Buffonin neulaprobleema: yhdensuuntaiset viivat ja neula

Ainakin yliopistojen todennäköisyyslaskennan kursseissa tämä yleensä lienee harjoitustehtävänä. Tulos on $2/\pi \approx 0.63662$. En esitä ratkaisua tässä. Kiinnostuneet voivat katsoa vaikkapa verkkodokumenttia http://fi.wikipedia.org/wiki/Buffonin_neula.

Lukiossakin opetetaan todennäköisyyslaskentaa. Saattaa olla, että ratkaisu on hieman vaikea lukiolaiselle käsitteellisellä tasolla, vaikka se teknisesti on täysin mahdollinen.

Mutta lukiolainenhan voisi simuloida probleemaa. Piirretään viivat paperille ja heitetään neulaa vaikkapa 10000 kertaa. Lasketaan viivan päälle osumisten suhde kaikkien heittojen määrään ja katsotaan, päästäänkö lähelle lukua $2/\pi$. Ehkei sentään. Olisi vähän tylsää ja kuntakin joutuisi ostamaan neuloja aika läjän.

Mutta tässä olisi sopiva tehtävä toteutettavaksi laskimilla tai mieluummin tietokoneilla. Jouduttaisiin pohtimaan todennäköisyyden luonnetta ja simuloinnin ideaa, saataisiin matematiikan oppimista tukeva ohjelmointitehtävä. Konkreettista tekemistä, jossa ei kysytäkään opettajalta, milloin tehtävä on tehty, vaan saatu tulos ratkaisee.

Edellytyksenä tietenkin on, että käytössä oleva laskin tai tietokoneohjelma tukee tällaista käyttöä. Ainakin tarvitaan satunnaislukugeneraattori, joka tuottaa jollekin välille tasaisesti jakautuneita satunnaislukuja. (Mitä nämä ovat? Lisää pohdittavaa tunnille.) Lisäksi tarvitaan mahdollisuus kirjoittaa riittävän helposti yksinkertaista ohjelmakoodia, ja laskentanopeuttakin pitäisi olla riittävästi. Miljoonan neulanpudotuksen pitäisi olla mahdollista muutamassa minuutissa, ehkä alle minuutin. Varovaisempaa tietenkin aloittaa tuhannesta tai muutamasta kymmenestä tuhannesta pudotuksesta.

En tiedä, miten hyvin nykyiset laskimet ja kouluihin tarjottavat tietokoneohjelmat tukevat tällaista laskentaa. Esitänkin haasteen laskinfirmojen edustajille: laatikaa ohjelma ja julkaiskaa se, lisäksi tiedot laskentaan kuluvasta ajasta.

Matematiikan ymmärtämisen kannalta symbolisten laskimien käyttö saattaa herkästi painottaa vääriä asioita. Oleelliseksi tulee valmiiden työkalujen käytön oppiminen ja sivuun jää se, mihin näitä varsinaisesti tarvitaan. Numeerinen laskenta ohjelmointiin yhdistettynä saattaa avata oppilaille näköaloja enemmän kuin symbolinen laskenta asiana sinänsä. Ei symbolinen laskenta silti tarpeetonta ole. Sen ja ohjelmoinnin yhdistäminen avaa mahdollisuuksia vielä enemmän.

Joku saattaa sanoa, ettei koulumatematiikka tällaista ole eikä koulussa ole mahdollisuuksia tällaiseen. Aivan oikeassa hän on. Mutta tällaista sen pitäisi lähitulevaisuudessa olla, ja tähän suuntaan pitäisi edetä.

2 kommenttia:

SKK kirjoitti...

Keskustelua on syntynyt Facebookissa ja hyvä niin. Nopeusraportointeja on saatu. Kaipaisin kuitenkin koodeja, millä nämä on eri laitteilla laskettu: tieto siis laitteesta ja sille tehdystä koodista. Missä määrin nämä ovat sellaisia, että voisi odottaa lukiolaisen a) ymmärtävän, b) tekevän niitä?

Pohjaksi omat Mathematica-koodini: helpommin ymmärrettävä ja tehokkaampi, mutta kryptisempi.

sim[n_] := (m = 0;
Do[x = RandomReal[{-1, 1}];
a = RandomReal[{-Pi/2, Pi/2}];
x1 = x - Cos[a]; x2 = x + Cos[a];
If[x1 < -1 || x2 > 1, m++], {n}];
N[m/n])

true[{r1_, r2_}] :=
If[r1 - Cos[Pi r2/2] < -1 || r1 + Cos[Pi r2/2] > 1, 1, 0];
sim2[n_] := N[Apply[Plus, Map[true, RandomReal[{-1, 1}, {n, 2}]]]/n]

Jouni Seppänen kirjoitti...

En ole laskinvalmistaja, mutta joskus kysyttäessä olen suositellut Pythonia ja nimenomaisesti IPython Notebookia tällaisiin tarkoituksiin, joten tässä esimerkki: http://nbviewer.ipython.org/gist/jkseppan/8b09b9d6ba7cf5c8f4a7