Список индексов вне диапазона ошибок для интегратора Рунге-Кутты четвертого порядка для n-мерной системы ОДУ - PullRequest
0 голосов
/ 15 апреля 2020

Параметры задачи: функция, которую вы строите, должна принимать

  • Текущее значение независимой переменной (x)
  • Текущие значения зависимых переменных (y) <- (список) </li>
  • Шаг шага независимой переменной (h)
  • Функция, которая вычисляет производные в зависимости от x и y. <- вернет список </li>

Функция вернет значения зависимых переменных (y) в x + h


Нам дан код тестера и когда мои прогоны Я получаю сообщение об ошибке "Список индексов вне диапазона"

Мой код:

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 )

1 Ответ

0 голосов
/ 15 апреля 2020

Python, в отличие от Matlab, не будет автоматически увеличивать список при нарушении его границ. Используйте

ym = n*[0.0]

et c. чтобы инициализировать список правильной длины.

Или просто использовать операции со списком, тогда инициализация не требуется

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) ]

et c.

Также удалите операторы возврата, если вы не хотите оставлять функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...