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