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 で無理に持ってきたがちゃんと動いたから結果オーライ。