1$ で買った「商用 小学生OS」だから遊んでみた。まず、デスクトップをエロゲに。
折角だから、ロジスティック差分方程式を可視化する。
//logistic.cpp
// C++
//
#include<stdio.h>
#include<math.h>
#define EDig 4 //Ĵ
#define n 500 //nĴ
void f(double &x, double a);
int count(double X, double a, double **v);
void kround(double &x);
long kdigit(double x);
int main(){
int num;
double x0=0.5, *value;
FILE *datafile;
if(datafile=fopen("logidata","w")){
for(int a=1; a<4000; a+=1){
num=count(x0, a*0.001, &value);
if(num<51)
for(int i=0; i<num; i++)
fprintf(datafile, "%6.4f %6.4f\n",a*0.001, *(value+i));
//fprintf(datafile, "a=%6.4f %d\n", a*0.001, count(x0, a*0.001, &value));
}
}
fclose(datafile);
return 0;
}
int count(double X, double a, double **v){ // ʬ
int i, flag=0;
double x=X, ex[n];
for(int k=0; k<150; k++){
f(x, a);
kround(x);
}
ex[0]=x;
for(i=1; i<=n; i++){
f(x, a);
kround(x);
for(int j=0;j<i;j++)
if(kdigit(x)==kdigit(ex[j])){
flag=1; break;
}
if(flag==1) break;
ex[i]=x;
}
*v=ex; // ʬ
return i;
}
long kdigit(double x){ //ͭ
return (long)(x*pow(10,EDig));
}
void kround(double &x){ //ͭ
int tmp;
tmp=(int)(x*pow(10,EDig));
x=(double)tmp/pow(10,EDig);
}
void f(double &x, double a){
double xn=x;
x=a*(xn-xn*xn);
}
$ g++ -o ligi logistic.cpp
$ ./logi
$ gnuplot
plot "logidata"
典型的なカオスのアトラクタ。暇ならば、調べてみると面白いと思う。1$分は取り返せたかな。随分前に作ったトイプログラムなので文字コードがUTF8じゃなかった。nkf で無理に持ってきたがちゃんと動いたから結果オーライ。


