2013-02-22 31 views
8

Python'dan "Bilimsel ders notları Sürüm 2013.1" adlı eğiticiyi takip ederek python'da yeni ve öğreniyorum. Lütfen bu Mandelbrot problemini aşağıdaki srcreenshot'larda çözmeme yardım edin (Pg 71). Mümkünse, programlama kavramları benim için yeni olduğu için lütfen adım adım açıklamalar verin. Arsa Mandelbrot, matplotlib/pyplot/numpy/python ile

Bu hata ne demek oluyor: "Görüntü verileri yüzer dönüştürmek olamaz TypeError"

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

aşağıdaki hatayla karşılaştı: aşağıdaki gibi

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

Bunu çözmeye çalıştı ve nasıl düzeltilir? Imshow() işlevini anlamakta zorlanıyorum. Imshow() içindeki bireysel terimler ne anlama geliyor?

Teşekkür ederiz.

cevap

5

Mandelbrot seti, karmaşık sayılar olduklarından sorun çıkarmaya çalıştığınız, çizim yapmaya çalıştığınız z değerleri değildir. Mandelbrot seti, z_n = z_n-1**2 + p nüksetme ilişkisinin sınırlı kaldığı kompleks düzlemin p noktalarından oluşur. Bu, birkaç iterasyondan sonra sonucun bir eşikle karşılaştırılmasıyla pratik olarak kontrol edilir. Eğer for döngü sonra aşağıdaki satırları eklerseniz durumda,:

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

ve sonra çizmek mask ekranda ayarlanan arsa görmelisiniz.

imshow 'ün argümanlarının genel çalışmalarını anlamak için docs numaralı telefonu okumanız gerekenden daha iyi olursunuz.

2

plt.imshow karmaşık sayı dizilerini kabul etmediği için bu hatayı alıyorsunuz. Z dizisinin gerçek veya hayali bölümünü Z.real veya Z.imag olarak adresleyebilirsiniz. Bu nedenle, gerçek parça

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

işini yapmak istersiniz.

'imshow'daki argümanlar aşağıdakileri tanımlar.

z bir N-by-M matrisiyse, normal bir kılavuzda nokta değerleri olarak yorumlanır. extent tarafından, bu kılavuzun uzayda nasıl uzandığını belirtirsiniz ...

5

@Jan ve @Jaime'ye teşekkürler. Eğer bu hata alıyorsanız neden imshow karmaşık bir değere çizmek için çalışıyoruz

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

kullanabilirsiniz: Ben şöyle çalışıyor olsa hesaplamak için çok fazla zaman alır var Diğerlerinin önerdiği gibi bir eşik, ancak np.angle veya np.abs'u kullanmayı da düşünebilirsiniz. Ayrıca Python'un yerleşik reduce yöntemini kullanarak hesaplamanızı basitleştirebilirsiniz.

bu biriyle olan bir eğlence vardı, ama bu genel bir fikir gösterir:

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