【问题标题】:Computing a series with large numbers : Python计算大数序列:Python
【发布时间】:2018-02-06 12:50:18
【问题描述】:

注意:更正了for i in xrange(10000)行中指出的愚蠢错误

我正在编写一个代码,用于使用级数展开计算和绘制 MittagLeffler 函数,

import numpy as np
import scipy as sp
from decimal import Decimal
import pylab as plt
from math import gamma


def MLf(x,a):
    mlf = Decimal(0)
    X = (x)
    term = Decimal(0)
    for j in xrange(100):
        term = Decimal((-1)**j*(X**(j*a)))/Decimal(gamma(a*j+1))
        mlf = Decimal( term + mlf )
    return mlf


x = np.arange(0,1000,0.1)
y = np.arange(0,1000,0.1)

for i in xrange(10000):
    y[i] = MLf(x[i],1)


plt.plot(x,y)
plt.show()

但是,对于 x>30,函数 (MLf) 的计算似乎失败了。

这可能是由于迭代次数有限导致的系列发散。但是,如果我增加迭代次数,它会显示数学范围错误。

这是值的 sn-p,显示它开始发散的位置

x        y 
40.8 -10.9164990034 
40.9 -12.2457070844 
41.0 -17.4658523232 
41.1 -10.8310002768 
41.2 -10.5217830371 
41.3 -13.9001627961 
41.4 -30.8944707201 

【问题讨论】:

  • 您正在重复使用 xy — 将最后一个循环设为 10000,您将看不到不连续性。
  • @goyo 我认为他在做plt.xlim(0,12); plt.ylim(0,1.4) 或类似的事情。
  • 我认为发布新问题可能比更改现有问题更好。如果您不这样做,我们将需要删除这些 cmets 和我的其他答案,否则此线程将毫无意义。
  • @user35962 我使用您的函数的简化版本发布了一个关于此不稳定性的问题here
  • @kwinkunks 非常感谢。我在这里接受了你的回答

标签: python series largenumber


【解决方案1】:

您在最后重复使用 xy,但只替换最多 100 的索引。所以在最后执行此操作即可:

for i in range(10000):  # Or use xrange in Python 2.7
    y[i] = MLf(x[i], 1)

plt.plot(x,y)
plt.show()

或者为这部分制作不同的数组。

【讨论】:

  • 这是我查看的一个可怕的错误,感谢您指出!我现在就去看看!
  • 好的,现在我已经更正了,对于我在函数 MLf 中使用的 100 次迭代,该系列不会收敛。但是,增加迭代次数会给我带来数学错误。我稍后会编辑问题
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多