2014-11-01 103 views
1

我有以下代码:ODE放置给出不同的结果

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和蛋白质)的一个不同的排序。

是否有任何修改,我可以使订购没有区别?

在此先感谢。

+0

你使用龙格库塔4吗? – kolonel 2014-11-01 02:25:16

+0

是的,我正在使用龙格库塔4 – 2014-11-02 08:39:23

回答

1

的问题似乎是,该功能被交换指数0,并且不被交换的情况下s1s2但这些功能使用的y值之间1之间。如果我们将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.integrate.ode而不是编写自定义代码来解决ODE,如果其目的是为了得到ODE的一个好的解决方案,而不是学习如何编写ODE解算器代码。 scipy中的所有求解器都会比使用四阶龙格库塔方法得到更好的结果。

+0

谢谢,西蒙。我仍然对这种差异感到困惑。你能否向我解释一下,或者指出我的位置?非常感谢。 – 2014-11-02 08:40:50

+0

在第一种情况下计算'mRNA()'的结果正在进入'system1 [0]'(因此它正在计算'y [0]'的值),'system2 [1]'(因此计算值在第二种情况下,'y [1]')。然而,在最初的代码中,无论输出是进入“y [0]”还是“y [0]”,它总是使用'y [0]'的值作为输入来计算下一个时间步长的'y'值。 1]'。相反,相同的原则适用于“蛋白质()”功能。交换'y []'指数以及'system []'指数使得它们一致,因此产生期望的输出。 – Simon 2014-11-02 09:49:11

相关问题