计算一系列的总和

时间:2012-10-22 09:28:00

标签: algorithm math sum

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

下面的代码展示了我的表现。我使用哪种方法?

例如,计算系列

  

Sum = -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 )

3 个答案:

答案 0 :(得分:1)

您问题的答案的某些部分:

我不知道你的'混合'方法是什么意思,但是如果你有2个方法并且用两个方法中的一个方法做了一个新方法那么我想我可以看到你会有一个混合方法。但作为一个普遍使用的,现成的术语,它对我来说毫无意义。既然你把它与'递归'对比起来,既然我已经决定你不是母语为英语的人,我想知道你是不是想写'迭代'?找到“迭代”和“递归”方法进行比较和对比非常普遍。

你向我们展示的是一种'迭代'方法;一个简单的观点是迭代方法是一个依赖于代码所做的循环(或循环)的方法。

顺便提一下,如果您认为系列中的第一个字词与所有其他字词的格式相同,我认为您可以使代码更简单,您已将(X^1)/1简化为X,这是数学上的正确的,但在计算上,通常更简单地操作一系列相同的术语,而不是第一个术语在形式上与其他术语不同的序列。

递归方法是调用自身的方法。因为我怀疑我正在帮你做作业,所以我不会为你写一个递归方法,但你应该找一个具有近似形式的函数:

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

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

答案 1 :(得分:1)

你的问题/问题太模糊/太笼统。因此,我提供的不仅仅是一些一般性评论:

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

现在,我们来看看你的例子:-sum(x ^ n / n; n = 1..inf)。 该特定系列对于任何x> = 1都没有有限和,并且对于x <-1:它不会收敛,除非-1 <= x <1,这些项越来越大......(但是,请继续阅读!)。

对于abs(x)<1,“直接”添加连续术语的方法将“最终”给出正确答案,但在接近极限总和之前需要很长时间,除非x非常很小,并评估你如何接近任何有限的子和是非常微不足道的。此外,还有更好的(=快速收敛)方法来对这类系列进行求和。

在这种特殊情况下,您可能会注意到它是log(1-x),用Maclaurin系列扩展表示,因此根本不需要设置繁琐的求和,因为无限求和的结果已经是已知的。

现在,一方面考虑我们可以很容易地看到,当abs(x)大于1时,对于更高的'n',术语将越来越大,因此任何简单的求和过程都必然会失败。 另一方面,我们将这个Maclaurin扩展为{log(1-x); -1&lt; = x&lt; 1}我们可能会思考它是如何与知识一致的,即log(1-x)也存在并且对于x = -4是有限的:我们是否可以'定义'求和的极限对于x <-1这个对数?!进入分析延续的精彩世界。我不打算这样做,这里需要太大的空间。

总而言之,总结一个无限系列是一门艺术,而不是投入到标准求和机器中。因此,如果没有指定您想要求和的系列,您不能先验地说出应该采用的方法。

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

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

总结:(a)澄清“混合”和“递归”方法的含义; (b)具体说明你需要总结什么类型的系列,以免没有明智的答案。

答案 2 :(得分:0)

你提出的系列

  

-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) < eps每次增加

这给了我们:

series

我希望波纹管代码满足您的期望。

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 )