关于复数的奇怪行为
Weird behaviour regarding 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()
上层实现打印如下:
.
#
..
.####.
.####. .
..#..##########......
...#################.
. .###################. .
...... .#####################.
.#######..######################.
....#########.######################
##############################################.
....#########.######################
.#######..######################.
...... .#####################.
. .###################. .
...#################.
..#..##########......
.####. .
.####.
..
#
.
下面的打印如下:
# . .
..#####.. . ..
############# ... .
. #################.
. #. #################### #
.#### . .#######################
#######..###########################.
##################################.
#######################################
#####################################
##############################################.
#####################################
#######################################
##################################.
#######..###########################.
.#### . .#######################
. #. #################### #
. #################.
############# ... .
..#####.. . ..
这是一个猜测,但是您使用的是 python 2 吗?底部图中的值似乎在制作一个非常近似的曼德尔布罗图,但看起来有点歪斜。我敢打赌您使用的是 python 2,其中除法运算符 /
仅进行整数除法。
如果是这种情况,请使用 python 3 或将其添加到代码的开头:
from __future__ import division
你改变了 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
我目前正在 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()
上层实现打印如下:
.
#
..
.####.
.####. .
..#..##########......
...#################.
. .###################. .
...... .#####################.
.#######..######################.
....#########.######################
##############################################.
....#########.######################
.#######..######################.
...... .#####################.
. .###################. .
...#################.
..#..##########......
.####. .
.####.
..
#
.
下面的打印如下:
# . .
..#####.. . ..
############# ... .
. #################.
. #. #################### #
.#### . .#######################
#######..###########################.
##################################.
#######################################
#####################################
##############################################.
#####################################
#######################################
##################################.
#######..###########################.
.#### . .#######################
. #. #################### #
. #################.
############# ... .
..#####.. . ..
这是一个猜测,但是您使用的是 python 2 吗?底部图中的值似乎在制作一个非常近似的曼德尔布罗图,但看起来有点歪斜。我敢打赌您使用的是 python 2,其中除法运算符 /
仅进行整数除法。
如果是这种情况,请使用 python 3 或将其添加到代码的开头:
from __future__ import division
你改变了 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