声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5173|回复: 8

[Python] 用python做数值计算,spyder 上的调试分形算法

[复制链接]
发表于 2010-11-2 20:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
再发一个分形的代码,这是《用python做数值计算》上的例子,是迭代法计算描绘分形图形的。先看一下效果。 分形.png
这是spyder上界面,并且窗口都是浮动的,可以任意调节,这个界面是用PyQt写的,pythonxy上有完整的设计。关于pyqt界面设计,也有很多介绍。但是我个人觉得如果是自己做一些简单的使用用tkinter就比较不错。先不说那么多,看看代码吧。
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import matplotlib.pyplot as pl
  4. import time


  5. # 蕨类植物叶子的迭代函数和其概率值
  6. eq1 = np.array([[0,0,0],[0,0.16,0]])
  7. p1 = 0.01

  8. eq2 = np.array([[0.2,-0.26,0],[0.23,0.22,1.6]])
  9. p2 = 0.07

  10. eq3 = np.array([[-0.15, 0.28, 0],[0.26,0.24,0.44]])
  11. p3 = 0.07

  12. eq4 = np.array([[0.85, 0.04, 0],[-0.04, 0.85, 1.6]])
  13. p4 = 0.85

  14. def ifs(p, eq, init, n):
  15. """
  16. 进行函数迭代
  17. p: 每个函数的选择概率列表
  18. eq: 迭代函数列表
  19. init: 迭代初始点
  20. n: 迭代次数

  21. 返回值: 每次迭代所得的X坐标数组, Y坐标数组, 计算所用的函数下标
  22. """

  23. # 迭代向量的初始化
  24. pos = np.ones(3, dtype=np.float)
  25. pos[:2] = init

  26. # 通过函数概率,计算函数的选择序列
  27. p = np.add.accumulate(p)
  28. rands = np.random.rand(n)
  29. select = np.ones(n, dtype=np.int)*(n-1)
  30. for i, x in enumerate(p[::-1]):
  31. select[rands<x] = len(p)-i-1

  32. # 结果的初始化
  33. result = np.zeros((n,2), dtype=np.float)
  34. c = np.zeros(n, dtype=np.float)

  35. for i in xrange(n):
  36. eqidx = select[i] # 所选的函数下标
  37. tmp = np.dot(eq[eqidx], pos) # 进行迭代
  38. pos[:2] = tmp # 更新迭代向量

  39. # 保存结果
  40. result[i] = tmp
  41. c[i] = eqidx

  42. return result[:,0], result[:, 1], c

  43. start = time.clock()
  44. x, y, c = ifs([p1,p2,p3,p4],[eq1,eq2,eq3,eq4], [0,0], 100000)
  45. print time.clock() - start
  46. pl.figure(figsize=(6,6))
  47. pl.subplot(121)
  48. pl.scatter(x, y, s=1, c="g", marker="s", linewidths=0)
  49. pl.axis("equal")
  50. pl.axis("off")
  51. pl.subplot(122)
  52. pl.scatter(x, y, s=1,c = c, marker="s", linewidths=0)
  53. pl.axis("equal")
  54. pl.axis("off")
  55. pl.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)
  56. pl.gcf().patch.set_facecolor("white")
  57. pl.show()




复制代码


使用pythonxy,你会发现,绘图时,你喜欢用什么都可以,甚至可以使用gnuplot这个在tex界大名鼎鼎的绘图包。

评分

1

查看全部评分

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

 楼主| 发表于 2010-11-2 22:00 | 显示全部楼层
对于matlab如http://forum.vibunion.com/thread-96985-1-1.html
帖子上的问题,我们可以使用如下code得到:
  1. # -*- coding: utf-8 -*-
  2. from numpy import sin,pi
  3. import numpy as np
  4. import pylab as pl

  5. x=np.arange(0,2*pi,0.1)

  6. pl.figure(figsize=(8,6))
  7. for i in range(1,6):
  8.       pl.subplot(510+i)
  9.       pl.plot(x, i*sin(x+i*pi/2),'.')
  10. pl.legend()
  11. pl.show()
复制代码

11.png

评分

1

查看全部评分

发表于 2010-11-2 22:26 | 显示全部楼层
回复 smtmobly 的帖子
  1. import numpy as np
  2. import pylab as pl
复制代码
为什么要这么import呢,难道还有和pylab有相同接口的其他绘图库类,所以这么做方便重构?
 楼主| 发表于 2010-11-2 22:31 | 显示全部楼层
python的结构是松散的,模块与模块间的联系通过import来连接,除了内建的几个基本的模块外不会加载其他模块,在使用的时候必须加载进去才能使用,比如math中有sin,cos等,numpy里也有同样名称的函数,他们的计算方式运行速度等都不一样。
松散结构可以让程序不会因为加载了不使用的模块而影响速度
发表于 2010-11-2 22:44 | 显示全部楼层
回复 smtmobly 的帖子

我认为松散的结构是为了使程序不会因为加载了不同的模块而作过多的改写吧?
 楼主| 发表于 2010-11-2 22:50 | 显示全部楼层
当然如果你加载过多的不使用的模块,在改写的时候会麻烦些。改写上,python有更好的优势,因为函数,类,等特别的结构都可以作为变量赋值。
所以只要一句赋值语句就可以改写。
最需要注意的一一个关于list的,比如:x=[1,2,3]
y=x
y[2]=1
那么x也会变成[1,2,1]
发表于 2010-12-6 18:40 | 显示全部楼层
回复 6 # smtmobly 的帖子
最需要注意的一一个关于list的,比如:x=[1,2,3]
y=x
y[2]=1
那么x也会变成[1,2,1]

现在对你说的这个有体会了,要想不发生这种情况,就要:
y = np.range(1,3)
y[:] = x[:]
呵呵,是吧?
发表于 2010-12-6 19:21 | 显示全部楼层
本帖最后由 wqsong 于 2010-12-6 19:47 编辑

呵呵,上次写了一个用到矩阵运算的程序。初始化一个二维数组也发现了一个问题,这里贴出来,一起看看。两种不同的初始化方式:

  1. 1、
  2. >>> arr = [[0]*4]*4

  3. >>> arr[0][2] = 6
  4. >>> arr
  5. [[0, 0, 6, 0], [0, 0, 6, 0], [0, 0, 6, 0], [0, 0, 6, 0]]

  6. 2、

  7. >>> arr = [[0]*4 for i in range(4)]

  8. >>> arr[0][2] = 6
  9. >>> arr
  10. [[0, 0, 6, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
复制代码
第一种相当于C++中常说的位拷贝,第二种就是逻辑拷贝。
这块挺诡异的,无章可循,目前是死记的。。。
发表于 2010-12-6 19:28 | 显示全部楼层
回复 8 # wqsong 的帖子

我也觉得PYthon序列的寻址或者叫切片吧,反正英文就是Indexing挺盘根错节的……
同死记……
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-6 16:02 , Processed in 0.385119 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表