2015年12月30日水曜日

2次元球面上のベクトル場の発散(div)

球面上のベクトル場の発散の公式

2次元球面S2上に自然基底{e1, e2}が張られているとする。(u1,u2) = (θ,Φ)によるパラメータ付け、自然基底、計量テンソルはここと同じものとする。
S2上のベクトル場v = v1e1 + v2e2(反変成分表示)に対して、発散divvは次の公式で計算できる。
ただしgは、計量テンソルの行列[gij]の行列式で、|g|はそれの絶対値である(gが零にならない理由)。



計算例

球面上のベクトル場vを反変成分表示で、
v = v1e1 + v2e2 = sinθe1 + 0e2
とする。これは図で表すと次のようになる。



この図では、x軸、y軸、z軸それぞれの正の方向を赤、緑、青で表している(左手系)。

0<θ< πのためg>0となることから、√|g|は



のように計算できる。よって発散divvは、



である。

計算結果から分かること

球面のz>0部分を北半球、z<0部分を南半球、z=0の部分を赤道ということにする。
また、z軸と球面の交点でz>0の点を北極、z<0の点を南極ということにする。

北極に近づくにつれ、ベクトル場の湧き出しが大きくなる。南極に近づくにつれ、ベクトル場の吸い込みが大きくなる。赤道上のベクトル場は平行なので湧き出しも吸い込みもない。

2015年10月14日水曜日

2次元球面上のベクトル場の回転(rot)

球面上のベクトル場の回転の定義

2次元球面S2上に自然基底{e1, e2}が張られているとする。(u1,u2) = (θ,Φ)によるパラメータ付け、自然基底、計量テンソルはここと同じものとする。
S2上のベクトル場v = v1e1 + v2e2(共変成分表示)に対して、回転rotvを次の式で定義する。
ただし∇1と∇2は共変微分である。


行列に配置すると見やすい。

計算例

球面上のベクトル場vを反変成分表示で、
v = v1e1 + v2e2 = 0e1 + sinθe2
とする。これは図で表すと次のようになる。


この図では、x軸、y軸、z軸それぞれの正の方向を赤、緑、青で表している(左手系)。θが0(球面のz軸正付近)に近づくにつれ、vの大きさが0に近い値になり、矢印も小さくなっている。また、vの向きはx軸の正の方向からy軸の正の方向に沿った向きになっている。これはe2がΦに沿った向きだからである。

共変成分表示と反変成分表示の変換のため、次のように自然基底の添字の上げ下げを用意する。


これを使って、まずは上で定義されたvを共変成分表示に直すと、


先ほどのベクトル場の回転の定義より、


ここで、共変成分の回転のときは共変微分を偏微分に置き換えられることを使った。
ここに現れる成分は0<θ<π/2で正、π/2<θ<πで負になることが次のグラフからわかる。


また、添字が上付きの自然基底は

のように添字下付きの自然基底で構成される。ここで[gij]は、計量テンソルの行列[gij]の逆行列。

計算結果から分かること

球面のz>0部分を北半球、z<0部分を南半球、z=0の部分を赤道ということにする。
また、z軸と球面の交点でz>0の点を北極、z<0の点を南極ということにする。

e1はθに沿う向きなので、北極から南極への向きである。
e2はΦに沿う向きなのでx軸正の方向からy軸正の方向への向きである。
よって、e1e2e1からe2へと回転する向きである(上の球面上のベクトル場の画像では左手系なので原点をみて時計回りの向き)。

これらを踏まえると、上記の計算結果から次のことがいえる。
rotvは北半球では係数が正なのでe1e2と同じ向き、南半球では係数が負なのでe1e2と逆向き。

これは風車に例えると次の考えに対応している。北半球に風車を(回転軸が球面に垂直になるように)置いたとすると、北極側のvの大きさより赤道側のvの大きさの方が大きいため、(左手系で原点を見て)時計回りに風車は回転する。南半球に置いた場合は同様に考えると逆向きに回転する。

2015年5月26日火曜日

GIMPでガイド(見当線)が動かないとき

GIMPを使っていると、下の図のようにガイド(見当線)が動かなくなることがある。


そのようなときは、次の図のように赤で囲んだ箇所を上から順にクリックしていくとガイド(見当線)を再び動かすことができる。


ちなみにGIMPはx86版でバージョンが2.6.12のものを使用している。

2015年3月13日金曜日

WindowsにwxGladeをインストールしたが起動しないとき

wxPythonのGUIデザイナーであるwxGladeをインストールしてみた。
最初起動しなかったのだが、解決したのでここに残しておく。

1. 実行環境と問題点

実行環境は次の通り

Windows7 (64bit)
Python 2.7.3 (x64)
wxPython 3.0.2.0 (x64)

これに wxGlade 0.7.0 をインストールしたが起動しなかった。

2. 原因

wxGladeがインストールされた場所(C:\ProgramFiles (x86)\wxGlade)で、次のコマンドを実行したことから解決策が見つかった。

 python wxglade.py

このとき、次のエラーメッセージが表示された。

IOError: [Errno 2] No such file or directory: 'C:\\Users\\UserName\\AppData\\Roaming\\wxglade\\wxglade.log'

wxGladeが起動するときに、アクセスしようとしている場所にwxgladeというフォルダが無いため失敗しているだけだった。

3. 解決策

C:\Users\UserName\AppData\Roaming に wxglade というフォルダを作成する。
するとwxGladeが起動するようになった。(AppDataフォルダは隠しフォルダ)

2015年2月20日金曜日

pベクトルの内積とその計算例

pベクトルの内積の定義

R を実数の集合とする。 V がベクトル空間で dimV = n とし、x, y ∈ V について非退化内積 < x | y > ∈ R が定義されているとする。 p = 1, ..., n について ∧p V の要素をpベクトル(p-vector, multivector)という。 ∧p V 上の内積 <・|・>p を u1 , ... , up , v1 , ... , vp ∈ V について、以下の特徴をもつ双線形写像として定義する。

p = 0 のときは ∧0 V = R の基底 1 について、

 をみたし双線形になるよう、∧0 V 上の内積 <・|・>0 を定義する。

3次元ベクトル空間における計算例

例えばこの内積は ∧2 R3 の基底の場合に次のように計算できる。
ここで、< e1 | e1 > = < e2 | e2 > = < e3 | e3 > = 1 , < ei | ej > = 0 (i,j = 1,2,3 で i ≠ j) とする。


他の基底についても同様に計算ができ、まとめると次のようになる。
それ以外の基底については

この結果を使うと、一般に ∧2 R3 の元

の内積を計算できる。定義の双線形性から
のようになる。

n次元ベクトル空間における計算例

今度は V をn次元ベクトル空間とするとき、∧n V の基底について計算してみる。
V の内積 <・|・> は非退化内積とし、 V の基底 e1, ... , en を考える。この基底は、i = 1, ... , n について < ei | ei > = 1、 i≠j となる i,j = 1, ... , n について < ei | ej > = 0 をみたすものとする。 この基底のうち、< ei | ei > = 1 となる ei の個数を r、< ei | ei > = -1 となる ei 個数を s とする。
このとき、∧n V の基底 e1∧...∧en の内積は、
と計算できる。

2015年1月30日金曜日

BochsをUbuntuにインストールする

PCエミュレータのBochsをデバッグモードでUbuntu14.04(32bit)にインストールしてみた。apt-getではうまくいかなかったため、ソースからビルドする方法をここに残す。Bochsの動作を確かめるのにFreeDOSを使ってみた。

Bochsをソースでダウンロードして、解凍する

Bochsのページ(http://bochs.sourceforge.net/)ヘアクセスして「SourceForge project page」のリンクをたどる。



ここではbochs-2.6.2をインストールするため下の図の「bochs」のリンクをたどり、


「2.6.2」をたどり、


bochs-2.6.2.tar.gzをダウンロードする。



以下のように、ダウンロードしたファイルをホームディレクトリに解凍する($はプロンプト)

$ cd ~
$ gzip -dc ./Downloads/bochs-2.6.2.tar.gz | tar xf -

Bochsのビルドと環境変数の設定

解凍したディレクトリに移動し、

$ cd ./bochs-2.6.2/

次の条件が満たされるように
  • インストールがホームディレクトリのbochsディレクトリになされるよう(--prefix=$HOME/bochs)
  • x86_64アーキテクチャをサポートするように(--enable-x86-64)
  • Bochsがデバッグモードでビルドされるように(--enable-debugger --enable-disasm)
configureを実行する。(./configure --helpでオプションの一覧を見ることができる。)

$ ./configure --prefix=$HOME/bochs --enable-x86-64 --enable-debugger --enable-disasm

その後、ビルドする。

$ make

しかし、「シンボルpthread_create@@GLIBC_2.1が見つからない」とエラーがでるので、Makefileの96行目

X_LIBS = -lX11    -lXrandr



X_LIBS = -lX11    -lXrandr -pthread

に変更して、再度ビルドする。

$ make

ビルドが終わったら、次でインストールが完了する。上のconfigureの--prefixオプションで指定したディレクトリにインストールされる。

$ make install

またBochsの動作を設定するためのファイル.bochsrcをホームディレクトリにコピーしておく。

$ cp ./.bochsrc ~/

Bochsの起動を簡単にするために.bashrcに次の追記をして環境変数を設定しておく

PATH=$PATH:$HOME/bochs/bin
export PATH

PATHをすぐに反映させるためには

$ source ~/.bashrc

を実行する。

FreeDOSをダウンロードして配置する

Bochsの実行を確認するためにFreeDOSというOSを使う。フロッピーディスクイメージでダウンロードしてBochsで動作させてみる。FreeDOSのページ(http://www.freedos.org/)から以下のようにリンクをたどってダウンロードする。


下の方からフロッピーディスクイメージをダウンロードできる。ファイル名はfdboot.img


ダウンロード後、そのイメージファイルをホームディレクトリに配置すると実行まであともう少し。

$ cd ~/
$ cp ./Downloads/fdboot.img ~/


Bochsの設定ファイル.bochsrcを修正する

そのまま実行するとエラーがが出て実行が中断される。そこで設定ファイルを以下のように修正する。設定ファイル内に説明や設定の例があるので、それを参考に設定していけばよい。
まずは、192,193行目の

cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpu: cpuid_limit_winnt=0



#cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
#cpu: cpuid_limit_winnt=0
cpu: model=turion64_tyler

にしてcpuを変更(#はコメントアウト)。
先ほどホームディレクトリに配置したFreeDOSをフロッピーAに設定するため、435行目付近の

floppya: 1_44=/dev/fd0, status=inserted

を同様に#でコメントアウトし、その下の行に

floppya: 1_44=/home/username/fdboot.img, status=inserted

を追記。
ハードディスクを無しにするため、522行目付近の

ata0-master: type=disk, mode=flat, path="30M.sample"

を#でコメントアウト。
542,543行目付近の

#boot: floppy
boot: disk



boot: floppy
#boot: disk

に変更してフロッピーからOSが起動するようにした。

Bochsの実行

$ bochs

でBochsを実行すると、

Please choose one: [6]

と尋ねられるので、Enterでbochsのシミュレーションをスタートさせる。bochsのシミュレーション用の画面が表示されたところでデバッグのブレイクがかかるので、コンソールでcを入力するとシミュレーションを続けられる。下の図はBochs上でFreeDOSが起動したところ。



2015年1月21日水曜日

wxMaximaで2次元球面のガウス曲率を計算する

前回の計算を発展させて2次元球面のガウス曲率を計算してみる。

本体で読み込むライブラリを作成する

前回と同様、2sphere.macが次の内容だとする。これを「c:\Users\username\Documents\maxima」フォルダ内に置く。

x(\theta,\phi):=r*sin(\theta)*cos(\phi)$
y(\theta,\phi):=r*sin(\theta)*sin(\phi)$
z(\theta,\phi):=r*cos(\theta)$

define(x1(\theta,\phi),diff(x(\theta,\phi),\theta))$
define(y1(\theta,\phi),diff(y(\theta,\phi),\theta))$
define(z1(\theta,\phi),diff(z(\theta,\phi),\theta))$

define(x2(\theta,\phi),diff(x(\theta,\phi),\phi))$
define(y2(\theta,\phi),diff(y(\theta,\phi),\phi))$
define(z2(\theta,\phi),diff(z(\theta,\phi),\phi))$

e1(\theta,\phi):=[x1(\theta,\phi),y1(\theta,\phi),z1(\theta,\phi)]$
e2(\theta,\phi):=[x2(\theta,\phi),y2(\theta,\phi),z2(\theta,\phi)]$

E(\theta,\phi):=trigsimp(e1(\theta,\phi).e1(\theta,\phi))$
F(\theta,\phi):=trigsimp(e1(\theta,\phi).e2(\theta,\phi))$
G(\theta,\phi):=trigsimp(e2(\theta,\phi).e2(\theta,\phi))$



また、3次元ベクトル空間でクロス積とベクトルの大きさを計算できるようにしたい。次の内容のvector3cross.macを作る。これを上のファイルと同じ「c:\Users\username\Documents\maxima」フォルダ内に置く。

cross(a,b):=[a[2]*b[3]-a[3]*b[2],a[3]*b[1]-a[1]*b[3],a[1]*b[2]-a[2]*b[1]]$
norm(v):=sqrt(v.v)$


ガウス曲率を計算する本体を作成する

最後に、ガウス曲率を計算する2sphere2.macを以下の内容で作成する。上で定義した2つのファイルを利用する。

?xchdir("c:/Users/username/Documents/maxima")$
batch("vector3cross.mac")$
batch("2sphere.mac")$

n(\theta,\phi):=trigsimp(cross(e1(\theta,\phi),e2(\theta,\phi)))$
e3(\theta,\phi):=n(\theta,\phi)/(sin(\theta)*r^2)$

define(x11(\theta,\phi),diff(x1(\theta,\phi),\theta))$
define(y11(\theta,\phi),diff(y1(\theta,\phi),\theta))$
define(z11(\theta,\phi),diff(z1(\theta,\phi),\theta))$

define(x12(\theta,\phi),diff(x1(\theta,\phi),\phi))$
define(y12(\theta,\phi),diff(y1(\theta,\phi),\phi))$
define(z12(\theta,\phi),diff(z1(\theta,\phi),\phi))$

define(x22(\theta,\phi),diff(x2(\theta,\phi),\phi))$
define(y22(\theta,\phi),diff(y2(\theta,\phi),\phi))$
define(z22(\theta,\phi),diff(z2(\theta,\phi),\phi))$

e11(\theta,\phi):=[x11(\theta,\phi),y11(\theta,\phi),z11(\theta,\phi)]$
e12(\theta,\phi):=[x12(\theta,\phi),y12(\theta,\phi),z12(\theta,\phi)]$
e22(\theta,\phi):=[x22(\theta,\phi),y22(\theta,\phi),z22(\theta,\phi)]$

L(\theta,\phi):=trigsimp(e11(\theta,\phi).e3(\theta,\phi))$
M(\theta,\phi):=trigsimp(e12(\theta,\phi).e3(\theta,\phi))$
N(\theta,\phi):=trigsimp(e22(\theta,\phi).e3(\theta,\phi))$

K(\theta,\phi):=trigsimp((L(\theta,\phi)*N(\theta,\phi)-M(\theta,\phi)^2)/(E(\theta,\phi)*G(\theta,\phi)-F(\theta,\phi)^2))$


実行と計算結果の確認方法

wxMaximaを起動して、「ファイル(F)」 > 「バッチファイル(B)」から、用意したバッチファイル(2sphere2.mac)を選ぶ。すると一連の計算が実行される。

計算したガウス曲率Kの値を見たいときは、読み込んだ後に
K(\theta,\phi);
と入力すれば(;の後はShift+Enterを入力する)、ガウス曲率の値が表示される。


本体ファイルの説明

?xchdir("c:/Users/username/Documents/maxima")$ は、カレントフォルダを変更する。Lisp で定義されている関数 xchdir を Maxima から呼び出して利用する

batch("vector3cross.mac")$
batch("2sphere.mac")$
は、最初に定義した2つのファイルをバッチファイルとして読み込んで実行する。