3

によって与えられた論理マップを表す要素を持つリストを作成したい

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

次のコードを試しました(Forループの代わりに手動で追加します):

x0 = Input["Enter x0"]
a = Input["a"]
M = {x0}
L[n_] := If[n < 1, x0, a*M[[n]]*(1 - M[[n]])]
Print[L[1]]
Append[M, L[1]]
Print[M]
Append[M, L[2]]
Print[M]

出力は次のとおりです。

0.3
2
{0.3}
0.42
{0.3,0.42}
{0.3}
Part::partw: Part 2 of {0.3`} does not exist. >>
Part::partw: Part 2 of {0.3`} does not exist. >>
{0.3, 2 (1 - {0.3}[[2]]) {0.3}[[2]]}
{0.3}

関数定義が Append[M,L[2]] で呼び出されているとき、L[2] は M[[2]] を M の古い定義で呼び出しているように見えますが、これは明らかに存在しません。

L に新しい、より大きなバージョンの M を使用させるにはどうすればよいですか?

これを行った後、For ループを使用して、特定のインデックスまでのリスト全体を生成できます。

PS 書式設定が不十分で申し訳ありませんが、ここで Latex コードを機能させる方法を見つけることができました。

その他の小さな質問: 関数とリストに使用できる名前は何ですか? 名前にアンダースコアを使用できますか?

4

2 に答える 2

3

の結果を計算しようとしているかのように見えます

FixedPointList[a*#*(1-#)&, x0]

ノート:

  1. 要素ごとにリストを作成することは、ループを使用するか他の構造を使用するかに関係なく、Mathematica ではほとんど常に悪い考えです。システムを生産的に使用するには、基本的な機能構造のいくつかを学ぶ必要があります。そのうちのFixedPointList1 つです。
  2. #使用した関数の説明も、やなどの記号の解釈についても説明していません&。これはすべて、私よりも詳しく説明されているドキュメントでカバーされており、よく知っておく必要があります。
  3. Mathematica では英数字(のみ)の名前を使用でき、名前は文字で始まる必要があります。もちろん、Mathematic は英語のアルファベット 26 文字以外の多くの Unicode 文字をアルファベットとして認識します。慣例 (のみ) により、固有の名前は大文字で始まり、独自の名前は小文字で始まります。
  4. Blankアンダースコアは Mathematica の名前では絶対に許されません.記号の短縮形として特定の広く使われている解釈があります.

ああ、LaTeX の書式設定はここでは機能しませんが、Mathematica のコードは十分に読みやすくなっています。

于 2013-08-14T14:44:22.523 に答える
1

関数定義が Append[M,L 2 ] で呼び出されているとき、L 2は M の古い定義で M[ 2 ] を呼び出しているように見えますが、これは明らかに存在しません。

L に新しい、より大きなバージョンの M を使用させるにはどうすればよいですか?

Mここで更新されることはありません。渡したパラメーターを変更Appendしません。配列の連結値を返します。

したがって、次のコード:

A={1,2,3}
B=Append[A,5]

B={1,2,3,5}と で終わりA={1,2,3}ます。A変更されていません。

出力を分析するには、

0.3 // Output of x0 = Input["Enter x0"]. Note that the assignment operator returns the the assignment value.
2 // Output of a= Input["a"]
{0.3} // Output of M = {x0} 
0.42 // Output of Print[L[1]] 
{0.3,0.42} // Output of Append[M, L[1]]. This is the *return value*, not the new value of M 
{0.3} // Output of Print[M] 
Part::partw: Part 2 of {0.3`} does not exist. >> // M has only one element, so M[[2]] doesn't make sense 
Part::partw: Part 2 of {0.3`} does not exist. >> // ditto 
{0.3, 2 (1 - {0.3}[[2]]) {0.3}[[2]]} (* Output of Append[M, L[2]]. Again, *not* the new value of M *)
{0.3} // Output of Print[M]

ここでの簡単な修正は、 を使用することM=Append[M, L[1]]です。

単一の for ループで実行するには:

xn=x0;
For[i = 0, i < n, i++,
  M = Append[M, xn];
  xn = A*xn (1 - xn)

];

より高速な方法はNestList[a*#*(1-#)&, x0,n]、上記の Mark が述べた方法のバリエーションとして使用することです。

ここで、式a*#*(1-#)&は基本的に無名関数です(#はそのパラメーターであり、&はそれを で囲む省略形ですFunction[])。このメソッドは、関数を 1 つの引数として取り、繰り返しのために ,NestListから始まる関数を再帰的に適用します。x0n


その他の小さな質問: 関数とリストに使用できる名前は何ですか? 名前にアンダースコアを使用できますか?

アンダースコアはありません。パターン マッチングに使用されます。それ以外の場合、変数にはアルファベットと特殊文字 (theta や all など) を含めることができますが、Mathematica で意味を持つ文字 (括弧/中括弧/大括弧、アットマーク、ハッシュ記号、アンパサンド、ピリオド、算術記号、アンダースコア) を含めることはできません。など)。これらにはドル記号が含まれる場合がありますが、ドル記号で始まらないことが望ましいです (これらは通常、システム変数とすべてのために予約されていますが、何も壊さずにドル記号で始まる変数を定義できます)。

于 2013-08-14T18:19:30.093 に答える