我从第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
。
我该如何解决这个问题?
编辑: 我更正了代码。
答案 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 来警告用户 结果可能在每一步都不可靠。对于 例如,没有累积的舍入误差, 数学家和工程师习惯了 看作是他们可能会得到的警告信号 有问题的结果。
事实并非如此。让我展示一下这个页面的屏幕截图
如您所见,最后的结果显示为红色,表示出现了问题。当您使用鼠标将鼠标悬停在结果上时,您会收到警告无显着位数。这就是说,错误已累积到一定程度,结果无法使用。
此外, 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上找到。如果你必须选择,那么选择你的朋友使用什么,因为他们可以帮助你。选择你大学使用的是什么,因为那样你就可以免费获得它。选择您可以支付的费用,因为有些产品更便宜或者可以用于学生奖品。等等..