2017-06-29 38 views
2

是否有可能改變Mandelbrot集的式(其爲f(z)的= Z^2 + c。通過默認)爲不同的一種(F(Z)= Z^2 + C * E ^( - z)是我需要)時使用逃生時間算法,如果可能的話怎麼樣? 我目前使用此代碼由FB36多線程Mandelbrot集

# Multi-threaded Mandelbrot Fractal (Do not run using IDLE!) 
# FB - 201104306 
import threading 
from PIL import Image 
w = 512 # image width 
h = 512 # image height 
image = Image.new("RGB", (w, h)) 
wh = w * h 
maxIt = 256 # max number of iterations allowed 
# drawing region (xa < xb & ya < yb) 
xa = -2.0 
xb = 1.0 
ya = -1.5 
yb = 1.5 
xd = xb - xa 
yd = yb - ya 
numThr = 5 # number of threads to run 
# lock = threading.Lock() 

class ManFrThread(threading.Thread): 
    def __init__ (self, k): 
      self.k = k 
      threading.Thread.__init__(self) 
    def run(self): 
     # each thread only calculates its own share of pixels 
     for i in range(k, wh, numThr): 
      kx = i % w 
      ky = int(i/w) 
      a = xa + xd * kx/(w - 1.0) 
      b = ya + yd * ky/(h - 1.0) 
      x = a 
      y = b 
      for kc in range(maxIt): 
       x0 = x * x - y * y + a 
       y = 2.0 * x * y + b 
       x = x0     
       if x * x + y * y > 4: 
        # various color palettes can be created here 
        red = (kc % 8) * 32 
        green = (16 - kc % 16) * 16 
        blue = (kc % 16) * 16 
        # lock.acquire() 
        global image 
        image.putpixel((kx, ky), (red, green, blue)) 
        # lock.release() 
        break 

if __name__ == "__main__": 
    tArr = [] 
    for k in range(numThr): # create all threads 
     tArr.append(ManFrThread(k)) 
    for k in range(numThr): # start all threads 
     tArr[k].start() 
    for k in range(numThr): # wait until all threads finished 
     tArr[k].join() 
    image.save("MandelbrotFractal.png", "PNG") 
+1

這絕對是可能的,但公式會變得更加複雜。 (x'= x * x-y * y + exp(-x)*(a * cos(y)+ b * sin(y))'和'y = 2.0 * x * y + exp(-x) *(b *的COS(Y) - A *罪(Y))' 從我的頭頂,我不能回答是否逃逸啓發式(| Z | 2> 4)在這裏仍然有效,但它可能是可以找到類似的一個。 –

+0

所以這是我用你的公式,如果你想知道 https://www.dropbox.com/s/qtbh7bobrt9nhql/fractal.PNG?dl=0 – Leizer

回答

0

從代碼,我推斷z = x + y * ic = a + b * i。這對應f(z) - z ^2 + c。你想要f(z) = z ^2 + c * e^(-z)

回想一下,e^(-z) = e^-(x + yi) = e^(-x) * e^i(-y) = e^(-x)(cos(y) - i*sin(y)) = e^(-x)cos(y) - i (e^(-x)sin(y))。因此,你應該更新你的線條是以下情況:

x0 = x * x - y * y + a * exp(-x) * cos(y) + b * exp(-x) * sin(y); 
y = 2.0 * x * y + a * exp(-x) * sin(y) - b * exp(-x) * cos(y) 
x = x0 

您可能需要調整maxIt如果你沒有得到的功能分化的你後(可能需要更多或更少的迭代現在逃水平,平均而言),但這應該是你所追求的數學表達。

正如評論指出的那樣,你可能需要調整標準本身,而不僅僅是最大的迭代,以獲得差異化的理想水平:改變最大不幫助那些無法逃離。

你可以嘗試獲得了良好的條件逃生,或只是嘗試一些東西,看看你會得到什麼。

+1

人們需要小心的分形因爲'c * exp(-z)'可能比'c'小得多(或大於),因爲它取決於複數「z」的絕對值和參數。試圖找出一個標準證明是否可以根據這個新公式進行調整,但我不太確定。 –

+0

'e^i(-y)= cos(y) - i * sin(y)',正弦是一個奇怪的功能。另請參閱Tobias在該問題下的評論。 – LutzL