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:
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.
What a great blog