我在Mathematica中做了这个来计算Sqrt [5]:
a[0] = 2
a[n_] := a[n] = a[n-1] - (a[n-1]^2-5)/2/a[n-1]
[25]与Sqrt [5]有多接近?
N[Sqrt[5]-a[25]] // FortranForm
4.440892098500626e-16
[25] ^ 2到5有多接近?
N[a[25]^2-5] // FortranForm
8.305767102358763e-42074769
这对我来说似乎很奇怪。我估计:如果x在Sqrt [5]的10 ^ -n之内, 然后x ^ 2在10 ^( - 2 * n)之内,给出或取。没有?事实上:
a[25]^2 = (Sqrt[5]-4.440892098500626e-16)^2 ~ 5 - 2*5*4.440892098500626e-16
(扩展(a-b)^ 2),因此精度应该只有大约14位数 (或一般n位数)。
当然,牛顿的方法在25中只能产生15位准确数字 迭代也似乎很奇怪。
我在上面的计算中过早地失去了精度吗?请注意:
N[Log[Sqrt[5]-a[25]]] // FortranForm
-35.35050620855721
同意上面的15位精度,即使我在之后做N [] 记录日志(所以它应该是准确的)。
答案 0 :(得分:1)
问题是Mma如何计算你的序列。
a [n]是有理数。让我们以loglog标度查看分子的数量级:
a[0] = 2
a[n_] := a[n] = a[n-1] - (a[n-1]^2-5)/2/a[n-1]
ListPlot@Table[Log[10, Log[10, Numerator[ a[i]]]], {i, 1, 25}]
所以,你的分子正以双指数的形式增加。
在[25]之前实现了10 ^ -16精度:
For[i = 1, i < 5, i++,
Print["dif[", i, "]= ", N[a[i] - Sqrt[5], 16]]
]
dif[1]= 0.01393202250021030
dif[2]= 0.00004313361132141470
dif[3]= 4.160143063513508*10^-10
dif[4]= 3.869915959583412*10^-20
之后,您已开始控制除法的精度,因为[5]的分子已有20位数。