python分形几何_使用 Python 绘制分形: Koch 曲线、Julia 集、Mandelbrot 集
目錄
1. Koch曲線
瑞典數學家Helge von Koch,在1904年發表的“從初等幾何構造的一條沒有切線的連續曲線”的論文中提出Korch曲線。它的描述如下:指定一條線段的長度\(l\)(可以理解為第0次迭代)
將這條線段三等分,并以中間的線段為底邊構造一個等邊三角形,然后去掉底邊
對2中生成的曲線的每一條邊重復2的操作(每操作一次稱為一次迭代)
最終得到的集合圖形長度為:$$L=l*(\frac{4}{3})^{N}$$,其中的N指的是迭代次數。
1.2 繪制方法:如果N=0,直接畫出L長的直線即可
如果N=1(第一次迭代),畫出長度為L/3的線段;畫筆向左轉60度再畫長度為L/3長的線段;畫筆向右轉120度畫長度為L/3長的線段;畫筆再向左轉60度畫出長度為L/3的線段
如果n>1,第n次迭代相當于:n-1次迭代;畫筆左轉60度;n-1次迭代;畫筆右轉120度;n-1次迭代;畫筆左轉60度;n-1次迭代。
1.3 Python代碼實現# -*- coding: utf-8 -*-
import turtle
Division = 3.0
DirectionAangle = [('left',60),('right',120),('left',60)]
def call(name):
if name == 'left':
return turtle.left
else:
return turtle.right
def koch(n, length):
if n==0:
turtle.forward(length)
else:
for DA in DirectionAangle:
koch(n-1,length/Division)
call(DA[0])(DA[1])
koch(n-1,length/Division)
koch(n=2, length=100)
turtle.done()
1.4 繪制的圖形
下面分別是n=3, length=300和n=4, length=400生成的Koch曲線
2. Julia集
2.1 繪制方法
在上一篇博文中提到過,點擊前往設定初值 p,q, 最大的迭代次數 N, 圖形的大小 a,b, 及使用的顏色數 K.這里需要注意的是c的模總是小于2。可以證明當c的模大于2時,進行迭代必將發散到無窮。
設定區域的界值 \( M\ge max(2,\sqrt{p^2+q^2}) \)
將區域\(R=[-M,M]\times[-M,M]\)分成\(a\times b\)的網格,分別以每個網格點為初值(\(x_0,y_0\))。利用上面替換之后的公式做迭代。如果對\(n \le N\)所有的都有\({x_n}^2+{y_n}^2\le M^2 \),則將象素\((i, j)\)置為這一種顏色。如果從某一步 n 開始\({x_n}^2+{y_n}^2\ge M^2 \),則將象素 \((i, j)\)置為不同顏色。
2.2 Python代碼實現# -*- coding: utf-8 -*-
import matplotlib.pyplot as plot
import numpy as np
p=0.45 #初始值c的實部
q=-0.1428 #初始值c的虛部
N=800 #最大迭代次數
M=100 #迭代區域的界值
a=3.0 #繪制圖的橫軸大小
b=3.0 #繪制圖的縱軸大小
step=0.005 #繪制點的步長
def iterate(z,N,M):
z=z*z+c
for i in xrange(N):
if abs(z)>M:
return i
z=z*z+c
return N
c=p+q*1j
i=np.arange(-a/2.0,a/2.0,step)
j=np.arange(b/2.0,-b/2.0,-step)
I,J=np.meshgrid(i, j)
ufunc=np.frompyfunc(iterate,3,1)
Z=ufunc(I+1j*J,N,M).astype(np.float)
plot.imshow(Z,extent=(-a/2.0,a/2.0,-b/2,b/2.0))
cb = plot.colorbar(orientation='vertical',shrink=1)
cb.set_label('iteration counts')
plot.show()
2.3 繪制的圖形
參數:p=0.285 q=0.01 N=200 M=100 a=2.0 b=2.0 step=0.005 (左圖)
參數:p=0.45 q=-0.1428 N=200 M=100 a=2.0 b=2.0 step=0.005 (右圖)
還有其他的初始c值可以繪制出十分漂亮的圖案,例如:
c = -0.70176+-0.3842j c = -0.835+-0.2321j c = -0.8+0.156j c = 0.285
3. Mandelbrot集
數學定義: $$f_c(z) = z^2+c$$
Mandelbrot集是\(f_c(z)\)在z=0,關于復數c=x+yi的函數迭代不發散序列集合。
繪制Mandelbrot集最簡單的方法是使用逃逸時間進行繪制。逃逸時間指的是,在指定范圍M進行有限次數N迭代,而不超出M區域的次數。使用不同的顏色繪制不同的迭代次數。設置迭代的最多次數,N
設置初始化\(z_0\)的值,
設置逃逸半徑R的值,通常為2
3.1 繪制方法
3.2 Python實現# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plot
x0=0 #初始值z0的x0
y0=0 #初始值z0的y0
zoom=1.0 #放大倍率
N=100 #最大迭代次數
R=2 #迭代半徑
a=4.0 #繪制圖的橫軸大小
b=3.0 #繪制圖的縱軸大小
step=0.005 #繪制點的步長
def iterate(c,N,R):
z=c
for i in xrange(N):
if abs(z)>R:
return i
z = z*z+c
return N
x=np.arange(-a/(2.0*zoom)+x0,a/(2.0*zoom)+x0,step)
y=np.arange(b/(2.0*zoom)+y0,-b/(2.0*zoom)+y0,-step)
cx,cy=np.meshgrid(x, y)
c = cx + cy*1j
ufunc=np.frompyfunc(iterate,3,1)
Z=ufunc(c,N,R).astype(np.float)
plot.imshow(Z,extent=(-a/2.0,a/2.0,-b/2,b/2.0))
cb = plot.colorbar(orientation='vertical',shrink=1)
cb.set_label('iteration counts')
plot.show()
3.3 繪制的圖形
圖中是使用參數:x0=0 y0=0 zoom=1.0 N=100 R=2 a=4.0 b=3.0 step=0.005。生成的圖像。不同的是,它們依次使用的是二次、三次冪的迭代。
最后,還可以使用ImageMagick工具,將生成的圖像制作成一個動態GIF。convert *.png out.gif
總結
以上是生活随笔為你收集整理的python分形几何_使用 Python 绘制分形: Koch 曲线、Julia 集、Mandelbrot 集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb @aggregation
- 下一篇: python2和3的编码区别_Pytho