0

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

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

例如,计算系列

总和 = -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 )
4

3 回答 3

2

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

对于初学者来说,不存在对“任何”无限级数求和的通用方法。对于每个系列,您必须单独确定如何对特定的一个进行求和,这首先需要研究其收敛特性:一个系列可能会收敛、发散或有条件地收敛。简单地添加项直到项变得小于某个限制,或者直到连续项之间的差异变得小于某个限制并不能保证您接近限制总和。事实上,它甚至不能保证总和是有限的(例如,考虑级数 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' 项将变得越来越大,因此任何简单的求和过程都必然会失败。另一方面,我们有 {log(1-x); 的 Maclaurin 展开式。-1<=x<1} 并且我们可能会思考这一切如何与 log(1-x) 肯定也存在并且对于 x=-4 是有限的知识相吻合:我们是否可以“定义”求和的极限这个对数也适用于 x<-1?!进入分析延续的奇妙世界。这个我就不多说了,太占篇幅了。

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

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

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

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

于 2012-10-22T21:24:14.760 回答
1

您的问题的部分答案:

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

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

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

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

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

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

于 2012-10-22T12:33:32.773 回答
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,其中 nabs(previous-current) < 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 )
于 2012-10-22T14:55:54.113 回答