哪种编程语言或库可以处理无限系列?

时间:2010-03-31 10:51:39

标签: python math programming-languages functional-programming series

哪种编程语言或库能够处理无限系列(如几何或谐波)?它可能必须有一个众所周知的系列数据库,并在收敛时自动给出正确的值,并且可能在发散时产生异常。

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

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

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

13 个答案:

答案 0 :(得分:18)

懒惰评估的大多数函数语言都可以模拟无限级数的处理。当然,在有限的计算机上,不可能处理无限系列,因为我相信你知道。在我的脑海中,我猜 Mathematica 可以完成你想要的大部分工作,我怀疑 Maple 也可以,也许 Sage 和其他计算机代数系统,如果你找不到适合你的Haskell实现,我会感到惊讶。

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

答案 1 :(得分:15)

要查看的地方可能是Computer Algebra Systems的维基百科类别。

答案 2 :(得分:13)

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

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

然而,在一般计算中,两个流的相等性需要一个oracle用于停止问题,所以没有语言可以完全通用地执行你想要的,尽管像Mathematica这样的计算机代数系统可以尝试。

答案 3 :(得分: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

答案 4 :(得分:8)

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

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

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

答案 5 :(得分:7)

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

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

答案 6 :(得分:4)

您需要能够进行符号计算的内容,例如Mathematica。 您还可以考虑查询wolframaplha: sum((-1)^i*1/i, i, 1 , inf)

答案 7 :(得分:3)

有一个名为mpmath(python)的图书馆,一个sympy的模块,它提供了对sympy的系列支持(我相信它也支持圣人)。
更具体地说,所有系列内容都可以在这里找到:Series documentation

答案 8 :(得分:3)

C ++ iRRAM库完全执行 算术。除此之外,它可以使用限制功能精确计算限制。 iRRAM的主页是here。查看文档中的限制功能。请注意,我不是在谈论任意精度算术。这是精确算术,用于精确定义。这是他们的代码,用于精确计算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);
};

答案 9 :(得分:2)

ClojureHaskell脱离了我的头脑。

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

答案 10 :(得分:1)

我参与了几个用于研究目的的大型数据系列。 我使用了 Matlab 。我不知道它可以/不能处理无限系列。

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

答案 11 :(得分: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)) Out [12]: - log(2)

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

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

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

答案 12 :(得分: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