from math import sin
def rk(f,x0,t0,h,N):
t = t0
xlist = x0
while t < N*h:
klist = f(t,xlist) #GIVES ME K1
xlist = [x+h *k for x,k in zip(xlist, klist)]
llist = [u * 0.5*h for u in klist] #GIVES ME 1/2 Y1
t += h
Середину метод (Рунге-Кутта второго порядка) уравнение выглядит следующим образом:Доступ предыдущий элемент для Рунге-Кутта 2-го порядка
K1 = f(t, x) K2 = f(t0 + 1/2*h, x0 + 1/2*K1*h) yn+1 = yn + k2*h
До сих пор мой klist
в сочетании с xlist
дайте мне K1
, Мой llist
дает мне 1/2*k1*h
часть уравнения K2
. У меня возникли проблемы с доступом к предыдущему элементу в klist
, чтобы добавить этот элемент в мой llist
. Так, например
print (klist, llist)
[0.0] [0.0]
[0.84] [0.42]
[-0.52] [-0.026]
И я хочу, чтобы добавить предыдущий элемент klist
в средней точке метода к 1/2 * k1 * ч. так что это будет выглядеть как 0.84 + 0.5*-0.52*h
Я пытался делать [q + l for q, l in zip(llist, klist[1:])]
, но он не работает, так как мой klist
возвращается [0.0], [0.84], [-0.52], etc...
и так klist[1:]
бы просто вернуть []
. Итак, как бы это произошло? Я попытался составить список списков, но когда дело дошло до добавления значений, я бы просто получил ошибку, так как я не могу добавить float в список. Также для уравнения yn+1
, как бы добавить их, так как они также будут разных типов?
В дополнение к тому, что было сказано в ответе: Пожалуйста, пересмотреть свой стиль кодирования: 1) Не перезаписывайте переменные, чтобы использовать их для других целей. 2) Не используйте две переменные для одной и той же вещи (например, 't' и' t0'). 3) Инкапсулируйте ваши векторные операции в отдельных функциях, чтобы не было необходимости различать компоненты и векторы на уровне, в котором он вам не нужен. 4) Сделайте свои обозначения согласованными: например, вы переключаетесь между 'x' и' y'. – Wrzlprmft
Кроме того, я не считаю, что 'print (klist, llist)' действительно имел результат, который вы требуете. – Wrzlprmft