2016-11-11 6 views
-1
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, как бы добавить их, так как они также будут разных типов?

+0

В дополнение к тому, что было сказано в ответе: Пожалуйста, пересмотреть свой стиль кодирования: 1) Не перезаписывайте переменные, чтобы использовать их для других целей. 2) Не используйте две переменные для одной и той же вещи (например, 't' и' t0'). 3) Инкапсулируйте ваши векторные операции в отдельных функциях, чтобы не было необходимости различать компоненты и векторы на уровне, в котором он вам не нужен. 4) Сделайте свои обозначения согласованными: например, вы переключаетесь между 'x' и' y'. – Wrzlprmft

+0

Кроме того, я не считаю, что 'print (klist, llist)' действительно имел результат, который вы требуете. – Wrzlprmft

ответ

2

Метод читает, в том числе промежуточном состоянии, так как

k1 = f(t, x) 
xm = x + 0.5*h*k1 
k2 = f(t + 0.5*h, xm) 
x = x + h*k2 

, который должен быть список маньяков, как

k1list = f(t, xlist) 
xmlist = [ x + 0.5*h*k1 for x,k1 in zip(xlist,k1list)] 
k2list = f(t + 0.5*h, xmlist) 
xlist = [ x + h*k2 for x,k1 in zip(xlist,k2list)] 

Как сказали ранее несколько раз, оператор + применяется к спискам в python это не элементное дополнение, а объединение списков. Если вы хотите использовать векторную арифметику, вы должны использовать выделенный векторный класс, такой как numpy.array