2013-02-22 240 views
8

我是新來的Python和學習Python的「科學講義筆記Release 2013.1」教程。請在下面的srcreenshot中幫助我解決這個Mandelbrot問題(Pg 71)。如果可能的話,請提供步驟明確的命令和解釋,因爲編程概念對我來說是新的。用matplotlib繪製Mandelbrot/pyplot/numpy/python

http://dl.dropbox.com/u/50511173/mandelbrot.png

我試圖解決這個問題如下:

import numpy as np 
import matplotlib.pyplot as plt 

x,y=np.ogrid[-2:1:10j,-1.5:1.5:10j] 
c=x + 1j*y 
z=0 
for g in range(50): 
    z=z**2 + c 

plt.imshow(z.T, extent=[-2,1,-1.5,1.5]) 

我遇到了以下錯誤「類型錯誤:圖像數據無法轉換爲浮動」

這個錯誤是什麼恰恰意味着以及如何糾正它?我發現很難理解imshow()函數。 imshow()中的單個術語是什麼意思?

謝謝。

回答

5

Mandelbrot集不是你試圖繪製的z的值,它們給你的問題是因爲它們是複數。 Mandelbrot集合由重複關係z_n = z_n-1**2 + p保持有界的複平面的點p組成。通過將幾次迭代後的結果與某個閾值進行比較,以實際的方式檢查了這一點。在你的情況,如果你的for循環後添加以下行:

threshold = 2 
mask = np.abs(z) < threshold 

,然後繪製mask你應該看到屏幕上的情節設置。

要理解imshow的論點的一般工作,你會比在這裏詢問docs更好。

2

您會收到此錯誤,因爲plt.imshow不接受複數數組。你可以將數組的實部或虛部作爲Z.realZ.imag。因此,如果你想繪製的實際部分

plt.imshow(z.real.T, extent=[-2,1,-1.5,1.5]) 

會做這項工作。

'imshow'中的參數定義了以下內容。

如果z是一個N×M矩陣,它將被解釋爲規則網格上的點值。通過extent指定這個網格如何在空間中延伸...

5

感謝@Jan和@Jaime。我得到它的工作如下,需要太多的時間來計算,雖然:

import numpy as np 
import scipy as sp 
import matplotlib.pyplot as plt 


x,y=np.ogrid[-2:1:5000j,-1.5:1.5:5000j] 

print('') 
print('Grid set') 
print('') 

c=x + 1j*y 
z=0 

for g in range(500): 
     print('Iteration number: ',g) 
     z=z**2 + c 

threshold = 2 
mask=np.abs(z) < threshold 

print('') 
print('Plotting using imshow()') 
plt.imshow(mask.T,extent=[-2,1,-1.5,1.5]) 

print('') 
print('plotting done') 
print('') 

plt.gray() 

print('') 
print('Preparing to render') 
print('') 

plt.show() 

Image Result

2

你想要繪製與imshow這就是爲什麼你得到錯誤的復值,可以使用如其他人所建議的閾值,但您也可以考慮使用np.anglenp.abs。您還可以使用Python內置的reduce方法簡化z的計算。

有一些樂趣與這一個,但是這顯示了總體思路:

import numpy as np 
import matplotlib.pyplot as plt 

%matplotlib inline 

x, y = np.ogrid[-2:1:500j, -1.5:1.5:500j] 

# Increase this to improve the shape of the fractal 
iterations = 9 

c = x + 1j*y 

z = reduce(lambda x, y: x**2 + c, [1] * iterations, c) 

plt.figure(figsize=(10, 10)) 
plt.imshow(np.angle(z)); 

plt.figure(figsize=(10, 10)) 
plt.imshow(np.log(np.abs(z)));