Juliamengder


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......
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.)
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