如何使用Mathematica中的列表的更改版本来创建函数?

时间:2013-08-14 14:17:24

标签: wolfram-mathematica

我想创建一个列表,其元素表示

给出的逻辑映射
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循环生成整个列表,直到某个索引。

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

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

2 个答案:

答案 0 :(得分:3)

我觉得你好像在试图计算

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

注意:

  1. 逐个元素构建列表,无论是使用循环还是其他构造,在Mathematica中几乎总是一个坏主意。要高效地使用系统,您需要学习一些基本的功能结构,其中FixedPointList就是一个。
  2. 我没有提供我所使用的功能的任何解释,也没有提供#&等符号的解释。这些都包含在文档中,它解释了比我更好的事情以及你应该熟悉的事情。
  3. Mathematica允许使用字母数字(仅限)名称,并且必须以字母开头。当然,Mathematic可识别除英文字母表中的26个字母以外的许多Unicode字符。按照惯例(仅),内在名称以大写字母开头,而您自己的名字以小写字母开头。
  4. Mathematica名称中绝对不允许使用下划线,它具有特定且广泛使用的解释,作为Blank符号的缩写形式。
  5. 哦,LaTeX格式在这里不起作用,但Mathematica代码足够可读。

答案 1 :(得分:1)

  

似乎在调用函数定义时   追加[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-#)&基本上是anonymous function#是其参数,&是将其括在Function[]中的简写。 NestList方法将函数作为一个参数,并以x0开始递归地应用它,用于n次迭代。


  

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

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