【问题标题】:Index list out of range error for Fourth-Order Runge-Kutta integrator for an n-dimensional system of ODEs用于 N 维 ODE 系统的四阶 Runge-Kutta 积分器的索引列表超出范围错误
【发布时间】:2020-07-27 22:27:26
【问题描述】:

问题参数: 你构建的函数需要传入

  • 自变量(x)的当前值
  • 因变量的当前值 (y)
  • 自变量的步长 (h)
  • 根据 x 和 y 计算导数的函数。

函数将返回 x+h 处的因变量 (y) 的值


我们得到了一个测试代码,当我的代码运行时,我得到了“列表索引超出范围”错误

我的代码是:

def rk4( x, y, h, derivs ):
# ... Note, y is a list, ynew is a list, derivs returns a list of derivatives
n = len( y )
k1 = derivs( x, y )
ym = [ ]
ye = [ ]
slope = [ ]
ynew = [ ]

for i in range( n ):
    ym[ i ] = y[ i ] + k1[ i ] * h / 2 
    return ym

k2 = derivs( (x + h / 2), ym )

for i in range( n ):
    ym[ i ] = y[ i ] + k2[ i ] * h / 2
    return ym

k3 = derivs( (x + h / 2), ym )

for i in range( n ):
    ye.append( y[ i ] + k3[ i ] * h )
    return ye

k4 = derivs( (x + h), ye )

for i in range( n ):
    slope.append( (k1[ i ] + 2 * (k2[ i ] + k3[ i ]) + k4[ i ]) / 6 )
    ynew.append( y[ i ] + slope[ i ] * h )
    return ynew

x = x + h

return ynew

测试代码:

if __name__ == '__main__':

# This is a spring/mass/damper system.
# The system oscillates and the oscillations should become smaller over time for positive stiffness and damping values
stiffness = 4;  #
damping = 0.5;


def derivs(t, y):
    return [y[1], -stiffness * y[0] - damping * y[1]]


y = [1, 4]
n = 50
tlow = 0
thigh = 10
h = (thigh - tlow) / (n - 1)
for ii in range ( n ):
    t = tlow + ii * h
    y = rk4 ( t, y, h, derivs )

【问题讨论】:

    标签: python numerical-methods runge-kutta


    【解决方案1】:

    与 Matlab 不同,Python 在超出其边界时不会自动增加列表。使用

    ym = n*[0.0]
    

    等等。初始化正确长度的列表。

    或者只使用列表操作,则不需要初始化

    ym = [ y[i]+0.5*h*k1[i] for i in range(n) ]
    

    ym = [ yy+0.5*h*kk for yy,kk in zip(y,k1) ]
    

    等等

    此外,删除您不想离开函数的返回语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2023-02-18
      • 2015-11-17
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2011-07-25
      相关资源
      最近更新 更多