【问题标题】:IndexError: list index out of range, shooting methodIndexError: 列表索引超出范围,拍摄方法
【发布时间】:2017-01-14 21:36:16
【问题描述】:
x1=np.linspace(xmin, xmax, Nsteps)
y1=np.linspace(0., 0., Nsteps)
h=x1[1]-x1[0]
V1=-V0*np.exp(-alpha*(x1)**2)
E=-1
k=math.sqrt(-2*E)
y1[0]=1
y1[1]=np.exp(k*h)
f=2*[V1-E]

def a():
   for i in range (1,Nsteps):
    denom = np.sum(2+10*h**2*f[i]/12)
    numer = np.sum(1-h**2*f[i+1]/12)   
    return denom/numer


def b():
  for i in range(1, Nsteps):
    denom = np.sum(1-h**2*f[i-1]/12)
    numer = np.sum(1-h**2*f[i+1]/12)
    return denom/numer

def y2():
    a[i]*y1[i] + b[i]*y1[i-1]

for i in range (1, Nsteps):
    print(y2)

plt.plot(x1, y2)
plt.show()

对于一些给定的参数,我的目标是生成一个实现拍摄方法的代码。但是,在运行它时,由于 x1 和 y2 的长度不同,我得到了 IndexError。我的 i 边界是 1 和 1001。我假设在边界 f[i-1] 和 f[i+1] 产生超出定义范围的值?同样,在运行最后一个 for 循环时,我是否在该 for 循环中再次运行了以前的 for 循环,从而产生了一些奇怪的东西?这些是我的猜测,我的第二个问题是是否有解决该问题的技巧?我可以实施一些 if 条件来纠正这个问题吗?

【问题讨论】:

    标签: python-3.x for-loop range


    【解决方案1】:

    您的代码存在许多问题,其中最重要的是可读性。这不是字节昂贵的 70 年代 - 在您的语句中添加空格,这样您就可以看到发生了什么。同样,适当地命名您的变量和函数。读者应该如何知道a() 做了什么?举个例子,转这个:

    V1=-V0*np.exp(-alpha*(x1)**2)
    

    进入这个:

    V1 = -V0 * np.exp(-alpha * (x1**2))
    

    更容易看到发生了什么。

    接下来,使用 4 个空格进行缩进,并始终如一地使用它 - 您可以更轻松地发现潜在的缩进问题 - 例如在 a()b() 中您有 return inside em> for 循环,导致它只运行一次。所有优秀的编程编辑器(即除了 Windows 记事本之外的几乎所有东西)都允许您设置按 Tab 键时插入的内容。在 Python 3 中混合制表符和空格是一个错误,所以根本不要使用制表符 (\t)。

    y2()a[i]b[i] 中没有意义,因为ab 是函数,不能像那样切片,并且i 没有在此上下文中定义。

    print(y2) 将打印类似<function y2 at 0x7fae9e8e3378> 的内容,我很确定这不是您想要做的。同样,plt.plot(x1, y2) 不会做你想做的事。如果您重构 y2() 以实际返回某些内容(目前没有),并且该内容是与 x1 的内容相对应的列表或 NumPy 数组,那么您应该改用 plt.plot(x1, y2())

    将所有这些付诸实践,您仍然需要重构(并重命名)a()b(),以便它们计算并返回您想要的值。请记住,虽然函数可以读取在定义函数的同一范围内定义的变量,但最好显式通过参数传递您希望函数处理的对象。所以,而不是:

    some_lst = [1, 2, 3, 4, 5]
    some_str = "abcde"
    
    def zippem():
        return list(zip(some_lst, some_str))
    

    你应该使用:

    some_lst = [1, 2, 3, 4, 5]
    some_str = "abcde"
    
    def zippem(input_a, input_b):
        return list(zip(input_a, input_b))
    

    然后这样称呼它:

    list_o_tuples = zippem(some_lst, some_str)
    

    这允许您将函数定义移动到不同的模块中,将其放入一个类中,或者仅使用任意输入而不是其范围内的已定义对象来函数。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多