マンデルブロ集合とジュリア集合

Here’s the Japanese translation for your detailed description:

PGFplots.netの開始後、私はpgfplotsでさらに実験をしました。私がいつものように各グラフィックソフトウェアで行うように、フラクタルをどのように表現できるか、そしてそれによって有用または興味深い側面があるかどうかを考えました。ここでは速度やメモリスペースは二次的なもので、時間とともに容量は変わります。

私が興味を持っているのは、例えば

  • 反復的に定義された関数を渡してプロットできるか
  • イテレーション数のように、カラーマップ(colormaps)を利用できるか
  • イテレーション関数システム(IFS、バーンズリー・ファーンなど)のように、幾何学的変換がうまく使えるか
  • 三次元でも可能か

以下では、Luaで実装されたアルゴリズムを使用してマンデルブロ集合をプロットします。LaTeXで表現すると、以下のようになります:

Algorithm printed with LaTeX

次のコードはLuaとpgfplotsを使用した実装です:

%!TEX lualatex
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{width=7cm, compat=1.18}
\usepackage{luacode}
\begin{luacode}
  function mandelbrot(cx, cy, imax, smax)
    local x, y, x1, y1, i, s
    x, y, i, s = 0, 0, 0, 0
    while (s <= smax) and (i < imax)  do
      x1 = x * x - y * y + cx
      y1 = 2 * x * y + cy
      x = x1
      y = y1
      i = i + 1
      s = x * x + y * y
    end
    if (i < imax) then
      tex.print(i)
    else
      tex.print(0)
    end
  end
\end{luacode}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    colorbar,
    point meta max = 30,
    tick label style = {font=\tiny},
    view={0}{90}]
    \addplot3 [surf, domain = -1.5:0.5, shader = interp,
               domain y = -1:1, samples = 150]
        { \directlua{mandelbrot(\pgfmathfloatvalueof\x,
          \pgfmathfloatvalueof\y,5000,4)} };
  \end{axis}
\end{tikzpicture}
\end{document}

samplesとimaxの値を好きなだけ高く設定してください。コンパイルにはより多くの時間がかかります。すると、次の図が得られます:

The Mandelbrot set

アルゴリズムのレイアウトとコード例については、私のLaTeX Cookbookで説明されています:https://latex-cookbook.net/chapter-11

次の修正されたコードはジュリア集合を出力します:

%!TEX lualatex
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{width=7cm, compat=1.18}
\usepackage{luacode}
\begin{luacode}
  function julia(cx, cy, imax, smax)
    local x, y, x1, y1, i, s
    i, s = 0, 0, 0, 0
    x = cx
    y = cy
    while (s <= smax) and (i < imax)  do
      x1 = x * x - y * y - 0.742
      y1 = 2 * x * y + 0.1
      x = x1
      y = y1
      i = i + 1
      s = x * x + y * y
    end
    if (i < imax) then
      tex.print(i)
    else
      tex.print(0)
    end
  end
\end{luacode}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    colormap/hot2,
    colorbar,
    axis equal,
    point meta max=50,
    tick label style={font=\tiny},
    view={0}{90}]
    \addplot3 [surf, domain = -1.82:1.82, shader = interp,
      domain y = -1.5:1.5, samples = 150] 
      {\directlua{julia(\pgfmathfloatvalueof\x,\pgfmathfloatvalueof\y,5000,4)}
    };
  \end{axis}
\end{tikzpicture}
\end{document}

samplesとimaxの値を好きなだけ高く設定してください。コンパイルにはより多くの時間がかかります。すると、次の図が得られます:

The Julia set

Leave a Reply

Your email address will not be published. Required fields are marked *