避免在python中对大量耦合的ODE进行硬编码

时间:2015-04-14 18:21:16

标签: python scipy ode

首先,如果标题不完全合适,我很抱歉,我很难找到合适的标题(这可能也会影响我对这类问题的搜索效率:/)。

问题如下。虽然使用Scipy在python中解决耦合的ODE相对容易,但我仍然必须明确地在表单中写下我的ODE。例如,对于形式

的耦合ODE

d / dt(c_0)= a(c_0)+ b(c_1)和d / dt(c_1)= c(c_0)

我会设置像:

import numpy as np
from scipy.integrate import ode

a=1
b=2
c=3
val=[]

def dC_dt(t, C):
    return [a*C[0]+b*C[1],
            c*C[0]]

c0, t0 = [1.0,0.0], 0
r = ode(dC_dt).set_integrator('zvode', method='bdf',with_jacobian=False)
r.set_initial_value(c0, t0)
t1 = 0.001
dt = 0.000005
while r.successful() and r.t < t1:
    r.integrate(r.t+dt)
val.append(r.y)

然而,现在我已经将粗糙形式的ODE耦合了

d / dt(下C_ {M,N})= A(C_ {M,N})+ B(C_ {M + 1,N-1})+ K(C_ {M-1,N + 1 })

c_ {0,0} = 1,我必须包含m ^ 2 + n ^ 2-mn小于最大值的订单。 对于一个小的最大值,我所做的是使用字典来使用带有两个索引的符号并将其映射到一维列表

dict_in={'0,0':0,'-1,0':2,...}

然后我为每个订单输入了ODE

def dC_dt(t,C):
    return[a*C[dict_in['0,0']]+b*C[dict_in['1,-1']]...

现在我基本上必须为大约100个耦合方程做到这一点,我不想硬代码,所以我试图找出一种方法,用循环或某事实现ODE。然而,我还没有找到一种解决方案,即在我的系数中有两个指数以及仅包括m ^ 2 + n ^ 2-mn小于最大值的指令的条件。 当我在一些截止日期前跑步时,我认为是时候向更聪明的人寻求帮助了。

感谢您阅读我的问题!

1 个答案:

答案 0 :(得分:1)

我有类似的问题。如果你填写字典,你可以在循环内重新声明该函数更多次。这是一个如何运作的愚蠢例子:

dict_in={'0,0':0,'-1,0':2}

for elem in dict_in:
    def dC_dt(t,C):
        #return[a*C[dict_in['0,0']]+b*C[dict_in['1,-1']]
        return dict_in[elem]

    t, C = 0, 0
    print(dC_dt(t,C))
    #r = ode(dC_dt).set_integrator('zvode', method='bdf',with_jacobian=False)

如果您需要一起使用更多功能,可以使用匿名功能并将它们存储在内存中。另一个例子:

functions_list = list()
for i in range(4):
    f = lambda n = i:  n
    functions_list.append(f)

for j in range(4):
    print(functions_list[j]())

您也可以使用列表或生成器。例如,您可以在txt文件上记下该值,并每次使用readline函数读取该值。

如下面的评论中所指出的,如果你使用lamda函数,你应该注意引用。另请参阅https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result