ロジスティックマップの奇妙な魅力


21

チャレンジの目的は、約プロットすることであるアトラクタロジスティックマップをそのパラメータの関数としてR(別名分岐図)、またはそのサブ領域。グラフの外観は、Wikipediaの次の画像で確認できます。

ここに画像の説明を入力してください

バックグラウンド

ロジスティックマップは、入力とる数学関数であるX kは、出力にマップX K + 1のように定義します

             x k + 1 = r x k(1− x k

ここで、rは間隔[0、4]にあると想定されるマップのパラメーターです。

[0,4]のrと区間[0,1]の初期値x 0が与えられると、多数の反復Nに対して関数を繰り返し適用し、最終値x Nを生成することは興味深いです。x Nは必ず[0,1]にもあることに注意してください。

例として、r = 3.2、N = 1000を考えます。初期値x 0 = 0.01はx 1000 = 0.5130を与えます。以下のために、X 0 = 0.02結果は、X 0 = 0.7995。以下のための任意の他の初期値xは0最終値X 1000は、非常に近い0.5130または0.7995いずれかです。これは、水平位置r = 3.2 での2本の線の高さとしてグラフに表示されます。

これは、r = 3.2の場合、各シーケンスがこれら2つの値のいずれかに収束することを意味しませ。実際、上記で検討した2つの初期値の場合、シーケンスは次のとおりです(振動動作に注意してください)。

             x 0 = 0.01、...、x 1000 = 0.5130、x 1001 = 0.7995、x 1002 = 0.5130、...
             x 0 = 0.02、...、x 1000 = 0.7995、x 1001 = 0.5130、x 1002 = 0.7995 、...

である本当のことは十分に大きいためのことであるN、ほぼ全ての初期値に対して、X 0、用語xはNの集合{0.5130、0.7995}の要素の1つに近くなります。このセットは、この特定のrのアトラクターと呼ばれます。

パラメーターrの他の値については、アトラクターセットまたはその要素のサイズが変更されます。グラフは、各rのアトラクターの要素をプロットします。

特定のためのアトラクタRはすることができ、推定によって

  1. 広範囲の初期値x 0をテストします。
  2. 多数のN回の反復に対してシステムを進化させます。そして
  3. 得られた最終値x Nに注意してください。

チャレンジ

入力

  • N:反復回数。

  • R 1 R 2および S。これらは rの値の集合 R、すなわち R = { r 1 r 1 + s r 1 + 2 s、...、 r 2 }を定義します。

手順

初期値x 0のセットXは固定されています:X = {0.01、0.02、...、0,99}。オプションで、0と1もXに含めることができます。

それぞれについて、R内のR及び各X 0におけるX、反復ロジスティックマップN生成する時間がxはNを。取得したタプル(rx N)を記録します。

出力

各タプル(rx N)を、rを水平軸、x Nを垂直軸とする平面上の点としてプロットします。出力はグラフィックでなければなりません(ASCIIアートではありません)。

追加のルール

  • 示された手順は必要な結果を定義しますが、強制されません。(rx N)タプルの同じセットを処理する他の手順を使用できます。
  • 入力は通常どおり柔軟です。
  • 浮動小数点エラーは、回答者に対して保持されません。
  • 受け入れられた形式のいずれかで、グラフィック出力が必要です。特に、出力を画面に表示したり、グラフィックファイルを作成したり、RGB値の配列を出力したりできます。ファイルまたは配列を出力する場合は、表示されたときの表示例を投稿してください。
  • グラフィックはベクターまたはラスターです。ラスタグラフィックスの場合、画像のサイズは少なくとも400×400ピクセルである必要があります。
  • 各ポイントは、単一のピクセルとして、または1ピクセル程度のサイズのマークとして表示する必要があります(そうしないと、グラフがすぐに乱雑になります)。
  • 軸の範囲は、r(水平軸)の場合は[0,4 ]、x N(垂直軸)の場合は[0,1]である必要があります。または、取得したすべてのポイントが含まれている限り、より小さくてもかまいません。
  • 軸スケールは任意です。特に、スケールは両方の軸で同じである必要はありません。
  • グリッド線、軸ラベル、色、および同様の要素は受け入れ可能ですが、必須ではありません。
  • バイト単位の最短コードが優先されます。

テストケース

高解像度バージョンの各画像をクリックします。

N = 1000; r1 = 2.4; r2 = 4; s = 0.001;

ここに画像の説明を入力してください

N = 2000; r1 = 3.4; r2 = 3.8; s = 0.0002;

ここに画像の説明を入力してください

N = 10000; r1 = 3.56; r2 = 3.59; s = 0.00002;

ここに画像の説明を入力してください

了承

@FryAmTheEggman@AndrasDeakに、サンドボックスでのチャレンジ中の有益なコメントに感謝します。


何のPythonソリューションはありませんか?!

@Lembik IリファレンスPythonで実装(およびMATLABで)を持っていますが、私は自分自身に答えることをしたくない
ルイスMendo

あなたはPPCGに関するあなた自身の質問に答えることができます(おそらく驚くべきことです)。

@Lembik私は知っていますが、他の人の答えが欲しい
ルイスメンドー

回答:


13

MATL、32 30 28 27バイト

@Luisのおかげで4バイト節約

3$:0:.01:1!i:"tU-y*]'.'3$XG

入力形式はr1sr2、およびN

MATL Online試しください

ここに画像の説明を入力してください

説明

        % Implicitly grab the first three inputs
3$:     % Take these three inputs and create the array [r1, r1+s, ...]
0:.01:1 % [0, 0.01, 0.02, ... 1]
!       % Transpose this array
i       % Implicitly grab the input, N
:"      % For each iteration
  tU    % Duplicate and square the X matrix
  -     % Subtract from the X matrix (X - X^2) == x * (1 - x)
  y     % Make a copy of R array
  *     % Multiply the R array by the (X - X^2) matrix to yield the new X matrix
]       % End of for loop
'.'    % Push the string literal '.' to the stack (specifies that we want
        % dots as markers)
3$XG    % Call the 3-input version of PLOT to create the dot plot

8

Mathematica、65バイト

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&

引数N、r1、r2、sをこの順序で取る純粋な関数。から始まる合計回数でNest[r#(1-#)&,x,N]ロジスティック関数を繰り返します。ここでは、関数の最初の引数()が問題です。生成そのプロットさせていただきます。これらのポイントの集合を作成します。値はからの増分で実行されます。で全ての第2のものから元の関数の引数の意味などに展開r#(1-#)&Nx#NPoint@{r,...}PointGraphicsTable[...,{x,0,1,.01},{r,##2}]x01.01##2{r,##2}{r,##2}{r,r1,r2,s}正しくための範囲及び増分を設定しますr

2番目のテストケースのサンプル出力:入力

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&[2000,3.4,3.8,0.0002]

以下のグラフィックスが生成されます。

ここに画像の説明を入力してください


1
59バイトListPlot @ Table [{r、Nest [r#(1-#)&、x、#]}、{x、0,1、.01}、{r、## 2}]&
J42161217

チャレンジで、示された手順は必要な結果を定義することを意図しているが、手順自体は強制されていないことを明確にしました。同じ結果が得られる他の手順を使用できます。最初ははっきりしていなかった場合は申し訳ありません
ルイスメンドー

問題ありません、いくつかの良い答えがあります!
グレッグマーティン

1
これらの-6バイトを使用するつもりはありません。このソリューションでは、ソマスティングが間違っていると思いますか?
J42161217

ああ、私はあなたのコメントからコード....あなたの答えは(のバージョン)の投稿だと思った
グレッグ・マーティン

5

Mathematica、65バイト

グレッグマーティンのトリックをいくつか使用しましたが、これはグラフィックスを使用しない私のバージョンです

ListPlot@Table[{r,NestList[#(1-#)r&,.5,#][[-i]]},{i,99},{r,##2}]&

入力

[1000、2.4、4、0.001]

出力

ここに画像の説明を入力してください

入力

[2000、3.4、3.8、0.0002]

出力

ここに画像の説明を入力してください


1
初期値0または1(およびそれらが生成するx = 0行)を回避することを選択した最初の回答:
ルイスメンドー

コードが実際に指定された手順に従っていないため、コードが行うことの説明を追加する必要があります。OPは、正確に見える結果が代替方法を正当化するかどうかを決定できます。
グレッグマーティン

指定された手順は強制されません。他の方法で同じ結果をもたらすものはすべて許可されます(これを明確にします)。これに関係なく、私は説明を見てみたい
ルイスメンドー

すべてのrに対してプロットする必要があるポイントは、すべての「ネスト」にすでに存在します。これは元のコードであり、このダイアグラムをプロットするための最初のアプローチ(しばらく前)でした。
J42161217

@Luis Mendo私はさらに短いバージョンを持っています(数学の記録を作成します).58バイトですが、3つの入力[N、r1、r2]のみを入力する必要があります。時間がかかりますが動作します。Plot[Table [NestList [#( 1-#)r&,. 5、#] [[-i]]、{i、99}]、{r、## 2}]&
J42161217

2

TI-Basic、85バイト

Prompt P,Q,S,N
P→Xmin:Q→Xmax
0→Ymin:1→Ymax
For(W,.01,1,.01
For(R,P,Q,S
W→X
For(U,1,N
R*X*(1-X→X
End
Pt-On(R,X
End
End

入力を順番に受け取りr1,r2,s,N、グラフ画面にリアルタイムで出力を表示する完全なTI-Basicプログラム。これは非常に遅い傾向があることに注意してください。

入力に対して約2.5時間後に生成された不完全なサンプル出力を次に示します3,4,0.01,100

ここに画像の説明を入力してください


*標識は必要ありません。
リルトシアスト

1

ProcessingJS、125の 123 120バイト

3バイトを節約してくれたKritixi Lithosに感謝します。

var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;p<=r;p+=s){x=i;for(j=0;j<n;j++)x*=p-p*x;point(p*1e3,1e3-x*1e3)}}

オンラインでお試しください!を使用して呼び出しますf(N, r_1, r_2, s);


私はあなたが交換することができると思うvoidvar、それは処理だからJS
KritixiのLithos

x*=p*(1-x)なることができますx*=p-p*x
Kritixi Lithos

forループ再配置することによって、私が手var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;x=i,p<=r;point(p*1e3,1e3-x*1e3),p+=s)for(j=0;j<n;j++)x*=p-p*x;}119バイトで
KritixiのLithos

1

GEL、158バイト

`(N,r,t,s)=(LinePlotWindow=[r,t,0,1];for i=r to t by s do(p=.;for w=0to 1by 0.01do(x=w;for a=0to N do(x=i*x*(1-x););p=[p;q=[i,x]];);LinePlotDrawPoints(p);););

それは最短ではないかもしれませんが、リアルタイムで描画しますが、巨大な入力では非常に遅くなる可能性があります。とにかく、これは形式で入力を受け取り(N,r1,r2,s)、新しいウィンドウでプロットを出力する匿名関数です。これはGNOMEバージョンのGeniusで実行する必要があることに注意してください。

サンプル出力


1

R、159 147バイト

pryr::f({plot(NA,xlim=c(a,b),ylim=0:1);q=function(r,n,x=1:99/100){for(i in 1:n)x=r*x*(1-x);x};for(i in seq(a,b,s))points(rep(i,99),q(i,n),cex=.1)})

機能の製品

function (a, b, n, s) 
{
    plot(NA, xlim = c(a, b), ylim = 0:1)
    q = function(r, n, x = 1:99/100) {
        for (i in 1:n) x = r * x * (1 - x)
        x
    }
    for (i in seq(a, b, s)) points(rep(i, 99), q(i, n), cex = 0.1)
}

plot(NA,...)正しい寸法の空のキャンバスを作成します。q反復を行う関数です。これは、の値をとりr、その後、ないn間、全ての出発地点のための反復を0.01して0.99。次に、結果のベクトルを返します。

forループは、step を使用して関数qをシーケンスaに適用します。値を返す代わりに、ポイントをプロットに追加します。引力点が1つの値である場合、すべての点が重なり合って1つの点として表示されます。ポイントをできるだけ小さくするために必要な追加です。bscex=.1

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.