/*
Logistic Equation

dot{n} = r*(1.0-n/K)*n

*/

#include 
#include 
#include 

#define T_END 1000
#define r 0.1
#define K 50.0
#define h 0.1  /*h 分割数*/

double FUNC(); /* 関数の例*/

main()
{
  int j; /*j;step number*/
  double nn=0.0, n=100.0;
  double nt=0.0,t=0.0;
  double k1=0.0, k2=0.0,k3=0.0,k4=0.0;
  
  for(j=0;j<=T_END;j++)
    {
      k1 = h*FUNC(t,n);
      k2 = h*FUNC(t+0.5*h,n+0.5*k1);
      k3 = h*FUNC(t+0.5*h,n+0.5*k2);
      k4 = h*FUNC(t+h,n+k3);

      nn = n + 0.16666667*(k1+2.0*k2+2.0*k3+k4);
      nt = t + h;
 
      printf("%d %f\n",j,n);
      n = nn;
      t = nt;
    }
  return 0;
}

/*関数の例*/
double FUNC(double t, double n)
{
  return (r*(1.0-n/K)*n);
}


出力結果

この微分方程式には解析解が存在し、それに収束する。 しかし離散時間体系にすると、次のような変なことが起こる。

/*
離散時間体系:

x_{n+1}=a*(1.0-x)*x
*/

#include 
#include 
#include 

#define a 4.0

main()
{
  int j; /*j;step number*/
  double x=0.1,nx=0.0;

  for(j=0;j<=100;j++)
    {
	nx=a*(1.0-x)*x;
	printf("%f %f\n",nx, x);
	/*printf("%d %f\n",j, nx);*/
    x=nx;
    }
  return 0;
}


出力結果

TIME EVOLUTION(aの値によって、収束(a=2.9)、周期的(a=3.4)、一見ランダム(a=4.0)なように)

NXとX(RED: a=3.0, GREEN: a=4.0) 特にa=4の場合、時間発展は一見ランダムのようでしたが、規則性が存在するということが分かります。

/*
Logistic Map

OUTPUT Command
./a.out | xgrpah -nl -p

*/
#include 
#include 

main(void)
{
  double nx,c;
  double x=0.65;

  for(c = 2.9 ; c <= 4.0; c += 0.00001)
    {
      nx = c*x*(1. - x );
      printf("%f  %f\n", c , nx );
      x = fmod( nx ,1.);
    }
  return 0;
}


出力結果


aの値を大きくしている。

その他カオスを特徴づける方法として、Liapunov Exponentが知られている。 その指数が正であるならば、「カオス」であると言われている。

/*
Liapunov Exponent

\lambda=\lim_{n\to \infty}\frac{1}{n}\sum_{j=0}^{n-1}\log |f'(x_j)|

EXAMPLE:
ロジスティック方程式のリアプノフ指数

*/

#include 
#include 

/*初期値設定*/
#define STEP 100000

/*関数宣言*/
double f(double,double);
double g(double,double);

main()
{
  int j;
  double x=0.1,nx,u;
  double liap,h,total;

  for(h=2.9;h<=4.0;h+=0.001)
    {
      for(j=0;j<=STEP-1;j++)
	{
	nx=f(x,h);
	u=fabs(g(nx,h));
	total +=log(u);
	liap = total/STEP;
	x=nx;
	}
       printf("%f %f\n",h, liap);

	nx=0.0;
	u=0.0;
	total=0.0;
	liap=0.0;
    }
 return 0;
}
/*FUNCTION */
double f(double x,double h)
{
  return( h*x*(1.0-x) );
}

/*1st derivative */
double g(double x,double h)
{
  return( h*(1.0-2.0*x) );
}


出力結果



Back to C Language

Google




BLOG
PICASAWEB
Panoramio


Logistic_map(Wikipedia)
参考書

カオスとフラクタル Excelで体験

カオスの中の秩序

新装版 カオス力学系の基礎

Chaos in Dynamical Systems

Chaos and Integrability in Nonlinear Dynamics

カオス力学入門