26

哪种编程语言或库能够处理无限级数(如几何或谐波)?它可能必须有一些知名系列的数据库,并在收敛的情况下自动给出适当的值,并且可能在发散的情况下生成异常。

例如,在 Python 中,它可能看起来像:

sum  = 0
sign = -1.0
for i in range(1,Infinity,2):
     sign = -sign
     sum += sign / i

然后, sum 必须是 math.pi/4 而不在循环中进行任何计算(因为它是众所周知的 sum)。

4

13 回答 13

18

大多数惰性求值的函数式语言都可以模拟无穷级数的处理。当然,我相信您知道,在有限计算机上不可能处理无限级数。在我的脑海中,我猜Mathematica可以做你可能想要的大部分事情,我怀疑Maple也可以,也许Sage和其他计算机代数系统,如果你找不到 Haskell 实现,我会感到惊讶适合你。

编辑以澄清 OP:我不建议生成无限循环。惰性求值允许您编写模拟无限系列的程序(或函数),这些程序本身在时间和空间上都是有限的。使用此类语言,您可以确定模拟无限级数的许多属性,例如收敛性,并且具有相当高的准确性和一定程度的确定性。尝试Mathematica,或者,如果您无法访问它,请尝试Wolfram Alpha,看看一个系统可以为您做什么。

于 2010-03-31T10:59:46.930 回答
15

一个地方可能是计算机代数系统的维基百科类别。

于 2010-03-31T11:18:16.373 回答
13

除了简单地支持无限列表之外,Haskell 中有两个可用的工具。

首先有一个模块支持在 OEIS 中查找序列。这可以应用于您的系列的前几个术语,并可以帮助您识别您不知道封闭形式的系列等。另一个是可计算实数的“CReal”库。如果您有能力为您的值生成一个不断改进的界限(即通过对前缀求和,您可以将其声明为允许部分排序的可计算实数等。在许多方面,这为您提供了一个您可以像上面的总和一样使用。

然而,在一般情况下,计算两个流的相等性需要一个预言机来解决停止问题,所以没有一种语言可以完全通用地做你想做的事情,尽管像 Mathematica 这样的一些计算机代数系统可以尝试。

于 2010-03-31T18:36:19.230 回答
12

千里马可以计算一些无限的和,但在这种特殊情况下,它似乎没有找到答案:-s

(%i1) sum((-1)^k/(2*k), k, 1, inf), simpsum;
                                 inf
                                 ====       k
                                 \     (- 1)
                                  >    ------
                                 /       k
                                 ====
                                 k = 1
(%o1)                            ------------
                                      2

但例如,那些工作:

(%i2) sum(1/(k^2), k, 1, inf), simpsum;
                                        2
                                     %pi
(%o2)                                ----
                                      6

(%i3) sum((1/2^k), k, 1, inf), simpsum;
(%o3)                                  1
于 2010-03-31T11:32:07.933 回答
9

在Sage(一个免费的基于 Python 的数学软件系统)中,您可以完全按照以下方式解决级数问题:

sage: k = var('k'); sum((-1)^k/(2*k+1), k, 1, infinity)
1/4*pi - 1

在幕后,这实际上是在使用 Maxima(Sage 的一个组件)。

于 2010-08-17T22:08:16.957 回答
7

对于 Python,请查看SymPy - Mathematica 和 Matlab 的克隆。

还有一个更重的基于 Python 的数学处理工具,称为Sage

于 2010-03-31T11:24:18.870 回答
4

你需要一些可以像Mathematica这样进行符号计算的东西。您也可以考虑查询 wolframaplha: sum((-1)^i*1/i, i, 1 , inf)

于 2010-04-18T15:46:18.407 回答
3

有一个叫mpmath(python)的库,是sympy的一个模块,它为sympy提供了系列支持(我相信它也支持sage)。
更具体地说,所有系列的东西都可以在这里找到:系列文档

于 2010-04-19T18:05:19.813 回答
3

C++ iRRAM 库精确地执行真正的算术运算。除其他外,它可以使用 limit 函数精确计算限制。iRRAM 的主页在这里。查看文档中的限制功能。请注意,我不是在谈论任意精度算术。这是精确的算术,对于精确的合理定义。这是他们精确计算 e 的代码,取自他们网站上的示例:

//---------------------------------------------------------------------
// Compute an approximation to e=2.71.. up to an error of 2^p
 REAL e_approx (int p)
{
  if ( p >= 2 ) return 0;

  REAL y=1,z=2;
  int i=2;
  while ( !bound(y,p-1) ) {
    y=y/i;
    z=z+y;
    i+=1;
  }
  return z;
};

//---------------------------------------------------------------------
// Compute the exact value of  e=2.71.. 
REAL e()
{
  return limit(e_approx);
};
于 2010-05-05T00:28:46.227 回答
2

ClojureHaskell在我脑海中浮现。

抱歉,我找不到更好的 haskell 序列链接,如果其他人有,请告诉我,我会更新。

于 2010-03-31T11:26:50.143 回答
1

为了研究目的,我曾在几个巨大的数据系列中工作过。我为此使用了Matlab。我不知道它可以/不能处理无限系列。

但我认为是有可能的。你可以试试:)

于 2010-03-31T11:06:31.987 回答
1

这可以在例如 sympy 和 sage (在开源替代品中)中完成。下面是一些使用 sympy 的示例:

输入[10]:求和(1/k**2,(k,1,oo)) 输出[10]:2 π ── 6

输入[11]:求和(1/k**4, (k,1,oo)) 输出[11]:4 π ── 90

在[12]中:求和((-1)**k/k,(k,1,oo))在[12]中:-log(2)

在[13]中:求和((-1)**(k+1)/k,(k,1,oo))在[13]中:log(2)

在幕后,这是使用超几何级数的理论,一个很好的介绍是 Marko Petkovˇeks、Herbert S. Wilf 和 Doron Zeilberger 的书“A=B”,你可以通过谷歌搜索找到。¿ 什么是超几何级数?

每个人都知道几何级数是什么:$X_1, x_2, x_3, \dots, x_k, \dots $ 是几何级数,如果连续词比 $x_{k+1}/x_k$ 是常数。如果连续项比率是 $k$ 中的有理函数,则它是超几何的!sympy 基本上可以处理满足最后一个条件的所有无限和,但只能处理很少的其他条件。

于 2012-06-11T19:57:40.210 回答
1

只需在您的计算机上安装 sympy。然后执行以下代码:

from sympy.abc import i, k, m, n, x
from sympy import Sum, factorial, oo, IndexedBase, Function
Sum((-1)**k/(2*k+1), (k, 0, oo)).doit()

结果将是:pi/4

于 2016-05-09T18:01:02.450 回答