2013-02-22 14 views
8

私はPythonには新しく、Python "Scientific lecture notes Release 2013.1 Release"のチュートリアルに続いて学習します。以下のsrc screenshot(Pg 71)でこのMandelbrotの問題を解決してください。可能であれば、プログラミングのコンセプトは私にとって新しいものなので、ステップごとの説明を説明に付けてください。matplotlib/pyplot/numpy/pythonでPlot Mandelbrot

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]) 

私は次のようなエラー「はTypeError:画像データはfloat型に変換できません」遭遇したこのエラーは、正確に何を意味するの

をそれを修正する方法は?私はimshow()関数を理解するのが難しいと思っています。 imshow()内の個々の用語は何を意味しますか?

ありがとうございます。

答えて

5

マンデルブロ集合は、複素数であるために問題を引き起こしているプロットしようとしているzの値ではありません。マンデルブロ集合は、反復関係z_n = z_n-1**2 + pが有界のままである複素平面の点pから構成される。これは、数回の反復後の結果をある閾値と比較することによって実際的な方法でチェックされる。あなたはforループの後に以下の行を追加した場合、あなたのケースでは、:

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

をして、プロットmaskあなたは、画面上で設定されたプロットが表示されるはずです。

imshowの議論の一般的な仕組みを理解するには、docsを読む方が良いでしょう。

2

plt.imshowは複素数の配列を受け入れないため、このエラーが発生します。配列Zの実数部または虚数部は、Z.realまたはZ.imagと指定できます。したがって、実際の部分をプロットする場合は、

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

となります。

'imshow'の引数は、次のものを定義します。

zがN行M列の行列の場合、通常のグリッド上のポイント値として解釈されます。 extentによって、このグリッドがどのように空間内に広がるかを指定します。

5

@Janと@Jaimeのおかげです。あなたはそのエラーを取得している理由ですimshowを持つ複雑な値をプロットしようとしている

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

、使用することができます。私は、それは次のように働いて、しかし計算に時間がかかりすぎました他にもあるような閾値がありますが、np.angleまたはnp.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))); 
関連する問題