仮想計算機構

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

【Sage】Hopf fibration 系の話題でよく見かける図を再現してみる

タイトル通りです。

基本となる式は


\|z_0\|^2+\|z_1\|^2=1

です。これを満たす z_0,z_1\in C^2 は下記のように表せます。


z_0=\exp(i\frac{u+v}{2})\sin(\eta)\\
z_1=\exp(i\frac{u-v}{2})\cos(\eta)

また、複素数なので下記のように表すこともできます。


z_0=w+ix\\
z_1=y+iz

このとき w,x,y,z は以下のとおりです。


w=\cos(\frac{u+v}{2})\sin(\eta)\\
x= \sin(\frac{u+v}{2})\sin(\eta)\\
y= \cos(\frac{u-v}{2})\cos(\eta)\\
z=\sin(\frac{u-v}{2})\cos(\eta)

下記の操作によって三次元空間での様子を可視化します。


p(u,v,\eta)=(\frac{x}{1-w}, \frac{y}{1-w}, \frac{z}{1-w})

検証⓪ \eta が固定 u,v が連続の場合

\eta=\frac{\pi}{10} とします。

プログラム
eta = pi/10
u,v=var('u,v')
parametric_plot3d((lambda u,v:sin((u+v)/2)*sin(eta)/(1-cos((u+v)/2)*sin(eta)), 
                   lambda u,v:cos((u-v)/2)*cos(eta)/(1-cos((u+v)/2)*sin(eta)), 
                   lambda u,v:sin((u-v)/2)*cos(eta)/(1-cos((u+v)/2)*sin(eta))),
                   (u, 0, 4*pi),
                   (v, 0, 2*pi))
実行結果


検証① u が連続 v が離散値をとる場合

検証⓪と同様に \eta=\frac{\pi}{10} とします。

プログラム
eta = pi/10
vs = [pi*i/36 for i in range(72)]
p = [parametric_plot3d((lambda u:sin((u+v)/2)*sin(eta)/(1-cos((u+v)/2)*sin(eta)), 
                   lambda u:cos((u-v)/2)*cos(eta)/(1-cos((u+v)/2)*sin(eta)), 
                   lambda u:sin((u-v)/2)*cos(eta)/(1-cos((u+v)/2)*sin(eta))),
                   (u, 0, 4*pi)) for v in vs]
sum(p)
実行結果


検証② u が連続 \eta,vが離散をとる場合

重なるとわかりにくいので \eta の値で色分けします。

プログラム
p = []
n = 5
colors = ['yellow','blue','green','red','purple']
for k in range(n):
    eta = pi*k/10
    p.extend([parametric_plot3d( (lambda u:sin((u+v)/2)*sin(eta)/(1-cos((u+v)/2)*sin(eta)), 
                        lambda u:cos((u-v)/2)*cos(eta)/(1-cos((u+v)/2)*sin(eta)), 
                        lambda u:sin((u-v)/2)*cos(eta)/(1-cos((u+v)/2)*sin(eta))),
                      (u, 0, 4*pi), color=colors[k%n], plot_points=200) for v in vs])
sum(p)
実行結果

なんかそれっぽいものができます。

拡大してみると黄色の円(\eta=0)が見えます。

さて、とりあえず本稿の目標は達成しました。Hopf fibration については今後も調べて記事にしていこうと思います。