
カオス理論において、池田写像は、ストレンジアトラクターを生成する離散時間力学系である。これは、1979年に物理学者の池田健介によって、非線形光学共振器内の光の挙動のモデルとして導入された。[ 1 ]この写像は、単純な一連の規則が、繰り返しの回転、拡大縮小、並進のプロセス(カオス系によく見られる「伸縮」操作)を通じて、複雑でカオス的な挙動につながることを示している。
このマップは複素平面上の反復関数によって定義されます。与えられた複素数に対して次の値は次のように計算されます。ここ、ステップにおける共振器内の電場を表すパラメータそして外部レーザー光とシステムの位相に関係する一方、(どこ)は共振器におけるエネルギー損失を表す散逸パラメータである。 [ 2 ]
この写像のよく研究される実数値版は、2次元方程式で表されます。どこはパラメータであり、パラメータの値についてはこのシステムはカオス的な挙動を示し、記事の画像に示されているような特徴的なフラクタルアトラクターを生成します。
このアニメーションは、パラメータが変化するにつれてシステムの吸引器がどのように変化するかを示しています。は 0.0 から 1.0 まで 0.01 刻みで変化します。池田力学系は、ランダムに配置された 20,000 個の開始点から始めて 500 ステップシミュレーションされます。各軌跡の最後の 20 点がプロットされ、アトラクターが示されます。アトラクター点の分岐に注目してください。増加した。
以下のグラフは、さまざまな値に対する200個のランダムな点の軌跡を示しています。左側の挿入図はアトラクターの推定値を示しており、右側の挿入図はメインの軌跡図を拡大表示したものである。
これらのグラフを生成するためのOctave/MATLABコードを以下に示します。
% u = 池田パラメータ% option = プロットする内容% 'trajectory' - ランダムな開始点の軌跡をプロット% 'limit' - ランダムな開始点の最後の数回の反復をプロットfunction ikeda ( u, option ) P = 200 ; % 開始点の数N = 1000 ; % 反復回数Nlimit = 20 ; % 'limit' オプションの最後の点の数をプロットx = randn ( 1 , P ) * 10 ; % ランダムな開始点y = randn ( 1 , P ) * 10 ; for n = 1 : P , X = compute_ikeda_trajectory ( u , x ( n ), y ( n ), N ); switch option case 'trajectory' % 多数の点の軌跡をプロットplot_ikeda_trajectory ( X ); hold on ;case 'limit' plot_limit ( X , Nlimit ); hold on ;そうでなければdisp ( '未実装' ); end endaxis tight ; axis equal text ( -25 , -15 , [ ' u = ' num2str ( u ) ] ); text ( -25 , -18 , [ 'N = ' num2str( N ) ' iterations ' ] ); end% 曲線の最後の n 点をプロットして、終点またはリミットサイクルを確認します。function plot_limit ( X, n ) plot ( X ( end - n : end , 1 ), X ( end - n : end , 2 ), 'ko' ); end% 軌跡全体をプロットする関数plot_ikeda_trajectory ( X ) plot ( X (:, 1 ), X (:, 2 ), 'k' ); % hold on; plot(X(1,1), X(1,2), 'bo', 'markerfacecolor', 'g'); hold off end% u は池田パラメータです% x、y は開始点です% N は反復回数ですfunction [X] = compute_ikeda_trajectory ( u, x, y, N ) X = zeros ( N , 2 ); X ( 1 , :) = [ x y ]; for n = 2 : N t = 0.4 - 6 / ( 1 + x ^ 2 + y ^ 2 ); x1 = 1 + u * ( x * cos ( t ) - y * sin ( t )); y1 = u * ( x * sin ( t ) + y * cos ( t )); x = x1 ; y = y1 ;X ( n , :) = [ x y ]; end endimport mathimport matplotlib.pyplot as plt import numpy as npdef main ( u : float , points = 200 , iterations = 1000 , nlim = 20 , limit = False , title = True ): """ 引数: u:float ikeda パラメータ points:int 開始点の数 iterations:int 反復回数 nlim:int 'limit' オプションの場合、最後の点をこの数だけプロットします。ゼロに設定すると、すべての点がプロットされます。 limit:bool True の場合、ランダムな開始点の最後の数回の反復をプロットします。それ以外の場合は、軌跡をプロットします。 title:[str, NoneType] 値が肯定的な場合、プロットの名前を表示します """x = 10 * np.random.randn ( points , 1 ) y = 10 * np.random.randn ( points , 1 )for n in range ( points ): X = compute_ikeda_trajectory ( u , x [ n ][ 0 ], y [ n ][ 0 ], iterations )limitの場合: plot_limit ( X , nlim ) tx , ty = 2.5 , -1.8else : plot_ikeda_trajectory ( X ) tx , ty = - 30 , - 26plt.title ( f "池田マップ({ u = :. 2g } 、{ iterations = } )" ) if title else None return pltdef compute_ikeda_trajectory ( u : float , x : float , y : float , N : int ): """完全な軌跡を計算します 引数: u - イケダパラメータ、 x, y - 開始点の座標、 N - 反復回数 戻り値: 配列。 """ X = np.zeros ( ( N , 2 ) )for n in range ( N ): X [ n ] = np.array ( ( x , y ) )t = 0.4 - 6 / ( 1 + x ** 2 + y ** 2 ) x1 = 1 + u * ( x * math . cos ( t ) - y * math . sin ( t )) y1 = u * ( x * math . sin ( t ) + y * math . cos ( t ))x = x1 y = y1Xを返すdef plot_limit ( X , n : int ) -> None : """ 曲線の最後の n 点をプロットします - 終点またはリミットサイクルを確認するため 引数: X: 関連付けられた開始点の np.array 軌跡 n: プロットする「最後の」点の数 int plt.plot ( X [ -n : , 0 ] , X [ -n : , 1 ] , ' ko ' )def plot_ikeda_trajectory ( X ) -> None : """ 軌跡全体をプロットします 引数: X: 関連付けられた開始点の np.array 軌跡 """ plt . plot ( X [:, 0 ], X [:, 1 ], "k" )if __name__ == "__main__" : main ( 0.9 , limit = True , nlim = 0 ) .show ( )