2009年11月27日金曜日

カオス #26 馬蹄写像

楽しい写像の御提供.

馬蹄写像

馬蹄写像は下のような2変数写像です.固定された数式では無いので,定義域,値域をそれぞれ図示しています.


Fig.1 馬蹄写像
2つの半円D1,D2と正方形Sが定義域です.図では赤のチェックの領域です(一部隠れています).
馬蹄写像を定義域全体に対して適用すると,定義域を折り曲げたような形になります.図では青のチェックの領域分です.この値域の形が馬蹄に似ているから馬蹄写像と呼ぶのです.

この写像を2回適用するとFig.2のようになります.


Fig.2

3回適用.


Fig.3

繰り返すと倍々に折り重なっていくのが分かります.また,D1,D2内に入った点は以後そこから出られなくなります(D1内の点はD1内へ,D2内の点はD2内へ写像するから).そして最終的にD1,D2内に入る点は到る所無数にあるので,初期値の極僅かな差によって最終的な挙動が全く変わります.ロジスティック写像の2次元版みたいな感じです.

疑似コードはこんな感じ.上にも書いた通り,固定された数式ではないので,別にこのような定義でなくともかまいません.


horseshoe(x, y)
if(-1/2≦x≦1/2 && -1/2≦y≦1/2) # Sに含まれる
if(-1/2≦x≦-1/8)
u=map(x, -1/2, -1/8, -5/8, 1/2)
v=map(y, -1/2, 1/2, 1/8, 3/8)
else if(1/8≦x≦1/2)
u=map(x, 1/8, 1/2, 1/2, -5/8)
v=map(y, -1/2, 1/2, -1/8, -3/8)
else # -1/8≦x≦1/8 Uの字に曲がる所
r=map(y, -1/2, 1/2, 1/8, 3/8)
d=map(x, -1/8, 1/8, π/2, -π/2)
u=r・cos(d)+1/2
v=r・sin(d)
return (u, v)
else if(dist(-1/2, 0, x, y)≦1/2) # D1に含まれる
u=map(x, -1, -1/2, -3/4, -5/8)
v=map(y, -1/2, 1/2, 1/8, 3/8)
return (u, v)
else if(dist(1/2, 0, x, y)≦1/2) # D2に含まれる
u=map(x, 1/2, 1, -5/8, -3/4)
v=map(y, -1/2, 1/2, -1/8, -3/8)
return (u, v)
else # 定義域外
return null

map(value, low1, high1, low2, high2)
return (value-low1)(high2-low2)/(high1-low1)+low2;

dist(x1, y1, x2, y2)
return sqrt(sq(x2-x1)+sq(y2-y1))



写像する様子を映像化するとこんな感じ(イメージです).

0 件のコメント: