我正在尝试对方程进行积分
bg' = dmat*bg + releasevec.
Dmat
是一个 6x6 值数组,bg
是一个 6x1 向量。为了将 dmat
和 bg
相乘,我使用了点积。然后将 releasevec
添加到此产品。
我想在从零到三的时间跨度上对这个方程求积分。现在,下面的代码正在生成一个 f_results
,它是一个空数组,即没有结果。
一点背景是这段代码改编自 MATLAB ode 求解器(特别是 ode15s
)。 ode15s
的明显 Python 等价物是 scipy 的
ode.set_integrator('vode', method = 'bdf')
从时间跨度0到1,f_results
中产生的bg
结果应该是
[5.76068434946487e-16, 1.92039036486442e-14, 2.97732034735096e-21,
1.15568146353068e-18, 3.50848451366317e-19, 6.99348172634721e-27]
如您所见,这些 bg 结果与代码中提供的初始 bg
(bg0
) 值几乎没有区别。我知道 MATLAB 的 ode15s
求解器使用内部时间步长来执行积分,因此我认为可能需要在积分器中弄乱步长参数。
问题:为什么我的结果是一个空数组?我是否错误地设置了初始条件?我怎样才能生成我发布的下一组 bg
值?
如果我遗漏了任何相关信息或任何内容,请告诉我,我会尽快修复。
def ode_solv(t, bg, dmat, releasevec):
ydot[0] = dmat2[0].dot(bg) + releasevec[0]
ydot[1] = dmat2[1].dot(bg) + releasevec[1]
ydot[2] = dmat2[2].dot(bg) + releasevec[2]
ydot[3] = dmat2[3].dot(bg) + releasevec[3]
ydot[4] = dmat2[4].dot(bg) + releasevec[4]
ydot[5] = dmat2[5].dot(bg) + releasevec[5]
return ydot
ydot = np.zeros(6)
dmat2 = np.array([[-1960368.83845003, 58694.00323479, 39129.33548986, 1862545.49972536, 0.0, 0.0],
[58694.00323479, -1.89355617e+09, 0.0, 1231.23020241, 21038.6060172, 14025.7373448],
[39129.33548986, 0.68216154, -7.57402415e+09, 0.0, 0.0, 0.0],
[1862545.49972536, 0.0, 0.0, -9.28416441e+08, 0.0, 0.0],
[0.0, 21038.64595532, 0.0, 0.0, -1.15156310e+09, 0.0],
[0.0, 0.0, 14025.76397021, 0.0, 0.0, -5.97115916e+09]], np.float)
bg0 = [5.74717437413422e-16, 1.91588665922461e-14, 2.97070077781448e-21,
1.15297115567223e-18, 3.50025640453469e-19, 6.97793289948656e-27]
releasevec = [0.0, 0.0000363636, 0.0, 0.0, 0.0, 0.0]
t0 = 0.0
t1 = 3
f_results = []
soln = ode(ode_solv).set_integrator('vode', method='bdf', order=5)
soln.set_initial_value(t0, bg0)
soln.set_f_params(dmat2, releasevec)
while soln.t < t1:
soln.integrate(soln.bg)
f_results.append([soln.t, soln.bg])
print f_results
最佳答案
这一行不正确:
soln.set_initial_value(t0, bg0)
你把论点颠倒了。第一个参数必须是初始值;第二个(可选)参数是给出该值的时间。
还有一些其他问题:
- 将
soln.bg
更改为soln.y
。 soln.integrate(soln.bg)
行不正确。参数应该是下一个所需的t
值。
再看一下 the ode
docstring 中的示例.
关于python - 使用 `ode` 方法的 scipy 的 'vode' 求解器给出一个空数组结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484341/