哪种编程语言或库能够处理无限系列(如几何或谐波)?它可能必须有一个众所周知的系列数据库,并在收敛时自动给出正确的值,并且可能在发散时产生异常。
例如,在Python中它可能看起来像:
sum = 0
sign = -1.0
for i in range(1,Infinity,2):
sign = -sign
sum += sign / i
然后,sum必须是math.pi / 4而不在循环中进行任何计算(因为它是一个众所周知的总和)。
答案 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)
答案 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)
答案 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