2012/01/20

2枚の翼とカオスとなっているアトラクタ

今回と次回で3つのカオスCGを描きたいと思います。

1つ目は「2枚の翼」です。これは過去記事:神話の翼を描く【カオスでCG】で紹介したカオスCGと同系統の図です。鳥が羽ばたいているようにも見える不思議な図形です。今回はこちらを描きます。

2つ目と3つ目は池田研介氏のアトラクタとチョーサ氏とゴルビツキー氏のアトラクタによるカオスCGです。前者は渦を巻くような図形が、後者は対称的な図形が現れ、とても綺麗です。次回はこちらを描きます。

では、この3つのカオスを描いていきます。参考にしたのは、「CによるカオスCG」 川上博・上田哲史共著 サイエンス社 です。




2枚翼の写像

以下の繰り返し公式にて2枚羽根のカオスを求めます。




ただし、a,b,Rは定数で、nは0以上の整数となります。

上記の繰り返し計算を行うC言語のソース(2maitsubasa.c)はこちら。

/*2枚の翼を描く*/
#include<stdio.h>
#include<math.h>

int main(void){

double x0=0.1, y0=0, x1, y1 ;//変数
double a, b, R ;//パラメータ
int i ;
FILE *fp;

if ((fp = fopen("2maitsubasa.dat", "w")) == NULL) {
printf("file open error!!\n");//2maitsubasa.datというファイルに出力する

}else{

printf("a > ");
scanf("%lf",&a);
printf("b > ");
scanf("%lf",&b);
printf("R > ");
scanf("%lf",&R);//端末からのパラメータa,b,Rの入力

for(i=0;i<50000;i++){

x1=y0+a*x0+5.0*x0*x0/(1+x0*x0)+1.0-0.2*exp(-y0*y0);
y1=-b*x0+R*pow(-1.0,i); //数式部分
if(i%2==0){ //周期2なので2周ごとにプロット
fprintf(fp,"%lf %lf\n",x1+y1,x1-y1); //現在のx,yを出力(描画のため引き伸ばし)
}
x0=x1;
y0=y1; //現在のx,yを次回の入力値にしてループ
}
}
fclose(fp);
return 0;
}

gnuplotでの描画手順
端末上で上記のプログラムを実行したあと、その場所でgnuplotを起動します。あとは以下のように入力していけば図形が描かれたファイル「2maitubasa.jpeg」が生成されます。

$ gnuplot
gnuplot> set size square
gnuplot> set term jpeg
gnuplot> set output "2maitsubasa.jpeg"
gnuplot> plot "2maitsubasa.dat" with points pt 5 ps 0 lt 3



2maitsubasa.jpeg
a=0.02,b=0.98,R=5.0として描画したときの2枚翼


私はこの図形を見たときにまるで鶴のようだ、と思いました。この記事を読んでくださっている方はどう思うでしょうか。

ソースの中にポツンと「周期2なので2周ごとにプロット」というコメント文があるのに気づかれた方もいらっしゃると思います。これは、上で示した2つ目の数式の中にR(-1)^nであるところの強制項があるためです。強制振動の微分方程式での外力みたいなものでしょうか。

ともかく、この強制項が2の倍数ごとに同じものになりますので、(n=0,2,4,...でR、n=1,3,5,...で-R)これをそのままプロットすると翼が2つ重なったものになってしまうのです。そのため、nが偶数または奇数のときだけをプロットすれば重ならない図を描くことができます。(ソース中ではnの役割をiで担っており、iが偶数の時プロットするようにしています。

重なって描かれた場合どうなるかを下に示します。

2maitsubasa2.jpeg
周期2による2つの2枚翼の重なり


先に示した図はこの図でいうところの下側の翼にあたります。上側の翼はnが奇数のときだけプロットした場合に現れるものです。2羽の鶴が交差した瞬間のようにも見え、これはこれで面白い図だと思います。

図の描き方ばかりの説明になってしまいましたが、これの一体どこがカオスなんだ?ということについて簡単に説明したいと思います。


キーワードは「アトラクタ」です。

ここに描いた図形は「ストレンジ・アトラクタ」と呼ばれるもののひとつです。アトラクタとは、平面上で言えば、周りの点を引き寄せる(attract)もののことです。アトラクタによる様々な平面図形は、総じて周りの点を引き寄せているような構造をしています。

さて、カオスの定義の一つとして「初期値に対する鋭敏な依存性」が挙げられます。すなわち、最初の点をごくわずかにずらしただけでも、将来的には決定的な差異が生じるという性質です。

このストレンジ・アトラクタも、パラメータa,b,Rの値をほんの僅かに変えるだけで、50000回反復後にはかなり異なる図形が描かれます。初期値に対する鋭敏な依存性、があるというわけですね。カオスです。



次回、冒頭で述べましたように、池田研介氏のアトラクタとチョーサ氏とゴルビツキー氏のアトラクタによるカオスCGを描きたいと思います。


スポンサーサイト
2012/01/18

ロジスティック写像の分岐図

関数族において、十分時間が経過した後の写像の繰り返しから求めた分岐をパラメータの関数として表示したものを、分岐図(bifurcation diagram)という。分岐図の例として、以下の例を示す。




ロジスティック写像の分岐図

関数族は
   
で与えられる。

以下にこの計算を繰り返していくC言語のプログラム(logistic.c)を示す。

#include

int main(void){
double a,x=0.8;
int i,j;
for(a=2.0;a<4;a+=0.002){
for(i=0;i<100;i++){
x=a*x*(1-x);
}
for(i=0;i<100;i++){
x=a*x*(1-x);
printf("%f %f\n",a,x);
}
}

return 0;
}


こちらをubuntu端末上にて
$gcc logistic.c
$./a.out ->log.dat
$gnuplot

gnuplot> plot "log.dat" pt 5 lt 0 ps 0

と打ち込み表示された図をここに載せる。

bunkizu.jpeg

この図には、分岐の始まるところの周囲を含めた部分を拡大していくと、もとの図とまったく同じような形が見えてくるフラクタルな構造が見られる。
他にも様々な特徴が見られるのだが、今後の記事で紹介していきたい。
2012/01/11

同窓会

高校の同窓会に行って参りました。

久々に会って懐かしかったし楽しかったのですが、自分の成長してなさを実感し苦しくもありました。

大学生活で何をすれば正解であるか、という問には何通りもの答えがあると思います。

中途半端な生活を再度認識しました。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。