ODE系统中的ODE放置给出不同的结果

时间:2014-11-01 02:19:14

标签: python solver ode runge-kutta

我有以下代码:

def multirk4(funcs, x0, y0, step, xmax):
    n = len(funcs)
    table = [[x0] + y0]
    f1, f2, f3, f4 = [0]*n, [0]*n, [0]*n, [0]*n
    while x0 < xmax:
        y1 = [0]*n
        for i in range(n): f1[i] = funcs[i](x0, y0)
        for j in range(n): y1[j] = y0[j] + (0.5*step*f1[j])
        for i in range(n): f2[i] = funcs[i]((x0+(0.5*step)), y1)
        for j in range(n): y1[j] = y0[j] + (0.5*step*f2[j])
        for i in range(n): f3[i] = funcs[i]((x0+(0.5*step)), y1)
        for j in range(n): y1[j] = y0[j] + (step*f3[j])
        for i in range(n): f4[i] = funcs[i]((x0+step), y1)
        x0 = x0 + step
        for i in range(n): y1[i] = y0[i] + (step * \
            (f1[i] + (2.0*f2[i]) + (2.0*f3[i]) + f4[i]) / 6.0)
        table.append([x0] + y1)
        y0 = y1
    return table

system1 = range(2)
system2 = range(2)
y = range(2)

y[0] = 0.0
y[1] = 0.0

def mRNA(t, y): return 6e-8 - (0.01 * y[0])
def protein(t, y): return (0.05 * y[0]) - (0.001 * y[1])

system1[0] = mRNA
system1[1] = protein

system2[0] = protein
system2[1] = mRNA

t0 = 0.0
tmax = 100.0
dt = 0.1

s1 = multirk4(system1, t0, y, dt, tmax)
s2 = multirk4(system2, t0, y, dt, tmax)

for i in range(len(s1)):
    print ','.join([str(s1[i][0]), str(s1[i][1]), str(s1[i][2]), 
                    str(s2[i][1]), str(s2[i][2])])

我发现s1和s2给出了不同的结果,这实际上是方程式(mRNA和蛋白质)的不同排序。

我是否可以进行任何修改以使订购无效?

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题似乎是在01个案例之间的索引s1s2之间交换了函数,但y值使用了y这些功能没有被交换。如果我们也交换mRNA()值,我们会得到一致的结果。我们可以通过使用以下代码替换protein()system1[]的函数定义以及system2[]def mRNA1(t, y): print t,"\t",y[0] return 6e-8 - (0.01 * y[0]) def protein1(t, y): return (0.05 * y[0]) - (0.001 * y[1]) def mRNA2(t, y): print t,"\t",y[0] return 6e-8 - (0.01 * y[1]) def protein2(t, y): return (0.05 * y[1]) - (0.001 * y[0]) system1[0] = mRNA1 system1[1] = protein1 system2[0] = protein2 system2[1] = mRNA2 数组的设置代码来实现此目的:

100.1,3.79492952635e-06,1.06680785809e-05,1.06680785809e-05,3.79492952635e-06

...我们获得最后一行的输出:

scipy

......正如我们所料。

顺便说一句,我建议使用scipy.integrate.ode而不是编写自定义代码来解决ODE,如果目的是为了获得ODE的良好解决方案而不是学习如何编写ODE求解器代码。 {{1}}中可用的所有求解器都会比使用4阶Runge Kutta方法得到更好的结果。