|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
再发一个分形的代码,这是《用python做数值计算》上的例子,是迭代法计算描绘分形图形的。先看一下效果。
这是spyder上界面,并且窗口都是浮动的,可以任意调节,这个界面是用PyQt写的,pythonxy上有完整的设计。关于pyqt界面设计,也有很多介绍。但是我个人觉得如果是自己做一些简单的使用用tkinter就比较不错。先不说那么多,看看代码吧。
- # -*- coding: utf-8 -*-
- import numpy as np
- import matplotlib.pyplot as pl
- import time
- # 蕨类植物叶子的迭代函数和其概率值
- eq1 = np.array([[0,0,0],[0,0.16,0]])
- p1 = 0.01
- eq2 = np.array([[0.2,-0.26,0],[0.23,0.22,1.6]])
- p2 = 0.07
- eq3 = np.array([[-0.15, 0.28, 0],[0.26,0.24,0.44]])
- p3 = 0.07
- eq4 = np.array([[0.85, 0.04, 0],[-0.04, 0.85, 1.6]])
- p4 = 0.85
- def ifs(p, eq, init, n):
- """
- 进行函数迭代
- p: 每个函数的选择概率列表
- eq: 迭代函数列表
- init: 迭代初始点
- n: 迭代次数
- 返回值: 每次迭代所得的X坐标数组, Y坐标数组, 计算所用的函数下标
- """
- # 迭代向量的初始化
- pos = np.ones(3, dtype=np.float)
- pos[:2] = init
- # 通过函数概率,计算函数的选择序列
- p = np.add.accumulate(p)
- rands = np.random.rand(n)
- select = np.ones(n, dtype=np.int)*(n-1)
- for i, x in enumerate(p[::-1]):
- select[rands<x] = len(p)-i-1
- # 结果的初始化
- result = np.zeros((n,2), dtype=np.float)
- c = np.zeros(n, dtype=np.float)
- for i in xrange(n):
- eqidx = select[i] # 所选的函数下标
- tmp = np.dot(eq[eqidx], pos) # 进行迭代
- pos[:2] = tmp # 更新迭代向量
- # 保存结果
- result[i] = tmp
- c[i] = eqidx
- return result[:,0], result[:, 1], c
- start = time.clock()
- x, y, c = ifs([p1,p2,p3,p4],[eq1,eq2,eq3,eq4], [0,0], 100000)
- print time.clock() - start
- pl.figure(figsize=(6,6))
- pl.subplot(121)
- pl.scatter(x, y, s=1, c="g", marker="s", linewidths=0)
- pl.axis("equal")
- pl.axis("off")
- pl.subplot(122)
- pl.scatter(x, y, s=1,c = c, marker="s", linewidths=0)
- pl.axis("equal")
- pl.axis("off")
- pl.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)
- pl.gcf().patch.set_facecolor("white")
- pl.show()
复制代码
使用pythonxy,你会发现,绘图时,你喜欢用什么都可以,甚至可以使用gnuplot这个在tex界大名鼎鼎的绘图包。
|
评分
-
1
查看全部评分
-
|