前回の宿題の答え

今回も前回の宿題を題材に講義をしていきます。が、その前にお詫びです。

引用元:[前回の宿題]
宿題の円「(X-5)^2+(Y-4)^2=9」に対してある一次変換を施すと、円形ではなくなる(正円でも楕円でもなくなる)。そのような一次変換を探し、またその必要条件を考察せよ。

となっていましたが、考察せよは分かりにい問題でしたね。円を描くプログラムで色々な変換行列を試してもらうことで、必要条件を予想して欲しかったのですが、考察せよでは証明せよと言っているように聞こえてしまいますね。証明するにも、目的となる条件が分からないので問題が成立しないわけですが…。もし悩んでいた人がいたら申し訳ないです。

せめて十分条件だったら、いくらでも具体例を挙げられるだけマシだったかもしれませんf(^^;)

さて、今までに見てきた一次変換では必ず次元を保っていました。一次変換の性質上、2次元の円3次元の球体になったり、2次元の円2次元の正方形になることは絶対にありえません。しかし、2次元の円1次元の線分になり得るのです。そのような一次変換について考察します。

全ての点は原点へ

ここで宿題の答えの一つの例として、零行列により引き起こされる一次変換を挙げておきましょう。この一次変換は、全ての平面上の点を原点O(0,0)へ移す、2次元→0次元の変換です。

何を当たり前のことを…と思いましたか?いいえ、これも立派な答えです。原点円形ではありませんよね[*1]。とりあえず、今まで2次元→2次元しか扱ってこなかったので、発想を転換して欲しかったのです。

2次元→0次元について話すことは特にこれ以上ありません。これで2次元→2次元と、2次元→0次元を扱ったことになりますね。さて、もう気付いていると思いますが、残りは2次元→1次元の一次変換です。

平面が直線になる変換

一次変換 f が2次元→1次元の変換であるというのはつまり、 f によって平面上の全ての点 (x,y) が、例外なくある直線 l 上に移るということです[*2]

この一次変換 f を表す行列 A を、前回扱った基底の考え方で探ってみると、次のような行列が思いつくでしょう。

A=[[p,0],[q,0]]
基底が一つのみ(片方の基底を零ベクトルと考える)。
A=[[p,tp],[q,tq]]
二つの基底が平行になっている。

問題

大体条件が見えてきました。では次の命題の証明を考えてみてください。図形的な意味をよく考えながら式を眺めるのがポイントです。

A=[[p,q],[r,s]](≠0) が引き起こす一次変換 f によって、平面上の全ての点が直線 l 上に移るための必要十分条件は、原点、点 (p,r),(q,s) が全て直線 l 上にあることである。

証明

[→]の証明
  1. [X,Y]=A[x,y] (1) とする。
  2. f は一次変換だから、必ず原点を原点に移す。
  3. よって直線 l は原点を通り、その方程式は aX+bY=0 (2) とおける。
  4. (ただし、 a,b(a,b)≠(0,0) なる定数。)
  5. 式(2)を行列の積で書き直せば、 (a,b)[X,Y]=0
  6. 従って式(1)の両辺に左から (a,b) をかければ、 0=(a,b)A[x,y] (3)
  7. 式(3)が任意の x,y に対して成り立つから、 (a,b)[[p,q],[r,s]]=(0,0)
  8. つまり、 ap+br=0,aq+bs=0 となり、式(2)を満たす。
  9. ゆえに、点 (p,r),(q,s) は直線 l 上の点である。
[←]の証明
  1. 直線 l の方向ベクトルの一つとして、 d をとる。
  2. 原点を通るから、直線 l の方程式は、 p=td (4) と表せる。
  3. (ただし、tはパラメータ。)
  4. 従って式(4)より、 l 上の点 (p,r),(q,s)[p,r]=t_1*d, [q,s]=t_2*d と表せる。
  5. (ただし、t_1,t_2は定数)
  6. ∴[X,Y]=[px+qy,rx+sy]=x[p,r]+y[q,s]=(x*t_1+y*t_2)d
  7. 式(4)を満たすから、一次変換 f により、全ての点 (x,y) は直線 l 上の点 (X,Y) へ移る。

行列式

ここで、原点、点 (p,r),(q,s) が一直線上にあるという条件を簡単な式で表すと、二つのベクトル [p,r],[q,s] が平行なので、比を考えて ps=qr (5) となります。p,q,r,sのいずれかが0であるような場合も同じ式が成り立つことに注意してください。式(5)の右辺を左辺へ移項すると、 ps-qr=0 となります。左辺は見覚えのある形ですね。そう、Aの行列式です。

行列式について説明しましょう。2次正方行列 A=[[p,q],[r,s]]行列式ps-qr [*3]で定義され、 detA, |A|, ΔA などと表記します[*4]

従って、Aが零行列の場合も考慮すると、次の命題が成り立つことが分かりました。

2次正方行列 A が引き起こす一次変換 f によって、平面上の全ての点が原点を通るある直線上に移る[*5]  ⇔ detA=0

従って、どんな2次元図形であっても、 detA=0 であるような行列 A が引き起こす一次変換を施せば、1次元の図形(ある直線の部分集合)へ潰れてしまいます。つまり、この一次変換ならば、円に施すことで円形ではなくする(線分へ潰す)ことができますね。

このように、行列式が0かどうかで、一次変換により対象が「潰れる」か「潰れない」かが分かります。この他にも、逆行列面積(体積)などと深い関わりがあり、行列式は行列を特徴づけるとても重要な要素の一つです。

プログラム on Math

プログラムでこのことを確認してみましょう。次のプログラムは、母艦上でマウスを動かすと、そのマウスの座標(X,Y)を行列Aで一次変換した点を赤色で図示します。変換行列として行列式が0である A=[[1,0.5],[0.5,0.25]] を与えてあります。

一次変換の確認.nako
!『matrix.nako』を取り込む。#1
!Rとは整数=4。#2

Aとは行列。
A=「1,0.5{~}0.5,0.25」。#3
Vとはベクトル。

線スタイルは『透明』。

#4
母艦でマウス移動した時は
 画面クリア
 V="{母艦のマウスX}{~}{母艦のマウスY}"
 Vに青色でプロット。#4−a
 AでVを一次変換。#4−b
 Vに赤色でプロット。#4−c

#5
●プロット({グループ}Vに{整数}Cで)
 Pとは配列=V→データ。#5−a
 塗り色はC
 P[0]-R,P[1]-RからP[0]+R,P[1]+Rへ円。#5−b
 

このプログラムは第2回の講座で作った行列用ライブラリ『matrix.nako』を取り込む必要があります。

一次変換した方の赤い丸が、直線Y=X/2上にしか表示されないことが確認できると思います。行列Aを今までに扱った他の回転行列にするなどして色々試してみてください。

プログラム解説

#1
前回同様に、matrix.nakoを利用する。
#2
プロット(#5)する丸の半径の値を定数で定義する。
#3
列(行)ベクトルが平行で、行列式が0になっていることに注意。
#4
母艦上でマウスが移動した時のイベントを設定。
#4-a
#5のユーザ定義関数を用いて、マウスの位置に青色の丸を描画。
#4-b
マウスのX,Y座標を行列Aを用いて一次変換。
#4-c
#5を用いて、#4-bの位置に赤色の丸を描画。
#5
位置ベクトルがVである点に、色Cの丸を描画。引数Vの型として{ベクトル}ではなく{グループ}を指定しなければならないことに注意。
#5-a
ベクトルVの座標データを取り出してPとする。なでしこは、Vが何らかの{グループ}であることしか知らず、ベクトルであると知らないので、ベクトルのメンバやメンバ関数を使用するには、動的指定「→」(または@)を用いる必要がある。
#5-b
Vは列ベクトルなので、P[0]がX座標、P[1]がY座標になる。円の半径はR(#2)。

動的指定#5-aは慣れないと理解するのが難しいかもしれません。きちんと動的指定をせず、普通の静的指定(Vのデータなど)をすると、プログラム実行時にエラーになります。動的静的の区別はグループを扱う上で非常に重要なので、注意してください。

ところで、この変換は何かに有効なのでしょうか?プログラムを実行してみても、変換先が全部直線上に表示されるだけで、つまらないかもしれません。しかし、発想を変えてみてください。光が斜めに指してきて物体(マウス)に当たり、ある(直線Y=X/2)の上に(一次変換の像)を作っていると考えることができますよね。

つまり、行列式が0の行列が引き起こす変換は、光によって影を作る変換即ち射影なのです!どんな3次元物体が当たっても、2次元のスクリーンに写し出されれば2次元図形になるというわけです[*6]

まとめ

  • 2次正方行列Aの行列式detA=ps-qr
  • 行列式が0の行列が引き起こす一次変換は、平面上の全ての点をある直線の上へ移す
  • ⇒この一次変換は射影である。

今回扱ったプログラムでは変換行列が最初に固定されているが、いちいちソースを変更しなくても、実行しているプログラムの中だけで変換行列を変更できるようにしたい。できるだけ分かりやすく便利なインターフェースを考えて、変換行列を自由に変更できるようにプログラムを改良せよ。

注釈

*1
」を半径が0の円と定義することもできるので、零行列による一次変換を円に施しても、円形を保っていると解釈することもできます。しかし円の次元が2であるのに対し、点は0次元なので、この一次変換で、明らかに別のものになったと言ってよいでしょう。
*2
正確には、一次変換f:V→Uが、dimV=2, dimU=1, rankf=1ということです。
*3
一般のn次正方行列 A=(a_ij) の行列式は、次のように定義される。 A≡(sgnσ)Πa_{i,σ(i)} [σ∈Sn, 1≦i<n]
*4
detAという表記は、行列式の英語determinantからとっています。略記法|A|では、Aの成分を直接並べて書く場合、Aの括弧を省略して代わりに左右を縦棒で挟むことができます。Δはギリシャ文字のデルタで、アルファベットのDに相当し、やはりdeterminantの頭文字に由来します。ΔAは主に高校数学で使われるという記法ですが、一般の行列式を表す写像(関数)det:Mat→Kと違い普通の変数と同じ扱いなので、「ΔAをAの行列式とする」と定義しなければいけません。
*5
A≠0, detA=0の場合、rankf=1でfの像(Im f)は原点を通る直線になります。A=0の場合、fの像は原点(のみを元とする集合)になりますが、これは原点を通る直線の部分集合なので、この場合も、全ての点はある直線の上に移されると言えます。零行列の場合は像が直線ではないことに注意してください。
*6
一般に、n次元のベクトル空間Vにn次正方行列A(ただしdetA=0)が引き起こす一次変換を施すと、その像f(V)の次元はn未満になります。つまり、3次元の物体を1次元のスクリーンに映すような射影も存在します。