1. 关于曼德博集合的简单介绍:

曼德博集合(Mandelbrot set,或译为曼德布洛特复数集合)是一种在复平面上组成分形点的集合,以数学家本华·曼德博的名字命名。曼德博集合与朱利亚集合有些相似的地方,例如使用相同的复二次多项式来进行迭代
将曼德博集合无限放大都能够有精妙的细节在内,而这瑰丽的图案仅仅由一个简单的公式生成。因此有人认为曼德博集合是“人类有史以来做出的最奇异、最瑰丽的几何图形”,曾被称为“上帝的指纹”。


这是引自百度百科的一段介绍。总而言之,曼德博集合的发现使我们能以最直观的方式看到所谓的“数学之美”。


2. 如何获得曼德博集合:

从上一段介绍中,我们知道首先曼德博集合是定义在复平面上的。实际上关于复数概念,我们可以把它看作一种将(x,y)两个变量用一个复变量z代替的简单写法,无需顾虑太多。其次,曼德博集合是通过一个迭代方程以及一些分类规则获得的点的集合,我们来考虑这些问题。

曼德博集合使用到的简单的迭代方程如下:

其中,z是复数变量,c是一个复数常量,而非我们通常见到的实数常量。
我们从z = 0开始对这个函数进行迭代,即

上面这个迭代公式最终可能趋近于无穷大,也可能趋近于某一个收敛值,这取决于复数常量c。所以,我们将所有可以产生收敛值的c归为一类,用某种颜色的点把它们都绘制出来,另一类产生无限大的c则用另一种颜色绘制。通过这几个简单的步骤,我们就能得到“上帝的指纹”——曼德博集合。

借助于计算机,我们将尝试进行这一过程。


3. 一些基础知识:

由于曼德博集合需要进行迭代,如果我们使用简单的方法进行计算的话(可能要用到许多层循环),既存在运行时间过长的问题,而且绘制的图形通常比较粗糙。为了快速获得漂亮的图形,我们将使用到NumPy来对计算过程进行矢量化,也就是在计算过程中加入矩阵表示。

下面介绍一些在编程方面的有用知识以及一些数学内容。


(1). 绘图必备——函数meshgrid():

在使用matplotlib进行绘图时,需要传入x和y的坐标值,而通常情况下我们使用向量来进行(也就是使用列表),比如说

import matplotlib.pyplot as pltplt.figure()
plt.plot([1,2,3],[1,2,3],marker='.',linestyle='')
plt.show()

通过设置参数,我们将得到三个散点,如图:

但是,我们的画布是二维的,如果能使用二维数组传递坐标值,我们将方便的多。matplotlib也为我们提供了支持:

import matplotlib.pyplot as pltplt.figure()
plt.plot([[1,2,3],[1,2,3],[1,2,3]],[[1,1,1],[2,2,2],[3,3,3]],marker='.',linestyle='')
plt.show()

通过具有平面结构的二维数组,我们更加直观的绘制了这些点:

在上面的例子中,传递坐标值时,我们使用的是矩阵而不是简单的列表。

这样的二维矩阵,我们把它称为坐标矩阵,而meshgrid()就是在需要绘制大量点,而这些点的平面位置有一点规律(比如网格点)时用来帮助我们生成这样的坐标矩阵的。

我们通过使用这个函数绘制上一幅图,来看看这个函数的用法:

import matplotlib.pyplot as plt
import numpy as npplt.figure()
X,Y = np.meshgrid([1,2,3],[1,2,3])
plt.plot(X,Y,marker='.',linestyle='')
plt.show()print(X)
print(Y)

绘制的图片和上一幅图相同:

产生的网格状的坐标矩阵也是我们希望的:

[[1 2 3][1 2 3][1 2 3]]
[[1 1 1][2 2 2][3 3 3]]

这种方法远比使用列表快速、方便的多。


(2). 小技巧:数组的逻辑索引

为了既能绘制优美的曼德博集合,又能免去考虑复杂的colormap参数,我们将使用数组的逻辑索引作为简化问题的小技巧。

下面我们来介绍一个数组如何使用逻辑数组来进行索引:

import numpy as nparr = np.array([1,2,3,4,5])
index = np.array([True,False,True,False,True])
print(arr[index])

上面的代码创建了两个相同形状的数组,其中一个是逻辑数组。使用逻辑数组作为数组的索引,我们看到结果是

[1 3 5]

也就是只返回了布尔值为True的位置的值。

下面我们看看二维数组的情况:

import matplotlib.pyplot as plt
import numpy as nparr = np.array([[1,2,3],[4,5,6],[7,8,9]])
bool_index = np.array([[True,True,True],[True,False,True],[True,True,True]])
print(arr[bool_index])

结果是

[1 2 3 4 6 7 8 9]

也就是说,即使是二维数组,经过逻辑索引之后也只能得到一维的向量。

这种方式看起来似乎用处不大,但是看下面的代码:

arr[bool_index] = 100
print(arr)

这样做的结果是

[[100 100 100][100   5 100][100 100 100]]

也就是说,我们使用这种索引方式进行赋值操作时,数组将只改变逻辑数组为True位置的数组值,而数组的形状与其它的值都不会变化。

(3). 大大简化工作——两条数学定理:

在百度百科的【曼德博集合】词条中我们可以发现两条十分有用的定理:



定理二告诉我们,如果我们的坐标点在曼德博集合中,那么它将被包含在一个半径为2的圆内,如果我们简化一点的话,我们可以说:我们想要的图形坐标范围将在(-2,2)以及(-2,2)之间,这为我们确定了一个很准确的范围。

定理三告诉我们,如果某一次迭代中z的值超过了2,那么我们就可以结束了——因为这时我们就确定了这个点不属于曼德博集合。所以,我们不需要以迭代一定次数之后值是否为无穷大作为分类依据了——无穷大这个值包含太多不确定。我们只需要使用小小的、可爱的2作为无穷大的替代。

我们真应该感谢百度百科,唯一的遗憾是它没有给出证明。

这里我们不想证明它们,或许以后我们会做做尝试。


上面这三点将帮助我们理解代码并绘制出我们想要的曼德博集合。下面我们将直接给出代码,如果你能读懂上面的全部内容的话,阅读下面代码将很简单。

4. 所有的代码:

import numpy as np
import matplotlib.pyplot as pltdef my_meshgrid(width,step):'产生用于复变量c的X、Y网格矩阵。'x = np.linspace(-width,width,step)y = np.linspace(-width,width,step)X,Y = np.meshgrid(x,y)xmax,xmin,ymax,ymin = x.max(),x.min(),y.max(),y.min()return (X,Y),(xmax,xmin,ymax,ymin)def draw_mandelberg_set(X,Y):'根据传入的网格矩阵生成一个用于可视化的矩阵。'c = np.array(X + 1j*Y,dtype=complex)z = np.zeros(c.shape,dtype=complex)bool_index = np.ones(c.shape,dtype=bool)matrix_map = np.ones(c.shape)for i in range(50):z[bool_index] = pow(z[bool_index],2) + c[bool_index]bool_index = (np.abs(z) < 2)matrix_map += bool_indexreturn matrix_mapdef main(width=2,step=1000):'主函数'plt.figure()plt.axis('off')(X,Y),extent = my_meshgrid(width,step)matrix_map = draw_mandelberg_set(X,Y)plt.imshow(matrix_map,extent=extent,cmap=plt.cm.hot)plt.show()

5. “上帝的指纹”——最终结果

简单的运行一遍主函数,我们即可获得“上帝的指纹”——曼德博集合:

为了一窥“上帝的指纹”更美的细节,我们对一些函数做一些修改,使我们能更灵活的通过调整X与Y的范围看到我们希望的细节,同时,我们会将图片写入文件中,用大量的图片满足我们对数学之美的渴望。

完整的代码如下:

import numpy as np
import matplotlib.pyplot as pltdef my_meshgrid(rangex,rangey,step):'产生用于复变量c的X、Y网格矩阵。'x = np.linspace(rangex[0],rangex[1],step)y = np.linspace(rangey[0],rangey[1],step)X,Y = np.meshgrid(x,y)xmax,xmin,ymax,ymin = x.max(),x.min(),y.max(),y.min()return (X,Y),(xmax,xmin,ymax,ymin)def draw_mandelberg_set(X,Y):'根据传入的网格矩阵生成一个用于可视化的矩阵。'c = np.array(X + 1j*Y,dtype=complex)z = np.zeros(c.shape,dtype=complex)bool_index = np.ones(c.shape,dtype=bool)matrix_map = np.ones(c.shape)for i in range(50):z[bool_index] = pow(z[bool_index],2) + c[bool_index]bool_index = (np.abs(z) < 2)matrix_map += bool_indexreturn matrix_mapdef get_images(rangex=(-2,2),rangey=(-2,2),step=1000):'主函数'plt.figure()plt.axis('off')(X,Y),extent = my_meshgrid(rangex,rangey,step)matrix_map = draw_mandelberg_set(X,Y)return plt.imshow(matrix_map,extent=extent,cmap=plt.cm.hot)def main(start,step,bias):while start <= 2:get_images((start,start+step),(start+bias,start+step+bias))plt.savefig('image{}.png'.format(start))start += step

下面是我在一段时间内获得几张图片,我们也可以自己运行获得更多(这个过程中将产生大量的黑色图片,使得找到一个曼德博集合的图片很令人兴奋)。在调整参数的时候,我们要记得曼德博集合与分形——这意味着不论我们的参数如何小,我们在那个尺度下的某个位置任然看得到复杂的曼德博集合。

6. 欣赏时间










曼德博集合|最直观的数学之美——用Python看到“上帝的指纹”相关推荐

  1. 绘制曼德博集合与茱莉亚集合

    曼德博集合各部分的名称:sea horse valley.period bulb.main cardioid.曼德博集合与逻辑斯特映射对应. Mandelbrot set与Julia set http ...

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

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

  3. 《数学之美》第16章 信息指纹及其应用

    1 信息指纹 任何一段信息(包括文字.语音.视频.图片等),都可以对应一个不太长的随机数,作为区别这段信息和其他信息的指纹. 信息指纹在加密.信息压缩和处理中有着广泛的应用. 网络爬虫在下载网页时,会 ...

  4. 公钥,密钥原理学习(数学之美)

    最近在阅读<数学之美>,在看到信息指纹那一部分的时候被书中提到的公.密钥原理吸引住了.因为平时工作经常用Linux服务器,所以难免会用到SSH和SFTP,对于这两个工具一直只知道其底层数据 ...

  5. 分形几何python代码_Python, Cython绘制美妙绝伦的Mandelbrot集, 曼德博集分形图案

    上世纪60-70年代,美籍数学家曼德博 - Benoit B. Mandelbrot几乎单枪匹马的创立了一个新的数学分支,即分形几何学 - fractal geometry.这个新的数学分支有助于人类 ...

  6. Python, Cython绘制美妙绝伦的Mandelbrot集, 曼德博集分形图案

    上世纪60-70年代,美籍数学家曼德博 - Benoit B. Mandelbrot几乎单枪匹马的创立了一个新的数学分支,即分形几何学 - fractal geometry.这个新的数学分支有助于人类 ...

  7. 数学之美--数学大师与漂亮的分形几何学

    <美国数学会会志>今年连续在9月号和10月号上刊发忆述文章,回忆了美籍法国数学大师."分形几何学之父"伯努瓦·曼德尔布罗的奋斗历程,并高度评价他为科学发展作出了巨大贡献 ...

  8. 算法与数学之美:最全数学各个分支简介

    数论 人类从学会计数开始就一直和自然数打交道了,后来由于实践的需要,数的概念进一步扩充,自然数被叫做正整数,而把它们的相反数叫做负整数,介于正整数和负整数中间的中性数叫做0.它们和起来叫做整数. 对于 ...

  9. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

  10. 转:数学之美番外篇:平凡而又神奇的贝叶斯方法 收藏

    为什么80%的码农都做不了架构师?>>>    转自:http://blog.csdn.net/pongba/archive/2008/09/21/2958094.aspx 数学之美 ...

最新文章

  1. 肝货,详解 tkinter 图形化界面制作流程!
  2. linux 分卷压缩命令,linux 分卷压缩命令
  3. 搭载鸿蒙处理器的手机,荣耀Magic3被曝光,或采用安卓与鸿蒙双系统,搭载麒麟9000处理器...
  4. 使用CLion在Gtkmm中加载glade文件时的相对路径问题
  5. C#使用正则表达式检测数字 char 和韩文
  6. CVPR 2022NTIRE 2022|首个用于高光谱图像重建的 Transformer
  7. VX线报机器人的使用
  8. 人脸数据库收集——深度学习
  9. 计算机二级经济订货批量公式,计算机二级考试真题-Excel-李晓玲-采购成本分析...
  10. xp计算机重启记录,WinXP电脑关机后自动重启是什么原因?
  11. 16进制是否能整除 求余的运算
  12. 教育行业运维审计用什么堡垒机好?有什么作用?
  13. 如何快速构建千人规模的数字化研发管理系统
  14. RxSwift核心原理探究
  15. 了解传统教育培训机构的痛点
  16. 【opencv-python】视频处理(5) cv2.VideoCapture.grab()函数、cv2.VideoCapture.retrieve()函数
  17. junit忽略测试方法
  18. python在大数据处理的应用
  19. nrf51822 --TWI(硬件IIC)
  20. 基于Java+SpringBoot大学生实习管理系统 大学生实习兼职网站

热门文章

  1. python大神年薪_我程序员年薪 80 万被亲戚鄙视不如在二本教书的博士生?
  2. 一文搞定卷积神经网络——从原理到应用
  3. 高考数学圆锥曲线知识点:解题技巧
  4. 邮箱搬家操作步骤及详细说明
  5. can not connect to mysql server翻译_Message:Can not connect to MySQL server的解决办法
  6. 二手房房价影响因素分析
  7. c语言常量有哪些分类,c语言常量的正确表示方法有哪些
  8. iOS 禁止横屏的解决方案
  9. PS RGB通道抠图方法
  10. [2] UI原型设计工具Pencil Project 学习系列----- 入门