我试图在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)
Run Code Online (Sandbox Code Playgroud)
我试图减少xrange(或范围),并增加linspace(从超过1000点的0,35),但我得到:
OverflowError: long int too large to convert to int
Run Code Online (Sandbox Code Playgroud)
要么
OverflowError: range() result has too many items
Run Code Online (Sandbox Code Playgroud)
那么这里的问题似乎是什么?怎么能把这笔钱大呢?总和的语法是否正确?
那个循环不可能在你的一生中结束.10 ** 100是一个非常庞大的数字.它比宇宙中的粒子数量更大,它比宇宙创造以来最微小的时间段的数量还要大.在一台不可思议的快速计算机上 - 3 * 10 ** 46几千年来完成循环.要计算一个无限和,你希望计算直到总和停止显着变化(例如,求和已经下降到某个非常小的阈值).
此外,xrange和range在Python 2被限制到该平台的长整数,这意味着你不能有一个64位的一个大于2**31 32位机器上和2**63更高的数字,(后者仍然在你的一生中太大而无法完成),这就是你OverflowError在Python 2中获得的原因.在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
Run Code Online (Sandbox Code Playgroud)
另外,我不认识这个公式,但这应该是(e ** 16) * factorial(n)或者e ** (16 * factorial(n))?我只想指出你因为另一个答案而写了前者.
| 归档时间: |
|
| 查看次数: |
2252 次 |
| 最近记录: |