IFSのアトラクタ

user-pic
0

以前に、羊歯のグラフィックというのを描いてみたことがあるが、これは要するに本にあるソースコードを打ち込んでみただけなので、アルゴリズムの輪郭もうまく把握できなかった。

最近たまたま、合原一幸編著「カオス カオス理論の基礎と応用」サイエンス社に、IFSのアトラクタとして、上記羊歯のグラフィックの元となると思われるアルゴリズムが説明してあったので、改めてこの説明から、プログラミングしてみることにした。

IFSとは、iterated function systemの略らしくて、日本語では反復関数系と訳される。なんともありきたりなネーミングだと苦笑するのであるが、米国の応用数学者M. Barnsleyが研究したものらしい。

Barnsleyは、羊歯を描くために、下記の4つの写像を用意した。
  1. W1(x,y) = (0.836x + 0.044y,-0.044x + 0.836y + 0.169)
  2. W2(x,y) = (-0.141x + 0.302y,0.302x + 0.141y + 0.127)
  3. W3(x,y) = (0.141x - 0.302y,0.302x + 0.141y + 0.169);
  4. W4(x,y) = (0.0,0.175337y);

そして、(x,y) ← W(x,y)の処理を繰り返すのだが、W(x,y)は実際は、W1(x,y),W2(x,y),W3(x,y),W4(x,y)のどれかである。その呼び出す確率がそれぞれ、1/2, 1/6, 1/6, 1/6である。こうして描いた図は、下記のとおりである。バリエーションとして、点の色を少し変えてみた。

なお、例によって、プログラムのソースコードも付ける。

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdlib.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Close1Click(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Draw1Click(TObject *Sender)
{
int i = 0, n, c;
double x,y,px,py,tx,ty;

// x, yに適当な初期値を与える
x = 0.1;
y = 0.1;

while ( i++ < 30000000 )   {

 n = random(1000)%6 + 1;
 switch(n)  {
  case 4:
   tx = -0.141*x + 0.302*y;
   ty = 0.302*x + 0.141*y + 0.127;
   break;
  case 5:
   tx = 0.141*x - 0.302*y;
   ty = 0.302*x + 0.141*y + 0.169;	
   break;
  case 6:
   tx = 0.0;
   ty = 0.175337*y;	
   break;
  default:
   tx = 0.836*x + 0.044*y;
   ty = -0.044*x + 0.836*y + 0.169;
   break;
 }
  if ( i > 100 )    {
	px = 300.0 + 550.0*tx;
	py = 600.0 - 550.0*ty;
	c = i%6 + 1;
	if ( c == 4 )
    Canvas->Pixels[px][py] = clYellow;
	else if ( c == 5 )
    Canvas->Pixels[px][py] = clRed;
    else if ( c == 6 )
    Canvas->Pixels[px][py] = clBlue;
    else
    Canvas->Pixels[px][py] = clGreen;
  }
  x = tx;
  y = ty;
}
  return;
}
//---------------------------------------------------------------------------

トラックバック(0)

トラックバックURL: http://commutative.world.coocan.jp/mt/mt-tb.cgi/4598

コメントする

このブログ記事について

このページは、あやたろうが2017年7月14日 05:31に書いたブログ記事です。

ひとつ前のブログ記事は「デンタル・シリンジ」です。

次のブログ記事は「棋聖戦第4局」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。