Python 解算器使用变量分解
在过去的几周里,我一直在努力解决这个问题。我正在为一个研究项目用Python解决一系列ODE。(python代码必须模仿之前的MATLAB代码。) 相关部分如下: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
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方法添加每个变量,它仍然不起作用。我想就是这样!哇,太简单了-_____________-