访问Runge-Kutta第二个订单的前一个元素

时间:2016-11-11 17:21:18

标签: python python-3.x list-comprehension ode

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

中点法(Runge-Kutta二阶)方程如下:

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

我想将每个中点方法0.84 + 0.5*-0.52*h的前一个元素添加到1/2 * k1 * h。所以它看起来像[q + l for q, l in zip(llist, klist[1:])]

我已尝试执行klist但由于[0.0], [0.84], [-0.52], etc...返回klist[1:],因此无效,因此[]将返回yn+1。那怎么会这样呢?我尝试制作列表列表,但是当添加值时,我只会得到一个错误,因为我无法在列表中添加浮点数。同样对于def hide_or_not(an_array, a_guess) an_array.each do |letter| if a_guess == letter print a_guess elsif SOMETHING HERE print letter else print "_" end end end 等式,我将如何添加它们,因为它们也是不同的类型?

1 个答案:

答案 0 :(得分: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