2011-03-02 57 views
0

我对python比较陌生,对我的物理大学课程做了一点。Python索引超出范围错误,不知道我在做什么错误

目前我正在尝试编写一个程序来计算一些与矢量函数有关的东西,但这并不重要,因为我已经将所有东西都处理到最后一节。

到目前为止,程序在2D图上产生局部最小值的负载,但是我需要找到整体的最小值。

for i in range(100): 
    pyplot.xlim(x0, x1) # x0, y0 etc are constants defined before in global scope 
    pyplot.ylim(y0, y1) 
    pyplot.plot(min_points[:,0], min_points[:,1]) 
    x, y = random.uniform(x0, x1), random.uniform(y0, y1) 
    min_points = gradient_descent((x,y)) # gradient_descent is function used 

    xmin_list, ymin_list = [], [] # now to find overall minima, initialise list 
            # of local minima, and append those that are within 
            # the boundaries 
    if x0 < min_points[-1, 0] < x1: 
     if y0 < min_points[-1, 1] < y1: 

      xmin_list.append(min_points[-1, 0]) 
      ymin_list.append(min_points[-1, 1]) 

    xmin, ymin = xmin_list[0], ymin_list[1] # < error comes in this line 

我已经包括了对大低于完整性循环的其余部分,但它不是有点给我一个错误(还)。

for ix in range(len(xmin_list)): 
     for iy in range(len(ymin_list)): 
      if f((xmin_list[ix], ymin_list[iy])) < f((xmin, ymin)): 
       xmin, ymin = xmin_list[ix], ymin_list[iy] 

所以这显然是围绕整个循环的中间,但我不知道为什么我得到的错误。我试图访问每个列表的最后一个元素,然后将它们追加到列表中(在检查符合条件x0,x1等之后)。

我不知道为什么它不工作..

我也知道这是要去关于发现的最小一个相当复杂的方式,但它似乎合乎逻辑的我,我感到困惑,容易有做额外的事情,如检查他们是否在界限内等

感谢您的任何帮助!是的,我也确信我的代码看起来很可怕,但是我在完成工作之后会清理它们(他们不擅长教我们的风格,只是功能......)

编辑:对不起,忘了确切发布的错误,那就是:

Traceback (most recent call last): 
    File "filepath etc etc", line 67, in <module> 
    xmin, ymin = xmin_list[0], ymin_list[1] 
IndexError: list index out of range 
+2

你做了一些调试吗?使用调试器并逐步完成代码。检查变量。那么你应该找到这个缺陷...... – 2011-03-02 22:33:09

+0

如果你需要帮助,你至少应该发布堆栈跟踪和其他相关信息(例如具体错误来自哪一行)。 – 2011-03-02 22:35:51

+0

什么是错误? – 2011-03-02 22:35:58

回答

0
xmin, ymin = xmin_list[0], ymin_list[1] # < error comes in this line 

的错误这里是[1]。如果前面的if声明条件是False,那么ymin_list仍然是您设置它的空列表,并且索引1已超过结尾。

此外,在第二部分中,您不需要使用那样的range(len())。尝试:

xmin = xmin_list[0] 
ymin = ymin_list[0] 
vmin = f((xmin, ymin)) 
for x in xmin_list: 
    for y in ymin_list: 
     v = f((x, y)) 
     if v < vmin: 
      xmin = x 
      ymin = y 
      vmin = v 

...来想想看,你初始化xminymin

+0

好吧,我现在看到为什么错误出现,就像你说的那样。感谢第二部分的帮助,我现在修改了它。我已经初始化了xmin和ymin,在错误出现的位置。我只是将它们设置为我想要从列表中获取的值。编辑:哦,非常感谢你,我现在有工作。这也没有帮助,因为我在迭代循环之外发现了错误 – Scorpii 2011-03-03 00:32:06