python - 使用 `ode` 方法的 scipy 的 'vode' 求解器给出一个空数组结果

标签 python matlab numpy scipy ode

我正在尝试对方程进行积分

bg' = dmat*bg + releasevec.

Dmat 是一个 6x6 值数组,bg 是一个 6x1 向量。为了将 dmatbg 相乘,我使用了点积。然后将 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/

相关文章:

具有拉格朗日乘数估计的Python非线性方程

python - keras 的形状问题 `fit_generator()`

python - Numpy 数组多维索引与列表 IndexError : shape mismatch

python - numpy 中的 matlab single() 函数?

python 2.6 - 打印法语字符

python - 如何在 Google App Engine 上安装 'python3-dev' 以使用 'pymatting_aot.aot'

python - <__main__.person object at 0x02887790>> 的绑定(bind)方法 person.get_name 是什么意思

arrays - 如何在 Matlab 中将数组打印到 .txt 文件?

matlab - 使用自定义度数在 matlab 中计算多项式

matlab - 索引到向量