似乎,当在 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)。它们可能包含一个美元符号,但最好不要以一个开头(这些通常保留给系统变量和所有变量,尽管您可以定义一个以美元符号开头的变量而不会破坏任何东西)。