我正在尝试计算系列之和:Σ(1 / n),n = 1,n = inf。 (对于每个自然数n> 0,计算1 / n的和)
i)我们希望matlab返回循环次数,直到Σ(n)-Σ(n-1)= 0。
ii)我们想要计算代码需要结束的时间。
由于n的增量没有限制,因此代码的运行时间很长。但是,我们是否应该使用ie symsum(1,n),对于n = ~10 ^ 8,对Sum数进行估计?如果没有,我们如何计算上述问题呢?
答案 0 :(得分:1)
我认为这就是你如何接近实际的解决方案。这绝不是一个理论上的解决方案,但它会缩小您的搜索范围。首先,一些概念:
ln(n+1
,其中n+1
是您的迭代次数(不是n
)。例如,如果您运行10^8
次迭代,则总和将为〜log(10^8-1)=18.420680733952366
,实际值(即按代码)为18.997896413852555
。我知道这是一个巨大的差异,但我们接受它(至少我不知道任何其他方法)。 更新:看到关于这个答案的评论,你可以实际添加Euler-Mascheroni常数常量以获得更好的近似值。)
随着sum
的值增加,您的精度变得更短,最小精度的值可以通过eps(sum)
获得,即在10^8
次迭代之后,{的值{1}}。
需要计算每次迭代的增量并且非常简单。在eps(sum)=3.552713678800501e-15
次迭代时,前一次迭代的增量为10^8
。
所以,我们想要的是(3)中得到的数字应该大于(2)。如何在(2)中获得sum的值,运行代码或使用(1)中的方法(我做了后者)。
我观察到1/10^8
。迭代时的增量eps(8)>1e-15
。因此,它已经不可能达到10 ^ 15次迭代。让我们尝试10^15 = 10^-15 < eps(8)
次迭代。迭代时的增量10^14
。这意味着你在10 ^ 14次迭代时的总和应该小于64.是吗?让我们从(1)中的公式中检查。它是10^14 = 10^-14 < eps(64)
。
所以我得出结论,在10 ^ 14次迭代中,精度仍然足够大,但是10 ^ 15则不然。因此,精确的迭代次数在10 ^ 14到10 ^ 15的范围内。好吧,您仍然可以缩小范围,并且可能需要更多努力才能找到确切的迭代次数。我已经告诉你了。
我实际上发现了满足条件时的迭代次数。我按如下方式计算:
= log(10^14-1) = 32.236191301916627
(因为eps(33)= 7.105427357601002e-015
从32到63取相同的值,而你的总和永远不会达到64,所以这是你应该处理的eps
的值。所以你需要增量才能超过这个数字。因此,我决定将增量设为eps
。我们已经知道迭代次数介于10 ^ 14和10 ^ 15之间。因此,所需的迭代次数必须为7.1055e-15
,其中k是1到10之间的常数(因为当k*10^14
时,它基本上变为k = 10
)。解决10^15
(你可以更精细,我决定坚持(1/(k*10^14))=7.1055e-15
。我得到7.1055e-15
。因此,迭代次数= k=1.407360495390895
。
P.S。我错了。请反复核对。另外,我建议你在math.stackoverflow中发布这个。在重新定义问题之前,你要求理论解决方案,你可以得到更好的答案。
答案 1 :(得分:0)
您的问题有几个方面:
ad i)定义一个循环,开始总结你的1 / n
ad ii)在Matlab命令tic
和toc
最后但并非最不重要:您应该将1 / n与机器epsilon进行比较,在Matlab中这是eps
,以便在您的机器甚至无法添加与您的总和相关的内容并中止循环时中止。根据所需的总和准确度,您当然可以提前中止,例如,将1 / n与1e-8进行比较意味着在n = 1e8处停止。
答案 2 :(得分:0)
您可以运行此代码来尝试它是否符合任何实际界限,我相信它正是您所寻找的:
N = 1;
oldSum = -1;
mySum = 0;
tic
while oldSum~=mySum
oldSum = mySum;
mySum = mySum + 1/N;
N = N+1;
end
toc
N
第二个想法,这可能会永远持续下去。如果您改用此行:
mySum = single(mySum + 1/N);
您可以查看精度较低的数据类型的结果。在21.5秒内,它达到2097153次迭代并终止。
这可以用来测试理论方法。
<强>更新强> 我认为不是降低精度,而是可以增加步长。下面是获得数字近似值的代码,甚至不应该很难从中得到估计的计算时间:
N = 1;
oldSum = -1;
mySum = 0;
p=10;
tic
while oldSum~=mySum && N
oldSum = mySum;
mySum = mySum + 1/N;
if N<1e9 % We need to build up till approximately the right number
N = N+1;
else % Here the decrease in 1/N is much more significant than the change in epsilon
N = N+1e8;
end
end
toc
此代码在19秒内完成N = 5.6295e+14
,其中约1秒用于大幅增加,经过一些快速计算后,我认为估计的时间大约是: