Python 解算器使用变量分解

Python 解算器使用变量分解,python,scipy,ode,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 = pa

在过去的几周里,我一直在努力解决这个问题。我正在为一个研究项目用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')

注释掉的行可以正常工作,但是带有变量而不是变量的未注释等价行不能正常工作。有什么建议吗

如果您的源代码包含与以下内容完全相同的代码:

     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]
    

我们需要了解您是如何创建
参数的
,以了解出了什么问题。问题可能在于Matlab中的索引是基于1的,而Python中的索引是基于0的。也就是说,如果
y=np.zero(3)
y
的三个元素是
y[0]
y[1]
y[2]
。在函数
dy
中,您没有为
dy[0]
赋值。这是故意的吗?(顺便说一句,使用与函数同名的变量是一种不好的做法。)也许在您提到
E[1]
的地方,您应该使用
E[0]
。另外,您说它工作不正常是什么意思?你有错误吗?(如果是,请显示完整的错误消息。)或者您得到了一个您知道是错误的解决方案吗?索引是正确的,每个变量的[0]值都是0,以使其与MATLAB保持一致(尽管这可能是一种不好的做法,但对最终结果来说并不重要)。它不能正常工作,因为在我得到一个我知道是错误的解决方案。params是由以下人员创建的:params=[None]*10 params[0]=wL。如果我将参数初始化为空列表,然后使用append方法添加每个变量,它仍然不起作用。我想就是这样!哇,太简单了-_____________-