据说蝴蝶扇动翅膀这样一件小事,可能最终会引起对面半球的一场飓风。

​ — 电影《蝴蝶效应》

上面这行话来源于2004年的电影《蝴蝶效应》的开篇字幕。更早期,这段话则与气象学家Edward Lorenz有关。他发现简单的热对流现象居然能引起令人无法想象的气象变化,在对相关发现进行数学分析后,Lorenz于1963年提出了混沌理论 - Chaos Theory。混沌理论认为在混沌系统中,初始条件十分微小的变化,经过不断放大,对其未来状态会造成极其巨大的差别。

经过多年的发展,该理论已在气象、经济、化学、信息等诸领域得到广泛应用。但如果以混沌理论为关键词在Google上进行搜索,还会发现一些美轮美奂的艺术作品,这些艺术作品都与混沌理论中的吸引子有关。

本文节选自作者的《Python编程基础及应用》视频教程。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

1. Peter de Jong吸引子

所谓吸引子 - Attractor,是动力系统里的一个状态,系统演化会趋向那个方向靠拢。Peter de Jong是一个奇异吸引子。奇异吸引子上的运动对初始值表现出极强的敏感依赖性,在初始值上的微不足道的差异,就会导致运动轨道的截然不同。奇异吸引子往往具有非整数维,如2.06维、1.2365维等。

Peter de Jong吸引子就是一个奇异吸引子,它可以由下述迭代方程描述:
xn+1=sin(ayn)−cos(bxn)yn+1=sin(cxn)−cos(dyn)x_{n+1} = sin(ay_{n})-cos(bx_{n})\\ y_{n+1} = sin(cx_{n})-cos(dy_{n}) xn+1​=sin(ayn​)−cos(bxn​)yn+1​=sin(cxn​)−cos(dyn​)
这个方程有4个参数,分别为a,b,c,d。随意指定x0和y0的值,比如(0,0),通过上述公式,可计算得x1和y1。然后以x1和y1为基础,可计算得x2,y2 … 这样一直迭代-iterate计算,我们就可以获得N个平面上的点(xi,yi),把这些点在坐标系中画出来,就得到Peter de Jong吸引子的图像。

#SimplePeterDeJong.py
from math import sin,cos
from matplotlib import pyplot as pltdef iteration():a,b,c,d = 0.970,-1.899,1.381,-1.506x,y = 0,0xdata,ydata = [],[]for i in range(1000000):xNew = sin(a*y) - cos(b*x)yNew = sin(c*x) - cos(d*y)x,y = xNew,yNewxdata.append(x)ydata.append(y)return xdata,ydataxdata,ydata = iteration()
plt.figure(figsize=(6,6))
plt.title("Peter de Jong Attractor")
plt.scatter(xdata,ydata,s=0.005)
plt.show()

程序只有寥寥数行。首先我们从math模块导入了正弦-sin和余弦-cos函数;还导入了matplotlib中的pyplot模块并取名为plt。matplotlib是著名的C/C++语言编写的绘图包,可以很简单地生成各种图表。

iteration()函数进行迭代计算,首先初始化x = 0, y = 0,然后迭代计算100万个点,并把相应数据存入xdata,ydata列表并返回。xdata,ydata列表中存储了100万个点,其中第i个点的x轴坐标数据为xdata[i],y轴坐标数据为ydata[i]。

plt.figure(figsize=(6,6))创建了一个长6英寸,宽6英寸的图-Figure,plt.title()函数设置了图的标题,plt.scatter()函数则在xy平面上绘制散点图,相应点的坐标数据包含在xdata及ydata列表中,s参数指定了点的绘制尺寸。plt.show()则把绘制好的图显示在屏幕上。程序运行结果如下:

在上图中,可以看到,x,y坐标的取值范围都是[-2, +2]。这是因为正弦函数和余弦函数的值域都是[-1, +1],上述x,y取值为一个sin()减去一个cos(),两者各取极值,可得[-2,+2]的值域。

这个图表示了Peter de Jong吸引子的点的分布。它表现出混沌特性,当a,b,c,d的参数值不同时,图像差异会很大。为了把图变得美观一点,我们引入颜色。

2. 彩色PDJ吸引子

#ColoredPeterDeJong.py
...
def iteration():e,f = 0.7,-1.1a,b,c,d = 0.970,-1.899,1.381,-1.506x,y,z = 0,0,0xdata,ydata,zdata = [],[],[]for i in range(1000000):xNew = sin(a*y) - cos(b*x)yNew = sin(c*x) - cos(d*y)zNew = sin(e * x) - cos(f * z)x,y,z = xNew,yNew,zNewxdata.append(x)ydata.append(y)zdata.append(z)return xdata,ydata,zdataxdata,ydata,zdata = iteration()
...
plt.scatter(xdata,ydata,s=0.005,c=zdata)
plt.show()

这段代码同前述代码有以下区别。首先,我们引用了新的参数e,f,并引入了z值。该z值以类似于x,y的方式被迭代计算,并通过zdata列表返回。

在plt.scatter()函数中,c=zdata表示每个散点的颜色从zdata列表中获取,即第i个散点的颜色数据为zdata[i]。至于matplotlib如何把zdata当中的浮点数据转换成实际的颜色,在这里作者没有深入探究。新程序的执行结果如下图。

3. 修改PDJ参数

​ 作者尝试了几个不同的a,b,c,d参数,得到下述吸引子图像。

a,b,c,d = -0.709,1.638,0.452,1.740
a,b,c,d = 1.4,-2.3,2.4,-2.1

严格地说,上述吸引子图像远没有达到“艺术”效果。要想把上述吸引子图像画成“艺术”效果,需要图像渲染算法的知识,在这里没办法展开。其中一种比较有名的算法称之为分形火焰算法 - fractal flame algorithm。

本文节选自作者的《Python编程基础及应用》视频教程及同名教科书。想完整零基础学习Python程序设计,欢迎使用此免费视频教程。

数学之美 - Python视角下的Peter de Jong吸引子相关推荐

  1. 超纯超美的曲线(Peter De Jong Attractor)

    from: http://blog.csdn.net/jia20003/article/details/7198612 无意之中在网上看到一篇基于HTML5 Demo的Peter De Jong 吸引 ...

  2. Processing 分形之二—— Peter de Jong Attractor

    人真正变强大,不是因为守护着自尊心,而是抛开自尊心的时候. --<请回答1988> Strange Attractor是混沌运动的主要特征之一,由法国物理学家小D和小F在1970年左右引进 ...

  3. MATLAB | 一起来感受数学之美叭

    前两天去观摩了MATHWORKS官方举办的Mathematics is beautiful数学之美投票比赛,见到了很多非常惊艳的作品,在这里分享给大家让大家一同感受大神们的创造力,接下来由我来做全程解 ...

  4. python绘制如下图形、小三角形边长20_在编程中发现数学之美——使用Python小龟绘制多边形...

    在使用数学知识画出很酷的各种图形之前,你需要先学习Python编程语言的基础知识.本文将会带你熟悉以下编程概念:循环.变量.函数.使用小龟模块绘制图像.本文假设你已经安装了Python,如果没有,欢迎 ...

  5. 【Python爬虫】2022年数学建模美赛B题数据爬取

    2022年数学建模美赛B题数据爬取 背景 2022年的美赛刚刚落下帷幕,该题的一个主要难点在于数据的获取.很多人无法找到有效的数据,或者是无法获取数据. 比如找到了如下米德湖的水文数据,但是发现并没有 ...

  6. Python代码中的数学之美:从自由落体到爬虫悖论,十分钟开启数学思维

    数学思维,就是用数学的方式去解决问题,就象吃饭用筷子.喝水用杯子一样,自然而然又理所当然.数学思维并非知识的积累,而是一种由特定思维习惯蕴育而成的能力--这种特定习惯的养成,往往是从解决看似简单的问题 ...

  7. 数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型

    数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型 我们上次谈到用最大熵模型可以将各种信息综合在一起.我们留下一个问题没有回答,就是如何构造最大熵模型.我们已经所有的最大熵模型都 ...

  8. 数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型...

    数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型 我们上次谈到用最大熵模型可以将各种信息综合在一起.我们留下一个问题没有回答,就是如何构造最大熵模型.我们已经所有的最大熵模型都 ...

  9. 【读书笔记】数学之美(下)

    作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 本文为旧博客文章,数学公式显示不正常,请至 https://segmentf ...

最新文章

  1. windows游戏编程_少儿编程该怎么学?看看帕拉卡3D动画编程创始人李西峙分享七个核心...
  2. Java数据结构和算法:线性表
  3. asp(javascript)中request.form(a).count 在ie6中总是为0
  4. 再严重的感冒,马上就好!!
  5. 获取和设置c# 应用程序目录
  6. 2008年12月答疑贴
  7. 其他技术(Path)
  8. Oracle常用的几个父栓
  9. javascript-运算符
  10. 使用过滤器解决SQL注入和跨站点脚本编制
  11. 微信小程序自动回复机器人(模拟云信案例)
  12. 《最优化方法》——数学基础知识线性规划无约束优化算法初步
  13. 中毒了(QQ群搞笑聊天记录)
  14. php订阅号发送消息,php实现微信公众号主动推送消息
  15. elment文件上传 展示点击下载
  16. android 爱普生打印机,安卓打印 爱普生推出智能iPrint新应用
  17. Python人工智能完整学习路线,让你惊艳到爆
  18. JavaWeb - 仿小米商城网(2) 用户注册
  19. 【论文阅读】3D点云 -- PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
  20. 知乎音乐封神榜,你想听的都在这里。

热门文章

  1. win10每次开机蓝屏 进bios 点保存后才能正常进入系统
  2. 这很战斗民族!俄机器人主播连胡子都不刮?
  3. 标准linu休眠和唤醒机制分析(一)
  4. ITK学习笔记(十一) SimpleITK相关使用
  5. decker容器部署及常用操作
  6. 【华为2018年校园招聘】算法岗笔试题
  7. Excel统计成绩经常用到的一个公式(根据分数给出优,良,中,差)
  8. 常用SNS开源系统比较
  9. STM32 TIM2重映射
  10. 步态识别+人脸识别,让世界头号通缉犯在15秒内被导弹消灭