【问题标题】:multithreaded mandelbrot set多线程曼德布罗集
【发布时间】:2017-12-03 11:02:28
【问题描述】:

是否可以将 mandelbrot 集的公式(默认为 f(z) = z^2 + c)更改为不同的公式( f(z) = z^2 + c * e^(- z) 是我需要的) 使用转义时间算法时,如果可能的话如何? 我目前正在通过 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")

【问题讨论】:

  • 这绝对是可能的,尽管公式变得更加复杂。 (x0 = x * x - y * y + exp(-x) * (a * cos(y) + b * sin(y))y = 2.0 * x * y + exp(-x) * (b * cos(y) - a * sin(y)) 从我的脑海中,我无法回答转义启发式 (|z|² > 4) 在这里是否仍然有效,但也许可以找到类似的。
  • 如果你想知道dropbox.com/s/qtbh7bobrt9nhql/fractal.PNG?dl=0,这就是我使用你的公式得到的分形

标签: python algorithm math mandelbrot


【解决方案1】:

从代码中我推断出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(平均而言,现在可能需要更多或更少的迭代才能逃脱)但这应该是您的数学表达式重来。

正如 cmets 中所指出的,您可能需要调整标准本身,而不仅仅是最大迭代次数,以获得所需的差异化水平:更改最大迭代次数对那些永远不会逃脱的人没有帮助。

你可以尝试推导出一个好的逃生条件,或者只是尝试一些东西,看看你会得到什么。

【讨论】:

  • 需要注意转义标准,因为c * exp(-z) 可能比c 小得多(或大得多),因为它取决于复数@ 的绝对值和参数987654330@。我目前正在尝试确定是否可以将标准证明调整为这个新公式,但我不太确定。
  • e^i(-y) = cos(y) - i*sin(y),正弦是奇函数。另请参阅问题下 Tobias 的评论。
猜你喜欢
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多