大数据文摘作品,转载具体要求见文末
编译团队:Aileen,徐凌霄
用Python绘制著名的数学图片或动画,展示数学中的算法魅力。
本项⽬目将持续更更新,数学中有着太多有趣的事物可以⽤用代码去展示。 欢迎提出建议和参与建设!
后台回复“数学”查看完整代码集哦
Mandelbrot 集
代码&#xff1a;46 lines (34 sloc) 1.01 KB&#39;&#39;&#39;A fast Mandelbrot set wallpaper rendererreddit discussion: https://www.reddit.com/r/math/comments/2abwyt/smooth_colour_mandelbrot/&#39;&#39;&#39;import numpy as npfrom PIL import Imagefrom numba import jitMAXITERS &#61; 200RADIUS &#61; 100&#64;jitdef color(z, i):v &#61; np.log2(i &#43; 1 - np.log2(np.log2(abs(z)))) / 5if v <1.0:return v**4, v**2.5, velse:v &#61; max(0, 2-v)return v, v**1.5, v**3&#64;jitdef iterate(c):z &#61; 0jfor i in range(MAXITERS):if z.real*z.real &#43; z.imag*z.imag > RADIUS:return color(z, i)z &#61; z*z &#43; creturn 0, 0 ,0def main(xmin, xmax, ymin, ymax, width, height):x &#61; np.linspace(xmin, xmax, width)y &#61; np.linspace(ymax, ymin, height)z &#61; x[None, :] &#43; y[:, None]*1jred, green, blue &#61; np.asarray(np.frompyfunc(iterate, 1, 3)(z)).astype(np.float)img &#61; np.dstack((red, green, blue))Image.fromarray(np.uint8(img*255)).save(&#39;mandelbrot.png&#39;)if __name__ &#61;&#61; &#39;__main__&#39;:main(-2.1, 0.8, -1.16, 1.16, 1200, 960)
多米诺洗牌算法
代码链接&#xff1a;https://github.com/neozhaoliang/pywonderland/tree/master/src/domino
正二十面体万花筒
代码&#xff1a;53 lines (40 sloc) 1.24 KB&#39;&#39;&#39;A kaleidoscope pattern with icosahedral symmetry.&#39;&#39;&#39;import numpy as npfrom PIL import Imagefrom matplotlib.colors import hsv_to_rgbdef Klein(z):&#39;&#39;&#39;Klein&#39;s j-function&#39;&#39;&#39;return 1728 * (z * (z**10 &#43; 11 * z**5 - 1))**5 / \(-(z**20 &#43; 1) &#43; 228 * (z**15 - z**5) - 494 * z**10)**3def RiemannSphere(z):&#39;&#39;&#39; map the complex plane to Riemann&#39;s sphere via stereographic projection &#39;&#39;&#39;t &#61; 1 &#43; z.real*z.real &#43; z.imag*z.imagreturn 2*z.real/t, 2*z.imag/t, 2/t-1def Mobius(z):&#39;&#39;&#39; distort the result image by a mobius transformation &#39;&#39;&#39;return (z - 20)/(3*z &#43; 1j)def main(imgsize):x &#61; np.linspace(-6, 6, imgsize)y &#61; np.linspace(6, -6, imgsize)z &#61; x[None, :] &#43; y[:, None]*1jz &#61; RiemannSphere(Klein(Mobius(Klein(z))))# define colors in hsv spaceH &#61; np.sin(z[0]*np.pi)**2S &#61; np.cos(z[1]*np.pi)**2V &#61; abs(np.sin(z[2]*np.pi) * np.cos(z[2]*np.pi))**0.2HSV &#61; np.dstack((H, S, V))# transform to rgb spaceimg &#61; hsv_to_rgb(HSV)Image.fromarray(np.uint8(img*255)).save(&#39;kaleidoscope.png&#39;)if __name__ &#61;&#61; &#39;__main__&#39;:import timestart &#61; time.time()main(imgsize&#61;800)end &#61; time.time()print(&#39;runtime: {:3f} seconds&#39;.format(end - start))
Newton 迭代分形
代码&#xff1a;46 lines (35 sloc) 1.05 KBimport numpy as npimport matplotlib.pyplot as pltfrom numba import jit# define functions manually, do not use numpy&#39;s poly1d funciton!&#64;jit(&#39;complex64(complex64)&#39;, nopython&#61;True)def f(z):# z*z*z is faster than z**3return z*z*z - 1&#64;jit(&#39;complex64(complex64)&#39;, nopython&#61;True)def df(z):return 3*z*z&#64;jit(&#39;float64(complex64)&#39;, nopython&#61;True)def iterate(z):num &#61; 0while abs(f(z)) > 1e-4:w &#61; z - f(z)/df(z)num &#43;&#61; np.exp(-1/abs(w-z))z &#61; wreturn numdef render(imgsize):x &#61; np.linspace(-1, 1, imgsize)y &#61; np.linspace(1, -1, imgsize)z &#61; x[None, :] &#43; y[:, None] * 1jimg &#61; np.frompyfunc(iterate, 1, 1)(z).astype(np.float)fig &#61; plt.figure(figsize&#61;(imgsize/100.0, imgsize/100.0), dpi&#61;100)ax &#61; fig.add_axes([0, 0, 1, 1], aspect&#61;1)ax.axis(&#39;off&#39;)ax.imshow(img, cmap&#61;&#39;hot&#39;)fig.savefig(&#39;newton.png&#39;)if __name__ &#61;&#61; &#39;__main__&#39;:import timestart &#61; time.time()render(imgsize&#61;400)end &#61; time.time()print(&#39;runtime: {:03f} seconds&#39;.format(end - start))
李代数E8 的根系
代码链接&#xff1a;https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/e8.py