Delo s tekstovnimi datotekami v Pythonu

Pisanje kode v Worpressu dosežemo z vtičnikom, ki kodo obda z značkama

<pre class="brush:py">     
koda
</pre>

Prej sem poskušal <pre>  in </pre>  iz HTML4.0, a ni ohranjalo Pythonovega zamikanja ne vrstične poravnave.  Tole pa dela brezhibno, kaže, da ima vsak jezik svoj class, ki ga je treba navesti.  Morda lahko to naredimo tudi ročno, brez vtičnika?

Branje tekstovne datoteke po vrsticah :

f=open("C:\Documents and Settings\uporabnik\Desktop\Racunaj.txt","r")
for line in f:
    print line
f.close()

Zapis  vrstice v datoteko – prejšnja vsebina se zbriše

f=open("C:\Documents and Settings\uporabnik\Desktop\Racunaj.txt","w")
line=str(now)+'  '+ime+' '+str(k)+' poskusov do '+repr(str(a)).rjust(2)+' rezultat '+repr(str(n)).rjust(3)+" TOČK:"+repr(str(a*n)).rjust(4)
f.write(line)
f.close()

Dodajanje vrstice na koncu v že obstoječo datoteko – prejšnja vsebina ostane nespremenjena:

f=open("C:\Documents and Settings\uporabnik\Desktop\Racunaj.txt","a")
line=str(now)+'  '+ime+' '+str(k)+' poskusov do '+repr(str(a)).rjust(2)+' rezultat '+repr(str(n)).rjust(3)+" TOČK:"+repr(str(a*n)).rjust(4)
f.write(line)
f.close()

Sangaku(5)

Pa še eden od sangakujev – to so pravzaprav geometrijske uganke, ki so dobile ime po slikarijah na lesu, ki so jih ustvarili japonski umetniki v obdobju Edo – od začetka 16. stol. do sredine 19. stol.  To je obdobje samoizolacije Japonske od preostalega sveta in v tem času so se razvili tudi haikuji – kratke, običajno tri vrstične pesmi, prva ima 5, druga 7 in zadnja 5 zlogov. Mojster haikuja je bil Matsuo Bašo, tukaj je en njegov (po mojem prevodu iz angleščine):

Leto za letom
na opičjih obrazih
opičje maske.
(Matsuo Bašo)

A vrnimo se k sangakujem:

 

Kolikokrat večji je polmer katerega od krogov na obodu od polmera manjšega kroga?

Sangaku(4)

Četrta japonska uganka je zelo lepa, a morda malo težja – ali pa tudi ne?

Določite polmer katerega od skladnih krogov, če je stranica kvadrata enaka 1. Določi tudi kot med poševnico skozi spodnje levo oglišče in osnovnico kvadrata.

PTR v srednji šoli(12)

Nazaj

Zadnjič smo izpeljali izraz kinetično energijo v PTR, dobili smo

$$W_k=m_oc^2(\gamma-1).$$

Pri majhnih hitrostih mora ta formula preiti v običajno formulo za kinetično energijo, katero poznamo že iz osnovne šole. Poglejmo, kako.

$$W_k=m_oc^2(\gamma-1)=m_oc^2\left(\frac{1}{\sqrt{1-\frac{v^2}{c^2}}}-1\right)=m_oc^2\left(\left(1-\frac{v^2}{c^2}\right)^{-\frac{1}{2}}-1\right)$$

Koren razvijemo v binomsko vrsto. Kako? Spomnimo se na binomski izrek, ki pove, kako izračunamo potenco dvočlenika

$$(a+b)^n={n \choose 0} a^nb^0+{n \choose 1} a^{n-1}b^1+{n \choose 2} a^{n-2}b^2+\dots {n \choose n} a^ob^n$$

V prejšnjih primerih je bil $n$ naravno število in izraz na desni veččlenik. Tokrat pa imamo v eksponentu $-1/2$ , zato bo členov neskončno – binomska vrsta. A potrebujemo le nekaj členov. Izračunajmo nekaj začetnih binomskih simbolov (spomnimo se tudi na njihove lastnosti)

$${-\frac{1}{2} \choose 0}=1,~~{-\frac{1}{2} \choose 1}=-\frac{1}{2},~~{-\frac{1}{2} \choose 2}=\frac{-\frac{1}{2}\left( -\frac{3}{2}\right)}{1\cdot 2}=\frac{3}{8},\dots$$

Sestavimo torej v zgornjem izrazu  vrsto

$$W_k=m_oc^2(\gamma-1)=m_oc^2\left(1+\frac{1v^2}{2c^2}+\frac{3v^4}{8c^4}+\dots -1\right)$$

Matematik je svoje delo opravil, sedaj pa nastopi fizik. Ker je

$$v<<c,$$

lahko v napisani vrsti vse člene od vključno tretjega naprej zanemarimo, saj so premajhni, da bi kaj bistvenega prispevali.  Prvi in zadnji člen v oklepaju se še odštejeta, tako da ostane samo drugi. Dobimo torej

$$W_k=\frac{m_ov^2}{2},$$

kar smo tudi pričakovali.

konec

PTR v srednji šoli (11)

Poglejmo še, kako je v PTR z delom in energijo. Najprej ugotovimo, da 2. Newtonov zakon v obliki

$$\vec{F}=m\vec{a}$$

ne velja,  saj  masa telesa ni stalna, temveč odvisna  od hitrosti. Zapisati ga moramo  takole

$$\vec{F}=\frac{d\vec{G}}{dt},$$

pri čemer je

$$\vec{G}=m\vec{v}$$

gibalna količina telesa.  Delo, ki ga opravi ta sila, je torej enako

$$A=\int_{x_1}^{x_2}{F(x)dx}=\int_{x_1}^{x_2}{\frac{dG}{dt}dx}=\int_{G_1}^{G_2}{vdG}$$

 Pozabavajmo se  najprej z nedeločeni integralom – integrandu poiščimo primitivno funkcijo. Integrala se najprej lotimo “per partes”

$$\int{vdG}=vG-\int{Gdv}=vG-m_o\int{\frac{vdv}{\sqrt{1-\frac{v^2}{c^2}}}},$$

nato pa uvedemo novo spremenljivko

$$1-\frac{v^2}{c^2}=u.$$

Dobimo, da je zadnji integral enak

$$m_o\int{\frac{vdv}{\sqrt{1-\frac{v^2}{c^2}}}}=-m_oc^2\sqrt{1-\frac{v^2}{c^2}},$$

kar skupaj da iskano funkcijo

$$\int{vdG}=\frac{m_ov^2}{\sqrt{1-\frac{v^2}{c^2}}}+m_oc^2\sqrt{1-\frac{v^2}{c^2}}=\frac{m_o(v^2+c^2-v^2)}{\sqrt{1-\frac{v^2}{c^2}})}=mc^2.$$

Delo je torej enako spremembi zgornje funkcije

$$A=\int_{G_1}^{G_2}{vdG}=(m_2-m_1)c^2.$$

Iz fizike pa poznamo izrek o mehanski energiji: Delo je enako spremembi mehanske  energije telesa.  Zato  prepoznamo v zgornji funkciji energijo telesa:

$$W=mc^2~~~~(1)$$

Telo, ki miruje,  ima torej mirovno ali lastno  energijo

$$W_o=m_oc^2~~~~(2)$$

Enačba (1) je najbrž najslavnejša fizikalna enačba. O njej poje celo pesem  J. Menarta:

Oda od, balada balad, E=mc². 

Enačba (2) pa daje odgovor na pomembno vprašanje: Kaj je masa? V obrazcu vidimo, da je masa energija, deljena s kvadratom konstante, torej (zelo zgoščena) energija.

Polno energijo delca W  definiramo kot vsoto njegove lastne in kinetične energije, torej

$$W=W_o+W_k.$$

Od tod dobimo za kinetično energijo naslednji izraz

$$W_k=W-W_o=mc^2-m_oc^2=m_oc^2(\gamma-1).$$

Pri tem je seveda $\gamma$ relativistični faktor, omenjen v prejšnjih poglavjih.

Naprej

Krožnica(2)

Krožnici se dotikata z zunanje strani.

  1. Konstruiraj tretjo krožnico, ki se dotika obeh.
  2. Konstruiraj četrto krožnico, ki se prvi dve dotika od zunaj, tretje pa od znotraj (dve rešitvi).

Namig: Pri prvi nalogi lahko ugotoviš središče in polmer iskane krožnice že s premislekom, pri drugi pa je glavna težava določiti polmer 4. krožnice. Zato poveži središča vseh krogov, poglej, kje so trikotniki pravokotni od tam izrazi neznano. Upam, d ati bo v pomoč tudi spodnja animacija:

 

Bordano

[google-map-v3 width=”600″ height=”700″ zoom=”12″ maptype=”ROADMAP” mapalign=”center” addresscontent=”Bordano” addmarkermashup=”true” maptypecontrol=”true” pancontrol=”true” zoomcontrol=”true” scalecontrol=”true” streetviewcontrol=”true” bubbleautopan=”true” showbike=”false” showtraffic=”false” showpanoramio=”false”]

Ali nas Pitagorov izrek lahko preseneti(2)

V. Petruna, feb.2012

Pitagorov izrek

(skeč ob informativnem dnevu šole)

Osebe: NAPOVEDOVALKA, SARA, DR.KRISTJAN, OSMOŠOLEC

NAPOVEDOVALKA (recimo ji Anja, počasi in resno): Prekinjamo dnevnik  z novico o izrednih dogodkih v Srednji šoli Črnomelj. Iz zanesljivih virov smo izvedeli, da je na danes zjutraj tej šoli izbruhnil strašen virus. Nobenega od četrtošolcev ni v šolo, situacija je dramatična, zato kličemo našo dopisnico Saro, da poroča s kraja dogodka.   Sara, se slišimo?
SARA (dramatično): Dober dan, situacija je res izjemno težka.  Dejansko nobenega od četrtošolcev danes ni v šoli. Šolske reševalne ekipe so v polni pripravljenosti, učiteljski zbor zaseda za tistimi vrati že dve debeli uri, iz zaupnih virov mi je uspelo zvedeti le, da ravnatelja složno predlagata za virus najstrožji vzgojni ukrep v zadnjih 60 letih obstoja šole.   Z menoj je  dr. Kristjan,  vodja skupine matematikov centra za umetno inteligenco te šole.  Oni so virus  najprej opazili, in zastavila mu bom nekaj vprašanj. Dr. Kristjan, kako ste pravzaprav opazili virus?
DR.KRISTJAN: Hja, ko smo zjutraj prišli  v službo, smo opazili, da je virus  najhuje napadel in grdo zdelal Pitagorov izrek. Poglejte, kaj je naredil z njim. (Pokaže trikotnike na računalniški animaciji).

SARA(zgroženo): To je pa res resno. V spominu imam čisto drugačen Pitagorov izrek. Preverjam pri naključnih opazovalcih.
SARA:(izbere naključnega osmošolca v bližini) Iz katere šole prihajaš?
OSMOŠOLEC: Iz Podzemlja.
SARA: Kako se glasi Pitagorov izrek pri vas?
OSMOŠOLEC: (pove)
SARA: Kaj meniš  o našem Pitagorovem izreku?
OSMOŠOLEC(pove)
SARA:Kvadrati seveda, ne pa ti trikotniki.
SARA(DR.KRISTJANU): Dr. Kristjan, kaj počne vaša ekipa v tem trenutku?
DR.KRISTJAN: Hja, trenutno proučujemo virus in skušamo spraviti situacijo pod kontrolo. (premakne miško, da se pokažejo petkotniki)
SARA:(zavpije) Mutiral je, mutiral je!!
DR. KRISTJAN: (razburjeno):Hja, res kaže, da je mutiral!
SARA: Toliko, spoštovani gledalci,  direktno s kraja dogodkov. Sreča v nesreči je, da skupina naših najboljših matematikov intenzivno išče rešitev. Takoj, ko se bo zgodilo kaj novega, vam bomo o tem izčrpno poročali. Anja?
DR.KRISTJAN: (spet premakne miško, da se pokažejo trikotniki)
NAPOVEDOVALKA: Hvala, Sara. (nadaljuje s poročili).
Čez 5 minut.
NAPOVEDOVALKA: Ponovno  vključujemo poročanje o izrednih dogodkih v Srednji šoli Črnomelj, kaže, da je tam prišlo do sprememb. Od tam  se nam javlja naša dopisnica Sara. Sara, se slišimo?
SARA : Lepo pozdrav še enkrat gledalcem vašega dnevnika.  Kaže, da se je zapletena situacija na tej šoli le pričela nekoliko razpletati. Kljub temu, da je situacija še težka, ni več brezizhodna. Z menoj je vodja skupine matematikov centra za umetno inteligenco na tej šoli, Dr.Kristjan. Dr. Kristjan, kaj se je pravzaprav zgodilo?
DR.KRISTJAN: Hja, kaže, da je virus prizadel Pitagorov izrek manj, kot se je na začetku zdelo. Nekateri člani strokovnega tima  celo preverjajo domnevo, da Pitagorov izrek tudi v taki obliki še vedno velja.
SARA(razburjeno)Kaj?? Pitagorov izrek z enakostraničnimi trikotniki velja? Saj to ne more biti res!
DR.KRISTJAN: Hja, preveriti moramo najbolj neverjetne trditve. Se opravičujem, dosti dela nas še čaka. (Med tem zapiše izraze za enakost ploščin trikotnikov,  jih okrajša in se zamisli.)
SARA: Toliko, spoštovani gledalci,  direktno s kraja dogodkov. Sreča v nesreči je, da skupina naših najboljših matematikov torej še vedno intenzivno išče rešitev. Takoj, ko se bo zgodilo kaj novega, vam bomo o tem izčrpno poročali.
Anja?
NAPOVEDOVALKA: Sara, ali je učiteljski zbor že sprejel kakšne sklepe?
SARA: Ne, Anja, po do sedaj dostopnih podatkih še vedno zasedajo.
NAPOVEDOVALKA: Sara, ali je že kaj znanega tudi o pogrešanih četrtošolcih?
SARA: Iz nepreverjenih virov smo izvedeli, da so danes vsi na informativnem dnevu. Vsi se nameravajo vrniti v šolo prihodnji teden, nekateri že v ponedeljek.
Anja?
NAPOVEDOVALKA: Hvala, Sara. (nadaljuje s poročili).

Konec

Otok zajcev in lisic(2)

Prejšnji primer dopolnimo še s travo – upoštevajmo, da se količina trave na otoku veča tako, kot je značilno za  naravno rast, in manjša zato, ker jo zajci jedo. Upoštevajmo tudi, da lahko zajci umirajo, če jim zmanjka trave. Vse to nas vodi do naslednjih diferencialnih enačb:

\[dz=(az-bz\cdot l-g\frac{z}{x})dt,\]

\[dl=(cl-d\frac{l}{z})dt.\]

 \[dx=(ex-fz\cdot x)dt,\]

Dodatne konstante so e, f in g. Prva opisuje rast trave,  druga meri njeno manjšanje zaradi zajcev, tretja pa pogin zajcev zaradi lakote.  Koda programa v Pythonu je naslednja:

from Tkinter import *
from math import sin,pi
root = Tk()
("symbol",8)
root.title("Zajci in lisice -V. Petruna, januar 2010")
can = Canvas(root, width = 1010, height = 1000, background = "white")
can.create_line(10,500,1000,500, width = 1, fill = "black")
can.create_line(10,500,10,10, width = 1, fill = "black")
x=10
z=100
l=10
a=6.
b=1
c=4.
d=10
e=13
f=0.8
g=0.65
dt=0.001
for t in range(10000):
    x=x+(e*x-f*x*z)*dt
    z=z+(a*z-b*z*l-g*z/x)*dt
    l=l+(c*l-d*l/z)*dt
    can.create_line(10+t*dt*100,500-x,11+t*dt*100,500-x, width = 2, fill = "green")
    can.create_line(10+t*dt*100,500-z,11+t*dt*100,500-z, width = 2, fill = "red")
    can.create_line(10+t*dt*100,500-l*5,11+t*dt*100,500-l*5, width = 2, fill = "blue")
can.pack(side = BOTTOM)
root.mainloop()

S temi konstantami dobimo naslednji izid:

Opazimo, da je dogajanje na otoku kar burno. Količina trave (zelena črta) nekaj časa niha,  nato pa pride do neomejenega razmnoževanja.Za zajce in lisice je to ugodno, od tu naprej se njihovo število periodično spreminja.

Naloga. Poskusi spremeniti  konstante tako, da bodo vse tri količine periodično nihale.

Prav lahko se zgodi, da tisto, kar se nam zdi periodično, to v resnici ni. Primer je spodnji graf:

Če ga pogledamo v 10 krat daljšem času, vidimo

kar pomeni, da bo trave zmanjkalo, nato pa tudi zajcev in lisic. Vse je odvisno od majhnih sprememb konstante f v spodnjem programu. Ta govori o tem, koliko trave popase posamezen zajec.

 

from Tkinter import *
from math import sin,pi
root = Tk()
("symbol",8)
root.title("Zajci in lisice -V. Petruna, januar 2010")
can = Canvas(root, width = 1010, height = 1000, background = "white")
can.create_line(10,500,1000,500, width = 1, fill = "black")
can.create_line(10,500,10,10, width = 1, fill = "black")
x=100
z=30
l=6
a=6.
b=1
c=4.
d=12
e=3.
f=9.06
g=0.67
dt=0.01
xfactor=10 #spreminjaj za razteg časovne osi 
for t in range(10000):
    x=x+(e*x-f*x/z)*dt
    z=z+(a*z-b*z*l-g*z/x)*dt
    l=l+(c*l-d*l/z)*dt 
    can.create_line(10+t*dt*xfactor,500-x,11+t*dt*xfactor,500-x, width = 2, fill = "green")
    can.create_line(10+t*dt*xfactor,500-z,11+t*dt*xfactor,500-z, width = 2, fill = "red")
    can.create_line(10+t*dt*xfactor,500-l*5,11+t*dt*xfactor,500-l*5, width = 2, fill = "blue")
can.pack(side = BOTTOM)
root.mainloop()

Vsaka podobnost z omenjenim otokom in našim planetom je zgolj naključje – ali pa tudi ne.

Otok zajcev in lisic

V začetku 80.let  so tudi k nam z Otoka pljusnile Mavrice – črna škatlica s smešno gumijasto tipkovnico  (Mirko tipka na radirko) je bila v bistvu eden  prvih osebnih računalnikov in  v njem je bilo junaško srce – procesor Zilog80.  Spomina je imela mrcina celih 64kb, od tega 16kb ROMa in 48kb RAMa. Za zunanjo spominsko enoto so Mavrice imele kar kaseto, ki smo jo poganjali na z računalnikom povezanim kasetnikom, namesto monitorja pa je služil kar TV sprejemnik – če je bil barvni, ste imeli  tudi barve. Srečni kupec je poleg Mavrice dobil še kaseto s programi in eden od teh programov je bil tudi Otok zajcev in lisic.

Torej, na otoku živijo zajci in lisice. Število zajcev se s časom veča zato, ker se zajci razmnožujejo, in pada zato, ker jih lisice lovijo. Število lisic pa se prav tako spreminja – veča, ker se množijo, in manjša, ko jim zmanjka hrane.  Označimo z z trenutno število zajcev, za l trenutno število lisic, dz in dl pa naj bosta prirastka zajcev in lisic v časovnem intervalu dt.  Število  tako zajcev kot lisic lahko opišemo z diferencialnima enačbama:

\[ dz=(az-bz\cdot l)dt, \]

\[ dl=(cl-d\frac{l}{z})dt. \]

Da je prirastek zajcev odvisen od njihovega trenutnega števila, ne preseneti, daj je to značilno za naravno rast. Upad števila (negativni predznak!) pa je odvisen od števila srečanj zajcev in lisic, to število pa je premo sorazmerno tako s številom zajcev kot s številom lisic.  Umiranje lisic zaradi lakote pa je premo sorazmerno s številom lisic in obratno sorazmerno s številom zajcev. Pri tem sta a in c konstanti, ki nekaj povesta o plodnosti zajklje oziroma lisice, b je v zvezi z verjetnostjo, da ob srečanju lisica-zajec slednji izdahne, d pa, da lisica od lakote umre.

Imamo torej sistem dveh nelinearnih diferencialnih enačb 1. reda, zato  rešitev ni preprosta. A spreminjanje obeh populacij s časom se je dalo spremljati že na tej Mavrici, danes pa lahko to počnemo v preglednicah ali nalogo sprogramiramo v kakem programskem jeziku.  V programu najprej določimo časovni interval ter začetno število zajcev in lisic, nato pa računamo prirastke iz diferencialnih enačb.

Kaj pričakujemo? Najbolj verjeten izid je, da bo na otoku najprej  zmanjkalo zajcev, nato pa še lisic in otok bo opustel.  Ob skrbno izbranih konstantah in začetni populaciji pa se nam lahko zgodi tole:

Rdeče so zajci, modro pa lisice. Grafa nista v merilu, zajcev je  5000 krat več kot lisic. Opazimo, da se populaciji spreminjata ciklično, da je vrh populacije lisic zamaknjen glede zajce in da je manjšanje populacije pri lisicah hitrejše kot pri zajcih.

Program je pisan v Pythonu, konstante se vidijo v kodi:

from Tkinter import *
from math import sin,pi
root = Tk()
("symbol",8)
root.title("Zajci in lisice -V. Petruna, januar 2010")
can = Canvas(root, width = 1010, height = 1000, background = "white")
can.create_line(10,500,1000,500, width = 1, fill = "black")
can.create_line(10,500,10,10, width = 1, fill = "black")
z=100
l=10
a=6.
b=1
c=4.
d=3000
dt=0.001
for t in range(10000):
    z=z+(a*z-b*z*l)*dt
    l=l+(c*l-d*l/z)*dt
    can.create_line(10+t*dt*100,500-z/1000,11+t*dt*100,500-z/1000, width = 2, fill = "red")
    can.create_line(10+t*dt*100,500-l*5,11+t*dt*100,500-l*5, width = 2, fill = "blue")
can.pack(side = BOTTOM)
root.mainloop()

Naloga: Določi  konstante ali začetno število v obeh populacijah tako, da so nihanja v populaciji čim manjša.  Dosežeš lahko takle

ali še boljši graf. Vse to lahko storiš že s srednješolskim znanjem. (Namig: Če se količini ne spreminjata, kakšna je leva stran enačb?)

Več o tej tematiki lahko najdeš tu.

Osnove Javascripta (1)


Zgornji pozdrav smo dosegli z naslednjo kodo jezika Javascript :

<script type="text/javascript">
name=window.prompt('Kako ti je ime: ','');
document.write('Zdravo '+name+ ' !');
</script>

Prva in zadnja vrstica sta obvezni, saj brskalniku povesta, da se bo ukvarjal z Javascriptovo kodo. V drugi vrstici dobi spremenljiivka name vrednost, ki jo vnesemo s tipkovnico, tretja vrstica pa pozdrav izpiše.