首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数列和环的理论计算

数列和环的理论计算
EN

Stack Overflow用户
提问于 2013-12-05 00:50:27
回答 3查看 1.5K关注 0票数 2

我试图计算级数之和: n=1 (1/n),Σ,n=inf。(对于每一个自然数n>0,计算1/n的和)

我们希望matlab返回循环数,直到-Σ(N)Σ(n-1)=0为止。

( ii)我们要计算代码需要结束的时间。

由于n的增量没有限制,所以代码的运行时间很长。然而,对于n=~10^8,我们应该使用ie符号和(1,n)来估计和数吗?如果不是,我们如何计算上述问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-05 03:18:56

我认为这就是你如何接近实际解决方案的方法。这绝不是一个理论上的解决方案,但它会缩小你的搜索范围的一个巨大的数量。首先,一些概念:

  1. 上述级数之和的值由调和数给出,其值可以近似为ln(n+1,其中n+1是迭代次数(而不是n)。例如,如果您运行10^8迭代,之和将是~ log(10^8-1)=18.420680733952366,而实际值(即代码)是18.997896413852555。我知道这是一个巨大的差异,但让我们接受它(至少我不知道任何其他方法)。

更新:请参阅对此答案的注释,您实际上可以添加Euler-Mascheroni常量,以获得更好的近似)。

  1. 随着sum值的增加,您的精度会变得更短,eps(sum)可以获得最小精度的值,即在10^8迭代之后,eps(sum)=3.552713678800501e-15的值。
  2. 每次迭代时的增量都需要计算,而且非常简单。在10^8迭代中,上一次迭代的增量是1/10^8
  3. 所以,我们想要的是,在(3)中得到的数应该大于(2)。如何在(2)中获得sum的值,或者在(1)中运行代码或使用方法(我做了后者)。
  4. 我观察到eps(8)>1e-15。迭代10^15 = 10^-15 < eps(8)的增量。因此,已经不可能达到10^15次迭代。让我们试试10^14迭代。迭代10^14 = 10^-14 < eps(64)的增量。这意味着,10^14次迭代的和应小于64次。是吗?让我们检查一下(1)中的公式。是= log(10^14-1) = 32.236191301916627
  5. 因此,我得出结论,在10^14次迭代时,精度仍然足够大,但在10^15时则不是。所以确切的迭代次数在10^14到10^15之间。好吧,你仍然可以缩小它,并且可能需要更多的努力来找到确切的迭代数。我已经给你指明了方向。

实际上,我发现了在满足条件时迭代的次数。我将其计算如下:

eps(33)= 7.105427357601002e-015 (因为eps的值为32到63,所以您的和永远不会达到64,所以这就是您应该处理的eps的值)。所以你需要你的增量刚好高于这个数字。因此,我决定将增量改为7.1055e-15。我们已经知道迭代的次数在10^14到10^15之间。因此,需要的迭代次数必须是k*10^14,其中k是介于1到10之间的常数(因为当k = 10本质上变成10^15)。解决(1/(k*10^14))=7.1055e-15 (您可以做得更好,我决定坚持使用7.1055e-15。我找到k=1.407360495390895了。因此,迭代次数= 1.407360495390895*10^14

我可能错了。请交叉核对。另外,我建议您在math.stackoverflow中发布这篇文章。在此之前,你需要一个理论上的解决方案,你可以得到更好的答案。

票数 1
EN

Stack Overflow用户

发布于 2013-12-05 00:53:23

你的问题有几个方面:

(广告一)定义一个循环,开始总结你的1/n

在Matlab命令tictoc下执行一个循环

最后但同样重要的一点是:您应该将1/n与机器epsilon进行比较,在Matlab中,这是eps,以便一旦机器无法添加与和相关的内容并中止循环,就会中止。根据所需的和精度,您当然可以提前中止,例如,将1/n与1e-8进行比较将意味着在n= 1e8处停止。

票数 0
EN

Stack Overflow用户

发布于 2013-12-05 15:34:41

您可以运行这段代码来测试它是否遇到任何实际的边界,我相信这正是您所要寻找的:

代码语言:javascript
复制
N = 1;
oldSum = -1;
mySum = 0;
tic
while oldSum~=mySum
    oldSum = mySum;
    mySum = mySum + 1/N;
    N = N+1;
end
toc
N

再想一想,这可能会永远持续下去。如果您使用此行,则:

代码语言:javascript
复制
 mySum = single(mySum + 1/N);

您可以看到精度较低的数据类型的结果。在21.5秒内,它达到2097153次迭代并终止。

这可以用来测试理论方法。

UPDATE I认为,与其降低精度,不如增加步长。下面是得到这个数字的近似的代码,从这里得到估计的计算时间应该不会那么困难:

代码语言:javascript
复制
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秒钟内完成,其中大约1秒用于大幅度增长,经过一些快速计算后,我认为完成这些工作的估计时间大约是:

18 + 1e8秒或大约3年。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20389277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档