我的 Tetration(复数)函数必须更好地矢量化(Python)

受 3blue1brown 的启发,我正在尝试用 Python绘制 Tetration函数的逃逸(散度)图——类似于维基百科上这张漂亮的图形。

def tetration_com(base, tol=10**-15, max_step=10**6):

  # returns t, the infinite tetration of base.

  # if t does not converge, the function returns an escape value, aka how fast it diverges..


  t = 1.0

  step = 0

  escape = None

  ln_base = cmath.log(base)


  t_last = 0

  try:

    while(abs(t - t_last) > tol):

      if(step > max_step):

        raise OverflowError

      t_last = t

      t = cmath.exp(ln_base*t)   # [ base^t == e^(ln(base)*t) ]

      step += 1


  except(OverflowError):

    t = None

    escape = 1000/step

    # the escape value is is inversely related to the number of steps it took

    # us to diverge to infinity


  return t, escape

我试图让它与 meshgrid 一起工作,以便绘制 xy 平面上的逃逸图。Python 不喜欢输出是 2 个解压缩的变量(限制或转义)——我绝对可以通过拆分成两个函数来解决这个问题。


但另一个问题是复杂的数学运算(cmath.log,cmath.exp)只适用于标量......


我试图向量化函数:


nx, ny = 700, 500

x, y = np.linspace(-3.5, 3.5, nx), np.linspace(-2.5, 2.5, ny)

xv, yv = np.meshgrid(x, y)


tetration_vec = np.vectorize(tetration_com)

t, escape = tetration_vec(xv + yv*1j, max_step=500)

但它永远在运行。


关于如何处理复杂数学运算和矢量化的任何建议?


函数式编程
浏览 68回答 1
1回答

www说

这是我最后如何绘制逃生图:def tetration_com(base, tol=10**-15, max_step=10**6, max_val=10**2):  # returns t, the infinite tetration of base.  # if t does not converge, the function returns an escape value  # aka how fast it diverges..  t = 1.0  step = 0  escape = None  t_last = 0  try:    while(abs(t - t_last) > tol):      if(step > max_step or abs(t) > max_val):        raise OverflowError      t_last = t      t = pow(base, t)      step += 1  except(OverflowError):    t = None    escape = 1000/step    # the escape value is is inversely related to the number of steps it took    # us to diverge to infinity  return t, escape向量化辅助函数:def tetra_graph_escape(real, imag, tol=10**-15, max_step=10**3, max_val=10**2):  return np.array([np.array([tetration_com(r + im*1j, tol=tol, max_step=max_step, max_val=max_val)[1]                             for im in imag]) for r in real])绘图:# graph our escape:nx, ny = 700, 500x, y = np.linspace(-3.5, 3.5, nx), np.linspace(-2.5, 2.5, ny)val, escape = tetra_graph_conv(x, y), tetra_graph_escape(x, y)import matplotlib.pyplot as pltfor r in range(len(escape)):  for c in range(len(escape[0])):    if escape[r][c] is None:      escape[r][c] = -100escape[460][250]plt.contour(escape)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python