2017-06-29 6 views
2

マンデルブロセット(f(z)= z^2 + cのデフォルト)を別のもの(f(z)= z^2 + c * eに変更することは可能ですか? ^( - z)は私が必要としているものです)エスケープ時間アルゴリズムを使用し、可能であればどのように使用するのですか?私は現在、私はz = x + y * ic = a + b * iと推論コードからFB36マルチスレッドマンデルブロセット

# 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

数式はもっと複雑になりますが、間違いなく可能です。 y = 2.0 * x * y + exp(-x)となるように設定してください(x0 = x * y * y + exp(-x)*(a * cos(y)+ b * sin 私の頭の上から、エスケープヒューリスティック(| z |²> 4)がここでも動作するかどうかはわかりませんが、同じようなものを見つけることが可能です –

+0

これは私があなたの数式を使って得たフラクタルです https://www.dropbox.com/s/qtbh7bobrt9nhql/fractal.PNG?dl=0 – Leizer

答えて

0

で、このコードを使用してい 。これは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

注意する必要があります複素数 'z'の絶対値と引数に依存するので、' c * exp(-z) 'は' c'よりもはるかに小さい(または大きい)かもしれないので、エスケープの基準を使って、標準証明をこの新しい公式に合わせることができたらうまくいきますが、私はあまりよく分かりません。 –

+0

'e^i(-y)= cos(y) - i * sin(y)'奇妙な関数です。質問の下でTobiasのコメントも見てください。 – LutzL