Published on

カラビ・ヤウ多様体を可視化

Authors

NOTE

本記事には複数の PNG 画像や GIF アニメーションが含まれています. ファイルサイズの関係で, 読み込みに時間がかかったり, GIF の再生がスムーズでない場合がありますのでご了承ください.

方針

基本的に, Visualizing Calabi-Yau Manifolds に従ってカラビ・ヤウ多様体を描画する.

以下を満たす複素数 z1,z2z_{1},z_{2} の集合を 33 次元空間に投影する.

z1n+z2n=1,nZ\begin{equation*} z_{1}^{n}+z_{2}^{n}=1,\quad n\in\mathbb{Z}\tag{$\ast$} \end{equation*}

()(\ast) を満たす z1,z2z_{1},z_{2} は媒介変数 z,yz,y を用いて以下のように表現できる.

{z1=eiϕ1cos2n(x+iy)z2=eiϕ2sin2n(x+iy)\left\{ \begin{array}{l} z_{1}=e^{i\phi_{1}}\cos^{\frac{2}{n}}(x+iy)\\[2ex] z_{2}=e^{i\phi_{2}}\sin^{\frac{2}{n}}(x+iy) \end{array} \right.

ここで,

0x<π2,π2y<π2.\begin{equation*} 0\leq x<\dfrac{\pi}{2},\quad -\dfrac{\pi}{2}\leq y<\dfrac{\pi}{2}. \end{equation*}

また, ϕ1,ϕ2\phi_{1},\phi_{2} は位相であり, 以下のように表現できる.

{ϕ1=2πk1n,k1{xxZ,0x<n}ϕ2=2πk2n,k2{xxZ,0x<n}\left\{ \begin{array}{l} \phi_{1}=\dfrac{2\pi k_{1}}{n},\quad k_1 \in \{ x \mid x \in \mathbb{Z}, 0 \leq x < n \} \\[2ex] \phi_{2}=\dfrac{2\pi k_{2}}{n},\quad k_2 \in \{ x \mid x \in \mathbb{Z}, 0 \leq x < n \} \end{array} \right.

しかし, 現状では z1,z2z_{1},z_{2} の集合は 44 次元であるため, Im(z1),Im(z2)\mathrm{Im}(z_{1}),\mathrm{Im}(z_{2}) の次元を削減し, 33次元空間上の点

(Re(z1),Re(z2),Im(z1)cosa+Im(z2)sina)\begin{equation*} (\mathrm{Re}(z_{1}),\mathrm{Re}(z_{2}),\mathrm{Im}(z_{1})\cos a+\mathrm{Im}(z_{2})\sin a) \end{equation*}

に投影する. ただし, 0a<2π0\leq a<2\pi.

実装

パッケージの読み込み及びフォント設定

using Plots
using LaTeXStrings
plot_font = "Computer Modern"
default(fontfamily=plot_font, linewidth=1, label=nothing, grid=true)

3次元空間上の点を計算

function coordinate(x, y, n, k1, k2, a)
    z1 = exp(im * 2 * π * k1 / n) * (cos(x + im * y))^(2 / n)
    z2 = exp(im * 2 * π * k2 / n) * (sin(x + im * y))^(2 / n)

    return real(z1), real(z2), imag(z1) * cos(a) + imag(z2) * sin(a)
end

3次元空間に描画

33 次元空間への描画において, (x,y),(x+dx,y),(x+dx,y+dy),(x,y+dy)(x,y),(x+dx,y),(x+dx,y+dy),(x,y+dy) を頂点とする短形を描画することで曲面を描画する.

function calabi_yau(n, a)
    dx = π / 100
    dy = π / 100

    x_vals = Float64[]
    y_vals = Float64[]  
    z_vals = Float64[]

    @inbounds for k1 in 0:n-1
        for k2 in 0:n-1
            for x in 0:dx:π/2
                for y in -π/2:dy:π/2
                    x1, y1, z1 = coordinate(x, y, n, k1, k2, a)
                    x2, y2, z2 = coordinate(x + dx, y, n, k1, k2, a)
                    x3, y3, z3 = coordinate(x + dx, y + dy, n, k1, k2, a)
                    x4, y4, z4 = coordinate(x, y + dy, n, k1, k2, a)

                    push!(x_vals, x1, x2, x3, x4)
                    push!(y_vals, y1, y2, y3, y4)
                    push!(z_vals, z1, z2, z3, z4)
                end
            end
        end
    end

    plot3d(x_vals, y_vals, z_vals, seriestype=:scatter, marker=false, legend=false, size=(800, 800))
end

実行

n=3,a=π2n=3,a=\dfrac{\pi}{2} として実行する.

calabi_yau(3, π/2)
calabi

n=2,3,4,5n=2,3,4,5 の場合を比較すると以下のようになる (ただし, a=1.95a=1.95).

a = 1.95
cy1 = calabi_yau(2, a)
cy2 = calabi_yau(3, a)
cy3 = calabi_yau(4, a)
cy4 = calabi_yau(5, a)

plot(cy1, cy2, cy3, cy4, layout=4, title=[L"n=2" L"n=3" L"n=4" L"n=5"], dpi=300)
calabi02
見づらい...
  • n=2n=2 calabi03
  • n=3n=3 calabi04
  • n=4n=4 calabi05
  • n=5n=5 calabi06

3Dモデル作成

WARNING

ここから先はほとんど Julia 関係ないです...

先ほどのコードを修正して, 3Dデータ (.obj) を生成する.

Code (Solid)
using MeshIO
using FileIO
using GeometryBasics

function coordinate(x, y, n, k1, k2, a)
    z1 = exp(im * 2 * π * k1 / n) * (cos(x + im * y))^(2 / n)
    z2 = exp(im * 2 * π * k2 / n) * (sin(x + im * y))^(2 / n)

    return real(z1), real(z2), imag(z1) * cos(a) + imag(z2) * sin(a)
end

function save_calabi_yau_to_obj(x_vals, y_vals, z_vals, filename)
    points = [Point3f0(x, y, z) for (x, y, z) in zip(x_vals, y_vals, z_vals)]

    faces = [QuadFace(i, i+1, i+2, i+3) for i in 1:4:length(points)-3]
    mesh = GeometryBasics.Mesh(points, faces)

    save(filename, mesh)
end

function calabi_yau(n, filename)
    a = pi/2
    dx = π / 100
    dy = π / 100

    x_vals = Float64[]
    y_vals = Float64[]
    z_vals = Float64[]

    @inbounds for k1 in 0:n-1
        for k2 in 0:n-1
            for x in 0:dx:π/2
                for y in -π/2:dy:π/2
                    x1, y1, z1 = coordinate(x, y, n, k1, k2, a)
                    x2, y2, z2 = coordinate(x + dx, y, n, k1, k2, a)
                    x3, y3, z3 = coordinate(x + dx, y + dy, n, k1, k2, a)
                    x4, y4, z4 = coordinate(x, y + dy, n, k1, k2, a)

                    push!(x_vals, x1, x2, x3, x4)
                    push!(y_vals, y1, y2, y3, y4)
                    push!(z_vals, z1, z2, z3, z4)
                end
            end
        end
    end

    save_calabi_yau_to_obj(x_vals, y_vals, z_vals, filename)
end
calabi_yau(3, "calabi_solid.obj")

3Dホログラム作成

上記で生成した3Dデータ (calabi_solid.obj) をもとに, Blender でホログラムを作成する. なお, 作成手順に関しては省略する.

3Dホログラム作成の様子
blend01
blend02
calabi

こんな感じの置物が欲しい... 誰か実機を作成してください.