关于复数的怪异行为

时间:2019-02-11 19:21:50

标签: python python-3.x complex-numbers

我目前正在用python编写Mandelbrot程序。在一个实现中,我使用了python的复数类型。另一方面,我将复数实现为两个单独的数字(我认为那里有一个错误)。我不明白为什么这两个程序会输出看起来不同的结果,因为它们都应该做相同的事情(除非我的代码中有一些愚蠢的错误)。有人可以告诉我为什么会这样(可能是我做错了),以及如何解决这个问题吗?

这是我的代码:

size = 40

for y in range(size):
    for x in range(size*2):
        c = complex(x / (size / 2) - 2, y / (size / 4) - 2)
        z = complex(0, 0)

        i = 0;
        while i < 100:
            z = z**2 + c
            if abs(z) > 2:
                break
            i+=1
        if i == 100:
            print("#", end="")
        elif i > 10:
            print(".", end="")
        else:
            print(" ", end="")
    print()

#########################

size = 40

for y in range(size):
    for x in range(size*2):
        cx = x / (size / 2) - 2
        cy = y / (size / 4) - 2
        zx = 0
        zy = 0

        i = 0
        while i < 100:
            zx = (zx * zx - zy * zy) + cx
            zy = (2 * zx * zy) + cy
            if zx * zx + zy * zy > 4:
                break
            i+=1
        if i == 100:
            print("#", end="")
        elif i > 10:
            print(".", end="")
        else:
            print(" ", end="")
    print()

上层实现打印此内容:

                                    .
                                        #
                                     ..
                                   .####.
                                   .####.      .
                            ..#..##########......
                           ...#################.
               .           .###################. .
                ......    .#####################.
                .#######..######################.
            ....#########.######################
##############################################.
            ....#########.######################
                .#######..######################.
                ......    .#####################.
               .           .###################. .
                           ...#################.
                            ..#..##########......
                                   .####.      .
                                   .####.
                                     ..
                                        #
                                    .

下面的打印此:

                                        # .    .
                                     ..#####.. .   ..
                                 ############# ... .
                  .            #################.
                 .  #.        #################### #
                 .#### .   .#######################
                 #######..###########################.
                ##################################.
              #######################################
             #####################################
##############################################.
             #####################################
              #######################################
                ##################################.
                 #######..###########################.
                 .#### .   .#######################
                 .  #.        #################### #
                  .            #################.
                                 ############# ... .
                                     ..#####.. .   ..

2 个答案:

答案 0 :(得分:2)

您对zx进行了变异,并在zy计算中使用了它。您需要将zx的新值临时存储在其他位置,以便正确计算zy。像这样:

temp = (zx * zx - zy * zy) + cx                                        
zy = (2 * zx * zy) + cy                                                
zx = temp 

或更优雅:

zx, zy = (zx * zx - zy * zy) + cx, (2 * zx * zy) + cy

答案 1 :(得分:-2)

这是一个猜测,但是您使用的是python 2吗?底部图的值似乎是一张非常近似的曼德布罗图,但看起来有些偏斜。我敢打赌,您使用的是python 2,除法运算符/仅执行整数除法。

在这种情况下,请使用python 3或将其添加到代码的开头:

from __future__ import division