tpfto

Python script for Chen-Gackstatter surface

Sep 28th, 2025 (edited)
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.16 KB | Source Code | 0 0
  1. # from https://mathstodon.xyz/@tpfto/115282738536916157
  2.  
  3. import mpmath as mpm
  4. import numpy as np
  5. import plotly.graph_objs as go
  6.  
  7. # prepare a polar mesh
  8. rh = np.linspace(0.2, 0.8, 60)
  9. th = np.linspace(-np.pi, np.pi, 90)
  10. rG, tG = np.meshgrid(rh, th)
  11. zz = rG * np.exp(1j * tG)
  12.  
  13. # Jacobi epsilon function, https://dlmf.nist.gov/22.16.E30
  14. def ellipjep(zz, m):
  15.     km = mpm.ellipk(m)
  16.     em = mpm.ellipe(m)
  17.     qm = mpm.qfrom(m=m)
  18.     fac = mpm.mp.pi / (2 * km)
  19.     uu = fac * zz
  20.     zn = fac * mpm.jtheta(4, uu, qm, 1) / mpm.jtheta(4, uu, qm)
  21.     res = zz * (em / km) + zn
  22.     return res
  23.  
  24. # vectorize the elliptic functions
  25. jaccn = np.vectorize((lambda u, m: complex(mpm.ellipfun("cn", u, m))))
  26. jacdn = np.vectorize((lambda u, m: complex(mpm.ellipfun("dn", u, m))))
  27. jacsn = np.vectorize((lambda u, m: complex(mpm.ellipfun("sn", u, m))))
  28. jacep = np.vectorize((lambda u, m: complex(ellipjep(u, m))))
  29.  
  30. # period
  31. cc = float(2 * mpm.ellipk(0.5))
  32.  
  33. # precompute elliptic functions over mesh
  34. st = jacsn(cc * zz, 0.5)
  35. ct = jaccn(cc * zz, 0.5)
  36. dt = jacdn(cc * zz, 0.5)
  37. et = jacep(cc * zz, 0.5)
  38.  
  39. # Chen-Gackstatter surface, https://doi.org/10.1007/BF01456948
  40. x = np.real(
  41.     (np.pi + cc * cc / 2) * zz - cc * et
  42.     + (ct * dt * ((2 * np.pi / cc) / st - cc * st)) / (st**2)
  43. )
  44. y = np.imag(
  45.     (np.pi - cc * cc / 2) * zz + cc * et
  46.     + (ct * dt * ((2 * np.pi / cc) / st + cc * st)) / (st**2)
  47. )
  48. z = np.sqrt(6 * np.pi) * np.real((1 / st) ** 2) - np.sqrt(1.5 * np.pi)
  49.  
  50. # 'birdie' from https://tpfto.wordpress.com/2019/04/17/faking-a-birds-colors-and-miscellanea/
  51. birdie = [
  52.     "#3E26A8", "#4536D4", "#484CEF", "#4562FC", "#347AFC", "#2C90F0", "#21A3E3", "#0CB3D3",
  53.     "#12BEB9", "#34C79C", "#5CCC76", "#94C94A", "#C8C129", "#F1BA37", "#FEC933", "#F5E327",
  54.     "#F9FB14"
  55. ]
  56.  
  57. # and now, the plot...
  58. surface = go.Surface(x=x, y=y, z=z, colorscale=birdie, showscale=False)
  59. data = [surface]
  60.  
  61. pset = dict(
  62.     gridcolor="#EEE8D5", zerolinecolor="#EEE8D5",
  63.     showbackground=True, backgroundcolor="#839496"
  64. )
  65. layout = go.Layout(
  66.     title="Chen-Gackstatter surface", scene=dict(xaxis=pset, yaxis=pset, zaxis=pset)
  67. )
  68.  
  69. fig = go.Figure(data=data, layout=layout)
  70. fig.show()
Tags: math geometry
Advertisement
Add Comment
Please, Sign In to add comment