【发布时间】: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方法添加每个变量,它仍然不起作用。