2

私はカオスと非線形ダイナミクスの初心者です。Matlab を使用して、テント マップの位相空間プロットをプロットしようとしていました。位相空間プロットは、その独立変数のプロットです。したがって、システムに 1 つの変数がある場合、それは前の値と次の値のプロットになります。プロットのアウトラインはテント マップに似ていますが、いくつかのクロス ラインが表示されています。位相空間プロットは、0 と 1 の間で区切られた三角形 (テントという名前が由来) のように見えるはずです。パラメータが mu の場合、最大値は mu/2 になります。正しい位相空間プロットは次のようになります。

ここに画像の説明を入力

他の離散マップも試してみましたが、同様の線が得られました。しかし、本などでは、線のないきれいな曲線を見てきました。どこが間違っていますか?また、プロットは X 軸でゼロから開始されません。この質問は、プログラミングと概念の観点からもです。x[n] vs x[n-1]ウィキペディアのプロットに示されているグラフを取得する方法がわかりません。

テントマップ

パラメータmu = 2.

N = 256;
x(1) = rand();  % Initial condition

for j=2:N
    if (double(x(j-1)))>0 && (double(x(j-1)))<0.5        
        x(j)=2*x(j-1);                        
    elseif (double(x(j-1)))>=0.5                          
        x(j)=2*(1-x(j-1));                    
    end
end

for k = 2:N
    next(k) = x(k-1);
end

plot(next,x)
4

2 に答える 2

3

コードにいくつかの問題があります。まず、条件が複雑すぎますdouble。Matlab のデフォルトのデータ型であるため、何かをキャストする必要はありません。計算ループのクリーンアップされたコードは次のとおりです。

for j = 2 : N
    if x(j - 1) < 0.5        
        x(j) = 2 * x(j - 1);                        
    else  
        x(j) = 2 * (1 - x(j - 1));                    
    end
end

これは、ウィキペディアのページに記載されている式を使用して、さらに簡単にすることができます。

for j = 2 : N
    x(j) = 2 * min(x(j - 1), 1 - x(j - 1));
end

plot第 2 に、デフォルトでは簡単なコマンドがポイントを線で結びます。これはあなたが望むものではありません。また、計算する余分なループnextは不要です。Matlab のベクトル生成インデックス作成機能を使用するだけです。

plot(x(1 : end - 1), x(2 : end), '.')
axis equal
axis([0 1 0 1])

そしてあなたは得る

これはおそらくあなたが期待したものではありません: 完全なテント マップです。これは、計算しているのはマップ自体ではなく、指定した 256 点で構成されるマップによって管理される軌道であるためです。[0, 1] のすべての可能な値がこの 256 ステップで発生するわけではないため、マップ上でx数ポイントしか得られません。

マップ上のポイントを取得するのではなく、テント マップ自体のグラフを取得する場合は、次のようにします。

x = 0 :0.01: 1;
plot(x, 2 * min(x, 1 - x))
axis equal
axis([0 1 0 1])

これは、時間の経過に伴うシステム状態のプロットである標準的な意味でのフェーズ プロットでも、フェーズ空間の構造を説明するフェーズ ポートレートでもありません (マップには実際には適用されません)。

于 2015-05-04T02:26:06.543 に答える
1

clear all最初とdisp([j-1 x(j-1)]);for ループの内側に1 つずつ、2 つの簡単な変更を加えてコードを実行しました。以下は私の出力の最後の部分です。

52.0000    0.7500
53.0000    0.5000
54     1
55     0
Attempted to access x(56); index out of bounds because numel(x)=55.
Error in phaseSpacePlot (line 10)
    disp([j-1 x(j-1)]);

今では理解しやすいです。cos in you if else 条件ルールdouble(x(j-1)))<=0が定義されていない場合。したがって、その条件が満たされたときにループが終了します。if 条件に = 記号を追加するif (double(x(j-1)))>=0 && (double(x(j-1)))<0.5と、次のグラフが得られました。コードが機能するようになりましたが、数学的に正しいかどうかはわかりません。

ここに画像の説明を入力

于 2015-05-04T00:28:56.163 に答える