【问题标题】:Infinite sums in pythonpython中的无限和
【发布时间】:2011-09-12 14:00:39
【问题描述】:

我听说 python 可以做无限和。例如,如果我想评估无限和:

1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...

我该怎么办?我是python的新手。因此,如果有人可以写出整个代码以及我是否需要包含/导入某些内容,我将不胜感激。

例如,在 wolfram alpha 中,如果我输入Summation (-1)^(n-1)/(2*n-1) from n=1 to infinity,它会给出0.785395 的答案。我希望将答案计算到所需的准确度,例如 wolfram alpha 最多 6 位的情况。

此外,我正在查看此帖子 here 并试图模仿它,但它给了我以下错误:

`NameError: name 'Infinity' is not defined`
`NameError: name 'Inf' is not defined`

谢谢, 阿德瓦伊塔

【问题讨论】:

  • 您是否希望能够计算无限级数的极限?哪个通常是无理数?或者你想要一个具有一定精度的近似值?
  • 这是数学家或科学软件的工作,而不是通用编程语言。
  • @Adhvaitha 这仅适用于 Cray 超级计算机,但这只野兽可以在 7-8 秒内执行任何无限循环!
  • 例如,在 wolfram alpha 中,如果我输入“Summation (-1)^(n-1)/(2*n-1) from n=1 to infinity”,则答案为 0.785395 .我希望将答案计算到所需的准确度,例如 wolfram alpha 最多 6 位的情况。投反对票的人,您能否提供投反对票的原因。
  • @Adhvaitha 我不是投反对票的人,但我会冒险猜测原因:乍一看,您的问题似乎是show me the codes 类型的问题,有些人会自动投反对票。

标签: python


【解决方案1】:
#It may be late answer but the following works well.

repetitions = 50

r = 0.0

for i in range(repetitions):
   ii=i+1 # because in python index start from 0
   r+=((-1)**(ii-1))/(2*ii-1.0)

print r

#the output is r=0.780398663148, you can increase the repetitions for more accuracy

【讨论】:

    【解决方案2】:

    对于某些系列,例如所示系列,您可以使用alternating series test 将总和计算到所需的误差范围内。 DecimalGyPympmathbigfloat等库,如果你的计算会碰到内置浮点数的精度,可以使用。

    整数方法注意事项
    虽然整数比方法看起来更准确,但它们对于实际计算完全不切实际。这样做的原因是:1)分数相加需要创建相等的分母,这基本上需要分母相乘,所以到最后,数字的大小类似于n!(即factorial);并且,2) 对于示例系列,m 数字的精度需要 m 术语。因此,即使只有六位数的精度,也需要大约等于 1000000 的数字! = 8×105,565,708。对于更大的数字,它大约是 1010n,这很快就变得完全不切实际了。同时,计算到 6 位或 7 位甚至 40 位的十进制解决方案是微不足道的。

    例如,运行 nightcrackers 解决方案,我得到的分母或分子中位数的次数和个数是:

        n      t       n_digits_in_denominator
       10      0.0003  14
      100      0.0167  170
     1000      5.5027  1727
    10000      ????    ????   (gave up after waiting one hour)
    

    而这对于仅约 4 位数的准确度来说变得不切实际。

    因此,如果您想精确计算有限且少量的项并将最终结果表示为比率,那么整数解决方案将是一个不错的选择,但如果您想将最终结果表示为小数,您最好还是坚持小数。

    【讨论】:

      【解决方案3】:

      虽然它仍然是有限的,但您可以使用 fractionsdecimal 模块来近似该系列:

      from fractions import Fraction
      from decimal import Decimal
      
      repetitions = 100
      
      d = 1
      r = Fraction(1, d)
      
      for n in range(repetitions):
          r += Fraction(1, d) - Fraction(1, d + 2)
          d += 4
      
      print(Decimal(r.numerator)/Decimal(r.denominator))
      

      我认为这最接近你想要做的。

      【讨论】:

      • 感谢您对fractions 的提醒,以及从我的回答中删除评论.. :-)
      • @Ned Batchelder:是的,它过于激进并且没有经过深思熟虑 - 我什至没有阅读您答案的第二部分。
      【解决方案4】:

      Python 有无限精度整数,但没有无限精度浮点数。不过,您可以使用一些包来提供此功能。

      没有什么可以“完成”一个无限的总和,因为它涉及无限多的步骤。您需要找到总和的封闭形式,然后对其进行评估,或者接受通过在满足精度标准时终止无限总和而获得的近似值。

      【讨论】:

      • 对于“无限”精度浮点数,使用Decimal python 模块。包括电池! :)
      【解决方案5】:

      在这里有点摸不着头脑...我敢打赌,当您听说 Python 能够进行无限求和时,他们的意思是 Python long integers have unlimited precision

      显然,这与对无穷级数求和无关。

      我不知道 Python 的任何方面使它特别适合计算这种和(或确实确定和是否收敛)。

      您可以尝试使用一些合理的停止标准对项进行直接求和。但是,这仅适用于表现良好的系列。

      最后,只是为了让您了解您所要求的复杂性,academic papers get published 其唯一目的是处理某些小类系列的总和。您提出的一般问题并不像看起来那么简单。

      【讨论】:

        【解决方案6】:

        你可以像这样使用 sympy 来做到这一点:

        from sympy import oo, Sum
        from sympy.abc import n
        inf_sum = Sum((-1)**n/(2*n + 1), (n, 0, oo))    # n goes from 0 to infinity
        print(inf_sum.doit())
        

        这将为您提供pi/4,这与您从 Wolfram Alpha 获得的相同。

        【讨论】:

          猜你喜欢
          • 2015-10-05
          • 2018-02-16
          • 1970-01-01
          • 1970-01-01
          • 2011-10-28
          • 1970-01-01
          • 1970-01-01
          • 2020-12-25
          • 2022-06-30
          相关资源
          最近更新 更多