2011-03-02 10 views
0

저는 파이썬에 비교적 익숙하지 않습니다. 내 물리학 대학 과정에 약간의 성과가있었습니다.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 루프는 완전성을 위해 포함되었지만 아직 오류를주지는 않습니다.

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 등을 맞추기 위해 검사 한 후).

나는이 최소를 찾는 것에 대해가는 매우 복잡한 방법입니다 확신

.. 그것이 작동하지 않는 이유는 모르겠지만, 나에게 논리적 인 듯, 나는 혼란 쉽게 갖는 얻을 수표와 같은 여분의 일들을 할 수 있습니다.

어떤 도움을 주셔서 감사합니다! 그리고 예. 코딩이 끔찍하고 지저분 해 보인다는 것을 확신합니다. 그러나 작동 시키면 정리할 것입니다. (그들은 우리에게 스타일을 가르치는데 능숙하지 않습니다. 기능 만 ..)

EDIT : 죄송합니다. ,, 정확하게 오류를 게시하는 것을 잊었다 여기있다 : 여기

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

일부 디버깅을 수행 했습니까? 디버거를 사용하고 단계별로 코드를 살펴보십시오. 변수를 검사하십시오. 그렇다면 결함을 찾아야합니다. –

+0

도움이 필요하면 stacktrace 및 기타 관련 정보 (예 : 오류가 발생한 행)를 최소한 게시해야합니다. –

+0

무엇이 오류입니까? –

답변

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

관련 문제