No science, No life.

もっと科学を身近に

カオス

「部屋がカオス」といえば部屋が乱雑に散らかっていることを指すと思いますが、「カオス理論」というときのカオスは単に乱雑ということとはもちろん違います。

有名なロジスティック写像を例にしてカオスの様子を覗いてみましょう。ロジスティック写像は、

{ x_{n+1} = a x_n(1-x_n)}

であらわされる単純な漸化式です。電卓でも簡単に計算できますね。たとえば、定数a=0.5, 初期値x(1)=0.9とすれば、x(2) = 0.5*0.9*(1-0.9) = 0.045, x(3) = 0.5*0.045*(1-0.045) = 0.0215, ...という具合です。

一見したところ単純で、しかも決定論的 (前の値によって次の値が完全に決まる) なこの式ですが、定数aの値によって多彩な振る舞いをします。aの値を変えて様子を見てみましょう。

下のMatlabスクリプトで、まず、a=0.5のときの様子を描いてみます。初期値x(1)は適当に0.9としました。

clear;
a = 0.5;
x(1) = 0.9;

for n=1:99
    x(n+1) = a * x(n) * (1-x(n));
end

figure(1); clf
plot(1:100,x,'.-')
xlabel('n')
ylabel('x(n)')
title(strcat('a=',num2str(a)))
ylim([0 1])

f:id:neocortex:20161120170602p:plain

a=0.5だと値がすぐに0に収束します。では次にa=2として描いてみます。

f:id:neocortex:20161120171004p:plain

この場合も特定の値に収束しました。次にa=3.3としてみましょう。

f:id:neocortex:20161120171238p:plain

この場合は収束せず、2つの値のあいだで振動しています。では、a=3.5はどうでしょうか。

f:id:neocortex:20161120172309p:plain

この場合も振動していますが、値が4通りあることがわかります。では、a=3.8としてみます。

f:id:neocortex:20161120195011p:plain

すると先ほどまでとは違い、さまざまな値をとりながら (一見したところ) 不規則に揺れ動いています。このような状態がカオスです。さらにa=4とすると、0から1のすべての値をとるカオスとなります。

f:id:neocortex:20161120195846p:plain

以上のような状態の変化を見通しよくするために、下のスクリプトで「分岐図」を描いてみます。aの値を0から4のあいだで小刻みに変えて、x(100)まで計算し、最後の20点のみをプロットしています (例として挙げたaの値には赤線を引きました)。

clear;
x(1) = 0.9;
figure(1); clf 
for a = 0:0.001:4
    for ii=1:99
        x(ii+1) = a * x(ii) * (1-x(ii));
    end
    plot(a*ones(1,20),x(81:100),'b.');
    hold on
end
title('分岐図')
xlabel('a')
ylabel('x(n)')

plot([0.5 0.5],[0 1],'r:')
plot([2.0 2.0],[0 1],'r:')
plot([3.3 3.3],[0 1],'r:')
plot([3.5 3.5],[0 1],'r:')
plot([3.8 3.8],[0 1],'r:')
plot([4.0 4.0],[0 1],'r:')

f:id:neocortex:20161120201357p:plain

f:id:neocortex:20161120205752p:plain

上のプロットを見ると、aの増加にともなって、値の収束が1点, 2点, 4点...と増えていることが分かります。これを「周期倍分岐」といいます。そして、a=3.56付近以上でカオスが登場することが分かります。

分岐図をよく見てみると、同じような構造が何回も登場することが分かります。下のスクリプトでa=3.8から3.9の範囲をこまかくプロットしなおしてみましょう。

clear;
x(1) = 0.9;
figure(1); clf 
for a = 3.8:0.0001:3.9
    for ii=1:199
        x(ii+1) = a * x(ii) * (1-x(ii));
    end
    plot(a*ones(1,20),x(181:200),'b.');
    hold on
end
title('分岐図')
xlabel('a')
ylabel('x(n)')
xlim([3.8 3.9])

f:id:neocortex:20161120211341p:plain

f:id:neocortex:20161120211408p:plain

a=3.84から3.85のあたりを拡大してみるとここにも分岐が見えます。拡大してもおなじ形が見えることを「自己相似」といい、完全な自己相似性をもつ図形は「フラクタル」と呼ばれます。

さて、カオスの重要な特徴として、将来の予測が (事実上) 不可能だという点があります。現実の世界の数値にはつねに誤差があります (たとえば体重を測るにしても測定誤差があり、無限の精度で測定するということはできません)。カオスな世界では初期値のわずかな誤差があっという間に増幅されてしまい、遠い将来の値を予測することが事実上できません。これを「初期値鋭敏性」と呼びます。

下のスクリプトで初期値鋭敏性をシミュレーションしてみましょう。カオスな条件 (a=4) で、初期値が0.9の数値列x(n)と、初期値が0.9から1/10万だけずれた数値列y(n)を比較してみます。

% ロジスティック写像の計算
clear;
a = 4;
x(1) = 0.9;
y(1) = x(1)*1.00001;

for n=1:99
    x(n+1) = a * x(n) * (1-x(n));
    y(n+1) = a * y(n) * (1-y(n));
end

% x(n), y(n) をプロット
figure(1); clf
subplot(3,1,1:2)
plot(1:100,x,'b.-',1:100,y,'r.-')
ylabel('x(n), y(n)')
title(strcat('a=',num2str(a)))
ylim([0 1])

% x(n)-y(n) をプロット
subplot(3,1,3)
plot(1:100,x-y,'k.-')
xlabel('n')
ylabel('x(n)-y(n)')

f:id:neocortex:20161120215043p:plain

n=14あたりまでは、青線のx(n)と赤線のy(n)はほとんど同じ値でプロットが重なっていますが、それ以降はまったく別の値をとり、プロットが重ならないことが分かります。1/10万の誤差がいつの間にか増幅されたわけです。

以上のロジスティック写像にはランダムなノイズはまったく含まれておらず、完全に決定論的です。このように、「決定論的なのに将来が予測できない」というところにカオスの衝撃があります。

カオス力学の基礎

カオス力学の基礎