Solve_ivp 是来自 Scipy 的初始值问题求解器函数。 简而言之
scipy.integrate.solve_ivp(fun,t_span,y0,方法='RK45',t_eval=无,dense_output=False,事件=无,向量化=假,args=无,**选项)
解决 ODE 系统的初值问题。 该函数对给定初始值的常微分方程组进行数值积分。
在solve_ivp函数文档(Scipy参考指南1.4.1第695页)中,我们有以下内容
参数 fun [可调用] 系统的右侧。调用签名是 fun(t, y)。这里 t 是一个标量,ndarray y 有两个选项:它可以具有形状 (n,);也可以具有 (n,) 形状。那么 fun 必须返回形状为 (n,) 的 array_like。或者,它可以具有形状(n,k);那么 fun 必须返回一个形状为 (n, k) 的 array_like,即每一列对应于 y 中的单个列。两个选项之间的选择由矢量化参数决定(见下文)。矢量化实现允许通过有限差分更快地逼近雅可比行列式(刚性求解器所需)。
这里n代表y中维度的个数。 k 代表什么?对于那些知道答案的人来说,这似乎是一个非常天真的问题。但是请相信我,我真的找不到它(至少在文档中找不到)。 伟大的 hpaulj 对这个问题的回答似乎揭示了一些线索。但好吧,恕我直言,它仍然太暗,无法四处走动。
我删除了之前的答案 - y(长度 n)取决于另一个长度为 k 的数组 x。
当前文档表明这不是
vectorized
的意图。
相反,我认为
k=y.shape(2)
应该被解释为任意的。这意味着无论 y 的第二个维度是什么,当您将其传递给 fun 时,fun 应该能够处理它。
这意味着乐趣应该有一些循环
for i in y.shape(2): process all columns y[:, i]
。
最后,返回一个 2D 数组,其 rhs 值的形状为 (n, k)。
当前的solve_ivp文档说
如果 vectorized 为 True,则可以使用形状为 (n, k) 的 y 调用 fun,其中 k 是整数。在这种情况下,fun 的行为必须使得 fun(t, y)[:, i] == fun(t, y[:, i]) (即返回数组的每一列都是与y 的一列)。
我认为这比原始文档(上面发布的)更清晰。