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つのファイルをバッチファイルとして読み込んで実行する。

2014年12月1日月曜日

wxMaximaで2次元球面の計量テンソルを計算する

2次元球面のパラメータ付け

二次元球面S2 = { (x,y,z) | x2+y2+z2=r2 } (ただしrは定数)におけるパラメータ付けを
  • x = r sinθ cosφ
  • y = r sinθ sinφ
  • x = r cosθ
とする。これはwxMaximaでは

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

とx,y,zを定義できる。


自然基底の作成

x,y,zをθで微分した結果をx1,y1,z1とすると

(%i4) define(x1(\theta,\phi),diff(x(\theta,\phi),\theta))$
(%i5) define(y1(\theta,\phi),diff(y(\theta,\phi),\theta))$
(%i6) define(z1(\theta,\phi),diff(z(\theta,\phi),\theta))$

同様にx,y,zをφで微分した結果x2,y2,z2は

(%i7) define(x2(\theta,\phi),diff(x(\theta,\phi),\phi))$
(%i8) define(y2(\theta,\phi),diff(y(\theta,\phi),\phi))$
(%i9) define(z2(\theta,\phi),diff(z(\theta,\phi),\phi))$

として定義する。
これらをベクトルとしてまとめることで、自然基底e1,e2を次のように定義する。

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


計量テンソルの計算

e1とe2をそれぞれ内積をとって、trigsimpで三角関数の式を簡単化する。

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

計量テンソルの計算ができた。ためしに、

(%i15) E(\theta,\phi);

などとすれば、Eの式を確認できる。


バッチファイルで一気に実行

次のような上で入力した式を記したwxMaximaのバッチファイルを用意する。ファイル名は2sphere.mac。

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))$

「ファイル(F)」 > 「バッチファイル(B)」から、用意したバッチファイル(2sphere.mac)を選ぶ。

一気に実行されるので、その後参照したい式を入力する。下のスクリーンショットは%i16から%i18が手で入力した式。


次回はwxMaximaでガウス曲率の計算。

2014年11月2日日曜日

2次元球面のリーマン曲率テンソルなど

 空間の曲がり具合を表す量として曲率がある。ここではリーマン曲率テンソル、リッチテンソル、リッチスカラーを2次元球面について計算してみる。
  R3における2次元球面S2の定義とパラメータ付けをこの回と同じにする。パラメータの記号をu1 = θ、u2 = φとする。
以下でリーマン曲率テンソル、リッチテンソル、リッチスカラーの計算を行う。その際、前回計算した2次元球面におけるクリストッフェル記号の値を使う。添字にはアインシュタインの規約を適用するものとする。

リーマン曲率テンソルの計算

リーマン曲率テンソルは定義の仕方によって正負が異なるが、ここでは以下のように定義する。

これは、第3,4添字について交代なので

が成り立つ。そこで第1,2添字が(1,1),(1,2),(2,1),(2,2)の場合を計算する。
曲面の場合はリーマン曲率テンソルの独立成分は1つだが、後々の計算のため他の成分も求めてみる。
R1121については、


R1221については、


R2112については、


R2212については、


リッチテンソルの計算

リッチテンソルを次の式で定義する。これも他の本では正負の異なる定義をしているため注意が必要。


上で計算したリーマン曲率テンソルを使うと、R11,R12,R21,R22は






これらを行列に配置すると


リッチスカラーの計算

リッチスカラーを次の式で定義する。


これを2次元球面で計算すると次のようになる。


2014年10月27日月曜日

2次元球面のクリストッフェル記号

R3における2次元球面S2の定義とパラメータ付けを前回と同じにする。パラメータの記号をu1 = θ、u2 = φとする。またS2の接平面をTS2とする。
以下でクリストッフェル記号の計算を行う。添字にはアインシュタインの規約を適用するものとする。

クリストッフェル記号の定義

この項目の流れは「テンソル解析(田代嘉宏著)」p.205を参考にしている。
点P(u1,u2) と点P'(u1+du1,u2+du2) における自然基底 { e1(P), e2(P) } と { e1(P'), e2(P') } は一般には異なるため、



とおく。このベクトル dTS2ej (ただし j = 1, 2) をPにおける自然基底で表す。



ここで、係数 ωij を duk により、



とおく。この係数 Γijk(iとjは対称) がクリストッフェル記号である。

クリストッフェル記号の計算

クリストッフェル記号と計量テンソル gij には、



の関係が成り立つ(「テンソル解析」p.205-206またはWikipedia「クリストッフェル記号」を参照)。これを使って2次元球面におけるクリストッフェル記号を計算する。
i = 1 とすると以下のように計算を進められる。このとき gij = 0 ( i ≠ j のとき) であることから、 l = i = 1 の項だけが残ることに気をつける。



これを行列表示して前回計算した gij を使うと、



となる。同様に i = 2 の場合についても計算すると、





以上で2次元球面におけるクリストッフェル記号を計算できた。

自然基底の微小変化

2次元球面のクリストッフェル記号が分かったため、それを使うと「クリストッフェル記号の定義」にある dTS2ej (ただし j = 1, 2) を以下のように計算することができる。





この dTS2e1 の結果から次のことが分かる。e1の変化は、θが0とπに近いときφの変化によってe2方向に大きい。
また、dTS2e2 の結果からは次のことが分かる。e2は、 θ = π/4, 3π/4 のときφの変化でe1方向にずれる。またθが0とπに近いときθの変化でe2方向に大きく変化する。

次はリーマン曲率テンソル、リッチテンソル、リッチスカラーの2次元球面における計算を行ってみたい。