julia_gjenta.blogspot.com.py
Egil Brevik, egilbr@online.no, 18.02.2018
#00
Juliaplanene er mest interessant i
området fra -2.0 til 2.0 i x- og y-retning.
Variabler
for valg av nytt sentrum (p,q) i planet , f eks. (p,q) = (-0.75, 0.0)
Radius fra nytt sentrum : r. Radius =
1.5 kan passe.:
Koordinatene som er interessante for
oss, ligger for nære origo for å vises direkte på
skjermen. Alle koordinater må derfor
multipliseres med samme faktor, f eks. zoom = 100.
Programmet nedenfor bruker kanskje ett
minutt på å tegne et bilde dersom hver pixel skal brukes.
Ved å bruke annenhver pixel, tetthet =
2, reduseres tiden betraktelig. Ulempen blir at bildet blir blast og
fargeløst. Dette kan igjen rettes opp ved å øke punktstørrelsen
fra punktstorrelse= 2 til 3 eller 4.
En nøkkelfunksjon i programmet er ei
sløyfe som kan gjentas opptil en forhåndsvalgt verdi, f eks. Maxitr
= 51.
Det aktuelle Juliaplanet gis i
utgangspunktet global variabel: (a,b) = (0.285 , 0.01)
#01
Først defineres de fire
hjørnekoordinatene for den valgte juliamatrisen.
Så kommer noen utskrifter.
Deretter: En for-løkke for å behandle
hver linje i pixelmatrisen.( fra -q_nord * zoom til -q_syd*zoom)
Før behandling av hver linje initieres
en punkt-teller, i, til den østligste pixelen.
En verdi ,itr, som har med
fargeleggingen av et valgt punkt å gjøre, initialiseres tilfeldig
til null
Ved hjelp av: i = i + tetthet , vil
whileløkka behandle hvert valgte pixel på linja.
Tilordningen: «itr =
tell_antall(i/zoom,j/zoom, maxitr)»:
Sentral «funksjonsmaskin» i def
tell_antall(a, b, maxitr):
Funksjonsmaskinen ovenfor
har seks lagerplasser som heter a , b, x, y , x_ny og y_ny.
Maskinen er bygd for å kunne bruke kun to faste funksjonsforskrifter når den skal regne med tallene: x_ny = x*x - y*y + a og y_ny = 2*x*y + b.
I en åpning putter vi først inn tallpar for det valgte juliaplanet, (a,b) = (0.285 , 0.01), som vi kaller parameter.
I neste åpning putter vi såkornet (x,y).
Deretter setter vi maskinen i arbeid:
Først beregner den verdien av x*x - y*y + a og putter svaret i lagerplass x_ny
Så beregner den 2*x*y + b og putter svaret i lagerplass y_ny.
(Som elev ville du her skrevet ned de to svarene og satt to streker under, men da ville vi ikke fått de fraktalene som Gaston Julia forberedte for oss. Nei, maskinen er laget for å kunne bruke svaret på en smart måte:)
Maskinen tar de to svarene og putter de inn igjen i lagerplassene x og y.
Så regner den en gang til. (Utdata blir til inndata.), Så regner den en gang til. (Utdata blir til inndata.)....osv......
Maskinen er bygd for å kunne bruke kun to faste funksjonsforskrifter når den skal regne med tallene: x_ny = x*x - y*y + a og y_ny = 2*x*y + b.
I en åpning putter vi først inn tallpar for det valgte juliaplanet, (a,b) = (0.285 , 0.01), som vi kaller parameter.
I neste åpning putter vi såkornet (x,y).
Deretter setter vi maskinen i arbeid:
Først beregner den verdien av x*x - y*y + a og putter svaret i lagerplass x_ny
Så beregner den 2*x*y + b og putter svaret i lagerplass y_ny.
(Som elev ville du her skrevet ned de to svarene og satt to streker under, men da ville vi ikke fått de fraktalene som Gaston Julia forberedte for oss. Nei, maskinen er laget for å kunne bruke svaret på en smart måte:)
Maskinen tar de to svarene og putter de inn igjen i lagerplassene x og y.
Så regner den en gang til. (Utdata blir til inndata.), Så regner den en gang til. (Utdata blir til inndata.)....osv......
Hvis x*x+y*y blir større enn 4,
stoppes gjentagelsen. Ellers gjentas beregningen helt til i får
verdien maxitr-1.
Antall gjentagelser, i, returneres fra
funksjonen: def tell_antall(a, b, maxitr).
def behandle(i,j,itr, maxitr):
Her skrives ut de punktene som svarer til at gjentagelsen går helt fram til "maxitr" uten å bli stoppet. (Mulig konvergens.)
Her skrives ut de punktene som svarer til at gjentagelsen går helt fram til "maxitr" uten å bli stoppet. (Mulig konvergens.)
Ved å bruke (i-int(p*zoom)
, j+int(q*zoom)), i stedet for bare (i , j), får vi alltid bildet
til sentrum av python-vinduet .
from turtle import*
import time
colormode(255)
#02
def tell_antall(x, y, maxitr):#Forskjellig fra Mandelbrotprogrammet
global a , b
for i in range(maxitr):
x_ny = x*x - y*y + a
y_ny = 2*x*y + b
x = x_ny
y = y_ny
if x*x + y*y >4:
break
return(i)
#02
def behandle(i,j,itr, maxitr):#Kan brukes i begge programmene
if itr ==maxitr-1:
setpos(i-int(p*zoom) , j+int(q*zoom))
dot(punktstorrelse)
#01
#def matrise_rundt_punktet():#likt i Mandelbrot og Julia
def matrise_rundt_punktet(p, q, radius, zoom, tetthet,punktstorrelse,maxitr):
p_vest = p - radius
p_ost = p +radius
q_nord = q +radius
q_syd = q-radius
print("vest, midt, øst:")
print(p_vest,p,p_ost)
print("nord:",q_nord,"midt:",q,"syd:",q_syd)
for j in range(-int(q_nord * zoom), -int(q_syd * zoom)+1 , tetthet):
i = int(p_vest *zoom)
itr = 0
while i < int(p_ost *zoom):
behandle(i,j,itr, maxitr)#02
i = i + tetthet
itr = tell_antall(i/zoom,j/zoom, maxitr)#02
#00
t1=time.time()
tracer(0,0)
p=0
q=0
radius=1.4
zoom=100
screensize (zoom*1 , zoom*1)
tetthet = 1
punktstorrelse = 2
pu()
maxitr=51
bgcolor("light yellow")
#a , b = -0.50 , 0.56
a , b = 0.285 , 0.01
matrise_rundt_punktet(p, q, radius, zoom, tetthet,punktstorrelse,maxitr)
write((". JULIA-PLAN",(a,b)))
update()
print("Tid",time.time()-t1,(a,b))
Kommentarer
Legg inn en kommentar