仮想計算機構

IT業界と無縁な派遣社員のブログ

SageMathによるカラビヤウ多様体の可視化

はじめに

面白いブログ記事を見つけました。

カラビヤウ多様体の可視化については色々情報がありますが、一番とっつきやすい情報源だったので、思いっきり活用させていただこうかと思います。引用元ではJavaScriptを使っているようです。今回はSageを使います。

SageMath - Open-Source Mathematical Software System

準備

ダウンロード済みの SageMath 9.2 Shell を起動します。

f:id:riverta1992:20201205200107p:plain

sageと打ち込みます。

f:id:riverta1992:20201205200409p:plain

以下の状態になったら準備OKです。

f:id:riverta1992:20201205200443p:plain

プログラム

以下のプログラムを作成し、sage にロードして使っていきます。

def calabi(n,a,k1,k2,color,np,flag):
    u,v=var('u,v')
    f = (lambda u,v:(exp(CC(0,1)*2*pi*k1/n)*cos(u+CC(0,1)*v)^(2/n)).real(),
           lambda u,v:(exp(CC(0,1)*2*pi*k2/n)*sin(u+CC(0,1)*v)^(2/n)).real(),
           lambda u,v:(exp(CC(0,1)*2*pi*k1/n)*cos(u+CC(0,1)*v)^(2/n)).imag()*cos(a)
           +(exp(CC(0,1)*2*pi*k2/n)*sin(u+CC(0,1)*v)^(2/n)).imag()*sin(a))

    return parametric_plot3d(f,(u,0,pi/2),(v,-pi/2,pi/2),plot_points=[np,np],rgbcolor=color,mesh=flag)

def calabi_plots(n,a,np,flag):
    p_list = []
    for i in range(n):
        for j in range(n):
            p_list.append(calabi(n,a,i,j,Color((6*i+j)*10*pi/180,0.7,0.7,space='hsl'),np,flag))
    return p_list

n は多様体の次元、k1 と k2 はそれぞれ 0 から n-1 までの値をとります。k1 と k2 のパターンの取り方によって図を色分けするようなコードにしました。

実行結果

sage: load("calabi.sage")

n=3 の場合をみてみましょう。

sage: l = calabi_plots(3,0,10,True)

k1とk2がとるパターンはn×nとなるので、n=3の場合は9個の図を可視化する必要があります。作成した calabi_plots は可視化に必要な9個のグラフィックスオブジェクトをリストとして返します。

sage: len(l)
9

9個のうち、1つを可視化してみます。

sage: l[0]
Launched html viewer for Graphics3d Object

f:id:riverta1992:20201205201707p:plain

1つ目の図にもう1つ図を追加してみます。

sage: l[0]+l[1]
Launched html viewer for Graphics3d Object

f:id:riverta1992:20201205202503p:plain

9個すべて可視化する場合は以下のような書き方が可能です。

sage: sum(l)
Launched html viewer for Graphics3d Object

f:id:riverta1992:20201205202623p:plain

n=6 の場合

n=3の場合とやり方は同じです。

sage: sum(calabi_plots(6,0,10,True))
Launched html viewer for Graphics3d Object

f:id:riverta1992:20201205203119p:plain