求解器用变量分解

时间:2014-07-07 20:42:55

标签: python scipy ode

过去几周我一直在努力解决这个问题。我正在为我正在进行的研究项目解决Python中的一系列ODE。 (python代码必须模仿之前的MATLAB代码。)

相关部分在此处:

def dy (t,y,params):

    dy = np.zeros(3)

    wL = params[0]
    T = params[1]
    CH4 = params[2]
    k = params[3]
    ka = params[4]
    H = params[5]
    kmt = params[6]
    E = params[7]
    d = params[8]
    y0 = params[9]

#    dy[1] = 1500000 - 0 - 9.987338917338950e-11*y[1]*1000000
#    - 1.437829040671314e-17*y[1]*9.84e11

     dy[1] = E[1]-y[1]*d[1]
     - k[1]*y[1]*y0[14]
     - k[55]*y[1]*y0[37]

     dy[2] = 0 - 0 + 9.987338917338950e-11*y[1]*1000000 
     - 7.742358922306635e-12*y[2]*0 + 0.7*7.432069505555159e-12*0*1000000
     -3.5e-15*(0 + 0)*y[2] - 2* 7e-16*y[2]**2 


     return dy

适用于:

y = np.zeros(3)
ode15s = ode(dy)

y[1] = 2.46e10
ode15s.set_initial_value(y)
ode15s.set_f_params(params)
ode15s.set_integrator('vode', method = 'bdf')

注释掉的行正常工作,但带有变量而不是变量的未注释等效行无法正常工作。有什么建议?

1 个答案:

答案 0 :(得分:1)

如果您的源代码包含完全相同的代码:

     dy[1] = E[1]-y[1]*d[1]
     - k[1]*y[1]*y0[14]
     - k[55]*y[1]*y0[37]

然后问题是dy[1]被计算为dy[1] = E[1] - y[1]*d[1],接下来的两行被(有效地)忽略。它们是有效的python表达式,但它们不是前一行的一部分,并且它们没有分配给任何东西,因此忽略这些值。

以下任何一项都可以解决这个问题:

  • 将其设为一行:

     dy[1] = E[1]-y[1]*d[1] - k[1]*y[1]*y0[14] - k[55]*y[1]*y0[37]
    
  • 将整个表达式括在括号中:

     dy[1] = (E[1]-y[1]*d[1]
              - k[1]*y[1]*y0[14]
              - k[55]*y[1]*y0[37])
    
  • 在行的末尾使用行继续符(\):

     dy[1] = E[1]-y[1]*d[1] \
     - k[1]*y[1]*y0[14]     \
     - k[55]*y[1]*y0[37]