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 的旧定义中的 M[[2]],这显然不存在。

如何让 L 使用更新、更大版本的 M?

这样做之后,我可以使用 For 循环来生成整个列表,直到某个索引。

PS 我为糟糕的格式道歉,但我可以在这里找到如何使 Latex 代码工作。

其他小问题:函数和列表的允许名称是什么?名称中是否允许使用下划线?

4

2 回答 2

3

在我看来,好像您正在尝试计算结果

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

笔记:

  1. 逐个元素地构建列表,无论您使用循环还是其他构造,在 Mathematica 中几乎总是一个坏主意。要有效地使用该系统,您需要学习一些基本的功能结构,其中FixedPointList之一就是。
  2. 我没有提供任何关于我使用过的函数的解释,也没有解释诸如#和之类的符号&。这一切都包含在文档中,它比我能更好地解释问题,并且您应该熟悉这些内容。
  3. Mathematica 允许(仅)字母数字名称,并且它们必须以字母开头。当然,Mathematic 将除英文字母表中的 26 个字母之外的许多 Unicode 字符识别为字母。按照惯例(仅)内在名称以大写字母开头,您自己的以小写字母开头。
  4. Mathematica 名称中绝对不允许使用下划线,它作为Blank符号的缩写形式具有特定且广泛使用的解释。

哦,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}and结束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-#)&基本上是一个匿名函数#是它的参数, the&是把它括在 中的简写Function[])。该NestList方法将函数作为一个参数,并从x0, 开始递归地应用它进行n迭代。


其他小问题:函数和列表的允许名称是什么?名称中是否允许使用下划线?

没有下划线,它们用于模式匹配。否则,变量可以包含字母和特殊字符(如 theta 和 all),但不能包含在数学中有意义的字符(括号/大括号/方括号、at 符号、井号、& 符号、句点、算术符号、下划线, ETC)。它们可能包含一个美元符号,但最好不要以一个开头(这些通常保留给系统变量和所有变量,尽管您可以定义一个以美元符号开头的变量而不会破坏任何东西)。

于 2013-08-14T18:19:30.093 回答