Skip to main content
 首页 » 编程设计

python之在 python 中绘制总和

2025年05月04日17wuhuacong

我正在尝试在 python 中绘制一个函数,其中有无限总和。现在,由于计算中没有无穷大,对于我的上限,我可以选择一个非常大的数字,这很好。

所以我试着绘制它:

from scitools.std import * 
from math import * 
import numpy as np 
 
def f1(t): 
    return 0.5*(1+sum((4**(2*n)*cos(2*n*t))/(e**16*factorial(n)) for n in xrange(0,10**100))) 
 
t = linspace(0, 35, 10000) 
y1 = f1(t) 
 
plot(t, y1) 
 
xlabel(r'$\tau$') 
ylabel(r'P($\tau$)') 
legend(r'P($\tau$)') 
grid(True) 

而且我尝试减小 xrange(或范围),并增加 linspace(从 0、35 到 1000 多点),但我得到的是:

OverflowError: long int too large to convert to int 

或

OverflowError: range() result has too many items 

那么这里的问题似乎是什么?我怎样才能使总和变大?和的语法是否正确?

请您参考如下方法:

这个循环不可能在你的一生中结束。 10 ** 100 是一个非常巨大的数字。它比宇宙中粒子的数量还多,比宇宙创生以来经过的最短时间段的数量还多。在超快的计算机上 - 3 * 10 ** 46 千年才能完成循环。要计算无限总和,您希望一直计算到总和停止显着变化(例如,被加数低于某个非常小的阈值)。

此外,Python 2 中的 xrange 和 range 仅限于平台的长整数,这意味着您不能在32 位机器和 64 位机器上的 2 ** 63,(后者仍然太大而无法在你的一生中完成),这就是为什么你在 Python 2 中得到 OverflowError 的原因。在 Python 3 中你不会得到任何错误,但求和将永远持续下去。

而且如此大的数字的计算阶乘甚至更慢,所以即使在 32 位机器上你也没有机会超过最大值。

搜索一个计算无限和的函数,或者自己做

>>> from __future__ import division 
>>> import itertools 
>>> from math import factorial, cos, e 
>>> for t in [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]: 
...     summables = ((4 ** (2 * n) * cos(2 * n * t)) / (e ** 16 * factorial(n))  
...                  for n in itertools.count()) 
...     print 0.5 * (1 + sum(itertools.takewhile(lambda x: abs(x) > 1e-80, summables))) 
...  
1.0 
0.973104754771 
0.89599816753 
0.77928588758 
0.65382602277 
0.569532373683 
0.529115621076 
0.512624956755 
0.505673516974 
0.502777962546 
0.501396442319 

此外,我不认识这个公式,但这应该是 (e ** 16) * factorial(n) 还是 e ** (16 * factorial(n) )?我只想指出,您之所以写前者是因为另一个答案。