ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)
生活随笔
收集整理的這篇文章主要介紹了
ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?????? 對生長自動機的研究由來已久,并在計算機科學等眾多學科中,使用元胞自動機的概念,用于生長模擬。而復雜花紋的生成,則可以通過重寫一定的生長規(guī)則,使用生成式來模擬自然紋理。當然,很多紋理是由人本身設計的,其形成過程本身就是在人腦中進行“原胞生成”的過程。
??????? 基礎理論抄自于基礎百科。
??????? 來自于百度百科:L-系統(tǒng)是匈牙利生物學家Aristid LinderMayer于1968年提出的。.L-系統(tǒng)的本質是一個重寫系統(tǒng),通過對植物對象生長過程的經驗式概括和抽象,初始狀態(tài)與描述規(guī)則,進行有限次迭代,生成字符發(fā)展序列以表現(xiàn)植物的拓撲結構,并對產生的字符串進行幾何解釋,就能生成非常復雜的分形圖形。
詳細介紹
一類動態(tài)細胞自動機,在每一(時間)步上,其中的各個細胞可以由給定狀態(tài)變?yōu)橐粋€新的狀態(tài),或消亡或分裂為具有某種狀態(tài)組合的細胞串。A.林頓梅伊爾曾用這種細胞自動機描述絲狀有機體的發(fā)育過程,所以叫作林頓梅伊爾系統(tǒng),簡稱L系統(tǒng)。 在喬姆斯基形式語言理論中,字母表被分成終結字母表和非終結字母表部分,“字”是由終結字母組成的字母序列。在L系統(tǒng)中,沒有單獨的終結字母表,所有生成的字都在系統(tǒng)語言中;初始字母可以被初始字所代替;被注視的字所包含的各個字母同時進行改寫。每個字母代表一個細胞,用字表示細胞陣列發(fā)展的階段。生成式對應于發(fā)展指令,這些指令的應用使有機體生長成已知類型。消亡的細胞可以用空字e表示。細胞之間可以有,也可以沒有交互作用(信息傳遞)。有交互作用的有1L系統(tǒng)和2L系統(tǒng)。沒有交互作用的叫作0L系統(tǒng)。 0L系統(tǒng)是一個三元組Γ=(G,g,δ),其中G為一個有限非空集合,叫作字母表;g為G中元素的非空序列,即非空字;δ為一個(轉移)函數(shù),首先取作從G到G*(G中元素所能構成的一切序列的集合)的有限非空子集的映射。然后,把δ擴充為從G*到G*的有限非空子集的映射。 如果空字e不能替換任何字母,即對 G中所有字母ɑ,都有e唘δ(ɑ),就稱Γ為增殖0L系統(tǒng),簡稱P0L系統(tǒng);如果對字母表內每一個字母有且只有一個轉移規(guī)則,即對G中所有ɑ,在G*中只有一個字p使δ(ɑ)={p},就稱Γ為確定的0L系統(tǒng),簡稱 D0L系統(tǒng)。顯然(P0L∪D0L)吇0L。而既增殖又確定的DL系統(tǒng)稱為DP0L。分別描述
從另一角度,元胞自動機可視為動力系統(tǒng),因而可將初始點、軌道、不動點、周期軌和終極軌等一系列概念用到元胞自動機的研究中,上述分類,又可以分別描述為(譚躍進,1996;謝惠民,1994;李才偉、1997); ⑴均勻狀態(tài),即點態(tài)吸引子,或稱不動點; ⑵簡單的周期結構,即周期性吸引子,或稱周期軌; ⑶混沌的非周期性模式,即混沌吸引子; ⑷這第四類行為可以與生命系統(tǒng)等復雜系統(tǒng)中的自組織現(xiàn)象相比擬,但在連續(xù)系統(tǒng)中沒有相對應的模式。但從研究元胞自動機的角度講,最具研究價值的具有第四類行為的元胞自動機,因為這類元胞自動機被認為具有"突現(xiàn)計算"(Emergent Computation)功能,研究表明,可以用作廣義計算機(Universal Computer)以仿真任意復雜的計算過程。另外,此類元胞自動機在發(fā)展過程中還表現(xiàn)出很強的不可逆(lrreversibility)特征,而且,這種元胞自動機在若干有限循環(huán)后,有可能會 "死"掉,即所有元胞的狀態(tài)變?yōu)榱恪?Python代碼:
提前升級matplotlib:
?????? 為避免環(huán)境問題,切換至python3
或不擔心環(huán)境問題,或者在python2中
pip install --upgrade matplotlib 謹慎操作,容易出現(xiàn)問題否則有可能找不到mpl_toolkits組件
L系統(tǒng)
def mainex():#drawsemilogx();#drawLorenzAttractor();#drawLeaf();#未成功#drawLSystem();#drawIsoLine();#drawFourFlower();#drawFlowers();drawBranch();#drawStar();#drawPillar(); #為了畫吸引子 def get_lines(rule):d = rule['direct']a = rule['angle']p = (0.0, 0.0)l = 1.0lines = []stack = []info = rule['S']for i in range(rule['iter']):ninfo = []for c in info:if c in rule:ninfo.append(rule[c])else:ninfo.append(c)info = "".join(ninfo)for c in info:if c in "Ff":r = d * pi / 180t = p[0] + l*cos(r), p[1] + l*sin(r)lines.append(((p[0], p[1]), (t[0], t[1])))p = telif c == "+":d += aelif c == "-":d -= aelif c == "[":stack.append((p,d))elif c == "]":p, d = stack[-1]del stack[-1]return linesdef draw(ax, rule, iter=None):if iter!=None:rule["iter"] = iterlines = get_lines( rule )linecollections = collections.LineCollection(lines)ax.add_collection(linecollections, autolim=True)ax.axis("equal")ax.set_axis_off()ax.set_xlim(ax.dataLim.xmin, ax.dataLim.xmax)ax.invert_yaxis()def drawBranch():fig = plt.figure(figsize=(8,6))fig.patch.set_facecolor("w")ax = fig.add_subplot(111);ruleBranch={"X":"F-[[X]+X]+F[+FX]-X", "F":"FF", "S":"X","direct":-45,"angle":25,"iter":4,"title":"Plant"}draw(ax, ruleBranch);fig.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)plt.show();
洛倫茲吸引子: def drawLorenzAttractor():xs, ys, zs = [], [], [];def mkPoints(): a, b, c = 10.0, 28.0, 8.0 / 3.0 h = 0.01 x0, y0, z0 = 0.1, 0, 0 for i in xrange(10000): x1 = x0 + h * a * (y0 - x0) y1 = y0 + h * (x0 * (b - z0) - y0) z1 = z0 + h * (x0 * y0 - c * z0) x0, y0, z0 = x1, y1, z1 xs.append(x0) ys.append(y0) zs.append(z0);mpl.rcParams["legend.fontsize"] = 10;fig = plt.figure() ax = Axes3D(fig) mkPoints();ax.plot(xs, ys, zs, label = "Lorenz's strange attractor") ax.legend() plt.show()
顯示結果:
?
總結
以上是生活随笔為你收集整理的ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络和视频监控组网方式与选择-计算
- 下一篇: CNN结构:StyleAI-图片风格分类