【问题标题】:Calculate the sum of a series计算一个序列的总和
【发布时间】:2013-12-02 23:41:45
【问题描述】:

我需要使用混合和递归方法计算无限级数的总和。这两种方法有什么区别?

下面的代码显示了我是如何做到的。我使用哪种方法?

例如,计算序列

总和 = -X -(X^2/2) -(X^3/3) -(X^4/4)....等

我会使用这个代码

sum := -x;
numerator:= x;
n := 2;
current := -x; 

repeat
  numerator := numerator * x;
  previous := current;
  current := numerator/n;  
  n := n + 1;
  sum := sum - current;
until ( abs(previous-current) < eps )

【问题讨论】:

  • 我从您的描述中假设“行”是单调递减的?如果是这种情况,请明确说明(并注意这对于系列a_i = 1/i 可能不够。关于“行”的更多细节?是geometric series
  • 就个人而言,我不知道您使用的是什么方法。为什么不发布一些伪代码来帮助我们帮助您。
  • 无穷大的和就是无穷大。与无穷大 + 1 = 无穷大相同。 ;-)。请改写您的问题。
  • @Vash: 1/2^i 总和不是无穷大
  • @phil13131 这是一个帕斯卡代码。你有什么不能理解的?将“:=”更改为“=”,将“repeat-until”更改为“do-while”,您将获得 C 上的代码。 sum、numerator、n、current - 是浮点变量。如果对您有帮助,我当然可以将完整的代码放在这里,但我相信我将添加的只是从键盘输入变量,并向变量添加类型。

标签: algorithm math sum


【解决方案1】:

您的问题/问题太模糊/太笼统。因此,我只能提供一些一般性评论:

对于初学者来说,不存在对“任何”无限级数求和的通用方法。对于每个系列,您必须分别确定如何对特定的一个进行求和,这首先需要研究其收敛特性:一个系列可能会收敛、发散或有条件地收敛。简单地添加项直到项变得小于某个限制,或者直到连续项之间的差异变得小于某个限制并不能保证您接近限制总和。事实上,它甚至不能保证总和是有限的(例如,考虑级数 1 + 1/2 + 1/3 + 1/4 ...)。

现在,让我们看一下您的示例:-sum( x^n/n; n=1..inf )。 这个特定系列对于任何 x>=1 和 x

对于abs(x)&lt;1,添加连续项的“直截了​​当”的方法将“最终”为您提供正确的答案,但您需要很长时间才能接近极限总和,除非 x 非常小,并且评估您与任何有限子和的接近程度绝非易事。此外,还有更好(=更快收敛)的方法来对这些类型的序列求和。

在这个特定的情况下,你可能注意到它是 log(1-x),用麦克劳林级数展开表示,所以根本不需要设置繁琐的求和,因为无限求和的结果已经已知。

现在,一方面我们可以很容易地看到,每当 abs(x) 大于 1 时,对于更高的 'n',项会变得越来越大,因此任何简单的求和过程都必然会失败。 另一方面,我们有 {log(1-x); 的 Maclaurin 展开式。 -1

总而言之,对无限级数求和是一门艺术,而不是扔进标准求和机的东西。因此,如果不指定您希望对哪个系列求和,您就无法先验地说明应该采用哪种方法。

最后,我不知道你所说的“混合方法”是什么意思,所以我不能对此发表评论,也不能评论它与递归方法的比较。只要您可以以与原始形式非常相似但只是“稍微简单”的形式编写系列,就可能会出现递归方法。一个例子,不是来自无限级数,而是来自有限级数:斐波那契数 F(n) 可以定义为有限和 F(N-1)+F(n-2)。那是递归,你“只”需要知道一些基值 - i.c: F(0)=F(1)=1 - 然后你就有了你的递归设置。以递归形式重写序列可能有助于找到解析解,或者拆分具有解析解的部分,留下“更方便”的序列,这有助于快速收敛的数值方法。

也许“混合方法”旨在表示分析总和的混合 - 就像您的系列:log(1-x) - 和一些(智能或蛮力)数值近似(正如其他人指出的那样, “递归”可能意味着“迭代”)。

总结:(a) 阐明“混合”和“递归”方法的含义; (b) 具体说明您需要求和的系列类型,以免没有合理的答案。

【讨论】:

    【解决方案2】:

    您的问题的部分答案:

    我不知道你所说的“混合”方法是什么意思,但如果你有 2 种方法并用它们的一部分制作了一个新方法,那么我想我可以看到你会有一个混合方法.但作为一个常用的、现成的术语,它对我来说毫无意义。既然你将它与“递归”进行对比,而且我已经确定你不是以英语为母语的人,我想知道你是否打算写“迭代”?比较和对比“迭代”和“递归”方法是很常见的。

    您向我们展示的是一种“迭代”方法;一个简单的观点是,迭代方法是一种依赖于循环(或循环)的方法,就像您的代码一样。

    顺便说一句,如果您认识到系列中的第一个术语与所有其他术语具有相同的形式,我认为您可以使您的代码更简单,您已将 (X^1)/1 简化为 X,这在数学上是正确的,但在计算上是正确的对相同项的序列进行操作通常比对第一项在形式上与其他项不同的序列进行操作更直接。

    递归方法是一种调用自身的方法。由于我怀疑我正在帮助您完成作业,因此我不会为您编写递归方法,但您应该寻找具有近似形式的函数:

    sum([]) = 0
    sum([a b c d ...]) = a + sum([b c d ...])
    

    请注意,“函数”sum(在 2 个“子句”中定义)出现在第二个子句的左侧和右侧。另请注意,在右侧,它应用于输入参数的子集(左侧),这提供了函数在某个阶段终止的可能性。

    【讨论】:

      【解决方案3】:

      你介绍的系列

      -X -(X^2/2) -(X^3/3) -(X^4/4)...

      可以写成

      -(X^1/1) - (X^2/2) - (X^3/3) ... -(X^n/n)

      这为我们提供了

      重复-(X^i/i)直到n,其中n是abs(previous-current) &lt; eps,每次都增加i

      这给了我们:

      希望下面的代码能满足您的期望。

      i := 1;
      sum := 0;
      current := x;
      
      repeat
        previous := current;
        current  := - exp(x, i) / i; {Here you call a function exp that realise x^i}
        sum      := sum + current;
        i        := i + 1;
      until ( abs(previous-current) < eps )
      

      【讨论】:

      • 这个答案的求和表达式是错误的;在求和范围内,右边的表达式应该在左边。右侧应具有@BertteVelde 的答案中解释的形式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2018-08-07
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2020-01-27
      相关资源
      最近更新 更多