访问 Runge-Kutta 二阶的前一个元素
Accessing previous element for the Runge-Kutta 2nd order
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
得到了 [=18] 的 1/2*k1*h
部分=]方程。我无法访问 klist
中的前一个元素,无法将该元素添加到我的 llist
。例如
print (klist, llist)
[0.0] [0.0]
[0.84] [0.42]
[-0.52] [-0.026]
并且我想将每个中点方法的klist
的前一个元素添加到1/2*k1*h。所以它看起来像 0.84 + 0.5*-0.52*h
我试过 [q + l for q, l in zip(llist, klist[1:])]
但它不起作用,因为我的 klist
returns [0.0], [0.84], [-0.52], etc...
所以 klist[1:]
只会 return []
。那怎么办呢?我尝试制作一个列表列表,但在添加值时,我会收到错误消息,因为我无法将浮点数添加到列表中。同样对于 yn+1
方程,我将如何添加它们,因为它们也是不同的类型?
该方法读取,包括中间状态,如
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 中列表的 +
运算符不是逐元素加法,而是列表连接。如果你想使用矢量运算,你必须使用专用矢量 class 例如 numpy.array
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
得到了 [=18] 的 1/2*k1*h
部分=]方程。我无法访问 klist
中的前一个元素,无法将该元素添加到我的 llist
。例如
print (klist, llist)
[0.0] [0.0]
[0.84] [0.42]
[-0.52] [-0.026]
并且我想将每个中点方法的klist
的前一个元素添加到1/2*k1*h。所以它看起来像 0.84 + 0.5*-0.52*h
我试过 [q + l for q, l in zip(llist, klist[1:])]
但它不起作用,因为我的 klist
returns [0.0], [0.84], [-0.52], etc...
所以 klist[1:]
只会 return []
。那怎么办呢?我尝试制作一个列表列表,但在添加值时,我会收到错误消息,因为我无法将浮点数添加到列表中。同样对于 yn+1
方程,我将如何添加它们,因为它们也是不同的类型?
该方法读取,包括中间状态,如
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 中列表的 +
运算符不是逐元素加法,而是列表连接。如果你想使用矢量运算,你必须使用专用矢量 class 例如 numpy.array