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次元版みたいな感じです.

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

  1. horseshoe(x, y)  
  2.   if(-1/2≦x≦1/2 && -1/2≦y≦1/2) # Sに含まれる  
  3.     if(-1/2≦x≦-1/8)  
  4.       u=map(x, -1/2, -1/8, -5/81/2)  
  5.       v=map(y, -1/21/21/83/8)  
  6.     else if(1/8≦x≦1/2)  
  7.       u=map(x, 1/81/21/2, -5/8)  
  8.       v=map(y, -1/21/2, -1/8, -3/8)  
  9.     else # -1/8≦x≦1/8 Uの字に曲がる所  
  10.       r=map(y, -1/21/21/83/8)  
  11.       d=map(x, -1/81/8, π/2, -π/2)  
  12.       u=r・cos(d)+1/2  
  13.       v=r・sin(d)  
  14.     return (u, v)  
  15.   else if(dist(-1/20, x, y)≦1/2) # D1に含まれる  
  16.     u=map(x, -1, -1/2, -3/4, -5/8)  
  17.     v=map(y, -1/21/21/83/8)  
  18.     return (u, v)  
  19.   else if(dist(1/20, x, y)≦1/2) # D2に含まれる  
  20.     u=map(x, 1/21, -5/8, -3/4)  
  21.     v=map(y, -1/21/2, -1/8, -3/8)  
  22.     return (u, v)  
  23.   else # 定義域外  
  24.     return null  
  25.   
  26. map(value, low1, high1, low2, high2)  
  27.   return (value-low1)(high2-low2)/(high1-low1)+low2;  
  28.   
  29. dist(x1, y1, x2, y2)  
  30.   return sqrt(sq(x2-x1)+sq(y2-y1))  


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

0 件のコメント: