2017-10-31 1 views
0

불편한 코드입니다. 죄송합니다. 특히 어리석은 질문이라면.목록 색인이 범위를 벗어남 오류

여기는 목록 오류입니다. 왜 (초보자인지) 모르겠습니다. 누군가, 제발, 고칠 방법을 말해 줄 수 있습니까?

Traceback (most recent call last): 
    File "C:/Users/milom/PycharmProjects/ChislM/method.py", line 77, in <module> 
    vx, vy = rk3(diff1, 0, U0, 10, 100) 
    File "C:/Users/milom/PycharmProjects/ChislM/method.py", line 39, in rk3 
    x,v=step(f, h, i, x0, U0) 
    File "C:/Users/milom/PycharmProjects/ChislM/method.py", line 11, in step 
    k2 = f(x[i] + (1/3) * h[i], v[i] + (1/3) * k1) 
IndexError: list index out of range 

코드 :

import matplotlib.pyplot as plt 
import math as m 
import pandas as pd 

x =[0]*101 
v =[0]*101 

def step(f, h, i, x0, U0): 
    x[0] = x0 
    v[0] = U0 
    k1 = f(x[i], v[i]) 
    k2 = f(x[i] + (1/3) * h[i], v[i] + (1/3) * k1) 
    k3 = f(x[i] + (2/3) * h[i], v[i] + (2/3) * h[i] * k2) 
    x[i] = x[i - 1] + h[i] 
    v[i] = v[i - 1] + (h[i]) * ((1/4) * k1 + (3/4) * k3) 
    return x, v 


def rk3(f, x0, U0, x1, n): 
    h = [(x1 - x0)/float(n)] 
    for i in range(1, n+1): 
     x,v=step(f, h, i, x0, U0) 
     ###h= control(f, h[i], i, v[i], x0, U0) 
    return x, v 


def diff1(x, U): 
    return 0.1 


def diff(x, U): 
    return -(m.cos(10 * x) + ((m.log(1 + x ** 2))/(1 + x)) * (U ** 2) + U) 


def exact_path(): 
    plt.grid() 
    plt.plot(vx, vy) 
    plt.show() 


def table(): 
    mytable = pd.DataFrame({ 
     'Xn': vx, 
     'Vn': vy, 
    }, index=[i for i in range(0, 101)]) 
    mytable.index.name = 'number' 
    pd.set_option('display.max_rows', None) 
    print(mytable) 


task = int(input("Task:")) 
U0 = float(input("First value- U0:")) 

if task == 2: 
    vx, vy = rk3(diff, 0, U0, 10, 100) 
    table() 
    exact_path() 

if task == 1: 
    vx, vy = rk3(diff1, 0, U0, 10, 100) 
    table() 
    exact_path() 

P.S.

는 출력 그것은 단순한 3 차 Runge-Kutta 방법이지만, 대부분 synthax에 관한 문제입니다. 파이썬으로 메소드를 구현하려고했습니다.

+1

'rk3'에서 100에서 99로 전환합니다.'n + 1 '로 반복하려고하면 색인은 101까지 올라갑니다. 목록의 색인은 0에서 100까지이므로'IndexError '가 발생합니다. –

+0

환영합니다. 핵심 답변은 역 추적입니다. 'IndexError'는 무효 인덱스를 가지고 뭔가를 참조하려고 할 때 발생합니다. 'a = [1, 2] '를 고려하십시오. 'print (a [2]) '문은'2'가 유효한 인덱스가 아니기 때문에'IndexError'를 발생시킵니다. 코드의 11 번째 라인을 살펴보고'index [i]'가 객체 x, h, v에 유효한 지 고려해보십시오 – DaveL17

답변

0

rk3() 함수에서 h = [(x1 - x0)/float(n)]은 하나의 요소 만있는 목록을 만듭니다. 즉, 루프의 step() 함수 에서처럼 다른 인덱스 값을 사용하려고 시도 할 때 사용할 수있는 유효한 음수가 아닌 유효한 인덱스 만 h[0]이고 IndexError이됩니다.

+0

정말 고마워요! – CredoPugno

관련 문제