我有以下代码:
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
和1
之间交换,在案例s1
和s2
之间交换,但是这些函数使用的y
值没有交换。如果我们也交换y
值,我们会得到一致的结果。我们可以将mRNA()
和protein()
的函数定义以及system1[]
和system2[]
数组的设置代码替换为以下代码:。。。我们得到最后一行的输出:
。。。正如我们所料。你知道吗
另外,我建议使用scipy.integrate.ode而不是编写自定义代码来解决ODEs,如果目的是获得一个好的ODEs解决方案,而不是学习如何编写ODE解算器代码。在
scipy
中可用的所有解算器都将给出比使用四阶龙格库塔方法更好的结果。你知道吗相关问题 更多 >
编程相关推荐