RuntimeWarning:在数组中的double_scalars和nans中遇到无效的值

时间:2018-12-19 23:01:00

标签: python

我有一个计算Bessel函数的算法和一个RuntimeWarning错误:double_scalars中遇到的无效值不断弹出

  

RuntimeWarning:在double_scalars中遇到无效的值

     

r [i] [j] = r [i] [j-1] +(r [i] [j-1] -r [i-1] [j-1])/(4 ** j -1)

我还有一个看起来像这样的数组,很明显,我不想要任何nans。

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]                                                                                     

 [nan  0.  0.  0.  0.  0.  0.  0.  0.  0.]                                                                                     
 [nan nan  0.  0.  0.  0.  0.  0.  0.  0.]                                                                                     
 [nan nan nan  0.  0.  0.  0.  0.  0.  0.]                                                                                     
 [nan nan nan nan  0.  0.  0.  0.  0.  0.]                                                                                     
 [nan nan nan nan nan  0.  0.  0.  0.  0.]

 [nan nan nan nan nan nan  0.  0.  0.  0.]                                                                                     
 [nan nan nan nan nan nan nan  0.  0.  0.]                                                                                     
 [nan nan nan nan nan nan nan nan  0.  0.]                                                                                     
 [nan nan nan nan nan nan nan nan nan  0.]] 

代码:

import numpy as np
from pylab import *

def romberg(f,a,b,n):
    i=0
    j=0
    h = float(b) - float(a)

    r[i][j] = (float(h/2)) * (f(float(a)) + f(float(b)))
    for i in range(n):
        h=h/2
        sum=float(0)
        for k in range(2**i-1):
          k=float(1)
          sum = float(sum) + f(float(a + k*h))
    r[i][0]=(float(1/2))*r[i-1][0] + sum*h
    for j in range(i):
        # error occurs on this line:
        r[i][j] = r[i][j-1] + (r[i][j-1]-r[i-1][j-1])/(4**j-1)

def funkcja(t):
  return np.cos(np.sin(t))/np.pi

r = np.zeros((10, 10))
wynik=romberg(funkcja,0,np.pi,10)
print(r)

这里应该更改什么?

1 个答案:

答案 0 :(得分:0)

请注意,range(n)为您提供了从0到n-1(含)的列表。因此,4**j-1将在循环中首次计算为0,这将导致尝试除以零。

代码似乎希望两个range调用的形式均为range(1, n)