外積代数のメモ

pdf_files

\documentclass{jsbook}

\usepackage{amsmath,amssymb}
\usepackage{bm}
%\usepackage{graphicx}
\usepackage{ascmac}
\usepackage[dvips]{graphicx}
\usepackage{graphicx}
\usepackage{bigdelim,multirow}
\usepackage{amsmath,amsthm,amssymb,cases}
\usepackage{ascmac}
\usepackage{eclbkbox}
\usepackage{wrapfig}
\usepackage{listings, jlisting}
\usepackage[dvips,usenames]{color}
\usepackage{makeidx}
\usepackage{url}
\usepackage[dvipdfmx,setpagesize=false]{hyperref}
\SweaveOpts{eps=TRUE}

\lstdefinestyle{MyFrame}{backgroundcolor=\color{green},frame=shadowbox}
\lstdefinestyle{MyC++Style} {language=C++,style=MyFrame,frame=none}
\lstset{
    language=R,
    basicstyle=\ttfamily,
    backgroundcolor={\color[gray]{.85}},
    keywordstyle=\color{blue}\bfseries,
}

\begin{document}

\chapter{外積代数}\label{ExteriorAlgebra}
\section{外積と外積代数}
\ref{R_Matrix}{Rで行列を勉強する}の記事で行列の積に関連してベクトルの
外積の話題が出た。\\
その外積を一般化して出来上がる外積代数に関する記事である。\\
3次元ベクトル空間$\mathbf{R}^3$でのベクトル積(外積)は、$a=(a_1,a_2,a_3),b=(b_1,b_2,b_3)$に対して、$a \times b = (|\begin{pmatrix} a_2 & a_3 \\ b_2 & b_3 \end{pmatrix}|,|\begin{pmatrix} a_3 & a_1 \\ b_3 & b_1 \end{pmatrix}|,|\begin{pmatrix} a_1 & a_2 \\ b_1 & b_2 \end{pmatrix}|)$ という$\mathbf{R}^3$のベクトル。\\
他方、内積は$<a,b>=\sum_{i=1}^3 a_i b_i$\\
内積の定義はn次元においてもそのまま通用するが、ベクトル積はそうはなっていない。\\その理由を含めて考えると、ベクトル積・外積代数というものが出てくる。それを以下に示す\\
\section{n次元のベクトル積とべき集合の要素数}
n次元空間ベクトルがn-1個あったとき、そのベクトル積は、n次元ベクトルになる\\
今、n-1個のベクトルを$x_2,x_3,...,x_n$とし、もう一つn次元ベクトル$x_1$を置く\\
$x_1,...,x_n$を行ベクトルとする行列$X$を考えると、そのDeterminant($det(X)$)が算出できる\\
$x_2,...,x_n$のベクトル積はn次元ベクトル$v$であって、$x_1$$v$との内積は$X$のDeterminantである($<x_1,v>=det(X)$)という関係にある\\
それをRで書くと次のようになる\\
\begin{lstlisting}
library(MCMCpack)
# 複素数行列のDeterminantの計算用関数
detComplex<-function(M){
	e.out<-eigen(M)
	prod(e.out[[1]])
}
# 外積計算用関数
ExteriorProduct<-function(V){
	ret<-rep(0,length(V[1,]))
	for(i in 1:length(ret)){
		ret[i]<-(-1)^(i+1)*detComplex(V[,-i])
	}
	ret
}
# 例えばn=7次でやってみる
n<-7
# 適当に複素数を要素とする正方行列を作る
X<-matrix(complex(real = rdirichlet(1,rep(1,n^2)), imaginary = rdirichlet(1,rep(1,n^2))),ncol=n)
# Hermite化する
X<-t(Conj(X))%*%X
# Determinantを計算する
detX<-detComplex(X)
detX
# n個のベクトルから適当にn-1個を選ぶ
s<-sample(1:n,(n-1))
# 選ばれたn-1個のベクトルについて外積を計算する
ep<-ExteriorProduct(X[s,])
# 外積は長さnのベクトルである
ep
# 選ばれなかったベクトルと、選ばれたn-1個のベクトルの外積との内積を計算すると
# 選ばれなかったベクトルと選ばれたベクトルとが作る行列のDeterminantになっていることが以下の計算でわかる
sum(X[-s,]*ep)
detComplex(X)
sum(X[-s,]*ep)-detComplex(X)
\end{lstlisting}
長さnのベクトルn-1本から、長さnのベクトルが1本できた。これは、n次元空間を$V$として$V^{n-1}$から$V$へと写したもの\\
ベクトル積を一般次元に拡張する\\
ベクトル積はn次元ベクトルがn-1本集まったときに定義できた\\
n次元ベクトルがr($r<n$)本集まったときに、ベクトル積様のものとなるのが、定義できる\\
それは、n-1個のベクトルが作る$(n-1)\times n$行列からn-2列を取り出したもの(n-1通りある)が作る$(n-1)\times (n-1)$行列のDeterminantに正負を考慮したものになっている\\
このベクトル積様なものの個数は、「組み合わせ」で決まるので、べき集合の要素数(n次元ベクトルn本に対して考えれば、$2^n$)になる\\
この$2^n$個の要素たちは「代数」的に完結するので、以下のように「\href{http://ja.wikipedia.org/wiki/%E5%A4%96%E7%A9%8D%E4%BB%A3%E6%95%B0}{Wiki外積代数}」としてまとめられる(参考→\href{http://d.hatena.ne.jp/ryamada22/20060514}{こちら})\\

外積代数はベクトル解析につながっている\\
外積・微分形式・外微分…時空間軌道の解析から始まった「曲線」「曲面」「多様体」に関する話題の一端である\href{http://d.hatena.ne.jp/ryamada/20110925}{この記事}につながる\\
\section{Gauss-Stokesの公式}
外積代数を用いて、微分形式・外微分などを用いることで積分に関する以下の公式がわかりやすくなる\\
\href{http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%82%B9%E3%81%AE%E5%AE%9A%E7%90%86}{Gauss-Stokesの公式}\\
「ベクトル場の回転を曲面上で面積分したものが、元のベクトル場を曲面の境界で線積分したものに一致する」\\
$\int_{\partial S} \omega = \int_S d\omega$
\section{外積代数・微分形式・外微分を自分の言葉で説明してみる}
自分なりに外積代数・微分形式・外微分・Gauss-Stokesの公式を書いてみる\\
n次元空間には、n個の線形独立なベクトルがおける。簡単に考えるなら、n本のベクトルからなる正規直交基底を考える\\
\subsection{外積代数}
外積代数では、1,2,...,nを要素とする集合のべき集合の要素である部分集合に対応したものを考える\\
そのような要素は$2^n$個ある\\
この$2^n$個は、部分集合であるが、部分集合としての要素数が、0,1,2,...,nのいずれかであって、それぞれの要素数は$\begin{pmatrix} n \\ i \end{pmatrix};r=0,1,...n$となっている\\
それらは符号の取り方の工夫をすることで、あるルールづけがなされている\\
\subsection{微分形式}
外積代数では「単位ベクトル」を考えたが、こちらは微分なので、「微小ベクトル」を考える。\\
微小ベクトルだが、方向については、「単位ベクトル」をそのままひきつぐ\\
外積代数と同様に$2^n$種類あるそれぞれに、関数がある\\
$f_{i}^r(x);r=0,1,...,n;i=1,2,...,\begin{pmatrix}n \\ r \end{pmatrix}$\\
外積代数では、対応する部分集合の要素数で0,1,...,n通りに分類できたが、この要素数rごとに$w^r=\sum_{i=1}^{\begin{pmatrix}n \\ r \end{pmatrix}} f_{i}^r (x) G_i^r$のように$G_i^r$(部分集合として要素数rの外積代数の一つ)に関して足し合わせたものをr次の微分形式と呼ぶ\\
\subsection{外微分}
r次の微分形式$w^r$の外微分$dw^r$を次のように定義する\\
$dw^r=\sum_{i=1}^{\begin{pmatrix}n \\ r \end{pmatrix}} df_i^r G_i^r$\\
ここで外積代数$G_i^r$の交代性が功を奏して、ぱたぱたと項が消える\\
\subsection{Gauss-Stokesの公式}
\begin{equation*}
\int_{\partial S} \omega = \int_S d\omega
\end{equation*}$w$$dw$はこのようにして定めた微分形式と外微分であって、この表現法を使うと、r次の微分形式を境界に関して積分したものと、その外微分を領域全体について積分したものとが一致する、ということが導ける\\
これは、空間が1次元のときには、外微分を領域(ここからここまで)について積分したものと、微分形式を境界(1次元線分の境界は2点)について向き・正負に注意して積分したものに一致することに対応する\\
\begin{equation*}
f(b)-f(a)=\int_a^b f'(x)dx
\end{equation*}
\section{外積代数の計算をRでやってみる}
次元nのとき、要素数は、nからi個を取り出して、その順列になる(それ以外は、0になる)から、$\sum_{i=0}^n \begin{pmatrix} n \\ i \end{pmatrix} \times i!$。それらが、$2^n$の基本要素で張られる\\
以下のソースではelemListが基本要素、allElemがすべての要素。MはallElemの演算結果を基本要素数の長さのベクトルで表している。またM2は、基本要素のどれに相当するかを符号つきで表している
<<fig=FALSE>>=
# 集合のパッケージ
library(sets)
library(gtools)

# 次元
n<-3
s<-1:n
# 順列・置換に関して、その符号を計算するには、置換を表す行列のdeterminantが使える
s2<-sample(s)
M<-diag(rep(1,n))[s2,]
det(M)
# それを使って、演算を、要素の組(集合)と符号とで表すことにする
# その関数
SignaturePermutation<-function(s){
	n<-length(s)
	sig<-1
	if(n>1){
		s2<-order(s)
		M<-diag(rep(1,n))[s2,]
		sig<-det(M)
	}
	list(set=as.set(s),sign=sig)

}
# 二つの要素を演算処理するとき、要素の重複があれば0になるので、それをする関数を作る
a<-sample(s,sample(0:n))
a
SignaturePermutation(a)
a2<-sample(s,sample(0:n))
a2
SignaturePermutation(a2)


Zerocheck<-function(s1,s2){
	ret<-TRUE
	if(length(set_intersection(as.set(s1),as.set(s2)))==0){
		ret<-FALSE
	}
	ret
}
Zerocheck(a,a2)


t<-as.set(s)
# 冪集合を作る
# これは、基本要素のセットとなる
pow.t<-set_power(t)

# 2^n個の基本要素をリストにする
# ID、要素数の等しいものごとに束ねたときの束内ID、集合
elemList<-list()
cnt<-1
numcnt<-1
cntINnumcnt<-1
currentn<-0
elemList[[1]]<-list()
for(i in pow.t){
	n<-length(i)
	print(n)
	print(i)
	if(n>currentn){
		cntINnumcnt<-1
		numcnt<-numcnt+1
		currentn<-n
		elemList[[numcnt]]<-list()
	}
	elemList[[numcnt]][[cntINnumcnt]]<-list(id=cnt,id2=cntINnumcnt,set=i,n=length(i))
	cntINnumcnt<-cntINnumcnt+1
	cnt<-cnt+1
}

# 演算順を自由にした、すべてについての情報をリストにする
allElem<-list()
cnt<-1
v<-c()
tmp<-SignaturePermutation(v)
allElem[[cnt]]<-list(id=cnt,v=v,set=tmp$set,sign=tmp$sign)
cnt<-cnt+1
for(i in 1:n){
	tmpperm<-permutations(n,i)
	for(j in 1:length(tmpperm[,1])){
		v<-tmpperm[j,]
		tmp<-SignaturePermutation(v)
		allElem[[cnt]]<-list(id=cnt,v=v,set=tmp$set,sign=tmp$sign)
		cnt<-cnt+1
	}
}
allElem

N<-length(allElem)

M<-array(0,c(N,N,2^n))
M2<-matrix(0,N,N)
for(i in 1:N){
	for(j in 1:N){
		vi<-allElem[[i]]$v
		vj<-allElem[[j]]$v
		#if(!(length(vi)==0 & length(vj)==0)){
			if(!Zerocheck(vi,vj)){
				tmpv<-c(vi,vj)
				tmpout<-SignaturePermutation(tmpv)
				print(tmpv)
				tmplen<-length(tmpv)
				for(k in 1:length(elemList[[tmplen+1]])){
					if(tmpout$set==elemList[[tmplen+1]][[k]]$set){
						print(elemList[[tmplen+1]][[k]])
						print(M[i,j,])
						M[i,j,elemList[[tmplen+1]][[k]]$id]<-tmpout$sign
						M2[i,j]<-elemList[[tmplen+1]][[k]]$id*tmpout$sign
						print(M[i,j,])
					}
				}
			}
		#}
	}
}
M2
@
\end{document}