【问题标题】:Solver breaks down with variables求解器因变量而崩溃
【发布时间】:2014-08-28 11:04:59
【问题描述】:

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

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

【问题讨论】:

  • 我们需要看看您是如何创建params 的,才能知道出了什么问题。问题可能是 Matlab 中的索引是从 1 开始的,而在 Python 中是从 0 开始的。即如果y = np.zeros(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。 . .
  • 如果我将params初始化为一个空列表然后使用append方法添加每个变量,它仍然不起作用。

标签: python scipy ode


【解决方案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]
    

【讨论】:

  • 我想就是这样!哇,好简单-_____________-
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2013-03-09
  • 2015-12-08
相关资源
最近更新 更多