Sage多様体演習 Manifold tutorial

このワークシートはSageMathにおける微分可能多様体の取り扱いについての簡単な紹介です。以下で紹介するツールはSageManifolds プロジェクト (version 1.3, included in SageMath 8.3).を通じて実装されました。 ipnyb形式のワークシートファイルはここ からダウンロード可能です。このワークシートを実行するには、コマンドsage -n jupyterなどを使ってSageMathのJupyterノートブックインタフェースを起動する必要があります。 [訳注:この日本語版翻訳は山本 昇によって作成されました。翻訳者へのご連絡は、https://souran.kek.jp/kss/top/ を経由して、 職員情報詳細ページ内の「メール送信」リンクをご利用ください。この翻訳版作成にあたり、東海大学理学部北林さんには貴重なコメントをいただきました。この場を借りてお礼申しあげます。]

This notebook provides a short introduction to differentiable manifolds in SageMath. The tools described below have been implemented through the SageManifolds project (version 1.3, included in SageMath 8.3).

Click here to download the notebook file (ipynb format). To run it, you must start SageMath with the Jupyter notebook, via the command sage -n jupyter

[Note for Japanese version.: this document was translated into Japanese by Noboru Yamamoto. You can reach him through https://souran.kek.jp/kss/top/. "Staff Detail Information" page includes a link "send email". The translator thanks Prof. Kitabayashi of Tokai University for his valuable comments on the draft of the documents.]

このワークシートはSageMathのバージョン 7.5 (あるいはそれ以降)を必要としています、それ以前のバージョンではSageManifoldsの全ての機能が利用可能というわけではないからです。( 訳注:このjupyter notebookはSageMath 8.2を使って実行しています。)

The following assumes that you are using version 7.5 (or higher) of SageMath, since lower versions do not include all features of SageManifolds:

In [1]:
version()
Out[1]:
'SageMath version 8.3, Release Date: 2018-08-03'

最初に、ノートブックが結果をLaTexを使った数式表示で表示するようにします。

First we set up the notebook to display mathematical objects using LaTeX rendering:

In [2]:
%display latex

多様体の定義 Defining a manifold

例として、 $\mathbb{R}$上の3次元の微分可能多様体を定義します。

As an example let us define a differentiable manifold of dimension 3 over $\mathbb{R}$:

In [3]:
M = Manifold(3, 'M', latex_name=r'\mathcal{M}', start_index=1)
  • 最初の引数、3, は多様体の次元です。SageManifoldsでは任意の正の整数を指定できます。
  • 2番目の引数, 'M', は多様体の名前を与える文字列です。この名前は = 記号の左辺にあるシンボルの名前(ここではM)と 異なっていても構いません。左辺のシンボル名はコンピュータメモリのなかの多様体オブジェクトを参照しています。一方、 引数であたえる名前は、多様体に与えられた数学的な名前です。
  • 省略可能な引数、latex_name=r'\mathcal{M}' , はこの多様体をLaTeXで表示する際に使う名前を指定します。 最初の引用符の前の 'r' に注意してください。:これはこの文字列が raw 文字列であることを示しています。 それによって文字列中のバックスラッシュ '\ ' は通常の文字として取り扱われます( '\' とする必要がないということ)。 この引数(latex_name)が省略された場合は、第2引数に与えられた名前が使われます。
  • 次の省略可能な引数start_index=1は多様体のテンソル成分の指標の範囲を指定しています。これを1とすることは指標の範囲が$\{1,2,3\}$であることを示しています。この引数の既定値は start_index=0 です。
  • The first argument, 3, is the manifold dimension. In SageManifolds, it can be any positive integer.
  • The second argument, 'M', is a string defining the manifold's name; it may be different from the symbol set on the left-hand side of the = sign (here M): the latter stands for a mere Python variable, which refers to the manifold object in the computer memory, while the string 'M' is the mathematical symbol chosen for the manifold.
  • The optional argument latex_name=r'\mathcal{M}' sets the LaTeX symbol to display the manifold. Note the letter 'r' in front on the first quote: it indicates that the string is a raw one, so that the backslash character in \mathcal is considered as an ordinary character (otherwise, the backslash is used to escape some special characters). If the argument latex_name is not provided by the user, it is set to the string used as the second argument (here 'M')
  • The optional argument start_index=1 defines the range of indices to be used for tensor components on the manifold: setting it to 1 means that indices will range in $\{1,2,3\}$. The default value is start_index=0.

規定のベースフィールド(基底)は$\mathbb{R}$であることに注意してください。もし、 field='complex',が与えられていれば、複素数体$\mathbb{C}$を基底として持つ 多様体が定義されます。[list of all options を参照のこと]

Note that the default base field is $\mathbb{R}$. If we would have used the optional argument field='complex', we would have defined a manifold over $\mathbb{C}$. See the list of all options for more details.

Mを要求すると、そのLaTexのシンボルとして表示されます。

If we ask for M, it is displayed via its LaTeX symbol:

In [4]:
M
Out[4]:

代わりに print 関数を使うと、簡潔な記述が表示されます。

If we use the print function instead, we get a short description of the object:

In [5]:
print(M)
3-dimensional differentiable manifold M

type コマンドを使うと、Mに対応するPythonオブジェクトのタイプ(DifferentiableManifold_with_category)を表示できます。

Via the command type, we get the type of the Python object corresponding to M (here the Python class DifferentiableManifold_with_category):

In [6]:
type(M)
Out[6]:

category()関数を使って、多様体Mのカテゴリーを調べます。この例では、この多様体の カテゴリーは$\mathbb{R}$の上の滑らかな多様体であることがわかります。

We can also ask for the category of M and see that it is the category of smooth manifolds over $\mathbb{R}$:

In [7]:
category(M)
Out[7]:

多様体の指標(を表すgeneator)は irange() メソッドで生成されます。この指標はfor-ループなどで使われます。

The indices on the manifold are generated by the method irange(), to be used in loops:

In [8]:
for i in M.irange():
    print(i)
1
2
3

start_index パラメータが明示的に指定されていない場合、多様体の指標は 0 からはじまります、例えばこの例のように(0,1,2) の範囲となります。

If the parameter start_index had not been specified, the default range of the indices would have been $\{0,1,2\}$ instead:

In [9]:
M0 = Manifold(3, 'M', r'\mathcal{M}')
for i in M0.irange():
    print(i)
0
1
2

多様体上の座標系(chart)の定義:Defining a chart on the manifold

まずは、多様体 $\mathcal{M}$ は一つの座標系で覆われると仮定します(そうでない場合は以下で議論されます)。 座標系は次のように宣言されます。

Let us assume that the manifold $\mathcal{M}$ can be covered by a single chart (other cases are discussed below); the chart is declared as follows:

In [10]:
X.<x,y,z> = M.chart()

上式の左辺にある.<x,y,z> は Pythonの変数 x, y and zが座標系の軸名として使われることを意味します。 これにより、座標軸を名前で指定することが可能になります。

The writing .<x,y,z> in the left-hand side means that the Python variables x, y and z are set to the three coordinates of the chart. This allows one to refer subsequently to the coordinates by their names.

この例では、関数 chart() は引数をもっていません。この場合には、座標の名前は、x, yz (即ち、左辺の <...> 演算子で与えられた名前)になります。また座標の範囲は $(-\infty,+\infty)$ となります。それ以外の座標の名前やその範囲を指定する場合には chart() にそれらを引数として与えなければなりません。座標名と異なる LaTex で使われる名前を指定する場合も同様です。(以下にそのような例が示されます。)

In this example, the function chart() has no arguments, which implies that the coordinate symbols will be x, y and z (i.e. exactly the characters set in the <...> operator) and that each coordinate range is $(-\infty,+\infty)$. For other cases, an argument must be passed to chart()  to specify the coordinate symbols and range, as well as the LaTeX symbol of a coordinate if the latter is different from the coordinate name (an example will be provided below).

座標系は座標系が覆う部分多様体(ここでは多様体自身)と座標の組みで表示されます。

The chart is displayed as a pair formed by the open set covered by it (here the whole manifold) and the coordinates:

In [11]:
print(X)
Chart (M, (x, y, z))
In [12]:
X
Out[12]:

それぞれの座標値は指標を使って入手できます。指標の指定方法は多様体の定義時の設定(start_index=1)に従います。

The coordinates can be accessed individually, by means of their indices, following the convention defined by start_index=1 in the manifold's definition:

In [13]:
X[1]
Out[13]:
In [14]:
X[2]
Out[14]:
In [15]:
X[3]
Out[15]:

座標の全体は[:] 演算子を使って取得します。

The full set of coordinates is obtained by means of the operator [:]:

In [16]:
X[:]
Out[16]:

座標系定義で使った <x,y,z> 演算子のおかげで、それぞれの座標をこの名前を使って直接取り扱えます。

Thanks to the operator <x,y,z> used in the chart declaration, each coordinate can be accessed directly via its name:

In [17]:
z is X[3]
Out[17]:

座標は SageMath の記号表現になっています。

Coordinates are SageMath symbolic expressions:

In [18]:
type(z)
Out[18]:

座標の関数 Functions of the chart coordinates

実数値をもつ座標の関数 (数学的にいえば、座標の終域で定義された関数) は チャートのfunction() メソッドを使って生成されます。

Functions of the chart coordinates

Real-valued functions of the chart coordinates (mathematically speaking, functions defined on the chart codomain) are generated via the method function() acting on the chart:

In [19]:
f = X.function(x+y^2+z^3) ; f
Out[19]:
In [20]:
f.display()
Out[20]:
In [21]:
f(1,2,3)
Out[21]:

これらの関数は、SageManiforldsのクラス ChartFunction に属しています。

They belong to SageManifolds class ChartFunction:

In [22]:
type(f)
Out[22]:

そしてこのChartFunctionクラスに属する関数は、標準的な SageMath の記号的関数とは全ての演算で自動的簡約化の振る舞いが異なっています。例えば、二つの記号的関数の和:

and differ from SageMath standard symbolic functions by automatic simplifications in all operations. For instance, adding the two symbolic functions

In [23]:
f0(x,y,z) = cos(x)^2 ; g0(x,y,z) = sin(x)^2

は、次の結果になります。

results in

In [24]:
f0 + g0
Out[24]:

一方、ChartFunction クラスに属する関数は自動的に簡約化されます。

while the sum of the corresponding functions in the class ChartFunction is automatically simplified:

In [25]:
f1 = X.function(cos(x)^2) ; g1 = X.function(sin(x)^2)
f1 + g1
Out[25]:

同じ結果を記号的関数でも得るためには、simplify_trig() メソッドを使います。

To get the same output with symbolic functions, one has to invoke the method simplify_trig():

In [26]:
(f0 + g0).simplify_trig()
Out[26]:

違いは表示方法にもあります。記号関数 f0を表示させると、

Another difference regards the display; if we ask for the symbolic function f0, we get:

In [27]:
f0
Out[27]:

となりますが、座標関数 f1 を表示させると、座標表示だけが表示されます。

while if we ask for the chart function f1, we get only the coordinate expression:

In [28]:
f1
Out[28]:

f0 の場合と同じような表示を望む場合には、 display() メソッドを使います。

To get an output similar to that of f0, one should call the method display():

In [29]:
f1.display()
Out[29]:

expr()メソッドは基になる記号表現を返します。

Note that the method expr() returns the underlying symbolic expression:

In [30]:
f1.expr()
Out[30]:
In [31]:
type(f1.expr())
Out[31]:

多様体への二つ目の座標系の導入:Introducing a second chart on the manifold

まず、多様体$\mathcal{M}$の部分集合を考えましょう。たとえば、$\{y=0, x\geq 0\}$ で定義される領域の補集合 $U$ です( (y!=0, x<0) は $y\not=0$ OR $x<0$を意味していることに注意。$y\not=0$ AND $x<0$ は[y!=0, x<0]となる。)。

Let us first consider an open subset of $\mathcal{M}$, for instance the complement $U$ of the region defined by $\{y=0, x\geq 0\}$ (note that (y!=0, x<0) stands for $y\not=0$ OR $x<0$; the condition $y\not=0$ AND $x<0$ would have been written [y!=0, x<0] instead):

In [32]:
U = M.open_subset('U', coord_def={X: (y!=0, x<0)})

開部分集合$U$に制限された座標系 XX_Uと呼ぶことにします。

Let us call X_U the restriction of the chart X to the open subset $U$:

In [33]:
X_U = X.restrict(U) ; X_U
Out[33]:

$U$上の別の座標系、 $(r,\theta,\phi)$、を 導入します。

We introduce another chart on $U$, with spherical-type coordinates $(r,\theta,\phi)$:

In [34]:
Y.<r,th,ph> = U.chart(r'r:(0,+oo) th:(0,pi):\theta ph:(0,2*pi):\phi') ; Y
Out[34]:

ここでは関数 chart() は引数を持っています。それはraw文字列でLaTexのシンボルを含んでいます。また、この文字列には座標の(標準とは異なる)範囲指定が含まれています。フィールドは:で区切られており、座標は空白文字で区切られています。 座標$r$については、LaTexシンボルを指定していないので、下限と上限の二つだけが指定されています。LaTexシンボルは出力の際に使われます。

The function chart() has now some argument; it is a string, which contains specific LaTeX symbols, hence the prefix 'r' to it (for raw string). It also contains the coordinate ranges, since they are different from the default value, which is $(-\infty, +\infty)$. For a given coordinate, the various fields are separated by the character ':' and a space character separates the coordinates. Note that for the coordinate $r$, there are only two fields, since the LaTeX symbol has not to be specified. The LaTeX symbols are used for the outputs:

In [35]:
th, ph
Out[35]:
In [36]:
Y[2], Y[3]
Out[36]:

Sageが使っている座標の条件は、assumptions()メソッドを使って確認することができます。

The declared coordinate ranges are now known to Sage, as we may check by means of the command assumptions():

In [37]:
assumptions()
Out[37]:

これらの条件は、表現の簡約化の際に使われます。

They are used in simplifications:

In [38]:
simplify(abs(r))
Out[38]:
In [39]:
simplify(abs(x)) # no simplification occurs since x can take any value in R
Out[39]:

座標 $Y$が宣言されたあとで、さらに 遷移写像を指定することで、$Y$の$X_U$への関係を完全に特定することができます。

After having been declared, the chart Y can be fully specified by its relation to the chart X_U, via a transition map:

In [40]:
transit_Y_to_X = Y.transition_map(X_U, [r*sin(th)*cos(ph), r*sin(th)*sin(ph), r*cos(th)])
In [41]:
transit_Y_to_X
Out[41]:
In [42]:
transit_Y_to_X.display()
Out[42]:

set_inverse() メソッドを用いることで、遷移写像の逆写像を指定することができます。

The inverse of the transition map can be specified by means of the method set_inverse():

In [43]:
transit_Y_to_X.set_inverse(sqrt(x^2+y^2+z^2), atan2(sqrt(x^2+y^2),z), atan2(y, x))
transit_Y_to_X.inverse().display()
Out[43]:

この段階で、多様体のアトラス( user atlasであって最大アトラスではありません)は三つの座標系を含んでいます。

At this stage, the manifold's atlas (the "user atlas", not the maximal atlas!) contains three charts:

In [44]:
M.atlas()
Out[44]:

多様体に最初に定義された座標系は既定の座標系とみなされます。既定座標系はあとで、set_default_chart()メソッドを使って変更できます。

The first chart defined on the manifold is considered as the manifold's default chart (it can be changed by the method set_default_chart()):

In [45]:
M.default_chart()
Out[45]:

各々の開部分空間は各自のアトラスを持っています。開部分空間はそれ自身でも多様体であるからです。

Each open subset has its own atlas (since an open subset of a manifold is a manifold by itself):

In [46]:
U.atlas()
Out[46]:
In [47]:
U.default_chart()
Out[47]:

座標系$Y$を座標系$X$を使って表示することができます。 まずは、3次元画像のビューワーを定義しましょう。(ユーザが操作可能な3次元画像の表示には、'threejs'あるいは'jmon'を指定します。)

We can draw the chart $Y$ in terms of the chart $X$. Let us first define a viewer for 3D plots (use 'threejs' or 'jmol' for interactive 3D graphics):

In [48]:
viewer3D = 'threejs' # must be 'threejs', 'jmol', 'tachyon' or None (default)

画像は座標系$Y$で一定の座標値を持つ線を、座標系$X$に基づく"直交フレーム"中に表示します。

The plot shows lines of constant coordinates from the $Y$ chart in a "Cartesian frame" based on the $X$ coordinates:

In [49]:
graph = Y.plot(X)
show(graph, viewer=viewer3D, online=True)

コマンドplot()は多くのオプションを持っています。それらは、描画される座標線の数、スタイル、色、そして座標の範囲などを指定します。 (参照:list of all options):

The command plot() allows for many options, to control the number of coordinate lines to be drawn, their style and color, as well as the coordinate ranges (cf. the list of all options):

In [50]:
graph = Y.plot(X, ranges={r:(1,2), th:(0,pi/2)}, number_values=4, 
               color={r:'blue', th:'green', ph:'red'})
show(graph, aspect_ratio=1, viewer=viewer3D, online=True)

逆に、(制限された)座標系 $X|_{U}$ を座標系$Y$を使って表示することも可能です。この場合、座標系 $X$ の全てを表示することはできません、なぜなら $X$ の定義域(ドメイン)は $Y$ のそれより広いからです。

Conversly, the chart $X|_{U}$ can be plotted in terms of the chart $Y$ (this is not possible for the whole chart $X$ since its domain is larger than that of chart $Y$):

In [51]:
graph = X_U.plot(Y,
                               color={x:'blue',y:'green', z:'red'})
show(graph, viewer=viewer3D, online=True, axes_labels=['r','theta','phi'])

多様体上の点

多様体$\mathcal{M}$上の点は、与えられた座標系での座標を使って定義されます。

Points on the manifold

A point on $\mathcal{M}$ is defined by its coordinates in a given chart:

In [52]:
p = M.point((1,2,-1), chart=X, name='p') ; print(p) ; p
Point p on the 3-dimensional differentiable manifold M
Out[52]:

$X=(\mathcal{M}, (x,y,z))$ は既定の座標系ですから、その名前を省略することが可能です。

Since $X=(\mathcal{M}, (x,y,z))$ is the manifold's default chart, its name can be omitted:

In [53]:
p = M.point((1,2,-1), name='p') ; print