python分形曲线代码_ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)...

对生长自动机的研究由来已久,并在计算机科学等众多学科中,使用元胞自动机的概念,用于生长模拟。而复杂花纹的生成,则可以通过重写一定的生长规则,使用生成式来模拟自然纹理。当然,很多纹理是由人本身设计的,其形成过程本身就是在人脑中进行“原胞生成”的过程。

基础理论抄自于基础百科。

来自于百度百科:L-系统是匈牙利生物学家Aristid LinderMayer于1968年提出的。.L-系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形。

详细介绍

一类动态细胞自动机,在每一(时间)步上,其中的各个细胞可以由给定状态变为一个新的状态,或消亡或分裂为具有某种状态组合的细胞串。A.林顿梅伊尔曾用这种细胞自动机描述丝状有机体的发育过程,所以叫作林顿梅伊尔系统,简称L系统。

在乔姆斯基形式语言理论中,字母表被分成终结字母表和非终结字母表部分,“字”是由终结字母组成的字母序列。在L系统中,没有单独的终结字母表,所有生成的字都在系统语言中;初始字母可以被初始字所代替;被注视的字所包含的各个字母同时进行改写。每个字母代表一个细胞,用字表示细胞阵列发展的阶段。生成式对应于发展指令,这些指令的应用使有机体生长成已知类型。消亡的细胞可以用空字e表示。细胞之间可以有,也可以没有交互作用(信息传递)。有交互作用的有1L系统和2L系统。没有交互作用的叫作0L系统。

0L系统是一个三元组Γ=(G,g,δ),其中G为一个有限非空集合,叫作字母表;g为G中元素的非空序列,即非空字;δ为一个(转移)函数,首先取作从G到G*(G中元素所能构成的一切序列的集合)的有限非空子集的映射。然后,把δ扩充为从G*到G*的有限非空子集的映射。

如果空字e不能替换任何字母,即对 G中所有字母ɑ,都有e唘δ(ɑ),就称Γ为增殖0L系统,简称P0L系统;如果对字母表内每一个字母有且只有一个转移规则,即对G中所有ɑ,在G*中只有一个字p使δ(ɑ)={p},就称Γ为确定的0L系统,简称 D0L系统。显然(P0L∪D0L)吇0L。而既增殖又确定的DL系统称为DP0L。

分别描述

从另一角度,元胞自动机可视为动力系统,因而可将初始点、轨道、不动点、周期轨和终极轨等一系列概念用到元胞自动机的研究中,上述分类,又可以分别描述为(谭跃进,1996;谢惠民,1994;李才伟、1997);

⑴均匀状态,即点态吸引子,或称不动点;

⑵简单的周期结构,即周期性吸引子,或称周期轨;

⑶混沌的非周期性模式,即混沌吸引子;

⑷这第四类行为可以与生命系统等复杂系统中的自组织现象相比拟,但在连续系统中没有相对应的模式。但从研究元胞自动机的角度讲,最具研究价值的具有第四类行为的元胞自动机,因为这类元胞自动机被认为具有"突现计算"(Emergent

Computation)功能,研究表明,可以用作广义计算机(Universal Computer)以仿真任意复杂的计算过程。另外,此类元胞自动机在发展过程中还表现出很强的不可逆(lrreversibility)特征,而且,这种元胞自动机在若干有限循环后,有可能会 "死"掉,即所有元胞的状态变为零。

Python代码:

L系统

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.0

lines = []

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 / 180

t = p[0] + l*cos(r), p[1] + l*sin(r)

lines.append(((p[0], p[1]), (t[0], t[1])))

p = t

elif c == "+":

d += a

elif c == "-":

d -= a

elif c == "[":

stack.append((p,d))

elif c == "]":

p, d = stack[-1]

del stack[-1]

return lines

def draw(ax, rule, iter=None):

if iter!=None:

rule["iter"] = iter

lines = 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()

显示结果:

 

你可能感兴趣的:(python分形曲线代码)