如何用Python画各种著名数学图案

编译团队:Aileen  徐凌霄

振兴网站建设公司成都创新互联,振兴网站设计制作,有大型网站制作公司丰富经验。已为振兴成百上千提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的振兴做网站的公司定做!

用Python绘制著名的数学图片或动画,展示数学中的算法魅力。

Mandelbrot 集

代码:46 lines (34 sloc) 1.01 KB

 
 
 
 
  1. ''' 
  2. A fast Mandelbrot set wallpaper renderer
  3.  
  4. reddit discussion: https://www.reddit.com/r/math/comments/2abwyt/smooth_colour_mandelbrot/ 
  5. ''' 
  6. import numpy as np 
  7. from PIL import Image 
  8. from numba import jit
  9.  
  10. MAXITERS = 200
  11. RADIUS = 100
  12.  
  13. @jit
  14. def color(z, i): 
  15. v = np.log2(i + 1 - np.log2(np.log2(abs(z)))) / 5 
  16. if v < 1.0:
  17. return v**4, v**2.5, v
  18. else: 
  19. v = max(0, 2-v) 
  20. return v, v**1.5, v**3
  21.  
  22. @jit
  23. def iterate(c):
  24. z = 0j 
  25. for i in range(MAXITERS): 
  26. if z.real*z.real + z.imag*z.imag > RADIUS: 
  27. return color(z, i)
  28. zz = z*z + c 
  29. return 0, 0 ,0
  30.  
  31. def main(xmin, xmax, ymin, ymax, width, height): 
  32. x = np.linspace(xmin, xmax, width)
  33. y = np.linspace(ymax, ymin, height)
  34. z = x[None, :] + y[:, None]*1j
  35. red, green, blue = np.asarray(np.frompyfunc(iterate, 1, 3)(z)).astype(np.float)
  36. img = np.dstack((red, green, blue)) 
  37. Image.fromarray(np.uint8(img*255)).save('mandelbrot.png')
  38.  
  39. if __name__ == '__main__': 
  40. main(-2.1, 0.8, -1.16, 1.16, 1200, 960)

多米诺洗牌算法

代码链接:https://github.com/neozhaoliang/pywonderland/tree/master/src/domino

正二十面体万花筒

代码:53 lines (40 sloc) 1.24 KB

 
 
 
 
  1. '''
  2. A kaleidoscope pattern with icosahedral symmetry.
  3. '''
  4. import numpy as np
  5. from PIL import Image
  6. from matplotlib.colors import hsv_to_rgb
  7.  
  8. def Klein(z):
  9. '''Klein's j-function''' 
  10. return 1728 * (z * (z**10 + 11 * z**5 - 1))**5 / \
  11. (-(z**20 + 1) + 228 * (z**15 - z**5) - 494 * z**10)**3
  12.  
  13. def RiemannSphere(z): 
  14. '''
  15.     map the complex plane to Riemann's sphere via stereographic projection
  16.     '''
  17. t = 1 + z.real*z.real + z.imag*z.imag
  18. return 2*z.real/t, 2*z.imag/t, 2/t-1
  19.  
  20. def Mobius(z):
  21. '''
  22.     distort the result image by a mobius transformation
  23.     '''
  24. return (z - 20)/(3*z + 1j)
  25.  
  26. def main(imgsize):
  27. x = np.linspace(-6, 6, imgsize))
  28. y = np.linspace(6, -6, imgsize)
  29. z = x[None, :] + y[:, None]*1j
  30. z = RiemannSphere(Klein(Mobius(Klein(z))))
  31.  
  32. # define colors in hsv space
  33. H = np.sin(z[0]*np.pi)**2
  34. S = np.cos(z[1]*np.pi)**2
  35. V = abs(np.sin(z[2]*np.pi) * np.cos(z[2]*np.pi))**0.2
  36. HSV = np.dstack((H, S, V))
  37.  
  38. # transform to rgb space
  39. img = hsv_to_rgb(HSV) 
  40. Image.fromarray(np.uint8(img*255)).save('kaleidoscope.png')
  41.  
  42. if __name__ == '__main__': 
  43. import time 
  44. start = time.time() 
  45. main(imgsize=800)
  46. end = time.time()
  47. print('runtime: {:3f} seconds'.format(end -

Newton 迭代分形

代码:46 lines (35 sloc) 1.05 KB

 
 
 
 
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from numba import jit
  4.  
  5. # define functions manually, do not use numpy's poly1d funciton!
  6. @jit('complex64(complex64)', nopython=True) 
  7. def f(z): 
  8. # z*z*z is faster than z**3
  9. return z*z*z - 1
  10.  
  11. @jit('complex64(complex64)', nopython=True)
  12. def df(z): 
  13. return 3*z*z
  14.  
  15. @jit('float64(complex64)', nopython=True) 
  16. def iterate(z): 
  17. num = 0 
  18. while abs(f(z)) > 1e-4: 
  19. w = z - f(z)/df(z) 
  20. num += np.exp(-1/abs(w-z))
  21. z = w
  22. return num
  23.  
  24. def render(imgsize): 
  25. x = np.linspace(-1, 1, imgsize) 
  26. y = np.linspace(1, -1, imgsize) 
  27. z = x[None, :] + y[:, None] * 1j 
  28. img = np.frompyfunc(iterate, 1, 1)(z).astype(np.float)
  29. fig = plt.figure(figsize=(imgsize/100.0, imgsize/100.0), dpi=100)
  30. ax = fig.add_axes([0, 0, 1, 1], aspect=1)
  31. ax.axis('off')
  32. ax.imshow(img, cmap='hot'))
  33. fig.savefig('newton.png')
  34.  
  35. if __name__ == '__main__':
  36. import time 
  37. start = time.time()
  38. render(imgsize=400)
  39. end = time.time() 
  40. print('runtime: {:03f} seconds'.format(end 

李代数E8 的根系

代码链接:https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/e8.py

模群的基本域

代码链接:

https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/modulargroup.py

彭罗斯铺砌

代码链接:

https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/penrose.py

Wilson 算法

代码链接:https://github.com/neozhaoliang/pywonderland/tree/master/src/wilson

反应扩散方程模拟

代码链接:https://github.com/neozhaoliang/pywonderland/tree/master/src/grayscott

120 胞腔

 
 
 
 
  1. # pylint: disable=unused-import
  2. # pylint: disable=undefined-variable
  3.  
  4. from itertools import combinations, product
  5. import numpy as np 
  6. from vapory import *
  7. class Penrose(object):
  8.  
  9. GRIDS = [np.exp(2j * np.pi * i / 5) for i in range(5)]
  10.  
  11. def __init__(self, num_lines, shift, thin_color, fat_color, **config): 
  12. self.num_lines = num_lines
  13. self.shift = shift
  14. self.thin_color = thin_color
  15. self.fat_color = fat_color
  16. selfself.objs = self.compute_pov_objs(**config)
  17. def compute_pov_objs(self, **config):
  18. objects_pool = []
  19.  
  20. for rhombi, color in self.tile():
  21. p1, p2, p3, p4 = rhombi
  22. polygon = Polygon(5, p1, p2, p3, p4, p1, 
  23. Texture(Pigment('color', color), config['default']))
  24. objects_pool.append(polygon)
  25.  
  26. for p, q in zip(rhombi, [p2, p3, p4, p1]):
  27. cylinder = Cylinder(p, q, config['edge_thickness'], config['edge_texture'])
  28. objects_pool.append(cylinder)
  29.  
  30. for point in rhombi: 
  31. x, y = point 
  32. sphere = Sphere((x, y, 0), config['vertex_size'], config['vertex_texture'])
  33. objects_pool.append(sphere)
  34.  
  35. return Object(Union(*objects_pool))
  36.  
  37. def rhombus(self, r, s, kr, ks):
  38. if (s - r)**2 % 5 == 1:
  39. color = self.thin_color
  40. else:
  41. color = self.fat_color
  42.  
  43. point = (Penrose.GRIDS[r] * (ks - self.shift[s])
  44. - Penrose.GRIDS[s] * (kr - self.shift[r])) *1j / Penrose.GRIDS[s-r].imag
  45. index = [np.ceil((point/grid).real + shift)
  46. for grid, shift in zip(Penrose.GRIDS, self.shift)]
  47.  
  48. vertices = []
  49. for index[r], index[s] in [(kr, ks), (kr+1, ks), (kr+1, ks+1), (kr, ks+1)]:
  50. vertices.append(np.dot(index, Penrose.GRIDS))
  51.  
  52. vertices_real = [(z.real, z.imag) for z in vertices]
  53. return vertices_real, color
  54.  
  55. def tile(self):
  56. for r, s in combinations(range(5), 2):
  57. for kr, ks in product(range(-self.num_lines, self.num_lines+1), repeat=2):
  58. yield self.rhombus(r, s, kr, ks)
  59.  
  60. def put_objs(self, *args):
  61. return Object(self.objs, *args)

原文:https://github.com/neozhaoliang/pywonderland/blob/master/README.md

【本文是专栏机构大数据文摘的原创译文,微信公众号“大数据文摘( id: BigDataDigest)”】

本文题目:如何用Python画各种著名数学图案
当前网址:http://www.mswzjz.cn/qtweb/news38/308038.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能