Najljubša naloga

Izmed vseh matematičnih nalog iz svojih gimnazijskih časov mi je v spominu najdlje ostala  naslednja:

V gradu straši, a ne vsako noč. Zagotovo straši, če prejšnjo noč ni strašilo. Če pa je prejšnjo noč strašilo, je enako verjetno, da to noč straši, kot da ne straši. V noči od srede na četrtek je strašilo. Kolika je verjetnost, da bo strašilo v noči od nedelje na ponedeljek?

Nalogo  je v šestdesetih letih objavil France Križanič v tretjem od svojih slavnih učbenikov za matematiko v gimnaziji Aritmetika, algebra in analiza, nekoliko spremenjeno pa jo najdemo tudi v njegovih kasnejših učbenikih.  Naloga sodi med markovske verige,  poglavju iz verjetnostnega računa, ki se imenuje po ruskem matematiku Andreju Andrejeviču Markovu.  Poglavje ni našlo svojega prostora v gimnazijskih učbenikih ne prej ne kasneje. Zakaj ne prej, je še razumljivo, saj si je Križanič prizadeval  posodobiti gimnazijsko matematiko in mu je to tudi uspelo. Kasneje pa je v gimnazijsko ladjo vkrcalo preveč potnikov in v skrbi, da jim ne bi bilo kaj pretežko, so vrgli proč večino njegovih posodobitev.

Zaporedju poskusov, ko se vsakič zgodi natanko eden od nezružljivih dogodkov

    \[A_1,A_2,\dots ,A_n\]

in je verjetnost  p_{ij}, da se bo v naslednjem poskusu zgodil A_j, odvisna samo od dogodka A_i iz tekočega poskusa in od A_j, pravimo veriga Markova ali markovska veriga. Posamezne verjetnosti p_{ij} zapišemo v kvadratni prehodni matriki

    \[P=\left[\begin{matrix} p_{11},&p_{12},&\dots&p_{1n}\\ p_{21},&p_{22},&\dots&p_{2n}\\ \vdots&\vdots&\ddots&\vdots\\ p_{n1},&p_{n2},&\dots&p_{nn}\\ \end{matrix}\right]\]

Vsota verjetnosti v vsaki vrstici marike P je

    \[p_{i1}+p_{i2}+\dots+p_{in}=1,\]

saj se eden od dogodkov A_i gotovo  zgodi.

Vrnimo se k reševanju naše naloge:

z A_1 označimo “straši”, z A_2 pa “ne straši”.  Potem elementi naše prehodne matrike pomenijo naslednje:

  • p_{11} – verjetnost, da naslednjo noč straši, če je prejšnjo strašilo,
  • p_{12} – verjetnost, da naslednjo noč ne straši, če je prejšnjo strašilo,
  • p_{21} – verjetnost, da naslednjo noč straši, prejšnjo ni strašilo,
  • p_{22} – verjetnost, da naslednjo noč ne straši, če prejšnjo ni strašilo.

Iz teksta naloge preberemo naslednjo prehodno matriko

    \[P=\left[\begin{matrix} \frac{1}{2},&\frac{1}{2}\\ 1,&0\\ \end{matrix}\right]\]

Kaj pa po dveh nočeh? Označimo z

  • p_{11}(2) – verjetnost, da naslednjo noč straši, če je pred dvema strašilo,
  • p_{12}(2) – verjetnost, da naslednjo noč ne straši, če je pred dvema strašilo,
  • p_{21}(2) – verjetnost, da naslednjo noč straši, pred dvema ni strašilo,
  • p_{22}(2) – verjetnost, da naslednjo noč ne straši, če pred dvema ni strašilo.

Dogodek, da to noč straši, če je pred dvema strašilo, se lahko zgodi takole: straši vse tri noči zapored ali pa straši – ne straši – straši. Dogodki so med seboj neodvisni, produkti pa nezdružljivi. Zato lahko zapišemo:

    \[p_{11}(2) =p_{11}p_{11}+p_{12}p_{21}\]

Po podobnem premisleku dobimo še tri enačbe:

    \[p_{12}(2) =p_{11}p_{12}+p_{12}p_{22}\]

    \[p_{21}(2) =p_{21}p_{11}+p_{22}p_{21}\]

    \[p_{22}(2) =p_{21}p_{12}+p_{22}p_{22}\]

V zadnjih enačbah prepoznamo elemente kvadrata prehodne matrike P. Če torej označimo s P(2) prehodno matriko po dveh korakih  (nočeh), je

    \[P(2)=\left[\begin{matrix}p_{12}(2),&p_{12}(2)\\p_{21}(2),&p_{22}(2)\\\end{matrix}\right]= \left[\begin{matrix}p_{11}p_{11}+p_{12}p_{21}&p_{11}p_{12}+p_{12}p_{22}\\ p_{21}p_{11}+p_{22}p_{21}&p_{21}p_{12}+p_{22}p_{22}\\\end{matrix}\right]=P^2.\]

Brez težav posplošimo na prehodno matriko za n korakov. Uganili ste

    \[P(n)=P^n.\]

Preostane še, da preštejete , koliko je noči, izračunate ustrezno prehodno matriko, v njej pogledate pravi element in mi sporočite rezultat.

Nostalgija(2)

Zadnjič sem pisal o tem, kako je Logo kakor feniks ponovno vstal iz pepela, tokrat v preobleki Pythonove želvje grafike. Nekaj preprostih ukazov , pa vam program lahko riše lepe krivulje. Grafika pa lahko postane nekaj posebnega, če pri njenem nastajanju uporabite rekurzijo – programerski prijem, s katerim velik problem razdelite na identične, a nekoliko manjše probleme. Seveda se to da narediti samo pri posebnih problemih. Včasih smo občudovali Hilbertove krivulje, krivulje Sierpinskega, hanojske stolpiče, celo permutacije se dajo programirati rekurzivno. A tokrat (pogled skozi okno pove, da še vedno sneži) si oglejmo Kochovo snežinko.

Koda je naslednja:

#Kochova snežinka, V.Petruna feb.2013
from Tkinter import *
import math
import turtle
a=80
def koch(x,stopnja):
    if stopnja<1:
        turtle.forward(x)
    else:
        koch(x/3,stopnja-1)
        turtle.left(60)
        koch(x/3,stopnja-1)
        turtle.right(120)
        koch(x/3,stopnja-1)        
        turtle.left(60)
        koch(x/3,stopnja-1)
turtle.heading()
turtle.penup()
turtle.setpos(-600,0)
turtle.pendown()
for n in range(5):    
    for i in range(3):        
        koch(243,n)
        turtle.right(120)
    turtle.penup()
    turtle.forward(243)
    turtle.pendown()
mainloop()

Dolžina 243 ni izbrana naključno, saj je to 3^5. Tako se izognemo napaki zaradi necelega deljenja. Program nam ustvari naslednjo risbico