递归关系的错误结果

时间:2014-04-16 09:52:29

标签: wolfram-mathematica

我从第15页的here获取了此代码。

代码:

s[i_] := s[i] = 2*s[i - 1] - 3*(s[i - 1])^2
s[0] = SetAccuracy[3/10, 20]
Do[Print[s[i]], {i, 0, 40, 10}]

输出:

3/10
0.33333333333333
0.3333333
0.3
0.*10^62

答案必须收敛到1/3

我该如何解决这个问题?

编辑: 我更正了代码。

1 个答案:

答案 0 :(得分:2)

您可以使用SetPrecision围绕计算,而不是初始值来轻松解决此问题:

ClearAll[s]
s[i_] := s[i] = SetAccuracy[2*s[i - 1] - 3*(s[i - 1])^2, 20]
s[0] = 3/10;
s[40]

(* Out[14]= 0.33333333333333333333 *)

让我谈谈您提到的网页。引用此示例下面的文字:

  

计算中有 nothing 来警告用户   结果可能在每一步都不可靠。对于   例如,没有累积的舍入误差,   数学家和工程师习惯了   看作是他们可能会得到的警告信号   有问题的结果。

事实并非如此。让我展示一下这个页面的屏幕截图

  

enter image description here

如您所见,最后的结果显示为红色,表示出现了问题。当您使用鼠标将鼠标悬停在结果上时,您会收到警告无显着位数。这就是说,错误已累积到一定程度,结果无法使用。

此外, Mathematica 意识到精度的降低,使用Precision可以轻松验证。让我用你的初始例子

ClearAll[s]
s[i_] := s[i] = 2*s[i - 1] - 3*(s[i - 1])^2
s[0] = SetPrecision[3/10, 20];

Precision /@ {s[1], s[2], s[10], s[25], s[40]}

你得到了

  

{19.4616,18.866,14.0496,5.01873,0。}

表明, Mathematica 会跟踪数字错误。

作为旁注:如果您将来要选择使用哪种产品,我请求您不要阅读此类材料。它的唯一目的是抹黑竞争对手。不幸的是,这些东西也可以在the other side上找到。如果你必须选择,那么选择你的朋友使用什么,因为他们可以帮助你。选择你大学使用的是什么,因为那样你就可以免费获得它。选择您可以支付的费用,因为有些产品更便宜或者可以用于学生奖品。等等..