【问题标题】:IndexError: list index out of range when using lists PythonIndexError:使用列表Python时列表索引超出范围
【发布时间】:2021-09-21 06:40:35
【问题描述】:

朋友们好,我正在用 Python 进行数值方法、常微分方程的练习,你给我的列表索引超出范围错误,如果有人能帮我一把,我将不胜感激

import numpy as np
import matplotlib.pyplot as plt
 
def fun(x,y):
    return x**2/(1 +y**2)

"""#Runge-Kutta 1er orden
$y_(i+1)   =     y_i+  f(x_i,y_i )*h$
"""

def runge_kutta_1(f,a,b,h,y0): #función,inicial,final,tamaño de paso y y0
    x=[]
    y=[]
    x.append(a)
    y.append(y0)
    while x[0]<b:
        y.append(y[3]+f(x[0],y[3])*h)
        x.append(x[0] + h)
        return x,y

"""#Runge-Kutta 2do orden
$y_(i+1) = y_i+(1/3k1+2/3k2)*h$
"""

def runge_kutta_2(f,a,b,h,y0):
    x=[]
    y=[]
    x.append(a)
    y.append(y0)
    while x[0]<b:
        k1=f(x[0],y[3])
        k2=f(x[0]+3/4*h,y[3]+3/4*k1*h)
        y.append(y[3]+(1/3*k1+2/3*k2)*h)
        x.append(x[0]+h)
    return x,y

"""# Runge-Kutta 4to orden

$y_(i+1) =  y_i+1/6(k1+2k2+2k3+k4)*h$
"""

def runge_kutta_4(f,a,b,h,y0): 
    x=[]
    y=[]
    x.append(a)
    y.append(y0)
    while x[0]<b:
        k1=f(x[0],y[3])
        k2=f(x[0]+0.5*h,y[3]+0.5*k1*h)
        k3=f(x[0]+0.5*h,y[3]+0.5*k2*h)
        k4=f(x[0]+h,y[3]+k3*h)
        y.append(y[3]+(h/6)*(k1 +2*k2+2*k3+k4))
        x.append(x[0]+h)
    return x,y

h=0.5
print("tamaño de paso(0.5): ",h)
x1,y1=runge_kutta_1(fun,0,5,h,3)
x2,y2=runge_kutta_2(fun,0,5,h,3)
x4,y4=runge_kutta_4(fun,0,5,h,3)
x5=np.arange(0,5,0.01)
y5= y**3/3 + y - x**3/3                   #Solución analítica de la ED
 
# Gráfica
plt.figure(figsize=(15, 10), dpi=80) # Tamaño de la gráfica
plt.plot(x1,y1,label="RK 1er orden")
plt.plot(x2,y2,label="RK 2do orden")
plt.plot(x4,y4,label="RK 4to orden")
plt.plot(x5,y5,label="Solución Real")
plt.legend()
plt.show()

我在 x1,y1=runge_kutta_1(fun,0,5,h,3) 的第 58 行收到错误 *第 17 行,runge_kutta_1 y.append(y +f(x,y)h) IndexError: list index out of range

【问题讨论】:

  • runge_kutta_1。在函数的顶部,它将xy 都设置为[],所以此时它们的长度都为零。然后它为它们每个附加一个值,所以此时它们的长度都是 1。然后它进入循环,并尝试访问y[3]。如果y 的长度为1,那么y 的唯一有效索引是0。所以你的索引超出了界限,正如它告诉你的那样。您可以通过将更多值附加到y 或将y[3] 更改为y[0] 来修复它。我怀疑两者都会做你想做的事,所以你需要弄清楚你想要什么,然后解决它。
  • 一般来说,当您收到“列表索引超出范围”的错误时,它的含义正是它所说的:您正在索引某些内容,并且您的索引超出范围。因此,您需要做的就是查看指示线上的所有索引,并找出哪个超出范围。如果需要,添加调试语句。您可以自己轻松完成。
  • 基本上,您正在尝试访问列表 y 上不存在的索引。最初你只有x = [0]y = [3]

标签: python list indexing


【解决方案1】:

您应该再次考虑索引顺序。您根据上一步中获得的值计算下一步,因此您需要使用列表中的最后一个元素。 (使用局部变量避免重复访问同一个数组元素。)

对于 RK2 方法,您的代码需要更改为

def runge_kutta_2(f,a,b,h,y0):
    x=[a]
    y=[y0]
    while x[-1]<b:
        k1=f(x[-1],y[-1])
        k2=f(x[-1]+3/4*h,y[-1]+3/4*k1*h)
        y.append(y[-1]+(1/3*k1+2/3*k2)*h)
        x.append(x[-1]+h)
    return x,y

请务必考虑到x 数组的最后一个元素很少会等于或非常接近b

【讨论】:

  • 非常感谢我朋友的解决方案
猜你喜欢
  • 2016-08-25
  • 2017-04-05
  • 2012-07-15
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多